From 15f9933ab6177f2c5e7442b2f3bcc5795892cbb2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 21 Apr 2023 10:29:51 -0400 Subject: [PATCH 001/250] added contributing section to the docs, added Read The Docs link from README --- README.md | 9 +++++- docs/source/contributing.rst | 60 ++++++++++++++++++++++++++++++++++++ docs/source/index.rst | 1 + 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 docs/source/contributing.rst diff --git a/README.md b/README.md index 0bf05fffe..b44c71c96 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,13 @@ Using `pip`: pip install dcef ``` +## Documentation + +To get started with using DCEF, check out the full documentation: + +https://dcef.readthedocs.io/ + + # Using DCEF in a jupyter lab notebook just add the following to a cell @@ -44,7 +51,7 @@ Builtin commands are found in [all_transforms.py](dcef/all_transforms.py) ### Simple example Here is a simple example command ```python -class DropCol(Transform): +class DropCol(Command): command_default = [s('dropcol'), s('df'), "col"] command_pattern = [None] diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst new file mode 100644 index 000000000..a98d89039 --- /dev/null +++ b/docs/source/contributing.rst @@ -0,0 +1,60 @@ +.. _Contributing: + +==================== +Contributing to DCEF +==================== + +DCEF is actively looking for contributors. All forms of participation are welcome, from bug reports, to suggestions, to code contributions. + +Setting up a development environment +==================================== + +First, you need to fork the project. Then setup your environment: + +.. code-block:: bash + + # create a new conda environment + conda create -n dcef-dev jupyterlab pandas nodejs yarn pip + conda activate dcef-dev + pip install build twine + + # download dcef from your GitHub fork + git clone https://github.com//dcef.git + # or start by cloning the main repo + git clone https://github.com/paddymul/dcef.git + + # install JS dependencies and build js assets + cd dcef + yarn install + + # install DCEF in editable mode + python -m pip install -ve . + + #in another shell, setup the typescript watcher + conda activate dcef-dev + yarn build && yarn watch + #this will build the jupyter lab extension, and recompile on any code changes + + #start your jupyter lab server in another shell + conda activate dcef-dev + jupyter lab + + #work on your jupyter notebook from that lab server + +.. note:: + Getting typescript updates from the widget into a jupyter lab notebook is a little tricky. The following steps ensure that typescript code changes are picked up. + +Loading typescript changes +========================== + +I make my changes, confirm that ``yarn watch`` has successfully compiled them. **then** I follow these steps to ensure the new code is loaded + +#. Go to the jupyter lab notebook in a browser +#. Click the Kernel Menu > Restart Kernel and Clear all outputs +#. Save the notebook +#. Reload the web browser +#. Execute the relevant cells + +It is sometimes helpful to put a console.log in ``js/plugin.ts`` and check that the updated log statement shows up in the browser to make sure you are executing the code you think you are. + + diff --git a/docs/source/index.rst b/docs/source/index.rst index d3403cab4..9fb0934dd 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -26,6 +26,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell using install + contributing FAQ Indices and tables From 9575cbac2c3dfea41585102091c4d8c2062ab185 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 21 Apr 2023 12:09:34 -0400 Subject: [PATCH 002/250] added more narrative docs around using commands --- docs/source/contributing.rst | 39 ++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst index a98d89039..f208ce91a 100644 --- a/docs/source/contributing.rst +++ b/docs/source/contributing.rst @@ -6,6 +6,43 @@ Contributing to DCEF DCEF is actively looking for contributors. All forms of participation are welcome, from bug reports, to suggestions, to code contributions. + +Developing in the Jupyter Lab environment +========================================= + +The easiest way to develop and contribute to DCEF is to add ``Commands``. When I use DCEF to clean and explore a new dataset, I firt try to use the built in DCEF commands in the UI. When I want to perform a manipulation that doesn't yet exist in DCEF, I first drop down to raw pandas/python like I would before DCEF... Then I figure out how to expose that functionality as a ``Command``. While working with manatee data, I recognized that a column was probably date times, but a ``to_datetime`` ``Command`` didn't exist. So I wrote one. + +.. code-block:: python + + pd.to_datetime(df['REPDATE']).head() + #outputs -> + #0 1974-04-03 00:00:00+00:00 + #1 1974-06-27 00:00:00+00:00 + #Name: REPDATE, dtype: datetime64[ns, UTC] + + #pd.to_datetime is the transform I want... so I write it as a Command + #and add it to the w widget with the @w.add_command decorator + @w.add_command + class to_datetime(Command): + command_default = [s('to_datetime'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + df[col] = pd.to_datetime(df[col]) + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = pd.to_datetime(df['%s'])" % (col, col) + + +When you use the ``add_command`` decorator, the command is instantly added to the UI of the corresponding widget. Subsequent re-evalutations of the same cell, will replace a ``Command`` in the widget with the same name. This allows you to iteratively develop commands. + +Once you have developed a ``Command`` you can either continue to use it internally as with the ``add_command`` decorator or you can open a PR and add it to the builtin commands for DCEF `all_transforms.py `_. + +The upside of just using the @add_command decorator is that you don't have to setup a development environment. + Setting up a development environment ==================================== @@ -44,6 +81,8 @@ First, you need to fork the project. Then setup your environment: .. note:: Getting typescript updates from the widget into a jupyter lab notebook is a little tricky. The following steps ensure that typescript code changes are picked up. + + Loading typescript changes ========================== From 98aeb67d38ed463e54343ca96d79b8344cb55bce Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 25 Apr 2023 18:31:56 -0400 Subject: [PATCH 003/250] WIP on transforms --- dcef/all_transforms.py | 34 ++++++++++++++++++++++++++++++++-- dcef/configure_utils.py | 2 +- dcef/dcef_widget.py | 19 +++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/dcef/all_transforms.py b/dcef/all_transforms.py index e267aa363..7d130c616 100644 --- a/dcef/all_transforms.py +++ b/dcef/all_transforms.py @@ -122,8 +122,38 @@ def transform_to_py(df, col, col_spec): - +class to_datetime(Command): + #argument_names = ["df", "col"] + command_default = [s('to_datetime'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + df[col] = pd.to_datetime(df[col]) + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = pd.to_datetime(df['%s'])" % (col, col) + +class reindex(Command): + command_default = [s('reindex'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + old_col = df[col] + df.drop(col, axis=1, inplace=True) + df.index = old_col.values + return df + + @staticmethod + def transform_to_py(df, col): + return "\n".join( + [" old_col = df['%s']" % col, + " df.drop('%s', axis=1, inplace=True)" % col, + " df.index = old_col.values"]) -DefaultCommandKlsList = [FillNA, DropCol, OneHot, GroupBy] +DefaultCommandKlsList = [DropCol, to_datetime, SafeInt, FillNA, reindex, OneHot, GroupBy] command_defaults, command_patterns, dcef_transform, dcef_to_py_core = configure_dcef(DefaultCommandKlsList) diff --git a/dcef/configure_utils.py b/dcef/configure_utils.py index eca6ee330..1e730c091 100644 --- a/dcef/configure_utils.py +++ b/dcef/configure_utils.py @@ -31,5 +31,5 @@ def dcef_to_py(instructions): #print("individual_instructions", individual_instructions) code_block = '\n'.join(individual_instructions) - return "def clean(df):\n" + code_block + return "def clean(df):\n" + code_block + "\n return df" return command_defaults, command_patterns, dcef_transform, dcef_to_py diff --git a/dcef/dcef_widget.py b/dcef/dcef_widget.py index f6074836c..ef1cde038 100644 --- a/dcef/dcef_widget.py +++ b/dcef/dcef_widget.py @@ -36,6 +36,15 @@ class DCEFWidget(DOMWidget): operation_results = Dict({}).tag(sync=True) + + #config for the python pre-processing, waiting for inspiration for a better name + python_massaging = Dict({ + sample_threshold=20000, + reorder_columns=True, + max_rows=500, + default_display='rows', #rows, summary, header+rows + }).tag(sync=True) + def __init__(self, df): super().__init__() self.df = df @@ -45,6 +54,16 @@ def __init__(self, df): 'generated_py_code':'#from py widget init'} self.setup_from_command_kls_list() + + @property + def df(self): + return self._df + + @df.setter + def df(self, new_df): + self._raw_df = new_df # in case we want to change the metadata generation live + + @observe('commands') def interpret_operations(self, change): print("interpret_operations") From 7f2e0712348827fdfe56c327e6eb35f7f24fad19 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 25 Apr 2023 18:32:26 -0400 Subject: [PATCH 004/250] WIP on summary stats --- dcef/summary_stats.py | 117 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 dcef/summary_stats.py diff --git a/dcef/summary_stats.py b/dcef/summary_stats.py new file mode 100644 index 000000000..904fd02b4 --- /dev/null +++ b/dcef/summary_stats.py @@ -0,0 +1,117 @@ +from functools import reduce +import pandas as pd + +def summarize_string(ser): + l = len(ser) + val_counts = ser.value_counts() + distinct_count= len(val_counts) + nan_count = l - len(ser.dropna()) + unique_count = len(val_counts[val_counts==1]) + empty_count = val_counts.get('', 0) + + return dict( + dtype=ser.dtype, + length=l, + nan_count = nan_count, + distinct_count= distinct_count, + empty_count = empty_count, + empty_per = empty_count/l, + unique_per = unique_count/l, + nan_per = nan_count/l, + mode=ser.mode().values[0]) + +def summarize_numeric(ser): + + num_stats = dict( + min=ser.min(), + max=ser.max(), + mean=ser.mean()) + num_stats.update(summarize_string(ser)) + return num_stats + +def summarize_column(ser): + if pd.api.types.is_numeric_dtype(ser.dtype): + return summarize_numeric(ser) + else: + return summarize_string(ser) + +def summarize_df(df): + summary_df = pd.DataFrame({col:summarize_column(df[col]) for col in df}) + return summary_df + + + +def make_num_categorical(ser): + ser_uniq = ser.unique() + name_to_idx = {name:idx for idx, name in enumerate(ser_uniq)} + #needs to be vectorized + num_categorical = ser.apply(lambda x:name_to_idx[x]) + return num_categorical + +def get_cor_pair_dict(df, summary_stats): + #we need to remove columns with only nans or a single value, they mess up corr() + + #this needs to be vectorized + corrable_cols = [col for col in df if summary_stats[col]['distinct_count'] > 1] + num_df = pd.DataFrame({col:numerize_column(df[col]) for col in corrable_cols}) + corr_df = num_df.corr() + high_corr_df = corr_df[corr_df > 0.99] + cor_dict = {} + for col in high_corr_df.columns: + #columns with high correlation that aren't the column itself + other_cor_cols = high_corr_df[col].dropna().drop(col) + cor_cols = other_cor_cols.index.values + if len(cor_cols) > 0: + cor_dict[col] = cor_cols.tolist() + return cor_dict + +def without(arr, search_keys): + new_arr = [] + for v in arr: + if v not in search_keys: + new_arr.append(v) + return new_arr + +def one_directional_dict(raw_corr_pair): + # convert from two way links to only one way based on first seen + seen = [] + ret_corr_pair = {} + for key, other_key_list in raw_corr_pair.items(): + seen.append(key) + stripped_other = without(other_key_list, seen) + if len(stripped_other) > 0: + ret_corr_pair[key] = stripped_other + return ret_corr_pair + + +def all_duplicates(raw_corr_pairs): + flatlist = reduce(lambda a,b:a+b, raw_corr_pairs.values()) + return set(flatlist) + +def order_columns(summary_stats_df, corr_pair_dict): + sdf = summary_stats_df.copy() + + sdf.loc['one_distinct'] = 0 + only_ones = (sdf.loc['distinct_count'] <= 1) + sdf.loc['one_distinct', only_ones[only_ones==True].index.values] = -20 + + sdf.loc['is_duplicate'] = 0 + dups = list(all_duplicates(corr_pair_dict)) + sdf.loc['is_duplicate', dups] = -10 + + sdf.loc['is_first_dup'] = 0 + first_dups = list(one_directional_dict(corr_pair_dict).keys()) + sdf.loc['is_first_dup', first_dups] = 5 + + col_scores = sdf.loc[['one_distinct', 'is_duplicate', 'is_first_dup']].sum() + return col_scores.sort_values().index.values[::-1] + #return sdf + +def make_df_metadata(df): + summary_stats_df = summarize_df(df) + corr_dict = get_cor_pair_dict(df, summary_stats_df) + col_order = order_columns(summary_stats_df, corr_dict) + ordered_df = df[col_order] + ordered_sdf = summary_stats_df[col_order] + return [ordered_df, ordered_sdf] + From 522b29e640a6b844e30afaeec214bf337f2e0cf4 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 26 Apr 2023 09:30:37 -0400 Subject: [PATCH 005/250] version bump --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d57097073..4fee5abd4 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", - "paddy-react-edit-list": ">=1.1.25", + "paddy-react-edit-list": ">=1.1.29", "lodash": "^4.17.21", "react-dom": "^18.0.0", "react": "^18.0.0" diff --git a/yarn.lock b/yarn.lock index 49fecfde6..1a1245481 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6387,10 +6387,10 @@ package-json@^6.5.0: registry-url "^5.0.0" semver "^6.2.0" -paddy-react-edit-list@>=1.1.25: - version "1.1.25" - resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.25.tgz#a1d925100dfa3df792b778369437b1343a242886" - integrity sha512-QqwWCPc09ue2ljy6ZuSfsWBm1NbFOxS6pDZNSygVZmoZUVMbiAKltwF8sPtDqIouJ+s6qbri3SpIWU0io2367Q== +paddy-react-edit-list@>=1.1.29: + version "1.1.29" + resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.29.tgz#b65157a17aed4d7f506d7ef77069dea233433d13" + integrity sha512-0SxoPp/hZuEfzbx+i9axUt/yAjOFsSISFmI4GYtdMajETMBY0JDdYN+85wtM2AM+2GKUCF5exNRgDAo86w1oUg== dependencies: "@ag-grid-community/client-side-row-model" "^29.2.0" "@types/lodash" "^4.14.191" From 06365b1947e0387262b41dc7e350cb0b2444b9f1 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 26 Apr 2023 09:32:51 -0400 Subject: [PATCH 006/250] clean saved notebook with no outputs --- introduction.ipynb | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/introduction.ipynb b/introduction.ipynb index d2a3af48f..2124de69c 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -12,25 +12,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "43ed73239024467aa379974b4e73a2de", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "DCEFWidget(command_config={'argspecs': {'fillna': [[3, 'fillVal', 'type', 'integer']], 'dropcol': [None], 'one…" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", From 7e9eef8eefed5b3c557f97e95375b0dd22fcd5ef Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 26 Apr 2023 09:40:11 -0400 Subject: [PATCH 007/250] completed last change of operations vs commands --- dcef/dcef_widget.py | 4 ++-- introduction.ipynb | 22 +++++++++++++++++++--- js/dcefwidget.ts | 4 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/dcef/dcef_widget.py b/dcef/dcef_widget.py index f6074836c..bff21a406 100644 --- a/dcef/dcef_widget.py +++ b/dcef/dcef_widget.py @@ -28,7 +28,7 @@ class DCEFWidget(DOMWidget): value = Unicode('Hello World').tag(sync=True) command_config = Dict({}).tag(sync=True) - commands = List().tag(sync=True) + operations = List().tag(sync=True) command_classes = DefaultCommandKlsList @@ -45,7 +45,7 @@ def __init__(self, df): 'generated_py_code':'#from py widget init'} self.setup_from_command_kls_list() - @observe('commands') + @observe('operations') def interpret_operations(self, change): print("interpret_operations") try: diff --git a/introduction.ipynb b/introduction.ipynb index 2124de69c..d5b892c80 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -12,9 +12,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "05c3b65877494df491659584a82b15e4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "DCEFWidget(command_config={'argspecs': {'fillna': [[3, 'fillVal', 'type', 'integer']], 'dropcol': [None], 'one…" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 5de8f275a..37cc37a5e 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -37,7 +37,7 @@ export class DCEFWidgetModel extends DOMWidgetModel { _view_module_version: DCEFWidgetModel.view_module_version, //add typing from OperationUtils command_config: {} as CommandConfigT, - commands: [] as Operation[], + operations: [] as Operation[], operation_results: {} // {transformed_df:DFWhole, generated_py_code:string} }; } @@ -81,7 +81,7 @@ export class DCEFWidgetView extends DOMWidgetView { const retFunc = (passedOperations:Operation[]) => { console.log("orRequester passed operations", passedOperations) - widgetModel.set('commands', passedOperations) + widgetModel.set('operations', passedOperations) widgetModel.save_changes() } From 741b5d83a3656e3f2ffb7ec51025d8445d6f4896 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 26 Apr 2023 10:14:27 -0400 Subject: [PATCH 008/250] adding more Commands --- dcef/all_transforms.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/dcef/all_transforms.py b/dcef/all_transforms.py index e267aa363..7d130c616 100644 --- a/dcef/all_transforms.py +++ b/dcef/all_transforms.py @@ -122,8 +122,38 @@ def transform_to_py(df, col, col_spec): - +class to_datetime(Command): + #argument_names = ["df", "col"] + command_default = [s('to_datetime'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + df[col] = pd.to_datetime(df[col]) + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = pd.to_datetime(df['%s'])" % (col, col) + +class reindex(Command): + command_default = [s('reindex'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + old_col = df[col] + df.drop(col, axis=1, inplace=True) + df.index = old_col.values + return df + + @staticmethod + def transform_to_py(df, col): + return "\n".join( + [" old_col = df['%s']" % col, + " df.drop('%s', axis=1, inplace=True)" % col, + " df.index = old_col.values"]) -DefaultCommandKlsList = [FillNA, DropCol, OneHot, GroupBy] +DefaultCommandKlsList = [DropCol, to_datetime, SafeInt, FillNA, reindex, OneHot, GroupBy] command_defaults, command_patterns, dcef_transform, dcef_to_py_core = configure_dcef(DefaultCommandKlsList) From 7265955f315e775889c7f5e7fb787bbb85338926 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 26 Apr 2023 10:17:25 -0400 Subject: [PATCH 009/250] version bump --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7174f1143..6f5a04b1e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.2.3" +version = "0.2.4" [project.license] file = "LICENSE.txt" From e53e3924dd363da8aac8b4669edba4270580d1f1 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 28 Apr 2023 09:38:30 -0700 Subject: [PATCH 010/250] working version with the status bar built into dcef --- introduction.ipynb | 32 +++++++++++++------------------- js/dcefwidget.ts | 19 +++++++++++++++++-- package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/introduction.ipynb b/introduction.ipynb index d5b892c80..b2dd9cc43 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -12,25 +12,19 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "05c3b65877494df491659584a82b15e4", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "DCEFWidget(command_config={'argspecs': {'fillna': [[3, 'fillVal', 'type', 'integer']], 'dropcol': [None], 'one…" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], + "source": [ + "!echo $CONDA_DEFAULT_ENV\n", + "!pwd" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 37cc37a5e..a43ea0317 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -93,13 +93,28 @@ export class DCEFWidgetView extends DOMWidgetView { const plumbCommandConfig:CommandConfigSetterT = (setter) => { widget.setCommandConfig = setter } - + + const dfConfig = { + totalRows: 1309, + columns: 30, + rowsShown: 500, + sampleSize: 10_000, + summaryStats: false, + reorderdColumns: false + }; + + const on_dfConfig = (newVal:any) => { + console.log("on_dfConfig called with", newVal) + } const reactEl = React.createElement(WidgetDCFCell, { origDf:widgetModel.get('js_df'), getOrRequester:widgetGetOrRequester, commandConfig, - exposeCommandConfigSetter:plumbCommandConfig, + exposeCommandConfigSetter:plumbCommandConfig, + dfConfig:dfConfig, + on_dfConfig:on_dfConfig }, null) + root.render(reactEl); } diff --git a/package.json b/package.json index 4fee5abd4..7907edfe2 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", - "paddy-react-edit-list": ">=1.1.29", + "paddy-react-edit-list": ">=1.1.30", "lodash": "^4.17.21", "react-dom": "^18.0.0", "react": "^18.0.0" diff --git a/yarn.lock b/yarn.lock index 1a1245481..6c8f9b000 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6387,10 +6387,10 @@ package-json@^6.5.0: registry-url "^5.0.0" semver "^6.2.0" -paddy-react-edit-list@>=1.1.29: - version "1.1.29" - resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.29.tgz#b65157a17aed4d7f506d7ef77069dea233433d13" - integrity sha512-0SxoPp/hZuEfzbx+i9axUt/yAjOFsSISFmI4GYtdMajETMBY0JDdYN+85wtM2AM+2GKUCF5exNRgDAo86w1oUg== +paddy-react-edit-list@>=1.1.30: + version "1.1.30" + resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.30.tgz#3c3048d33c4877165e50ca74c8e41e3a61ff0acd" + integrity sha512-v0q+x6GZWPMAXnRZzC4FfuVmPpjXq+sqazsT/ljYq0frHCPUoM0T8zAmiWXpIn/7P7JIXHPCBqSBIxDBdlKvyA== dependencies: "@ag-grid-community/client-side-row-model" "^29.2.0" "@types/lodash" "^4.14.191" From e5111005851643b33cf53a8b0b089ca154aa614a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 28 Apr 2023 10:30:41 -0700 Subject: [PATCH 011/250] WIP on getting stripped ipyreact integrated into dcefwidget --- js/dcefwidget.ts | 74 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index a43ea0317..8ecd5394b 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -12,9 +12,10 @@ import _ from 'lodash'; import {WidgetDCFCell, CommandConfigT, DFWhole, CommandConfigSetterT, Operation, DependentTabs } from 'paddy-react-edit-list'; -import { createRoot } from "react-dom/client"; -import React from "react"; - +//import { createRoot } from "react-dom/client"; +import React, {useEffect, useState} from "react"; +//import * as ReactDOM from 'react-dom'; +import * as ReactDOMClient from 'react-dom/client'; import { MODULE_NAME, MODULE_VERSION } from './version'; // Import the CSS @@ -57,12 +58,25 @@ export class DCEFWidgetModel extends DOMWidgetModel { } + // const reactEl = React.createElement(WidgetDCFCell, { + // origDf:widgetModel.get('js_df'), + // getOrRequester:widgetGetOrRequester, + // commandConfig, + // exposeCommandConfigSetter:plumbCommandConfig, + // dfConfig:dfConfig, + // on_dfConfig:on_dfConfig + // }, null) + // root.render(reactEl); + export class DCEFWidgetView extends DOMWidgetView { + + setCommandConfig = (conf:CommandConfigT) => console.log("default setCommandConfig") + setPyCode = (newPyCode:string) => console.log("default setPyCode") + setTransformedDf = (newDf:DFWhole) => console.log("default setTransformedDf") render() { console.log('DCFWidget View... renamed ') this.el.classList.add('custom-widget'); - //this.value_changed(); - const root = createRoot(this.el as HTMLElement) + const widgetModel = this.model const widget = this @@ -103,30 +117,46 @@ export class DCEFWidgetView extends DOMWidgetView { reorderdColumns: false }; - const on_dfConfig = (newVal:any) => { - console.log("on_dfConfig called with", newVal) - } - const reactEl = React.createElement(WidgetDCFCell, { + //const on_dfConfig = (newVal:any) => console.log("on_dfConfig called with", newVal) + + const outerProps = { origDf:widgetModel.get('js_df'), getOrRequester:widgetGetOrRequester, commandConfig, exposeCommandConfigSetter:plumbCommandConfig, dfConfig:dfConfig, - on_dfConfig:on_dfConfig - }, null) + //on_dfConfig:on_dfConfig + }; - - root.render(reactEl); - } - setCommandConfig = (conf:CommandConfigT) => { - console.log("default setCommandConfig") - } - setPyCode = (newPyCode:string) => { - console.log("default setPyCode") - } - setTransformedDf = (newDf:DFWhole) => { - console.log("default setTransformedDf") + const Component = () => { + // @ts-ignore + const [_, setCounter] = useState(0); + const forceRerender = () => { + setCounter((x:number) => x + 1); + } + useEffect(() => { + this.listenTo(this.model, 'change', forceRerender); + }, []); + + + const props : any = {...outerProps} + for (const key of Object.keys(this.model.attributes)) { + props[key] = this.model.get(key); + props["on_" + key] = (value: any) => { + this.model.set(key, value); + this.touch(); + }; + } + const el = React.createElement(WidgetDCFCell, props) + return el + } + + + const root = ReactDOMClient.createRoot(this.el); + const componentEl = React.createElement(Component, {}); + root.render(componentEl) + } } From b4b3ff246cf753ecfb679d4837c760e7b79ac028 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 28 Apr 2023 10:35:51 -0700 Subject: [PATCH 012/250] status bar integrated --- dcef/dcef_widget.py | 9 +++++++++ introduction.ipynb | 9 +++++++++ js/dcefwidget.ts | 19 ++++++++++--------- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/dcef/dcef_widget.py b/dcef/dcef_widget.py index bff21a406..087af78cd 100644 --- a/dcef/dcef_widget.py +++ b/dcef/dcef_widget.py @@ -35,6 +35,15 @@ class DCEFWidget(DOMWidget): js_df = Dict({}).tag(sync=True) operation_results = Dict({}).tag(sync=True) + dfConfig = Dict( +{ + 'totalRows': 5309, + 'columns': 30, + 'rowsShown': 500, + 'sampleSize': 10_000, + 'summaryStats': False, + 'reorderdColumns': False + }).tag(sync=True) def __init__(self, df): super().__init__() diff --git a/introduction.ipynb b/introduction.ipynb index b2dd9cc43..c1f8a2f65 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -31,6 +31,15 @@ "w" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "w.dfConfig" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 8ecd5394b..c9ba08051 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -40,6 +40,7 @@ export class DCEFWidgetModel extends DOMWidgetModel { command_config: {} as CommandConfigT, operations: [] as Operation[], operation_results: {} // {transformed_df:DFWhole, generated_py_code:string} + dfConfig: {} // provided on df ingest }; } @@ -108,14 +109,14 @@ export class DCEFWidgetView extends DOMWidgetView { widget.setCommandConfig = setter } - const dfConfig = { - totalRows: 1309, - columns: 30, - rowsShown: 500, - sampleSize: 10_000, - summaryStats: false, - reorderdColumns: false - }; + // const dfConfig = { + // totalRows: 1309, + // columns: 30, + // rowsShown: 500, + // sampleSize: 10_000, + // summaryStats: false, + // reorderdColumns: false + // }; //const on_dfConfig = (newVal:any) => console.log("on_dfConfig called with", newVal) @@ -124,7 +125,7 @@ export class DCEFWidgetView extends DOMWidgetView { getOrRequester:widgetGetOrRequester, commandConfig, exposeCommandConfigSetter:plumbCommandConfig, - dfConfig:dfConfig, + //dfConfig:dfConfig, //on_dfConfig:on_dfConfig }; From 27bbaeaa1f927bc99ea7a61b5b1435ac67844cf3 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 28 Apr 2023 11:19:27 -0700 Subject: [PATCH 013/250] more code cleanup --- dcef/dcef_widget.py | 13 +++---- introduction.ipynb | 4 +-- js/dcefwidget.ts | 83 +++++++-------------------------------------- 3 files changed, 22 insertions(+), 78 deletions(-) diff --git a/dcef/dcef_widget.py b/dcef/dcef_widget.py index 087af78cd..7826f8187 100644 --- a/dcef/dcef_widget.py +++ b/dcef/dcef_widget.py @@ -26,13 +26,14 @@ class DCEFWidget(DOMWidget): _view_module_version = Unicode(module_version).tag(sync=True) value = Unicode('Hello World').tag(sync=True) - command_config = Dict({}).tag(sync=True) + commandConfig = Dict({}).tag(sync=True) operations = List().tag(sync=True) command_classes = DefaultCommandKlsList - js_df = Dict({}).tag(sync=True) + #js_df = Dict({}).tag(sync=True) + origDf = Dict({}).tag(sync=True) operation_results = Dict({}).tag(sync=True) dfConfig = Dict( @@ -48,9 +49,9 @@ class DCEFWidget(DOMWidget): def __init__(self, df): super().__init__() self.df = df - self.js_df = json.loads(df.to_json(orient='table', indent=2)) + self.origDf = json.loads(df.to_json(orient='table', indent=2)) self.operation_results = { - 'transformed_df':self.js_df, + 'transformed_df':self.origDf, 'generated_py_code':'#from py widget init'} self.setup_from_command_kls_list() @@ -63,7 +64,7 @@ def interpret_operations(self, change): results = {} if len(operations) == 1: - results['transformed_df'] = self.js_df + results['transformed_df'] = self.origDf results['generated_py_code'] = 'no operations' print('exiting early') return @@ -82,7 +83,7 @@ def interpret_operations(self, change): def setup_from_command_kls_list(self): command_defaults, command_patterns, self.dcef_transform, self.dcef_to_py_core = configure_dcef( self.command_classes) - self.command_config = dict( + self.commandConfig = dict( argspecs=command_patterns, defaultArgs=command_defaults) diff --git a/introduction.ipynb b/introduction.ipynb index c1f8a2f65..99405355c 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -46,11 +46,11 @@ "metadata": {}, "outputs": [], "source": [ - "from dcef.all_transforms import Transform\n", + "from dcef.all_transforms import Command\n", "from dcef.lispy import s\n", "#Here we start adding commands to the DCF Widget. Every call to add_command replaces a command with the same name\n", "@w.add_command\n", - "class GroupBy2(Transform):\n", + "class GroupBy2(Command):\n", " command_default = [s(\"groupby2\"), s('df'), 'col', {}]\n", " command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]]\n", " @staticmethod \n", diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index c9ba08051..b80a3c56b 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -37,9 +37,9 @@ export class DCEFWidgetModel extends DOMWidgetModel { _view_module: DCEFWidgetModel.view_module, _view_module_version: DCEFWidgetModel.view_module_version, //add typing from OperationUtils - command_config: {} as CommandConfigT, + commandConfig: {} as CommandConfigT, operations: [] as Operation[], - operation_results: {} // {transformed_df:DFWhole, generated_py_code:string} + operation_results: {}, // {transformed_df:DFWhole, generated_py_code:string} dfConfig: {} // provided on df ingest }; } @@ -75,18 +75,10 @@ export class DCEFWidgetView extends DOMWidgetView { setPyCode = (newPyCode:string) => console.log("default setPyCode") setTransformedDf = (newDf:DFWhole) => console.log("default setTransformedDf") render() { - console.log('DCFWidget View... renamed ') this.el.classList.add('custom-widget'); - const widgetModel = this.model const widget = this - widgetModel.on( - 'change:command_config', - () => { - widget.setCommandConfig(widgetModel.get('command_config'))}, - this) - const widgetGetOrRequester:DependentTabs.getOperationResultSetterT = (setOpResult) => { widgetModel.on('change:operation_results', () => { const opResults:DependentTabs.OperationResult = widgetModel.get('operation_results') @@ -98,38 +90,27 @@ export class DCEFWidgetView extends DOMWidgetView { console.log("orRequester passed operations", passedOperations) widgetModel.set('operations', passedOperations) widgetModel.save_changes() - } return retFunc }; - const commandConfig = widgetModel.get('command_config') - console.log("widget, commandConfig", commandConfig, widgetModel) + // these following lines probably aren't necessary given the ipyReact integration to the end of plumbCommandConfig + widgetModel.on( + 'change:commandConfig', + () => { + widget.setCommandConfig(widgetModel.get('commandConfig'))}, + this) + const plumbCommandConfig:CommandConfigSetterT = (setter) => { widget.setCommandConfig = setter } - // const dfConfig = { - // totalRows: 1309, - // columns: 30, - // rowsShown: 500, - // sampleSize: 10_000, - // summaryStats: false, - // reorderdColumns: false - // }; - - //const on_dfConfig = (newVal:any) => console.log("on_dfConfig called with", newVal) - const outerProps = { - origDf:widgetModel.get('js_df'), - getOrRequester:widgetGetOrRequester, - commandConfig, - exposeCommandConfigSetter:plumbCommandConfig, - //dfConfig:dfConfig, - //on_dfConfig:on_dfConfig + //origDf:widgetModel.get('js_df'), + getOrRequester:widgetGetOrRequester, + exposeCommandConfigSetter:plumbCommandConfig, }; - const Component = () => { // @ts-ignore const [_, setCounter] = useState(0); @@ -140,7 +121,6 @@ export class DCEFWidgetView extends DOMWidgetView { this.listenTo(this.model, 'change', forceRerender); }, []); - const props : any = {...outerProps} for (const key of Object.keys(this.model.attributes)) { props[key] = this.model.get(key); @@ -149,48 +129,11 @@ export class DCEFWidgetView extends DOMWidgetView { this.touch(); }; } - const el = React.createElement(WidgetDCFCell, props) - return el + return React.createElement(WidgetDCFCell, props) } - const root = ReactDOMClient.createRoot(this.el); const componentEl = React.createElement(Component, {}); root.render(componentEl) - } } - -/* -console.log("144") - - const widgetGetTransformRequester = (setDf:any) => { - widget.setTransformedDf = (inputDf:DFWhole) => { - const opResults = widgetModel.get('operation_results') - const generated_py_code = opResults.generated_py_code - console.log("setDf Wrapper being called - generated_py_code", generated_py_code) - setDf(inputDf) - }; - // widgetModel.on('change:transformed_df', () => { - // setDf(widgetModel.get('transformed_df') as DFWhole) - // }, this) - - const baseRequestTransform = (passedInstructions:any) => { - console.log("transform passedInstructions", passedInstructions) - widgetModel.set('commands', passedInstructions) - widgetModel.save_changes() - }; - return baseRequestTransform; - }; - //_.delay(() => {widget.setPyCode("widget level getPyRequester")}, 500) - //this onChange gets called, the one inside of widgetGetPyRequester doesn't get called - - widgetModel.on('change:operation_results', () => { - const opResults = widgetModel.get('operation_results') - console.log("operation_results", opResults) - widget.setPyCode(opResults.generated_py_code) - widget.setTransformedDf(opResults.transformed_df) - //widget.setPyCode("padddy") - //widgetModel.save_changes() - }, this) -*/ From 5d34454f6304fb365152abcc89992bfbd7be3b45 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 28 Apr 2023 11:33:43 -0700 Subject: [PATCH 014/250] df.head for summary stats --- dcef/dcef_widget.py | 30 +++++++++++++++++++++++++++--- introduction.ipynb | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/dcef/dcef_widget.py b/dcef/dcef_widget.py index 7826f8187..4638d4f1a 100644 --- a/dcef/dcef_widget.py +++ b/dcef/dcef_widget.py @@ -32,12 +32,11 @@ class DCEFWidget(DOMWidget): command_classes = DefaultCommandKlsList - #js_df = Dict({}).tag(sync=True) origDf = Dict({}).tag(sync=True) operation_results = Dict({}).tag(sync=True) dfConfig = Dict( -{ + { 'totalRows': 5309, 'columns': 30, 'rowsShown': 500, @@ -49,12 +48,38 @@ class DCEFWidget(DOMWidget): def __init__(self, df): super().__init__() self.df = df + self.setup_dfconfig(df) self.origDf = json.loads(df.to_json(orient='table', indent=2)) self.operation_results = { 'transformed_df':self.origDf, 'generated_py_code':'#from py widget init'} self.setup_from_command_kls_list() + + #Maybe tie this to a watcher on DF? + def setup_dfconfig(self, df): + self.dfConfig = dict( + totalRows=len(df), + columns=len(df.columns), + sampleSize=self.dfConfig['sampleSize'], + summaryStats=self.dfConfig['summaryStats'], + reorderdColumns=self.dfConfig['reorderdColumns'] + ) + + @observe('dfConfig') + def update_based_on_df_config(self, change): + old = change['old'] + new = change['new'] + if not old['summaryStats'] == new['summaryStats']: + self.reset_summary_stats() + + def reset_summary_stats(self): + if self.dfConfig['summaryStats']: + temp_df = self.df.head() + else: + temp_df = self.df + self.origDf = json.loads(temp_df.to_json(orient='table', indent=2)) + @observe('operations') def interpret_operations(self, change): print("interpret_operations") @@ -63,7 +88,6 @@ def interpret_operations(self, change): print("interpret_operations", operations) results = {} if len(operations) == 1: - results['transformed_df'] = self.origDf results['generated_py_code'] = 'no operations' print('exiting early') diff --git a/introduction.ipynb b/introduction.ipynb index 99405355c..d3c31a6b4 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -12,9 +12,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dcef-dev\n", + "/Users/paddy/dcef\n" + ] + } + ], "source": [ "!echo $CONDA_DEFAULT_ENV\n", "!pwd" @@ -22,9 +31,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "01ad9eaa3d6e47ea8b38597e6cbe6e8b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "DCEFWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'fillna': …" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", From 7c347b028f6141c059b73df342a38c80d2f34690 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 28 Apr 2023 13:28:54 -0700 Subject: [PATCH 015/250] WIP, npm-widget bumped --- introduction.ipynb | 35 ++++++++++++++++++++++++++++++----- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/introduction.ipynb b/introduction.ipynb index 5617c21ca..a1acb0b8e 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -12,9 +12,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dcef-dev\n", + "/Users/paddy/dcef\n" + ] + } + ], "source": [ "!echo $CONDA_DEFAULT_ENV\n", "!pwd" @@ -22,9 +31,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9d62a7295d84475c9bfde176d6e6c23a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "DCEFWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'fillna': …" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", diff --git a/package.json b/package.json index 7907edfe2..67cbaee82 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", - "paddy-react-edit-list": ">=1.1.30", + "paddy-react-edit-list": ">=1.1.31", "lodash": "^4.17.21", "react-dom": "^18.0.0", "react": "^18.0.0" diff --git a/yarn.lock b/yarn.lock index 6c8f9b000..4884b603b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6387,10 +6387,10 @@ package-json@^6.5.0: registry-url "^5.0.0" semver "^6.2.0" -paddy-react-edit-list@>=1.1.30: - version "1.1.30" - resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.30.tgz#3c3048d33c4877165e50ca74c8e41e3a61ff0acd" - integrity sha512-v0q+x6GZWPMAXnRZzC4FfuVmPpjXq+sqazsT/ljYq0frHCPUoM0T8zAmiWXpIn/7P7JIXHPCBqSBIxDBdlKvyA== +paddy-react-edit-list@>=1.1.31: + version "1.1.31" + resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.31.tgz#02c4e128f9df982ff52e698a3a2d1e24a0f4cf63" + integrity sha512-NrblctG49k9EpcT34cG/9wLN0BO3IScmJXiMqUFRsCEIx6HJ1by8NBtltxLAtKQpza4orysKMmEM2B7f1HTIFA== dependencies: "@ag-grid-community/client-side-row-model" "^29.2.0" "@types/lodash" "^4.14.191" From 69cef5e3b4765d4727e4b19477c77b4edc7cc29f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 28 Apr 2023 13:55:42 -0700 Subject: [PATCH 016/250] scroll to approximately the top of the widget --- introduction.ipynb | 51 ++++++++++++---------------------------------- js/dcefwidget.ts | 22 ++++++++------------ 2 files changed, 22 insertions(+), 51 deletions(-) diff --git a/introduction.ipynb b/introduction.ipynb index a1acb0b8e..31a1edf22 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -12,44 +12,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dcef-dev\n", - "/Users/paddy/dcef\n" - ] - } - ], - "source": [ - "!echo $CONDA_DEFAULT_ENV\n", - "!pwd" - ] - }, - { - "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9d62a7295d84475c9bfde176d6e6c23a", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "DCEFWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'fillna': …" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", @@ -103,6 +68,16 @@ " return \"\\n\".join(commands)\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!echo $CONDA_DEFAULT_ENV\n", + "!pwd" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index b80a3c56b..561a78ba0 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -58,17 +58,6 @@ export class DCEFWidgetModel extends DOMWidgetModel { static view_module_version = MODULE_VERSION; } - - // const reactEl = React.createElement(WidgetDCFCell, { - // origDf:widgetModel.get('js_df'), - // getOrRequester:widgetGetOrRequester, - // commandConfig, - // exposeCommandConfigSetter:plumbCommandConfig, - // dfConfig:dfConfig, - // on_dfConfig:on_dfConfig - // }, null) - // root.render(reactEl); - export class DCEFWidgetView extends DOMWidgetView { setCommandConfig = (conf:CommandConfigT) => console.log("default setCommandConfig") @@ -94,7 +83,8 @@ export class DCEFWidgetView extends DOMWidgetView { return retFunc }; - // these following lines probably aren't necessary given the ipyReact integration to the end of plumbCommandConfig + // these following lines probably aren't necessary given the + // ipyReact integration to the end of plumbCommandConfig widgetModel.on( 'change:commandConfig', () => { @@ -131,7 +121,13 @@ export class DCEFWidgetView extends DOMWidgetView { } return React.createElement(WidgetDCFCell, props) } - + //console.log("widget el", this.el) + const notebookEl = document.getElementsByClassName("jp-NotebookPanel-notebook")[0] + const elTop = this.el.getBoundingClientRect()['y'] + const notebookTop = notebookEl.getBoundingClientRect()['y'] + const scrollOffset = (notebookTop - elTop) + 50; + //console.log("scrollOffset", scrollOffset); + notebookEl.scroll(0, scrollOffset) const root = ReactDOMClient.createRoot(this.el); const componentEl = React.createElement(Component, {}); root.render(componentEl) From 7d3acb110a2791848ed9972606c46dd164563a62 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 2 May 2023 16:02:32 -0400 Subject: [PATCH 017/250] completely use ipyreact style binding now --- dcef/dcef_widget.py | 3 ++- full_build.sh | 2 +- introduction.ipynb | 22 +++++++++++++++++++--- package.json | 2 +- pyproject.toml | 6 +++--- yarn.lock | 8 ++++---- 6 files changed, 30 insertions(+), 13 deletions(-) diff --git a/dcef/dcef_widget.py b/dcef/dcef_widget.py index b12bc99dc..7ca36280d 100644 --- a/dcef/dcef_widget.py +++ b/dcef/dcef_widget.py @@ -96,7 +96,8 @@ def reset_summary_stats(self): def interpret_operations(self, change): print("interpret_operations") try: - operations = change['new'] + operations = [{'symbol': 'begin'}] + operations.extend(change['new']) print("interpret_operations", operations) results = {} if len(operations) == 1: diff --git a/full_build.sh b/full_build.sh index f84f76775..7aac4e27b 100755 --- a/full_build.sh +++ b/full_build.sh @@ -6,4 +6,4 @@ python -m build . rm dist/index.js dist/index.js.LICENSE.txt twine check dist/* python -m twine upload --repository testpypi dist/* -#python -m twine upload --repository pypi dist/* +python -m twine upload --repository pypi dist/* diff --git a/introduction.ipynb b/introduction.ipynb index 31a1edf22..20325be05 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -12,9 +12,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "25995cddd7674d3a8cb6f085cbc2c093", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "DCEFWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'fillna': …" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", diff --git a/package.json b/package.json index 67cbaee82..8fac58be6 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", - "paddy-react-edit-list": ">=1.1.31", + "paddy-react-edit-list": ">=1.1.35", "lodash": "^4.17.21", "react-dom": "^18.0.0", "react": "^18.0.0" diff --git a/pyproject.toml b/pyproject.toml index 6f5a04b1e..fe83326d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,8 +6,8 @@ requires = [ build-backend = "hatchling.build" [project] -name = "dcef" -description = "Data Cleaning Framework - UI for quickly cleaning pandas dataframes " +name = "buckaroo" +description = "Herder - GUI Data wrangling for pandas" readme = "README.md" requires-python = ">=3.7" authors = [ @@ -34,7 +34,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.2.4" +version = "0.2.6" [project.license] file = "LICENSE.txt" diff --git a/yarn.lock b/yarn.lock index 4884b603b..9808c9caa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6387,10 +6387,10 @@ package-json@^6.5.0: registry-url "^5.0.0" semver "^6.2.0" -paddy-react-edit-list@>=1.1.31: - version "1.1.31" - resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.31.tgz#02c4e128f9df982ff52e698a3a2d1e24a0f4cf63" - integrity sha512-NrblctG49k9EpcT34cG/9wLN0BO3IScmJXiMqUFRsCEIx6HJ1by8NBtltxLAtKQpza4orysKMmEM2B7f1HTIFA== +paddy-react-edit-list@>=1.1.35: + version "1.1.35" + resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.35.tgz#b594ca1dda8cce051019a32e685051f1abe0a2a3" + integrity sha512-2VI2w4NBypUo/MhahtjyD0vDcyeg3JNP6nDO59viUEiOyM4TyzAyxMVjmmHuT+KIIe51JOmL3czl6Kmw5FmSVw== dependencies: "@ag-grid-community/client-side-row-model" "^29.2.0" "@types/lodash" "^4.14.191" From 9b069f3f1ac3338a9b25cfb693e585375eb6ad75 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 2 May 2023 16:43:20 -0400 Subject: [PATCH 018/250] added first tests via pytest --- introduction.ipynb | 77 ++++++++++++++++++++++++++++++++++++++ pytest.ini | 3 ++ tests/__init__.py | 0 tests/basic_widget_test.py | 18 +++++++++ 4 files changed, 98 insertions(+) create mode 100644 pytest.ini create mode 100644 tests/__init__.py create mode 100644 tests/basic_widget_test.py diff --git a/introduction.ipynb b/introduction.ipynb index 20325be05..bc4c8c6d0 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -37,6 +37,83 @@ "w" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dict_keys(['schema', 'data'])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "w.operation_results['transformed_df'].keys()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['index',\n", + " 'tripduration',\n", + " 'stoptime',\n", + " 'start station id',\n", + " 'start station name',\n", + " 'start station latitude',\n", + " 'start station longitude',\n", + " 'end station id',\n", + " 'end station name',\n", + " 'end station latitude',\n", + " 'end station longitude',\n", + " 'bikeid',\n", + " 'usertype',\n", + " 'birth year',\n", + " 'gender']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "w.operation_results['transformed_df']['schema']['fields']\n", + "tdf = w.operation_results['transformed_df']\n", + "fnames = [ f['name'] for f in tdf['schema']['fields'] ]\n", + "fnames" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'stoptime' in fnames " + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..5d2bb3048 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +asyncio_mode=strict +testpaths=tests diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py new file mode 100644 index 000000000..efe2ac8e3 --- /dev/null +++ b/tests/basic_widget_test.py @@ -0,0 +1,18 @@ +import pandas as pd +from dcef.dcef_widget import DCEFWidget + + +def test_basic_instantiation(): + df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + w = DCEFWidget(df) + assert w.dfConfig['totalRows'] == 499 + +def test_interpreter(): + df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + w = DCEFWidget(df) + assert w.operation_results['generated_py_code'] == '#from py widget init' + w.operations = [[{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] + + tdf = w.operation_results['transformed_df'] + field_names = [ f['name'] for f in tdf['schema']['fields'] ] + assert 'starttime' not in field_names From 765571e9fd3c6dce91756e47d9bd06b24aec4d81 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 08:44:18 -0400 Subject: [PATCH 019/250] removing unmaintained tests --- dcef/tests/__init__.py | 0 dcef/tests/conftest.py | 54 ----------------------------- dcef/tests/test_example.py | 14 -------- dcef/tests/test_nbextension_path.py | 15 -------- 4 files changed, 83 deletions(-) delete mode 100644 dcef/tests/__init__.py delete mode 100644 dcef/tests/conftest.py delete mode 100644 dcef/tests/test_example.py delete mode 100644 dcef/tests/test_nbextension_path.py diff --git a/dcef/tests/__init__.py b/dcef/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/dcef/tests/conftest.py b/dcef/tests/conftest.py deleted file mode 100644 index 5448bba6a..000000000 --- a/dcef/tests/conftest.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# Copyright (c) Paddy Mullen. -# Distributed under the terms of the Modified BSD License. - -import pytest - -from ipykernel.comm import Comm -from ipywidgets import Widget - -class MockComm(Comm): - """A mock Comm object. - - Can be used to inspect calls to Comm's open/send/close methods. - """ - comm_id = 'a-b-c-d' - kernel = 'Truthy' - - def __init__(self, *args, **kwargs): - self.log_open = [] - self.log_send = [] - self.log_close = [] - super(MockComm, self).__init__(*args, **kwargs) - - def open(self, *args, **kwargs): - self.log_open.append((args, kwargs)) - - def send(self, *args, **kwargs): - self.log_send.append((args, kwargs)) - - def close(self, *args, **kwargs): - self.log_close.append((args, kwargs)) - -_widget_attrs = {} -undefined = object() - - -@pytest.fixture -def mock_comm(): - _widget_attrs['_comm_default'] = getattr(Widget, '_comm_default', undefined) - Widget._comm_default = lambda self: MockComm() - _widget_attrs['_ipython_display_'] = Widget._ipython_display_ - def raise_not_implemented(*args, **kwargs): - raise NotImplementedError() - Widget._ipython_display_ = raise_not_implemented - - yield MockComm() - - for attr, value in _widget_attrs.items(): - if value is undefined: - delattr(Widget, attr) - else: - setattr(Widget, attr, value) diff --git a/dcef/tests/test_example.py b/dcef/tests/test_example.py deleted file mode 100644 index 176d615ca..000000000 --- a/dcef/tests/test_example.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# Copyright (c) Paddy Mullen. -# Distributed under the terms of the Modified BSD License. - -import pytest - -from ..example import ExampleWidget - - -def test_example_creation_blank(): - w = ExampleWidget() - assert w.value == 'Hello World' diff --git a/dcef/tests/test_nbextension_path.py b/dcef/tests/test_nbextension_path.py deleted file mode 100644 index ff845cfc7..000000000 --- a/dcef/tests/test_nbextension_path.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# Copyright (c) Paddy Mullen. -# Distributed under the terms of the Modified BSD License. - - -def test_nbextension_path(): - # Check that magic function can be imported from package root: - from dcf import _jupyter_nbextension_paths - # Ensure that it can be called without incident: - path = _jupyter_nbextension_paths() - # Some sanity checks: - assert len(path) == 1 - assert isinstance(path[0], dict) From e9e8e9172b59ae5b64223110efbffe0327d6eb22 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 08:52:49 -0400 Subject: [PATCH 020/250] fixing lint --- .eslintrc.js | 4 +- package.json | 3 +- yarn.lock | 4029 ++++++++++++++------------------------------------ 3 files changed, 1106 insertions(+), 2930 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 9fb27ea5b..522584608 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,7 +7,7 @@ module.exports = { ], parser: '@typescript-eslint/parser', parserOptions: { - project: 'tsconfig.eslint.json', + project: "tsconfig.json", sourceType: 'module' }, plugins: ['@typescript-eslint'], @@ -25,4 +25,4 @@ module.exports = { eqeqeq: 'error', 'prefer-arrow-callback': 'error' } -}; \ No newline at end of file +}; diff --git a/package.json b/package.json index 8fac58be6..8100edf53 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,8 @@ "clean:lib": "rimraf lib", "clean:labextension": "rimraf dcef/labextension", "clean:nbextension": "rimraf dcef/nbextension/index.*", - "lint": "eslint 'js/**/*.{js,ts}' --quiet --fix", + "lint": "eslint 'js/**/*.{ts,tsx}'", + "lint:fix": "eslint 'js/**/*.{ts,tsx} --fix'", "prepack": "yarn run build:labextension && yarn run build:nbextension", "test": "jest --verbose", "watch": "npm-run-all -p watch:*", diff --git a/yarn.lock b/yarn.lock index 9808c9caa..30ba89c35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,31 +3,31 @@ "@ag-grid-community/client-side-row-model@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@ag-grid-community/client-side-row-model/-/client-side-row-model-29.2.0.tgz#edb0184431c407ee7cca17d48c7e5bd2fa707919" - integrity sha512-GkLkwhGh1reV34MNuhv0it8M00/aV62Xjd/5qbMNan2oYZnEHOrn2I7OBDEHKHMjajWyV5lTOGTcKBmh/HXUMQ== + version "29.3.3" + resolved "https://registry.yarnpkg.com/@ag-grid-community/client-side-row-model/-/client-side-row-model-29.3.3.tgz#9a3a2990f6081c6363254b218599d4ac4fe80ca4" + integrity sha512-7BjLseiB625CiDECsSJBDn6xt59VMl0Fs1PwaCWtrTX0AKYBoU5W/SaOezRKW6saH6FnXxEW+47Vyrz+s+rRJQ== dependencies: - "@ag-grid-community/core" "~29.2.0" + "@ag-grid-community/core" "~29.3.3" -"@ag-grid-community/core@~29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@ag-grid-community/core/-/core-29.2.0.tgz#03a0f214448a64444b6a6d943f1c5962c4564c2c" - integrity sha512-1G0X3DrCCfH/vngBXz5rKRhlNmb/WPy/kTtfy/Yo+XOAChs+lgMGG/dgurY/blRyCaMQsUO3aZoJmcckYG4/eQ== +"@ag-grid-community/core@~29.3.3": + version "29.3.3" + resolved "https://registry.yarnpkg.com/@ag-grid-community/core/-/core-29.3.3.tgz#cf5b93f7367da8ab09979baaddcb8da9891c170c" + integrity sha512-cr15doApCrzf7QJYAi0X4zZMv7sFi4nBmEFN4asxSTxrbFGzqzVjO2ymQi5U60NikRTQOuYx3Kzx4PzOTuH4dA== -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@babel/cli@^7.6.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.19.3.tgz#55914ed388e658e0b924b3a95da1296267e278e2" - integrity sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.21.5.tgz#a685a5b50b785f2edfbf6e042c1265c653547d9d" + integrity sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g== dependencies: - "@jridgewell/trace-mapping" "^0.3.8" + "@jridgewell/trace-mapping" "^0.3.17" commander "^4.0.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.1.0" @@ -45,46 +45,47 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.3", "@babel/compat-data@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" - integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": + version "7.21.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" + integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.6.3": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" - integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helpers" "^7.19.4" - "@babel/parser" "^7.19.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.19.6", "@babel/generator@^7.7.2": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.6.tgz#9e481a3fe9ca6261c972645ae3904ec0f9b34a1d" - integrity sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA== +"@babel/generator@^7.21.5", "@babel/generator@^7.7.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" + integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== dependencies: - "@babel/types" "^7.19.4" + "@babel/types" "^7.21.5" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": @@ -95,43 +96,46 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb" + integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" + integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== dependencies: - "@babel/compat-data" "^7.19.3" - "@babel/helper-validator-option" "^7.18.6" + "@babel/compat-data" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b" - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" + integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-replace-supers" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz#a7886f61c2e29e21fd4aaeaf1e473deba6b571dc" + integrity sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" + regexpu-core "^5.3.1" + semver "^6.3.0" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -145,25 +149,18 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" + integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -172,33 +169,33 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-member-expression-to-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" + integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" - integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" + integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.6" - "@babel/types" "^7.19.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -207,12 +204,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -222,30 +219,31 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" + integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" -"@babel/helper-simple-access@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" - integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== dependencies: - "@babel/types" "^7.19.4" + "@babel/types" "^7.21.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -254,39 +252,39 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/helpers@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.4.tgz#42154945f87b8148df7203a25c31ba9a73be46c5" - integrity sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw== +"@babel/helpers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" + integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.4" - "@babel/types" "^7.19.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" @@ -297,10 +295,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" - integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" + integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -309,22 +307,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz#34f6f5174b688529342288cd264f80c9ea9fb4a7" - integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q== +"@babel/plugin-proposal-async-generator-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -336,13 +334,13 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== +"@babel/plugin-proposal-class-static-block@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-dynamic-import@^7.18.6": @@ -369,12 +367,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": @@ -393,16 +391,16 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz#a8fc86e8180ff57290c91a75d83fe658189b642d" - integrity sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q== +"@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.19.4" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -412,13 +410,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== +"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.18.6": @@ -429,14 +427,14 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": @@ -489,14 +487,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -510,6 +508,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -566,28 +571,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.18.6", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" @@ -596,41 +601,42 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz#315d70f68ce64426db379a3d830e7ac30be02e9b" - integrity sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ== +"@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20" - integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== +"@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.19.0" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz#46890722687b9b89e1369ad0bd8dc6c5a3b4319d" - integrity sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA== +"@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" @@ -655,12 +661,12 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -685,31 +691,31 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.18.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== +"@babel/plugin-transform-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== +"@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" -"@babel/plugin-transform-modules-systemjs@^7.19.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== +"@babel/plugin-transform-modules-systemjs@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": @@ -720,13 +726,13 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -743,12 +749,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== +"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" + integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -757,13 +763,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== +"@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.21.5" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" @@ -779,13 +785,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== +"@babel/plugin-transform-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" @@ -808,21 +814,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.18.6": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz#4f1db1e0fe278b42ddbc19ec2f6cd2f8262e35d6" - integrity sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w== +"@babel/plugin-transform-typescript@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" + integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-typescript" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -833,37 +840,38 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.6.3": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.4.tgz#4c91ce2e1f994f717efb4237891c3ad2d808c94b" - integrity sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg== - dependencies: - "@babel/compat-data" "^7.19.4" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-option" "^7.18.6" + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb" + integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== + dependencies: + "@babel/compat-data" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.19.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions" "^7.20.7" "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.21.0" "@babel/plugin-proposal-dynamic-import" "^7.18.6" "@babel/plugin-proposal-export-namespace-from" "^7.18.9" "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.19.4" + "@babel/plugin-proposal-object-rest-spread" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.21.0" "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.18.6" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -873,40 +881,40 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-to-generator" "^7.20.7" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.19.4" - "@babel/plugin-transform-classes" "^7.19.0" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.19.4" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-for-of" "^7.21.5" "@babel/plugin-transform-function-name" "^7.18.9" "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.0" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.20.11" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" + "@babel/plugin-transform-parameters" "^7.21.3" "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-spread" "^7.20.7" "@babel/plugin-transform-sticky-regex" "^7.18.6" "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.19.4" + "@babel/types" "^7.21.5" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -925,52 +933,59 @@ esutils "^2.0.2" "@babel/preset-typescript@^7.6.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" + integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-typescript" "^7.21.3" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.8.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== - dependencies: - regenerator-runtime "^0.13.4" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.8.4": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" + integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" + regenerator-runtime "^0.13.11" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6", "@babel/traverse@^7.7.2": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc" - integrity sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ== +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.6" - "@babel/types" "^7.19.4" + "@babel/parser" "^7.21.5" + "@babel/types" "^7.21.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7" - integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw== +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== dependencies: - "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -980,9 +995,9 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@blueprintjs/colors@^4.0.0-alpha.3": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@blueprintjs/colors/-/colors-4.1.7.tgz#3ccac41eabc3245da20669e6aafafe6c0271d264" - integrity sha512-4qmwwNabzJ6TbdWLjfVFqoCz6OPZpPDV6xvSmnEnS6tWSQ+bepi/ybzx3kKOGtNk1lu0tFDU6tnVti7uz23XaQ== + version "4.1.22" + resolved "https://registry.yarnpkg.com/@blueprintjs/colors/-/colors-4.1.22.tgz#033cbf03705100d5114d54161c225eec5cfeacfb" + integrity sha512-qcC7nWW9TTSS7aDxE5gbo9vrxo+IOpC6/Kzpi0rdOBYFDd02PppCdnCCjGYw1/IopSsZ9EWqDLmD7zuy0H+WEA== "@blueprintjs/core@^3.36.0", "@blueprintjs/core@^3.54.0": version "3.54.0" @@ -1275,18 +1290,10 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1297,28 +1304,33 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.8", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -1329,9 +1341,9 @@ integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== "@jupyter-widgets/base@^2 || ^3 || ^4 || ^6.0.0": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@jupyter-widgets/base/-/base-6.0.1.tgz#1a9237694fd8290084c5e9dfc696452ccf85d054" - integrity sha512-EDuEaM10WtLYvqAaC8nXl0lmss8P+pDPtFIsCmRiodZNg3xyXAxTHDJM9Gl5gtXk31ny62Y+C7l275uir1/0sw== + version "6.0.4" + resolved "https://registry.yarnpkg.com/@jupyter-widgets/base/-/base-6.0.4.tgz#6348b29f3574df4f0a7df593b4088529f46be57a" + integrity sha512-w5KUL8q44Isp0N/ElOAJbPSgWBdeGZO5EYEcz50rfqYAUMSh2Qx0oQJYMddbRgi8b5CajGHFvcHTfvwaNDLSmA== dependencies: "@jupyterlab/services" "^6.0.0" "@lumino/coreutils" "^1.11.1" @@ -1344,17 +1356,17 @@ lodash "^4.17.4" "@jupyterlab/apputils@^3.0.2": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/apputils/-/apputils-3.4.8.tgz#09126a7628958ab2409379d3b691a00d144eee90" - integrity sha512-b7vvPQUdkXcrZnfPUXJVYw4vpKl5HmPqFtFTGmatY+F734FSLYkZeIrNxByinI2DJg35I1p1NfSQW/3DVVwpog== - dependencies: - "@jupyterlab/coreutils" "^5.4.8" - "@jupyterlab/observables" "^4.4.8" - "@jupyterlab/services" "^6.4.8" - "@jupyterlab/settingregistry" "^3.4.8" - "@jupyterlab/statedb" "^3.4.8" - "@jupyterlab/translation" "^3.4.8" - "@jupyterlab/ui-components" "^3.4.8" + version "3.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/apputils/-/apputils-3.6.3.tgz#bc37683142b281e21d22a2f4698634563658298e" + integrity sha512-um2Aaa5fOUwHFpAqKTDA+MFpnAldzOILIi5QsKOWRxiJA2W8x+hlg5HvHbq+eSWuWEU3ah15M7htzBcL3g9d4Q== + dependencies: + "@jupyterlab/coreutils" "^5.6.3" + "@jupyterlab/observables" "^4.6.3" + "@jupyterlab/services" "^6.6.3" + "@jupyterlab/settingregistry" "^3.6.3" + "@jupyterlab/statedb" "^3.6.3" + "@jupyterlab/translation" "^3.6.3" + "@jupyterlab/ui-components" "^3.6.3" "@lumino/algorithm" "^1.9.0" "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" @@ -1365,21 +1377,20 @@ "@lumino/properties" "^1.8.0" "@lumino/signaling" "^1.10.0" "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.33.0" + "@lumino/widgets" "^1.37.2" "@types/react" "^17.0.0" react "^17.0.1" react-dom "^17.0.1" - sanitize-html "~2.5.3" + sanitize-html "~2.7.3" url "^0.11.0" "@jupyterlab/builder@^3.0.1": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/builder/-/builder-3.4.8.tgz#68877818d327d98087e2029a360314cffe0f0c9f" - integrity sha512-PjSpzcVFVyk6u2EENX9JrTdXelL+a90n668pkns8NoEKZVRE3KjZoBUO6WMLS/c4mI7h3TWQhByghKpmjxflAQ== + version "3.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/builder/-/builder-3.6.3.tgz#a4b22efe34e9598b84122ff10509d3d890017b6a" + integrity sha512-oY1a/r75RMoPzhSmuVu+DfjL0cKk1ceHTniZsM2wPuhjjyoF875u6CDzArJatpOOuTgLm7CY5OcU3LCIK1OAgg== dependencies: - "@jupyterlab/buildutils" "^3.4.8" "@lumino/algorithm" "^1.9.0" - "@lumino/application" "^1.27.0" + "@lumino/application" "^1.31.4" "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" @@ -1389,7 +1400,7 @@ "@lumino/properties" "^1.8.0" "@lumino/signaling" "^1.10.0" "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.33.0" + "@lumino/widgets" "^1.37.2" ajv "^6.12.3" commander "~6.0.0" css-loader "^5.0.1" @@ -1402,6 +1413,7 @@ path-browserify "^1.0.0" process "^0.11.10" raw-loader "~4.0.0" + source-map-loader "~1.0.2" style-loader "~2.0.0" supports-color "^7.2.0" svg-url-loader "~6.0.0" @@ -1413,34 +1425,10 @@ webpack-merge "^5.1.2" worker-loader "^3.0.2" -"@jupyterlab/buildutils@^3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/buildutils/-/buildutils-3.4.8.tgz#97b9c123021ba0f35ba6b3c5f2227fb2465bcecf" - integrity sha512-1+OyQaheW+ZWiUS8SBeZ+TB9Iowx7gqxFGIL9jd3yYK2D5UkdZNPc4NEs9BmOTUnhUD3rySNTSCu3gZU0hRQYw== - dependencies: - "@lumino/coreutils" "^1.11.0" - "@yarnpkg/lockfile" "^1.1.0" - child_process "~1.0.2" - commander "~6.0.0" - crypto "~1.0.1" - dependency-graph "^0.9.0" - fs-extra "^9.0.1" - glob "~7.1.6" - inquirer "^7.1.0" - minimatch "~3.0.4" - os "~0.1.1" - package-json "^6.5.0" - prettier "~2.1.1" - process "^0.11.10" - semver "^7.3.2" - sort-package-json "~1.44.0" - typescript "~4.1.3" - verdaccio "^5.13.3" - -"@jupyterlab/coreutils@^5.4.8": - version "5.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/coreutils/-/coreutils-5.4.8.tgz#e3a81a8edb51c9a8d40f9baf4149f86c5e5109d0" - integrity sha512-UICv9nBCL+thSSOFlLWGjPm+UTT1ioPq+pOMjgn0E/DPliUMAMKtrAU5viAbRhITGAU55uL2KH9ijMUIc6o3xA== +"@jupyterlab/coreutils@^5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/coreutils/-/coreutils-5.6.3.tgz#3b0b5d481b14596158b560336833c89be509e84e" + integrity sha512-jRVTpwGzP9wBNYuaZTip89FS1qbeSYrEO2qdNVdW2rs0mQHcIlu3Fkv5muMFmKYGi0XHhG3UhZiWQ7qiPw2svQ== dependencies: "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" @@ -1450,17 +1438,17 @@ path-browserify "^1.0.0" url-parse "~1.5.1" -"@jupyterlab/nbformat@^3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/nbformat/-/nbformat-3.4.8.tgz#8552c9d32e8f04bd3e9be468be57662f0c5307c2" - integrity sha512-RcyITAagwXMIWqehpctb43mVB1H3LrTfikGvykLICmA5AfT+byhooCDN4d+ipg4rkeioUmEgX+2uTfForCsJWQ== +"@jupyterlab/nbformat@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/nbformat/-/nbformat-3.6.3.tgz#8520338e3679cbe8ce2ea8eb5a9b816f8b774ad3" + integrity sha512-0qJLa4dtOmu9EmHFeM7gaZi4qheovIPc9ZrgGGRuG0obajs4YYlvh4MQvCSgpVhme4AuBfGlcfzhlx+Gbzr5Xw== dependencies: "@lumino/coreutils" "^1.11.0" -"@jupyterlab/observables@^4.4.8": - version "4.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/observables/-/observables-4.4.8.tgz#a73833e4f33b3d7e9c2a59306e8f526e13c043d9" - integrity sha512-TT7YQNxvLnfuzbHQjoovfVN02dXDG/zxfWiA1RkycAJnQ/aTgRtEMlLMs7dUqNCh6ej6zNQOUEduJInro/OL4A== +"@jupyterlab/observables@^4.6.3": + version "4.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/observables/-/observables-4.6.3.tgz#49a9ca49fbda7428abbd1bfb8a4006ecd406c18d" + integrity sha512-CvQoL+9WHXOy/CXp/PQLi4c5iZVJ4psz11+GrycDDinX1AdVQ8a43OLTC0gxWl3Tk2C8ZvAi1sgn4FS68E1ACQ== dependencies: "@lumino/algorithm" "^1.9.0" "@lumino/coreutils" "^1.11.0" @@ -1468,16 +1456,16 @@ "@lumino/messaging" "^1.10.0" "@lumino/signaling" "^1.10.0" -"@jupyterlab/services@^6.0.0", "@jupyterlab/services@^6.4.8": - version "6.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/services/-/services-6.4.8.tgz#2da20fd5a5c94ab8f8200da633a252792927318a" - integrity sha512-/acj4d1A1V9KDN+k4CUokOA8e/IxaoJW2B+FJxVnTZvVOBh7093EIG+HYL1SQuQ8CUc2T4DNiq9mG3skiSe2fQ== +"@jupyterlab/services@^6.0.0", "@jupyterlab/services@^6.6.3": + version "6.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/services/-/services-6.6.3.tgz#303938e5dc5aebce7a86324a64ed89c25c61c9e7" + integrity sha512-BxEOMRl9X18T5wY7iV6ZJhARnibFghpD3OruqeSbnGdbRv6XJi8prsRbCQQ6Mf9agvf81B20KmDvYKikPHC0xQ== dependencies: - "@jupyterlab/coreutils" "^5.4.8" - "@jupyterlab/nbformat" "^3.4.8" - "@jupyterlab/observables" "^4.4.8" - "@jupyterlab/settingregistry" "^3.4.8" - "@jupyterlab/statedb" "^3.4.8" + "@jupyterlab/coreutils" "^5.6.3" + "@jupyterlab/nbformat" "^3.6.3" + "@jupyterlab/observables" "^4.6.3" + "@jupyterlab/settingregistry" "^3.6.3" + "@jupyterlab/statedb" "^3.6.3" "@lumino/algorithm" "^1.9.0" "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" @@ -1486,12 +1474,12 @@ node-fetch "^2.6.0" ws "^7.4.6" -"@jupyterlab/settingregistry@^3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/settingregistry/-/settingregistry-3.4.8.tgz#10f52898b8553639ed4d9d786294617ac599c4a9" - integrity sha512-w9MNFivKXUOLrEvWckpcYm3XAZr0sbcKQ33SkftaLSQODsFlUwkcsjCPJJATVyxiWXAsCAgUlOKdNcqWxYXvOA== +"@jupyterlab/settingregistry@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/settingregistry/-/settingregistry-3.6.3.tgz#642f8b6449d626821ef13a7e778ae716fa8331c9" + integrity sha512-pnzIge0ZC8V63R97HiNroJ0eaPM0DN6x65SStyLuv/K8Qez4XqpOdc0Wfell5ri5mxMvm1qKekuFeTikqSXQKQ== dependencies: - "@jupyterlab/statedb" "^3.4.8" + "@jupyterlab/statedb" "^3.6.3" "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" @@ -1499,10 +1487,10 @@ ajv "^6.12.3" json5 "^2.1.1" -"@jupyterlab/statedb@^3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/statedb/-/statedb-3.4.8.tgz#78654b5563f97e8f63683c54403bdc391f4c8df3" - integrity sha512-PMlo+x4R8uXPH1BgCJUVVIj/H8SY9scGJU0pqHhYa6mm3R2EHNAwr8JxyqGjAqT3C0VCCCIDzHtQ3f9inW+OXg== +"@jupyterlab/statedb@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/statedb/-/statedb-3.6.3.tgz#6ba2166af9232c9a185cf0077cf1272f24cc9a69" + integrity sha512-A36L+0NN8f0WOES2GdtZjp9uFuC7IBjhKiO/RlKRX5AFjNxoJ9oO3PZtoxJQYPnGBljMqVdRa+m9aYEfvKhYyQ== dependencies: "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" @@ -1510,32 +1498,32 @@ "@lumino/properties" "^1.8.0" "@lumino/signaling" "^1.10.0" -"@jupyterlab/translation@^3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/translation/-/translation-3.4.8.tgz#9958bbbcabdcf913e96fcb267b223dccfa4d1151" - integrity sha512-5hIdMcA33qQpa2jR2Ho+bslfrf+feMyZbu37eCV58kHZjG3BsW47PWe5M0PCCe8WEIkTDu9z7BAmIUtbfwaZgA== +"@jupyterlab/translation@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/translation/-/translation-3.6.3.tgz#3fd95f726316762bc1799a7b7be0243d5465932a" + integrity sha512-m+wwBv/hiN5Y6Sb7Ij150ZhPXZdhN5wI8CT3afnzARwKr2Aww5AIURO3upmMwnKaPVQTrWqsS3+7bZS/21JuJA== dependencies: - "@jupyterlab/coreutils" "^5.4.8" - "@jupyterlab/services" "^6.4.8" - "@jupyterlab/statedb" "^3.4.8" + "@jupyterlab/coreutils" "^5.6.3" + "@jupyterlab/services" "^6.6.3" + "@jupyterlab/statedb" "^3.6.3" "@lumino/coreutils" "^1.11.0" -"@jupyterlab/ui-components@^3.4.8": - version "3.4.8" - resolved "https://registry.yarnpkg.com/@jupyterlab/ui-components/-/ui-components-3.4.8.tgz#1aec1b7c6a07abe8d84424d8b3085d8f5627b360" - integrity sha512-mkbJnllKCHaKEtUAtCwQAHrJjoD13njlcaDM2Ml9x8vF7PQB8bwRfp/ml4d6n1jOEJjd+a8HRrpzD2X1mTneZQ== +"@jupyterlab/ui-components@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@jupyterlab/ui-components/-/ui-components-3.6.3.tgz#36555036b383c5d80346f409a7a168d13c9d8c85" + integrity sha512-XzseUo2IXclPlYcGxCIz8evjWF+dCBMmbJlvoE5OF29BYBvI5N/DUaTem8bHN5kmQwHIXX6BImHu7rbC9Xjl6w== dependencies: "@blueprintjs/core" "^3.36.0" "@blueprintjs/select" "^3.15.0" - "@jupyterlab/coreutils" "^5.4.8" - "@jupyterlab/translation" "^3.4.8" + "@jupyterlab/coreutils" "^5.6.3" + "@jupyterlab/translation" "^3.6.3" "@lumino/algorithm" "^1.9.0" "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" "@lumino/signaling" "^1.10.0" "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.33.0" + "@lumino/widgets" "^1.37.2" "@rjsf/core" "^3.1.0" react "^17.0.1" react-dom "^17.0.1" @@ -1546,14 +1534,14 @@ resolved "https://registry.yarnpkg.com/@lumino/algorithm/-/algorithm-1.9.2.tgz#b95e6419aed58ff6b863a51bfb4add0f795141d3" integrity sha512-Z06lp/yuhz8CtIir3PNTGnuk7909eXt4ukJsCzChsGuot2l5Fbs96RJ/FOHgwCedaX74CtxPjXHXoszFbUA+4A== -"@lumino/application@^1.27.0": - version "1.29.4" - resolved "https://registry.yarnpkg.com/@lumino/application/-/application-1.29.4.tgz#4ee5aedb424c2dd0eade52c45c42a11a153aeecc" - integrity sha512-yCBkG7Fk2tJ9OBwbzDzZyJUySGqzSGG+Fn/kQJ8kiPcEA7ajpoGrtI8/pd0TzASrih3A5PZnuoR8bRV6Dt2UbA== +"@lumino/application@^1.31.4": + version "1.31.4" + resolved "https://registry.yarnpkg.com/@lumino/application/-/application-1.31.4.tgz#b804fcc46fb77deb41aee94c48bea990f735d6b9" + integrity sha512-dOSsDJ1tXOxC3fnSHvtDQK5RcICLEVPtO19HeCGwurb5W2ZZ55SZT2b5jZu6V/v8lGdtkNbr1RJltRpJRSRb/A== dependencies: - "@lumino/commands" "^1.20.1" + "@lumino/commands" "^1.21.1" "@lumino/coreutils" "^1.12.1" - "@lumino/widgets" "^1.34.1" + "@lumino/widgets" "^1.37.2" "@lumino/collections@^1.9.3": version "1.9.3" @@ -1562,44 +1550,44 @@ dependencies: "@lumino/algorithm" "^1.9.2" -"@lumino/commands@^1.19.0", "@lumino/commands@^1.20.1": - version "1.20.1" - resolved "https://registry.yarnpkg.com/@lumino/commands/-/commands-1.20.1.tgz#8a4e4840528e8009c5472dc6b5bb0970d7f27a5f" - integrity sha512-7u0vc3qWVAyI3CHGmQ+MXP5bvmj5dtnU5J4u2aRrodtlysU3nLjGhD57bbTq2VUqpmS1bkfBqNFhO1e4PFKSaQ== +"@lumino/commands@^1.19.0", "@lumino/commands@^1.21.1": + version "1.21.1" + resolved "https://registry.yarnpkg.com/@lumino/commands/-/commands-1.21.1.tgz#eda8b3cf5ef73b9c8ce93b3b5cf66bb053df2a76" + integrity sha512-d1zJmwz5bHU0BM/Rl3tRdZ7/WgXnFB0bM7x7Bf0XDlmX++jnU9k0j3mh6/5JqCGLmIApKCRwVqSaV7jPmSJlcQ== dependencies: "@lumino/algorithm" "^1.9.2" "@lumino/coreutils" "^1.12.1" - "@lumino/disposable" "^1.10.2" + "@lumino/disposable" "^1.10.4" "@lumino/domutils" "^1.8.2" "@lumino/keyboard" "^1.8.2" - "@lumino/signaling" "^1.10.2" - "@lumino/virtualdom" "^1.14.2" + "@lumino/signaling" "^1.11.1" + "@lumino/virtualdom" "^1.14.3" "@lumino/coreutils@^1.11.0", "@lumino/coreutils@^1.11.1", "@lumino/coreutils@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@lumino/coreutils/-/coreutils-1.12.1.tgz#79860c9937483ddf6cda87f6c2b9da8eb1a5d768" integrity sha512-JLu3nTHzJk9N8ohZ85u75YxemMrmDzJdNgZztfP7F7T7mxND3YVNCkJG35a6aJ7edu1sIgCjBxOvV+hv27iYvQ== -"@lumino/disposable@^1.10.0", "@lumino/disposable@^1.10.2": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@lumino/disposable/-/disposable-1.10.2.tgz#8a7e74320f51a48419d92672fe8abcf8cec04818" - integrity sha512-jwt8bCw3OU65wJMOCJUZAfVVUdxZdEufRDrDkoG91aSW+/R/VBzt33AqZX81/B0KxddL6R3PdNWI+0fRJBaeYw== +"@lumino/disposable@^1.10.0", "@lumino/disposable@^1.10.4": + version "1.10.4" + resolved "https://registry.yarnpkg.com/@lumino/disposable/-/disposable-1.10.4.tgz#73b452044fecf988d7fa73fac9451b1a7f987323" + integrity sha512-4ZxyYcyzUS+ZeB2KAH9oAH3w0DUUceiVr+FIZHZ2TAYGWZI/85WlqJtfm0xjwEpCwLLW1TDqJrISuZu3iMmVMA== dependencies: "@lumino/algorithm" "^1.9.2" - "@lumino/signaling" "^1.10.2" + "@lumino/signaling" "^1.11.1" "@lumino/domutils@^1.8.0", "@lumino/domutils@^1.8.2": version "1.8.2" resolved "https://registry.yarnpkg.com/@lumino/domutils/-/domutils-1.8.2.tgz#d15cdbae12bea52852bbc13c4629360f9f05b7f5" integrity sha512-QIpMfkPJrs4GrWBuJf2Sn1fpyVPmvqUUAeD8xAQo8+4V5JAT0vUDLxZ9HijefMgNCi3+Bs8Z3lQwRCrz+cFP1A== -"@lumino/dragdrop@^1.13.0", "@lumino/dragdrop@^1.14.2": - version "1.14.2" - resolved "https://registry.yarnpkg.com/@lumino/dragdrop/-/dragdrop-1.14.2.tgz#5e877496921f9a8ef57c7eb8aec884035cf0d051" - integrity sha512-wXsungIpgNSLmV23f61UPhDlxr0VUBX4xQY2gHq0ps1dDL9BNQnec9q0dbeYRa0n27gKEJ81efAgCV4a/+xJ3A== +"@lumino/dragdrop@^1.13.0", "@lumino/dragdrop@^1.14.5": + version "1.14.5" + resolved "https://registry.yarnpkg.com/@lumino/dragdrop/-/dragdrop-1.14.5.tgz#1db76c8a01f74cb1b0428db6234e820bb58b93ba" + integrity sha512-LC5xB82+xGF8hFyl716TMpV32OIMIMl+s3RU1PaqDkD6B7PkgiVk6NkJ4X9/GcEvl2igkvlGQt/3L7qxDAJNxw== dependencies: "@lumino/coreutils" "^1.12.1" - "@lumino/disposable" "^1.10.2" + "@lumino/disposable" "^1.10.4" "@lumino/keyboard@^1.8.2": version "1.8.2" @@ -1615,76 +1603,56 @@ "@lumino/collections" "^1.9.3" "@lumino/polling@^1.9.0": - version "1.11.2" - resolved "https://registry.yarnpkg.com/@lumino/polling/-/polling-1.11.2.tgz#a1f5e0749be0a661f0da1a06d1d590edf946ae08" - integrity sha512-/1neRyLdRt62teEwi/wKmyaqaU+H8e4SvvFzrIXITX0shb72um+kv2vOAkj7wSImsIo21PWweRsTbzJ97f6J3w== + version "1.11.4" + resolved "https://registry.yarnpkg.com/@lumino/polling/-/polling-1.11.4.tgz#ddfe47da5b41af4cfa474898542c099e445c0e6c" + integrity sha512-yC7JLssj3mqVK6TsYj7dg4AG0rcsC42YtpoDLtz9yzO84Q5flQUfmjAPQB6oPA6wZOlISs3iasF+uO2w1ls5jg== dependencies: "@lumino/coreutils" "^1.12.1" - "@lumino/disposable" "^1.10.2" - "@lumino/signaling" "^1.10.2" + "@lumino/disposable" "^1.10.4" + "@lumino/signaling" "^1.11.1" "@lumino/properties@^1.8.0", "@lumino/properties@^1.8.2": version "1.8.2" resolved "https://registry.yarnpkg.com/@lumino/properties/-/properties-1.8.2.tgz#91131f2ca91a902faa138771eb63341db78fc0fd" integrity sha512-EkjI9Cw8R0U+xC9HxdFSu7X1tz1H1vKu20cGvJ2gU+CXlMB1DvoYJCYxCThByHZ+kURTAap4SE5x8HvKwNPbig== -"@lumino/signaling@^1.10.0", "@lumino/signaling@^1.10.2": - version "1.10.2" - resolved "https://registry.yarnpkg.com/@lumino/signaling/-/signaling-1.10.2.tgz#da30a84b8820f2b29e0c176450059711913392d9" - integrity sha512-LvnLRb2ngOZbRtFHRcKkMdPSXm0bzfVv/5mbx/hpT1DWHihMtBpGQ+bIfFvnARmFJoI11Wt+DMX77MWPw6tpig== +"@lumino/signaling@^1.10.0", "@lumino/signaling@^1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@lumino/signaling/-/signaling-1.11.1.tgz#438f447a1b644fd286549804f9851b5aec9679a2" + integrity sha512-YCUmgw08VoyMN5KxzqPO3KMx+cwdPv28tAN06C0K7Q/dQf+oufb1XocuhZb5selTrTmmuXeizaYxgLIQGdS1fA== dependencies: "@lumino/algorithm" "^1.9.2" + "@lumino/properties" "^1.8.2" -"@lumino/virtualdom@^1.14.0", "@lumino/virtualdom@^1.14.2": - version "1.14.2" - resolved "https://registry.yarnpkg.com/@lumino/virtualdom/-/virtualdom-1.14.2.tgz#bee4fd3cf78c1aa003d9c208f6825969b4321573" - integrity sha512-iF20v6s4gP/hAH4VjmBtv2dexr18W4vL/Y5Rx4+U3kS/ZIFU7987NsM+0Yr6W9kdBQ1w6+pJjRBS9sWYnohdoQ== +"@lumino/virtualdom@^1.14.0", "@lumino/virtualdom@^1.14.3": + version "1.14.3" + resolved "https://registry.yarnpkg.com/@lumino/virtualdom/-/virtualdom-1.14.3.tgz#e490c36ff506d877cf45771d6968e3e26a8919fd" + integrity sha512-5joUC1yuxeXbpfbSBm/OR8Mu9HoTo6PDX0RKqzlJ9o97iml7zayFN/ynzcxScKGQAo9iaXOY8uVIvGUT8FnsGw== dependencies: "@lumino/algorithm" "^1.9.2" -"@lumino/widgets@^1.30.0", "@lumino/widgets@^1.33.0", "@lumino/widgets@^1.34.1": - version "1.34.1" - resolved "https://registry.yarnpkg.com/@lumino/widgets/-/widgets-1.34.1.tgz#46272677876caea02a8d197c6d0cfc0afd5061bd" - integrity sha512-DNpqg7TgAQROOVytGNgFs8oBET/UrTjXYEls/S/GSzr0qcoiDHfrX+LOyaXxOO08ijvq9NhqYfYvmM5AFGTNuA== +"@lumino/widgets@^1.30.0", "@lumino/widgets@^1.37.2": + version "1.37.2" + resolved "https://registry.yarnpkg.com/@lumino/widgets/-/widgets-1.37.2.tgz#b408fae221ecec2f1b028607782fbe1e82588bce" + integrity sha512-NHKu1NBDo6ETBDoNrqSkornfUCwc8EFFzw6+LWBfYVxn2PIwciq2SdiJGEyNqL+0h/A9eVKb5ui5z4cwpRekmQ== dependencies: "@lumino/algorithm" "^1.9.2" - "@lumino/commands" "^1.20.1" + "@lumino/commands" "^1.21.1" "@lumino/coreutils" "^1.12.1" - "@lumino/disposable" "^1.10.2" + "@lumino/disposable" "^1.10.4" "@lumino/domutils" "^1.8.2" - "@lumino/dragdrop" "^1.14.2" + "@lumino/dragdrop" "^1.14.5" "@lumino/keyboard" "^1.8.2" "@lumino/messaging" "^1.10.3" "@lumino/properties" "^1.8.2" - "@lumino/signaling" "^1.10.2" - "@lumino/virtualdom" "^1.14.2" + "@lumino/signaling" "^1.11.1" + "@lumino/virtualdom" "^1.14.3" "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - "@npmcli/fs@^1.0.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" @@ -1717,19 +1685,14 @@ react-is "^16.9.0" "@sinclair/typebox@^0.24.1": - version "0.24.47" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.47.tgz#530b67163714356f93e82bdb871e7db4b7bc564e" - integrity sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A== - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" @@ -1740,25 +1703,13 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -1779,9 +1730,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + version "7.18.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" + integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== dependencies: "@babel/types" "^7.3.0" @@ -1812,35 +1763,22 @@ integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/eslint@*": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.7.tgz#0f05a2677d1a394ff70c21a964a32d3efa05f966" - integrity sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw== + version "8.37.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" @@ -1872,9 +1810,9 @@ pretty-format "^27.0.0" "@types/jquery@*": - version "3.5.14" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.14.tgz#ac8e11ee591e94d4d58da602cb3a5a8320dee577" - integrity sha512-X1gtMRMbziVQkErhTQmSe2jFwwENA/Zr+PprCkF63vFq+Yt5PZ4AlKqgmeNlwgn7dhsXEK888eIW2520EpC+xg== + version "3.5.16" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.16.tgz#632131baf30951915b0317d48c98e9890bdf051d" + integrity sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw== dependencies: "@types/sizzle" "*" @@ -1883,25 +1821,15 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/lodash@^4.14.134": - version "4.14.186" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.186.tgz#862e5514dd7bd66ada6c70ee5fce844b06c8ee97" - integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== - -"@types/lodash@^4.14.191": - version "4.14.192" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.192.tgz#5790406361a2852d332d41635d927f1600811285" - integrity sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== +"@types/lodash@^4.14.134", "@types/lodash@^4.14.191": + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/node@*": - version "18.11.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.2.tgz#c59b7641832531264fda3f1ba610362dc9a7dfc8" - integrity sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw== + version "18.16.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01" + integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q== "@types/node@^10.11.6": version "10.17.60" @@ -1914,9 +1842,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/prop-types@*": version "15.7.5" @@ -1924,34 +1852,34 @@ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react-dom@^18.0.0": - version "18.0.11" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" - integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== + version "18.2.1" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.1.tgz#663b2612feb5f6431a70207430d7c04881b87f29" + integrity sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.0": - version "18.0.33" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.33.tgz#a1575160cb4376787c2f5fe0312302f824baa61e" - integrity sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA== + version "18.2.0" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" + integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17.0.0": - version "17.0.50" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.50.tgz#39abb4f7098f546cfcd6b51207c90c4295ee81fc" - integrity sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA== + version "17.0.58" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.58.tgz#c8bbc82114e5c29001548ebe8ed6c4ba4d3c9fb0" + integrity sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/sizzle@*": version "2.3.3" @@ -1993,9 +1921,9 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": - version "17.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" @@ -2059,173 +1987,125 @@ dependencies: eslint-visitor-keys "^1.1.0" -"@verdaccio/commons-api@10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@verdaccio/commons-api/-/commons-api-10.2.0.tgz#3b684c31749837b0574375bb2e10644ecea9fcca" - integrity sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ== - dependencies: - http-errors "2.0.0" - http-status-codes "2.2.0" - -"@verdaccio/file-locking@10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@verdaccio/file-locking/-/file-locking-10.3.0.tgz#a4342665c549163817c267bfa451e32ed3009767" - integrity sha512-FE5D5H4wy/nhgR/d2J5e1Na9kScj2wMjlLPBHz7XF4XZAVSRdm45+kL3ZmrfA6b2HTADP/uH7H05/cnAYW8bhw== - dependencies: - lockfile "1.0.4" - -"@verdaccio/local-storage@10.3.1": - version "10.3.1" - resolved "https://registry.yarnpkg.com/@verdaccio/local-storage/-/local-storage-10.3.1.tgz#8cbdc6390a0eb532577ae217729cb0a4e062f299" - integrity sha512-f3oArjXPOAwUAA2dsBhfL/rSouqJ2sfml8k97RtnBPKOzisb28bgyAQW0mqwQvN4MTK5S/2xudmobFpvJAIatg== - dependencies: - "@verdaccio/commons-api" "10.2.0" - "@verdaccio/file-locking" "10.3.0" - "@verdaccio/streams" "10.2.0" - async "3.2.4" - debug "4.3.4" - lodash "4.17.21" - lowdb "1.0.0" - mkdirp "1.0.4" - -"@verdaccio/readme@10.4.1": - version "10.4.1" - resolved "https://registry.yarnpkg.com/@verdaccio/readme/-/readme-10.4.1.tgz#c568d158c36ca7dd742b1abef890383918f621b2" - integrity sha512-OZ6R+HF2bIU3WFFdPxgUgyglaIfZzGSqyUfM2m1TFNfDCK84qJvRIgQJ1HG/82KVOpGuz/nxVyw2ZyEZDkP1vA== - dependencies: - dompurify "2.3.9" - jsdom "16.7.0" - marked "4.0.18" - -"@verdaccio/streams@10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@verdaccio/streams/-/streams-10.2.0.tgz#e01d2bfdcfe8aa2389f31bc6b72a602628bd025b" - integrity sha512-FaIzCnDg0x0Js5kSQn1Le3YzDHl7XxrJ0QdIw5LrDUmLsH3VXNi4/NMlSHnw5RiTTMs4UbEf98V3RJRB8exqJA== - -"@verdaccio/ui-theme@6.0.0-6-next.48": - version "6.0.0-6-next.48" - resolved "https://registry.yarnpkg.com/@verdaccio/ui-theme/-/ui-theme-6.0.0-6-next.48.tgz#23bbc8037bf9e1b27600f5160a0ff716982db48b" - integrity sha512-1jls+cpfEXqXc1ZzqLGGNs6YCyG6B6QwDCezEkSvgKm+9A49FnSJ2n2dNIGcQYOszwHmd8EvwN98OEIx3Bbtrw== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" + integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" + integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" + integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" + integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" + integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" + integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" + integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" + integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" + integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== +"@webassemblyjs/utf8@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" + integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" + integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== + dependencies: + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-wasm-section" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-opt" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" + "@webassemblyjs/wast-printer" "1.11.5" + +"@webassemblyjs/wasm-gen@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" + integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== +"@webassemblyjs/wasm-opt@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" + integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-buffer" "1.11.5" + "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/wasm-parser" "1.11.5" -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== +"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" + integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/ast" "1.11.5" + "@webassemblyjs/helper-api-error" "1.11.5" + "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/ieee754" "1.11.5" + "@webassemblyjs/leb128" "1.11.5" + "@webassemblyjs/utf8" "1.11.5" -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== +"@webassemblyjs/wast-printer@1.11.5": + version "1.11.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" + integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== dependencies: - "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/ast" "1.11.5" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.2.0": @@ -2255,40 +2135,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -JSONStream@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abab@^2.0.3, abab@^2.0.5: +abab@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" @@ -2299,45 +2150,33 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - acorn@^6.2.0: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +acorn@^8.5.0, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== ag-grid-community@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-29.2.0.tgz#ce29357464f50bbafa00aaa2adbd8b275310f44d" - integrity sha512-1xP1fpM8gXp2ALzBLONejZNul9hA3//ddszSlhq79QZ1FskQ1Z7E2WvvFeCeLJTJZrfhQkT1q1LO5DGfGeiBvg== + version "29.3.3" + resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-29.3.3.tgz#87a649d3c549e3e3b8316ac2e262dc566788ef1f" + integrity sha512-5XHG2NtXfUFroST/IvWyIYzM7GnbAM1mX7YsKvUHRWk0iMY1kAMJMk6AOoNKe1BBj7jg+Wgbig123T4X7bNZPw== ag-grid-react@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-29.2.0.tgz#512f41e98cfd7ec291832aae8601f76b52c366c8" - integrity sha512-FZEWhbe51KNkvu+MohGXxXixIJdakJrs5XDdJ/h1jqmCX9WZzHNT2OvoYHIXB7gcKKj5pf47YJB8eaEqsRlpbg== + version "29.3.3" + resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-29.3.3.tgz#ce5eef347dc8487dc694364bda1b6b1fa0bf8f30" + integrity sha512-xciimp9q8FXv2bgLOIyPT11dKEW0KNDTF8hyDuAKuK3541YBTZpiycwtmYxVimUM4c007TRTEYgw6Kql/gqWiA== dependencies: prop-types "^15.8.1" -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2367,9 +2206,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2423,18 +2262,13 @@ ansi-styles@^5.0.0: integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" -apache-md5@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/apache-md5/-/apache-md5-1.1.7.tgz#dcef1802700cc231d60c5e08fd088f2f9b36375a" - integrity sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2442,43 +2276,19 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: +array-buffer-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async@3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - async@^2.5.0: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -2486,30 +2296,15 @@ async@^2.5.0: dependencies: lodash "^4.17.14" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== babel-code-frame@^6.26.0: version "6.26.0" @@ -2690,18 +2485,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bcryptjs@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -2712,24 +2495,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2738,13 +2503,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2752,20 +2510,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bs-logger@0.x: version "0.2.6" @@ -2781,26 +2534,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - cacache@^15.0.5: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" @@ -2825,19 +2563,6 @@ cacache@^15.0.5: tar "^6.0.2" unique-filename "^1.1.1" -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -2861,15 +2586,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400: - version "1.0.30001422" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz#f2d7c6202c49a8359e6e35add894d88ef93edba1" - integrity sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +caniuse-lite@^1.0.30001449: + version "1.0.30001482" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz#8b3fad73dc35b2674a5c96df2d4f9f1c561435de" + integrity sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ== chalk@^1.1.3: version "1.1.3" @@ -2904,16 +2624,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -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== - -child_process@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" - integrity sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g== - chokidar@^3.4.0: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -2940,9 +2650,9 @@ chrome-trace-event@^1.0.2: integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" - integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -2974,18 +2684,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -clipanion@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-3.1.0.tgz#3e217dd6476bb9236638b07eb4673f7309839819" - integrity sha512-v025Hz+IDQ15FpOyK8p02h5bFznMu6rLFsJSyOPR+7WrbSnZ1Ek6pblPukV7K5tC/dsWfncQPIrJ4iUy2PXkbw== - dependencies: - typanion "^3.3.1" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3004,13 +2702,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3046,16 +2737,9 @@ color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.14, colorette@^2.0.16: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== commander@^2.20.0: version "2.20.3" @@ -3087,26 +2771,6 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - compute-gcd@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" @@ -3131,80 +2795,37 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookies@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== +core-js-compat@^3.25.1: + version "3.30.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe" + integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - -core-js-compat@^3.25.1: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.25.5.tgz#0016e8158c904f7b059486639e6e82116eafa7d9" - integrity sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA== - dependencies: - browserslist "^4.21.4" + browserslist "^4.21.5" core-js-pure@^3.6.5: - version "3.25.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" - integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== + version "3.30.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.1.tgz#7d93dc89e7d47b8ef05d7e79f507b0e99ea77eec" + integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg== core-js@^2.4.0: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -3232,11 +2853,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" - integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== - css-loader@^3.0.0: version "3.6.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" @@ -3277,47 +2893,15 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - csstype@3.0.10: version "3.0.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== data-urls@^2.0.0: version "2.0.0" @@ -3328,44 +2912,20 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -dayjs@1.11.5: - version "1.11.5" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93" - integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA== - -debug@2.6.9, debug@^2.6.8: +debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.3: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decimal.js@^10.2.1: - version "10.4.2" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" - integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -3383,60 +2943,25 @@ deep-equal@^1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -dependency-graph@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.9.0.tgz#11aed7e203bc8b00f48356d92db27b265c445318" - integrity sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-newline@3.1.0, detect-newline@^3.0.0: +detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== @@ -3451,13 +2976,6 @@ diff-sequences@^28.1.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -3491,13 +3009,6 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - domhandler@^4.0.0, domhandler@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" @@ -3505,11 +3016,6 @@ domhandler@^4.0.0, domhandler@^4.2.0: dependencies: domelementtype "^2.2.0" -dompurify@2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.9.tgz#a4be5e7278338d6db09922dffcf6182cd099d70a" - integrity sha512-3zOnuTwup4lPV/GfGS6UzG4ub9nhSYagR/5tB3AvDEwqyy5dtyCM2dVjwGDCnrPerXifBKTYh/UWCGKK7ydhhw== - domutils@^2.5.2: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -3519,11 +3025,6 @@ domutils@^2.5.2: domelementtype "^2.2.0" domhandler "^4.2.0" -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - duplicate-package-checker-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz#78bb89e625fa7cf8c2a59c53f62b495fda9ba287" @@ -3534,30 +3035,10 @@ duplicate-package-checker-webpack-plugin@^3.0.0: lodash "^4.17.4" semver "^5.4.1" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.284: + version "1.4.380" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.380.tgz#195dc59d930c6b74efbee6f0e6a267ce4af5ed91" + integrity sha512-XKGdI4pWM78eLH2cbXJHiBnWUwFSzZM7XujsB6stDiGu9AeSqziedP6amNLpJzE3i0rLTcfAwdCTs5ecP5yeSg== emittery@^0.10.2: version "0.10.2" @@ -3579,11 +3060,6 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -3600,10 +3076,10 @@ enhanced-resolve@^4.0.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== +enhanced-resolve@^5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" + integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -3620,7 +3096,7 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -envinfo@7.8.1, envinfo@^7.7.3: +envinfo@^7.7.3: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== @@ -3639,40 +3115,59 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -3683,52 +3178,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -3744,18 +3198,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-config-prettier@^6.11.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" @@ -3763,14 +3205,6 @@ eslint-config-prettier@^6.11.0: dependencies: get-stdin "^6.0.0" -eslint-import-resolver-node@0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - eslint-plugin-prettier@^3.1.4: version "3.4.1" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" @@ -3858,15 +3292,15 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -3892,19 +3326,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -3956,79 +3377,6 @@ expect@^28.1.3: jest-message-util "^28.1.3" jest-util "^28.1.3" -express-rate-limit@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" - integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== - -express@4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.0" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.10.3" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -extend@~3.0.2: - version "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" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -4039,49 +3387,21 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.0.3: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-redact@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.2.tgz#d58e69e9084ce9fa4c1a6fa98a3e1ecf5d7839aa" - integrity sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw== - -fast-safe-stringify@2.1.1, fast-safe-stringify@^2.0.8: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" @@ -4089,13 +3409,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -4126,19 +3439,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" @@ -4169,54 +3469,23 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flatstr@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" - integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== - flatted@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + is-callable "^1.1.3" free-style@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/free-style/-/free-style-3.1.0.tgz#4e2996029534e6b1731611d843437b9e2f473f08" integrity sha512-vJujYSIyT30iDoaoeigNAxX4yB1RUrh+N2ZMhIElMr3BvCuGXOw7XNJMEEJkDUeamK2Rnb/IKFGKRKlTWIGRWA== -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - fs-extra@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -4278,7 +3547,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -4293,10 +3562,10 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -4317,14 +3586,7 @@ get-stdin@^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.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -4344,18 +3606,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -git-hooks-list@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" - integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4368,17 +3618,6 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -4409,9 +3648,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" @@ -4420,72 +3659,30 @@ globals@^9.18.0: resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.0.tgz#abfcd0630037ae174a88590132c2f6804e291072" - integrity sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw== +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" + define-properties "^1.1.3" -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== gud@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== -handlebars@4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -4515,6 +3712,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -4539,13 +3741,6 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -4561,53 +3756,6 @@ htmlparser2@^6.0.0: domutils "^2.5.2" entities "^2.0.0" -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http-status-codes@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.2.0.tgz#bb2efe63d941dfc2be18e15f703da525169622be" - integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng== - -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -4618,12 +3766,12 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - safer-buffer ">= 2.1.2 < 3" + safer-buffer ">= 2.1.2 < 3.0.0" icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" @@ -4642,11 +3790,6 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -4686,41 +3829,17 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@~2.0.3: +inherits@2, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^7.1.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -4736,11 +3855,6 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -4749,6 +3863,15 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -4776,15 +3899,15 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" + integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== dependencies: has "^1.0.3" @@ -4839,11 +3962,6 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-plain-obj@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -4856,16 +3974,6 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-promise@^2.1.0, is-promise@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4905,10 +4013,16 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" is-unicode-supported@^0.1.0: version "0.1.0" @@ -4937,11 +4051,6 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -5194,9 +4303,9 @@ jest-mock@^28.1.3: "@types/node" "*" jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^28.0.2: version "28.0.2" @@ -5386,9 +4495,9 @@ jest@^28.1.3: jest-cli "^28.1.3" jquery@^3.1.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.1.tgz#fab0408f8b45fc19f956205773b62b292c147a16" - integrity sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw== + version "3.6.4" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" + integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -5400,13 +4509,6 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -5415,44 +4517,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsdom@16.7.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -5463,11 +4527,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -5504,21 +4563,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - 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 sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -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" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - json5@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -5526,10 +4575,10 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.1, json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.1.1, json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" @@ -5547,83 +4596,16 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -jsonwebtoken@8.5.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^5.6.0" - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -kleur@4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -5642,14 +4624,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - license-webpack-plugin@^2.3.14: version "2.3.21" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.21.tgz#152f5e82d5f51f8bab78905731f2b8042aa5691b" @@ -5714,18 +4688,18 @@ loader-runner@^4.2.0: integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^1.0.1" loader-utils@^2.0.0, loader-utils@~2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -5747,48 +4721,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lockfile@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== - dependencies: - signal-exit "^3.0.2" - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -5799,17 +4736,12 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@4, lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5839,31 +4771,12 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lowdb@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" - integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - graceful-fs "^4.1.3" - is-promise "^2.1.0" - lodash "4" - pify "^3.0.0" - steno "^0.4.1" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@7.14.0: - version "7.14.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.0.tgz#21be64954a4680e303a09e9468f880b98a0b3c7f" - integrity sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ== + yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" @@ -5872,25 +4785,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ== - dependencies: - es5-ext "~0.10.2" - -lunr-mutable-indexes@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/lunr-mutable-indexes/-/lunr-mutable-indexes-2.3.2.tgz#864253489735d598c5140f3fb75c0a5c8be2e98c" - integrity sha512-Han6cdWAPPFM7C2AigS2Ofl3XjAT0yVMrUixodJEpyg71zCtZ2yzXc3s+suc/OaNt4ca6WJBEzVnEIjxCTwFMw== - dependencies: - lunr ">= 2.3.0 < 2.4.0" - -"lunr@>= 2.3.0 < 2.4.0": - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -5918,35 +4812,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -marked@4.0.18: - version "4.0.18" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.18.tgz#cd0ac54b2e5610cfb90e8fd46ccaa8292c9ed569" - integrity sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw== - -marked@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.1.0.tgz#3fc6e7485f21c1ca5d6ec4a39de820e146954796" - integrity sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memoizee@0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" - integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== - dependencies: - d "^1.0.1" - es5-ext "^0.10.53" - es6-weak-map "^2.0.3" - event-emitter "^0.3.5" - is-promise "^2.2.2" - lru-queue "^0.1.0" - next-tick "^1.1.0" - timers-ext "^0.1.7" - memory-fs@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" @@ -5960,26 +4825,11 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - 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== -merge2@^1.2.3, merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -5988,38 +4838,23 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - 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== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - mini-css-extract-plugin@~1.3.2: version "1.3.9" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz#47a32132b0fd97a119acd530e8421e8f6ab16d5e" @@ -6029,31 +4864,17 @@ mini-css-extract-plugin@~1.3.2: schema-utils "^3.0.0" webpack-sources "^1.1.0" -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@~3.0.4: - version "3.0.8" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" - integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minimist@^1.2.0, minimist@^1.2.6, minimist@~1.2.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -6077,12 +4898,17 @@ minipass-pipeline@^1.2.2: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -6091,18 +4917,18 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@1.0.4, mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + moment@^2.24.0: version "2.29.4" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" @@ -6118,64 +4944,30 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -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== - -mv@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== - dependencies: - mkdirp "~0.5.1" - ncp "~2.0.0" - rimraf "~2.4.0" - -nanoid@^3.1.23, nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.1.23, nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0, neo-async@^2.6.2: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@1, next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@2.6.7, node-fetch@^2.6.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== +node-fetch@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== dependencies: whatwg-url "^5.0.0" @@ -6184,10 +4976,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== normalize-package-data@^2.3.2: version "2.5.0" @@ -6204,11 +4996,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - normalize.css@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" @@ -6236,25 +5023,15 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -nwsapi@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.0.1: version "1.1.5" @@ -6279,18 +5056,6 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -6305,18 +5070,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - 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" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -6329,21 +5082,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -os@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/os/-/os-0.1.2.tgz#f29a50c62908516ba42652de42f7038600cadbc2" - integrity sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -6377,16 +5115,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - paddy-react-edit-list@>=1.1.35: version "1.1.35" resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.35.tgz#b594ca1dda8cce051019a32e685051f1abe0a2a3" @@ -6425,26 +5153,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-ms@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" - integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== - parse-srcset@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -6475,11 +5188,6 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -6492,11 +5200,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picocolors@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" @@ -6527,24 +5230,6 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pino-std-serializers@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" - integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== - -pino@6.14.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.14.0.tgz#b745ea87a99a6c4c9b374e4f29ca7910d4c69f78" - integrity sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg== - dependencies: - fast-redact "^3.0.0" - fast-safe-stringify "^2.0.8" - flatstr "^1.0.12" - pino-std-serializers "^3.1.0" - process-warning "^1.0.0" - quick-format-unescaped "^4.0.3" - sonic-boom "^1.0.2" - pirates@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" @@ -6557,11 +5242,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkginfo@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== - please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -6636,9 +5316,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + version "6.0.12" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" + integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -6657,11 +5337,11 @@ postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: source-map "^0.6.1" postcss@^8.2.15, postcss@^8.3.11: - version "8.4.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2" - integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA== + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -6670,21 +5350,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier-bytes@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prettier-bytes/-/prettier-bytes-1.0.4.tgz#994b02aa46f699c50b6257b5faaa7fe2557e62d6" - integrity sha512-dLbWOa4xBn+qeWeIF60qRoB6Pk2jX5P3DIVgOQyMyvBpu931Q+8dXz8X0snJiFkQdohDDLnZQECjzsAj75hgZQ== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -6693,14 +5358,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.0.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -prettier@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" - integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^27.0.0, pretty-format@^27.5.1: version "27.5.1" @@ -6721,23 +5381,11 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-ms@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" - integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== - dependencies: - parse-ms "^2.1.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-warning@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" - integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== - process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -6770,24 +5418,11 @@ prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -psl@^1.1.24, psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -6801,27 +5436,10 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== querystring@0.2.0: version "0.2.0" @@ -6833,16 +5451,6 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -6850,21 +5458,6 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-loader@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" @@ -6873,16 +5466,6 @@ raw-loader@~4.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -rc@1.2.8, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-dom@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -6968,9 +5551,9 @@ read-pkg@^3.0.0: path-type "^3.0.0" readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -7011,62 +5594,43 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.4: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpp@^3.0.0, regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.1.tgz#a69c26f324c1e962e9ffd0b88b055caba8089139" - integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== - dependencies: - rc "1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + unicode-match-property-value-ecmascript "^2.1.0" regjsparser@^0.9.1: version "0.9.1" @@ -7075,32 +5639,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -request@2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -7134,26 +5672,19 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -7162,11 +5693,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - rfdc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" @@ -7186,49 +5712,23 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@~2.4.0: - version "2.4.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== - dependencies: - glob "^6.0.1" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - rxjs@^7.5.1: - version "7.5.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" - integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.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" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: +safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -7238,15 +5738,15 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-html@~2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.5.3.tgz#91aa3dc760b072cdf92f9c6973747569b1ba1cd8" - integrity sha512-DGATXd1fs/Rm287/i5FBKVYSBBUL0iAaztOA1/RFhEs4yqo39/X52i/q/CwsfCUG5cilmXSBmnQmyWfnKhBlOg== +sanitize-html@~2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.7.3.tgz#166c868444ee4f9fd7352ac8c63fa86c343fc2bd" + integrity sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw== dependencies: deepmerge "^4.2.2" escape-string-regexp "^4.0.0" @@ -7255,13 +5755,6 @@ sanitize-html@~2.5.3: parse-srcset "^1.0.2" postcss "^8.3.11" -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -7295,10 +5788,10 @@ schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.7.0: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" @@ -7314,44 +5807,18 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, 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== -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - serialize-javascript@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" @@ -7359,28 +5826,13 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -7413,9 +5865,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" - integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== side-channel@^1.0.4: version "1.0.4" @@ -7464,31 +5916,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -sonic-boom@^1.0.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" - integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== - dependencies: - atomic-sleep "^1.0.0" - flatstr "^1.0.12" - -sort-object-keys@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" - integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== - -sort-package-json@~1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.44.0.tgz#470330be868f8a524a4607b26f2a0233e93d8b6d" - integrity sha512-u9GUZvpavUCXV5SbEqXu9FRbsJrYU6WM10r3zA0gymGPufK5X82MblCLh9GW9l46pXKEZvK+FA3eVTqC4oMp4A== - dependencies: - detect-indent "^6.0.0" - detect-newline "3.1.0" - git-hooks-list "1.0.3" - globby "10.0.0" - is-plain-obj "2.1.0" - sort-object-keys "^1.1.3" - source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -7507,6 +5934,17 @@ source-map-loader@^0.2.4: async "^2.5.0" loader-utils "^1.1.0" +source-map-loader@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.0.2.tgz#b0a6582b2eaa387ede1ecf8061ae0b93c23f9eb0" + integrity sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw== + dependencies: + data-urls "^2.0.0" + iconv-lite "^0.6.2" + loader-utils "^2.0.0" + schema-utils "^2.7.0" + source-map "^0.6.1" + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -7529,9 +5967,9 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -7550,30 +5988,15 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" @@ -7582,24 +6005,12 @@ ssri@^8.0.1: minipass "^3.1.1" stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -steno@^0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" - integrity sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w== - dependencies: - graceful-fs "^4.1.3" - string-argv@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -7623,31 +6034,40 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: strip-ansi "^6.0.1" string.prototype.padend@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" - integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + version "3.1.4" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" + integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" string_decoder@~1.1.1: version "1.1.1" @@ -7699,11 +6119,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -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" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - style-loader@^0.23.1: version "0.23.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" @@ -7775,15 +6190,10 @@ svg-url-loader@~6.0.0: file-loader "~6.0.0" loader-utils "~2.0.0" -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -7802,13 +6212,13 @@ tapable@^2.1.1, tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + version "6.1.14" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.14.tgz#e87926bec1cfe7c9e783a77a79f3e81c1cfa3b66" + integrity sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -7836,21 +6246,21 @@ terser-webpack-plugin@^4.1.0: terser "^5.3.4" webpack-sources "^1.4.3" -terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.3.7: + version "5.3.7" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.16.5" -terser@^5.14.1, terser@^5.3.4: - version "5.15.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" - integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== +terser@^5.16.5, terser@^5.3.4: + version "5.17.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" + integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -7871,26 +6281,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -"through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: +through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -timers-ext@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - -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.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -7906,11 +6301,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - 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" @@ -7925,29 +6315,6 @@ to-string-loader@^1.1.6: dependencies: loader-utils "^1.0.0" -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -7985,26 +6352,21 @@ ts-loader@^6.0.4: micromatch "^4.0.0" semver "^6.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tslib@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - tsutils@^3.17.1: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -8012,23 +6374,6 @@ tsutils@^3.17.1: dependencies: tslib "^1.8.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -typanion@^3.3.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.12.1.tgz#d33deb130aba23ef6f2a3c69e7fb28148dd9089a" - integrity sha512-3SJF/czpzqq6G3lprGFLa6ps12yb1uQ1EmitNnep2fDMNh1aO/Zbq9sWY+3lem0zYb2oHJnQWyabTGUZ+L1ScQ== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -8036,13 +6381,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -8058,34 +6396,20 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" typed-styles@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typescript@~4.1.3: - version "4.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.6.tgz#1becd85d77567c3c741172339e93ce2e69932138" - integrity sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow== - typescript@~4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" @@ -8099,11 +6423,6 @@ typestyle@^2.0.4: csstype "3.0.10" free-style "3.1.0" -uglify-js@^3.1.4: - version "3.17.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.3.tgz#f0feedf019c4510f164099e8d7e72ff2d7304377" - integrity sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg== - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -8132,10 +6451,10 @@ unicode-match-property-ecmascript@^2.0.0: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" @@ -8161,30 +6480,15 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unix-crypt-td-js@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz#4912dfad1c8aeb7d20fa0a39e4c31918c1d5d5dd" - integrity sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -8205,14 +6509,7 @@ url-loader@^4.1.0, url-loader@~4.1.0: mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-parse@^1.5.3, url-parse@~1.5.1: +url-parse@~1.5.1: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -8233,25 +6530,15 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -8295,108 +6582,6 @@ validate.io-number@^1.0.3: resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== -validator@13.7.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verdaccio-audit@10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/verdaccio-audit/-/verdaccio-audit-10.2.2.tgz#254380e57932fda64b45cb739e9c42cc9fb2dfdf" - integrity sha512-f2uZlKD7vi0yEB0wN8WOf+eA/3SCyKD9cvK17Hh7Wm8f/bl7k1B3hHOTtUCn/yu85DGsj2pcNzrAfp2wMVgz9Q== - dependencies: - body-parser "1.20.0" - express "4.18.1" - https-proxy-agent "5.0.1" - node-fetch "2.6.7" - -verdaccio-htpasswd@10.5.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/verdaccio-htpasswd/-/verdaccio-htpasswd-10.5.0.tgz#de9ea2967856af765178b08485dc8e83f544a12c" - integrity sha512-olBsT3uy1TT2ZqmMCJUsMHrztJzoEpa8pxxvYrDZdWnEksl6mHV10lTeLbH9BUwbEheOeKkkdsERqUOs+if0jg== - dependencies: - "@verdaccio/file-locking" "10.3.0" - apache-md5 "1.1.7" - bcryptjs "2.4.3" - http-errors "2.0.0" - unix-crypt-td-js "1.1.4" - -verdaccio@^5.13.3: - version "5.15.4" - resolved "https://registry.yarnpkg.com/verdaccio/-/verdaccio-5.15.4.tgz#23b2b97b33b14ca30a6fc18b1226a1f082f7e476" - integrity sha512-yYMqpEQCv/BfYW5K/Nq57dbx68ICP1GfK7RJ0A3SlhKgl6idT8x4cJyLjH7C4k1Tln3LIQk1/X6ZtSl7xhzwOg== - dependencies: - "@verdaccio/commons-api" "10.2.0" - "@verdaccio/local-storage" "10.3.1" - "@verdaccio/readme" "10.4.1" - "@verdaccio/streams" "10.2.0" - "@verdaccio/ui-theme" "6.0.0-6-next.48" - JSONStream "1.3.5" - async "3.2.4" - body-parser "1.20.0" - clipanion "3.1.0" - compression "1.7.4" - cookies "0.8.0" - cors "2.8.5" - dayjs "1.11.5" - debug "^4.3.3" - envinfo "7.8.1" - eslint-import-resolver-node "0.3.6" - express "4.18.1" - express-rate-limit "5.5.1" - fast-safe-stringify "2.1.1" - handlebars "4.7.7" - http-errors "2.0.0" - js-yaml "4.1.0" - jsonwebtoken "8.5.1" - kleur "4.1.5" - lodash "4.17.21" - lru-cache "7.14.0" - lunr-mutable-indexes "2.3.2" - marked "4.1.0" - memoizee "0.4.15" - mime "3.0.0" - minimatch "5.1.0" - mkdirp "1.0.4" - mv "2.1.1" - pino "6.14.0" - pkginfo "0.4.1" - prettier-bytes "^1.0.4" - pretty-ms "^7.0.1" - request "2.88.0" - semver "7.3.7" - validator "13.7.0" - verdaccio-audit "10.2.2" - verdaccio-htpasswd "10.5.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -8424,11 +6609,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - webidl-conversions@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" @@ -8474,21 +6654,21 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5, webpack@^5.41.1: - version "5.74.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" - integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== + version "5.81.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.81.0.tgz#27a2e8466c8b4820d800a8d90f06ef98294f9956" + integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.13.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -8497,19 +6677,12 @@ webpack@^5, webpack@^5.41.1: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.1.2" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" @@ -8523,7 +6696,7 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: +whatwg-url@^8.0.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== @@ -8543,6 +6716,18 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -8558,20 +6743,15 @@ which@^2.0.1: isexe "^2.0.0" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@^1.2.3, word-wrap@~1.2.3: +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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - worker-loader@^3.0.2: version "3.0.8" resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-3.0.8.tgz#5fc5cda4a3d3163d9c274a4e3a811ce8b60dbb37" @@ -8616,21 +6796,16 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -8641,15 +6816,15 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^21.0.0, yargs-parser@^21.0.1: +yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1: - version "17.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.0.tgz#e134900fc1f218bc230192bdec06a0a5f973e46c" - integrity sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -8657,7 +6832,7 @@ yargs@^17.3.1: require-directory "^2.1.1" string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^21.0.0" + yargs-parser "^21.1.1" yocto-queue@^0.1.0: version "0.1.0" From 0feabd4f8168680a5b9d6899cdb1effef4cf3e28 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 08:56:22 -0400 Subject: [PATCH 021/250] lint fixes --- .eslintrc.js | 10 ++- js/dcefwidget.ts | 196 +++++++++++++++++++++++++--------------------- js/paddywidget.ts | 22 +++--- js/plugin.ts | 7 +- package.json | 2 +- 5 files changed, 129 insertions(+), 108 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 522584608..5616e6e25 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,7 +10,9 @@ module.exports = { project: "tsconfig.json", sourceType: 'module' }, - plugins: ['@typescript-eslint'], + plugins: ['@typescript-eslint', + 'prettier' + ], rules: { '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }], '@typescript-eslint/no-explicit-any': 'off', @@ -24,5 +26,9 @@ module.exports = { curly: ['error', 'all'], eqeqeq: 'error', 'prefer-arrow-callback': 'error' - } + }, + "ignorePatterns": [ + "webpack.config.ts", + "jest.config.js" + ] }; diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 561a78ba0..2ec157e7f 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -7,13 +7,19 @@ import { ISerializers, } from '@jupyter-widgets/base'; - import _ from 'lodash'; -import {WidgetDCFCell, CommandConfigT, DFWhole, CommandConfigSetterT, Operation, DependentTabs } from 'paddy-react-edit-list'; +import { + WidgetDCFCell, + CommandConfigT, + DFWhole, + CommandConfigSetterT, + Operation, + DependentTabs, +} from 'paddy-react-edit-list'; //import { createRoot } from "react-dom/client"; -import React, {useEffect, useState} from "react"; +import React, { useEffect, useState } from 'react'; //import * as ReactDOM from 'react-dom'; import * as ReactDOMClient from 'react-dom/client'; import { MODULE_NAME, MODULE_VERSION } from './version'; @@ -25,111 +31,121 @@ import 'ag-grid-community/styles/ag-theme-alpine.css'; import 'paddy-react-edit-list/css/dcf-npm.css'; import '../style/widget.css'; - export class DCEFWidgetModel extends DOMWidgetModel { - defaults() { - return { - ...super.defaults(), - _model_name: DCEFWidgetModel.model_name, - _model_module: DCEFWidgetModel.model_module, - _model_module_version: DCEFWidgetModel.model_module_version, - _view_name: DCEFWidgetModel.view_name, - _view_module: DCEFWidgetModel.view_module, - _view_module_version: DCEFWidgetModel.view_module_version, - //add typing from OperationUtils - commandConfig: {} as CommandConfigT, - operations: [] as Operation[], - operation_results: {}, // {transformed_df:DFWhole, generated_py_code:string} - dfConfig: {} // provided on df ingest - }; - } - - - static serializers: ISerializers = { - ...DOMWidgetModel.serializers, - // Add any extra serializers here + defaults() { + return { + ...super.defaults(), + _model_name: DCEFWidgetModel.model_name, + _model_module: DCEFWidgetModel.model_module, + _model_module_version: DCEFWidgetModel.model_module_version, + _view_name: DCEFWidgetModel.view_name, + _view_module: DCEFWidgetModel.view_module, + _view_module_version: DCEFWidgetModel.view_module_version, + //add typing from OperationUtils + commandConfig: {} as CommandConfigT, + operations: [] as Operation[], + operation_results: {}, // {transformed_df:DFWhole, generated_py_code:string} + dfConfig: {}, // provided on df ingest }; - - static model_name = 'DCEFWidgetModel'; - static model_module = MODULE_NAME; - static model_module_version = MODULE_VERSION; - static view_name = 'ExampleView'; // Set to null if no view - static view_module = MODULE_NAME; // Set to null if no view - static view_module_version = MODULE_VERSION; + } + + static serializers: ISerializers = { + ...DOMWidgetModel.serializers, + // Add any extra serializers here + }; + + static model_name = 'DCEFWidgetModel'; + static model_module = MODULE_NAME; + static model_module_version = MODULE_VERSION; + static view_name = 'ExampleView'; // Set to null if no view + static view_module = MODULE_NAME; // Set to null if no view + static view_module_version = MODULE_VERSION; } export class DCEFWidgetView extends DOMWidgetView { - - setCommandConfig = (conf:CommandConfigT) => console.log("default setCommandConfig") - setPyCode = (newPyCode:string) => console.log("default setPyCode") - setTransformedDf = (newDf:DFWhole) => console.log("default setTransformedDf") - render() { - this.el.classList.add('custom-widget'); - - const widgetModel = this.model - const widget = this - const widgetGetOrRequester:DependentTabs.getOperationResultSetterT = (setOpResult) => { - widgetModel.on('change:operation_results', () => { - const opResults:DependentTabs.OperationResult = widgetModel.get('operation_results') - console.log("about to call setOpResult with", opResults) - setOpResult(opResults) - }, this) - - const retFunc = (passedOperations:Operation[]) => { - console.log("orRequester passed operations", passedOperations) - widgetModel.set('operations', passedOperations) - widgetModel.save_changes() - } - return retFunc - }; - - // these following lines probably aren't necessary given the - // ipyReact integration to the end of plumbCommandConfig - widgetModel.on( - 'change:commandConfig', - () => { - widget.setCommandConfig(widgetModel.get('commandConfig'))}, - this) - - const plumbCommandConfig:CommandConfigSetterT = (setter) => { - widget.setCommandConfig = setter - } - - const outerProps = { - //origDf:widgetModel.get('js_df'), - getOrRequester:widgetGetOrRequester, - exposeCommandConfigSetter:plumbCommandConfig, + setCommandConfig = (conf: CommandConfigT) => + console.log('default setCommandConfig'); + setPyCode = (newPyCode: string) => console.log('default setPyCode'); + setTransformedDf = (newDf: DFWhole) => + console.log('default setTransformedDf'); + render() { + this.el.classList.add('custom-widget'); + + const widgetModel = this.model; + const widget = this; + const widgetGetOrRequester: DependentTabs.getOperationResultSetterT = ( + setOpResult + ) => { + widgetModel.on( + 'change:operation_results', + () => { + const opResults: DependentTabs.OperationResult = + widgetModel.get('operation_results'); + console.log('about to call setOpResult with', opResults); + setOpResult(opResults); + }, + this + ); + + const retFunc = (passedOperations: Operation[]) => { + console.log('orRequester passed operations', passedOperations); + widgetModel.set('operations', passedOperations); + widgetModel.save_changes(); }; + return retFunc; + }; + + // these following lines probably aren't necessary given the + // ipyReact integration to the end of plumbCommandConfig + widgetModel.on( + 'change:commandConfig', + () => { + widget.setCommandConfig(widgetModel.get('commandConfig')); + }, + this + ); + + const plumbCommandConfig: CommandConfigSetterT = (setter) => { + widget.setCommandConfig = setter; + }; + + const outerProps = { + //origDf:widgetModel.get('js_df'), + getOrRequester: widgetGetOrRequester, + exposeCommandConfigSetter: plumbCommandConfig, + }; - const Component = () => { + const Component = () => { // @ts-ignore const [_, setCounter] = useState(0); const forceRerender = () => { - setCounter((x:number) => x + 1); - } + setCounter((x: number) => x + 1); + }; useEffect(() => { this.listenTo(this.model, 'change', forceRerender); }, []); - const props : any = {...outerProps} + const props: any = { ...outerProps }; for (const key of Object.keys(this.model.attributes)) { props[key] = this.model.get(key); - props["on_" + key] = (value: any) => { + props['on_' + key] = (value: any) => { this.model.set(key, value); this.touch(); }; } - return React.createElement(WidgetDCFCell, props) - } - //console.log("widget el", this.el) - const notebookEl = document.getElementsByClassName("jp-NotebookPanel-notebook")[0] - const elTop = this.el.getBoundingClientRect()['y'] - const notebookTop = notebookEl.getBoundingClientRect()['y'] - const scrollOffset = (notebookTop - elTop) + 50; - //console.log("scrollOffset", scrollOffset); - notebookEl.scroll(0, scrollOffset) - const root = ReactDOMClient.createRoot(this.el); - const componentEl = React.createElement(Component, {}); - root.render(componentEl) - } + return React.createElement(WidgetDCFCell, props); + }; + //console.log("widget el", this.el) + const notebookEl = document.getElementsByClassName( + 'jp-NotebookPanel-notebook' + )[0]; + const elTop = this.el.getBoundingClientRect()['y']; + const notebookTop = notebookEl.getBoundingClientRect()['y']; + const scrollOffset = notebookTop - elTop + 50; + //console.log("scrollOffset", scrollOffset); + notebookEl.scroll(0, scrollOffset); + const root = ReactDOMClient.createRoot(this.el); + const componentEl = React.createElement(Component, {}); + root.render(componentEl); + } } diff --git a/js/paddywidget.ts b/js/paddywidget.ts index d59379166..5ba95cd6a 100644 --- a/js/paddywidget.ts +++ b/js/paddywidget.ts @@ -9,16 +9,14 @@ import { import { MODULE_NAME, MODULE_VERSION } from './version'; +import { createRoot } from 'react-dom/client'; +import React from 'react'; -import { createRoot } from "react-dom/client"; -import React from "react"; - -function ExampleComponent(props:any) { +function ExampleComponent(props: any) { return React.createElement('h1', null, `Hello ${props.name}`); } - -console.log("paddy model module level"); +console.log('paddy model module level'); //export const localModuleName = "PaddyModule" export class PaddyModel extends DOMWidgetModel { @@ -50,15 +48,17 @@ export class PaddyModel extends DOMWidgetModel { export class PaddyView extends DOMWidgetView { render() { - console.log("paddy 5555735") + console.log('paddy 5555735'); this.el.classList.add('custom-widget'); this.value_changed(); try { - const root = createRoot(this.el as HTMLElement) - root.render(React.createElement(ExampleComponent, { name: "Paddy" }, null)); - console.log("react calls worked fine") + const root = createRoot(this.el as HTMLElement); + root.render( + React.createElement(ExampleComponent, { name: 'Paddy' }, null) + ); + console.log('react calls worked fine'); } catch (e) { - console.log("error instatiating React components", e) + console.log('error instatiating React components', e); } this.model.on('change:value', this.value_changed, this); } diff --git a/js/plugin.ts b/js/plugin.ts index a642b48d2..8114ff97e 100644 --- a/js/plugin.ts +++ b/js/plugin.ts @@ -9,7 +9,6 @@ import { IJupyterWidgetRegistry } from '@jupyter-widgets/base'; import { IThemeManager } from '@jupyterlab/apputils'; - import { MODULE_NAME, MODULE_VERSION } from './version'; import * as dcefwidget from './dcefwidget'; @@ -35,15 +34,15 @@ export default datagridPlugin; function activateWidgetExtension( app: Application, registry: IJupyterWidgetRegistry, - themeManager: IThemeManager | null, + themeManager: IThemeManager | null ): void { - console.log("dcef_widget plugin.ts after change EXTENSION_ID") + console.log('dcef_widget plugin.ts after change EXTENSION_ID'); // Exporting a patched DataGridView widget which handles dynamic theme changes registry.registerWidget({ name: MODULE_NAME, version: MODULE_VERSION, exports: { - ...dcefwidget + ...dcefwidget, }, }); } diff --git a/package.json b/package.json index 8100edf53..91ec6c1b3 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "clean:labextension": "rimraf dcef/labextension", "clean:nbextension": "rimraf dcef/nbextension/index.*", "lint": "eslint 'js/**/*.{ts,tsx}'", - "lint:fix": "eslint 'js/**/*.{ts,tsx} --fix'", + "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", "prepack": "yarn run build:labextension && yarn run build:nbextension", "test": "jest --verbose", "watch": "npm-run-all -p watch:*", From 5a7dbcc4285c639bf32925c2dfc642ed9b40fd52 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 09:17:53 -0400 Subject: [PATCH 022/250] a bunch of lint fixes --- .eslintrc.js | 2 ++ js/dcefwidget.ts | 10 +------ js/paddywidget.ts | 69 ----------------------------------------------- 3 files changed, 3 insertions(+), 78 deletions(-) delete mode 100644 js/paddywidget.ts diff --git a/.eslintrc.js b/.eslintrc.js index 5616e6e25..9e6f0ad37 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,6 +18,8 @@ module.exports = { '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-namespace': 'off', '@typescript-eslint/no-use-before-define': 'off', + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/explicit-function-return-type": "off", '@typescript-eslint/quotes': [ 'error', 'single', diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 2ec157e7f..8cd2411f9 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -7,12 +7,9 @@ import { ISerializers, } from '@jupyter-widgets/base'; -import _ from 'lodash'; - import { WidgetDCFCell, CommandConfigT, - DFWhole, CommandConfigSetterT, Operation, DependentTabs, @@ -63,12 +60,7 @@ export class DCEFWidgetModel extends DOMWidgetModel { } export class DCEFWidgetView extends DOMWidgetView { - setCommandConfig = (conf: CommandConfigT) => - console.log('default setCommandConfig'); - setPyCode = (newPyCode: string) => console.log('default setPyCode'); - setTransformedDf = (newDf: DFWhole) => - console.log('default setTransformedDf'); - render() { + render(): void { this.el.classList.add('custom-widget'); const widgetModel = this.model; diff --git a/js/paddywidget.ts b/js/paddywidget.ts deleted file mode 100644 index 5ba95cd6a..000000000 --- a/js/paddywidget.ts +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) Paddy Mullen -// Distributed under the terms of the Modified BSD License. - -import { - DOMWidgetModel, - DOMWidgetView, - ISerializers, -} from '@jupyter-widgets/base'; - -import { MODULE_NAME, MODULE_VERSION } from './version'; - -import { createRoot } from 'react-dom/client'; -import React from 'react'; - -function ExampleComponent(props: any) { - return React.createElement('h1', null, `Hello ${props.name}`); -} - -console.log('paddy model module level'); - -//export const localModuleName = "PaddyModule" -export class PaddyModel extends DOMWidgetModel { - defaults() { - return { - ...super.defaults(), - _model_name: PaddyModel.model_name, - _model_module: PaddyModel.model_module, - _model_module_version: PaddyModel.model_module_version, - _view_name: PaddyModel.view_name, - _view_module: PaddyModel.view_module, - _view_module_version: PaddyModel.view_module_version, - value: 'Paddy Model', - }; - } - - static serializers: ISerializers = { - ...DOMWidgetModel.serializers, - // Add any extra serializers here - }; - - static model_name = 'PaddyModel'; - static model_module = MODULE_NAME; //localModuleName - static model_module_version = MODULE_VERSION; - static view_name = 'PaddyView'; // Set to null if no view - static view_module = MODULE_NAME; // Set to null if no view - static view_module_version = MODULE_VERSION; -} - -export class PaddyView extends DOMWidgetView { - render() { - console.log('paddy 5555735'); - this.el.classList.add('custom-widget'); - this.value_changed(); - try { - const root = createRoot(this.el as HTMLElement); - root.render( - React.createElement(ExampleComponent, { name: 'Paddy' }, null) - ); - console.log('react calls worked fine'); - } catch (e) { - console.log('error instatiating React components', e); - } - this.model.on('change:value', this.value_changed, this); - } - - value_changed() { - //this.el.textContent = this.model.get('value') + "from_Paddy view render"; - } -} From 3ef051c0610132f47d83ef7dd7fd1ebd134fa53b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 09:22:16 -0400 Subject: [PATCH 023/250] more lint and build fixes --- .../_static/embed-bundle.js.LICENSE.txt | 4 +- js/dcefwidget.ts | 49 +------------------ 2 files changed, 3 insertions(+), 50 deletions(-) diff --git a/docs/source/_static/embed-bundle.js.LICENSE.txt b/docs/source/_static/embed-bundle.js.LICENSE.txt index 73838b328..554109d98 100644 --- a/docs/source/_static/embed-bundle.js.LICENSE.txt +++ b/docs/source/_static/embed-bundle.js.LICENSE.txt @@ -1,12 +1,12 @@ /** - * @ag-grid-community/all-modules - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue * @version v29.2.0 + * @ag-grid-community/all-modules - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue * @version v29.3.3 * @link https://www.ag-grid.com/ * @license MIT */ /** * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue - * @version v29.2.0 + * @version v29.3.3 * @link https://www.ag-grid.com/ * @license MIT */ diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 8cd2411f9..17d4bb7e3 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -10,9 +10,7 @@ import { import { WidgetDCFCell, CommandConfigT, - CommandConfigSetterT, Operation, - DependentTabs, } from 'paddy-react-edit-list'; //import { createRoot } from "react-dom/client"; @@ -63,52 +61,7 @@ export class DCEFWidgetView extends DOMWidgetView { render(): void { this.el.classList.add('custom-widget'); - const widgetModel = this.model; - const widget = this; - const widgetGetOrRequester: DependentTabs.getOperationResultSetterT = ( - setOpResult - ) => { - widgetModel.on( - 'change:operation_results', - () => { - const opResults: DependentTabs.OperationResult = - widgetModel.get('operation_results'); - console.log('about to call setOpResult with', opResults); - setOpResult(opResults); - }, - this - ); - - const retFunc = (passedOperations: Operation[]) => { - console.log('orRequester passed operations', passedOperations); - widgetModel.set('operations', passedOperations); - widgetModel.save_changes(); - }; - return retFunc; - }; - - // these following lines probably aren't necessary given the - // ipyReact integration to the end of plumbCommandConfig - widgetModel.on( - 'change:commandConfig', - () => { - widget.setCommandConfig(widgetModel.get('commandConfig')); - }, - this - ); - - const plumbCommandConfig: CommandConfigSetterT = (setter) => { - widget.setCommandConfig = setter; - }; - - const outerProps = { - //origDf:widgetModel.get('js_df'), - getOrRequester: widgetGetOrRequester, - exposeCommandConfigSetter: plumbCommandConfig, - }; - const Component = () => { - // @ts-ignore const [_, setCounter] = useState(0); const forceRerender = () => { setCounter((x: number) => x + 1); @@ -117,7 +70,7 @@ export class DCEFWidgetView extends DOMWidgetView { this.listenTo(this.model, 'change', forceRerender); }, []); - const props: any = { ...outerProps }; + const props: any = {}; for (const key of Object.keys(this.model.attributes)) { props[key] = this.model.get(key); props['on_' + key] = (value: any) => { From 8e939e681432ac32c3164c635f7ef4dcdf4cbf4c Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 10:32:50 -0400 Subject: [PATCH 024/250] lint passes now --- introduction.ipynb | 81 ++++++---------------------------------------- js/dcefwidget.ts | 5 ++- js/version.ts | 2 +- 3 files changed, 12 insertions(+), 76 deletions(-) diff --git a/introduction.ipynb b/introduction.ipynb index bc4c8c6d0..f0da31b07 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -12,25 +12,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "25995cddd7674d3a8cb6f085cbc2c093", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "DCEFWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'fillna': …" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = DCEFWidget(df)\n", @@ -39,54 +23,18 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['schema', 'data'])" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "w.operation_results['transformed_df'].keys()" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['index',\n", - " 'tripduration',\n", - " 'stoptime',\n", - " 'start station id',\n", - " 'start station name',\n", - " 'start station latitude',\n", - " 'start station longitude',\n", - " 'end station id',\n", - " 'end station name',\n", - " 'end station latitude',\n", - " 'end station longitude',\n", - " 'bikeid',\n", - " 'usertype',\n", - " 'birth year',\n", - " 'gender']" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "w.operation_results['transformed_df']['schema']['fields']\n", "tdf = w.operation_results['transformed_df']\n", @@ -96,20 +44,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "'stoptime' in fnames " ] diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 17d4bb7e3..2da2ea498 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -12,10 +12,9 @@ import { CommandConfigT, Operation, } from 'paddy-react-edit-list'; +import * as Backbone from 'backbone'; -//import { createRoot } from "react-dom/client"; import React, { useEffect, useState } from 'react'; -//import * as ReactDOM from 'react-dom'; import * as ReactDOMClient from 'react-dom/client'; import { MODULE_NAME, MODULE_VERSION } from './version'; @@ -27,7 +26,7 @@ import 'paddy-react-edit-list/css/dcf-npm.css'; import '../style/widget.css'; export class DCEFWidgetModel extends DOMWidgetModel { - defaults() { + defaults(): Backbone.ObjectHash { return { ...super.defaults(), _model_name: DCEFWidgetModel.model_name, diff --git a/js/version.ts b/js/version.ts index fb199c96d..dd1aa6c0d 100644 --- a/js/version.ts +++ b/js/version.ts @@ -1,7 +1,7 @@ // Copyright (c) Bloomberg // Distributed under the terms of the Modified BSD License. -const data = require('../package.json'); +import * as data from '../package.json'; /** * The _model_module_version/_view_module_version this package implements. From fd2b827510a8ed19c1e3d3e7107457e923495885 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 17:14:31 -0400 Subject: [PATCH 025/250] renamed python side of dcef to buckaroo --- {dcef => buckaroo}/__init__.py | 0 {dcef => buckaroo}/_frontend.py | 0 {dcef => buckaroo}/_version.py | 0 {dcef => buckaroo}/all_transforms.py | 4 ++-- dcef/dcef_widget.py => buckaroo/buckaroo_widget.py | 10 +++++----- {dcef => buckaroo}/channeldata.json | 0 {dcef => buckaroo}/configure_utils.py | 12 ++++++------ {dcef => buckaroo}/dcf_transform.py | 0 {dcef => buckaroo}/df_methods.py | 0 {dcef => buckaroo}/index.html | 0 {dcef => buckaroo}/lispy.py | 0 {dcef => buckaroo}/nbextension/extension.js | 0 {dcef => buckaroo}/noarch/current_repodata.json | 0 {dcef => buckaroo}/noarch/current_repodata.json.bz2 | Bin {dcef => buckaroo}/noarch/index.html | 0 {dcef => buckaroo}/noarch/repodata.json | 0 {dcef => buckaroo}/noarch/repodata.json.bz2 | Bin .../noarch/repodata_from_packages.json | 0 .../noarch/repodata_from_packages.json.bz2 | Bin {dcef => buckaroo}/summary_stats.py | 0 {dcef => buckaroo}/views.py | 0 tests/basic_widget_test.py | 6 +++--- 22 files changed, 16 insertions(+), 16 deletions(-) rename {dcef => buckaroo}/__init__.py (100%) rename {dcef => buckaroo}/_frontend.py (100%) rename {dcef => buckaroo}/_version.py (100%) rename {dcef => buckaroo}/all_transforms.py (96%) rename dcef/dcef_widget.py => buckaroo/buckaroo_widget.py (91%) rename {dcef => buckaroo}/channeldata.json (100%) rename {dcef => buckaroo}/configure_utils.py (79%) rename {dcef => buckaroo}/dcf_transform.py (100%) rename {dcef => buckaroo}/df_methods.py (100%) rename {dcef => buckaroo}/index.html (100%) rename {dcef => buckaroo}/lispy.py (100%) rename {dcef => buckaroo}/nbextension/extension.js (100%) rename {dcef => buckaroo}/noarch/current_repodata.json (100%) rename {dcef => buckaroo}/noarch/current_repodata.json.bz2 (100%) rename {dcef => buckaroo}/noarch/index.html (100%) rename {dcef => buckaroo}/noarch/repodata.json (100%) rename {dcef => buckaroo}/noarch/repodata.json.bz2 (100%) rename {dcef => buckaroo}/noarch/repodata_from_packages.json (100%) rename {dcef => buckaroo}/noarch/repodata_from_packages.json.bz2 (100%) rename {dcef => buckaroo}/summary_stats.py (100%) rename {dcef => buckaroo}/views.py (100%) diff --git a/dcef/__init__.py b/buckaroo/__init__.py similarity index 100% rename from dcef/__init__.py rename to buckaroo/__init__.py diff --git a/dcef/_frontend.py b/buckaroo/_frontend.py similarity index 100% rename from dcef/_frontend.py rename to buckaroo/_frontend.py diff --git a/dcef/_version.py b/buckaroo/_version.py similarity index 100% rename from dcef/_version.py rename to buckaroo/_version.py diff --git a/dcef/all_transforms.py b/buckaroo/all_transforms.py similarity index 96% rename from dcef/all_transforms.py rename to buckaroo/all_transforms.py index 7d130c616..eff7a4dcd 100644 --- a/dcef/all_transforms.py +++ b/buckaroo/all_transforms.py @@ -1,5 +1,5 @@ from .lispy import s -from .configure_utils import configure_dcef +from .configure_utils import configure_buckaroo import pandas as pd import numpy as np @@ -155,5 +155,5 @@ def transform_to_py(df, col): " df.index = old_col.values"]) DefaultCommandKlsList = [DropCol, to_datetime, SafeInt, FillNA, reindex, OneHot, GroupBy] -command_defaults, command_patterns, dcef_transform, dcef_to_py_core = configure_dcef(DefaultCommandKlsList) +command_defaults, command_patterns, buckaroo_transform, buckaroo_to_py_core = configure_buckaroo(DefaultCommandKlsList) diff --git a/dcef/dcef_widget.py b/buckaroo/buckaroo_widget.py similarity index 91% rename from dcef/dcef_widget.py rename to buckaroo/buckaroo_widget.py index 7ca36280d..f8470e5ab 100644 --- a/dcef/dcef_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -11,12 +11,12 @@ from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe from ._frontend import module_name, module_version -from .all_transforms import configure_dcef, DefaultCommandKlsList +from .all_transforms import configure_buckaroo, DefaultCommandKlsList from .summary_stats import summarize_df import json -class DCEFWidget(DOMWidget): +class BuckarooWidget(DOMWidget): """TODO: Add docstring here """ _model_name = Unicode('DCEFWidgetModel').tag(sync=True) @@ -106,10 +106,10 @@ def interpret_operations(self, change): print('exiting early') return - transformed_df = self.dcef_transform(operations, self.df) + transformed_df = self.buckaroo_transform(operations, self.df) results['transformed_df'] = json.loads(transformed_df.to_json(orient='table', indent=2)) - results['generated_py_code'] = self.dcef_to_py_core(operations[1:]) + results['generated_py_code'] = self.buckaroo_to_py_core(operations[1:]) self.operation_results = results print("operations_results", results.keys()) except Exception as e: @@ -118,7 +118,7 @@ def interpret_operations(self, change): raise def setup_from_command_kls_list(self): - command_defaults, command_patterns, self.dcef_transform, self.dcef_to_py_core = configure_dcef( + command_defaults, command_patterns, self.buckaroo_transform, self.buckaroo_to_py_core = configure_buckaroo( self.command_classes) self.commandConfig = dict( argspecs=command_patterns, defaultArgs=command_defaults) diff --git a/dcef/channeldata.json b/buckaroo/channeldata.json similarity index 100% rename from dcef/channeldata.json rename to buckaroo/channeldata.json diff --git a/dcef/configure_utils.py b/buckaroo/configure_utils.py similarity index 79% rename from dcef/configure_utils.py rename to buckaroo/configure_utils.py index 1e730c091..219874db8 100644 --- a/dcef/configure_utils.py +++ b/buckaroo/configure_utils.py @@ -1,5 +1,5 @@ from .lispy import make_interpreter -def configure_dcef(transforms): +def configure_buckaroo(transforms): command_defaults = {} command_patterns = {} @@ -13,15 +13,15 @@ def configure_dcef(transforms): transform_lisp_primitives[transform_name] = T.transform to_py_lisp_primitives[transform_name] = T.transform_to_py - dcef_eval, raw_parse = make_interpreter(transform_lisp_primitives) - def dcef_transform(instructions, df): + buckaroo_eval, raw_parse = make_interpreter(transform_lisp_primitives) + def buckaroo_transform(instructions, df): df_copy = df.copy() - ret_val = dcef_eval(instructions, {'df':df_copy}) + ret_val = buckaroo_eval(instructions, {'df':df_copy}) #print(ret_val) return ret_val convert_to_python, __unused = make_interpreter(to_py_lisp_primitives) - def dcef_to_py(instructions): + def buckaroo_to_py(instructions): #I would prefer to implement this with a macro named something #like 'clean' that is implemented for the _convert_to_python #interpreter to return a string code block, and for the real DCF @@ -32,4 +32,4 @@ def dcef_to_py(instructions): code_block = '\n'.join(individual_instructions) return "def clean(df):\n" + code_block + "\n return df" - return command_defaults, command_patterns, dcef_transform, dcef_to_py + return command_defaults, command_patterns, buckaroo_transform, buckaroo_to_py diff --git a/dcef/dcf_transform.py b/buckaroo/dcf_transform.py similarity index 100% rename from dcef/dcf_transform.py rename to buckaroo/dcf_transform.py diff --git a/dcef/df_methods.py b/buckaroo/df_methods.py similarity index 100% rename from dcef/df_methods.py rename to buckaroo/df_methods.py diff --git a/dcef/index.html b/buckaroo/index.html similarity index 100% rename from dcef/index.html rename to buckaroo/index.html diff --git a/dcef/lispy.py b/buckaroo/lispy.py similarity index 100% rename from dcef/lispy.py rename to buckaroo/lispy.py diff --git a/dcef/nbextension/extension.js b/buckaroo/nbextension/extension.js similarity index 100% rename from dcef/nbextension/extension.js rename to buckaroo/nbextension/extension.js diff --git a/dcef/noarch/current_repodata.json b/buckaroo/noarch/current_repodata.json similarity index 100% rename from dcef/noarch/current_repodata.json rename to buckaroo/noarch/current_repodata.json diff --git a/dcef/noarch/current_repodata.json.bz2 b/buckaroo/noarch/current_repodata.json.bz2 similarity index 100% rename from dcef/noarch/current_repodata.json.bz2 rename to buckaroo/noarch/current_repodata.json.bz2 diff --git a/dcef/noarch/index.html b/buckaroo/noarch/index.html similarity index 100% rename from dcef/noarch/index.html rename to buckaroo/noarch/index.html diff --git a/dcef/noarch/repodata.json b/buckaroo/noarch/repodata.json similarity index 100% rename from dcef/noarch/repodata.json rename to buckaroo/noarch/repodata.json diff --git a/dcef/noarch/repodata.json.bz2 b/buckaroo/noarch/repodata.json.bz2 similarity index 100% rename from dcef/noarch/repodata.json.bz2 rename to buckaroo/noarch/repodata.json.bz2 diff --git a/dcef/noarch/repodata_from_packages.json b/buckaroo/noarch/repodata_from_packages.json similarity index 100% rename from dcef/noarch/repodata_from_packages.json rename to buckaroo/noarch/repodata_from_packages.json diff --git a/dcef/noarch/repodata_from_packages.json.bz2 b/buckaroo/noarch/repodata_from_packages.json.bz2 similarity index 100% rename from dcef/noarch/repodata_from_packages.json.bz2 rename to buckaroo/noarch/repodata_from_packages.json.bz2 diff --git a/dcef/summary_stats.py b/buckaroo/summary_stats.py similarity index 100% rename from dcef/summary_stats.py rename to buckaroo/summary_stats.py diff --git a/dcef/views.py b/buckaroo/views.py similarity index 100% rename from dcef/views.py rename to buckaroo/views.py diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index efe2ac8e3..4d9b3a393 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -1,15 +1,15 @@ import pandas as pd -from dcef.dcef_widget import DCEFWidget +from buckaroo.buckaroo_widget import BuckarooWidget def test_basic_instantiation(): df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') - w = DCEFWidget(df) + w = BuckarooWidget(df) assert w.dfConfig['totalRows'] == 499 def test_interpreter(): df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') - w = DCEFWidget(df) + w = BuckarooWidget(df) assert w.operation_results['generated_py_code'] == '#from py widget init' w.operations = [[{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] From c980ae2b0b832d6a28c4e7e7f30435955b0184fa Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 3 May 2023 20:42:43 -0400 Subject: [PATCH 026/250] WIP --- .coveragerc | 2 +- dcef.json => buckaroo.json | 2 +- buckaroo/_frontend.py | 2 +- js/plugin.ts | 4 ++-- package.json | 14 +++++++------- pyproject.toml | 22 +++++++++++----------- webpack.config.js | 10 +++++----- 7 files changed, 28 insertions(+), 28 deletions(-) rename dcef.json => buckaroo.json (50%) diff --git a/.coveragerc b/.coveragerc index 0a40787fb..423e15976 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,2 +1,2 @@ [run] -omit = dcef/tests/* +omit = buckaroo/tests/* diff --git a/dcef.json b/buckaroo.json similarity index 50% rename from dcef.json rename to buckaroo.json index 46cfd9708..df2cf9062 100644 --- a/dcef.json +++ b/buckaroo.json @@ -1,5 +1,5 @@ { "load_extensions": { - "dcef/extension": true + "buckaroo/extension": true } } diff --git a/buckaroo/_frontend.py b/buckaroo/_frontend.py index 8d3c09034..5ed8a32ff 100644 --- a/buckaroo/_frontend.py +++ b/buckaroo/_frontend.py @@ -7,5 +7,5 @@ from ._version import __version__ -module_name = "dcef" +module_name = "buckaroo" module_version = f"^{__version__}" diff --git a/js/plugin.ts b/js/plugin.ts index 8114ff97e..f95e79c51 100644 --- a/js/plugin.ts +++ b/js/plugin.ts @@ -12,7 +12,7 @@ import { IThemeManager } from '@jupyterlab/apputils'; import { MODULE_NAME, MODULE_VERSION } from './version'; import * as dcefwidget from './dcefwidget'; -const EXTENSION_ID = 'dcef:plugin'; +const EXTENSION_ID = 'buckaroo:plugin'; /** * The datagrid plugin. @@ -36,7 +36,7 @@ function activateWidgetExtension( registry: IJupyterWidgetRegistry, themeManager: IThemeManager | null ): void { - console.log('dcef_widget plugin.ts after change EXTENSION_ID'); + console.log('buckaroo_widget plugin.ts after change EXTENSION_ID'); // Exporting a patched DataGridView widget which handles dynamic theme changes registry.registerWidget({ name: MODULE_NAME, diff --git a/package.json b/package.json index 91ec6c1b3..f14d00f04 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "dcef", + "name": "buckaroo", "version": "0.2.1", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ @@ -17,9 +17,9 @@ "dist/*.png", "style/**/*.*" ], - "homepage": "https://github.com/paddymul/dcef", + "homepage": "https://github.com/paddymul/buckaroo", "bugs": { - "url": "https://github.com/paddymul/dcef/issues" + "url": "https://github.com/paddymul/buckaroo/issues" }, "license": "BSD-3-Clause", "author": { @@ -30,7 +30,7 @@ "types": "./lib/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/paddymul/dcef" + "url": "https://github.com/paddymul/buckaroo" }, "scripts": { "build": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension", @@ -43,8 +43,8 @@ "build:all": "yarn run build:labextension && yarn run build:nbextension && yarn run build:widget-examples", "clean": "rimraf dist && yarn run clean:lib && yarn run clean:labextension && yarn run clean:nbextension", "clean:lib": "rimraf lib", - "clean:labextension": "rimraf dcef/labextension", - "clean:nbextension": "rimraf dcef/nbextension/index.*", + "clean:labextension": "rimraf buckaroo/labextension", + "clean:nbextension": "rimraf buckaroo/nbextension/index.*", "lint": "eslint 'js/**/*.{ts,tsx}'", "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", "prepack": "yarn run build:labextension && yarn run build:nbextension", @@ -102,7 +102,7 @@ "jupyterlab": { "extension": "lib/plugin", "webpackConfig": "webpack.lab.config.js", - "outputDir": "./dcef/labextension", + "outputDir": "./buckaroo/labextension", "sharedPackages": { "@jupyter-widgets/base": { "bundled": false, diff --git a/pyproject.toml b/pyproject.toml index fe83326d3..642ff8055 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.2.6" +version = "0.2.7" [project.license] file = "LICENSE.txt" @@ -48,18 +48,18 @@ test = [ ] [project.urls] -Homepage = "https://github.com/bloomberg/dcef" +Homepage = "https://github.com/paddymul/buckaroo" [tool.hatch.build] artifacts = [ - "dcef/nbextension/index.*", - "dcef/labextension", + "buckaroo/nbextension/index.*", + "buckaroo/labextension", ] [tool.hatch.build.targets.wheel.shared-data] -"dcef/nbextension" = "share/jupyter/nbextensions/dcef" -"dcef/labextension" = "share/jupyter/labextensions/dcef" -"dcef.json" = "etc/jupyter/nbconfig/notebook.d/dcef.json" +"buckaroo/nbextension" = "share/jupyter/nbextensions/buckaroo" +"buckaroo/labextension" = "share/jupyter/labextensions/buckaroo" +"buckaroo.json" = "etc/jupyter/nbconfig/notebook.d/buckaroo.json" [tool.hatch.build.targets.sdist] exclude = [ @@ -81,8 +81,8 @@ exclude = [ [tool.hatch.build.hooks.jupyter-builder] ensured-targets = [ - "dcef/nbextension/index.js", - "dcef/labextension/package.json", + "buckaroo/nbextension/index.js", + "buckaroo/labextension/package.json", ] dependencies = [ "hatch-jupyter-builder>=0.8.1", @@ -99,7 +99,7 @@ npm = [ [tool.isort] profile = "black" known_first_party = [ - "dcef", + "buckaroo", "tests", ] line_length = 80 @@ -133,7 +133,7 @@ src = "pyproject.toml" version_template = "version = \"{major}.{minor}.{patch}{channel}{release}\"" [[tool.tbump.file]] -src = "dcef/_version.py" +src = "buckaroo/_version.py" [[tool.tbump.file]] src = "package.json" diff --git a/webpack.config.js b/webpack.config.js index f1b9e01ae..8c98fd57d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -58,7 +58,7 @@ module.exports = [ entry: './js/extension.ts', output: { filename: 'index.js', - path: path.resolve(__dirname, 'dcef', 'nbextension'), + path: path.resolve(__dirname, 'buckaroo', 'nbextension'), libraryTarget: 'amd', }, module: { @@ -70,7 +70,7 @@ module.exports = [ }, /** - * Embeddable dcef bundle + * Embeddable buckaroo bundle * * This bundle is almost identical to the notebook extension bundle. The only * difference is in the configuration of the webpack public path for the @@ -85,8 +85,8 @@ module.exports = [ filename: 'index.js', path: path.resolve(__dirname, 'dist'), libraryTarget: 'amd', - library: 'dcef', - publicPath: 'https://unpkg.com/dcef@' + version + '/dist/', + library: 'buckaroo', + publicPath: 'https://unpkg.com/buckaroo@' + version + '/dist/', }, devtool: 'source-map', module: { @@ -106,7 +106,7 @@ module.exports = [ output: { filename: 'embed-bundle.js', path: path.resolve(__dirname, 'docs', 'source', '_static'), - library: 'dcef', + library: 'buckaroo', libraryTarget: 'amd', }, module: { From 0c26a048becea52a390d66301666a511ee2b23d9 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 08:55:55 -0400 Subject: [PATCH 027/250] fix for the full python build. updating eslint rules next --- js/version.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/version.ts b/js/version.ts index dd1aa6c0d..05377383b 100644 --- a/js/version.ts +++ b/js/version.ts @@ -1,8 +1,8 @@ // Copyright (c) Bloomberg // Distributed under the terms of the Modified BSD License. -import * as data from '../package.json'; - +//import * as data from '../package.json'; +const data = require('../package.json'); /** * The _model_module_version/_view_module_version this package implements. * From 23accdc589e29c23d0aa54b8d939f23d689ec332 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 08:57:49 -0400 Subject: [PATCH 028/250] fixed eslint rules so they work now --- .eslintrc.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.eslintrc.js b/.eslintrc.js index 9e6f0ad37..ee4a89d8d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -19,6 +19,11 @@ module.exports = { '@typescript-eslint/no-namespace': 'off', '@typescript-eslint/no-use-before-define': 'off', "@typescript-eslint/no-unused-vars": "off", + + //necessary for js/version.ts... otherwise the python build fails + "@typescript-eslint/no-var-requires": "off", + + "@typescript-eslint/explicit-function-return-type": "off", '@typescript-eslint/quotes': [ 'error', From f93d251fe7d233a28ce98727d3406ad7e3427711 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 09:30:37 -0400 Subject: [PATCH 029/250] changed dcef doc references to buckaroo --- README.md | 46 ++++++++++++++++++------------------ docs/source/FAQ.rst | 4 ++-- docs/source/contributing.rst | 26 ++++++++++---------- docs/source/index.rst | 10 ++++---- docs/source/install.rst | 8 +++---- docs/source/using.rst | 16 ++++++------- pyproject.toml | 5 ++-- 7 files changed, 58 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index b44c71c96..2bf44df13 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,42 @@ -# DCEF - Data Cleaning Exploration Framework -We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Data Cleaning Explorationg Framework (DCEF) makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the DCEF is a tool built to interactively explore, clean, and transform pandas dataframes. +# Buckaroo - The Data Wrangling Assistant +We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaro makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the Buckaroo is a tool built to interactively explore, clean, and transform pandas dataframes. -![Data Cleaning Exploration Framework Screenshot](static/images/dcf-jupyter.png) +![Buckaroo Screenshot](static/images/dcf-jupyter.png) ## Installation -If using JupyterLab, `dcef` requires JupyterLab version 3 or higher. +If using JupyterLab, `buckaroo` requires JupyterLab version 3 or higher. -You can install `dcef` using `pip` +You can install `buckaroo` using `pip` Using `pip`: ```bash -pip install dcef +pip install buckaroo ``` ## Documentation -To get started with using DCEF, check out the full documentation: +To get started with using Buckaroo, check out the full documentation: -https://dcef.readthedocs.io/ +https://buckaroo.readthedocs.io/ -# Using DCEF +# Using Buckaroo in a jupyter lab notebook just add the following to a cell ```python -from dcef.dcef_widget import DCEFWidget -DCEFWidget(df=df) #df being the dataframe you want to explore +from buckaroo.buckaroo_widget import BuckarooWidget +BuckarooWidget(df=df) #df being the dataframe you want to explore ``` -and you will see the UI for DCEF +and you will see the UI for Buckaroo ## Using commands -At the core DCEF commands operate on columns. You must first click on a cell (not a header) in the top pane to select a column. +At the core Buckaroo commands operate on columns. You must first click on a cell (not a header) in the top pane to select a column. Next you must click on a command like `dropcol`, `fillna`, or `groupby` to create a new command @@ -46,7 +46,7 @@ At this point you can either delete the command by clicking the `X` button or ch ## Writing your own commands -Builtin commands are found in [all_transforms.py](dcef/all_transforms.py) +Builtin commands are found in [all_transforms.py](buckaroo/all_transforms.py) ### Simple example Here is a simple example command @@ -142,7 +142,7 @@ These transforms emit multiple DataFrames * concat (concatenate multiple dataframes, with UI affordances to assure a similar shape) * join (join two dataframes on a key, with UI affordances) -DCEF can only work on a single input dataframe shape at a time. Any newly created columns are visible on output, but not available for manipulation in the same DCEF Cell. +Buckaroo can only work on a single input dataframe shape at a time. Any newly created columns are visible on output, but not available for manipulation in the same Buckaroo Cell. # Components @@ -159,15 +159,15 @@ DCEF can only work on a single input dataframe shape at a time. Any newly creat * Simple UI for column level functions * Shows generated python code * Shows transformed data frame - * DCEF server + * Buckaroo server * Serves up dataframes for use by frontend - * responds to dcef commands + * responds to buckaroo commands * shows generated python code * Developer User experience - * define DCEF commands in python onloy - * DCEF Intepreter + * define Buckaroo commands in python onloy + * Buckaroo Intepreter * Based on Peter Norvig's lispy.py, a simple syntax that is easy for the frontend to generate (no parens, just JSON arrays) - * DCEF core (actual transforms supported) + * Buckaroo core (actual transforms supported) * dropcol * fillna * one hot @@ -187,7 +187,7 @@ DCEF can only work on a single input dataframe shape at a time. Any newly creat * Summary statistics tab for incoming dataframe * Multi index columns * DateTimeIndex support - * DCEF core + * Buckaroo core * MakeCategorical * Quantize * Resample @@ -208,8 +208,8 @@ DCEF can only work on a single input dataframe shape at a time. Any newly creat For a development installation: ```bash -git clone https://github.com/paddymul/dcef.git -cd dcef +git clone https://github.com/paddymul/buckaroo.git +cd buckaroo conda install ipywidgets=8 jupyterlab pip install -ve . ``` diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index c5fb64a88..f5899f168 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -1,9 +1,9 @@ -.. DCEF documentation master file, created by +.. Buckaroo documentation master file, created by sphinx-quickstart on Wed Apr 19 14:07:15 2023. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -DCEF - FAQ +Buckaroo - FAQ ========================================== diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst index f208ce91a..de3f36649 100644 --- a/docs/source/contributing.rst +++ b/docs/source/contributing.rst @@ -1,16 +1,16 @@ .. _Contributing: ==================== -Contributing to DCEF +Contributing to Buckaroo ==================== -DCEF is actively looking for contributors. All forms of participation are welcome, from bug reports, to suggestions, to code contributions. +Buckaroo is actively looking for contributors. All forms of participation are welcome, from bug reports, to suggestions, to code contributions. Developing in the Jupyter Lab environment ========================================= -The easiest way to develop and contribute to DCEF is to add ``Commands``. When I use DCEF to clean and explore a new dataset, I firt try to use the built in DCEF commands in the UI. When I want to perform a manipulation that doesn't yet exist in DCEF, I first drop down to raw pandas/python like I would before DCEF... Then I figure out how to expose that functionality as a ``Command``. While working with manatee data, I recognized that a column was probably date times, but a ``to_datetime`` ``Command`` didn't exist. So I wrote one. +The easiest way to develop and contribute to Buckaroo is to add ``Commands``. When I use Buckaroo to clean and explore a new dataset, I firt try to use the built in Buckaroo commands in the UI. When I want to perform a manipulation that doesn't yet exist in Buckaroo, I first drop down to raw pandas/python like I would before Buckaroo... Then I figure out how to expose that functionality as a ``Command``. While working with manatee data, I recognized that a column was probably date times, but a ``to_datetime`` ``Command`` didn't exist. So I wrote one. .. code-block:: python @@ -39,7 +39,7 @@ The easiest way to develop and contribute to DCEF is to add ``Commands``. When When you use the ``add_command`` decorator, the command is instantly added to the UI of the corresponding widget. Subsequent re-evalutations of the same cell, will replace a ``Command`` in the widget with the same name. This allows you to iteratively develop commands. -Once you have developed a ``Command`` you can either continue to use it internally as with the ``add_command`` decorator or you can open a PR and add it to the builtin commands for DCEF `all_transforms.py `_. +Once you have developed a ``Command`` you can either continue to use it internally as with the ``add_command`` decorator or you can open a PR and add it to the builtin commands for Buckaroo `all_transforms.py `_. The upside of just using the @add_command decorator is that you don't have to setup a development environment. @@ -51,29 +51,29 @@ First, you need to fork the project. Then setup your environment: .. code-block:: bash # create a new conda environment - conda create -n dcef-dev jupyterlab pandas nodejs yarn pip - conda activate dcef-dev + conda create -n buckaroo-dev jupyterlab pandas nodejs yarn pip + conda activate buckaroo-dev pip install build twine - # download dcef from your GitHub fork - git clone https://github.com//dcef.git + # download buckaroo from your GitHub fork + git clone https://github.com//buckaroo.git # or start by cloning the main repo - git clone https://github.com/paddymul/dcef.git + git clone https://github.com/paddymul/buckaroo.git # install JS dependencies and build js assets - cd dcef + cd buckaroo yarn install - # install DCEF in editable mode + # install Buckaroo in editable mode python -m pip install -ve . #in another shell, setup the typescript watcher - conda activate dcef-dev + conda activate buckaroo-dev yarn build && yarn watch #this will build the jupyter lab extension, and recompile on any code changes #start your jupyter lab server in another shell - conda activate dcef-dev + conda activate buckaroo-dev jupyter lab #work on your jupyter notebook from that lab server diff --git a/docs/source/index.rst b/docs/source/index.rst index 9fb0934dd..3452823da 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -1,14 +1,14 @@ -.. DCEF documentation master file, created by +.. Buckaroo documentation master file, created by sphinx-quickstart on Wed Apr 19 14:07:15 2023. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -DCEF - Data Cleaning Exploration Framework +Buckaroo - Data Cleaning Exploration Framework ========================================== -DCEF is a tool to quickly clean and explore DataFrames with a visual UI for common cleaning operations AND emitting python code that performs the transformation. +Buckaroo is a tool to quickly clean and explore DataFrames with a visual UI for common cleaning operations AND emitting python code that performs the transformation. -We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. DCEF aims to massively speed up that process. +We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaroo aims to massively speed up that process. .. raw:: html @@ -35,4 +35,4 @@ Indices and tables * :ref:`genindex` * :ref:`modindex` * :ref:`search` -* `DCEF on github `_ +* `Buckaroo on github `_ diff --git a/docs/source/install.rst b/docs/source/install.rst index d7e3c3894..52a814622 100755 --- a/docs/source/install.rst +++ b/docs/source/install.rst @@ -1,13 +1,13 @@ .. _install: ================ -Installing DCEF +Installing Buckaroo ================ -DCEF can be installed from ``PyPI``: +Buckaroo can be installed from ``PyPI``: .. code-block:: bash - pip install dcef + pip install buckaroo -Once dcef is installed, it can be used as a a Jupyter Lab extension. See :ref:`using` for information on how to use dcef +Once Buckaroo is installed, it can be used as a a Jupyter Lab extension. See :ref:`using` for information on how to use Buckaroo. diff --git a/docs/source/using.rst b/docs/source/using.rst index c77674c3f..27c6b9ca6 100644 --- a/docs/source/using.rst +++ b/docs/source/using.rst @@ -1,14 +1,14 @@ .. _using: =========== -Using DCEF +Using Buckaroo =========== -DCEF is meant to be used in a jupyterlab notebook to clean and explore pandas dataframes. +Buckaroo is meant to be used in a jupyterlab notebook to clean and explore pandas dataframes. Before you begin, make sure that you follow the steps in :ref:`install`. -The following sections cover how to use DCEF. +The following sections cover how to use Buckaroo. In a Jupyter Lab notebook cell @@ -16,16 +16,16 @@ In a Jupyter Lab notebook cell .. code-block:: python - from dcef.dcef_widget import DCEFWidget - DCEFWidget(df=df) #df being the dataframe you want to explore + from buckaroo.buckaroo_widget import BuckarooWidget + BuckarooWidget(df=df) #df being the dataframe you want to explore -And you will see the UI for DCEF. +And you will see the UI for Buckaroo. Using Commands ============== -At the core DCEF commands operate on columns. You must first click on a cell (not a header) in the top pane to select a column. +At the core Buckaroo commands operate on columns. You must first click on a cell (not a header) in the top pane to select a column. Next you must click on a command like ``dropcol``, ``fillna``, or ``groupby`` to create a new command @@ -37,7 +37,7 @@ Writing your own commands ========================= -Builtin commands are found in `all_transforms.py `_ +Builtin commands are found in `all_transforms.py `_ .. code-block:: python diff --git a/pyproject.toml b/pyproject.toml index 642ff8055..50b34ee7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ build-backend = "hatchling.build" [project] name = "buckaroo" -description = "Herder - GUI Data wrangling for pandas" +description = "Buckaroo - GUI Data wrangling for pandas" readme = "README.md" requires-python = ">=3.7" authors = [ @@ -17,6 +17,7 @@ keywords = [ "IPython", "Jupyter", "Widgets", + "pandas", ] classifiers = [ "Framework :: Jupyter", @@ -34,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.2.7" +version = "0.2.8" [project.license] file = "LICENSE.txt" From c9bbb55630cbdfb3a0d3a45e295c9ede6e0e7b0e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 09:31:37 -0400 Subject: [PATCH 030/250] removing pytest config bit that was causing errors --- pytest.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 5d2bb3048..1b6aa55d4 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,3 +1,2 @@ [pytest] -asyncio_mode=strict testpaths=tests From 65edd5c6bafa0bc3f981b3227874891928c77d4a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 09:33:49 -0400 Subject: [PATCH 031/250] doc update --- docs/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index b1a397471..b06b060b3 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -6,10 +6,10 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'DCEF' +project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.2' +release = '0.2.8' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration From c822d75d756e3bb7373711e651e57d12e3b9a27a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 10:02:17 -0400 Subject: [PATCH 032/250] working local develop --- buckaroo.json | 2 +- buckaroo/__init__.py | 41 ++++++++++++++++++++++++ introduction.ipynb | 75 +++----------------------------------------- 3 files changed, 47 insertions(+), 71 deletions(-) diff --git a/buckaroo.json b/buckaroo.json index df2cf9062..e41e064f7 100644 --- a/buckaroo.json +++ b/buckaroo.json @@ -1,5 +1,5 @@ { "load_extensions": { - "buckaroo/extension": true + 'buckaroo-labextension':true } } diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index faaaf799c..ddc23b8b5 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -1,3 +1,44 @@ # -*- coding: utf-8 -*- +dest = 'buckaroo-labextension' +def _jupyter_labextension_paths(): + """Called by Jupyter Lab Server to detect if it is a valid labextension and + to install the widget + Returns + ======= + src: Source directory name to copy files from. Webpack outputs generated files + into this directory and Jupyter Lab copies from this directory during + widget installation + dest: Destination directory name to install widget files to. Jupyter Lab copies + from `src` directory into /labextensions/ directory + during widget installation + """ + return [{ + 'src': 'labextension', + 'dest': dest + }] + + +def _jupyter_nbextension_paths(): + """Called by Jupyter Notebook Server to detect if it is a valid nbextension and + to install the widget + Returns + ======= + section: The section of the Jupyter Notebook Server to change. + Must be 'notebook' for widget extensions + src: Source directory name to copy files from. Webpack outputs generated files + into this directory and Jupyter Notebook copies from this directory during + widget installation + dest: Destination directory name to install widget files to. Jupyter Notebook copies + from `src` directory into /nbextensions/ directory + during widget installation + require: Path to importable AMD Javascript module inside the + /nbextensions/ directory + """ + return [{ + 'section': 'notebook', + 'src': 'nbextension', + 'dest': dest, + 'require': '%s/extension' % dest + }] diff --git a/introduction.ipynb b/introduction.ipynb index f0da31b07..337b30e4b 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -7,7 +7,7 @@ "outputs": [], "source": [ "import pandas as pd\n", - "from dcef.dcef_widget import DCEFWidget" + "from buckaroo.buckaroo_widget import BuckarooWidget" ] }, { @@ -17,7 +17,7 @@ "outputs": [], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", - "w = DCEFWidget(df)\n", + "w = BuckarooWidget(df)\n", "w" ] }, @@ -27,39 +27,9 @@ "metadata": {}, "outputs": [], "source": [ - "w.operation_results['transformed_df'].keys()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "w.operation_results['transformed_df']['schema']['fields']\n", - "tdf = w.operation_results['transformed_df']\n", - "fnames = [ f['name'] for f in tdf['schema']['fields'] ]\n", - "fnames" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "'stoptime' in fnames " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from dcef.all_transforms import Command\n", - "from dcef.lispy import s\n", - "#Here we start adding commands to the DCF Widget. Every call to add_command replaces a command with the same name\n", + "from buckaroo.all_transforms import Command\n", + "from buckaroo.lispy import s\n", + "#Here we start adding commands to the Buckaroo Widget. Every call to add_command replaces a command with the same name\n", "@w.add_command\n", "class GroupBy2(Command):\n", " command_default = [s(\"groupby2\"), s('df'), 'col', {}]\n", @@ -97,41 +67,6 @@ " commands.append(\" df = pd.DataFrame(df_contents)\")\n", " return \"\\n\".join(commands)\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!echo $CONDA_DEFAULT_ENV\n", - "!pwd" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# notice that there is now a Groupby2 Command in the widget" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df.info()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From db59bcb9e0e406e533a8e6cfa3a6730e22947618 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 10:03:54 -0400 Subject: [PATCH 033/250] adding jsdom for testing --- package.json | 13 +- yarn.lock | 460 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 452 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index f14d00f04..5d44ee8c9 100644 --- a/package.json +++ b/package.json @@ -57,10 +57,10 @@ "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", - "paddy-react-edit-list": ">=1.1.35", "lodash": "^4.17.21", - "react-dom": "^18.0.0", - "react": "^18.0.0" + "paddy-react-edit-list": ">=1.1.35", + "react": "^18.0.0", + "react-dom": "^18.0.0" }, "devDependencies": { "@babel/cli": "^7.6.3", @@ -69,9 +69,9 @@ "@babel/preset-typescript": "^7.6.0", "@jupyterlab/builder": "^3.0.1", "@types/jest": "^27.4.1", + "@types/node": "^10.11.6", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", - "@types/node": "^10.11.6", "@types/webpack-env": "^1.13.6", "@typescript-eslint/eslint-plugin": "^3.5.0", "@typescript-eslint/parser": "^3.5.0", @@ -84,6 +84,7 @@ "eslint-plugin-prettier": "^3.1.4", "fs-extra": "^7.0.0", "jest": "^28.1.3", + "jest-environment-jsdom": "^29.5.0", "lint-staged": "^10.2.11", "mkdirp": "^0.5.1", "npm-run-all": "^4.1.3", @@ -144,8 +145,8 @@ "bundled": false, "singleton": true }, - "react":false, - "react-dom":false + "react": false, + "react-dom": false } } } diff --git a/yarn.lock b/yarn.lock index 30ba89c35..274c8c605 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1154,6 +1154,16 @@ "@types/node" "*" jest-mock "^28.1.3" +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + "@jest/expect-utils@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" @@ -1181,6 +1191,18 @@ jest-mock "^28.1.3" jest-util "^28.1.3" +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + "@jest/globals@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" @@ -1228,6 +1250,13 @@ dependencies: "@sinclair/typebox" "^0.24.1" +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + "@jest/source-map@^28.1.2": version "28.1.2" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" @@ -1290,6 +1319,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -1689,6 +1730,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -1696,6 +1742,20 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" @@ -1703,6 +1763,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@types/babel__core@^7.1.14": version "7.20.0" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" @@ -1816,6 +1881,15 @@ dependencies: "@types/sizzle" "*" +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -1896,6 +1970,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + "@types/underscore@*": version "1.11.4" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" @@ -2135,11 +2214,19 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abab@^2.0.3: +abab@^2.0.3, abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" @@ -2150,6 +2237,11 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^6.2.0: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" @@ -2160,7 +2252,7 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.5.0, acorn@^8.7.1: +acorn@^8.1.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.1: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -2177,6 +2269,13 @@ ag-grid-react@^29.2.0: dependencies: prop-types "^15.8.1" +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2296,6 +2395,11 @@ async@^2.5.0: dependencies: lodash "^4.17.14" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -2741,6 +2845,13 @@ colorette@^2.0.14, colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -2893,6 +3004,23 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + csstype@3.0.10: version "3.0.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" @@ -2912,20 +3040,34 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: - ms "2.0.0" + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -2943,7 +3085,7 @@ deep-equal@^1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -2961,6 +3103,11 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3009,6 +3156,13 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + domhandler@^4.0.0, domhandler@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" @@ -3096,6 +3250,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + envinfo@^7.7.3: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" @@ -3198,6 +3357,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-prettier@^6.11.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" @@ -3292,7 +3463,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3392,7 +3563,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -3481,6 +3652,15 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + free-style@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/free-style/-/free-style-3.1.0.tgz#4e2996029534e6b1731611d843437b9e2f473f08" @@ -3741,6 +3921,13 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -3756,6 +3943,23 @@ htmlparser2@^6.0.0: domutils "^2.5.2" entities "^2.0.0" +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -3766,7 +3970,7 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@^0.6.2: +iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -3974,6 +4178,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4210,6 +4419,20 @@ jest-each@^28.1.3: jest-util "^28.1.3" pretty-format "^28.1.3" +jest-environment-jsdom@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" + integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + jsdom "^20.0.0" + jest-environment-node@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" @@ -4294,6 +4517,21 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" @@ -4302,6 +4540,15 @@ jest-mock@^28.1.3: "@jest/types" "^28.1.3" "@types/node" "*" +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" @@ -4431,6 +4678,18 @@ jest-util@^28.0.0, jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" @@ -4517,6 +4776,38 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4624,6 +4915,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + license-webpack-plugin@^2.3.14: version "2.3.21" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.21.tgz#152f5e82d5f51f8bab78905731f2b8042aa5691b" @@ -4843,7 +5142,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27: +mime-types@^2.1.12, mime-types@^2.1.27: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -5023,6 +5322,11 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +nwsapi@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" + integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -5070,6 +5374,18 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +optionator@^0.8.1: + 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" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -5158,6 +5474,13 @@ parse-srcset@^1.0.2: resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -5350,6 +5673,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -5381,6 +5709,15 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -5423,6 +5760,11 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -5755,6 +6097,13 @@ sanitize-html@~2.7.3: parse-srcset "^1.0.2" postcss "^8.3.11" +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -6190,6 +6539,11 @@ svg-url-loader@~6.0.0: file-loader "~6.0.0" loader-utils "~2.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + table@^6.0.9: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" @@ -6315,6 +6669,16 @@ to-string-loader@^1.1.6: dependencies: loader-utils "^1.0.0" +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -6322,6 +6686,13 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -6381,6 +6752,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -6480,6 +6858,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -6509,7 +6892,7 @@ url-loader@^4.1.0, url-loader@~4.1.0: mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse@~1.5.1: +url-parse@^1.5.3, url-parse@~1.5.1: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -6582,6 +6965,13 @@ validate.io-number@^1.0.3: resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -6614,6 +7004,11 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + webpack-cli@^4.1.0, webpack-cli@^4.4.0: version "4.10.0" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" @@ -6683,11 +7078,31 @@ webpack@^5, webpack@^5.41.1: watchpack "^2.4.0" webpack-sources "^3.2.3" +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -6747,7 +7162,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@^1.2.3: +word-wrap@^1.2.3, 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== @@ -6796,6 +7211,21 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.11.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" From 62b69df4134fd4ba9bbf693d9d85e1028e77a262 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 10:37:19 -0400 Subject: [PATCH 034/250] jest tests pass locally, empty, but still in place for CI --- jest.config.js | 2 - package.json | 3 +- pyproject.toml | 2 +- yarn.lock | 460 ++----------------------------------------------- 4 files changed, 17 insertions(+), 450 deletions(-) diff --git a/jest.config.js b/jest.config.js index ca602dcda..8f7ba325f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,8 +5,6 @@ module.exports = { }, transformIgnorePatterns: ['node_modules/?!(@jupyter-widgets)'], testPathIgnorePatterns: ['ui-tests-ipw7/', 'ui-tests-ipw8/'], - setupFiles: ['./tests/js/setupFile.js'], - testEnvironment: 'jsdom', moduleNameMapper: { '\\.(css|less)$': '/__mocks__/styleMock.js', }, diff --git a/package.json b/package.json index 5d44ee8c9..a373f7cd6 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "lint": "eslint 'js/**/*.{ts,tsx}'", "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", "prepack": "yarn run build:labextension && yarn run build:nbextension", - "test": "jest --verbose", + "test": "jest --verbose --passWithNoTests", "watch": "npm-run-all -p watch:*", "watch:lib": "tsc -w", "watch:nbextension": "webpack --watch", @@ -84,7 +84,6 @@ "eslint-plugin-prettier": "^3.1.4", "fs-extra": "^7.0.0", "jest": "^28.1.3", - "jest-environment-jsdom": "^29.5.0", "lint-staged": "^10.2.11", "mkdirp": "^0.5.1", "npm-run-all": "^4.1.3", diff --git a/pyproject.toml b/pyproject.toml index 50b34ee7f..b5ad548ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.2.8" +version = "0.2.9" [project.license] file = "LICENSE.txt" diff --git a/yarn.lock b/yarn.lock index 274c8c605..30ba89c35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1154,16 +1154,6 @@ "@types/node" "*" jest-mock "^28.1.3" -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - "@jest/expect-utils@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" @@ -1191,18 +1181,6 @@ jest-mock "^28.1.3" jest-util "^28.1.3" -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - dependencies: - "@jest/types" "^29.5.0" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" - "@jest/globals@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" @@ -1250,13 +1228,6 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - "@jest/source-map@^28.1.2": version "28.1.2" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" @@ -1319,18 +1290,6 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -1730,11 +1689,6 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -1742,20 +1696,6 @@ dependencies: type-detect "4.0.8" -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - "@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" @@ -1763,11 +1703,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - "@types/babel__core@^7.1.14": version "7.20.0" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" @@ -1881,15 +1816,6 @@ dependencies: "@types/sizzle" "*" -"@types/jsdom@^20.0.0": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" - integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== - dependencies: - "@types/node" "*" - "@types/tough-cookie" "*" - parse5 "^7.0.0" - "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -1970,11 +1896,6 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== - "@types/underscore@*": version "1.11.4" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" @@ -2214,19 +2135,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abab@^2.0.3, abab@^2.0.6: +abab@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -acorn-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" - integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== - dependencies: - acorn "^8.1.0" - acorn-walk "^8.0.2" - acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" @@ -2237,11 +2150,6 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.0.2: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - acorn@^6.2.0: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" @@ -2252,7 +2160,7 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.1: +acorn@^8.5.0, acorn@^8.7.1: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -2269,13 +2177,6 @@ ag-grid-react@^29.2.0: dependencies: prop-types "^15.8.1" -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2395,11 +2296,6 @@ async@^2.5.0: dependencies: lodash "^4.17.14" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -2845,13 +2741,6 @@ colorette@^2.0.14, colorette@^2.0.16: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3004,23 +2893,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - csstype@3.0.10: version "3.0.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" @@ -3040,22 +2912,6 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -data-urls@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3063,10 +2919,12 @@ debug@^2.6.8: dependencies: ms "2.0.0" -decimal.js@^10.4.2: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" dedent@^0.7.0: version "0.7.0" @@ -3085,7 +2943,7 @@ deep-equal@^1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -3103,11 +2961,6 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3156,13 +3009,6 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - domhandler@^4.0.0, domhandler@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" @@ -3250,11 +3096,6 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - envinfo@^7.7.3: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" @@ -3357,18 +3198,6 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-config-prettier@^6.11.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" @@ -3463,7 +3292,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3563,7 +3392,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -3652,15 +3481,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - free-style@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/free-style/-/free-style-3.1.0.tgz#4e2996029534e6b1731611d843437b9e2f473f08" @@ -3921,13 +3741,6 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -3943,23 +3756,6 @@ htmlparser2@^6.0.0: domutils "^2.5.2" entities "^2.0.0" -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -3970,7 +3766,7 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.6.3, iconv-lite@^0.6.2: +iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -4178,11 +3974,6 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4419,20 +4210,6 @@ jest-each@^28.1.3: jest-util "^28.1.3" pretty-format "^28.1.3" -jest-environment-jsdom@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" - integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/jsdom" "^20.0.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - jsdom "^20.0.0" - jest-environment-node@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" @@ -4517,21 +4294,6 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-mock@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" @@ -4540,15 +4302,6 @@ jest-mock@^28.1.3: "@jest/types" "^28.1.3" "@types/node" "*" -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" @@ -4678,18 +4431,6 @@ jest-util@^28.0.0, jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - jest-validate@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" @@ -4776,38 +4517,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsdom@^20.0.0: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" - integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4915,14 +4624,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - license-webpack-plugin@^2.3.14: version "2.3.21" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.21.tgz#152f5e82d5f51f8bab78905731f2b8042aa5691b" @@ -5142,7 +4843,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27: +mime-types@^2.1.27: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -5322,11 +5023,6 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -nwsapi@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" - integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== - object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -5374,18 +5070,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -optionator@^0.8.1: - 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" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -5474,13 +5158,6 @@ parse-srcset@^1.0.2: resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== -parse5@^7.0.0, parse5@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -5673,11 +5350,6 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -5709,15 +5381,6 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -5760,11 +5423,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -6097,13 +5755,6 @@ sanitize-html@~2.7.3: parse-srcset "^1.0.2" postcss "^8.3.11" -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -6539,11 +6190,6 @@ svg-url-loader@~6.0.0: file-loader "~6.0.0" loader-utils "~2.0.0" -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - table@^6.0.9: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" @@ -6669,16 +6315,6 @@ to-string-loader@^1.1.6: dependencies: loader-utils "^1.0.0" -tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - tr46@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" @@ -6686,13 +6322,6 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -6752,13 +6381,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -6858,11 +6480,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -6892,7 +6509,7 @@ url-loader@^4.1.0, url-loader@~4.1.0: mime-types "^2.1.27" schema-utils "^3.0.0" -url-parse@^1.5.3, url-parse@~1.5.1: +url-parse@~1.5.1: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -6965,13 +6582,6 @@ validate.io-number@^1.0.3: resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== - dependencies: - xml-name-validator "^4.0.0" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -7004,11 +6614,6 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - webpack-cli@^4.1.0, webpack-cli@^4.4.0: version "4.10.0" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" @@ -7078,31 +6683,11 @@ webpack@^5, webpack@^5.41.1: watchpack "^2.4.0" webpack-sources "^3.2.3" -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -7162,7 +6747,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@^1.2.3, word-wrap@~1.2.3: +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== @@ -7211,21 +6796,6 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.11.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" From 9bb4972cb5af18b769707a38562f8abbce5b0823 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 10:47:44 -0400 Subject: [PATCH 035/250] adding missing lint command for CI --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index a373f7cd6..251a56907 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "clean:labextension": "rimraf buckaroo/labextension", "clean:nbextension": "rimraf buckaroo/nbextension/index.*", "lint": "eslint 'js/**/*.{ts,tsx}'", + "lint:check": "eslint 'js/**/*.{ts,tsx}'", "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", "prepack": "yarn run build:labextension && yarn run build:nbextension", "test": "jest --verbose --passWithNoTests", From db586ebc94cd8d46f500b6483d0c89ee6c1886ce Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 11:02:40 -0400 Subject: [PATCH 036/250] trying to ensure that sphinx is installed before trying to build docs for CI --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index b5ad548ca..f4c568444 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,6 +48,9 @@ test = [ "pytest>=6", ] +docs = [ + "sphinx>=1.5"] + [project.urls] Homepage = "https://github.com/paddymul/buckaroo" From c6aceb8d550752d6b658c9fdba174dc28d02d7d7 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 11:03:11 -0400 Subject: [PATCH 037/250] another way of ensuring sphinx is installed --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dfab4e374..8a38d6384 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,6 +39,6 @@ jobs: if: ${{ matrix.os == 'ubuntu-latest' }} working-directory: docs run: | - sudo apt install -y pandoc + pip install sphinx make html python -m pytest --check-links From e6a4577a83d2944950d15e88ffd51e03ffeefa76 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 11:08:53 -0400 Subject: [PATCH 038/250] adding check links --- pyproject.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f4c568444..257d40e5b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,9 @@ test = [ ] docs = [ - "sphinx>=1.5"] + "sphinx>=1.5", + "pytest-check-links" +] [project.urls] Homepage = "https://github.com/paddymul/buckaroo" From 6bcb81d2aa51f45154e0740a5df9e8b6dfa19839 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 11:22:08 -0400 Subject: [PATCH 039/250] backing to a working build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a38d6384..dfab4e374 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,6 +39,6 @@ jobs: if: ${{ matrix.os == 'ubuntu-latest' }} working-directory: docs run: | - pip install sphinx + sudo apt install -y pandoc make html python -m pytest --check-links From 5a219ef416685c25a8a73308766b64343a52ee1d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 12:13:14 -0400 Subject: [PATCH 040/250] udpated docs --- README.md | 2 +- docs/source/FAQ.rst | 14 ++++++++------ docs/source/using.rst | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2bf44df13..1dc006a6f 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ pip install buckaroo To get started with using Buckaroo, check out the full documentation: -https://buckaroo.readthedocs.io/ +https://buckaroo-data.readthedocs.io/en/latest/ # Using Buckaroo diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index f5899f168..34d166c9a 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -5,6 +5,14 @@ Buckaroo - FAQ ========================================== +* **Is DCF meant to repalce knowledge of python/pandas** + + No, DCF helps experienced pandas devs quickly build and try the transformations they already know. Transformation names stay very close to the underlying pandas names. DCF makes different transforms more discoverable than reading obscure blogposts and half working stackoverflow submissions. Different transformations can be quickly tried without a lot of reading and tinkering to see if it is the transform you want. Finally, all transformations are emitted as python code. That python code can be a starting point. + + +* **How well does Buckaroo perform on large dataframes** + + If Buckaroo is configured to send the entire dataframe to the frontend table widget, performance can be slow. But because Buckaroo is built to seamlessly present summary statistics and use sampling. You can operate on just a representative subset of the data, this is much more performant. Manually scanning through more than 500 rows makes it way to easy to miss data anomalies. Furthermore, Buckaroo separates the intent of a transform from the implementation. Python code gen that does the same transform can be improved. It also makes it quick to generate more complex code that is faster than a shorter implementation. If you are coding yourself, you're more likely to write the short version vs painstakingly reproducing a fast implementation. * **Why did you use LISP?** @@ -41,9 +49,3 @@ If you want to work on code transformations, then a knowledge of lisp and partic Alternatively, you could write a command that instead of subtractively reducing a dataframe, builds up a new dataframe from an explicit list of columns. That is also a type of transform that could be written. -* **Is DCF meant to repalce knowledge of python/pandas** - - No, DCF helps experienced pandas devs quickly build and try the transformations they already know. Transformation names stay very close to the underlying pandas names. DCF makes different transforms more discoverable than reading obscure blogposts and half working stackoverflow submissions. Different transformations can be quickly tried without a lot of reading and tinkering to see if it is the transform you want. Finally, all transformations are emitted as python code. That python code can be a starting point. - - - diff --git a/docs/source/using.rst b/docs/source/using.rst index 27c6b9ca6..e79e6ed25 100644 --- a/docs/source/using.rst +++ b/docs/source/using.rst @@ -59,3 +59,39 @@ Builtin commands are found in `all_transforms.py Date: Thu, 4 May 2023 14:53:45 -0400 Subject: [PATCH 041/250] trying to add a requirements.txt for use with binder --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..79891b4fe --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +ipywidgets +pandas +buckaroo From e123ca64674b640608b8cfe27c85a5e98e708c96 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 4 May 2023 15:47:26 -0400 Subject: [PATCH 042/250] errors now sent back to frontend UI --- buckaroo/buckaroo_widget.py | 19 +++++++++---------- introduction.ipynb | 22 +++++++++++++++++++--- tests/basic_widget_test.py | 11 +++++++++++ 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index f8470e5ab..8b0d55343 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -95,27 +95,26 @@ def reset_summary_stats(self): @observe('operations') def interpret_operations(self, change): print("interpret_operations") + results = {} try: operations = [{'symbol': 'begin'}] operations.extend(change['new']) - print("interpret_operations", operations) - results = {} + #print("interpret_operations", operations) + if len(operations) == 1: results['transformed_df'] = self.origDf results['generated_py_code'] = 'no operations' - print('exiting early') + #print('exiting early') return - + #generating python code seems slightly less error prone than the transform + results['generated_py_code'] = self.buckaroo_to_py_core(operations[1:]) transformed_df = self.buckaroo_transform(operations, self.df) results['transformed_df'] = json.loads(transformed_df.to_json(orient='table', indent=2)) + results['transform_error'] = False - results['generated_py_code'] = self.buckaroo_to_py_core(operations[1:]) - self.operation_results = results - print("operations_results", results.keys()) except Exception as e: - print("error_setting", e) - self.transform_error = str(e) - raise + results['transform_error'] = str(e) + self.operation_results = results def setup_from_command_kls_list(self): command_defaults, command_patterns, self.buckaroo_transform, self.buckaroo_to_py_core = configure_buckaroo( diff --git a/introduction.ipynb b/introduction.ipynb index 337b30e4b..bb2605ec5 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -12,9 +12,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8514c8ca70654912a263a70b17fcfcd5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "BuckarooWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'filln…" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = BuckarooWidget(df)\n", diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index 4d9b3a393..28ab28171 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -14,5 +14,16 @@ def test_interpreter(): w.operations = [[{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] tdf = w.operation_results['transformed_df'] + assert w.operation_results['transform_error'] == False field_names = [ f['name'] for f in tdf['schema']['fields'] ] assert 'starttime' not in field_names + + +def test_interpreter_errors(): + df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + w = BuckarooWidget(df) + assert w.operation_results['generated_py_code'] == '#from py widget init' + w.operations = [ + [{"symbol":"dropcol"},{"symbol":"df"},"starttime"], + [{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] + assert w.operation_results['transform_error'] == '''"['starttime'] not found in axis"''' From 84e7c12b844f00b63c0a193486091311039f302b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 5 May 2023 20:01:16 -0400 Subject: [PATCH 043/250] version bump with updated youtube video in the docs --- buckaroo/buckaroo_widget.py | 5 +++++ docs/source/index.rst | 2 +- introduction.ipynb | 11 +++++++++-- package.json | 2 +- pyproject.toml | 2 +- yarn.lock | 8 ++++---- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 8b0d55343..ac0475997 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -10,6 +10,7 @@ from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe +import pandas as pd from ._frontend import module_name, module_version from .all_transforms import configure_buckaroo, DefaultCommandKlsList from .summary_stats import summarize_df @@ -96,6 +97,7 @@ def reset_summary_stats(self): def interpret_operations(self, change): print("interpret_operations") results = {} + results['generated_py_code'] = 'before interpreter' try: operations = [{'symbol': 'begin'}] operations.extend(change['new']) @@ -113,6 +115,9 @@ def interpret_operations(self, change): results['transform_error'] = False except Exception as e: + empty_df = pd.DataFrame({}) + results['transformed_df'] = json.loads(empty_df.to_json(orient='table', indent=2)) + print(e) results['transform_error'] = str(e) self.operation_results = results diff --git a/docs/source/index.rst b/docs/source/index.rst index 3452823da..95fca1d79 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,7 +12,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell .. raw:: html - + diff --git a/introduction.ipynb b/introduction.ipynb index bb2605ec5..65673904e 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -18,7 +18,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8514c8ca70654912a263a70b17fcfcd5", + "model_id": "76a8b005b9fb49c5afd13ae9dafab646", "version_major": 2, "version_minor": 0 }, @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -83,6 +83,13 @@ " commands.append(\" df = pd.DataFrame(df_contents)\")\n", " return \"\\n\".join(commands)\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/package.json b/package.json index 251a56907..99a489454 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", "lodash": "^4.17.21", - "paddy-react-edit-list": ">=1.1.35", + "paddy-react-edit-list": ">=1.1.36", "react": "^18.0.0", "react-dom": "^18.0.0" }, diff --git a/pyproject.toml b/pyproject.toml index 257d40e5b..e439b9d39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.2.9" +version = "0.2.10" [project.license] file = "LICENSE.txt" diff --git a/yarn.lock b/yarn.lock index 30ba89c35..a4b5ae1d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5115,10 +5115,10 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -paddy-react-edit-list@>=1.1.35: - version "1.1.35" - resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.35.tgz#b594ca1dda8cce051019a32e685051f1abe0a2a3" - integrity sha512-2VI2w4NBypUo/MhahtjyD0vDcyeg3JNP6nDO59viUEiOyM4TyzAyxMVjmmHuT+KIIe51JOmL3czl6Kmw5FmSVw== +paddy-react-edit-list@>=1.1.36: + version "1.1.36" + resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.36.tgz#a3e5a30e38c73867530da6750574d62999ca0407" + integrity sha512-iFzup927dtKPMfJHHNxftjPa6Pu+GWLZpo7xqSTI8uRz1fbkQKiYVhCjaHNzzBpJkkblWjhCqOMqpK7NhpssOQ== dependencies: "@ag-grid-community/client-side-row-model" "^29.2.0" "@types/lodash" "^4.14.191" From 8e5516058a26152a4828ff281e5b8a5bf0145ac4 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 8 May 2023 08:21:22 +0100 Subject: [PATCH 044/250] trying to get read the docs to build properly again --- .github/workflows/build.yml | 1 + pyproject.toml | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dfab4e374..93d336c16 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,5 +40,6 @@ jobs: working-directory: docs run: | sudo apt install -y pandoc + pip install pytest-check-links make html python -m pytest --check-links diff --git a/pyproject.toml b/pyproject.toml index e439b9d39..2e9128ca6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,8 +49,7 @@ test = [ ] docs = [ - "sphinx>=1.5", - "pytest-check-links" + "sphinx>=1.5" ] [project.urls] From b06dc245bde9f7bb9631b8907ef41fb62c9f9591 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 8 May 2023 08:24:25 +0100 Subject: [PATCH 045/250] fixing yml errors --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93d336c16..17aadd3cd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,6 +40,6 @@ jobs: working-directory: docs run: | sudo apt install -y pandoc - pip install pytest-check-links + pip install pytest-check-links make html python -m pytest --check-links From e0aea1f120d3d136eb9921b6aa1a18d24fe24ca1 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 8 May 2023 09:37:16 +0100 Subject: [PATCH 046/250] removing requirements.txt, it might be causing trouble with read the docs --- requirements.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 79891b4fe..000000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -ipywidgets -pandas -buckaroo From ec723d0384b217992fe22ad1f7fbcb44feebd1a4 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 8 May 2023 22:23:32 +0100 Subject: [PATCH 047/250] trying readthedocs.yaml --- .readthedocs.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..10c1b017f --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,6 @@ +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3.11" \ No newline at end of file From 1ddd0bc861239b7d7986cd897eecc831e661955b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 9 May 2023 07:42:22 +0100 Subject: [PATCH 048/250] new screenshot --- README.md | 2 +- static/images/Buckaroo-screenshot.png | Bin 0 -> 1420117 bytes static/images/dcf-jupyter.png | Bin 1335815 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 static/images/Buckaroo-screenshot.png delete mode 100644 static/images/dcf-jupyter.png diff --git a/README.md b/README.md index 1dc006a6f..0e0dcec51 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Buckaroo - The Data Wrangling Assistant We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaro makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the Buckaroo is a tool built to interactively explore, clean, and transform pandas dataframes. -![Buckaroo Screenshot](static/images/dcf-jupyter.png) +![Buckaroo Screenshot](static/images/Buckaroo-screenshot.png) ## Installation diff --git a/static/images/Buckaroo-screenshot.png b/static/images/Buckaroo-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0476a79b942388bd27c1767e787df68e3f77ecb3 GIT binary patch literal 1420117 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 z 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

?7-1UMmIPjqE)oe*2{q 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⪻>cxD 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�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 z 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ò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
wHJcd9Y=jJ?Wt&hphmA; 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∓ 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ⅅ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

A`f-G=X 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∓m1SeH#HX1@<+jYUVQ0SvFS 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 z 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�b_TR>iGC$rqC?p&Tqm%^?+~J@Qw}Ze#&hISgMcA6lOY%pgwl7Ff%L8P&P%(_ zsMPnUU?33w7xYZ^p!2+9uw_}g8-6~lMybLFXBka|wKcP8snP7_E!~1x$G69s0wzY8 z0^(2qgPe3bg8-#%!KXV*pwb8%f~Dh?=d!4oyG=}!=mdH+g-94pvaAC*gFqMW@*s zevvtAL7gwO!dn#bG=@1woSWP8_~nL$TQ!NwJUsfy9c0n{wA~oM-`e$4(B04E6%$>& z^z3wFzLS*IV?{)w_d&HX`2fX@NaV{`&IyI!o%Vt!9h#;6sxP$owS%;M;Y*6lop`DT zP2jl~UQRS86?i^;Vnm}a^>qLUIiSm&6Z9yEm|5)yCu7cJ5`e`3qvNV*eIEU&#n~Y-DC#>C#59WRx5TfC_Tak`Eg&@? zkVPfG&9syn_b&h@EQpscFAg7=HUUpk>HA$E`3iRVQI^9=HKd4=d#%00;NL}DHbhB} ztJ)NDcU|woYh(H}ft?zEo75<3xg;ARvb;XCb6HM zebSU}HryLotNd`MI6U!Nvj+8w&HKF1RPbq1&h);YPA>oNbOCR4WDL)D;E6BBvne@O zW0Oqjy)#w3ZQ0hX4=R!wJ%+Y$t6xx$xM6d%K)AItUOp+qjFhHl%u>mjIi**p8R0%CrT@xb4gch)*iW&SIDKFm ze_uEj^Aku2i>UNMk5QyEY@!mllQ{+lE`gXqpw1^4h&u1R1^U+dZXw#jEIOOO9SXX; zsmPculj0Zsh2nF>(Vbc6iu#MPgFQ1y4u0z}xZ@G}Bq&9Zr{lwbty?ha?}I=H;&vAX z2JWu~9xyt0LjaA$2^+1+ZqW;6QaIocD+9sD#p+K68r zGW~*_p|m%uUw*RQ511Lr=f{PVEe^1k+Dq8LCwA$ z!or8q*s|>-zb4F&a1@7dMI(}z$#&6e=L+`V_wS{C?j5-Nj}$K!{N@%x;wtfk$(x9S z1wi}!9P180v{lf5GqF80N9lB*18Vm$tUy1F3lwq%#A-XnO50>TV=i)}KFS$_q>IZ< zkSuKlLq16nuK@aElET|DejwES`BEZ`n?RbxZnG#w!C1;;5&DCjK>haL{-#)aKp1}y za+Iq8_>QQk2Q+$PI_8BK|1{v66Z%C<`+mT*(<<>I|8a@W7fY1rt^1^4dCnwyNPwP; z6vIJItuKbgrxRZXyoOm*m|NN>PzG8YoOJEPC)u0>fI*15dNnJg2ay4cmTsxbN|w)M ztB?jqesUoQuK3YW@5-{R>6Fi>go{aGPpsiPJ1(w@$>Pdn+uKVRCL5%rqyrfsDF8Sv zBMAzl@4FFqsNq}KD|Q6DWT5iqNnheIr(j+V#zG>j^fMHa#AjfR_%97YB3A1`Kbfxn?1bzMTC_J=!-XuTN(S)%JGnh~o}azqy{E{3JjE*ezAmsh(DF}|FmWXQm z?etFqj^y|wbBC0G0eFmO4{ojjf29fPiV>)9n*cC;&4fQHNG6t1FcwZaHPY-`vHUfx z@%OVA-~Rk?d3qT@MJ4~$VEfgh2mjQM@9Md8rV#Cl=j9tCfoc_wpZiog>?$b^#dO6L z^1N|zBNXT90&dT=x*}HBTX-t}KHDJMkSDt4C3;c%M2~@pWYx=#2`;^^7re^4Nl%x`zjSxSKY!G}vvj1amH1;b z`@6e!9S_0j6t==|{0&WS0~+v=X7<`dE1gRP!3T`lWbl! z6^2(pqCeG0YzZBD=rm}LRM$`tyf%rEQ6@z9n3R3I7bJ*Jiypz_cxy=hM|A9;Bm%L0+(_?twEvN^$ z-c3v>aQ%7vzvDwEmiMvh@={>-$N#^j?i;0-9I{6dB64UWVL$e`)PSM%-pvFH!cb^C zTv3N0)sxRobYQ4RLHKpW6yrp@dezzg43zph-}senW(X3SOI-{2MD7*u8-b+}SB)J} z>A_k<>mRq1TI4%h2j=SVk8JjO9je$uaL-8*?;oiu%n)6ypytV-3vFJ<)w!(_Ef+QK?0B-;2bG{gB2$%eRY&b%j3O=|BB|bR7E(h zxuU~gqY@?3FeH3;7z_f=E(QMcK5j77OHi*$-hU^h0t|UT;=+KPTc|hw{w;t&Rcr#+ z51SzX;QtGvM>z9xxtQFyYdFG;@Bgs%o>5J;U-Y1ghyqdsL8$^tktU#mv?xVTLy5~YfCK{|vYMSAZLdWVE0kOY$4x$kfOGiyG~x?gBni{yDu+54Qc zk9l;%W$AZwJMZV9FMnNwbR;IyKiTNskVRBE3GDE6SUpy?&5W5Oe;&L0$m!V|&{KF@ zzkEVxMqre^aLID!(Pw|l>L}Ru$~Lpwc}vy-i33UY{iZnd{MfC_pWa?#t-LMv1iRd0 z+3=#G<%Rw~y^AF`&gZb*soi)h7_l$hgZOmAZg?I_D>E)To$$HJSwg}=UIy<+WPQs0 z+V>=YiotNLdLMH1tW?vH}lgEaTloRzS zr`wm8>yr<)9L$A3K;gurC@5Sbue}^1$_&~Dt(xeq>Q(%%UX~T_$W@@&s7z4eEiDaKXt5z06$qIzxzZ-5;@td|GaU~xwRC-YH#I! zCnq=To+vz)EHK#1-}#8wGZb2N<6)SX-M3clj4qkjPH3*KJ8pM5;3N#%3d&tHk!J?~ z{vQ(nlXY^(5b}R-bbo%h9CAmmrcb;qyRKkmw%3<((l`3I9Kx%0e$4rQZ)nyBbf!XV zd$-3)6cHq_MnHf`J_?RMEe8rIQ(HOCX?blcMg^ZCUK9>4i3chZ7RlYgBy?(HKPnJa|` zeqa%ED>;6xgIRTaFX;3*#UTG_x*GKsmOu?a_hML~+ThIMdh8UcmA9M3%m7CLrY-tR z9*{K=6ku)xGNdP0_iZ1rjFAqfhR-6)$|pjEw%|bk+kjqV#eWu8&JPEZgJiS+B|Jlr zx^JMfky8OT&#BXqPe`B@VNao!(ygSUv@BV!^czM@e}K&?L@KNY@bO%0It3sRgL(>1^Y*7fNxGV$d*=%+ zHG?Cy{8;rU#D_vRTms)zUvToD2%A+FzJHQ-#aY$mdkL4Aox94yH1x$XaQLbsH^I~~3rt$s4*)Kvu&p#dnB_EmS?W}kWQ zPm66DDe8fL$1%L3eTYE5`p{3M2BZKx6U90apRSHd0vYnKRQtZvf4wQ<_Jp#94`iq( z>1vV)%z6y=aQf) zaSFa&o?5qoU~>2P`MXE|8T>o9?Nca(I;}bx54jm`)(4(kJW?^9fQwhCl79LT1z=7g z^QYjke4+JbBclmG4goUlxAk*}07+p15!Mt!WbQ=iMf4l3Rz86>aK6yO_iNd?#9?Z< zJZ%x9tnm*X*R5x;E5$4mq7=`B`LVwmNKFGa_dB19!Ud(Yd3@Du`nlf65c}3VJJ6uXl+}6o`wvU+8T%wTEh+Uy7K&EzQA&RX zgt=Oz0zU#wTENoY?@spq)XzViZ_p}wi3ivGZ>yc5Vb6#hu zlvAYSpEpw%ic0%=F8~qi=oAy{#9CA^gIlsFVLqsEJ^&WbXI<0>k&lDIDMs6bNefn@ zle4@OVV6)aUTh+5L_!ZQtELl=rb5K9q)kNMj3Xi+69lZDLe~YZqQ^;Sj}s)@6RKEk zS5_tk(T%D_Zo&;(`{4eY$QA$yz@b;2sk^73eVAy=9hVn!2a9 z*rU2Z@AjQV^2M2mX#-P!{}jFDWfMAlNBu8Z#XaJ|%GY#Z$`^>FD0|VBe;%Tj2V|xs zXfNF@(sin$SS+PULshSyaBIlkbV$gUTaX|u_#o_hzdlOwj%o+S^i&h2vKqM>!ngF^ zJkWX*%dKRbQZ8_%uY(zKGq?LQ?Gs4>^~A$%goJt&Q}WR+JdKV&P&;NQdGl_%qP^mh zkk>_3ojlt_o2lN6F=%@>Y#CJev*aY}r1%3P?1FB17fk#4EWZ^E2o&oMW$(6`v{ za0bwhL#f{Ks1i&O3-3uAT~Yf~yhEH2H2^=NH6EJuk{7H_n(A)IoL4l} zZxEUZB?VrWwW|>8yKhN8cH|Cw=iCE`OC#wcw&tFq8qqD>^dkWi=wR2r851D@s?g~p zD$58A$e%nCFz57J=>R-u;@@_rn1})s#TL+$qus)Zn=BmHy#-hF_6gCageNtDxFbr-Q zTo~GtD7w&SXVW7k(en;-To6?*$>sdfX%=d^DbtaxXk|cUeKQSF~4u6i*eCNRW#7=DF zR{H8|q9l`B=9R>cSPj~g-m28Uh%L)*rNG-7hTV`+TXrc+Q|rL(TSYI*EJ0mj1&@af z@3t9Z>XrrGdm!H>74eqnb6lh9P z9#L%6qqL9rX7Y`Sjn7gzrL7s^C$mU{PMjSadsY`f0l~NJ`@U3S+@K{g1r#KYj3r;d z%9BzphCeL(q}n<7AfakqSTyTWEd22_icb)7-~@>KpKAQ6q~s%wr6^ zL`l07#kEaQr}APED%QS_%tKr7WBR?mmLrKhsN(Xb3lUC`2>6f{;h}(ke39VC{@;h= zXnuAsKkK#j7^$So-14IH4g=r*S@|s9@&hYTjL|oNtZ(8`HywJu7LcJ{1NVMA9SY_> z|5Dy^qV{wpdi_<7)(z)Yptc%7HUm1P6cviC)^DLS2!#60diMndvHQhx>LFhq;sA|@ zgH8L??dxzA;QBut*6}151rYzkV!`Ai95V#K;y|?UV3fj%q+7f|MOe1%y!7Z0K^NiJG=04@%pG#`2tn1WROrME_)s?u>#$+&KOQEo*Cc_oR7wwg`+<2X~`}M{=Er58WSytmo_=Dl*E-(4JL*E z)tIRTLL|(pA7;Z_q9jN*MW2a*;hBEk+hGZZd*StR>yNc2%*?m;#C`_!gq+~t&7G}-XYL`i;SIK=V5@?X+}7%>GWXAM&_ zFkhpa`f#QfOV1%8ny-^fo#b^s9g0-LZ)Cs>6kjSc6CB!Cj2?A=fHxgNSG!_8Ee{p* zTYD07^EE!Md>>fuLuIQp<_9;Q{PvoX%I_dlA=ALAq+Ck_MKwUE4VW;2Cf4G6=Fis? z4jR9+G)wD}AZJw9DfzD9jKd*=k+iUa&*>=uGaa>?AAZxS@tsk&tB;P7ALd6~3!vY7 z`rqLvNPRkfqDu8A&(wx7SI0Z1^*!J~Fs?E~zh0oSc~IBq5N>@nHF_v&Bwsezh-Xc` zEJvgc{okPn;=6Qy4vxj~Lx4jZSkE}Z0c_x~P=xTEPpd5EyNM4J6Eua1&o+fmUoPC3 zeIv5H`Mr?&?@zTa<=-yyNnO*uNtS9q-$_vseWK7h`zj(VR88&JOe*^bi@6-}ML6!x z*%78=o-a3fmbUe783o>d&JV&BwQ(_x6e0_As@CleI!Ld6_B{dNu3i>{qNLB;B-VH@ zU*S^|yiQ?6-!?iaV*i#O-Af784MMlL1nMwC7 z&LHps#N{X>fu}^>Z}-w#ngcQp?(pKvEo#d^Nf4uDIB`VFpp2&!I_3`WdsJ^vm{{lU zBZRb=NZ`@uU_>l&+G`uH`s-fZ-e_OmDQ@9qssCLJoMgn84ywb_`a~NDd{P3XYSIAIBw2Xi+kJgv z#1DM-on;sAiyl!T|D~yk{_l5hzyu|}R{a}y9$Wh&@uK8gdv#NCGjK>;72>U!_@_t( zDb#&53Dt*00}9BBgF740JxDH(b-W#QeVacgrx18jMg5E$4>YQsuu(qH&?g|F#%4P6V%K z4XIq`-hcL)I;-($w$;|l7aT)^Cj&19%+F|TsQsM&m|$Y~J!FY+X|F$+ye%@*^q%2< z7F(YA#4m-7E1n@mpJWRP5%neim{42xR5bGRdBhFFNXECpDZg&t9{erR-rG~E#B#W7 zIGLV`i6yTlG7)=Tuj$3e^NKuqU%i|brN-X*X5s?lp7cGJ@t4dZ8C9-K>=|Txgr1(ssYr;2PO3zzA8zBHpmGeSr0_kL$uGFuCP}oojXqs){$xEf zYBeBgsmD@rbS^?0is)^4ZuUYk8b$g(e=uHM#m8?MEhIrfUbh(3nz@>YBPo)2P<>vuz`(o?&RxYt10 z9itOAD)y@Qt4?xL`%tn-Jie>>cO_Yi3yhR$KMc6AsN=|8d#Tw>?9ggRu~9JxCooOz z&Ix{T%I`+fD+O?vRU9a#^y$eBAoYB` z25ZDD_~~KV+nD>mX^PPRg}B)b9}FfF(cSQl^V?=%i8vkskVxeS@GG#E^7jBqg-k-O zRsB?}O#a&1;e44rhu6_|bm-s{>pS07VdO7_)kU-GhG%ZJ1(>&WUmLw-L#nx{@m`TmBPSx&#!bII z?7zp8QHJ?>j{VRbY(prn3Oa+%lkLQvQjOPq4XpZHu`Q&%K@BMPI*-UK6{osd~C6XLM4T=`fI?BW=__v*M;k*YU9Z zQ^Kvkt@5L8eUBrJl9TOEZ}&pje@dJgRIR>HCdI|U$fO;PuYVfN-rTxoFI@1bf}+bG zs0ELLld$VA;@Xf9cKLgLc2YVtewa2o`+1`0C+mBreJvoXca}^8?ltw>G#dSO zr%gv1DG|$k@ArGTKXxjAv@NQ`^h}xP$KI_a*1w1z0X_b?)a+*02Nxgeo5Llafg0R2 zSL}zs6Y@71q(#5G3=iu4Xik6A8bbXw{*w4r=be9E?tI{?E`5CfVe=^3yk?lD^>EU{ z{SlwVlVM=t15KVDs^wxBLz~tY%hBJr;+QWemud!{;GXvzzo;(jRLNjcm1kaAMF>{2 z@ZNX*x$-^3P&8vY_L_`ZwlDVM8F+g);(h9kz^cp2zAWrHn}!0tFIlPFvUWc~C0rFF zqANqeP?nPX+J^X#s}eeebCq6n>}fB)3N5|BSaEG+#pS;C%FP^~h2N4;w6LBxa7h;m zU?LsQ!7AF$37*v^$_W}v)==Q4HP6cGH{Lw(2uapZh=E^gY3oVAmnr>VX+|%Kk|C5e zw(WDb9u%!%}QWs}+iPc(Q+H-ZSjgD{l9r)3mk!E_S_!kDBDiGEC z_}+

AH3yJ*0*r>6e4?d0|TLoWJfzyb+fB`HJR8wmuL;r9uss;Y08Og8s}~3TL)8 zb*Asytb!QsKi2La$k2bdN&Jti3#NWxZ7;E^w(wXjgdfMfdw7Qk0|GS_Vq zDQe%qZE9x|`d?iYQ2@i>U~;|FHl28IpCMRi4W_97&h=X>%gSGk!kTg@Ro6)gE(W<@Tu@3GMb})*|}LpmY**czdzpqMvJWx|Hl? z&x5(baz-A77f|O3h2VDIfycz%$&zH@Ixl_R(YR}>YERQt4Y&DY;1Yq7nbU%yc=*WSN!LV(_lyEx}R& zXRCi6?XcmWKbpv+edbntB*phTcCo&zf8^If8Fqw}Ljft#yC&skZnF$BY{JhHevTyXuvh%n8$g=7@WxdTO zUBC8v$B*6apTVs>ois;}sh#@YFhEsQs<6*cPX!baq3A3_-yU|p$UeTfrKdCaXLpjz zd|GyPaoU(VjiGz0r%x3%sE*FRdd0(&i5S6@3;`7Y zp@&B$3u@PiYIQuU;htL%#W@Ta60dtyzt`h|S=2HeBrP=PUT6kd7%69Z?F$M!aM=L| zsR6SV4EmQfEJV<0?<)j-ut+dttY5FOxT^7JUO>?a^IiKoM{r9Z>88$xMAR1m0VkRH zirlu!9>ey4C&5Uu%Hk1B1$f_9VmX&s!T>NC2}$4!9;W7fEQG%U&?G(0>1dswz#-Ph z7snrmtfav0$T9ES|7-0^^d32Zd9)fLO z!4$T4jQJv_sz0lJu{qB%Dn_0rHfUwSQlxAH8#sHXXrCL8-jqemo2 z75BH3mlZGYZ3h5B$#HPL9u=J7;DpVvLs!dr9jFkh(@75QGXgtimNG$^*TrA?DwjPF zGk$J^k1#xqbb8imx|jX=(Hiz=Sp#f2-b(I$Q2hgr$8^#AEx7Xj$F1Bv(yr~aj5mMH z)zFu-2MYB+E{Qg@%swX%sLihtb zmA8Ly|0=FX=uX&n)8DY=cxw|iRa!HDTZM>G7gjW}^!78qq~(jf$0c}o<-pD2;n~+n z$K9)LbHvLj3-P7T^7|IkMiKBZChTj`PQI-Y<}Rnf!DfV|)|unR^PCz(o?l6w@soUS zQN>_g6JBQ5I5pW3DvCg53t?7U1{HS$6pX*b*mgMoh~RwcGw*5QN8O$tsh!FWFh`O{ zH}v2qW7U5RbaLW9|MI6=enC_zmx&Cwb7&mKj`FcYzFTijd|AL3tJ+^NzYWwU>pit_ z{gdAY_78M8_eo+FUfeY&{VC4Vk*@zc?AEj#xjh2*WIB6?M2Ja<&Ylzejh?rOdIwN| zA+Xm4D~@p+zdB6m*<>bjS_RrH7R@BrEO0UGCF@-~qCmj9o%_Xky%kYYEI+3@1e+K? zt#ZvX1c=-%*E>CEL@aOG|Cuo92;DN%CgE_YNZda9Rg`Rt?MHkc^bl5ajq=Mx(rOD} zRBf%E3qWOn`=t1)v1p%QI<1YetoZ&vV;4h!Fn;pGhRY~EdsEwidzghObU{P~TQVi* zhn0iM9dWl2aU<^&V)Q_^2W=@lrqzl0kP1I@)2Er5N7yxSm#hAchA|h2VyBQ>399!opv|T&LH&nk!yNb5mFet9j{HW?5KO8J+R%_2Yd*(>(-<4 zcbnQ6uLHfn6j5sxf>`-s{B?|+)`h&8q)%TK*@Xn?SD7)&T3Ls$NpDpuq8V~HFr(WV z(@gs0h6#uCe-||c=YPGGojp;Ts1_qeZe^-1#ny$wIF0IWn|&C9%AS0x+sU_jx&F(J zRu%qlOMK;5nzw#Rane;H`BrXubg}iUrcv2b<0V|$=N7>-f9L<-7Y_Y1Q;_vxYyq`Q zQjEdHoa)}w*GEc_i~b*#D55^KRPtnXPfpBqd7tCFs!$d#sN~K$r`iQ?9hbLSyzP(* zHrRfpl#eu=)K?jOw?kNLHMQtB%@d2j##NEev`a|W+HCx0x~L3EtLQyTrLAa;w0{3J zj~LrW@7ia|q&7L>=|zJ?t-$~ES-T|9x;-aM`=~H0ZhcQek~W;34?EK;$bOqy@j_aV zSPM0sVIaE^ZDYvrNUqOg{NXjht-xS9J;dL{dc*Q1d5zuS`NYC+OwYTX|C6k^*sEG8 z_0`yd2Bo2C3y0O_Yw-v4$KAJw*`9RgLC92QZ-z1V6KC_C6rKDdSy%s_F25kwXNYDN5uOZR9e6Xxr<`C z#cp$e1gO;=aY}Zl$)mAT3kj)wVQ7DIy2;=xhM`;~AHJivhr5 zi93rKLXJN2n#m_Fx84@-Dm6Q8g{A8+0`i`pC48D>_kQOlWg|DG?pl4iD%4`asT2$>v7LJ_2=clkay7)ei)*ql#u}EWp5+`*WR@?sHWgP-K$t;>Z?6gzV{Zd?$Ap z$ubu*DezO__!iL^ALdtalbf42z+!F zK0#&>tkm+o@~X&m!x<=vAB(iS;UGsnl0hha&rSuzK+?i-deon)L#-vlNGKr+49fDJ z+rY{yyi2z|R5Xd54`Gz+ugOPisbw#UtXWy(=8>1)kk^=UC~d2dn0(rN)5r18f>dO_ z)kuDiQg;fIZI_V)@GX2H8B^#QwHy4g`F>_0$;w7Gdg-3nYHpn zns;J5ieN^3LrMTK=-Jj+KdY-KmOqOjKn6&&2`j-UR^4p+s>g^_L28x(Iy0i}mFDjAHob zs`wYZ{sy3%eHyk4A(f6RY9|M#5@oyURG(SD&3EW#!ta>7tTBzJuM^Xn&zBgz1SMM; za^_w?Vm~7;g|uuq$B@JLLH@Nk4I@HK4ZkgO@XAS{84RmAidH`R?~C}~$|;dAxN189 z_30_# zo87tsIfQ!ormvN|p+rS~!^;exIliz@5WbbI1oX{51-=5?);28qCnn${ZA~sS5md@-JbP}%gT2K zV9~Os*YAdkUG%?l{S(%P;k)sgWYOa%ncMbJP7AhKHD#sc;AS(H{j+R+xrNa*-gcJi z)ETSz~!1yUgwf^|H4 zza+aFPEt?N8LB5E&2B3pF)!hiIg~{6xH!~VtJ#1>Pw6r$h@1nr#j+uY8Yh@+{tKO} zBJY=MdhhrxRB+Mj#6}`K)&ilcb{1(gsa+X)C5>7500*n{KDQCPho9L2@-@KN%xsW17zG_2h-fpv{zZ2keAz|yM&X!$$EK5Q&va}3WOMA zNjg%CDZu@Ck5xQa_jFJ`%0dT8muC4WvjLn)V*WdNqGGV?DmrfivdE^xt-2~H5rgiu z_L`WWh4j6lqFiwUqeAgyj{J^ogFO~2dwVEL{+N6%8aP$hIsQ5nJc)rJDc&Eu=O=#@ zK>BEani?-}VV#N&b}bQDrI85g#{VHRy@n2}&iu3rM0QQ*tSo8>iBzs32;D ze`rI;-Jb(l;ld+CEovH0O@-;P`-sy9p61P`?I1_vkb&K2*G$qq;&p|6v zcdz)Fb^_oSg^CzM(?ZUjRW7m*ctkOl3r=kyE0sXb(>DutXAArdZ3Q^?+8GBrBh*m> zidO(Jl)|kbk~p->jgZ%wW-6fz=1rkMHk2yZOi*c@-cOP>fd=WCd#BrbBJ24Vf9o@r z?el<=c6)dn?FgSlw7WBSURbh7rZ4FGe2|V?&mpVT_=)mh$%WwV{p|r*u%RMh9ycnb z)T~5VNh1{enY0$-#Z=Oa^6}4hWW%Sdd~~Duy{CD$;Ul!1b0AW3J?9gh4O0DwfeVX3 z%jtfyd)@M5uwQ8JL#{jXiQUvD@<5TtC&nt~CYz7nN$5|cqebQ%Q{z=RF?9VY=VKiQ zB^0ocu^f;c?{VrGAH@Hz^pD^9yC-b`4HNOJBs~|U)Rmpu=Uc++3p)OwEObuXTU7~n zVGOM1dR%{}yhc4s;7op6{?)@$D;F0`J!{4q-PSRcw6A}FxjEeh3ljH62QQpf+&3D1 zG1vKKPjs)_kNv(+Fe34O>mb@43!gvi{!pNNu1-Xk?6k+iyG}YQ$A)6bx?`i%$_#FS zygE8AUf8uSFJ9jBPc$vdfN^OTNn?(u_O8AjTn zT@p9XJKzncPI-x7$E0&524_XPKrf^8R1x|}7xlep3%NvuO)iz(Er{3Jzz!tnt6Uoj z8=ePMtXDOr%w0Bp|xUt*fu|y$U zVLq5!Lwr^%p9XQY-r={z7#+A%BllK z$z3#V@YvgQj90mUvY>p>CtZfM61XaHNrZvTO&>-1Str{wRgc;Qu@8tG!f}@d@Z|_3 z8&akCED@)tNNjyaS~m?*n|`CS$D%^=sY;IpQW zc;1chXbNIW?JjydvcHzBnl?y0t{oM(roy%_1~TBIh2p9=Ay-hP;MS4GCC?(bT-`C_ zoB7U8X?@q5X(RtQ9~v?e=s=In$@>NPQ5!unC6QWh1jZmB7|}&pw`lglqRW~mXS;wV zIaMXjZy({@d+o}{Ro&COJ9+R;96@4S$%2Y{T?L|~J|V9FPyjpM`4&%l--|wIK|vY~ zd;tCz-X{ss0c|$I`C-%HWpGIqK9}M0Bz@heV(%%+Y4!3Lf}c|L!P7?$Nyq)83(n}h z0di>d#(%&9W>y`96Y(Jy_<(wqC;&es!EqU9Q39V%)=mC~ZmmyODuZeUAAy?da-*jx zKvmq@CgSR7ipewHLvq%Cc>JEEpC0ZPoJdvLmL>S)7_o zegfR3n#iC2haPO1!tmvLL#|{f366!Y19RF;J4yG$=*QGmsL8MFgoT9y80v1&av$`Zo1X=h>{3!$AgLhNE%Xs`TuEt8eg^nbpOeF3*+{cG zTiXK`%KQ@%Zt8c2x!hMTPf+()Yw(YPfvYw#lC>4IqAfuA>#1c6`9%fFc~sK6y#00G zo9K1ZiknoqL*DWCliSm=%o>N}4=4@|W~KSb%38nf`_8g00_I5h0#Lf{F^Cb8$F3J< zo#i^pyEF$w#3>z{=0bJh?YN$4+xR2f*Cx_R8h%lM!+e2ZvhdBTx27zE{_MBxcfoDD z<8<{X6tRvW+7U1|6@%iq&pVk=(l$}j?Y@CZN8^S;_RY!E3ooRE5XfX|2CPlUE6C(F zQlOVN=a4)(VA%w8AFhTSt%dM6%t-`XxwGvS*GH4F8}aOD8jo)r!IgT1)=jrsx6 z2rEY(UJ%;UXgUodEKL3K1=r*aB-VF0M}SvbUPGELPo*B}*a6QX4pA4)ywBg6n)aCv zrd$0mNPyzt^)fpBRFVrR=5+Tj{|U@}U61HOA5G0VDL16512KRlM4Kuq_dOyxcN+Bj zEPuP;4w0XdwjJP4*Ln63c*wLX9|iV1e-Acb;|4Sq**rbgJ09wW{}|RS9SQ@)0XEsc zhxe#?K#^V^+#b#)E(B;Do8b7XFS|8wT@eIys8caxz|OLWM&HeclZ3m0@6L4THB4~u zxOxgHpJQBGnX)<%w|6{you;y@!};Xn*F48ZOe2nK*BysBEX9UG>}5EDJP*SZnr+V9 zaLCfq&0$xt)S9F(Ez!}mx=9X1-l*6@J|w|BShO}?M~O}`XEhymghob~Q9GprWwPR6 zqHk?hrib|At%9S>Gvq2QDmY_e_oYuYv*P0HIWVsNB=6HnhO z$F?A7mW8rdF*D@&S_TBuwB~Gno`dz_JuML`8(a86pM$Tkwm#K{DXr1!?XlrJ5y_+8 ze2+DZZk_&={hmlR7zYw1R~@62WeHFB?CeO!=vHuTDagJl4+E82{JPvW%gK7fG3ZDp z89nBHaYY&f|uh*6@YP&f79N+>3*o<%dw;k%(!tPq645 zIv`TiCmL&I&iXWquP5K@&}}&P(Cr0#z7eYFjUs^#QbDj7Lkz^7Re@t@P;EUzUP$=y zj5oh)_miPmRD-@hegq`GpNK45q+2XE7V3HgB0GGPNh(9Fzydm0r1T?i&R%F*aaq%C z-e}%mdBEE~o5GcsdmNfZB9wH*0?r2uCReLHmU}GgIOw}W&20#k0{P6R;SwZwR>R95 zP};BdI$4*7JG%|G6ZGnH=iC!w4sx3Sn!UO2Q>Gcs5bQ`bgkyP?%6PKC7pVTOq|(w%tdb8G5j4~5VAb>P-L>`iEzdXo zIb`g}+1_<;^F`WD6fYvT0A(C%sl;qr;1jJrCZ9r|+ys+-EcVu3*RPJWfyie@AK4UJ zIOnH~(NyuZj^s9*?lopj)MUhI?UYroJl+04#}~qT?P+0_zdx5eUyS1y??9z74u>8f zfp$0Dx6Y7lBoo7ZKEz!yP=Rvb7z}gmfos;3vZ?*{F%{fRN$kLvs%9>F%N`DZ{jT@_ z4$TRo3O%Ue~=t0x68e>ajtkMnyH! zKM}a9TYYEh*0(Ij^T&bN!c3`hoD>V()S_X~QB9_4=#~2IsVqaETl;TO6ez(N)h^^{5H^+7^^V(ft< zB5aXFCGCD+#(M?>xE+^RYH@kXg}8B*Im{Fuz@{NHTReNkBB6vYP&>d9C zzCf5`W*p4jy%pvzNEEl}ZQsjAE%SyFeL8Uq?>DU`4_=a&UMa8L%7&=_kP`Yja0(&W z?G;cqu3u2R6cf!qPoZ(z9DdW$#~ikaZkI0z#fPaidf2B2%&7pM*_e5 zq;1*qJIIu#D?k5DRxdS zw&l5eJ}tE4+n1Kd9k3UZ{8Evqxe1@AY_1o%U(x+4KQEApnR>}ek=s?~C(B2}qGuE9 zUu|H;wKM!e)NL3CKV{>`ll2PTPjb6B+uAm@)xNG=*@d1e7LQR+_mazyAo43$jU7o2 zrs5EVnw(bS4L>X!Wd4ysZ5x>@!fbULR^Ko5(MlSdDfQf43z%L*ar%`A%ip3}Pg>A0 z(QPs6>)jAkjPba~Tlwk`X+KeWjc;XBUc>L5*dajS2hxI%aftjdh@ZzwV!0Rd^rZHo#9sV;GmI09)o4Oqn63S9IeJ?ekq{{1=UM|hUInr zm>DMhz|Hs82t?zl!yq}9jj6PD!9fk&-L=XTrg(?01NkK`){(>Q5x$s0xx2NS9ej` zQ0k6J@9Adf<^xA~{GW9SaAJads=R&3fSj13FJIh@`Ozq1$>@EYoi|VYf%Y_+Y{yfMt%Ub zWGfjM84*Az-nBYs{??*eWnmG2n+iw*(4L)R$_=)89=~}2(_;sSpV|1CP$t>Pu ze+ht44)qe2YyBQz;2UFzCrZt`RtFjCm` zB;ho20G*OXt=!+dp%lYP^)EgnACSp_5(>gOXZuE)Xi{?GFUM8GB|X@iiXbNgXhxC6jKom;-T8|inw`ZFZ|e}9yX zAW4I{KJXvYnGfeIq5h%OzipCnt3dARlfSDXo{6n0;(W`%@g6TkQ&O9 zs#Gu4_yxtJp*lGH{kz}2M)4=**>b^)uM5d@L5^mQgb#>qS-}8~!}62ViA>dDi1;h{ z`71h-=?*qilAModAe?XgP-NlFe+Z>?9|r+#)*-lboN~}mS!14K_J*MXg=97Oe#%0= zw4$AUdy0TUIL!N7G@NEPmQpl1t-pfNoLaTCDaTLz7dCno6ouI?tqIgp+|CojJp*V| zj}PA+-J8~TW-v7s?Fb0wE|wvoUoGBKa;Ko>YV*2M%3lwTYCMn%?brfsVR z=E`Ox&VUKGZo^?0_dXRxERfG9G&ypz+!5 z^T)K|UG{!9f!m-e!j4%x;2_Y-quQVHO2ckj`#-mS`!9a%hbepPCVcD{?AdO4?b$f~ z4VlRf-$9c+t3{kUk4|jV!_%2VAi#U()~`UJ3IpqJ2|Z^ zG3aBe)!1X%Rv7aC(E{Lh&*Tf*8`^f|X$}C@hkcbEvH+?9=rG=#Q&V}Wg16yuNk5K) zukVpmORXyx(n7KA0F2&Z#$&8E71`kF{;$$6*Z#@Uvk`h zHid=HrVCnr4C5Lw{^C^ z7$WsCULRm7M#eIX8u->Q=DbpmdADJBdGqm8{tkjDrSzOW@5;~<*fo-k!mPfP@ka4^ zPcKKhpg#r_QV5&!j}rednESNp)dvCYjrnJJKIm2?Vj-Esd}E z4VROu>tgI^_y)|O;L@DUBlZuFD|IVRp)C86h|(PbKM^>LM;6B3pH)zy5>cbCVi4mN61G==vfhwTi8Pihbkb%ni|p~wG*6@DG{pND)whTL`}w;&)>>ljX9TZ?ux?_FQ?FlG_EEIk;fgg6 z@12N#{Qvz;c$-;RQ8|)1E1=ZMv-17*u#mQM4vMYwe!iGTbmr@yh{mEmXc^2^gGFIi zC4tMYe6BTq`wUaZawoE0T&26@cgenr+<;QN(@*`JyX1&ezLR`$-`i_*a$bsLea`u6 z)yWK4LI_qLKlmuWPUN(3J;XP_;k@2klmLGUw{<-1&Ot(|^g+rI1Hat4&L&~$<^1~Gf#u;w}0z)k;-!vTD0{D|VIv07GUK1b?Kn6vjE*^j1 zVgB<%)$jDfbM2S@n~GpK+fMo2L(|1427Hug$eX}B0sABtYG%d$SgOjY=*RW*b;d8| zc$vd;8~@Dwyz98$9yCMtd)^G}IOWO+^eO`JX<{_+#CVQq;Lp0xXJ}`vb@^LtQv=&nO{T-E(&6M@D- zxrC2-`be};h&cbIl|13$&II9_(Zzmr?!ol##q$A+0Fq8f8`66fG7f>iC`NI9>W0R9 zsiR8J#b|a4VSjFtc!#t!P%Mwui=a3{)zSCCLxB>b6}=`ar!kd3F#?b206gLz*Z{Kr zE{R|r^hPIa433*xbuY2+X`v(Ze2+hhMqH# z-NoTV0fd(IPuHm&aE(~bpKZ-Pt+FL)s%{U>l1pq|g2Al!_Z<0?1V6)9#wk_5RYx*M z>(DL!2t422vK4x1^49Z*^C4un19V!a1RhtOzb8b@b)VKVea>nfxWzZ8&`6T@eBW#z z{q?QU>`f9ixA)EP78bIAZlW)SRswOy=wf=*d*j-t~GJn9&#} zd*CULp6Lhw`X5%uhfG??UR88jM$gFiw^9tgwaPTut#e1vracYxvT}-5#h%$`=s0T_ z?FHZOm(Pw9;W|hj#M9_SPbV}NGzHS1w^macgwz=!b3hg$c+_yd=Vw7B`pcE@5Ks@K zz&Rgym_}2l)IsVXqa_!+9bhomJ}2($Aa{5KuZie(ZSj^b^&WStiXzGK&n#au92q4Z za95&nx}REmfwTCfZyVF3*)_d)*%sC9a}to{!{LjYv!Z*<4c9=ycUJ}!e7PP0@W%x* z#@uQVLNxqlL}H|`*&i%HbfYYo#eaS~=X}ZeYOPRl5ym{BkvuH)`6I|r43wbnJ3NPh z7M{WT+(?xFbN9-Y{iJKtQEWWg7xrPd&9v>XT4wS|tYAj<=d*2$ct$U8!GG}l2V$c{ zhxOR8zD3r@_rq@OxzyaE%BUK8Y&99>J>mfG?4A;;gMevR7LvR|G#9D{r)F~y1oSJX zNo*8q1?DXC*coMEd*RI6@e$}p5WGh~9wnuAnLNsdzW05oE!~G2L=B>o(Pao#UPT1@ z0G;<74FN?AdB6+)jE>}1W6H+h=%2Z!If*%(uCaF2L-Rk~BO_e_6)`o$)MR;&G)^v%lrZs~&CO=?N@;{3TP zbPJJl&&AJg?K!M*;jKR{i9ncZzn=1%BnL2K_|7@cO=S#XshU&%vC_=xx-U%4^J|Cl7vL!IHRw@3C z3Qn?8QC8YKuR3WE%wVFQZd}(-0)sUl#Ds`Z(N;(h)eK;nFR9QNaAi0j2pOEsk?Vpn zi!c`Pv*yOgSlVjAjN&YUGL~veDVereh9bein&bX(ZT#4e;j~Hx8jX9YpYtiyZ=6ln z(`MzOq){^G@9HPrdzo`EDbaFH^<0_cr~P3^&BY1FsdoeuCiVeB3sAJ{Q1IjO=LKH7 z$J3=H7L5&uB99~M4rOBE5t&F0v^shaB`+|55^@8S!(3DIP(Mmyl?u>s zmj-VV8oQnis6eWRzlesRugZ!Mti$LD>(bH9j!&v);^-;_)bz#Z$6Bl@h~M7RKjhk; zKAa>85IPy9f(%4#;!-cSj-*6a;Sc#I#Eh!z+Tem8H*gbO(X)w8sg$}qKzFs1Ly0od6a7&4q{} zo5(kTrC*>VLLVPI@;nxwsO@D=H8i%e1!#d*pW~n!$tc@1kBr*bOBM!}Ox35@K-pJrc^GE5l~c3hZXmSJWwhVZf+z_4rvWWW)UjjUmydc3XVHy``buU-D_K? zg}IPqCAoBk=#UK^!7FQtzZhm)zMofQF?T|~-EUrJWurlwy;`@( zmzF0PhKxtpk-bGoHd6^RTHTG&>bD&-#R@_SAuJAHyf+1}D;uss$NTJ*m%kPym?!;W zz57|QVW}^b6D8WBD0VMtXPddtx-nAQ^4Yp_AN#UEKxDa*q|lUJOZ&aFrdIh@?8s-c z?+XoR;2N>gT-l%b!(%}P)bU}I7VR$Iun2t5eIe>MyH4v`$CkYgcE+9!wfQzMaZ!}2 zc?QHz;6Z8MT;JZzyYE+Z_1gH57E2!q#Ha(u7d1&=$b%Iq5?#j1%vL>9J(EO203Na^ zyI`FVA;XM`6XDG_(UZ0z)=y6RenJ_!+@klJdss)VSyECkKpl}J0oXzst3vUR*p4x{ z#;OixcjO}oh9U5?oOO#gRfxR1Dfb++u3e!FB4lD9h>9M@^hwd?^Xi3ddMR32id-^EA zrn;j(0!wVyIZ;2gQIuv1E>p=|z96;u_-(}lG28Lt3h<7h5o<7Pz}neq=IwuozCtew z|N3!}pMc#AiK@3wyFOgG_~{rpcf25XR-50qk&0$TomkUcvSUypL4-YzQ-?^SQ zz1vbYIpkXvyApVX^4_=Cw7<4#G<&DU&7SGD=R?Jss!o6MEckyI`3bN)f-B5Cta3@Umz-d8H{YXOJZC(W)%11u@0E|4p5=s%H+!lKrxt#n-mL zC|qal)N?`wQ;#8IF$qW^f_4}tOM56}Ov&6yOs4gK+*ZJzj->GRqj3FU8t3;LjuyA# zJdVI|vs|k4xNMu|*jHrO$Ez+iB*jG|;tXQ15i(}3$XMw9maN4fI&P2ATp2y|IQ-|M zxP#aGi%b0cQ75Ok7CocqRugb)BGh(}V_1uU;dC&f+}fJutpcJxq2hk3TE?ozY2c9f zOYERvyY_iaxIE#+V<3yGqsn<>5(-Mo6{nb5)xb_S0=B25%++)ckOnO90yn=5^Tr;y z8i=D-=t!!IdSGlgy|0V$(66{%_R97N2v>@&G!MQ8`=$(s_OLQQ9gqe4s)ohs9%FFD zRf>2R8!ZEL$Q`Nc6V>)%+(XD&{%czF7M;aeF~O62{2wX#$TP3dubZfwi+#EyD(RKl zdz?p#3>MoG?!yNT%`c!Fx}@RqoC>+(_=ie&g#7s?IM27_vzvI> z(V@NR{pdPRjWqy(Mu=Ii73@d$SV++3@0UHycM%syO~FksbAf+97^Gl+k~FL&tlkX$v6hc?fh~WczcM{rLVX#62$?Z@jwujB9tYSVMMn*d8 zBT2O%H~)B*J8FXI&jN3b&gA_S8)|AsMJ1#y*H+os1|PikBO$#1NGP#m*k~1cj&(if zc@c!_pu`3VwR!?aKGQ-j>9mJC=Exh=ZT?<5j?|?4sHk3E+Pxs)qJJZ zLsT^1Yo5J1i*s5EekIoSdWE3=#y53Fg0*U?U|vk7)v%jNj9GNpdbClfwf&P$|0K8Ha92thC2RSwj}&CTv%b|V z=n%TjX38yVn1WYU?2__k4@qTyW$o9e67B?UpPlPLN|rHGe?+oP_>qMW#Le5Gmtmgs zf{{V~Br*V*i9Wh$5#0Qhk_C0>r#w=&I^=LuNKqII%-8zZW8dwvKoCFGS-j6ihl?M~>lj^=-mM!$YjG5vc%pJq$CA#Fc!R7}b@GnSY|NkcAo zn$VTtGci8hn5dna9U(+M{GEOVkQG9N4q>&rvHBSGWaJq~fyuE+HSlG&xEM9XaNai8*1@Sv5+Ijx*q;)Fs ztMOK4c)SW(f#`lk2%DRMQhuL`x8gDPbzw5EhqO0C9kD#!4JZjKIB=9DDvDrt$Y0^N zRUbEWhy~H--y*zXKo!iv_^s87j~IO2z=a$h(G(c~>-`DM&@0jPz0Nf*r>ikysZM3d$9P>IO^(<$UQw{GHm7uQcXOtc%l zBh*KkCQ{gkia-s;O>7#|0GPQo8Hn=XznyKm9&(GaL!!h{sTb+!o=Yfj?OpSlofrR)-Jeg z(sDkIhkr~TZ8U{2WS|$dyuQ6%(UN;530z5|JZQ2Z2DQN>0qcV&L-ZUsv4Of=C}TSoZSd!u2|=HOx@NYVE4%xN&DXf~36!{eL& z2{#YVLGra0`7!hc|AUha8>oYZqmeq@jD=f_ZpV(pI@Q_Y0VG7{U)2X3zzon%Ign8! z2<&kW-~Cf*IH2SYDSXw2bsL8xpQ5mf@aw5&9vDwWe9wmV4b?5JTlmX2P&O6F#I~?8 z2nB1u+ok+c*f8wT@FNN){F@{Gxugs6XZAZ~lrK1|m*)N-w734h=!^CAm|_E++GM&p z4@$0g3#oukSQ8R5+S^@v*+}g6wVL=Q!Gng@nGzvw6a1?hcvt^!5(aL4c7_bl9E?^& zw+$y>xZe>gZJ=9j>zk~D-P0#}UQ&=$qR>A83KI;&LvSolUckW52Qs)!OttC7fVskN zu!>dNG|}yH)MTK+v|Y$I(jN}5dh|+gq!D=-W|_vEq0kCXh#fsgt3*Q2vAjkn39J@1 zJ>M3?0!-T@Qk+B)(a4(bCnxp4YI_voU%fS3qyGIa5j1E0`j=U+XHm0)tX0A3M(JE8 zR|_F(mRJ_5jUbq-CZHuGG3d|OcCeNyU|d$oQ- z%B+fATN};uIIjx6e%KqFxMSUGctLa1@#0SEg;E|%y=10$SBKyH{QS~$8)x%{hpOnE z$)0BaC8jXg1xgvZZ^6a#H?LzDm;MfF*(5@*6c7M({T1rM)DwEu2GBV2&fnFZuzfu$ z04sC3XqjZG6qqu74JuDPUqQ1lCW7Wbr}pS$Qewp70c^`)`Y@XTDy1xj^6MBuQ&{7D zNvQ32jfuGTm;uKAh%P%eH^Zt*aU4>I_keG}w!Dbr)nlKisk>8-zh=)E$e_66Ebr@N z{bHmnReQvha>>=^Yox{B{2^yY4x748zGeIrQs<(!-X;$d+k!|*C7qp}#dEL09uHjg z^x|gM&w1A7cy{q8Ff!%MQ5T7zS`G993hxxXPZyFR;r(z;s3hyQeJRm3ZsQBlP4w)q zYHTrVw-VCS>14Z?6pyE(^SoQr(Y%whDl?mK&oUZBu^zJcAsnn!-kQ$8Wq>Rmf^`82 z(F2W74?ASl5P6OgqCcpm^gtNUj>yV=NLmrH<~=oLq2gbI5fmLY2e2o< zMP-3{m>_{>dh|tF6)f2w+G%*vEPJ-eJcrI4`S{Q>od#P{hYJzDI<;{YZg&m4KPBXK zsg?;(^HB10M=jEb;bgZLonNt}U9>7a)^}C14aeVgPn8aqY^%WKS;rKQpeP^_w!_$G zbD#!tt#u!29i*83Hm$aLGm+mPe@#|pN%xuAT0qcNC??Uxlj^b+YVDK~Y4tPztGKw_HLC{oxi ztWS*2XnnAU#vIW$P&wM{p&eRqEMGlJe-C_rbea1dtov?j*w>yVFNMJ#$1+@w5!iKDPsTV{$whPwCD4B zE`pIro%h`&!{~Q3N*!+vmVz8X$BpgO$e=(eWyj*WTuKMM8R5?Nk>$sPkvc9~8=z(u zalO^uQ7K{25p`qV-s^Fs|EC}$OuJ3vw@=rJ0A1R-3Ns0Glzw z_ldsQ_Y|ooz7$!9;qmWrR$PukN49IZe;>C8Y`FDfn+x7Qb)W1 z=?NM;QWIrFFVO~7H`2qzn1P53il#o1UQtX{U9xWvpJqTmMRjrAJP5 z=;&IlqS!0GY#P!xefa`XQ&$2tdY`;o#wll)*E-4#*2qy)8q%h`Q>SH;8PitIk52+S z4B1??D;?qwx96a$b$|4MC>Ec<-9`}fT4zeG*`|uDPT>1|I-b@@MDMzrzCa=bnv0G2 z>v)$UCgbMpiakF=6Z$)=|11bpwN7PE9k4>tFBxQf-W{JFWPXwzZef=BI0I|kruIa$ zckS#Qe$Hnlg($HEAk1lK-ix06IdxWL7gof&W6lf2xhO`nQqCxpO6ttszxByrH1yxJ zXj2?0HPE@<#osy;@hRwCuW>l;Q2u`A-|AHU5b_|xxB82g?Pn*H@}ZE~pzsM+q!c7c z+9P?`+6j|1WJ80Tznh_9D0n>v(jXpkh?9X&jnTZ0uN6%R3m#~2NRU-YRK-(v9|qvJsMAH5@?HHWLYvW6SK zyqh*=erZY1+s4zS)HQay7&NFwCssz%>#YG)TD9aj07rSeI(gtYrVJ1u8)wz znsLIgYYAYI884xR-ERco0f$DdNN1EwVoBoW;gkk{IE<1nI)jx?>QUV3`_IA*QvrJ1(DZvU*GUIDufVFh#MtqO1tia58|w2 z_V3q(A+8H++S27UotMn$X4rAA*Th=Cl%0>%Zu2N=tH_wmmQM0n=utBa72llp_|sQC zz)B#gOYUxY@dpJ0aJTLx4-V&@&W7 zed8_dfzFJ*>RkzX#k;y~G=ZGLQML{ER`9$A>&^isG$zdP0AnCHFdY@1l6KKQXjuoF z@tPRL1b+<_51s->FEk^a29o%wXv0@{&Z=`x(V7{-1hNL>8}t!oLq&YYkQzVm9A(Fc zU`{A?OfBu_I1E`1n2U*cN%Vm5bz50iyKvyug!v(r(B8F)AmdNp&T!sl8i}vF92IY+ zUTkXP?zXJ`*19k@ke}^Y#PafLclP8gA>n?JX=o&>*$}!Xb2rXVGX`ajK+pV#K2=L> zmW#X_=oKWJE-a1saUPiE^TXHPdV8PIt#{+?mL$j}cDbEnec&@j8I2mXrd}lmhT7M7 zv^62ETii#}sUy-GI}Ni8l|P^7EQ&0OE9^o1UJ0NI3Eg5rC(UW@erjTbM@`Q|5f1Mw zK4`qRd$f8OD}4rZUJE_F1@yK>a`eNK-Y^{EG!phY*a5`MXaHRps(veo&ZcXD&_ z`FHkAA(QSl&xo*=f9px+^1Bpwe=c0Jw!EcSkF+;yPh^hz%w^aJ>t82IP~BV^&-UuLI9#;4S}!B zF(a8cx0XUF?t|I(sJ4^vcS1|O61`K@)e7S8xsQ7q*02RTO`6)@`#;2ec!LB}V z^UZg`Jif6lI*aL6fIh67R#EYcU7-cXJ4Uhld$x}0w|z1n#4@=~H{snN#;Tjdi) zEXj+9vZB{_IY%g~_-~VzDAqJSB^m2@!CcaU9i@+@@_NwJ#Evd(aVzQVQ!yv1TSlA= z|Mi_W_Gc6$44MHK0Veqjh}-T1l6@1WzncKrF(Ly-QZ9S#dQX?&QpoZyBzzfJc<^Ix zF6Z<4r$3;1+>9?^`7lq%_2nG*iJ5EQVa{ah#+#g%%Qe&4y(P{W3*yDWL`R!&X>3Kx z6`o<00m%6tiYlH^i5*OZh|2lv_&DaXJ>V^d%3qmboz=D`+6$Z0_4|5MhA{;C0M@s4 zqJWa5wk5Z_x0|BnsIMxwqec!Bm4xq27w=*2ThV?M&_~k(a zYgk9`_L*%%nq#%%IDS(OPm1>aOeU}z&TCg9ljjnN5GE0s@{|6xb9 zMNp96-&ZFJB3bQrP*tu0b4n|rtnmDObTp5)b|jN%|D)fv8<7+8c~WB&g4)!SOxyAZ zYk5`6T?hE5>Kvqr*0*a1JM&b2LxKAndY2tkItNB?<6fs>EYOQ!VXs*Dc)ePAeR>DjHE zc;h8f$p_Sq?_pNwFO?b*Wu!JPz3+!Pp0P0_z~24PaTm z(j7oFUG45;E|{C>Id26{T5hJmad?pfF=l-xE?qGopcb2my#(g*-cZ#X)lG zx_o5Mk(Dw-BA%}4tN!2Oxxdy|R~}UD5AKTo%qw%n>ct!16kM6F5-D_C*DmJ7l94Ow z4T^2?Vj{x8K}8a6`~C)|T)0iBy7K~a;mgxZ;JI0B<3Vvy82RC zUv*wLxBmYVUQ}I4z`7K&Nk>TPF^H&)bNHcQ5@uD#Czqh&;7tC zOL>}C*2rSh_$wWp60Y*x1Nr0>y_2tqhq39-waRqppSlIUl^Rab`uyl2b1=+mq=N6p zC-2`yTNPOG{1x~4XV$_O7fp5X<+Gzm406JZY=Z>dIAbfWYDge5Z(X=V@+J)Zq|PK; zP)lh#-Cha*73R{cewzS)2aj?Gs3F>aX7_VXRs=sUt$1xx1;z&(W7!+()?w`p2 zXvWu3QiwKNdfwPB!SYeO+UJVUpL^4`7gnQ6x$TxzLIui&V~3uH$W9$mJ3qS=hS4b0 zo_#koT=E9A)U_BopH)_xjw0jeL(xILm(=#w!8}hu3Ezk2m5`{^M_7!pV-%qQ^s^p2 zOhi)@a00=L0Gg(6=E4}}h+Mw1Y_OX6isBncW`r0u9^6pL0@LRXTN$AzOVdr@F7$7R zZN*>ru*NYLnhE!lyr~}GV7)f}!o2)BCDi+)c1{SuIr$`p3aCvA*FH8G^pJ+0I>Ma# z`i)H;gK2FH@(d=~RH7apJwR+gtOjuZ@_|J)r~9Kw--(rEyC}?wfaQ(Z z-27kvL4@-EhCn9We>QGLRFWhN3IgQuAIUk>Joxdxw{o>~=>{2{!?)Yat^ zAx~4uZ)(z0s-2rnF1yJ#=uWU{n`w?O$P*`|uKnu0OSZIU`#`DYJrS2r$5Y(ovSc}< zI+8E?)~MN>30fN{hD>Qadqxe}9W`G%>}Afz#kNzcf~WeAL&|#A-|!lftYMVcuzN}9 zyGE<5PFnF0|8CVsFUH_}J+N>YF;qkC=bpuED8>y3USKIgau|jor(8WDXge9DLCY>~ z=cQ+p(-B5rm2$4pN7o=3HX z5KWVa*UqLg`!^kNw6k3@Kd0MV_>r;nfWYzd+4(DGPp2`jq3 zNj1}JHdU__dd_XRQZ<*aB3-{3rV4>D8)~5mMg_#QtASoo47!a0;^3GGNXXHT?Y0RL z%uf-E3{aa)svS#b;DQob6=^eCJ|YIBM}SiG{_~7f*^7Jx#W30drEw^f4Gl^Dip*go zkV?;nP9o<##nDr!2nQ2w_r$>Y8~jmE*dxIGRdb~I!wNon>|f#WnGL!5R62P?oXPJ4 z;UrID<9EiwV4jcfIDdtIG`!B0b#1pVdu+Oim5ige!#KXPjU#PATh&%I!;+=qFaEOx zUICcmL3R&>2aiZz#4Un5IQND_LWW#*RV3C$tnq{ItT2lrICg1T@=Xa{!_!$)Rfd|(FXn0nK= zqIbc@yL}@TO)%{m^k7k#S>=&)|AYDSx(pI(Wg5yvtF7gK=B810|E$6!G)2PjhUsf1a#{4!s|i z8X%4-I#=vP0HTWV(ujhDB9E~sXLGD8tXD|??bPz>ch z`Uur*az7r@P7d@cK*UL23BFaJF@^zS#4af?kOMkuAL`i3e_a@C5(l&Wy7mR9@F7Gs z1Y9R1`_A#wiPtLma!CrcMuTrYsd3z3a99zj8Mjk=U=*ZLc*}aO;^Xgu30>M++y+l? zP7smm=>+6Zj7&^meu8bg!-#K(?U2!7ks&0Gox+?URltyZIgoPoVTW&R^)o9hEG{|0 zX5O+H$o9@=^FivfY+~pjSUrNWph?O;`pfq^@kmGvHyzXPF9esvbVHwVJx%PO4*UCt zJ0NXW30TJ>62?I8<~j^Q=L_LWNz}#G})9>cr@K0 zTo7+yXGne0UUlCl43pH_pWNb~ev-Bk2aGl=`34v(Tr}_pMQTr(+MW@CCTDk5T^sq3 zDl_Au+Vz1vZ+(Mor8*`Hh7;@R84@f~G2C^#P6~yjlgnIHRaw`IR9u<4ZoN=x}H zxXBcT_epeCyS4m(0)MhYAD7gg`$X#mfzm>|i-qm^K!}jvG+ZhU6-s4Bxee+{l zEYn6$vxKmJnw%)a1@gS9C=gh9rdJ^o%lXGWKtL;rkXPs$sIq}z5!_+&7Urt?B}g2t zyZ!#WJy1Tfi)A}po0jP5^t+jVxE@issqF9lZDr2SCg=y^?3@jzm&LK?+hnBtwb`{R zUP`?5#Q#S06iJ^og+q(sr#uQdv9V}o%HwlVoS%$CYDJaKiJJ{NAQVNFe>4T zz%|N?pMs1VWx2oy0!&X1iMqe;hSV#96hmou%n*pqwZFo2O`_&@Y--PEFPwVPpB7hB zOKv)T`uy7Q65AIoY%p*@SfLqvb>{{@*M z-i#p?-EaQKRmBedZ4X7^+0Q&b93S#zeBS3Gk+iS-Ea;16W;IF0;r5NmTJJRCAsVHb z?x3XnbnEwZ<$HzI(^PEU@;_iEwCUQ}pK=porLcLC+U!LpMxED*A3eFEX3ln&+B-*b zDF3+?Nb)p`$M@_wmK+4@87c*=7u*-$7w`x?OR@I3W$V4G9d&1D}ras zqIsbXQp%1=W%|$|yzOd0D!enMgeeh2{qy%(zlKnC4waa%K|@8#g<^Z&T{WCHgLm0s z4teUi`zFMu8u$v2Py~cjVj@-;zviD&8Hl`f=xj*2ufejvg4B>58>U!ChvSw?S21bR zUTwm9)SgrpZ`CL9YEfy=HOkMux{k~d406}+Yg-c9O^R}Io&GHGN$jme*h2PRBAbo@ z<(29fwJyNn@R&b+h3|JG?f6=5`gR2yrM|NFqON(iVRWf_YDI;Bqc~?pWr*B^>$O%k zMQ!zq45h&=M79@7_T?w8QD8Ju;#JO!IJWslxA}KO0g^X17iUYguW_VmHmt!YXGps{ zbOlw@4IZ77eqXW-1|H`U?tUJT@jqD2f&E%Cs-RpA-TAB!6_zf}EH9&>;as1hYaLz( zD}dZCU|=4^L9q5n*1_svW6b}-caTsFBP_^hWm|9ZcZq=PO{(O8k62U*-eX;Z&KVC? z5!@`oP?MMqMs$~Q_0LCnG1CMl+b`0nrMY}jLQM#+2LC;VdU;0i*l#mz0{U^8A^^rn z9Af5ruW|IV3nnN`4}JUguu4qS3#;ORk`=Q&0_j4XQ#j1FQ&ZFc#}_jQI6oDBN$U! zbsb~B9gY!mLIG|w)I5Okd5n&_}LK-5K*t^*cmRT3m|KqOrhn!9sivLFrAq*xR*d1Pyhymiw{$gfz)8< zkLuC$3}34~Fg&P3tdv!C{p@Lhe$ayXXN4wb$)-F-W+w9=JXU?b1u6Cw!;&C|XL-?O z9m@(?q50phuuy&&!XlUdYyXdWg;ZXtFGE(p<4ff|dUuqF$$M=&;u?2^#CX)$(OpR1 zhY2P+*`vz$Fr$7i8F&oyPgInTF)?0~Eiqv#)RaRpQ2YW4`DXmuYoKDs52XxOQLn|4=?)&`<1- zN*OomHW1n^yk*42w};SBv7j>g)DT-?mj14NLx?^=+3a{iu)@Qj4kr(0b9CMPo5ug; zFZybaFm#9TerDhHxMJ0rpk>-UbhmNr!S7DJS4ix>f5DrqDVH_e=%2Vm=QJp`cq(x< zYx;4FvE!M`d9mu{7Cx)j?wwp#0u6X8JY=BAt`VM+e(B!=I{1t&@&Q>!I#`xVg5(Yv z=7LF~U@#Ijjq^!1!nDT>=WXM;ifLNE)eC+N63V;-NUR{)_sq`c?XFOY%lafNx%~JUq8ln*gl9MpJcP5qPA z)HE2qCh;svYTVy_BAdQGE;>8DL;5@UJaJB=|#gn0jt;GRVkZ}!@Dg%4fHctK` zC~h5Mt`Si!w(u6{;UE+UwCqps?NLriw3e?_tM4`hY?7Rop0oIIB<>?KC7M!F%*{;K zqVb#Lw(WMv`1mtMWS6vlSh+`Lku90oQqk&uSfwa;xGplt$?V>q5cf3d4s#NwBs#@N zz?bAqsyg~{A8Tu>%3?yG%B*tALlU*#M6x71LT!oZ8U7m@vmGTOfqIMq@4wE;G#tYI z4F;HtKXFcP#=?*Avg_rK+B3qM@yP>-mCzcr%Y6dQ8LJX4hFU59+>=)z9zc5O`DmF->D}p?1UAqcjldFWAEvd3K84uhJHA5who+=4v z!sbWL4t^J!TKm`#T9u`60vsif5<86g;`Sfow8<4nD*r&qTH;vsz3PxPood*CZB>%_KpPI5b4R@F#uNu$pvv3hB#Zom1NXU znmOcfwfS@tJ-9jHqn>-OI0D6Py^ZwjF5_%n`B&=pWr9F+b6?dp(Lx35x{2yW^ruvp6 z30kmCp>kAzGV-M8I!B{+*vNj6Jd1!y*$OPW3jK_e?6V}JoJ;ilum`d9{VLwkM(~dW zHceit?Uwx40b$#NUCxHH5T^W}N(T%K-=U%@VX1KcP-tNTiYXZ+hapa=Z)KTnppo(& zVq?P|HAAZ;4RBTiA>d_DIUTxW+GY?3v0&#GMR^+7a3=Vzf!STOXoJD26i9he41k)f z^v=o@EgCkj5lgI?(a%HyBAITFZj=3dvO@>daR8kZsCr~?1HE&kto8amAJ<5_)pL#n zKg@t%Oo}^&R4h{d2^6~&^tV1m)%!rlsG0J&iiLD`#7P;cNIXI0v4P#$ho6n!8souS z^dGNWB(el5G_XXDc~QUYXfRN8)N?KDboh$Hd*|DS=(eaCb_La@o4@pQX^EhQ`k=U^ z2w_M3dcbXBLY+$$9i=s?hW1KQJd^xhPGYsq0XPj-#utOA0hEFWV02fU8K(+wb5gl8 z@^8qBCXq``eO1Pc*O-7|)(^;}+0Yb_YE@3kE4;D3mYA({Qx5Onr^CF6e?l$7LI@9C z33!cJYM<=!kv3;rBK!a=n&}C0qiWfn)MIbnv?`LU-`%s%mKJ$8Ps-8f{r%9@DAr zn6dd5D5#p^^$*`1h`0T7M=1H9U@(EAy^uroRty&X{d1s4iiB2} z#y6JzOh|KDcjdviZ*AQrOMTuyuzT#`*R|i?Uc!&fc+9t&GmUSlm6wOz8@}X!K;`L4H6-P zl1ipBjGDnAR-Fe8Gku=SZOz|`)9GhkC^a72(xSDt34@XYq%0r)aGDqp6HaE(9S-rc z?+o{|zGrRAuQTiwg zNAD_UMU~J8HIy7zzlGiPev9NRDk9oUz4?^4hNVGi-BC`z1_e_f57ZAbO_UFeZ0wXe zzm!ln+x$;YyGEg(g8cvEX-7XGk4cvq3wK$`;qizCqvkiUzaDkMw<0g}Agbq2NAEZ;uv5~Xk(>o9K4r2LVjoiK}|$bD{#Lfsg~AT>P8?$(cBzKuL` z!;2D4f156`fsQMcV4U|0nOrfB@QT@w0nsitl;@o&bR2!0>Z7=n{!oXs6?`^5Y&v&A zSKBNrO0+a{H?)Vehf_eMe@$NOzB?}ETdX*#%x3VEQRvs?D-dh^)nu9?n*+B0rVP5F z+64P~BBA?gvAUwZl<|7=SW36BI7fbBn1vNcStxw;RmY3sFT7c@|2;wne?Mh z6;N@E7~LyzM~91PVXefp5p#xvhieIA%&@J=W^$CN8!v_=!Ir?VnjjpMFn!n>eD)2) z`(gsH!B)hIXD$DcTDO1{^#J$+9{9oInqBDeQn%UX)nsh)u&1Ndjmppl2E8n=i0WaY zsF-J@G`rwjll-wYAh!a^%uk|8nJMI;+L9sMm{^Z=&t zQlb`F6G6j;sXNO4rq8OH!jTDSfDST6NfsAW;&P!sFxsv`BTt-Hs&_aqe{S>{%3fM@ z`UdZyI;Yl6^MKx>t#^!pIf2Jx*BlZ(qg)VQ_4d}sf?%)Ze1%q~g&6Qz?%Bs@41`b zbzj8gm7pXwqswF^6tfR_*svFh=NbJ`%%Z64KFWz`HR}wSgnab%tkXTL z$%aad_VFyVMwB8>Y1hsaM=4d10(niOK6-8IBajl#k!%w)a|@EjnTJBRE$F(sW#5hj zworNwJ*&~ksY2ZHkRu{qi^+yRH3SiyUUHd966QrSRpAPq%Qr zf*Jo#(}3x3fjh+aP8v*Wi~G8_Zk@0oBMAy*)EoKbB&54K97ZXbs^74$Ev!jtelz;k zGpiSMvj+bUNm-}PCxh{!BL*-%V>103y7en)a@90@{(Us}-)rkHzoWkDFqJG4u$|H` zF-g1z&9R7&rHVSlV}J(T7DGAMaNDS^3OSI+!^BWt4-5Bs1S)&-8h~%}q2nvEY#n5C z{|8ZT9oOXhh7E%f(kUU`DBaDZm6`|&BHakmNHdY{PJt;Y4T92)Mp_!AySuhAcE9`n zp67kvf3JI=ZJ+Bt>pHLVIF2d=fcpzQfdN;}Kar9amk$U$U-4QE1$XPI(Z^Ekee=tI zCi5Q;#!_m~=0$9=7zkZbYq}zAUg+a$>|y4#z-v8{)Nal20t2B+=106xWyFfAc=bU* z&x3U0ne~5M7<&Z}OI&LLH}zOkLhHBkZ@A*q3rIGi10ejS-plDPl3@oOffQqm%zWcx z<41e09C)q+`N}fA0yB+DymvFqggOcTs~wwvWPN*qHVI9l`>vCefu=VFw16)l8wjry zo5(xgID73XBW$PthMFuWA8KPNtz=@Y?bsvm4I)+&+tLPe`FClc%KTG8vEo1W;|mxo z*?*qja?1)V=Hg>8-;_^;QXT)>rOE%s8c#M)^DX75%HPua?chyd29OtoXaP{b9QN7v zbl

)?2lk%w+De%7`>P_Oe&+NW_2PlaR1CXlXH&snQ?+5T7u6CQi+w?7(mx3|no! zl^?$ZZq;9y?>Aqgp}Wn8O93Y`yZNnSB&wRVXM@saa=T9{TwJ%L+6@F=Cd-WPY8ZRz z23I&2eVsgV4%{tz^Y1MCYjcBjmQcP@M8*R%5fmK|`SgCKeCqki_Ln`g+EJ0c68&Yx z7bzl+GA86C((%{{eOH+x&h~#gu4)j^4{%W$HwNGf+@Bj#mVIZ|sDUfmOLKmRK}Y{Z zrbE;nvPufe?Mj#uiS&rNDLjXBFhdsLU$?%i zQY3;l&l?YwHxc-2Z26GrUGoh@rZ1W+AEKx5`V9`Mck|R2H5$_UJsI<#B^so3Nvfn$eW5{hkwu-IH-2TfAl2&mmw5T#lY zp0vTwA8zG8(;4T6EYWCs-^=g>+nMe?BG8SuQh{(u*Dw2|KO6tV9=QpHNSW_h!JjLC zeyldA2uijHkZ4;JdqJi88T>@&Lsw)9`e3?RNWVm9hFum8zkaAbSzX_HN;o{$m7!dv zTe&Ins05~?Ju%KQbMw$WQEjI}qlrSPek)NuVI4mUOVJ9&r_lR8~D`0bjW zaKcAJ+EK$zfThrrTUZ@>ou=RFp6E+gHet*)7=-mkKyDVcd9ERk_Rv(3M;9d(;cY{2 zX#Tf#EUs%5iLi}xLwWQS3hNzxB8*A!uj7x{fz@-Aiag+Pwrh?e(6g?O^1v&u!lF@i zoQ=K>l>VEAV&n0s#fMny?S>1rNlOT+?R*+K71Mc*YFn{) zPuxKy`*~GZD5xhf0W4rkSE+a+HX+s}6mj}*_3SosoIDd50i^@jO~~^wEZr$o^e+)z zb+4WSPqyyk0C8;ic=uKK$4+8?vEV63WBli#`{Cdf#IUP+Ehn<-d}c2EeD1FAto_Rg z0@M#HjL$;<(Qvb2wdTHd3;t)${wj3;@qadEg{VM1FA>RLgZ$O+tC$0{`#&(kpVDH` z{eaj~??qu; zKoNHfV5K(K{&p@W|B)So^)#o(x3n4GKsVEnmH4&A^^`#VMi{U5PPx7g13?;BF71>C zs9lIT`SaQgj8joO`dQ7iUY05O>TbVl3!P$8Qdn*gxGxp0`rwNpkOFtBTQ4QDgU6hM zIeCqj$j;RoS&$W`b9v+>BRWn716na3I9#0MfRFD<9V`rwKXb@Gj$b=FouuL{oRUdx zwwQKUr&Bj8u2J{G^;tSjzo%17#wUK7!KnQ766F&IWTCClg$B{vV1CFZn&$-aCi}Da zS?H<}fTjFH`Bh}pwa^W9NbL2v5s)yz;=+lsDqgNP;=P+-sbI4H?Q=Ml7iK9PgbLJ_ z2iErfUuUJ&jQF3sVmz007NxcEg%_E#x36GI{wsmb(gZdAsJ!Gyq#*SV*;tmDV{c{7 z$2_VW+@24A;W@TlRJgA5pw`cr!l8^u?9INvAMD1`;$)+#{hOpR4YLY6!l6nHO{FMAsgrB^62;hpbq``5L%5t zgSLX|_V}Gi&BCnjF`jCDzc~2C7ljFJOTNR`%ttKWv^tBR6B?6iDp#a>i^*Gf952FF z3=OR%6ma?P=o`PR;R&56_$i5FJt6jdG+S(8v|&j1l`VKL)UelQ;jSpzAbD}E2?~=I*5deTu@&ab?UauM%%Z<1aQ__LVa?lZ?0-kk{^>7#D%^oqu%Pew^iZ$+KHQqp!`l3fgA^@(hO$&jyC0e2`lA`%Q+%AMo zY;WV-M;i~+3U=Fr^)>hr^NrVeW7-+uz+z=UGntzuMArgq_QjI`?`IZ z+4CluHXUb!aA9okcqUpsm=1SnF(Ws(&rP-}xT_p@j6Fl4y8gxqf!%#)Ow3lO$c8oH z0+_l$k)i%aQ(>4jG8Q3}0UE;3*IVMqfVpFc<}nr!VkR~V!-NE<*L7$n2d&OW0h)>% z=ZPC^%#g5#Z;#wTW>xIpdpF6Lju|{Q&NB<+eNo?i&*CcvrVI#{d|DeJTRWTc^6C;gZE{7R%Cg%2XVRl=kCAg+iDTWt$QIF0C@jYC+w#g2+qq+@p`H zC-nCuDQkUJGBENFaGLn4)99C9)@)qwK8^3WCgBLt3?sr{^)xy-2Z6OIad-k28!^8S z%IRBYG$s`Gq(ja6Fu*E>ReE8uV_6Kzz}Xes=Ml^{eJ1ea{VG)|PS@bd&2j!oCb#Em zo+Q_cRGPr|W*%2yQVZ9J(hEA@Zu`oi{NSde6s-}5fp5V9U21`%piCZ>5yS|J$GYz< zZzT2{EdPJA-v3O_9XOOAt`Y4;;`q&EW#dg=1sb?ZI$#8PP1ddno@xk zOXn^U_%RD7SM~3vxiyLbA)WKKAt_2>Wyxtvit@&AzeW{&%z~yPnv|Dc#2nQ2R`M3hrc+A)8!hJXTMw8%=o*`z&udxMlPX()~9<{JO;p~gm ztrjLtHO8Vk9yq4r!f4Sr7MLkXN`^cnBO>GW85w`@MfI-Z2=j!Z$M8Fg+RM*fbU?L= zxbY@clx6{@rJdHLo6Jra{rciPp)*4h$FX`pMH_p@x;g%i_68+;@nUp!+y0`4lo(b= za0E!HfG#)=;PvbOKUL2E-gnZ&j!c_V`m4j6gbwi&$ijP^a@9)6XGvd5!C6=*Ci9k! zP#mtZhWVnf2eHJ%Kp}tQ2F%ale9REN=vv3P|IFe4)HpH!El*t&{BLWdsV{~6mBkIz z3Szm9$omNN-mKk!NjN6uj?TGXpKiB!r&^$F|IlKm6f;H0_Sx=qpr3*TUjpSVQm~1u zRSzx@r^%AOunCkUq}ct!_=R7YCDs~DTL4phO)lkI=e$laV{!jLsBq%H$f2EfKK#l7 z97~~S8ihu_P+D5+8$i=GfM``q*TNjq-u}^7P2=HN_VyvpBE3aDYflEQK4ibRXBwB$ zQxcyD&x<6`Q`|pAFq~SNlzj7)zqen5dJH}F=t9ssgk;~AOE`&_s^FSyRXx4~ra=)x zlMU|H&8I6dKRtH^_gCsO+is8ykzr_2yCF{d^~5XSQmECoCt{pKoT)fK;~K!Z2U3q$ z8yu~hZ&x&b2H>ClD~xQr>8BGS>nw{T0D#nMd#K>uQUtYiR*X<`QxKu z2WWL|U48r$2m21OAI>n%-~Vgou{|c>X*ZtiPr@)f#w2Hj&{!v+9fm~W-$ZHrgC}w& zZnH$s7v(t(`=SE25@F~{l-|ZI_WGBKHF*GGiZWKFvn&%|$_Y_qzX3UUmY_6t+=Q}|m*XidWbPfcaalm0}= zH*};JN`Eqs9Z@rO>S(iytS90yejRwnKx!D=_PPT=2Sj#&zQHOpO`lN>v_EWUZ43U_ z^5(+a^O(&MNC5jJ1)P+x<

e52R9}Q+Wz?T`oJ5m(ZE?X7A+IZU&&iDX2NK(|;*C z`vj+MB`^+pKvnK9u|gv8Ms4M)q6Gv#4h6wX{L};ov-vV}V@BDbRqusZLZLJQX8h)m zU-W)VCWwHh-;kN|H$~pDG(UtWxJ9Y%^{yj7FiTwf+><|J7AMcnkfcdWxJf)rj3C3o zlVNoMjxu+X_-aPVh(dRv0oBgP3)sc^P@*kjX#3}fYaXRlJNd%ByVQ%hiRJYf;MVVZ zX4 znvZ^JZAG#KhiRJ#3}*-!E>C#AV&%9kg)r}<#zhWi=<3bf)m#QMjy;ICZ-#Qfis_H} z-VUL{iM%FFP=ka}Kge}4 z1qS^YdgEk+xOn{2VZGq99a;c6jy?m+jzEQATZ5_Z1!0VB34}Ff?doqaZsKpkyIALV zG@bw>3rDpcy&mz4zx6cx!MJNz-MKD{qJ>5>i{({3w_tFAp+ zzaHnSX;L1O-_%xH_gRJT@O}Hrk^l!WZiC4Ejef%hJp@eT0k`LuLf`yi*d=+HgRK_H z-;om)wA{o#wuldR6OH~<@&ADmSJ0zh|f_PPtNEEt&D2H zS!cDOQhuPE4=@mM$dUfei#DOz^-Y#1HQSVs)Dyez!Z?|DwmS#O;nqw8`E zeB%6=B`SclR*iN4b_O%A*H+wHqV$SNI{~dQq1ca+gJrw*p~Cjfn~PYgZFIwm0`src zp)@>kOeEf?Pk7>@Fd|MEH7Q2xM-SJaG;g45^iyKl4EK9+>58WH&(_qCJA(ngj^>+H zHhCM7$je~yi)T~KC=x=2vy&`CC{4lmeW#Gm0MlgilqYrqH#nQ!`*0>PEzXTq0L_N+ zT%KfS^CuM_*))Vu-Qk2of4f4Xh`s+M%>LM+Z(x)UysJU_rl&nMRD6VJzkzl2)H>fD zA#^S*S(_fp?T*~*A7g?R7pgQrSUsZsD#aDi(|Ye|GaR8-pUYcOxFllTj|aDxqZTyb zb =c)FsHA_aKQ2RX|h*E;=*+c*D3ov5?XFYM_62iaFMPM(IZc&zyCa&~^I+6p%J zM?C&dO@1m3X3M6LD0f2_R{RI~%gOe9(iXoL@^(0M2EFjpK66RN^BMAmPm$L4N356| zkXkJ^kA6v9%r;aQA$HyFbM7+DKZ#S?kC`u}Fo0a=%y=v^`6vT&P50wn)d2Juu!2`d zlhNGw!FdWpHh&0V|0=3!fF}lfX*{?umgCAJ-di=S?o%(jj|UV{dmLqY^^#t1_efq| zmsZLgR>nPp{I=?uX+3Q(m6l;V7*7>dbLIbX(KMSQ=2IPbc|Dh$K|wEJCC!bN#*V+~ z9v`mhcywauR{YEA=G0k|)s57_9DDMhTg?PJqd2NLsGKD$B>K z)e>(fzq61#74&V}$3!9E&b&;&Ccn}sf#8GC*;A@L>4ZPw?qP#ass1wq_PlH2KQsVo zAN)>tuXcdhr&8Ih^;0|lyA}g2k8fwgtMA_a>q+@D$dgyJe>AYQR=wO>{IT^$)b8l( zGdX&fUn5B(54XJlvEZJM&JMTO$tsu8eClzt(l; zUc6jyFVx>Pwl zo9s!pwQ-`(kW7Z?Q`|$=f+eX?d)_T`3@ZPc$O&V7!IbTcLNfLZ{I@n(m1JEAer;@47rt{I0sr;}Xjh{4=MMM2!4l(PQETc(% zK~Oze?FjR|^XioKizR>;^{^Ob?0snMv1=O1fPTh8Vd&ONCY2^C7QEp{+&v>JLH&?+ zEnNPA;`?^ZO-B=yNjgR$QGEFEs9018?M@8}pB1&{DlXVVh84UZD$Vw90ZOjMtY4y? z{trXr`}TnH;wo5hZLM=oHzCUXO>Lz$yi=8p|1D`Of0X(J%Wv2(13DyP_iK^w;A{M8 zbT3duu*rF7o9T#0#jTy@AOD1f5(NqknOE>he`sQe-^hymnet`kz^xcYW;dP@XK(v_ z(DdcyXY)qux+!>GdY1Hh9#+lf05~ne$mSmlFmS~(DWul*-5HP@%1BNCdncuOx$UYZ zcadpruPElgo}aV>*zqXObwLojhL|vS!{NcOq?5h_3HV+yj;iOCt+Gr4p0q4_T2F6?h7w=pCkY4;-DdkXu(ncGGae>EXkN$h6}~j2WT>`ZNse2;BT4| zd0`^x@t9?JYJZ|9`vbkXk48epno6_0-y@Jhn_o98wsTnZ`5!>BQLs|r=43|2MexnD zKh2Ky12#vCt~{N)C0)Du$Gii~o^iTY%idrv1p)2MXhL8w31~Au=nD?oZgHw{H+poy!sS8R5P*@9tVC>zS`zx^#S;wN z01kpX#L|+Nx_&`-H!9UY>f9pE=8S;^$ueb|OM=>O<6QhT}YFlvqt~cdtsi!2#)zW>m+*bG*rgZf>KuH6+z@KQx`l_J(xQI z^8TmYXiVj6TU77M$#0gM-{271;8z`?!svLxC{c4kFU8mO8EqH^wx9zL@>g<-6qwnN z%%EUN;r5S*5$`v-tcwBLCI||D9sfJpal$+a(Bp(Oj7>mSzXMnxji+cTTGhvTA^b_0 z1KnqBexKL>*vxpZ&LUi|v3B=#DagOBuswl`<+8-Z(5lL-mh z+>c@ra_pP)MMbZ(5Tb&Qq2@rM@z|GbY#^>!1V z+T+NgHH#p#wC?=IVawBGtI+i@-q2_gAAe&9tV#54^geyH-c-@$v~_n&(`cmIh*x@a9Awn^vPsO35oo9@3`SK zdpEV!Fr|C>ai8u>Nui8o3gW1K+b9Wcc>jTht2}-*v%`0aQ?Hf#`r2;iE7!mcCcWrkIZa4O~tt+k#sKun1kiU_k z+JH7aHLJ|Zr=D+er}`J}t)xpn7LA0C!(Fc+_!a0u)WE4qG(Z2ARyY z5{xiKN)!yD9ZjgEh)_}mP|_Jg!)pwKE@ z1a0rMoiW*{0av#6Ve#;|j z`iz1Du*@&9j=siNjUDog_=U_ZXyX$FH=rkO8j%cveaVrnAUL?8mtf+VG+X&O;{({e zOKcjiU%fH8*I*uSSZJ17abZ$+HPAM^>P@EoTS%pyl{Pyhw&dDtKew@GfBhZMqladW zzev3DYr29!!XS;TPhLqsT9os5S2AD#`wzHcj&%L;U-F)y{5KGZ2Fx=w1coL1CGZPRBQ1^Iw z6%(jt#xX%^7dJkVx&Y@{~;;e&$!jxMDa94t+{}WWi?nlwM?nagVga zW8@`|R!1aDs^`Vyh9pp+Zsi;G;Ja=6<1nJ%dl6Ix&E4W}X#*nIs>ujCI4Ia_l+Mh3 z%k*12w7ZxJ#8Y4V)(jW$dAv4clo0>N%B$t;O9a`xJFf>eanGtTrUuG;re!d{?qKyr zZpy^$>Aw)y@JX{K3+$(E$G-@H`tjMpA|IaNj8ox1^JFN@!RDnNFZO_vI|4`ZN_B}r zX^P&|LUfK195q{}k=h(BsFlJ0ny|!pOzt+Yb1^nRFXK;x@xEj!Ij**okQ0mB`V%Vn`!IkM!x8aOQE062#;pO&TIej5D}>$ z1n#HUD)O9~R=iuz$*{vmysyNydQ*Rt285$`p^%K*5}n)T*d2F9NzBWnH4lsqG<>nH zJg24mmvSobY9cT@ zPtoBgOBfx~ft^Y0@wqkKj7s5O9wL)1>2_OPvz=EPHKxBx*&vAElajnp`^&>iH4$%q?#!IyIz4GzS7MF{)_N#oy!C z?jI*TjR3y7cF^BH;-!2p8H^}CQEmVJg6-)eS$P8PDWlSL4t2b%OfetQ=DNQm9&B(Y zDjGvjZ^Re1SmAw~0T1pe7Q~m^_hO3pjeH=q(awXKL#e=od5uUEj|-;da5ava>V{!P zAc%pzX;6mX#ij=MQK3d+GL5w9bD8J)LC8U#VynJ@xF|QD6*7;}Yu(0ie6f0QjrXNA zw(*6cL*MQ5BPv4}QFK4;9@^-nq5s@Asv&zw_Q=XWg36Gr40I-+y&z&7BB*@xha5Q` zMv(eV$i7=Wp}=DTf-dwa1Lumr>pN#My#^C0p3)UoYhP}sRn_l~gpVb}+c5`+%MB|<{=r-DZ(9-i zgSH~#A&yQHU-JHYUemnuK}O2c&bb=Hz53iICnQ+SmOJUzbp}%SBWinmf(Jr+djrKH zda@umzB5mQ(_(`VEqhlXX){J6;J-bTUi9(sZMjM|s7vbACkg{#H=R~)7eZ+i_ zuT8z@wCWt;a(cyqOhu1}3g+PReEw2nUTY%O)|H%f7Z*A zdMaUEpzX9&E|6rLeJe_I&|_Wg=VRN=EEh!i_D`A}>nc`lPj{Lg&$&)$_OH*`)-$mR z`A@YlT>8{;p*}qEp(Mew{K4rRztR#Oiskx61d;|_J>2`LMI*F~4`{2T9{HCiU1Ex9 zB8wa^IT}mCZdKQi!)g`cWUzZ5o>T$D@(=sT#4dZ-`vPB){khV{*pSa)#hx#FAEnuH z`cYJiNaMJ|#!a{GpT&GOg2;qkssa~|3oYSnCts}xRZu;+Mj={(v~BD>qnWFTve@q9 znJhw(OYNk>;N8Cl$7m=0gnHhBwuAu2`XoG0^?o~5Zn{vO+IT!#_nroiSgkR49@<9V zm~;81Ikbdt5T-+&M4pc~}bVCR_OBMC*GOG;k>OdCqd%9(gxq z+l5kl{gc}F9y`vEqx9e4VWF^Das7EYpBmihc(q#Ree-FDrV^G^|4iBH^HW`}d((#< zM-x>QE}S}X~_tZ@R}Y2y~|gWd@u61PV3Ig-lo%+K3A<*Jq8Z>3~k0elA1xtHuUo`PaA zkZvC5u~Cz_8##`wui1(2$c>=0aYPMqE!`)Dou<9NZJ%+?2G~Ns1bRey5&;PY0ej!WkcrGpGHfwX+qJAMjMkr8_E6(pSrA_1 z2Hu^^rZSsMe%!d|ENd}@KC0yF^H#sD5n_5T=6G9E0D*iC=;TA#A!+>XRF!{oYkc2_ zq2oN0wn#jC69$1oJ#_Ci=pNR zq1>RPP1dZl#~XT@E#yX0sFZxRHq)+M=^cqeUJ7Q(V=465xTxohgcB7so1_F!J<{pX zqAG)M3j30nO*#X{-cLGhPSS*lfE|O!nHeyzn0jHkd+r2roWyZO#JrVbpRckP&nF2A z&*fIHj73-2XekBL3xj@61AlGm_wUK^cnX^qKhSV%@w+O2i%u_vI@b*OiFcITf3>%;*st(g+q!`!(eM{_3jc*Rd(~n$!o69O&r9DV>_+t9$+lG*YyWdvJER@+)>J zm_e5Tkp)9t#8UUTaJOd?MB{hNgPVArPKdNiXa(LXZ;zQ#CtQE0XPAudk^(I^$GKJ1 z)4tDnVvp>JcRRQN{;uz5T&+wu(Z7-`Ig5Tj#(Fjivh||ota5^{pG-`XYr*__Xv~t zXx&Q=v$D@*U4vuQEp(|-fI11o3vYh9yugb=b;_KKhv%cKL43t^tlNYvIVYBPWc1?C zW1eR>&Q`y!Y7rEFr@+9mx_5F^t>CW-RScp4y|G)T9%xQ(Wz~pdNf%yY6#@A=9 zN;GL9{NFeP@vL5dr?gS>+I`v++(~d>GWyxD0Df%qGQSu#<`M9e&q(mUaQ`_!1wv$~7oh7IW z6MrJ{_+dMEYyHWut%{ls!Zn}6Nwvkr1BEAYx5KM`Ji1lP3`zU83m$*O|8fn}%WAC$ zO7pHK0NG+C-kB3xFK=IOoCrt!YMV5u!gsE5k=w4Rse0ep& zjxDQZ6CLt*zsoLGfncs%MWZ+6)<2KYcPDB<2%8ShmG9O9mY*ocK^`|`u%gPip|ksd z06Q@B`g&*dHB5=aR9k`WxCU4A3(GAihFm=TgZn=lZlIEBenuJru5_Tp3dtA6J^%6)=AhUL?&|yvrw1;4bZ1JdYN~m>nH{ezT zGeY-X%;|~!_;(1Spd{TQ+n2ind0l}%jW{&3XMT;fp#NbWAG~>ugWfC|r<8hZU7ODw z)S#qdx|d5DbgVoz*KlS@VwC+(`0fvZYXu1GrC`vW!-%mGKYGMF!j+J@W+$n1k$xb% z?%ea{PVCWJrhx?pDd*{M=}QK}g`fV{rMi*V$eM_E{mfquYNZ_;VCT13S(E}1B)mJm zKkFSYci_a^;|jGn)0Ho+37^1Kn7h+uJTh|I}P(r<-6P=`v>)C z>a!l*){avNb-<$=KNt31Oxl!S$@xZGn*5xWrW_RK#4Y*NAC{v@{7->|z$*0K!`V1X>L$BUSKjXwX!at-8; zuQL_kLBEo@Hs6ziX{&ol7-lmg%ipG_N}otZ;#}69T~)=mwgdW1wG* zk(rQsG}SSrzfHurI_|0`F?DXBE%_BB0XKHlKznh0P676^9U1SXkL71NU^i=QR?=_O5rJ&HrZRq38NAFjnj_iW%6Aw0 z&2LQKE0|PvF3)V&%D|I3IBkvq5FAOAN7L=tv9~dIW7mLl>9Sgifw&*q@o9fLNAU71 ztlGwP`dPXI>zZ9_quYfgPZr>*-rMlo!QWsD;sf}=+C}r?rN3boI(`yD1_B>m6pv|` zC60{3wWYy})OKH1p$Nr-2O4LqQ1nd88?AN~al%#0H(T$VpV3QOBz>`lGZd;1y)oQ& zUrTmGv_3nq;!?=ku^0ipN^GZP2x>BNwzWbp^_myHWupHJt64RoilBsoy?vjE+BGGI zWkiZzG$$~LK(Uvf#O^DxnjwB!^@%puXnHFQx?a&nUqeoTc)$p#HHp*(qSiyLqTn{D zQmej~iOK%D1PqZps?C?ZQgpAK{H-RX*siG(V2t4{v{Yf2U#JRb*#1NdQA7qNmmbKT z#rOYyv11QLF19KNoOFyk#O<~A#jUeAqb|ePvhnr*UoL<>Zj7L_SYC?Az+)q$)1%}( zNlYPtsW;V+=DYTLE{SL|iE8+`?ahM283Rz~7l*S@n_w8}#r*-7y0^#VK7FxjBZZkT zUcuid;_Hq)sxL*tjn_!^vPN{g0O(DPDW)xvC;7Pef$kafA)aib^~<1Nn69kbqo9i? zZ%A~$;OlqtjZzgXx?k|&rv6!OkxzVizL-tIXe}p=ECX5I!@9!UyV%v(co|VzKW&oh zY7#T_g_Ue;`G0NOfbIHlCt9v+S!3pp!kR2RVJDBYbc;V<+dn=5RT&|IC9YMroe58L zU-)c9D}^<#1ZzC$pt7ArY6uDOw4O|=#F!%>Np*7$58M9h;%9hOxtz5(uFHhCMmRpRMVfOb?X^igxOzt(xgw@x zpj*bEMwZa7-2o$Vf%ny4-v9M4QF%og`xTXox$-qA>mQ6Z;GL|mty`-s;;ly8KuBvV z6j4z&-6u^yCNa(DaLbH&IFyH~)%!S(sd&Bn?duZc!msya`=Lrv6A-eZ=6lIh+zj?G zFiQoWtrDA{%M@8Yj0ciHjcmNR4f~uU)7+^EJVpyezC72>V)VHlD0 zgfIuLDK7O*=FGoAg0%p>dI=-)_O&lW+wEmkb#%?AVHv+@7cpeQ0|`n(_Rr?Jo|i!S`N;ShNrL zxux)?U8i46y=^Hi@bWEhC)>0Ju2+#$Z)J|X#58h^{JW2rTNAww_i66wjghnOz4b|G zp(?ZjmgT50rkh)ZGgg`;Lynj(aYQ;lu9$COp&9Et)BdjMtbSgx!eJHwm2Z40o!?7Jy*&)xnXCwq%c z6V~RmB?mET(~3dnUJlAb+4CqbW=Rm!AGrM}kJHv~QQMGpYQOJ1C#2!H@#KrquN;40 z5aw=`qVE~GDflevW}6Khr%qm)lH1;sQ7hhrDVMmWUhVhj#J%NHY;;-XMqG!zH7b}W zRDZEjQLX%=&xWAjGz*78>}`(q<)e0Mgvt{3Pov+|Mhy_w_>ReuPzWm?4{dh<;^15A%!e!ocuW z+l83NmBq1{;^<%+>mP*k79WrpjC^p)K6IM{jLYga;)B z2hoSrWhIoz-=dpHZQ(f81YzxxKDz_y_%J zGkCZY3_sU!jPQf*Pjwx3VBI+ZD?&|o|8DW2vb0hlaxx!Fy_s`aHZ?7}AfMSR=E}D^ zg>D_;q7otzd{6J~3Ynx6(+Fr(>E<@}mxy@xKP8>$>|ACg%3<$EH^5<<~9Zi0)rHr1ce>koxG2SDLKaj4v| zI%Y~~mPC68O^VKhO{*mIx#T!+mk-tnj-1tp z6ZH3&gPab%ZI5=1(5)L|s+yz>BAYUlU7sOqKfMS%gR!F2j=8U&_7Vo*iP;g~f_S&~)>Wqn%R7n1p z={_3YrYC~r6{*bre(rm6fr!NR`Q?c4#6Jb)eRVq)!FtHWUjdnEou*-{f!7jvSoAji z0jDjg-|?h#{?2s%oaVu|>oE(aXL~B@0oM}#MSTN$!{YzKZak;rxW_r)AsTlAzXIp1 zb<;+@MlpyyWkdI4?l`VqL#Zs;Jjgeu{+~+X+SRa8R@dOk=9$5EVoUu+N~};aX4+5U zY?u9=VwUnk-N(o_$%8k!+@n~jZM0vC-L3v6$K_Akwq=_6J&tV=a=KS(E3vAL?HlY? zlK|&vZF7fjf~DC$V{i0Cx73I>jjr*>Zp4~n{9a7soC7W{KOw?XmzuCH(|v>V-G za()5lKzJ7Y1$~{C;?OJ68F4ofy>|+td)GsroIIHXqZe~)ba(;GvMyR2M6@zzTGooN zXv+J%b@I2dJ{#UZZ)>nrJxq-)eWqjdh!(qXE$oEm2&XEd@0@9Ve)6{tgCEw#bh1tP zQNKbUw0rvTI@D*y5AQAXnn65+AeGx;yUD?9N79FVo}E6BW~=n$doJMD+~6KX(XiMy zdsdb=kBBKh>6csomR!Y;5&3P3XdGwbFMdxvVQ6H9o8fuBLcn%ihCtm*D|)SQ2YKh=THvOWQ##HyRE zH7;mV;);*WJn-(`=O<}t>(BLufApo$?|qgBr?5NSYChl4jNQ`)7!B76gc{IL1~iaj z2QqXhmPXJ5#f#-cv=|A^E5UBNgdc@63w^OP74L4<=3iZ}G~C`K!)Uuz@5ytqWYN8w zbu#-VoIWH24d%g!@T20&u9Mq7VZMyz%b*6(md#(ozZ?yqUhb41Q)qGqxp}nwc`({< z1UjZ4p%|x0dGGhLUgz$Uujy!Dtg_qUSBn2eOa@^m`i zH)~+B${vjHn4-OKSZ-;0cy5r!6Z!^+LHt{f3qtAl+7|ovWI~>>`HOq{&OnzCbPyST zu~+YY6RRpm(FQWf)rQ&2A?IVRjOTA>BUsn=DNY)t&f?puEj*KTH&T9DHL#dV|Hhi` zpLMR`%ohE#&vGX^SpwllVsJ^bR_fW8OH2uZVgAmF&Vmaa)}?X%z5=29ee+AFN$KTt zl1Dn*z8{;28E!NuedFg|tUaS&3i<8(=9rEvjinC2C2>23o{ube~S)5=*4VO zZdbn&5)stOZarhLTZ^F$-i%M+QH@*=bEpKcvyspj;9khCuJrPs)Dbs5@#=nVzMS7? zzlrTsc)+vqm4o-Ed&xaYq4e9JzlE>8l$N(^39Q8?4~DbESkd5@nP!Se*66wKeD_$2 zoXZ;fr&K2U`Yj`Q#w(t6hyV=w1D|W^DD-tX#E}0R+GjIU)=c5J;cD$Vt};e;;E=B7 z0jZSdDb6bAocT)v-e!ijF*%25wn9+H)PtoZG7wHpjRBGOA;>(@LXCTiV(5!*!AHyi zx%%m!Tm=7~$$nO7%c$`CcF#H8cR#&k_?IL!%BhW*=tE^AJu$%VtHMh2Mm@o1&RCaP z33xzfPwv-+=Ag*93*Q~bC2RIlCn*=?(x5@^E5_gBOT@zo@sC>GDX5)~G-p%kb~66< zDUU4(&i>Blp`!ZvUE8$N-j3b;j%llx2fm@WGC5H*{I+wrUA%v3WHI+Eg6Y1{+X-_f z9EIu8jz)ZS)l>#^qUM|*=Bd93A6$x=|MTF`pcClIhs=k{JTyamQzIkX)l|>nzUMrI zJ#@=S-${Kpel3=ygAlyqZ zJ^*}|d8Qyui@mCc7ZcIC#P0X6LeU!TT%i&TQDBqBCo1TKlrS0&T}!heeb#}qeZuTz ziqvvUXDRR(H0iQhpkTGSxoTqFw#FAD-FQN7+p8>`{Z&b4#~4Q^e?5*5zxBIzc7&X2vLc1l$iye3=C&DpEPd~@(Ah0H zUlO55n(5=hS!}ECbp0;O;^he3?b(qT%%*aKm|L6=!VZEJW`z-=-a`Q`!|h@tW4VE^ zec3N@k0_5__CYMoG~^=9=Q@lxee=5t z-Vg~ckt6*}NKKCkhfcU~qfLl@o;*#AhZmMY6t@<6wf{sUe}Gf z5FAw<=o=}`cg|b`7I>h8Vn!zBwHDYX+ggbP1EaF!DBgL2$Z$E{(r|}okKi>1^h7LK zD316X)VfQ(XHpo7dgCu>!W-u$n+n*NnGyZG5Jd` zzu!Gm{^QTX#EW~xz=vyT0s;rFrr_oK=UGW2pM+H`F?EN31?|Lj%s*ger8WfiFA>5| z?`~SiA)Q1IFRBJ!8nA5)xZWECO%D9`$TmSC68xP!FoG@JSVfoOEyt0xWb^g_o~ERt zy2L7u6osz!RNy{QFdfdV%cEYaiuFsL%X!{saaRNbwji%U3_P2>(ZB#n>N9UvhPymI=_J1gzgP4~&BPwo6i8gkp`A=2k8~OB8w!@|a#~ zna9Vt)`X~)h92jD1`ddjQX;=E_=;+ml;?oDZ8wMz(>aamxe{Ch5OLA(EY&sa<0})`<@K zDkD|u9T{ps)Uz7@s;eX>d_WcR92P)|wm2ijrY88YvNA>hbC|W!tSEXrx9b!5)0g`L?1(3TE%qFk!uD&pU+eukp3T=ZjYNX3RF_WPaBygL1+5 z_R{<=mtL}Dc+~d2N7;Mit|2*MR1tBG;ke`vww|2hlZ%CJ-~mx9GJ~>sYnq4l7|d(AXUPTcp*p!zX1?VDOZyj~KiLEr68C z+>ltUfy8%an`xp}GjA7r3$kn>`-`1?ZliHt9Z7*NCtBJ1&FX(Z4gC%rPsM$&P0&_@ zE8II^9MN_96%>;syG2AbW_IN?!rBM*s=P_xS00`A{Np`P|3Yz@GY@uU_7oF#855s> z{c+h~)0DfP*(IPEs?HCi=vI)nXC*K z_>b6O!usriG|Mcv4W!A5PYJSUrpX2RTyM?){`oSDgCMuc`#u7C|al%e{ib?68?zpCW>s#^_XZ ze|=K7wRM5JFI;45L(I5%cfri;_JwpPiW)mBliZ*5nX+=`?GQf?yyl>gM}+}gX89Sb z7-m|f6zmiB_VD?n|B`$%yWVwvPoRXp8=3m6<&plZ`z|vduzI zs|+M$qHfB7Vafn(VW#0VSf$yQFfs#3Bls3Rfq_ z>{e+wOyA3+^>_qf=wZYv{HkpLycGI4f?|owchpK>GYp^E@+;Zk1v(UY2ttDy#&ivL zYbn}(dX%AZ1ebzy*EmNV-{7rJ`HUhU;=q3yO`gs}uONR>$MM~b=mfnJj_V)GCKn3| z_5$gwI7c?dDlJbnFUCYxrzbsoF*8UtWjJ~aYXH#q52n&2s|VJ133FzS`pDmg2QLO( zp%0nqM(v%R_FRhYq!AUMsxYag0#*_5HsNfK6;HKQc@QcO$T+r6glYzSPJKg3%GE0+ zFno&Q6Thb1b>9HE1{TSLWz!`2BOmHB`)@25w)YVzK4FjZV+0{>kYpwvC!GILc!Ilm z;E?i~0b+b;Ge+9N9^IFuR4v~<@>fD_XK)^O9y1VzZCr_@uY&SE(pD0b&%}73eMPhG zX*a)77!!@o3Mx{TkMCe7Rtd`p4)-6M$C$Np7d&k!4ToR_zP);pAHf^;OKKuMLL!3b zzgEWQMq7LaAK6ekD-^-JV9=F5IoPGk6=jN%)S8VDL4Y^9)Y%q!A=U=b`{l-}JRAlx zPS;_gj@!Cf#N3?S@Or!x?FB0y%_zeLEZ%M%@TM$ujkjIeOERN9ptfRdE5G~i|L*5J z6mjIp9GHSK7-@fX;w`;GhNT+@ z0G~y$H|&^YJt<}L-H^sd_RIBNCBWg?-{v>TwX6EXi+%-gBM_oRHx!33%`DpUY*WYd zcnxbyjOi30Pd8sY67!)t=WJn6hvcTv1NCKQ81HL05wMxai;-Oq{_?a|MjYC`U-;zy z=BuHh4}H4d>XgaCNE+o4&MJ}ZG~p?O@c3M}rppeGS)sVI`L^?yBn1?&r{MP$Qtr!- zoR%>HHv0&+Zq(%k`2SkNuZ$h6w%15Cd?vc9|L^-^0x5shT9e0b*Bof(CpbYD8-{U) z>T<*q^^+A+8-benx;0{-4R?2rdA_y%P|tNqe$TfE6V|vvy>waqB;+Hv<)Ac|YjxQ; zB{~2>ejRWGKU=(t@OH}BlUAOR`cmKO>11cnqI}T>=?X%IT>B!->i_e^q5g!`UBUNb zWhzeicYG3h*-uUYfMY1HQRA?BSk4-UM_c}HtJH;yFa3kRK7xxBGH0zw&Z&1x!-~!N z@smYC#RQ!<=5<=BRLw*{_z>$)zpkL~2-8ksZ^Ex>ySHJgC)+oKx~bvcdPnJxe6Yre z)%dhY-^HWG2+xQ;5pi{m5o7uYO)ohm=#4bsQ;` zKa0_n@#9xG@<%Z5ZuRwR*_JQIpG}vLS2=~-VeH$@y(f=5{YoV`-BX1vifE+fVbg=L z!MyiG*M}QAtu+PVWNl==xHiL_Tko<*T4h5cm4}aV(#Cn(b=l&;SUJi5gxv||1sZfR zWniL#AzA{(MACP5uj@@E9Fb3L9dk?F^A<0J`>AH=rlsBu zb;#hV&}|5)*S!)Q2V{!0k{0j*>BG(FKDpUUr{&t})7Ye=tV0s*tJ z+F^E3cFw;C9X_P5)T?j&VT>h z_!e&<231pkAZE%;8j7NMqEIHGyRC@3Ggax^#nT|<0p};>)^>Rhms0iYUC4i) zP|@KHp0eBL8FdDG_GwB0wkWE{#Vk}|= zSGA5kcXP-ls?g(`q_>0VY@?dXBZzfl^yiD)Nq?c?4ul~#;OVNIB}YK|D9d9}>Z?$K z!^--k&Z^d9yr6b5o5-bz<6ogXJ?HHJ+88aYzldKJiI(Wc2e0)&O3+cz^+xLv=Qe*b5@9`kXT6W^4M+e_mX4Db#x^86g zL&$vV^q9)Yyvm;6T`2UX*e$8#x(DsynUjJx%$@vVNIHwp>te?UZeoXfd^$Z1>bM@O znETVO(+lg*NJzs1${N_1X8*wkmY_J2-Yjy!_eoUhO>OKQ#q1=~JSQs{G5$9T__ozI z%C7kA@m9zE6C018r2JO=Q~077xw<@k)wL1{=`u25je*T?rGZsUNs*8L@3-J2yr?`< zMe3mA#~D3qiZrQ}@cq3B{|kp{Pael{LEI4~^{C-XyLEH^CCVgg^{611h*qV?S3ZpY z@tg?WsxmX4lK0y_zw8CSM5;!3Ci2=?)DhVWSWTlzoZdEHb=zO)8VC^MRS>5Zb!SR+ zzdjMjp%ZeNvAN&PCAAX(097cpAjE?kMTbJsgQA*oWeR$^IKmbh=xp9-(8wGEo9$%2 z5KRUvOWyn2C$@n1|Nip*iXkodt&yHK6h4E=mp#lnRX46OZQ>6zf*a7&8NGEg#Y<|P zbz1p8FArR1nXsx3Zx1g_BV&itSD6@53(I4jY+!pfR;@Lry;(6>z_b}nMrfsDtawck za^iLyBq?fFC=#fTcC>gTCP@GgM{>UiJwQ%i56rEuCtVQ33`O>{>$zVk?-^2v?VC@= z$hHv-HAShUlrJ_(S0Vz9_j~w3GJjyq~x06i$4WLqwjF|Q2(?Id!%0i&ZQ~NnCfly z+Y1dI@bX5KLV>GtO(@;xIDTxwN64Pl!MlWoADf+i7FPu<4Idxj&`x%fHgC-!O;X^~ z&B44FY$skZBhz|`S+V2wvbpTm^#P97=8K&Xeg#96fI^r{?dkM5$xte)!we&Mazef(N6*Vkp!@b)&J<^1B=SYz_Ll;|_ptaZW1udk-JIlC{m zL)hsw8m)Wc_k8JV-a?zjEc7pj3Jj6rf~9AK&H%mJK<$gaBCZZYDfXRM>Q|;Yp-C-e zb9A^iKDo8St9;uN0GL*zQa|SU%yx%jJT+@oj@@(Q^^tNuxWAie_|oOhTMX_91CxK% zOYLsp!jxxqEyo^fVVV_94p4jw3KZslblR-^o^as3{^#3ghNs-;G0y#bhs9b07NQBM z9Kb*`VB8GAKx27D0+)Mm?hvHF+jhl=Y!*h|UWAUinu)1f;_PI;O?zDGW&Db#^qgxf z)-*_3aJc>&Lo?q`pilLweQfk*TdBXI{as^zprX3H;N+tlifv1(MZll$5>bOnLlIxo z+6OlGVIk^-YukhRL7dVzJe^XJyU{@EsX^zX9t;e38I|0Y=^uE*aYXNtH1pkBWUlJ+ z!|^ksU`-!dt6gPX&%n!OE`3$HU@ zxm$|MN}2?1WM=sHXAkrH$@-mu4Ua>M8`6D-lOKm0a-0+wIY&<7?yvb2Hir*^!lP&P zX-W@m5bocn)qIpc*-|?+d|E&J zO%m0~3;R6Cuktjg7@mt}bK#TGce|x2^Q`O49f0+-^-8nT&#PFrQz0Q9Y&{mU!6#jgp z`pax}&GSaPs)I+tTQl4kFYn}5y2Fte<+dbE!tG3$-sNTScSxz*=do=a!mS`7)7bvk zgc?y@C;P5sfd=~~6eX%PV;>*Kd7Y!|h$nPodLs z8w}eE>AlO(Qh0zx=sYdQGf4GJ88o-2mQru&eM z^!Q?cmYH7CjSS>NHrpjiw%Q4OW%UUF*b(>p7nApcO(u@WTkC4~htiP)Q3s-U%MnAG zb+3wDc~OWH06(c!uryOtP5lOO1Iqy7uo)nh&})>qsZZ=(jhTq|r_<2vklL)OA@W$^Yhyfu`@t44H1%%>-UDQE!C)pb=Wd@ zB3Qs-?a#mPn3zK`%)>s9Als2n6R|pFUnS^~&0W|ek%K_<@1mC*70iu3oKj3G%LOx9D&b%Ec1(69_$`Qiv0WgZyu4cvWF^M zHdIc*qQ}4fhM9R2fghj}(Jh4!R*)=zHPvWpHQ|pZI~J45B!91-I~p)D@^#3lzs8&K+^Y{LYB3i=`7^9ov0L$9SPYq>DW&D$rVxa8z*oj70HN5 z!#{nK=@ZG`!fpAdqG;PP`{fMu8n6wXdE$Tidhl9^_1<((CSr~^-s5%{A6yCtZigM2 zW?dFZ=>Jv_9sNO0H;+ zd>Z;V;`2Q(IgOI{znBj*BHg4AVy_YpyVD=`C?M-)!}sb!YZ;+tF$YhvQQgkd(79J7 zX| z)Sc`fbmcpNxXWq}xI$*3G>8PU$MD)rPs#~vYWTd>h58Cdx-q!fZdQYTD5D!Eya5$< zjSjbi+ZPB+q_4s5Y&cw*u}U}))o=HA4tN2Q6_&QVS9XszKGPfeJ^`5zEyEbg3^d?QLA)5d?@vpOZYe(OZhxp|FM~aMK&2m!fQVwY3wIBtI}bNAGOc zXzfw!by27wiy@o$T|=8+_dZ^c%ZZ+*|7%v`od2-H;Iv+ z!&NEPw`Z0M=!v__&7V`S7=ENC2+#YAhQvPZjxhH+!oqOG;&74_FaHsGoLIk)6nd}I z@ptn%5&S-_RPjWhJEMl_KS$)cRFm+b7Z&N;r7zoM++0z+CcbDey%(kYxuL$?>S)kR zKAad-w!2V`L%a3$1<-kmFp+L=PX4PU7fU*fZlwn-%_Z=1 zUP8CJdJw6=MQ$H_o`AmUC^{Mv9J(H2R~WIdc4kML)SaAwqY>_P>r#T6;alJjJ_axJFKLSjiMh-^f7vFsrY^(Q#ODs0}Tbt&+) zis2nkFcYoN#EzcF)8!7*n3QwnXsQa9o&vz@a&#Izy9|3)eH=MVXqdPMb|I>}U_4I4 z0v3&^z#YvvaVn+9%r2N*^hQ`+>Y>_*Clh>GS)WA(<;Xj&?VvxZX$Bpb1;1QAc}f3_ zhqbs90!+K8bOrdt3lA2k^u1PjbKw$5Ya_I!5mW=Lg&n>fu8h!I8l-iMxH4=9dZBT? zui3g-(Dw_lRm&kRZej_|CBZ9T_$<31?(L<9!duA^4#~phNRN&`4tEYINQzuN`c=uD zw2oGxA;&X*)0+oe2lMiHJk#OtQvKj-*tjy6NMnc>uOqVY(yabbz0XlZcSoV?|CuV> zpXs1aZ!QWt?x}bGwi31={jfzR`lys1&InYwSe@NTJ`it2O<-tskQSo6q$=W(4O{cw zVoI_VCdGAc{Zvx92IvvACWKTHY7*uz#=FwEda`7#oDL^MEcYlsUq;e&`$Y38O*x(J zxc5Ni@JU!YH&t3nF1eRyaqvQl@R{}6S!8IpA$05fjrC2lB*8SOr z5wI0nAzUn)N-5Pe?i5^ay_W&Tkr*5KJnH(!4^`b$f{zN%-u;RRn|wg$EUGhxp0HBT z@KGKmv9=WQMaO?Qo;cX<3n{NLGPpe@_2Xao2G_EmcNovPToVdhS}7Mr?0Do3<7jzM zV}N9tAOC|Iy+gO4Ud7DD-dE9C{5%lfmR`X>KC?3HGk5=7` zWLV?<#vP5+N@@np?{llYZQiCU*ul}t4JJjGUDaoh&>R0QY%cI1nx1QYfWxqsJNAg7 zrRVWbp~CgW@f{%#}scxkaO-JrtbsuU)lM4&`xlP`qKV8;&Z-L z^5B|n*AaPsCQAn^WL*SM;{~7oaDqdE+)1JyEONi7KWSK~Fu zO%6EG?ad-i4)6a-vh*+@myCXL8;R^6j_sq~+l!v!X%VQ6RvW&2Mn4yqI+x@O2j9^X z{>2?GkfZ%8gekyIk#OqQtR%ptIxE}_G_ai6{eHW9z13sH$YsXKZsmH*X_E_&Pqq%@ z;cO13ywJ46BcDYq{MeDi)(a!}imEp(@j&SleC{N1UhHSObf?ON$JoPx@if4+Jq==s zz8aI#>W=5l#yl=S-}%C=x0}RTyGc7Zm9tj$XI;BjI9IKt{q}r;H78ZvGoTV~ub3V) zI8|&edn@c)puPr51~F04Dt^N>G=bXfJQlJOtTC(+ElzK@dxA|7@b2v-goflD8QGc^ z6J+@=Wud&bqK~q@GMQoSjbgh)4)%V`QqPYg!|`N( z%=<>xA4dE0^HB+c5pp9_$iBv>k3Xf`)qRS0tIJgUt`oIFO-j2+3>yza*sVcyj4V6g ztCtxQ)&a-nJW-*&|JF$Vf&diq|H9ZCHr{r1VX$=xg+CX6SLTVzpaJEudC+i-9OGz3 zc+jf$$98GsXsV{PWOP;kSJv{949wkI1hYT_|g5& zJt)Bmny@4eoq97rct@0pTIUtqA8Gh*l3T<6cbb0+9Dm4pL+fP~HVQEiEFHfZrenC= z!b^Akhlxib|FJr&b$0r*_Q)CCMCb!~CPFqNGq!z~XFMZ?s;~HcmBif)LszNU#9j!V zMHRXYf)=4;B|7x7wPqs5g-cn(UvEkh+3^;+9iZVNR}*!O1ahX0^CznCFyC^00Ldf!`r8$A)aAKu6^@x_XXh(h9i%E{%suoZrlcRk+cmhn{mKskBx@%xzvWB z)xC5V#cl<19)sTSwuJWqPBKEHdm2$Pz~=n!6AQKwlFWF$mwe3g-5z^k=YPGrs$gV?2&WI;VylfDpP@t|5r{N4T93n^ zslzq!I1y;)o%t9q?JzE8uFn2<#rXHkS%7->Q2PM}&L2hYz-gs{g{ z2WzDZC5as38?Ip7cpCTchM!Tf#1O($1fjk9$G*^N==-y{pp6~nyfYNS#__3=Y#&ST zCCMIDHrO?WC8#h+TX)zKuYk!eKs6N6dbN0qlolgs!q$5&f53|->1hW{F)vf9c){Kc zzpvOI@hXmth~voOoYAqY{w7p-LLpBFGZy!qM0+OT{?EN9-QlKrCLg5T`p^S^z=9L$ zGzP~8rYx0rz>GSuW3)~-zH66ECNbG&3evgufP7z6BVu2VEWkTJ&Ykh$j61Ui~?fgWRBi7Ec*GcXu-rDSZ`@HH2z8Ak7cN|ZTD!A2s}Ra+p4a%Ie{m&lkS z-kz)%z8e-ZzrGLxPQ?=Xo|1{X#n@5TsI)$T%l78-x%E zsKdE&WNrEvizxhOc4J|DwaZOi*JL*AlS1?5$=UEf(?!;15JbC}fll)ek8#V}7)O{U zl29{bncv&$?(tum8LMO^^D3-#3J*$J5VksTW{jD;H^055v{a2TsL6zPJ4j>zI0L9@QZu z?cSF7fMXUse_9E)qc>t!#hZ8$OCKlBxrJDyuYAL8u^JoCx`#8n^kof0%(mPL2AahM z$}@cXk+-9LV88wX6?XDWMho!YD`%Yv8wC@%CN4_-tGA}*EFA+0BWt&r)4K*ke)kfI zWaNeD^+VTw>zR33N5YJ7E4U6IT{Ir!CvIN|4^u<`em1R8;^l5yL`uapQog87 zf8y2t5jk@p2Ge;5iTCEsQve#D(CpK>$upm_pqDsS&296aJ^y--Sv0f2Is2bsL`Mwp z4WRzbTy8D9tj%n4qBlVLQh7vhhdJt1$2n=G@5yxcOTfzlwe5`Mz!<& zQ7yi)_jS~!f{;ZPMJULhU%!m-Cca^|b;f$am12Uft1K=2CbO)x$I97cohl`|UVWG@ z0RTTj^#D5GbZQsbxk=mG9_$B@0kXVh!ptgiIGaUC=IG>Bs+yX0aj)n@fuyh zEL3lIRGr5L3iWUul`Zjz7_nsOH{fG<#s6!3!#&(B_vMvY*{%srDX8prq1uS3v|wxA z$p^(pT&bo! z#6KX#Q3iLM$$8U0W1|wQud{Q&8ls$hylvh?>NApzu?U)_8sMF)oIKr}M^f(wU!hV@ zM^bQoPjg3zF2zGW|H^Et7x zBnG$Ws2?RtNRQ`7xoJd3{e{1}`NNtASP<_PD=_ae-s;p6h>JJrsUMzl*yM_(f0%^? zoT2gz!hrom-9InKpXv_3{DWK&4;ICGXX)?Jc`Aa7wy*P!j_S%@Eb52`zNV0;aj(4) zdGC2i!%7KbV}sw`w$^~bC?v$Rk-g9X>PJw^C}IE8nw2w^En@<8^4Ps}Bx4R7xq{UcCh&=>g;bj==WCnTo+ikxW zq22z8;Ad7Fk(Ds-U|cuuT$ zbig3`FNM>HZNz)MNyHb|@SU2mZF%S7gSy(}f zc0Ej;+LAfa8|T62B_dB2zFs0dslNZDk?rPv)r0zM+V(;q1 z(ds)Yx@qy=6q>nKG5ipbJ5jEHm9u~QI_IKMCtDr!39t=T_ht;VyYAE;i&2# zxyZ3nVBxE~gq)4`-J;_vwG!t;HN({_0rJ};ic>LP$Tc@!=e6Z=3MMioEmAr74A)K! z?04(;!n^+Aerv_5?q%s&0%(&|?1Gp(u)ztoig_v~U&yg!zLA?v)!gAB>X!8}l1 z;+PL_S;=M5b>FIR>`|?Zp(QJ}L=muKQYuHySrjDaL0s}aOBue$*L_P;XGhNW-wU)0 zC($2i~Y6NdOAt{=i-?U$HO=;53U3Q@tNsKog zd1Wel#1oE@9FAuZK0FB`8!>x(_*;QN^_q^0_2W?i!L||7vraSmiW*wFCb7GA3&}LU zzQ;8FxO)bIpx78;3h;@Yz;fp7KI%d$oq)ma)dP-66%&q_Jon^k&X_%4;&uR=fvd2X zd#<{^xCo>z-grm73Os#unUtXMt}$uWXsC62u%z@Z{5(}=Kb=^ZbPLu58}xb)zICYR z{yY%}dO~=gfgN@lMURX-jJg9mvp$7OsJX+j2z}&v#I`EUevscn8ASRm~OeqgiEB~bDkmw&7(|0n-%m_WH5c#^MpC5F6gL~Pu$t3Xw zcXvjV0M@O2x+s}BD@4aY(I?vLL;irVhkCS>Xk_v%H>q!x-6PLQ8xDJ6$J9zRp*wrq zqRtD-7m%gJ*Lmx-kQ~D&{0hJ~9SGh9LH5}wFjDDKT$J=mVlHVp^N*c<%3CM^@tmdm z`-AL_65qtsChv6L=g3G9kHf(wHv4wC-G(jG^Bkm)%4FF8~u;Y{+771UEt=O(e z2X%(Gv6J>g*iecamnF&c<>B&}-M2W$-QaE+zT$6*JJfC|%VxE1A`On=lc(Na`Au#A z)>&GN66rBN-cOe!^GA)Pna0pviTc`lT(hJ^BIDQ|HaX)MjhOS;*)8}rQ7fy_^-ggl zA7rDomN=9YMI8*zm-mo~Ye=IpbP&cYfA$px%T%woMdKY%r5gp}#f%RMMcvGyvTbP} zSCo~9srUQWZ|f9r6|Rx0PJch?Tw?>-Jw{mhR?tKur5aJ@je^+ zh0TLG@Q+xOT1b;VOE-En`O}A2c5LQ^YKMx1TAo)zuQ=%=1}6yvL%wOfO&ch^^>s8m z4J%97>o2ek>ejqM&bqe0OAc^*vCd>j0F?J`hTF=xhQe;i)#QGDeaqg|M(~q4CPhPt z`|l@BHbJQrG2$4!f{u5dG(SW*r&n2~ z?W*9De=b8Bz0I}y*nx6g(EbTyRw*<7C>s1mhsxIo&enN`cszBRSFypDJ^i`F2S@*L zg8iR%iOj&M>k$&4-i!|| zGnnx&J0|~s7r^1pX)fs_vZAL3MKG3R(b%N&8bxmeA*bZQ-*t>*fdcd~6wQ6Kv}aVM zpo`e1b{#HIhJS@t`=8xzlCMus;Y6rWt=kQbDZC6r(d@ko#$V2V@{l%>?=-5r5PA6O zWEsSgT%u0iJ{i6K{zLdr0cW4=V>=S0u9ewlDfi=_8O}MF?KiPp+r0ioCymDmXMv1F zzN8+x&RJcodmof@)+D!i@#(YjGtt=>BmYZZ*v8SCNy#SW?z3|JK_%5x2bJt#3a>!^ z6Pq2T`$d5k`aZqE5yPX0=0i7O%UM3bMSPSbVXaca9$i5g2j!)u?fMQ^cW-XI?BK|( z(tL>Bj!U+ZKY=vicwDo6^H2g+Bd$d~KxE3|u=SqB`zTl@K5Om z^X>CFH};B8zFoN7;VY9dNd0^rutDVL28FsyhyUB_h$k%&HMai9i_yStA{ugMFtX(|*8|3}u-Cu2}=ede5s6+T!N4vfy~_ZuDMlwX-?J*@=t+u3QuXm3q11MdG9sQDUb(I$ z2!H!GmLsY7!+Do$-%-H2P-Z4j)7gHmB~h^d%O&9R{2VLaA~uEIgV=>+wNWzW9 z3EU&3#9>sOjxphx!h2tgtd_L@N>4uQ+)fjn1^%e0>3CTh*tV;CA&Wiv1N6r^>3w=0 z9D`JA0er0FGXTo|qkfDe;ABCAJ^a&zp+7Z%#~9|SwCX#35SE$t$`sJ)t|H`vEBLRL z6df9&r9pQO&TKFmR&U6loH*^Wy|LSBu{(j45s%5Y*E_P)euq>iv+dsUU?K4l9BW>1 ziTZ)q=VTs-Z)gGkp4_I#PAEzFxX+NdLvAMR8@!SGGWyWZrg@kXx_*xX(IBSs7#3q< zYdNuu*-8_l(jk3(m}W6@smf3}Z7si_U!o7yqM%o^Ib#7BRZ72oxNJB@G7L+npxEwD zVz4KBxTb*J%!gm!6(Xy^P9Ja5oBJF-m}cRB-bAk>uD=sdTbWNp(u19TFVx^=&-RwG z1|!7CAqRY3mmO6P7LnWagPbD9V^X# zeNK9EG3x^(v&G#9wDxuS*8ygM!5HIA*Eka#N8wcKoOKqb)H5nP0+h8%#xi%e^K)oY zMI1ez4yL!t4X@-uJo4^NiVe+MT&y(-Df4diE5SWklbr5E$LUL+(7O}nMF-cqg>6zy z^~36(h{r<92aJX@bVdZ zjS(Ff@dVtqV5i{bAI6p5uQU`6XG7lX&cw9h(;Z!3D60qWg6{R5`ng^wBB8x~%h4$n zxBHTsHPBY7!z=OQX6v&*|1+bul5}hu9@*f_T;-vPQl4J?dY8&_Xp>GIlAm;L*}v#gx*8B^?9m-?XW)Tu|&P+tUN|wfL2tc`-#nKR>$j`U(j`1FR;ct^gvL= zAK8_jd6f$Lp$9mwqOEX@$%o$wi5=PpjJ7`QmgfcfbyB`qy_uP9F!vwuV7^G zY71Te)2@_r9~HVOL$7!Q>dofz#UTwLXm=#)4IDLY{d}+oiiGSD&L$jLHoQLm51R@f zk3G=&SFuU`zK8wR4x4^O-@3pBJuA;$UU-FW`z@gW$&&f*E##~lcmtY{IR^i@e_!;d zHTUE=4xYgI{GG07_q1<$ zZ^875tNylX3bawxqn_U8BWU%fp}&H1gC}j$8CxsEvt}6UW_EfNHO)RC<$E&!@uY6K zMY3n-5KAZG6}U>i*m`~82iGB?;EcD9h@D^C!e)}zIy=OB*QJt-QiC>X<&Udz_)=m` z75wGZj2g-|(SXPJX_a*mm-c=0f^?92NA1QZG&X+0wpDWcb0Q3c#rjXF@$`~3ujc9g02ys=6q&zci8x;7fUEx@jQrY`-Alq4aK+N^qu{}Dz zapw(Q!2l9${&kr*iY)eY{%LymEEtm>EIJ;(%ALlK6CMJ5g#>g3QsTF^uui1_y8mA2^axfdhPH?v)aAd6#oHwz+4ySDldO3Nu4FT7MthB$5ky+xM@{E3d7TpfFH~)p z|6P<^lUg(Cp^r5Fw;!U45O_qby=JvMJ=`nkDX2QyU&Lh8SSBvtZ1p7wrr%(V+3r8z`?;=Ypk|Cr#|(_< zAJ7oLsLn{${%~9+DzB?%F~zl8Kh+=jm9{2~9la`DQ=B!~W`;95(g)~@61goS@1gHP zto;5F(KLYeJ2lp7pT0kY1Li)&?J-MGB6d0)An!Be^S6{l{QNCP-p(LNG|fZX zpP4&DB+cHZzheSaR+@QNsb%l&fL0C~F$V^nrXOfCQ51b?M4Zn1@-u)|J zBZS4(4Zat0Go2I+e>URyiJLLPz4%=1-!>+uzjFmu(sLsI;`dMZJNiYOd&}#6z9WL1 zAy{zRzlE*w?xHJdEBY$3YS2m~@hSvrlXjm-F@95UkEuqb`Bw zUOowDc*ryZz$7jrA}-MRP*CpABvDqTn@_$luyb>02Si$P7Gfu=9>buXItJdfs*cg>^otWff5fv7+Qajn;BpqWM``wr8!Nl!H|w-|Hee7)25+j zR6JdO0s9x8Ao8SfR922?v-25WpQs28`s?{12d5aW!BE7ANs!9(0 zvy9Lu{wN|)&b;Vz(aWhB<(@A%YtK(ic;!Q_>rHn;8koV8sIPwL=Th>5va>%7vdLNi z+#Z4#_*|k}zEZ5LX_~3refIQG?0tcd=?7^>m5&;4=i(JCN`hh|R+{e3#B8FzNk3T^ zf{M8PmN2yIp19lB5jD-IzqO*UQ}6pESfFgO&?^$9bLop=G0&jf`CF7Zo)oC5Ybro& zuJaFesepK`51S50iVaj*-10%2_QxSezn-3rZwJFS2$kQH ztcj2)^o-kNb$to(*OF0;)VrGyw7wm&t*pi_v~!4k(bvwG@3H$GxNSA(vwoDEzJ6HN z6$tkcE!&B?V~q{7ET+Wd>T`0zRI99?_x>2yxxKiPu0F~26$1$-e-zH+ioe7w_9&T< z_12nLzTy5#A6IId;fIn>Zn8o+ftYOmz!piofQic7N)AY3xm-y$Fo4U$Pq3fDpfpUAI~67 zw=Fl**c3tPIU?%LolQwjVNUm#M3er%)xKH2{CiEQ$DXV036S#czj0>RVA=g^HqTbT z+Ua(c2$Vm8g+&ie_jIzfywe59H&lby&RjwG8XYBVRH*fQewVsDSo3q5^M-_%cHt;9 zGBEcvJa3qaS#R*daRowq%h|f@6HzEuDeKp^1i2w zH(Mc33~W2lusLhyr|H2NH?jN*HZc=IH<8)tEe=)$Ji^tl6|l%8odkYJclIb3OKA(RbCH z;B~rSQ^=2khj*Myj*=mQ50Mk0zF&qmoRTdd-I3~DQ@mw0kw-R8SrY-S*DQDiFWEKf zyWh`m{?HkTW&VuF@pDiJ_kTOaGQqY!IXWs%k?zf5_MPNd*KM-JRRm_Pq1= zd*A=@|MGs>r)S5G=iYT+*Lh#}d7hW%O{$3@dp!w z6t(Bzl;v;ojHZ+y}t@E{M1Y*%7TdY1hl#<+@YS^XU`3Vxe)UhphXjD$yI_}F*XJ*#hg zRTf-n)$6U^h;gqL0Xk3q1a!VA@DVep&VLvWp{Zo@T_>OVnO2>Ee%!%gm(&|zWRl!J z@B$G=ZJ_sUmy^zSIpA|%5~~bd^-0Q5)7wIM&qu>i1dLnw$#PbGgB% zmrsT8LiHA#W7QaU@J+Bdw59Y8q{AUHY$F73T6PMwtfkCeTfbgB@by8Odx?2i= zTi>eFaaPT*gRR$F6pt`E3}HO|B7#@Ec!UxP1l#>bbE+yx)+tD94E+h1>w%l zVOGG_!uK=gGnqlQJex=ykZ^ibX9>uXu{OCqB^`c`_hy+dQZ3@Pg0DCd62l&N;K;e1 zF!R)S-J_}$hVG{sI|sRwe)KM@kj3=V{0I@f=LK1wVNdgwyKTPj^I@Q}7{`ZFXV5>) zs1fTM?2hWPLmnW&z#-IHHTc9mm)j^s9P;pIhn)9nG=X?rh21ZidEKQ4%}QE&H-G(Q zFEiWiv;-=+T{NLPJMxa|=g?9>0own=iciMit=D?bOJzU`XbC#gbNOTK=Yxj=oxxwO zL#JpmCzigsFHk+@tXiR0B-BY{97^O268^N%d3Qio7BPR)^tgiGu+Y2odrCz0s{#0B zLBad&pz*&+RVn`Q158>wfrqUZ8=Hl%VjsrRi)P@SZVMIb(F^E}$9Wep6N$HR;q5>I z=US_%T(1!odM*B^1MhLvi$^z&g`6*YcK{$Q$!6c%UYL&w{Ia^c5~2GAIC>MU@bpUj=P1l7Gd|f~gIasP`9aK3c0- zP~G3=l=IN`eJ|0OqRdlpk({#kF|P#w9e$&HQQ4y& zlD~nHaj$PM;zbzkh2MI<#OH^L=9eNbc#2 z2Rl?25gni$Ima#!FWsT69nW@CJ&q?tK!@h}VeOSRhN%vWSj#Z*T^!#5Yh=`b-9-hE z0C8i#rX;H+Rr|$jpQ0bfR0rdiYpbVECh`>f;BioH{@Opw#QbAvzNfpn$*ixhc#cMG zkwe`5Kyk}fzP}5{>lw4W$Gs)s<6fl}kn8V##kBFJ8^ayt^ko51nuEVzxE2=dUi`qh zOA@RvAo>J6rt2-ozD(nU4VQDpL(9au*ZcqKu@yDHKoG20znT&_nqAW=>{T#Q^G!V8 zi=o#y>8aQtk<3=5;h+A+b%rE2%NC>7Y)acr`HqOZdBw#kv9#35*H zOg>wO9Ln|VnkJ9z>EZ?W%(&-cK?WiVUPRnM+8$pMA@OU`&QdWC5}EL^OX1SSRni#3_+DxXte4!a^#9Nz-#|1ycT5QHp zchl2=6{?t&N!8BJ1yt)pe8wRg+6aT`^u>c$;+p!78fpBK0pOXFdYsomn_Q5*;1Sa- z&Xk_HqInX*sM_>Es~B%TpLscJFCh2P#zG~R08eMmF4#Rv7~+)x@<FOb|8*NG2BOuSP$l!ix`{kn*K*db8DdBsv^>F;&53c%RYm6mXr^ zvHcX_aC1#nz4Pl(%+na4m<39VVp@k!{RCSA3-o9>ey2aV+nnHmN%9q1N8~`7x3RB_ zzo_*}`B)YHHRAq~vEMT}RQ8$w zWwXkG)@Bq#zeasWgA3F;)>4dpUUI!GS&1gyfHR8T_9c1jx-(TdMJfGiILp1jKp69t zGp^9t@bv&oTHk|@J^|R9KP-3S+&{vmvbZmLqo{C91J6jw>RJNG8TB&;Uc`TvF1VuT z4MgR3%M89KyqrIa8O4t%c$UtuN_Dv=v0KSL0WSWyCim#dkzKnB(rmri z$HseIjrW>EH9f(;?ubq9U-}lSh;pA^`fc(XZgsXPbVX6XVg!P~gwO&<`D`)Q{3;m5 zqo3I?3h&LnueEx)m>l@-qt*Bg74|CGKB=KKNq^{~_n^~a@t3<*Ir%z1Jkmb5Fm(Zj z=!6v@r|?yD0>CdxAH-Z=d0>)NKi2#tJ&7NsMq{6GieiqOF}DdwV^5eH^59kVVcnr%e35xp4m&!QVccrMKM9Ke^iWQRlaKX^09vuvv0ih*} z-ob7{8V*}rB%pACEyh50jk>rWdls3yM=KUv&;K-%8!E%zxd&29A3go-Q?+BqmPmD@ z&W7YO=$3;C5l55Lt4-~f``{bCGP#g2Ax;9}wBHw9(HG(-c%oijp(1%hChHwR3zd=& zsXjkP9tF#TxC9t$_Z~hUX04?N)D=F)50}K%E0?!z+x6GOpbtjJY!`p$6|UI+ zZH5}SaV%_Ih}PcQyXz6=m8Z7?UwGB3JvCi-rgu&?S$#oeW;30K3H6(!QEYeU6cm>q zp8rPu3{?8ua}?YGX5vRkF>NovNCN|Y-DWrH^o>BYXfiNmL2-q0n|4xxyWe>;;a_fC z3|b!$1+Rq7Z;0e*yC1LGZK7qmo8dZ6KzW!oG-q-ehHuaw-w}U-d11ZpdIe@spjhJ1lm5x0-qKHL8_XmsfVS(*liu5Y^&sLp{cBLBLH z%3kiS@dvj`9PPkVea;(ifc9ZRJ%=)kcY`myGdmY^ug*B?k>qW@?8GIUJ4zqpMvRuD|{JIWyvbiZxXu@%W5tKdab?dYdq`HvwX7(oZsp zl&J2{)yfAY8~j^vn=EX0BW=59?q|rSGeU1>yd}GFNEqTESRz0Et}W5eX2n;!#&&X5 zf&H8MJKsTKJSbYi+>aCZa4)o+t*N`qg0|~97VXJ z*Eox>fwuG4g*JwfnurGJ}%O^$Ip9R z4xYO;G-;qt6+XA>|Ndk@$hq~#0hovVf!m%qNp9tsgaM&7A@I#$6jimU2R9WNf&>fH z8ABB(ftx7MI#8PeZpZ|moJhPzQhfPtNkSQ9(1j$tY8Lzc0VQEMdp3o)0Ilxk<$$tXEaBuQz5 zx`*(mJR$^J{R2)Y`8n{`z1*|)I^(%(V^455T!Lb943~@5;TT12x6rZs880K+im;hD z^S$wU>)s7R>^yEmBx^9z!S&(k23BizHY!YA^g{Y zFRdG8_nVt{a*a+ert19Lfq5njVDk!qw_{8eVtL9KloM zRrJCZt1S&S3V(@IKER&(po@NFO(p%A?g1D&!#R(^3Xdgypi!FA8KjQ&^WTV zvOJul2YrK6PEsYlM*(!@7A$7 z#n!!Pe`|TU;xMuvJOOmzl$`IH#50;%p5P~X1UktrBa#)vGs&3R-vdJCL|CCU5*+2} z;20S(iWLo$#8IxnC2^Y7%$p$kf{3nG*n=$!w9N#VOQa72W_AW8gQuj=2Udxlchv^4 zmVJ@$6`451LZ)WL7@Q)=YCc|megwM{b`QVIjq&+@XPIm{tnZaSf)LI%`r;a!aZzb> z%b{y5{AI*QC>0LBnlBj{Z%^W6^GE2*_}A?hz86v+fy3(6o?h&__?JfvP^l`z@hk+E zq5);z=Z1)>^ti47L_ll;^GiT}S|a_k0+)W+$H_{NaePUy8P0eb!Rm29WzOeslb9Im z%a!?R@c3&v@aDiXL(h&TMg`tzx14%wA?~M7gBRW_Jbs#?q#=(nRtod;dq9k>cn#=V zEtx8vPGVc_Tw9`8H#HJLc|Myapmo$KUj}#6NzOX_8_eQy6KzpNg(3AJI~Di=>*Rzs zf^K6WywHTy383(j;kFHuWqllMjT_Co*MC^wo98@|gYW`{-d_BWpp+DeV;=zBZ^Bzv zdRw~obxYz1#sBXPA#!_essBDQ#%3!LN3KPTRoX_}ABsSYN#e-XB<{RT%W=d>i~?pH z`*CZYDqOqU(~ZzK+oFP5P&@&M`td{sIEoo&>2Y)(O`T9okhi$%OJx!tqzi?mjWcXT zi8&KLFZv_1)Mcx{%Ak;T^$9tAFn%vK?BVMfR{!zYxFy5FAXjSvJ1rOnFoL2 za0`9e+gz9R(sDefn&U-tu)0ThuZ4e`6CqR+*7x;sg0yUPk4r6FQPXe&lf87$ zRb>O4ohnBc_2P<5w{8@lS3C7FaN<=k+K`hnQhPGt9?RQv!95pCE1sOEJ(F>@ z5ttC1%M;kMXwet@u!t*RZ^G@_(O?g3l5IK-AVbhzq2Vhf1E`%TmWc8r!~2_%ik@j) z^fpxwk4Bj|Iu>LdM_EQ+&-q+G=>->3B(PofE&?S5V&_ysUpd~*?tc;!@)T1w-FSC8 za;NfG<%kf*_-Ta^HZ*DhB?{>?>jrQ4(h|9JRwt`LhutH9NDTSutUrGWpP`*Cq->oQ z4VwTW*`&+rH7CHzBWd8WL%D6p+go+cf+>->JNPRj^+?=KAkQ{}p~y=exP`7hGEC;S zgWf$i;pW~(JfVI|jv>a%i~=9JZr2`j)fl`%e)Wy0=hYV9s#52pvg z#dQQ11ZH$s8JG#);SLwukoxj7Juy>gF+~5#aCKsWt|({FYl$IhA_A~I>3~hR39sOz zbsq8fpWQzHd&YH zMcxKZ*+nz;7x$TTgK1nC^bJYSlo+P<)J&FrCc|fHZ(4>(!z`+ZQIw+5xVS7j#VMU_ zC_VO5pV0)=5GrF9i7(#aW(=%V6F0F$bCMzdHU>l;pg`wd=KuSDnuTs}v-cvS3Yv^x ztgs9~@Chji+=o>9SKo=+hQ_zJO# zbsE@!L2ssK$ERapa+-RCqJ+lkQN-JUgj<}-2jO-;lbN2+Rf8#kJ=H>L-?3uT0On%- z2nZ3s@0ns|YcOS3Vcmn};ZC6r+b8Ykg)XNqG9ql+I=q!&X$HiJtE>B{JLZ&9vK&7b`;^(Y>n`JY zT`830-^w!3GLWeQgm+ijMZM_G$4j9%vD53C{8qiPx3bwCaRS>g{Gy-19C3IQg)?3o zf2J<$yCo15_a2e{v6J(T`-}sV^tbW#8}wWsts0^x$nIveaeh=suW_NOV|bx_PV}{V zLB|wi#B|yz4o+c)tY@iil}D<_*-@1Vm}kuGb8_L{V? zqcM8^y}~-dd1=Z2Hc+!vEPfXIx;es_0&^E{TVCha+DU=Po!`xCy;pK?`hsdwFMjzX zib0E#&BWss4{V2N4@Px|6*@~?;vGKm&(2TaMVpC0Wh4* znTF3AUjNM+_>}w(u<~X;PyM$xGTR78%)2u-M~v$kxLcDM>a@>1fVg)>vk6l0rr(70 zV(6cRSJC${I^x7e!LcZt<0x3noBL5IpZYMqc~AuK8}#MUDb~jCFbW*DK`il0Y0P(N zQ;*KNTEDb&AtUjs+E{IMJbcKmh-SmE{eJY`DuWXF7CW_pmSH4lq}wg)oOec$HD;G7 zohFTedHKiy1BD-lK1`0$YkqY29rlAu_fFPS?!9mK67PzCc;|GGvkIFzy-a7*jB{() zY5#TFzc=0%a)X#y*EH$z=37Rei51kPFy>PY$+plrY-uTfG?^@$FWOnT%}zWyR2!b; zD)p(0R=E-y+xl}*yODI28zSfK(RSA-0%ja^&4#M*53dU#Lz+xPa(@p~{w9bO{DxAS zaxR5;L)CGDAO)Rz-G8A+j`f@XPrSH^6?q58N79SEiK01+W7>1ie$5FuePbzEJ*e6` z&GcB;W4gT*%K9o2_aVS5+6lknH}NZuk2S42+J8~_aX4I+>mM|K^R;P4AXyYQzm~ck z{ho{WVdrM#dvVXHLP}w+yGyO_^{SW9FF*x%BW{(@%jA!ECXQ5x27-wdbNBn~4F8&R zpzn}H@bjJ$p%6KDiOXG-sRGKVfH z;-xUYxI|ng0XlletIqil!sn}E9FGy1nOZ#`mT(ItCkR1uhY-;-12vCdPCm)j`*u!G9!-HjN8T;etli$3tSnP&6;8Sz(Vw z;4MdSXRAwWy~lTbF{$#6$fJAfeFBOjEs0!9t)q(q&LsFCjle0(|HH-tKM)f@G){gS zRBPfTY%u{Z6(GS*i%c2!Rdqc{aiKdu`UleRnBmsikt9I#FG4NypkG_%>Ud&MgiGMzt99^euMn*EuNybpQ|}~S%NDzooA%?Tbwz^0vf{6iLhJy%a-Xkp(!!1okf_8 z6d}=hzG%zdI?4wVtxt>5nd~9spwV≪vy5s2(yZFS<`RAgui40w3l`Z$?yo`h!?g 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

_W8W*db6OAfqT*%ugF> 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 z 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�D%d4-+@ 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�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

!eIHS{*B#Kn+ttXl$rS*JD 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%0D;CzMeYUK`0-5;jY5dxEQMMXLCyu;1B0cdJavlPD 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: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%0AFou$tcDl;RM<)=2O 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

Rypn~ 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�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ɚyufeQ*xhj;V9xBf|!@n};7& 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ී#QeFeX7GKuB?_AQ|@EMIfh@babsL2(ATyB38!WaJ*Tw;8q8 z(q^a}x`KBZ4Ss)C8;NmFn|^qww>TB4aO z@Ep;x!Ps=#x+HuE`rQ@$r@G#UV)jolPyqHE@%bS3QJ&>?11~6=Z{Jtswu4O9?fsV} zj4!Cj62AQp(4f$ha5Y>ob>uR!`^ra{b^>TOh^#pnhd&Zh(CFjO9OnHEwK>-L91n`F z-ELX$q7@k41f$4nW};X2SOrLQvBv%&L@2jB7?#qk6LR1^X-t6)<%6>MohPbbLfa4g zVtZOM{$XPY1Q+IR__v!QYpd>u*YA zt>8q&J~;YIVarQ8_T%MIw{0q_9#F)I5nn0kCv<+`NRs_Ot~Jfv#V;$lG7pqisW+ja zqcT~qpMr`;L}p$-2(1`4$*KO2`W)tb^R8d`8YhUR7t(;uBZQvmQ119*qv;@hd;%zw zoKn@o&V$gGYwF@k7ue3apiQj&0Pi!xcP`1n(tn5VRLXC`ThOmr(!Wp5rbEe~4@qhV zzm@1qXaQ?rr$c<3oyJG@Xgp=)T2y=CNN^}~CbP^qS?raJEbv6zz0Dc;!6+sxXw1?myM)!d-_iYBFd)y^^q^8+)n_Kyc%0D1GF)P3?vwyv5?3<2{;2Q0qNzI01o;dQ_0&Db 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 From 814aa0df92edebb5859abfe0dd12dba3264f675b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 9 May 2023 19:52:56 +0200 Subject: [PATCH 049/250] updated subtitle in docs --- docs/source/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 95fca1d79..03df4e1c3 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,8 +3,8 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Buckaroo - Data Cleaning Exploration Framework -========================================== +Buckaroo - The Data Cleaning assistant for pandas +================================================= Buckaroo is a tool to quickly clean and explore DataFrames with a visual UI for common cleaning operations AND emitting python code that performs the transformation. From 65f523366864ef0a8a72ca065d01e9e3cf448b14 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 11 May 2023 18:32:17 +0200 Subject: [PATCH 050/250] small styling updates --- introduction.ipynb | 38 ++++++++++++++++++-------------------- package.json | 2 +- style/widget.css | 5 +++++ yarn.lock | 8 ++++---- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/introduction.ipynb b/introduction.ipynb index 65673904e..289d91bef 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -12,25 +12,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "76a8b005b9fb49c5afd13ae9dafab646", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "BuckarooWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'filln…" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", "w = BuckarooWidget(df)\n", @@ -39,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -84,6 +68,20 @@ " return \"\\n\".join(commands)\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/package.json b/package.json index 99a489454..1f9ced637 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", "lodash": "^4.17.21", - "paddy-react-edit-list": ">=1.1.36", + "paddy-react-edit-list": ">=1.1.37", "react": "^18.0.0", "react-dom": "^18.0.0" }, diff --git a/style/widget.css b/style/widget.css index 1b6558848..47fc49606 100644 --- a/style/widget.css +++ b/style/widget.css @@ -6,3 +6,8 @@ --ag-grid-size:3px; --ag-list-item-height: 20px; } + +div.dependent-tabs ul.tabs li.active { + background:rgba(33, 150, 243, 0.49); +/* border:1px solid red; */ +} diff --git a/yarn.lock b/yarn.lock index a4b5ae1d8..e9cb64cf9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5115,10 +5115,10 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -paddy-react-edit-list@>=1.1.36: - version "1.1.36" - resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.36.tgz#a3e5a30e38c73867530da6750574d62999ca0407" - integrity sha512-iFzup927dtKPMfJHHNxftjPa6Pu+GWLZpo7xqSTI8uRz1fbkQKiYVhCjaHNzzBpJkkblWjhCqOMqpK7NhpssOQ== +paddy-react-edit-list@>=1.1.37: + version "1.1.37" + resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.37.tgz#2f848450ecc3e5cb89f8fae37cb3aa8a184937f3" + integrity sha512-NdR9oKZ8y1GrLvHOCKWkLTIQODCtqD/CI1Yz1cS2znKhDvwDibx1bnS66mxrN1U80PxbKNgv/4i8/j71WgwuTw== dependencies: "@ag-grid-community/client-side-row-model" "^29.2.0" "@types/lodash" "^4.14.191" From 6b742b9cc981c77a503acb29d3e1691a0ee79431 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 17 May 2023 07:29:40 -0400 Subject: [PATCH 051/250] cleaning up warnings --- docs/source/contributing.rst | 4 ++-- docs/source/install.rst | 4 ++-- docs/source/using.rst | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst index de3f36649..c3a637c41 100644 --- a/docs/source/contributing.rst +++ b/docs/source/contributing.rst @@ -1,8 +1,8 @@ .. _Contributing: -==================== +======================== Contributing to Buckaroo -==================== +======================== Buckaroo is actively looking for contributors. All forms of participation are welcome, from bug reports, to suggestions, to code contributions. diff --git a/docs/source/install.rst b/docs/source/install.rst index 52a814622..b850cbae0 100755 --- a/docs/source/install.rst +++ b/docs/source/install.rst @@ -1,8 +1,8 @@ .. _install: -================ +=================== Installing Buckaroo -================ +=================== Buckaroo can be installed from ``PyPI``: diff --git a/docs/source/using.rst b/docs/source/using.rst index e79e6ed25..5e6c34d85 100644 --- a/docs/source/using.rst +++ b/docs/source/using.rst @@ -1,8 +1,8 @@ .. _using: -=========== +============== Using Buckaroo -=========== +============== Buckaroo is meant to be used in a jupyterlab notebook to clean and explore pandas dataframes. From 2d4775d19c29a94b5b3b0d7c24db86abbdaf2259 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 17 May 2023 07:32:18 -0400 Subject: [PATCH 052/250] added a related projects section --- docs/source/FAQ.rst | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index 34d166c9a..4028b6adf 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -5,9 +5,24 @@ Buckaroo - FAQ ========================================== -* **Is DCF meant to repalce knowledge of python/pandas** +* **Are there any similar projects to Buckaroo?** - No, DCF helps experienced pandas devs quickly build and try the transformations they already know. Transformation names stay very close to the underlying pandas names. DCF makes different transforms more discoverable than reading obscure blogposts and half working stackoverflow submissions. Different transformations can be quickly tried without a lot of reading and tinkering to see if it is the transform you want. Finally, all transformations are emitted as python code. That python code can be a starting point. +There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. +`Buckaroo on github `_ + +#. `Mito `_. Open source table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. +#. `Bamboolib `_ An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. +#. `Microsoft DataWrangler `_ . Open source, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode. +#. `QGrid `_. Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features +#. `IpyDatagrid `_. Open source. Bloomberg's Jupyter table widget. I used the ipydatagrid repo structure as the basis for buckaroo (js build setup only) +#. `IPyAgGrid `_ . Open source. Wraps `AG Grid `_ in a jupyter widget. Buckaroo also uses AG Grid. + + +To be clear, I had the idea for building Buckaroo like this before I saw any of the other projects... But they are all open source and we can learn from each other. If Buckaroo doesn't quite do what you want, check out one of the others + +* **Is Buckaroo meant to repalce knowledge of python/pandas** + + No, Buckaroo helps experienced pandas devs quickly build and try the transformations they already know. Transformation names stay very close to the underlying pandas names. Buckaroo makes different transforms more discoverable than reading obscure blogposts and half working stackoverflow submissions. Different transformations can be quickly tried without a lot of reading and tinkering to see if it is the transform you want. Finally, all transformations are emitted as python code. That python code can be a starting point. * **How well does Buckaroo perform on large dataframes** From a6774bd35040238965f977ad4de8bc9a68087ce6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 17 May 2023 07:43:25 -0400 Subject: [PATCH 053/250] also added links to the README --- README.md | 11 +++++++++++ docs/source/FAQ.rst | 9 ++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0e0dcec51..323f16938 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,17 @@ Buckaroo can only work on a single input dataframe shape at a time. Any newly c * A UI for selecting and trying transforms interactively * An output table widget showing the transformed dataframe +# Related projects +Builtin commands are found in [all_transforms.py](buckaroo/all_transforms.py) + +There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. + +1. [Mito](https://github.com/mito-ds/monorepo) Open source table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. +1. [Bamboolib](https://github.com/tkrabel/bamboolib) An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. +1. [Microsoft DataWrangler](https://github.com/microsoft/vscode-data-wrangler) Open source, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode. +1. [QGrid](https://github.com/quantopian/qgrid) Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features +1. [IpyDatagrid](https://github.com/bloomberg/ipydatagrid) Open source. Bloomberg's Jupyter table widget. I used the ipydatagrid repo structure as the basis for buckaroo (js build setup only) +1. [IPyAgGrid](https://github.com/widgetti/ipyaggrid) Open source. Wraps [AG Grid](https://www.ag-grid.com/) in a jupyter widget. Buckaroo also uses AG Grid. # What works now, what's coming diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index 4028b6adf..a04a6f849 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -8,7 +8,6 @@ Buckaroo - FAQ * **Are there any similar projects to Buckaroo?** There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. -`Buckaroo on github `_ #. `Mito `_. Open source table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. #. `Bamboolib `_ An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. @@ -34,13 +33,13 @@ To be clear, I had the idea for building Buckaroo like this before I saw any of This is a problem domain that required a DSL and intermediate language. I could have written my own or chosen an existing language. I chose LISP because it is simple to interpret and generate, additionally it is well understood. Yes LISP is obscure, but it is less obscure than a custom language I would write myself. I didn't want to expose an entire progrmaming language with all the attendant security risks, I wanted a small safe strict subset of programming features that I explicitly exposed. LISP is easier to manipulate as an AST than any language in PL history. I am not yet using any symbolic manipulation facilities of LISP, and will probably only use them in limited ways. -* **Do I need to know LISP to use DCF?** +* **Do I need to know LISP to use Buckaroo?** - No. Users of DCF will never need to know that LISP is at the core of the system. + No. Users of Bucakroo will never need to know that LISP is at the core of the system. -* **Do I need to know LISP to contribute to DCF?** +* **Do I need to know LISP to contribute to Buckaroo?** - Not really. Commands are added to the dcf interpreter via the Command class. Commands are very simple and straight forward. Here are the two functions that make `fillna` work. + Not really. Commands are added to the buckaroo interpreter via the Command class. Commands are very simple and straight forward. Here are the two functions that make `fillna` work. .. code-block:: python From 43e7b34ae539ae5c5f7542106c7d817140a544a8 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 18 May 2023 07:48:13 -0400 Subject: [PATCH 054/250] refined licensing descriptions --- docs/source/FAQ.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index a04a6f849..1eff40133 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -9,12 +9,12 @@ Buckaroo - FAQ There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. -#. `Mito `_. Open source table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. -#. `Bamboolib `_ An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. -#. `Microsoft DataWrangler `_ . Open source, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode. -#. `QGrid `_. Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features +#. `Mito `_. Source Available table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. GNU Affero licensed +#. `Microsoft DataWrangler `_ . Source available, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode. Licensed under the `VS Marketplace Terms of Use `_ #. `IpyDatagrid `_. Open source. Bloomberg's Jupyter table widget. I used the ipydatagrid repo structure as the basis for buckaroo (js build setup only) #. `IPyAgGrid `_ . Open source. Wraps `AG Grid `_ in a jupyter widget. Buckaroo also uses AG Grid. +#. `Bamboolib `_ An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. Code no longer available. +#. `QGrid `_. Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features To be clear, I had the idea for building Buckaroo like this before I saw any of the other projects... But they are all open source and we can learn from each other. If Buckaroo doesn't quite do what you want, check out one of the others From 90de5e290228ab8cc2740e4f08c968a1ed20c593 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 18 May 2023 07:58:35 -0400 Subject: [PATCH 055/250] fixed wording that microsoft's Datawrangler is completely closed source --- docs/source/FAQ.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index 1eff40133..e539d1a0e 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -10,7 +10,7 @@ Buckaroo - FAQ There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. #. `Mito `_. Source Available table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. GNU Affero licensed -#. `Microsoft DataWrangler `_ . Source available, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode. Licensed under the `VS Marketplace Terms of Use `_ +#. `Microsoft DataWrangler `_ . Closed source, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode by the `VS Marketplace Terms of Use `_ #. `IpyDatagrid `_. Open source. Bloomberg's Jupyter table widget. I used the ipydatagrid repo structure as the basis for buckaroo (js build setup only) #. `IPyAgGrid `_ . Open source. Wraps `AG Grid `_ in a jupyter widget. Buckaroo also uses AG Grid. #. `Bamboolib `_ An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. Code no longer available. From 760a19d3a6ba9bfc9c3a89137582c15bbd2b41f6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 30 May 2023 13:04:39 -0400 Subject: [PATCH 056/250] updated ts-jest and compatible typescript --- package.json | 10 +- yarn.lock | 3883 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 2850 insertions(+), 1043 deletions(-) diff --git a/package.json b/package.json index 1f9ced637..1846fb853 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@babel/preset-env": "^7.6.3", "@babel/preset-typescript": "^7.6.0", "@jupyterlab/builder": "^3.0.1", - "@types/jest": "^27.4.1", + "@types/jest": "^28", "@types/node": "^10.11.6", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", @@ -77,14 +77,14 @@ "@typescript-eslint/eslint-plugin": "^3.5.0", "@typescript-eslint/parser": "^3.5.0", "acorn": "^6.2.0", - "babel-jest": "^28.1.3", + "babel-jest": "^28", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", "css-loader": "^3.0.0", "eslint": "^7.3.1", "eslint-config-prettier": "^6.11.0", "eslint-plugin-prettier": "^3.1.4", "fs-extra": "^7.0.0", - "jest": "^28.1.3", + "jest": "^28", "lint-staged": "^10.2.11", "mkdirp": "^0.5.1", "npm-run-all": "^4.1.3", @@ -93,9 +93,9 @@ "source-map-loader": "^0.2.4", "style-loader": "^0.23.1", "svg-url-loader": "~3.0.3", - "ts-jest": "^28.0.8", + "ts-jest": "^28.0.8", "ts-loader": "^6.0.4", - "typescript": "~4.2.4", + "typescript": "~4.3.0", "url-loader": "^4.1.0", "webpack": "^5", "webpack-cli": "^4.4.0" diff --git a/yarn.lock b/yarn.lock index e9cb64cf9..24ab6bd5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,19 +4,19 @@ "@ag-grid-community/client-side-row-model@^29.2.0": version "29.3.3" - resolved "https://registry.yarnpkg.com/@ag-grid-community/client-side-row-model/-/client-side-row-model-29.3.3.tgz#9a3a2990f6081c6363254b218599d4ac4fe80ca4" + resolved "https://registry.npmjs.org/@ag-grid-community/client-side-row-model/-/client-side-row-model-29.3.3.tgz" integrity sha512-7BjLseiB625CiDECsSJBDn6xt59VMl0Fs1PwaCWtrTX0AKYBoU5W/SaOezRKW6saH6FnXxEW+47Vyrz+s+rRJQ== dependencies: "@ag-grid-community/core" "~29.3.3" "@ag-grid-community/core@~29.3.3": version "29.3.3" - resolved "https://registry.yarnpkg.com/@ag-grid-community/core/-/core-29.3.3.tgz#cf5b93f7367da8ab09979baaddcb8da9891c170c" + resolved "https://registry.npmjs.org/@ag-grid-community/core/-/core-29.3.3.tgz" integrity sha512-cr15doApCrzf7QJYAi0X4zZMv7sFi4nBmEFN4asxSTxrbFGzqzVjO2ymQi5U60NikRTQOuYx3Kzx4PzOTuH4dA== "@ampproject/remapping@^2.2.0": version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" @@ -24,7 +24,7 @@ "@babel/cli@^7.6.3": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.21.5.tgz#a685a5b50b785f2edfbf6e042c1265c653547d9d" + resolved "https://registry.npmjs.org/@babel/cli/-/cli-7.21.5.tgz" integrity sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g== dependencies: "@jridgewell/trace-mapping" "^0.3.17" @@ -38,28 +38,28 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": version "7.21.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz" integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.6.3": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0", "@babel/core@^7.6.3", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz" integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== dependencies: "@ampproject/remapping" "^2.2.0" @@ -80,7 +80,7 @@ "@babel/generator@^7.21.5", "@babel/generator@^7.7.2": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz" integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== dependencies: "@babel/types" "^7.21.5" @@ -90,21 +90,21 @@ "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz" integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g== dependencies: "@babel/types" "^7.21.5" "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz" integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== dependencies: "@babel/compat-data" "^7.21.5" @@ -115,7 +115,7 @@ "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz" integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -130,7 +130,7 @@ "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz#a7886f61c2e29e21fd4aaeaf1e473deba6b571dc" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz" integrity sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -139,7 +139,7 @@ "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== dependencies: "@babel/helper-compilation-targets" "^7.17.7" @@ -151,12 +151,12 @@ "@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz" integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz" integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: "@babel/template" "^7.20.7" @@ -164,28 +164,28 @@ "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" "@babel/helper-member-expression-to-functions@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz" integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== dependencies: "@babel/types" "^7.21.5" "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: "@babel/types" "^7.21.4" "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz" integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== dependencies: "@babel/helper-environment-visitor" "^7.21.5" @@ -199,19 +199,19 @@ "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz" integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -221,7 +221,7 @@ "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz" integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== dependencies: "@babel/helper-environment-visitor" "^7.21.5" @@ -233,43 +233,43 @@ "@babel/helper-simple-access@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz" integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== dependencies: "@babel/types" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== dependencies: "@babel/types" "^7.20.0" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz" integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-option@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" @@ -279,7 +279,7 @@ "@babel/helpers@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz" integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== dependencies: "@babel/template" "^7.20.7" @@ -288,7 +288,7 @@ "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" @@ -297,19 +297,19 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -318,7 +318,7 @@ "@babel/plugin-proposal-async-generator-functions@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -328,7 +328,7 @@ "@babel/plugin-proposal-class-properties@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" @@ -336,7 +336,7 @@ "@babel/plugin-proposal-class-static-block@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: "@babel/helper-create-class-features-plugin" "^7.21.0" @@ -345,7 +345,7 @@ "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -353,7 +353,7 @@ "@babel/plugin-proposal-export-namespace-from@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" @@ -361,7 +361,7 @@ "@babel/plugin-proposal-json-strings@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -369,7 +369,7 @@ "@babel/plugin-proposal-logical-assignment-operators@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -377,7 +377,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -385,7 +385,7 @@ "@babel/plugin-proposal-numeric-separator@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -393,7 +393,7 @@ "@babel/plugin-proposal-object-rest-spread@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: "@babel/compat-data" "^7.20.5" @@ -404,7 +404,7 @@ "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -412,7 +412,7 @@ "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -421,7 +421,7 @@ "@babel/plugin-proposal-private-methods@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" @@ -429,7 +429,7 @@ "@babel/plugin-proposal-private-property-in-object@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz" integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -439,7 +439,7 @@ "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -447,147 +447,147 @@ "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== dependencies: "@babel/helper-plugin-utils" "^7.19.0" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.21.4": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz" integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz" integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-arrow-functions@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz" integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== dependencies: "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-async-to-generator@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" @@ -596,21 +596,21 @@ "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz" integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.21.0": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -625,7 +625,7 @@ "@babel/plugin-transform-computed-properties@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz" integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== dependencies: "@babel/helper-plugin-utils" "^7.21.5" @@ -633,14 +633,14 @@ "@babel/plugin-transform-destructuring@^7.21.3": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz" integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -648,14 +648,14 @@ "@babel/plugin-transform-duplicate-keys@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" @@ -663,14 +663,14 @@ "@babel/plugin-transform-for-of@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz" integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== dependencies: "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== dependencies: "@babel/helper-compilation-targets" "^7.18.9" @@ -679,21 +679,21 @@ "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-modules-amd@^7.20.11": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: "@babel/helper-module-transforms" "^7.20.11" @@ -701,7 +701,7 @@ "@babel/plugin-transform-modules-commonjs@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz" integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== dependencies: "@babel/helper-module-transforms" "^7.21.5" @@ -710,7 +710,7 @@ "@babel/plugin-transform-modules-systemjs@^7.20.11": version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" @@ -720,7 +720,7 @@ "@babel/plugin-transform-modules-umd@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== dependencies: "@babel/helper-module-transforms" "^7.18.6" @@ -728,7 +728,7 @@ "@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.20.5" @@ -736,14 +736,14 @@ "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" @@ -751,21 +751,21 @@ "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz" integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== dependencies: "@babel/helper-plugin-utils" "^7.21.5" @@ -773,21 +773,21 @@ "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-shorthand-properties@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-spread@^7.20.7": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -795,28 +795,28 @@ "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-template-literals@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typeof-symbol@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== dependencies: "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.21.3": version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz" integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" @@ -826,14 +826,14 @@ "@babel/plugin-transform-unicode-escapes@^7.21.5": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz" integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== dependencies: "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" @@ -841,7 +841,7 @@ "@babel/preset-env@^7.6.3": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz" integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== dependencies: "@babel/compat-data" "^7.21.5" @@ -923,7 +923,7 @@ "@babel/preset-modules@^0.1.5": version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -934,7 +934,7 @@ "@babel/preset-typescript@^7.6.0": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz" integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== dependencies: "@babel/helper-plugin-utils" "^7.21.5" @@ -945,19 +945,19 @@ "@babel/regjsgen@^0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.1.2", "@babel/runtime@^7.8.4": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz" integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== dependencies: regenerator-runtime "^0.13.11" "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" @@ -966,7 +966,7 @@ "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz" integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== dependencies: "@babel/code-frame" "^7.21.4" @@ -982,7 +982,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz" integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== dependencies: "@babel/helper-string-parser" "^7.21.5" @@ -991,17 +991,17 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@blueprintjs/colors@^4.0.0-alpha.3": version "4.1.22" - resolved "https://registry.yarnpkg.com/@blueprintjs/colors/-/colors-4.1.22.tgz#033cbf03705100d5114d54161c225eec5cfeacfb" + resolved "https://registry.npmjs.org/@blueprintjs/colors/-/colors-4.1.22.tgz" integrity sha512-qcC7nWW9TTSS7aDxE5gbo9vrxo+IOpC6/Kzpi0rdOBYFDd02PppCdnCCjGYw1/IopSsZ9EWqDLmD7zuy0H+WEA== "@blueprintjs/core@^3.36.0", "@blueprintjs/core@^3.54.0": version "3.54.0" - resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.54.0.tgz#7269f34eccdf0d2874377c5ad973ca2a31562221" + resolved "https://registry.npmjs.org/@blueprintjs/core/-/core-3.54.0.tgz" integrity sha512-u2c1s6MNn0ocxhnC6CuiG5g3KV6b4cKUvSobznepA9SC3/AL1s3XOvT7DLWoHRv2B/vBOHFYEDzLw2/vlcGGZg== dependencies: "@blueprintjs/colors" "^4.0.0-alpha.3" @@ -1019,7 +1019,7 @@ "@blueprintjs/icons@^3.33.0": version "3.33.0" - resolved "https://registry.yarnpkg.com/@blueprintjs/icons/-/icons-3.33.0.tgz#4dacdb7731abdf08d1ab240f3a23a185df60918b" + resolved "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.33.0.tgz" integrity sha512-Q6qoSDIm0kRYQZISm59UUcDCpV3oeHulkLuh3bSlw0HhcSjvEQh2PSYbtaifM60Q4aK4PCd6bwJHg7lvF1x5fQ== dependencies: classnames "^2.2" @@ -1027,7 +1027,7 @@ "@blueprintjs/select@^3.15.0": version "3.19.1" - resolved "https://registry.yarnpkg.com/@blueprintjs/select/-/select-3.19.1.tgz#b5e8baa6f182a0647651a57fde8d1d97eaa1e997" + resolved "https://registry.npmjs.org/@blueprintjs/select/-/select-3.19.1.tgz" integrity sha512-8UJIZMaWXRMQHr14wbmzJc/CklcSKxOU5JUux0xXKQz/hDW/g1a650tlwJmnxufvRdShbGinlVfHupCs0EL6sw== dependencies: "@blueprintjs/core" "^3.54.0" @@ -1036,12 +1036,12 @@ "@discoveryjs/json-ext@^0.5.0": version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -1056,12 +1056,12 @@ "@gar/promisify@^1.0.1": version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -1070,12 +1070,12 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@hypnosphi/create-react-context@^0.3.1": version "0.3.1" - resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" + resolved "https://registry.npmjs.org/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz" integrity sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A== dependencies: gud "^1.0.0" @@ -1083,7 +1083,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1094,12 +1094,12 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== dependencies: "@jest/types" "^28.1.3" @@ -1111,7 +1111,7 @@ "@jest/core@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== dependencies: "@jest/console" "^28.1.3" @@ -1146,7 +1146,7 @@ "@jest/environment@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== dependencies: "@jest/fake-timers" "^28.1.3" @@ -1156,14 +1156,14 @@ "@jest/expect-utils@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== dependencies: jest-get-type "^28.0.2" "@jest/expect@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== dependencies: expect "^28.1.3" @@ -1171,7 +1171,7 @@ "@jest/fake-timers@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== dependencies: "@jest/types" "^28.1.3" @@ -1183,7 +1183,7 @@ "@jest/globals@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== dependencies: "@jest/environment" "^28.1.3" @@ -1192,7 +1192,7 @@ "@jest/reporters@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -1223,14 +1223,14 @@ "@jest/schemas@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== dependencies: "@sinclair/typebox" "^0.24.1" "@jest/source-map@^28.1.2": version "28.1.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== dependencies: "@jridgewell/trace-mapping" "^0.3.13" @@ -1239,7 +1239,7 @@ "@jest/test-result@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== dependencies: "@jest/console" "^28.1.3" @@ -1249,7 +1249,7 @@ "@jest/test-sequencer@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== dependencies: "@jest/test-result" "^28.1.3" @@ -1259,7 +1259,7 @@ "@jest/transform@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== dependencies: "@babel/core" "^7.11.6" @@ -1278,9 +1278,9 @@ slash "^3.0.0" write-file-atomic "^4.0.1" -"@jest/types@^28.1.3": +"@jest/types@^28.0.0", "@jest/types@^28.1.3": version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: "@jest/schemas" "^28.1.3" @@ -1292,7 +1292,7 @@ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -1301,35 +1301,35 @@ "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" @@ -1337,12 +1337,12 @@ "@juggle/resize-observer@^3.3.1": version "3.4.0" - resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" + resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz" integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== "@jupyter-widgets/base@^2 || ^3 || ^4 || ^6.0.0": version "6.0.4" - resolved "https://registry.yarnpkg.com/@jupyter-widgets/base/-/base-6.0.4.tgz#6348b29f3574df4f0a7df593b4088529f46be57a" + resolved "https://registry.npmjs.org/@jupyter-widgets/base/-/base-6.0.4.tgz" integrity sha512-w5KUL8q44Isp0N/ElOAJbPSgWBdeGZO5EYEcz50rfqYAUMSh2Qx0oQJYMddbRgi8b5CajGHFvcHTfvwaNDLSmA== dependencies: "@jupyterlab/services" "^6.0.0" @@ -1357,7 +1357,7 @@ "@jupyterlab/apputils@^3.0.2": version "3.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/apputils/-/apputils-3.6.3.tgz#bc37683142b281e21d22a2f4698634563658298e" + resolved "https://registry.npmjs.org/@jupyterlab/apputils/-/apputils-3.6.3.tgz" integrity sha512-um2Aaa5fOUwHFpAqKTDA+MFpnAldzOILIi5QsKOWRxiJA2W8x+hlg5HvHbq+eSWuWEU3ah15M7htzBcL3g9d4Q== dependencies: "@jupyterlab/coreutils" "^5.6.3" @@ -1386,7 +1386,7 @@ "@jupyterlab/builder@^3.0.1": version "3.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/builder/-/builder-3.6.3.tgz#a4b22efe34e9598b84122ff10509d3d890017b6a" + resolved "https://registry.npmjs.org/@jupyterlab/builder/-/builder-3.6.3.tgz" integrity sha512-oY1a/r75RMoPzhSmuVu+DfjL0cKk1ceHTniZsM2wPuhjjyoF875u6CDzArJatpOOuTgLm7CY5OcU3LCIK1OAgg== dependencies: "@lumino/algorithm" "^1.9.0" @@ -1427,7 +1427,7 @@ "@jupyterlab/coreutils@^5.6.3": version "5.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/coreutils/-/coreutils-5.6.3.tgz#3b0b5d481b14596158b560336833c89be509e84e" + resolved "https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-5.6.3.tgz" integrity sha512-jRVTpwGzP9wBNYuaZTip89FS1qbeSYrEO2qdNVdW2rs0mQHcIlu3Fkv5muMFmKYGi0XHhG3UhZiWQ7qiPw2svQ== dependencies: "@lumino/coreutils" "^1.11.0" @@ -1440,14 +1440,14 @@ "@jupyterlab/nbformat@^3.6.3": version "3.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/nbformat/-/nbformat-3.6.3.tgz#8520338e3679cbe8ce2ea8eb5a9b816f8b774ad3" + resolved "https://registry.npmjs.org/@jupyterlab/nbformat/-/nbformat-3.6.3.tgz" integrity sha512-0qJLa4dtOmu9EmHFeM7gaZi4qheovIPc9ZrgGGRuG0obajs4YYlvh4MQvCSgpVhme4AuBfGlcfzhlx+Gbzr5Xw== dependencies: "@lumino/coreutils" "^1.11.0" "@jupyterlab/observables@^4.6.3": version "4.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/observables/-/observables-4.6.3.tgz#49a9ca49fbda7428abbd1bfb8a4006ecd406c18d" + resolved "https://registry.npmjs.org/@jupyterlab/observables/-/observables-4.6.3.tgz" integrity sha512-CvQoL+9WHXOy/CXp/PQLi4c5iZVJ4psz11+GrycDDinX1AdVQ8a43OLTC0gxWl3Tk2C8ZvAi1sgn4FS68E1ACQ== dependencies: "@lumino/algorithm" "^1.9.0" @@ -1458,7 +1458,7 @@ "@jupyterlab/services@^6.0.0", "@jupyterlab/services@^6.6.3": version "6.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/services/-/services-6.6.3.tgz#303938e5dc5aebce7a86324a64ed89c25c61c9e7" + resolved "https://registry.npmjs.org/@jupyterlab/services/-/services-6.6.3.tgz" integrity sha512-BxEOMRl9X18T5wY7iV6ZJhARnibFghpD3OruqeSbnGdbRv6XJi8prsRbCQQ6Mf9agvf81B20KmDvYKikPHC0xQ== dependencies: "@jupyterlab/coreutils" "^5.6.3" @@ -1476,7 +1476,7 @@ "@jupyterlab/settingregistry@^3.6.3": version "3.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/settingregistry/-/settingregistry-3.6.3.tgz#642f8b6449d626821ef13a7e778ae716fa8331c9" + resolved "https://registry.npmjs.org/@jupyterlab/settingregistry/-/settingregistry-3.6.3.tgz" integrity sha512-pnzIge0ZC8V63R97HiNroJ0eaPM0DN6x65SStyLuv/K8Qez4XqpOdc0Wfell5ri5mxMvm1qKekuFeTikqSXQKQ== dependencies: "@jupyterlab/statedb" "^3.6.3" @@ -1489,7 +1489,7 @@ "@jupyterlab/statedb@^3.6.3": version "3.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/statedb/-/statedb-3.6.3.tgz#6ba2166af9232c9a185cf0077cf1272f24cc9a69" + resolved "https://registry.npmjs.org/@jupyterlab/statedb/-/statedb-3.6.3.tgz" integrity sha512-A36L+0NN8f0WOES2GdtZjp9uFuC7IBjhKiO/RlKRX5AFjNxoJ9oO3PZtoxJQYPnGBljMqVdRa+m9aYEfvKhYyQ== dependencies: "@lumino/commands" "^1.19.0" @@ -1500,7 +1500,7 @@ "@jupyterlab/translation@^3.6.3": version "3.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/translation/-/translation-3.6.3.tgz#3fd95f726316762bc1799a7b7be0243d5465932a" + resolved "https://registry.npmjs.org/@jupyterlab/translation/-/translation-3.6.3.tgz" integrity sha512-m+wwBv/hiN5Y6Sb7Ij150ZhPXZdhN5wI8CT3afnzARwKr2Aww5AIURO3upmMwnKaPVQTrWqsS3+7bZS/21JuJA== dependencies: "@jupyterlab/coreutils" "^5.6.3" @@ -1510,7 +1510,7 @@ "@jupyterlab/ui-components@^3.6.3": version "3.6.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/ui-components/-/ui-components-3.6.3.tgz#36555036b383c5d80346f409a7a168d13c9d8c85" + resolved "https://registry.npmjs.org/@jupyterlab/ui-components/-/ui-components-3.6.3.tgz" integrity sha512-XzseUo2IXclPlYcGxCIz8evjWF+dCBMmbJlvoE5OF29BYBvI5N/DUaTem8bHN5kmQwHIXX6BImHu7rbC9Xjl6w== dependencies: "@blueprintjs/core" "^3.36.0" @@ -1531,12 +1531,12 @@ "@lumino/algorithm@^1.9.0", "@lumino/algorithm@^1.9.2": version "1.9.2" - resolved "https://registry.yarnpkg.com/@lumino/algorithm/-/algorithm-1.9.2.tgz#b95e6419aed58ff6b863a51bfb4add0f795141d3" + resolved "https://registry.npmjs.org/@lumino/algorithm/-/algorithm-1.9.2.tgz" integrity sha512-Z06lp/yuhz8CtIir3PNTGnuk7909eXt4ukJsCzChsGuot2l5Fbs96RJ/FOHgwCedaX74CtxPjXHXoszFbUA+4A== "@lumino/application@^1.31.4": version "1.31.4" - resolved "https://registry.yarnpkg.com/@lumino/application/-/application-1.31.4.tgz#b804fcc46fb77deb41aee94c48bea990f735d6b9" + resolved "https://registry.npmjs.org/@lumino/application/-/application-1.31.4.tgz" integrity sha512-dOSsDJ1tXOxC3fnSHvtDQK5RcICLEVPtO19HeCGwurb5W2ZZ55SZT2b5jZu6V/v8lGdtkNbr1RJltRpJRSRb/A== dependencies: "@lumino/commands" "^1.21.1" @@ -1545,14 +1545,14 @@ "@lumino/collections@^1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@lumino/collections/-/collections-1.9.3.tgz#370dc2d50aa91371288a4f7376bea5a3191fc5dc" + resolved "https://registry.npmjs.org/@lumino/collections/-/collections-1.9.3.tgz" integrity sha512-2i2Wf1xnfTgEgdyKEpqM16bcYRIhUOGCDzaVCEZACVG9R1CgYwOe3zfn71slBQOVSjjRgwYrgLXu4MBpt6YK+g== dependencies: "@lumino/algorithm" "^1.9.2" "@lumino/commands@^1.19.0", "@lumino/commands@^1.21.1": version "1.21.1" - resolved "https://registry.yarnpkg.com/@lumino/commands/-/commands-1.21.1.tgz#eda8b3cf5ef73b9c8ce93b3b5cf66bb053df2a76" + resolved "https://registry.npmjs.org/@lumino/commands/-/commands-1.21.1.tgz" integrity sha512-d1zJmwz5bHU0BM/Rl3tRdZ7/WgXnFB0bM7x7Bf0XDlmX++jnU9k0j3mh6/5JqCGLmIApKCRwVqSaV7jPmSJlcQ== dependencies: "@lumino/algorithm" "^1.9.2" @@ -1565,12 +1565,12 @@ "@lumino/coreutils@^1.11.0", "@lumino/coreutils@^1.11.1", "@lumino/coreutils@^1.12.1": version "1.12.1" - resolved "https://registry.yarnpkg.com/@lumino/coreutils/-/coreutils-1.12.1.tgz#79860c9937483ddf6cda87f6c2b9da8eb1a5d768" + resolved "https://registry.npmjs.org/@lumino/coreutils/-/coreutils-1.12.1.tgz" integrity sha512-JLu3nTHzJk9N8ohZ85u75YxemMrmDzJdNgZztfP7F7T7mxND3YVNCkJG35a6aJ7edu1sIgCjBxOvV+hv27iYvQ== "@lumino/disposable@^1.10.0", "@lumino/disposable@^1.10.4": version "1.10.4" - resolved "https://registry.yarnpkg.com/@lumino/disposable/-/disposable-1.10.4.tgz#73b452044fecf988d7fa73fac9451b1a7f987323" + resolved "https://registry.npmjs.org/@lumino/disposable/-/disposable-1.10.4.tgz" integrity sha512-4ZxyYcyzUS+ZeB2KAH9oAH3w0DUUceiVr+FIZHZ2TAYGWZI/85WlqJtfm0xjwEpCwLLW1TDqJrISuZu3iMmVMA== dependencies: "@lumino/algorithm" "^1.9.2" @@ -1578,12 +1578,12 @@ "@lumino/domutils@^1.8.0", "@lumino/domutils@^1.8.2": version "1.8.2" - resolved "https://registry.yarnpkg.com/@lumino/domutils/-/domutils-1.8.2.tgz#d15cdbae12bea52852bbc13c4629360f9f05b7f5" + resolved "https://registry.npmjs.org/@lumino/domutils/-/domutils-1.8.2.tgz" integrity sha512-QIpMfkPJrs4GrWBuJf2Sn1fpyVPmvqUUAeD8xAQo8+4V5JAT0vUDLxZ9HijefMgNCi3+Bs8Z3lQwRCrz+cFP1A== "@lumino/dragdrop@^1.13.0", "@lumino/dragdrop@^1.14.5": version "1.14.5" - resolved "https://registry.yarnpkg.com/@lumino/dragdrop/-/dragdrop-1.14.5.tgz#1db76c8a01f74cb1b0428db6234e820bb58b93ba" + resolved "https://registry.npmjs.org/@lumino/dragdrop/-/dragdrop-1.14.5.tgz" integrity sha512-LC5xB82+xGF8hFyl716TMpV32OIMIMl+s3RU1PaqDkD6B7PkgiVk6NkJ4X9/GcEvl2igkvlGQt/3L7qxDAJNxw== dependencies: "@lumino/coreutils" "^1.12.1" @@ -1591,12 +1591,12 @@ "@lumino/keyboard@^1.8.2": version "1.8.2" - resolved "https://registry.yarnpkg.com/@lumino/keyboard/-/keyboard-1.8.2.tgz#714dbe671f0718f516d1ec23188b31a9ccd82fb2" + resolved "https://registry.npmjs.org/@lumino/keyboard/-/keyboard-1.8.2.tgz" integrity sha512-Dy+XqQ1wXbcnuYtjys5A0pAqf4SpAFl9NY6owyIhXAo0Va7w3LYp3jgiP1xAaBAwMuUppiUAfrbjrysZuZ625g== "@lumino/messaging@^1.10.0", "@lumino/messaging@^1.10.1", "@lumino/messaging@^1.10.3": version "1.10.3" - resolved "https://registry.yarnpkg.com/@lumino/messaging/-/messaging-1.10.3.tgz#b6227bdfc178a8542571625ecb68063691b6af3c" + resolved "https://registry.npmjs.org/@lumino/messaging/-/messaging-1.10.3.tgz" integrity sha512-F/KOwMCdqvdEG8CYAJcBSadzp6aI7a47Fr60zAKGqZATSRRRV41q53iXU7HjFPqQqQIvdn9Z7J32rBEAyQAzww== dependencies: "@lumino/algorithm" "^1.9.2" @@ -1604,7 +1604,7 @@ "@lumino/polling@^1.9.0": version "1.11.4" - resolved "https://registry.yarnpkg.com/@lumino/polling/-/polling-1.11.4.tgz#ddfe47da5b41af4cfa474898542c099e445c0e6c" + resolved "https://registry.npmjs.org/@lumino/polling/-/polling-1.11.4.tgz" integrity sha512-yC7JLssj3mqVK6TsYj7dg4AG0rcsC42YtpoDLtz9yzO84Q5flQUfmjAPQB6oPA6wZOlISs3iasF+uO2w1ls5jg== dependencies: "@lumino/coreutils" "^1.12.1" @@ -1613,12 +1613,12 @@ "@lumino/properties@^1.8.0", "@lumino/properties@^1.8.2": version "1.8.2" - resolved "https://registry.yarnpkg.com/@lumino/properties/-/properties-1.8.2.tgz#91131f2ca91a902faa138771eb63341db78fc0fd" + resolved "https://registry.npmjs.org/@lumino/properties/-/properties-1.8.2.tgz" integrity sha512-EkjI9Cw8R0U+xC9HxdFSu7X1tz1H1vKu20cGvJ2gU+CXlMB1DvoYJCYxCThByHZ+kURTAap4SE5x8HvKwNPbig== "@lumino/signaling@^1.10.0", "@lumino/signaling@^1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@lumino/signaling/-/signaling-1.11.1.tgz#438f447a1b644fd286549804f9851b5aec9679a2" + resolved "https://registry.npmjs.org/@lumino/signaling/-/signaling-1.11.1.tgz" integrity sha512-YCUmgw08VoyMN5KxzqPO3KMx+cwdPv28tAN06C0K7Q/dQf+oufb1XocuhZb5selTrTmmuXeizaYxgLIQGdS1fA== dependencies: "@lumino/algorithm" "^1.9.2" @@ -1626,14 +1626,14 @@ "@lumino/virtualdom@^1.14.0", "@lumino/virtualdom@^1.14.3": version "1.14.3" - resolved "https://registry.yarnpkg.com/@lumino/virtualdom/-/virtualdom-1.14.3.tgz#e490c36ff506d877cf45771d6968e3e26a8919fd" + resolved "https://registry.npmjs.org/@lumino/virtualdom/-/virtualdom-1.14.3.tgz" integrity sha512-5joUC1yuxeXbpfbSBm/OR8Mu9HoTo6PDX0RKqzlJ9o97iml7zayFN/ynzcxScKGQAo9iaXOY8uVIvGUT8FnsGw== dependencies: "@lumino/algorithm" "^1.9.2" "@lumino/widgets@^1.30.0", "@lumino/widgets@^1.37.2": version "1.37.2" - resolved "https://registry.yarnpkg.com/@lumino/widgets/-/widgets-1.37.2.tgz#b408fae221ecec2f1b028607782fbe1e82588bce" + resolved "https://registry.npmjs.org/@lumino/widgets/-/widgets-1.37.2.tgz" integrity sha512-NHKu1NBDo6ETBDoNrqSkornfUCwc8EFFzw6+LWBfYVxn2PIwciq2SdiJGEyNqL+0h/A9eVKb5ui5z4cwpRekmQ== dependencies: "@lumino/algorithm" "^1.9.2" @@ -1650,12 +1650,12 @@ "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" - resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz" integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== "@npmcli/fs@^1.0.0": version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== dependencies: "@gar/promisify" "^1.0.1" @@ -1663,7 +1663,7 @@ "@npmcli/move-file@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== dependencies: mkdirp "^1.0.4" @@ -1671,7 +1671,7 @@ "@rjsf/core@^3.1.0": version "3.2.1" - resolved "https://registry.yarnpkg.com/@rjsf/core/-/core-3.2.1.tgz#8a7b24c9a6f01f0ecb093fdfc777172c12b1b009" + resolved "https://registry.npmjs.org/@rjsf/core/-/core-3.2.1.tgz" integrity sha512-dk8ihvxFbcuIwU7G+HiJbFgwyIvaumPt5g5zfnuC26mwTUPlaDGFXKK2yITp8tJ3+hcwS5zEXtAN9wUkfuM4jA== dependencies: "@types/json-schema" "^7.0.7" @@ -1686,26 +1686,26 @@ "@sinclair/typebox@^0.24.1": version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz" integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^9.1.2": version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" "@types/babel__core@^7.1.14": version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz" integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: "@babel/parser" "^7.20.7" @@ -1716,14 +1716,14 @@ "@types/babel__generator@*": version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" @@ -1731,14 +1731,14 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.18.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz" integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== dependencies: "@babel/types" "^7.3.0" "@types/backbone@1.4.14": version "1.4.14" - resolved "https://registry.yarnpkg.com/@types/backbone/-/backbone-1.4.14.tgz#4b71f0c25d89cfa9a10b18042f0b03d35a53364c" + resolved "https://registry.npmjs.org/@types/backbone/-/backbone-1.4.14.tgz" integrity sha512-85ldQ99fiYTJFBlZuAJRaCdvTZKZ2p1fSs3fVf+6Ub6k1X0g0hNJ0qJ/2FOByyyAQYLtbEz3shX5taKQfBKBDw== dependencies: "@types/jquery" "*" @@ -1746,12 +1746,12 @@ "@types/dom4@^2.0.1": version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/dom4/-/dom4-2.0.2.tgz#6495303f049689ce936ed328a3e5ede9c51408ee" + resolved "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.2.tgz" integrity sha512-Rt4IC1T7xkCWa0OG1oSsPa0iqnxlDeQqKXZAHrQGLb7wFGncWm85MaxKUjAGejOrUynOgWlFi4c6S6IyJwoK4g== "@types/eslint-scope@^3.7.3": version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" @@ -1759,12 +1759,12 @@ "@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" + resolved "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/eslint@*": version "8.37.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz" integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== dependencies: "@types/estree" "*" @@ -1772,95 +1772,90 @@ "@types/estree@*", "@types/estree@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/graceful-fs@^4.1.3": version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^27.4.1": - version "27.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.2.tgz#ec49d29d926500ffb9fd22b84262e862049c026c" - integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== +"@types/jest@^28": + version "28.1.8" + resolved "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz" + integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + expect "^28.0.0" + pretty-format "^28.0.0" "@types/jquery@*": version "3.5.16" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.16.tgz#632131baf30951915b0317d48c98e9890bdf051d" + resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz" integrity sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw== dependencies: "@types/sizzle" "*" "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/lodash@^4.14.134", "@types/lodash@^4.14.191": version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz" integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== -"@types/node@*": - version "18.16.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01" - integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q== - -"@types/node@^10.11.6": +"@types/node@*", "@types/node@^10.11.6": version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/parse-json@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/prop-types@*": version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react-dom@^18.0.0": version "18.2.1" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.1.tgz#663b2612feb5f6431a70207430d7c04881b87f29" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.1.tgz" integrity sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.0": version "18.2.0" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.0.tgz#15cda145354accfc09a18d2f2305f9fc099ada21" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz" integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== dependencies: "@types/prop-types" "*" @@ -1869,7 +1864,7 @@ "@types/react@^17.0.0": version "17.0.58" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.58.tgz#c8bbc82114e5c29001548ebe8ed6c4ba4d3c9fb0" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz" integrity sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A== dependencies: "@types/prop-types" "*" @@ -1878,37 +1873,37 @@ "@types/scheduler@*": version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== "@types/sizzle@*": version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== "@types/source-list-map@*": version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== "@types/stack-utils@^2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/underscore@*": version "1.11.4" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" + resolved "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz" integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== "@types/webpack-env@^1.13.6": version "1.18.0" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.0.tgz#ed6ecaa8e5ed5dfe8b2b3d00181702c9925f13fb" + resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz" integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== "@types/webpack-sources@^0.1.5": version "0.1.9" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.9.tgz#da69b06eb34f6432e6658acb5a6893c55d983920" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz" integrity sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new== dependencies: "@types/node" "*" @@ -1917,19 +1912,19 @@ "@types/yargs-parser@*": version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^3.5.0": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz#7e061338a1383f59edc204c605899f93dc2e2c8f" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz" integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== dependencies: "@typescript-eslint/experimental-utils" "3.10.1" @@ -1941,7 +1936,7 @@ "@typescript-eslint/experimental-utils@3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz" integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== dependencies: "@types/json-schema" "^7.0.3" @@ -1950,9 +1945,9 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^3.5.0": +"@typescript-eslint/parser@^3.0.0", "@typescript-eslint/parser@^3.5.0": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz" integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== dependencies: "@types/eslint-visitor-keys" "^1.0.0" @@ -1963,12 +1958,12 @@ "@typescript-eslint/types@3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz" integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz" integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== dependencies: "@typescript-eslint/types" "3.10.1" @@ -1982,37 +1977,80 @@ "@typescript-eslint/visitor-keys@3.10.1": version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz" integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== dependencies: eslint-visitor-keys "^1.1.0" -"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.5.tgz#6e818036b94548c1fb53b754b5cae3c9b208281c" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz" integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== dependencies: "@webassemblyjs/helper-numbers" "1.11.5" "@webassemblyjs/helper-wasm-bytecode" "1.11.5" +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@webassemblyjs/floating-point-hex-parser@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz#e85dfdb01cad16b812ff166b96806c050555f1b4" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz" integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + "@webassemblyjs/helper-api-error@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz#1e82fa7958c681ddcf4eabef756ce09d49d442d1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz" integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + "@webassemblyjs/helper-buffer@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz#91381652ea95bb38bbfd270702351c0c89d69fba" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz" integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-numbers@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz#23380c910d56764957292839006fecbe05e135a9" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz" integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.5" @@ -2021,12 +2059,17 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz#e258a25251bc69a52ef817da3001863cc1c24b9f" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz" integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + "@webassemblyjs/helper-wasm-section@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz#966e855a6fae04d5570ad4ec87fbcf29b42ba78e" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz" integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== dependencies: "@webassemblyjs/ast" "1.11.5" @@ -2034,28 +2077,57 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.5" "@webassemblyjs/wasm-gen" "1.11.5" +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/ieee754@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz#b2db1b33ce9c91e34236194c2b5cba9b25ca9d60" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz" integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== dependencies: "@xtuc/ieee754" "^1.2.0" +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/leb128@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.5.tgz#482e44d26b6b949edf042a8525a66c649e38935a" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz" integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== dependencies: "@xtuc/long" "4.2.2" +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + "@webassemblyjs/utf8@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.5.tgz#83bef94856e399f3740e8df9f63bc47a987eae1a" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz" integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz#93ee10a08037657e21c70de31c47fdad6b522b2d" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz" integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== dependencies: "@webassemblyjs/ast" "1.11.5" @@ -2067,9 +2139,23 @@ "@webassemblyjs/wasm-parser" "1.11.5" "@webassemblyjs/wast-printer" "1.11.5" +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + "@webassemblyjs/wasm-gen@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz#ceb1c82b40bf0cf67a492c53381916756ef7f0b1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz" integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== dependencies: "@webassemblyjs/ast" "1.11.5" @@ -2078,9 +2164,20 @@ "@webassemblyjs/leb128" "1.11.5" "@webassemblyjs/utf8" "1.11.5" +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + "@webassemblyjs/wasm-opt@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz#b52bac29681fa62487e16d3bb7f0633d5e62ca0a" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz" integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== dependencies: "@webassemblyjs/ast" "1.11.5" @@ -2088,9 +2185,19 @@ "@webassemblyjs/wasm-gen" "1.11.5" "@webassemblyjs/wasm-parser" "1.11.5" -"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz#7ba0697ca74c860ea13e3ba226b29617046982e2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz" integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== dependencies: "@webassemblyjs/ast" "1.11.5" @@ -2100,86 +2207,124 @@ "@webassemblyjs/leb128" "1.11.5" "@webassemblyjs/utf8" "1.11.5" +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + "@webassemblyjs/wast-printer@1.11.5": version "1.11.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz#7a5e9689043f3eca82d544d7be7a8e6373a6fa98" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz" integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== dependencies: "@webassemblyjs/ast" "1.11.5" "@xtuc/long" "4.2.2" +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + "@webpack-cli/configtest@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== "@webpack-cli/info@^1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz" integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== dependencies: envinfo "^7.7.3" "@webpack-cli/serve@^1.7.0": version "1.7.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz" integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== acorn-import-assertions@^1.7.6: version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^6.2.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^6.2.0, acorn@^6.4.1: version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.5.0, acorn@^8.7.1: +acorn@^8, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +acorn@^8.5.0: version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -ag-grid-community@^29.2.0: +ag-grid-community@^29.2.0, ag-grid-community@~29.3.3: version "29.3.3" - resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-29.3.3.tgz#87a649d3c549e3e3b8316ac2e262dc566788ef1f" + resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.3.tgz" integrity sha512-5XHG2NtXfUFroST/IvWyIYzM7GnbAM1mX7YsKvUHRWk0iMY1kAMJMk6AOoNKe1BBj7jg+Wgbig123T4X7bNZPw== ag-grid-react@^29.2.0: version "29.3.3" - resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-29.3.3.tgz#ce5eef347dc8487dc694364bda1b6b1fa0bf8f30" + resolved "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-29.3.3.tgz" integrity sha512-xciimp9q8FXv2bgLOIyPT11dKEW0KNDTF8hyDuAKuK3541YBTZpiycwtmYxVimUM4c007TRTEYgw6Kql/gqWiA== dependencies: prop-types "^15.8.1" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -2187,17 +2332,17 @@ aggregate-error@^3.0.0: ajv-errors@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0, ajv@^6.9.1, ajv@>=5.0.0: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -2207,7 +2352,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: ajv@^8.0.1: version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" @@ -2217,107 +2362,180 @@ ajv@^8.0.1: ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-buffer-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== dependencies: call-bind "^1.0.2" is-array-buffer "^3.0.1" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-each@^1.0.1: + version "1.0.6" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz" + integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== + async@^2.5.0: version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== babel-code-frame@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" -babel-jest@^28.1.3: +babel-jest@^28, babel-jest@^28.0.0, babel-jest@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== dependencies: "@jest/transform" "^28.1.3" @@ -2330,14 +2548,14 @@ babel-jest@^28.1.3: babel-messages@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz" integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== dependencies: babel-runtime "^6.22.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -2348,7 +2566,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== dependencies: "@babel/template" "^7.3.3" @@ -2358,7 +2576,7 @@ babel-plugin-jest-hoist@^28.1.3: babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== dependencies: "@babel/compat-data" "^7.17.7" @@ -2367,7 +2585,7 @@ babel-plugin-polyfill-corejs2@^0.3.3: babel-plugin-polyfill-corejs3@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" @@ -2375,14 +2593,14 @@ babel-plugin-polyfill-corejs3@^0.6.0: babel-plugin-polyfill-regenerator@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" babel-plugin-transform-es2015-modules-commonjs@^6.26.2: version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz" integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" @@ -2392,7 +2610,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.26.2: babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz" integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw== dependencies: babel-runtime "^6.22.0" @@ -2400,7 +2618,7 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -2418,7 +2636,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-jest@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== dependencies: babel-plugin-jest-hoist "^28.1.3" @@ -2426,7 +2644,7 @@ babel-preset-jest@^28.1.3: babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" @@ -2434,7 +2652,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz" integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== dependencies: babel-runtime "^6.26.0" @@ -2445,7 +2663,7 @@ babel-template@^6.26.0: babel-traverse@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz" integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== dependencies: babel-code-frame "^6.26.0" @@ -2460,7 +2678,7 @@ babel-traverse@^6.26.0: babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== dependencies: babel-runtime "^6.26.0" @@ -2470,49 +2688,186 @@ babel-types@^6.24.1, babel-types@^6.26.0: babylon@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backbone@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" + resolved "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz" integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== dependencies: underscore ">=1.8.3" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^4.1.0: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.1" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: caniuse-lite "^1.0.30001449" @@ -2522,26 +2877,66 @@ browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: bs-logger@0.x: version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cacache@^15.0.5: version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== dependencies: "@npmcli/fs" "^1.0.0" @@ -2563,9 +2958,24 @@ cacache@^15.0.5: tar "^6.0.2" unique-filename "^1.1.1" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2573,27 +2983,27 @@ call-bind@^1.0.0, call-bind@^1.0.2: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001449: version "1.0.30001482" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz#8b3fad73dc35b2674a5c96df2d4f9f1c561435de" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz" integrity sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ== chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" @@ -2604,16 +3014,24 @@ chalk@^1.1.3: chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -2621,12 +3039,31 @@ chalk@^4.0.0, chalk@^4.1.0: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chokidar@^3.4.0: +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.0, chokidar@^3.4.1: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -2639,46 +3076,69 @@ chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + cjs-module-lexer@^1.0.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + classnames@^2.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -2686,7 +3146,7 @@ cli-truncate@^2.1.0: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -2695,7 +3155,7 @@ cliui@^8.0.1: clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -2704,76 +3164,89 @@ clone-deep@^4.0.1: co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colorette@^2.0.14, colorette@^2.0.16: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^6.2.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commander@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commander@~6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" + resolved "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz" integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + compute-gcd@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" + resolved "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz" integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== dependencies: validate.io-array "^1.0.3" @@ -2782,7 +3255,7 @@ compute-gcd@^1.2.1: compute-lcm@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" + resolved "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz" integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== dependencies: compute-gcd "^1.2.1" @@ -2792,39 +3265,76 @@ compute-lcm@^1.1.0: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + core-js-compat@^3.25.1: version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.1.tgz#961541e22db9c27fc48bfc13a3cafa8734171dfe" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz" integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== dependencies: browserslist "^4.21.5" core-js-pure@^3.6.5: version "3.30.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.1.tgz#7d93dc89e7d47b8ef05d7e79f507b0e99ea77eec" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.1.tgz" integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg== core-js@^2.4.0: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== dependencies: "@types/parse-json" "^4.0.0" @@ -2833,9 +3343,40 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + cross-spawn@^6.0.5: version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" @@ -2846,16 +3387,38 @@ cross-spawn@^6.0.5: cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" + integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== + css-loader@^3.0.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz" integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== dependencies: camelcase "^5.3.1" @@ -2874,7 +3437,7 @@ css-loader@^3.0.0: css-loader@^5.0.1: version "5.2.7" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz" integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== dependencies: icss-utils "^5.1.0" @@ -2890,50 +3453,74 @@ css-loader@^5.0.1: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + csstype@3.0.10: version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +cyclist@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz" + integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== data-urls@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== dependencies: abab "^2.0.3" whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^2.3.3: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@^2.6.8: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + dedent@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-equal@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== dependencies: is-arguments "^1.0.4" @@ -2945,54 +3532,88 @@ deep-equal@^1.1.1: deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - diff-sequences@^28.1.1: version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-helpers@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== dependencies: "@babel/runtime" "^7.1.2" dom-serializer@^1.0.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -3001,33 +3622,48 @@ dom-serializer@^1.0.1: dom4@^2.1.5: version "2.1.6" - resolved "https://registry.yarnpkg.com/dom4/-/dom4-2.1.6.tgz#c90df07134aa0dbd81ed4d6ba1237b36fc164770" + resolved "https://registry.npmjs.org/dom4/-/dom4-2.1.6.tgz" integrity sha512-JkCVGnN4ofKGbjf5Uvc8mmxaATIErKQKSgACdBXpsQ3fY6DlIpAyWfiBSrGkttATssbDCp3psiAKWXk5gmjycA== +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^4.0.0, domhandler@^4.2.0: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" domutils@^2.5.2: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" domhandler "^4.2.0" +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + duplicate-package-checker-webpack-plugin@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz#78bb89e625fa7cf8c2a59c53f62b495fda9ba287" + resolved "https://registry.npmjs.org/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz" integrity sha512-aO50/qPC7X2ChjRFniRiscxBLT/K01bALqfcDaf8Ih5OqQ1N4iT/Abx9Ofu3/ms446vHTm46FACIuJUmgUQcDQ== dependencies: chalk "^2.3.0" @@ -3037,39 +3673,52 @@ duplicate-package-checker-webpack-plugin@^3.0.0: electron-to-chromium@^1.4.284: version "1.4.380" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.380.tgz#195dc59d930c6b74efbee6f0e6a267ce4af5ed91" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.380.tgz" integrity sha512-XKGdI4pWM78eLH2cbXJHiBnWUwFSzZM7XujsB6stDiGu9AeSqziedP6amNLpJzE3i0rLTcfAwdCTs5ecP5yeSg== +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emittery@^0.10.2: version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 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" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0: +enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== dependencies: graceful-fs "^4.1.2" @@ -3078,46 +3727,46 @@ enhanced-resolve@^4.0.0: enhanced-resolve@^5.13.0: version "5.13.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz" integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@^2.3.6: +enquirer@^2.3.5, enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== envinfo@^7.7.3: version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -errno@^0.1.3: +errno@^0.1.3, errno@~0.1.7: version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: array-buffer-byte-length "^1.0.0" @@ -3157,12 +3806,12 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: es-module-lexer@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz" integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== es-set-tostringtag@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== dependencies: get-intrinsic "^1.1.3" @@ -3171,7 +3820,7 @@ es-set-tostringtag@^2.0.1: 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" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -3180,41 +3829,49 @@ es-to-primitive@^1.2.1: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-config-prettier@^6.11.0: version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz" integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" eslint-plugin-prettier@^3.1.4: version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0, eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -3222,24 +3879,24 @@ eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.3.1: +eslint@*, "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", eslint@^7.3.1, eslint@>=3.14.1, eslint@>=5.0.0: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -3285,7 +3942,7 @@ eslint@^7.3.1: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -3294,46 +3951,59 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.3.0: +esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -events@^3.2.0: +events@^3.0.0, events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + execa@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" @@ -3348,7 +4018,7 @@ execa@^4.1.0: execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -3363,12 +4033,25 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^28.1.3: +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^28.0.0, expect@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== dependencies: "@jest/expect-utils" "^28.1.3" @@ -3377,71 +4060,129 @@ expect@^28.1.3: jest-message-util "^28.1.3" jest-util "^28.1.3" -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.x: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastest-levenshtein@^1.0.12: version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" +file-loader@*, file-loader@~6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz" + integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + file-loader@~4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz" integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== dependencies: loader-utils "^1.2.3" schema-utils "^2.5.0" -file-loader@~6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" - integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.5" + extend-shallow "^2.0.1" + is-number "^3.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" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-cache-dir@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" @@ -3450,12 +4191,19 @@ find-cache-dir@^3.3.1: find-root@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -3463,7 +4211,7 @@ find-up@^4.0.0, find-up@^4.1.0: flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -3471,24 +4219,52 @@ flat-cache@^3.0.4: flatted@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + free-style@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/free-style/-/free-style-3.1.0.tgz#4e2996029534e6b1731611d843437b9e2f473f08" + resolved "https://registry.npmjs.org/free-style/-/free-style-3.1.0.tgz" integrity sha512-vJujYSIyT30iDoaoeigNAxX4yB1RUrh+N2ZMhIElMr3BvCuGXOw7XNJMEEJkDUeamK2Rnb/IKFGKRKlTWIGRWA== +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs-extra@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -3497,7 +4273,7 @@ fs-extra@^7.0.0: fs-extra@^9.0.1: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -3507,34 +4283,52 @@ fs-extra@^9.0.1: fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs-readdir-recursive@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" + integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== dependencies: call-bind "^1.0.2" @@ -3544,27 +4338,27 @@ function.prototype.name@^1.1.5: 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" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== dependencies: function-bind "^1.1.1" @@ -3573,54 +4367,67 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stdin@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== get-stream@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" + integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -3632,7 +4439,7 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: glob@~7.1.6: version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -3644,111 +4451,175 @@ glob@~7.1.6: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: +globals@^13.6.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globals@^13.9.0: version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" globals@^9.18.0: version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globalthis@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: define-properties "^1.1.3" gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== gud@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + resolved "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz" integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== has-ansi@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + hosted-git-info@^2.1.4: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== htmlparser2@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -3756,43 +4627,58 @@ htmlparser2@^6.0.0: domutils "^2.5.2" entities "^2.0.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== dependencies: postcss "^7.0.14" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" + integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== + ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -3800,7 +4686,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -3808,35 +4694,45 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.4: +infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + internal-slot@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: get-intrinsic "^1.2.0" @@ -3845,19 +4741,33 @@ internal-slot@^1.0.5: interpret@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== invariant@^2.2.2: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + is-arguments@^1.0.4: version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: call-bind "^1.0.2" @@ -3865,7 +4775,7 @@ is-arguments@^1.0.4: is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" @@ -3874,109 +4784,191 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" + integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== + dependencies: + binary-extensions "^1.0.0" + is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0: version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== dependencies: has "^1.0.3" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" -is-extglob@^2.1.1: +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 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" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 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" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" + integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== + dependencies: + is-extglob "^2.1.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-negative-zero@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + 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" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== +is-plain-object@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-plain-object@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-regex@^1.0.4, is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -3984,38 +4976,38 @@ is-regex@^1.0.4, is-regex@^1.1.4: is-regexp@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -4026,39 +5018,56 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" -isarray@~1.0.0: +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^3.0.1: +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -4069,7 +5078,7 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -4078,7 +5087,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -4087,7 +5096,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" @@ -4095,7 +5104,7 @@ istanbul-reports@^3.1.3: jest-changed-files@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== dependencies: execa "^5.0.0" @@ -4103,7 +5112,7 @@ jest-changed-files@^28.1.3: jest-circus@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== dependencies: "@jest/environment" "^28.1.3" @@ -4128,7 +5137,7 @@ jest-circus@^28.1.3: jest-cli@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== dependencies: "@jest/core" "^28.1.3" @@ -4146,7 +5155,7 @@ jest-cli@^28.1.3: jest-config@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== dependencies: "@babel/core" "^7.11.6" @@ -4172,19 +5181,9 @@ jest-config@^28.1.3: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - jest-diff@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== dependencies: chalk "^4.0.0" @@ -4194,14 +5193,14 @@ jest-diff@^28.1.3: jest-docblock@^28.1.1: version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== dependencies: detect-newline "^3.0.0" jest-each@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== dependencies: "@jest/types" "^28.1.3" @@ -4212,7 +5211,7 @@ jest-each@^28.1.3: jest-environment-node@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== dependencies: "@jest/environment" "^28.1.3" @@ -4222,19 +5221,14 @@ jest-environment-node@^28.1.3: jest-mock "^28.1.3" jest-util "^28.1.3" -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - jest-get-type@^28.0.2: version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== jest-haste-map@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== dependencies: "@jest/types" "^28.1.3" @@ -4253,25 +5247,15 @@ jest-haste-map@^28.1.3: jest-leak-detector@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== dependencies: jest-get-type "^28.0.2" pretty-format "^28.1.3" -jest-matcher-utils@^27.0.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - jest-matcher-utils@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== dependencies: chalk "^4.0.0" @@ -4281,7 +5265,7 @@ jest-matcher-utils@^28.1.3: jest-message-util@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== dependencies: "@babel/code-frame" "^7.12.13" @@ -4296,7 +5280,7 @@ jest-message-util@^28.1.3: jest-mock@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== dependencies: "@jest/types" "^28.1.3" @@ -4304,25 +5288,25 @@ jest-mock@^28.1.3: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^28.0.2: version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== jest-resolve-dependencies@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== dependencies: jest-regex-util "^28.0.2" jest-snapshot "^28.1.3" -jest-resolve@^28.1.3: +jest-resolve@*, jest-resolve@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== dependencies: chalk "^4.0.0" @@ -4337,7 +5321,7 @@ jest-resolve@^28.1.3: jest-runner@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== dependencies: "@jest/console" "^28.1.3" @@ -4364,7 +5348,7 @@ jest-runner@^28.1.3: jest-runtime@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== dependencies: "@jest/environment" "^28.1.3" @@ -4392,7 +5376,7 @@ jest-runtime@^28.1.3: jest-snapshot@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== dependencies: "@babel/core" "^7.11.6" @@ -4421,7 +5405,7 @@ jest-snapshot@^28.1.3: jest-util@^28.0.0, jest-util@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== dependencies: "@jest/types" "^28.1.3" @@ -4433,7 +5417,7 @@ jest-util@^28.0.0, jest-util@^28.1.3: jest-validate@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== dependencies: "@jest/types" "^28.1.3" @@ -4445,7 +5429,7 @@ jest-validate@^28.1.3: jest-watcher@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== dependencies: "@jest/test-result" "^28.1.3" @@ -4459,7 +5443,7 @@ jest-watcher@^28.1.3: jest-worker@^26.5.0: version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== dependencies: "@types/node" "*" @@ -4468,7 +5452,7 @@ jest-worker@^26.5.0: jest-worker@^27.4.5: version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" @@ -4477,16 +5461,16 @@ jest-worker@^27.4.5: jest-worker@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^28.1.3: +jest@^28, jest@^28.0.0: version "28.1.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== dependencies: "@jest/core" "^28.1.3" @@ -4496,22 +5480,22 @@ jest@^28.1.3: jquery@^3.1.1: version "3.6.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" + resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-tokens@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -4519,34 +5503,34 @@ js-yaml@^3.13.1: jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-better-errors@^1.0.1: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-compare@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" + resolved "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz" integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== dependencies: lodash "^4.17.4" json-schema-merge-allof@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.6.0.tgz#64d48820fec26b228db837475ce3338936bf59a5" + resolved "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.6.0.tgz" integrity sha512-LEw4VMQVRceOPLuGRWcxW5orTTiR9ZAtqTAe4rQUjNADTeR81bezBVFa0MqIwp0YmHIM1KkhSjZM7o+IQhaPbQ== dependencies: compute-lcm "^1.1.0" @@ -4555,41 +5539,41 @@ json-schema-merge-allof@^0.6.0: json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 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" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.1.1, json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -4598,27 +5582,53 @@ jsonfile@^6.0.1: jsonpointer@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -kind-of@^6.0.2: +kind-of@^3.0.2, kind-of@^3.0.3: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -4626,7 +5636,7 @@ levn@^0.4.1: license-webpack-plugin@^2.3.14: version "2.3.21" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.21.tgz#152f5e82d5f51f8bab78905731f2b8042aa5691b" + resolved "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.21.tgz" integrity sha512-rVaYU9TddZN3ao8M/0PrRSCdTp2EW6VQymlgsuScld1vef0Ou7fALx3ePe83KLP3xAEDcPK5fkqUVqGBnbz1zQ== dependencies: "@types/webpack-sources" "^0.1.5" @@ -4634,12 +5644,12 @@ license-webpack-plugin@^2.3.14: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^10.2.11: version "10.5.4" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz" integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== dependencies: chalk "^4.1.0" @@ -4660,7 +5670,7 @@ lint-staged@^10.2.11: listr2@^3.2.2: version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" @@ -4674,7 +5684,7 @@ listr2@^3.2.2: load-json-file@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" @@ -4682,14 +5692,19 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + loader-runner@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== dependencies: big.js "^5.2.2" @@ -4698,7 +5713,7 @@ loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2 loader-utils@^2.0.0, loader-utils@~2.0.0: version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" @@ -4707,48 +5722,56 @@ loader-utils@^2.0.0, loader-utils@~2.0.0: loader-utils@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: big.js "^5.2.2" emojis-list "^2.0.0" json5 "^1.0.1" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.memoize@4.x: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -4756,7 +5779,7 @@ log-symbols@^4.0.0: log-update@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -4766,55 +5789,91 @@ log-update@^4.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" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" -make-dir@^2.1.0: +make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-dir@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" make-error@1.x: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" + integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== + dependencies: + 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" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz" integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== dependencies: errno "^0.1.3" @@ -4822,168 +5881,297 @@ memory-fs@^0.5.0: memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" picomatch "^2.3.1" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.27: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== mini-css-extract-plugin@~1.3.2: version "1.3.9" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz#47a32132b0fd97a119acd530e8421e8f6ab16d5e" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz" integrity sha512-Ac4s+xhVbqlyhXS5J/Vh/QXUz3ycXlCqoCPpg0vdfhsIBH9eg/It/9L1r1XhSCH737M1lqcWnMuWL13zcygn5A== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" webpack-sources "^1.1.0" +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6, minimist@~1.2.0: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== dependencies: minipass "^3.0.0" minipass-flush@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: minipass "^3.0.0" minipass-pipeline@^1.2.2: version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: minipass "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: version "3.3.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" minipass@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" yallist "^4.0.0" -mkdirp@^0.5.1: +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== moment@^2.24.0: version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" + integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +nan@^2.12.1: + version "2.17.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + nanoid@^3.1.23, nanoid@^3.3.6: version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nice-try@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch@^2.6.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== dependencies: whatwg-url "^5.0.0" node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + node-releases@^2.0.8: version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== normalize-package-data@^2.3.2: version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" @@ -4991,19 +6179,26 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize.css@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" + resolved "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz" integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== npm-run-all@^4.1.3: version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + resolved "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz" integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== dependencies: ansi-styles "^3.2.1" @@ -5018,24 +6213,33 @@ npm-run-all@^4.1.3: npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.0.1: version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: call-bind "^1.0.2" @@ -5043,12 +6247,19 @@ object-is@^1.0.1: object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -5056,23 +6267,30 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -5082,42 +6300,61 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== paddy-react-edit-list@>=1.1.37: version "1.1.37" - resolved "https://registry.yarnpkg.com/paddy-react-edit-list/-/paddy-react-edit-list-1.1.37.tgz#2f848450ecc3e5cb89f8fae37cb3aa8a184937f3" + resolved "https://registry.npmjs.org/paddy-react-edit-list/-/paddy-react-edit-list-1.1.37.tgz" integrity sha512-NdR9oKZ8y1GrLvHOCKWkLTIQODCtqD/CI1Yz1cS2znKhDvwDibx1bnS66mxrN1U80PxbKNgv/4i8/j71WgwuTw== dependencies: "@ag-grid-community/client-side-row-model" "^29.2.0" @@ -5128,16 +6365,41 @@ paddy-react-edit-list@>=1.1.37: react "^18.0.0" react-dom "^18.0.0" +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + 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" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + parse-json@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" @@ -5145,7 +6407,7 @@ parse-json@^4.0.0: parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -5155,120 +6417,163 @@ parse-json@^5.0.0, parse-json@^5.2.0: parse-srcset@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" + resolved "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + path-browserify@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" + integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + picocolors@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@^0.3.0: version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== pify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pify@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pirates@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" please-upgrade-node@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + resolved "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz" integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== dependencies: semver-compare "^1.0.0" popper.js@^1.14.4, popper.js@^1.16.1: version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + postcss-modules-extract-imports@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz" integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== dependencies: postcss "^7.0.5" postcss-modules-extract-imports@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== postcss-modules-local-by-default@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz" integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== dependencies: icss-utils "^4.1.1" @@ -5278,7 +6583,7 @@ postcss-modules-local-by-default@^3.0.2: postcss-modules-local-by-default@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== dependencies: icss-utils "^5.0.0" @@ -5287,7 +6592,7 @@ postcss-modules-local-by-default@^4.0.0: postcss-modules-scope@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz" integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== dependencies: postcss "^7.0.6" @@ -5295,14 +6600,14 @@ postcss-modules-scope@^2.2.0: postcss-modules-scope@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: postcss-selector-parser "^6.0.4" postcss-modules-values@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz" integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== dependencies: icss-utils "^4.0.0" @@ -5310,14 +6615,14 @@ postcss-modules-values@^3.0.0: postcss-modules-values@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: icss-utils "^5.0.0" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.12" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz" integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== dependencies: cssesc "^3.0.0" @@ -5325,20 +6630,29 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector postcss-value-parser@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.15, postcss@^8.3.11: +postcss@^8.1.0, postcss@^8.2.15: + version "8.4.23" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.3.11: version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz" integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== dependencies: nanoid "^3.3.6" @@ -5347,33 +6661,24 @@ postcss@^8.2.15, postcss@^8.3.11: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" -prettier@^2.0.5: +prettier@^2.0.5, prettier@>=1.13.0: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-format@^27.0.0, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^28.1.3: +pretty-format@^28.0.0, pretty-format@^28.1.3: version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== dependencies: "@jest/schemas" "^28.1.3" @@ -5383,35 +6688,35 @@ pretty-format@^28.1.3: process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" 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" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -5420,64 +6725,111 @@ prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: prr@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + querystring@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -randombytes@^2.1.0: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + raw-loader@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + resolved "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz" integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" -react-dom@^17.0.1: +"react-dom@^15.3.0 || 16 || 17", react-dom@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" scheduler "^0.20.2" -react-dom@^18.0.0: +"react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, react-dom@>=15.0.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" @@ -5485,27 +6837,22 @@ react-dom@^18.0.0: react-is@^16.13.1, react-is@^16.9.0: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - react-is@^18.0.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react-lifecycles-compat@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== react-popper@^1.3.7: version "1.3.11" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" + resolved "https://registry.npmjs.org/react-popper/-/react-popper-1.3.11.tgz" integrity sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg== dependencies: "@babel/runtime" "^7.1.2" @@ -5518,7 +6865,7 @@ react-popper@^1.3.7: react-transition-group@^2.9.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== dependencies: dom-helpers "^3.4.0" @@ -5526,33 +6873,33 @@ react-transition-group@^2.9.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@^17.0.1: +"react@^15.3.0 || 16 || 17", react@^17.0.1, "react@0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0", react@17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" -react@^18.0.0: +"react@^16.3.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@>=0.14.0, react@>=15.0.0, react@>=16: version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" read-pkg@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.1: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6, "readable-stream@1 || 2": version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -5563,52 +6910,78 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" rechoir@^0.7.0: version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== dependencies: resolve "^1.9.0" regenerate-unicode-properties@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.11: version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-transform@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== dependencies: "@babel/runtime" "^7.8.4" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" @@ -5617,12 +6990,12 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: regexpp@^3.0.0, regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" @@ -5634,51 +7007,71 @@ regexpu-core@^5.3.1: regjsparser@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: jsesc "~0.5.0" +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + resolve.exports@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: is-core-module "^2.11.0" @@ -5687,65 +7080,104 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" 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.npmjs.org/ret/-/ret-0.1.15.tgz" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.6.2: +rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" + integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== + dependencies: + aproba "^1.1.1" + rxjs@^7.5.1: version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" -safe-buffer@^5.1.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex-test@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== dependencies: call-bind "^1.0.2" get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3.0.0": +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sanitize-html@~2.7.3: version "2.7.3" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.7.3.tgz#166c868444ee4f9fd7352ac8c63fa86c343fc2bd" + resolved "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.3.tgz" integrity sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw== dependencies: deepmerge "^4.2.2" @@ -5757,7 +7189,7 @@ sanitize-html@~2.7.3: scheduler@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" @@ -5765,14 +7197,14 @@ scheduler@^0.20.2: scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" schema-utils@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz" integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" @@ -5781,16 +7213,25 @@ schema-utils@^1.0.0: schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.7.0: version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: "@types/json-schema" "^7.0.5" ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: +schema-utils@^3.0.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1, schema-utils@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== dependencies: "@types/json-schema" "^7.0.8" @@ -5799,79 +7240,145 @@ schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: semver-compare@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +semver@^5.4.1: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1: version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, 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== +semver@^7.3.2: + version "7.5.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5: + version "7.5.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + dependencies: + lru-cache "^6.0.0" + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.x: + version "7.5.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" serialize-javascript@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" serialize-javascript@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shebang-command@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -5880,27 +7387,27 @@ side-channel@^1.0.4: signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -5909,26 +7416,56 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + source-list-map@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-loader@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.4.tgz#c18b0dc6e23bf66f6792437557c569a11e072271" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz" integrity sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ== dependencies: async "^2.5.0" @@ -5936,7 +7473,7 @@ source-map-loader@^0.2.4: source-map-loader@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.0.2.tgz#b0a6582b2eaa387ede1ecf8061ae0b93c23f9eb0" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.2.tgz" integrity sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw== dependencies: data-urls "^2.0.0" @@ -5945,9 +7482,20 @@ source-map-loader@~1.0.2: schema-utils "^2.7.0" source-map "^0.6.1" -source-map-support@0.5.13: +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12, source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -5955,20 +7503,30 @@ source-map-support@0.5.13: source-map-support@~0.5.20: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" @@ -5976,12 +7534,12 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" @@ -5989,36 +7547,97 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssri@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + ssri@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== dependencies: minipass "^3.1.1" stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + string-argv@0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -6026,7 +7645,7 @@ string-length@^4.0.1: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -6035,7 +7654,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string.prototype.padend@^3.0.0: version "3.1.4" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" + resolved "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz" integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== dependencies: call-bind "^1.0.2" @@ -6044,7 +7663,7 @@ string.prototype.padend@^3.0.0: string.prototype.trim@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== dependencies: call-bind "^1.0.2" @@ -6053,7 +7672,7 @@ string.prototype.trim@^1.2.7: string.prototype.trimend@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" @@ -6062,23 +7681,16 @@ string.prototype.trimend@^1.0.6: string.prototype.trimstart@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-object@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== dependencies: get-own-enumerable-property-symbols "^3.0.0" @@ -6087,41 +7699,41 @@ stringify-object@^3.3.0: strip-ansi@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-loader@^0.23.1: version "0.23.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz" integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== dependencies: loader-utils "^1.1.0" @@ -6129,7 +7741,7 @@ style-loader@^0.23.1: style-loader@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz" integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== dependencies: loader-utils "^2.0.0" @@ -6137,33 +7749,33 @@ style-loader@~2.0.0: supports-color@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" @@ -6171,12 +7783,12 @@ supports-hyperlinks@^2.0.0: supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-url-loader@~3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/svg-url-loader/-/svg-url-loader-3.0.3.tgz#95274eae80f4a46454a5b44e9582beb2f533465e" + resolved "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-3.0.3.tgz" integrity sha512-MKGiRNDs8fnHcZcPkhGcw9+130IXyFM9H8m6T7u3ScUuZYEeVzX0vNMru30D4MCF6vMYas5iw/Ru9lwFKBjaGw== dependencies: file-loader "~4.3.0" @@ -6184,7 +7796,7 @@ svg-url-loader@~3.0.3: svg-url-loader@~6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/svg-url-loader/-/svg-url-loader-6.0.0.tgz#b94861d9f6badfb8ca3e7d3ec4655c1bf732ac5d" + resolved "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-6.0.0.tgz" integrity sha512-Qr5SCKxyxKcRnvnVrO3iQj9EX/v40UiGEMshgegzV7vpo3yc+HexELOdtWcA3MKjL8IyZZ1zOdcILmDEa/8JJQ== dependencies: file-loader "~6.0.0" @@ -6192,7 +7804,7 @@ svg-url-loader@~6.0.0: table@^6.0.9: version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" @@ -6201,19 +7813,19 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^1.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" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2: version "6.1.14" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.14.tgz#e87926bec1cfe7c9e783a77a79f3e81c1cfa3b66" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz" integrity sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw== dependencies: chownr "^2.0.0" @@ -6225,15 +7837,30 @@ tar@^6.0.2: terminal-link@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== dependencies: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + terser-webpack-plugin@^4.1.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz" integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== dependencies: cacache "^15.0.5" @@ -6248,7 +7875,7 @@ terser-webpack-plugin@^4.1.0: terser-webpack-plugin@^5.3.7: version "5.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== dependencies: "@jridgewell/trace-mapping" "^0.3.17" @@ -6257,9 +7884,18 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.5" +terser@^4.1.2: + version "4.8.1" + resolved "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + terser@^5.16.5, terser@^5.3.4: version "5.17.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" + resolved "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz" integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== dependencies: "@jridgewell/source-map" "^0.3.2" @@ -6269,7 +7905,7 @@ terser@^5.16.5, terser@^5.3.4: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -6278,58 +7914,103 @@ test-exclude@^6.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" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== + to-fast-properties@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + 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" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 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.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + to-string-loader@^1.1.6: version "1.2.0" - resolved "https://registry.yarnpkg.com/to-string-loader/-/to-string-loader-1.2.0.tgz#4364aa044b9aa876473f4d7a36ef7d216a276e9c" + resolved "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.2.0.tgz" integrity sha512-KsWUL8FccgBW9FPFm4vYoQbOOcO5m6hKOGYoXjbseD9/4Ft+ravXN5jolQ9kTKYcK4zPt1j+khx97GPGnVoi6A== dependencies: loader-utils "^1.0.0" tr46@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-jest@^28.0.8: version "28.0.8" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.8.tgz" integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== dependencies: bs-logger "0.x" @@ -6343,7 +8024,7 @@ ts-jest@^28.0.8: ts-loader@^6.0.4: version "6.2.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.2.tgz#dffa3879b01a1a1e0a4b85e2b8421dc0dfff1c58" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.2.tgz" integrity sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ== dependencies: chalk "^2.3.0" @@ -6354,51 +8035,56 @@ ts-loader@^6.0.4: tslib@^1.8.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.1.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== tslib@~2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.17.1: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typed-array-length@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== dependencies: call-bind "^1.0.2" @@ -6407,17 +8093,22 @@ typed-array-length@^1.0.4: typed-styles@^0.0.7: version "0.0.7" - resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + resolved "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typescript@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript@*, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3, typescript@~4.3.0: + version "4.3.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== typestyle@^2.0.4: version "2.4.0" - resolved "https://registry.yarnpkg.com/typestyle/-/typestyle-2.4.0.tgz#df5bae6ff15093f5ce51f0caac5ef79428f64e78" + resolved "https://registry.npmjs.org/typestyle/-/typestyle-2.4.0.tgz" integrity sha512-/d1BL6Qi+YlMLEydnUEB8KL/CAjAN8cyt3/UyGnOyBrWf7bLGcR/6yhmsaUstO2IcYwZfagjE7AIzuI2vUW9mg== dependencies: csstype "3.0.10" @@ -6425,7 +8116,7 @@ typestyle@^2.0.4: unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -6435,17 +8126,17 @@ unbox-primitive@^1.0.2: underscore@>=1.8.3: version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" @@ -6453,41 +8144,64 @@ unicode-match-property-ecmascript@^2.0.0: unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + unique-filename@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + update-browserslist-db@^1.0.10: version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" @@ -6495,14 +8209,19 @@ update-browserslist-db@^1.0.10: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + url-loader@^4.1.0, url-loader@~4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: loader-utils "^2.0.0" @@ -6511,7 +8230,7 @@ url-loader@^4.1.0, url-loader@~4.1.0: url-parse@~1.5.1: version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -6519,25 +8238,44 @@ url-parse@~1.5.1: url@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz" integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== dependencies: punycode "1.3.2" querystring "0.2.0" -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" + integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== + dependencies: + inherits "2.0.1" + v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^9.0.1: version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -6546,7 +8284,7 @@ v8-to-istanbul@^9.0.1: 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" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" @@ -6554,17 +8292,17 @@ validate-npm-package-license@^3.0.1: validate.io-array@^1.0.3: version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + resolved "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz" integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== validate.io-function@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + resolved "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== validate.io-integer-array@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" + resolved "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz" integrity sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA== dependencies: validate.io-array "^1.0.3" @@ -6572,33 +8310,56 @@ validate.io-integer-array@^1.0.0: validate.io-integer@^1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + resolved "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz" integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ== dependencies: validate.io-number "^1.0.3" validate.io-number@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + resolved "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + walker@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" warning@^4.0.2, warning@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== dependencies: loose-envify "^1.0.0" +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + watchpack@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -6606,17 +8367,17 @@ watchpack@^2.4.0: webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-cli@^4.1.0, webpack-cli@^4.4.0: +webpack-cli@^4.1.0, webpack-cli@^4.4.0, webpack-cli@4.x.x: version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== dependencies: "@discoveryjs/json-ext" "^0.5.0" @@ -6634,15 +8395,15 @@ webpack-cli@^4.1.0, webpack-cli@^4.4.0: webpack-merge@^5.1.2, webpack-merge@^5.7.3: version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.3: +webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: source-list-map "^2.0.0" @@ -6650,12 +8411,12 @@ webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.3: webpack-sources@^3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5, webpack@^5.41.1: +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5, webpack@^5.1.0, webpack@^5.41.1, "webpack@4.x.x || 5.x.x": version "5.81.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.81.0.tgz#27a2e8466c8b4820d800a8d90f06ef98294f9956" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz" integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q== dependencies: "@types/eslint-scope" "^3.7.3" @@ -6683,14 +8444,43 @@ webpack@^5, webpack@^5.41.1: watchpack "^2.4.0" webpack-sources "^3.2.3" +webpack@^4.0.0: + version "4.46.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + whatwg-mimetype@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -6698,7 +8488,7 @@ whatwg-url@^5.0.0: whatwg-url@^8.0.0: version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== dependencies: lodash "^4.7.0" @@ -6707,7 +8497,7 @@ whatwg-url@^8.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -6718,7 +8508,7 @@ which-boxed-primitive@^1.0.2: which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" @@ -6730,31 +8520,38 @@ which-typed-array@^1.1.9: which@^1.2.9: version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wildcard@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== word-wrap@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + worker-loader@^3.0.2: version "3.0.8" - resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-3.0.8.tgz#5fc5cda4a3d3163d9c274a4e3a811ce8b60dbb37" + resolved "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz" integrity sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g== dependencies: loader-utils "^2.0.0" @@ -6762,7 +8559,7 @@ worker-loader@^3.0.2: wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -6771,7 +8568,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -6780,12 +8577,12 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" @@ -6793,37 +8590,47 @@ write-file-atomic@^4.0.1: ws@^7.4.6: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -6836,5 +8643,5 @@ yargs@^17.3.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From bcb9e7dc6b3bd1e0992f128822f8ece1b35221e2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 30 May 2023 13:24:32 -0400 Subject: [PATCH 057/250] WIP --- package.json | 300 ++--- yarn.lock | 3419 +++++++++++++++++++------------------------------- 2 files changed, 1459 insertions(+), 2260 deletions(-) diff --git a/package.json b/package.json index 1846fb853..a5a664234 100644 --- a/package.json +++ b/package.json @@ -1,152 +1,154 @@ { - "name": "buckaroo", - "version": "0.2.1", - "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", - "keywords": [ - "jupyter", - "jupyterlab", - "jupyterlab-extension", - "widgets" - ], - "files": [ - "lib/**/*.js", - "lib/**/*.js.map", - "lib/**/*.ts", - "dist/*.js", - "dist/*.js.map", - "dist/*.png", - "style/**/*.*" - ], - "homepage": "https://github.com/paddymul/buckaroo", - "bugs": { - "url": "https://github.com/paddymul/buckaroo/issues" - }, - "license": "BSD-3-Clause", - "author": { - "name": "Paddy Mullen", - "email": "" - }, - "main": "lib/index.js", - "types": "./lib/index.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/paddymul/buckaroo" - }, - "scripts": { - "build": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension", - "build:dev": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension:dev", - "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "jupyter labextension build --development True .", - "build:lib": "tsc", - "build:nbextension": "webpack --mode=production --no-devtool", - "build:widget-examples": "cd widget-examples/basic && webpack --mode=production", - "build:all": "yarn run build:labextension && yarn run build:nbextension && yarn run build:widget-examples", - "clean": "rimraf dist && yarn run clean:lib && yarn run clean:labextension && yarn run clean:nbextension", - "clean:lib": "rimraf lib", - "clean:labextension": "rimraf buckaroo/labextension", - "clean:nbextension": "rimraf buckaroo/nbextension/index.*", - "lint": "eslint 'js/**/*.{ts,tsx}'", - "lint:check": "eslint 'js/**/*.{ts,tsx}'", - "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", - "prepack": "yarn run build:labextension && yarn run build:nbextension", - "test": "jest --verbose --passWithNoTests", - "watch": "npm-run-all -p watch:*", - "watch:lib": "tsc -w", - "watch:nbextension": "webpack --watch", - "watch:labextension": "jupyter labextension watch ." - }, - "dependencies": { - "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", - "@jupyterlab/apputils": "^3.0.2", - "lodash": "^4.17.21", - "paddy-react-edit-list": ">=1.1.37", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "devDependencies": { - "@babel/cli": "^7.6.3", - "@babel/core": "^7.6.3", - "@babel/preset-env": "^7.6.3", - "@babel/preset-typescript": "^7.6.0", - "@jupyterlab/builder": "^3.0.1", - "@types/jest": "^28", - "@types/node": "^10.11.6", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "@types/webpack-env": "^1.13.6", - "@typescript-eslint/eslint-plugin": "^3.5.0", - "@typescript-eslint/parser": "^3.5.0", - "acorn": "^6.2.0", - "babel-jest": "^28", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "css-loader": "^3.0.0", - "eslint": "^7.3.1", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-prettier": "^3.1.4", - "fs-extra": "^7.0.0", - "jest": "^28", - "lint-staged": "^10.2.11", - "mkdirp": "^0.5.1", - "npm-run-all": "^4.1.3", - "prettier": "^2.0.5", - "rimraf": "^2.6.2", - "source-map-loader": "^0.2.4", - "style-loader": "^0.23.1", - "svg-url-loader": "~3.0.3", - "ts-jest": "^28.0.8", - "ts-loader": "^6.0.4", - "typescript": "~4.3.0", - "url-loader": "^4.1.0", - "webpack": "^5", - "webpack-cli": "^4.4.0" - }, - "jupyterlab": { - "extension": "lib/plugin", - "webpackConfig": "webpack.lab.config.js", - "outputDir": "./buckaroo/labextension", - "sharedPackages": { - "@jupyter-widgets/base": { - "bundled": false, - "singleton": true - }, - "@lumino/algorithm": { - "bundled": false, - "singleton": true - }, - "@lumino/commands": { - "bundled": false, - "singleton": true - }, - "@lumino/coreutils": { - "bundled": false, - "singleton": true - }, - "@lumino/datagrid": { - "bundled": false, - "singleton": true - }, - "@lumino/default-theme": { - "bundled": false, - "singleton": true - }, - "@lumino/domutils": { - "bundled": false, - "singleton": true - }, - "@lumino/messaging": { - "bundled": false, - "singleton": true - }, - "@lumino/virtualdom": { - "bundled": false, - "singleton": true - }, - "@lumino/widgets": { - "bundled": false, - "singleton": true - }, - "react": false, - "react-dom": false + "name": "buckaroo", + "version": "0.2.1", + "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", + "keywords": [ + "jupyter", + "jupyterlab", + "jupyterlab-extension", + "widgets" + ], + "files": [ + "lib/**/*.js", + "lib/**/*.js.map", + "lib/**/*.ts", + "dist/*.js", + "dist/*.js.map", + "dist/*.png", + "style/**/*.*" + ], + "homepage": "https://github.com/paddymul/buckaroo", + "bugs": { + "url": "https://github.com/paddymul/buckaroo/issues" + }, + "license": "BSD-3-Clause", + "author": { + "name": "Paddy Mullen", + "email": "" + }, + "main": "lib/index.js", + "types": "./lib/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/paddymul/buckaroo" + }, + "scripts": { + "build": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension", + "build:dev": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension:dev", + "build:labextension": "jupyter labextension build .", + "build:labextension:dev": "jupyter labextension build --development True .", + "build:lib": "tsc", + "build:nbextension": "webpack --mode=production --no-devtool", + "build:widget-examples": "cd widget-examples/basic && webpack --mode=production", + "build:all": "yarn run build:labextension && yarn run build:nbextension && yarn run build:widget-examples", + "clean": "rimraf dist && yarn run clean:lib && yarn run clean:labextension && yarn run clean:nbextension", + "clean:lib": "rimraf lib", + "clean:labextension": "rimraf buckaroo/labextension", + "clean:nbextension": "rimraf buckaroo/nbextension/index.*", + "lint": "eslint 'js/**/*.{ts,tsx}'", + "lint:check": "eslint 'js/**/*.{ts,tsx}'", + "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", + "prepack": "yarn run build:labextension && yarn run build:nbextension", + "test": "jest --verbose --passWithNoTests", + "watch": "npm-run-all -p watch:*", + "watch:lib": "tsc -w", + "watch:nbextension": "webpack --watch", + "watch:labextension": "jupyter labextension watch ." + }, + "dependencies": { + "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", + "@jupyterlab/apputils": "^3.0.2", + "lodash": "^4.17.21", + "paddy-react-edit-list": ">=1.1.37", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@babel/cli": "^7.6.3", + "@babel/core": "^7.6.3", + "@babel/preset-env": "^7.6.11", + "@babel/preset-typescript": "7.16.7", + "@jupyterlab/builder": "^3.0.1", + "@types/jest": "^28", + "@types/node": "^10.11.6", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "@types/webpack-env": "^1.13.6", + "@typescript-eslint/eslint-plugin": "^5.9.1", + "@typescript-eslint/parser": "^5.9.1", + "@types/webpack-dev-server": "^3.11.1", + "acorn": "^6.2.0", + "babel-jest": "^28", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "css-loader": "^5.0.0", + "eslint": "^8.6.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "fs-extra": "^7.0.0", + "jest": "^28", + "lint-staged": "^10.2.11", + "mkdirp": "^0.5.1", + "npm-run-all": "^4.1.3", + "prettier": "^2.6.2", + "rimraf": "^3.0.2", + "source-map-loader": "^0.2.4", + "style-loader": "^2.0.0", + "svg-url-loader": "^7.1.1", + "ts-jest": "^28.0.8", + "ts-loader": "^8.0.14", + "typescript": "^4.4.3", + "url-loader": "^4.1.0", + "webpack": "^5", + "webpack-cli": "^4.5.0", + "webpack-dev-server": "^4.0.0" + }, + "jupyterlab": { + "extension": "lib/plugin", + "webpackConfig": "webpack.lab.config.js", + "outputDir": "./buckaroo/labextension", + "sharedPackages": { + "@jupyter-widgets/base": { + "bundled": false, + "singleton": true + }, + "@lumino/algorithm": { + "bundled": false, + "singleton": true + }, + "@lumino/commands": { + "bundled": false, + "singleton": true + }, + "@lumino/coreutils": { + "bundled": false, + "singleton": true + }, + "@lumino/datagrid": { + "bundled": false, + "singleton": true + }, + "@lumino/default-theme": { + "bundled": false, + "singleton": true + }, + "@lumino/domutils": { + "bundled": false, + "singleton": true + }, + "@lumino/messaging": { + "bundled": false, + "singleton": true + }, + "@lumino/virtualdom": { + "bundled": false, + "singleton": true + }, + "@lumino/widgets": { + "bundled": false, + "singleton": true + }, + "react": false, + "react-dom": false + } } - } } diff --git a/yarn.lock b/yarn.lock index 24ab6bd5f..b24792647 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,13 +45,6 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": version "7.21.7" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz" @@ -262,7 +255,7 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.21.0": +"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== @@ -286,7 +279,7 @@ "@babel/traverse" "^7.21.5" "@babel/types" "^7.21.5" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": +"@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -508,13 +501,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" @@ -814,7 +800,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.21.3": +"@babel/plugin-transform-typescript@^7.16.7": version "7.21.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz" integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== @@ -839,7 +825,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/preset-env@^7.6.3": +"@babel/preset-env@^7.6.11": version "7.21.5" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz" integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== @@ -932,16 +918,14 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-typescript@^7.6.0": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz" - integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== +"@babel/preset-typescript@7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz" + integrity sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-typescript" "^7.21.3" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.16.7" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1039,36 +1023,58 @@ resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.5.2" + globals "^13.19.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.41.0": + version "8.41.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz" + integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== + "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" - minimatch "^3.0.4" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -1529,6 +1535,11 @@ react-dom "^17.0.1" typestyle "^2.0.4" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + "@lumino/algorithm@^1.9.0", "@lumino/algorithm@^1.9.2": version "1.9.2" resolved "https://registry.npmjs.org/@lumino/algorithm/-/algorithm-1.9.2.tgz" @@ -1653,6 +1664,27 @@ resolved "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz" integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@npmcli/fs@^1.0.0": version "1.1.1" resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" @@ -1744,6 +1776,36 @@ "@types/jquery" "*" "@types/underscore" "*" +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@*", "@types/connect-history-api-fallback@^1.3.5": + version "1.5.0" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + "@types/dom4@^2.0.1": version "2.0.2" resolved "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.2.tgz" @@ -1757,11 +1819,6 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/eslint@*": version "8.37.0" resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz" @@ -1775,6 +1832,26 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" @@ -1782,6 +1859,13 @@ dependencies: "@types/node" "*" +"@types/http-proxy@^1.17.5", "@types/http-proxy@^1.17.8": + version "1.17.11" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" @@ -1816,7 +1900,7 @@ dependencies: "@types/sizzle" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -1826,6 +1910,11 @@ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz" integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== +"@types/mime@*", "@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + "@types/node@*", "@types/node@^10.11.6": version "10.17.60" resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" @@ -1846,6 +1935,16 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + "@types/react-dom@^18.0.0": version "18.2.1" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.1.tgz" @@ -1871,16 +1970,56 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "@types/scheduler@*": version "0.16.3" resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.1" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + dependencies: + "@types/mime" "*" + "@types/node" "*" + "@types/sizzle@*": version "2.3.3" resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + "@types/source-list-map@*": version "0.1.2" resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz" @@ -1891,17 +2030,40 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/tapable@^1": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + +"@types/uglify-js@*": + version "3.17.1" + resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.1.tgz" + integrity sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g== + dependencies: + source-map "^0.6.1" + "@types/underscore@*": version "1.11.4" resolved "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz" integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== +"@types/webpack-dev-server@^3.11.1": + version "3.11.6" + resolved "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz" + integrity sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ== + dependencies: + "@types/connect-history-api-fallback" "*" + "@types/express" "*" + "@types/serve-static" "*" + "@types/webpack" "^4" + http-proxy-middleware "^1.0.0" + "@types/webpack-env@^1.13.6": version "1.18.0" resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz" integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== -"@types/webpack-sources@^0.1.5": +"@types/webpack-sources@*", "@types/webpack-sources@^0.1.5": version "0.1.9" resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz" integrity sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new== @@ -1910,6 +2072,25 @@ "@types/source-list-map" "*" source-map "^0.6.1" +"@types/webpack@^4": + version "4.41.33" + resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" @@ -1922,65 +2103,89 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^3.5.0": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz" - integrity sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ== - dependencies: - "@typescript-eslint/experimental-utils" "3.10.1" - debug "^4.1.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/experimental-utils@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^3.0.0", "@typescript-eslint/parser@^3.5.0": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz" - integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== - dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.10.1" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-visitor-keys "^1.1.0" - -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== - -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== - dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" +"@typescript-eslint/eslint-plugin@^5.9.1": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz" + integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/type-utils" "5.59.8" + "@typescript-eslint/utils" "5.59.8" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.9.1": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz" + integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== + dependencies: + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.59.8": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz" + integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== + dependencies: + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" + +"@typescript-eslint/type-utils@5.59.8": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz" + integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== + dependencies: + "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/utils" "5.59.8" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.59.8": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz" + integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== + +"@typescript-eslint/typescript-estree@5.59.8": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz" + integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== + dependencies: + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.59.8": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz" + integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" + eslint-scope "^5.1.1" + semver "^7.3.7" -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/visitor-keys@5.59.8": + version "5.59.8" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz" + integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== dependencies: - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/types" "5.59.8" + eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.5": version "1.11.5" @@ -1990,64 +2195,21 @@ "@webassemblyjs/helper-numbers" "1.11.5" "@webassemblyjs/helper-wasm-bytecode" "1.11.5" -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@webassemblyjs/floating-point-hex-parser@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz" integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - "@webassemblyjs/helper-api-error@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz" integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - "@webassemblyjs/helper-buffer@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz" integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-numbers@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz" @@ -2062,11 +2224,6 @@ resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz" integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - "@webassemblyjs/helper-wasm-section@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz" @@ -2077,16 +2234,6 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.5" "@webassemblyjs/wasm-gen" "1.11.5" -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/ieee754@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz" @@ -2094,13 +2241,6 @@ dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - "@webassemblyjs/leb128@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz" @@ -2108,23 +2248,11 @@ dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - "@webassemblyjs/utf8@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz" integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz" @@ -2139,20 +2267,6 @@ "@webassemblyjs/wasm-parser" "1.11.5" "@webassemblyjs/wast-printer" "1.11.5" -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - "@webassemblyjs/wasm-gen@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz" @@ -2164,17 +2278,6 @@ "@webassemblyjs/leb128" "1.11.5" "@webassemblyjs/utf8" "1.11.5" -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - "@webassemblyjs/wasm-opt@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz" @@ -2185,16 +2288,6 @@ "@webassemblyjs/wasm-gen" "1.11.5" "@webassemblyjs/wasm-parser" "1.11.5" -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz" @@ -2207,30 +2300,6 @@ "@webassemblyjs/leb128" "1.11.5" "@webassemblyjs/utf8" "1.11.5" -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - "@webassemblyjs/wast-printer@1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz" @@ -2239,15 +2308,6 @@ "@webassemblyjs/ast" "1.11.5" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - "@webpack-cli/configtest@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" @@ -2280,26 +2340,29 @@ abab@^2.0.3: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-import-assertions@^1.7.6: version "1.8.0" resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^6.2.0, acorn@^6.4.1: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^6.2.0: version "6.4.2" resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8, acorn@^8.7.1: version "8.8.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" @@ -2310,6 +2373,11 @@ acorn@^8.5.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + ag-grid-community@^29.2.0, ag-grid-community@~29.3.3: version "29.3.3" resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.3.tgz" @@ -2330,17 +2398,26 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0, ajv@^6.9.1, ajv@>=5.0.0: +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2350,7 +2427,17 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: +ajv@^8.0.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2372,6 +2459,11 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" @@ -2413,15 +2505,7 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -2429,11 +2513,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2441,20 +2520,10 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-buffer-byte-length@^1.0.0: version "1.0.0" @@ -2464,44 +2533,26 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-each@^1.0.1: - version "1.0.6" - resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz" - integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== - async@^2.5.0: version "2.6.4" resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" @@ -2514,11 +2565,6 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -2703,70 +2749,48 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== big.js@^5.2.2: version "5.2.2" resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^4.1.0: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" brace-expansion@^1.1.7: version "1.1.11" @@ -2776,22 +2800,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" @@ -2799,72 +2807,6 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" @@ -2894,45 +2836,15 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: +bytes@3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacache@^15.0.5: version "15.3.0" @@ -2958,21 +2870,6 @@ cacache@^15.0.5: tar "^6.0.2" unique-filename "^1.1.1" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" @@ -3042,26 +2939,7 @@ char-regex@^1.0.2: resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.4.0, chokidar@^3.4.1: +chokidar@^3.4.0, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3076,11 +2954,6 @@ chokidar@^3.4.0, chokidar@^3.4.1: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - chownr@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" @@ -3096,29 +2969,11 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - classnames@^2.2: version "2.3.2" resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" @@ -3172,14 +3027,6 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -3204,7 +3051,7 @@ color-name@1.1.3: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -colorette@^2.0.14, colorette@^2.0.16: +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== @@ -3239,10 +3086,25 @@ commondir@^1.0.1: resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" compute-gcd@^1.2.1: version "1.2.1" @@ -3268,47 +3130,37 @@ concat-map@0.0.1: resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== core-js-compat@^3.25.1: version "3.30.1" @@ -3343,37 +3195,6 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" @@ -3394,48 +3215,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - crypto@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== -css-loader@^3.0.0: - version "3.6.0" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" - -css-loader@^5.0.1: +css-loader@^5.0.0, css-loader@^5.0.1: version "5.2.7" resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz" integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== @@ -3466,11 +3251,6 @@ csstype@3.0.10: resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== -cyclist@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz" - integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA== - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" @@ -3480,20 +3260,6 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^2.3.3: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^2.6.8: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -3501,17 +3267,19 @@ debug@^2.6.8: dependencies: ms "2.0.0" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: +debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" dedent@^0.7.0: version "0.7.0" @@ -3540,6 +3308,18 @@ deepmerge@^4.2.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" @@ -3548,54 +3328,54 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + diff-sequences@^28.1.1: version "28.1.1" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.6.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz" + integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" + "@leichtgewicht/ip-codec" "^2.0.1" doctrine@^3.0.0: version "3.0.0" @@ -3625,11 +3405,6 @@ dom4@^2.1.5: resolved "https://registry.npmjs.org/dom4/-/dom4-2.1.6.tgz" integrity sha512-JkCVGnN4ofKGbjf5Uvc8mmxaATIErKQKSgACdBXpsQ3fY6DlIpAyWfiBSrGkttATssbDCp3psiAKWXk5gmjycA== -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" @@ -3651,16 +3426,6 @@ domutils@^2.5.2: domelementtype "^2.2.0" domhandler "^4.2.0" -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - duplicate-package-checker-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz" @@ -3671,24 +3436,16 @@ duplicate-package-checker-webpack-plugin@^3.0.0: lodash "^4.17.4" semver "^5.4.1" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + electron-to-chromium@^1.4.284: version "1.4.380" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.380.tgz" integrity sha512-XKGdI4pWM78eLH2cbXJHiBnWUwFSzZM7XujsB6stDiGu9AeSqziedP6amNLpJzE3i0rLTcfAwdCTs5ecP5yeSg== -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - emittery@^0.10.2: version "0.10.2" resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" @@ -3699,24 +3456,24 @@ emoji-regex@^8.0.0: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" - integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== - emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: +enhanced-resolve@^4.0.0: version "4.5.0" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== @@ -3733,7 +3490,7 @@ enhanced-resolve@^5.13.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3750,7 +3507,7 @@ envinfo@^7.7.3: resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3: version "0.1.8" resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== @@ -3832,6 +3589,11 @@ escalade@^3.1.1: resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" @@ -3847,29 +3609,19 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-prettier@^6.11.0: - version "6.15.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz" - integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== - dependencies: - get-stdin "^6.0.0" +eslint-config-prettier@^8.3.0: + version "8.8.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== -eslint-plugin-prettier@^3.1.4: - version "3.4.1" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== +eslint-plugin-prettier@^4.0.0: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.0.0, eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3877,91 +3629,86 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1, eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint@*, "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", eslint@^7.3.1, eslint@>=3.14.1, eslint@>=5.0.0: - version "7.32.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.6.0, eslint@>=7.0.0, eslint@>=7.28.0: + version "8.41.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz" + integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.41.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: +esquery@^1.4.2: version "1.5.0" resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -3988,19 +3735,21 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -events@^3.0.0, events@^3.2.0: +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: version "3.3.0" resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - execa@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" @@ -4036,19 +3785,6 @@ exit@^0.1.2: resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expect@^28.0.0, expect@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" @@ -4060,34 +3796,42 @@ expect@^28.0.0, expect@^28.1.3: jest-message-util "^28.1.3" jest-util "^28.1.3" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +express@^4.17.3: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -4099,6 +3843,17 @@ fast-diff@^1.1.2: resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.x: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" @@ -4114,6 +3869,20 @@ fastest-levenshtein@^1.0.12: resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" @@ -4121,11 +3890,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" @@ -4141,28 +3905,13 @@ file-loader@*, file-loader@~6.0.0: loader-utils "^2.0.0" schema-utils "^2.6.5" -file-loader@~4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz" - integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== - dependencies: - loader-utils "^1.2.3" - schema-utils "^2.5.0" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== +file-loader@~6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" fill-range@^7.0.1: version "7.0.1" @@ -4171,14 +3920,18 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" find-cache-dir@^3.3.1: version "3.3.2" @@ -4194,13 +3947,6 @@ find-root@^1.0.0: resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" @@ -4209,6 +3955,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" @@ -4222,13 +3976,10 @@ flatted@^3.1.0: resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" +follow-redirects@^1.0.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== for-each@^0.3.3: version "0.3.3" @@ -4237,30 +3988,20 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== free-style@3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/free-style/-/free-style-3.1.0.tgz" integrity sha512-vJujYSIyT30iDoaoeigNAxX4yB1RUrh+N2ZMhIElMr3BvCuGXOw7XNJMEEJkDUeamK2Rnb/IKFGKRKlTWIGRWA== -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^7.0.0: version "7.0.1" @@ -4288,34 +4029,21 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz" - integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA== - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" @@ -4336,11 +4064,6 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" @@ -4375,11 +4098,6 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - get-stream@^5.0.0: version "5.2.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" @@ -4400,19 +4118,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -4420,12 +4125,19 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4454,14 +4166,7 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0: - version "13.20.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globals@^13.9.0: +globals@^13.19.0: version "13.20.0" resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== @@ -4480,6 +4185,18 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -4487,16 +4204,31 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + gud@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz" integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" @@ -4543,37 +4275,6 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" @@ -4581,37 +4282,26 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" @@ -4627,10 +4317,67 @@ htmlparser2@^6.0.0: domutils "^2.5.2" entities "^2.0.0" -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-middleware@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz" + integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" human-signals@^1.1.1: version "1.1.1" @@ -4649,32 +4396,22 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: - postcss "^7.0.14" + safer-buffer ">= 2.1.2 < 3" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz" - integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -4702,7 +4439,7 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.3, infer-owner@^1.0.4: +infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== @@ -4715,16 +4452,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@2: +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== - inherits@2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" @@ -4751,19 +4483,15 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-arguments@^1.0.4: version "1.1.1" @@ -4794,13 +4522,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" @@ -4816,11 +4537,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" @@ -4833,20 +4549,6 @@ is-core-module@^2.11.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" @@ -4854,42 +4556,12 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== @@ -4904,14 +4576,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -4930,13 +4595,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" @@ -4947,12 +4605,15 @@ is-obj@^1.0.1: resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-plain-object@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== is-plain-object@^2.0.4: version "2.0.4" @@ -5028,17 +4689,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz" - integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" -isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== @@ -5048,14 +4706,7 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== @@ -5501,6 +5152,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" @@ -5511,7 +5169,7 @@ jsesc@~0.5.0: resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -5585,33 +5243,7 @@ jsonpointer@^5.0.0: resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -kind-of@^3.0.2, kind-of@^3.0.3: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -5621,6 +5253,14 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + leven@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" @@ -5692,17 +5332,12 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@^1.0.0, loader-utils@^1.1.0: version "1.4.2" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== @@ -5720,23 +5355,6 @@ loader-utils@^2.0.0, loader-utils@~2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@~1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" @@ -5744,6 +5362,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" @@ -5759,11 +5384,6 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" @@ -5808,7 +5428,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -make-dir@^2.0.0, make-dir@^2.1.0: +make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -5842,34 +5462,17 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" - integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== +memfs@^3.4.3: + version "3.5.1" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz" + integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" + fs-monkey "^1.0.3" memory-fs@^0.5.0: version "0.5.0" @@ -5884,29 +5487,25 @@ memorystream@^0.3.1: resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" @@ -5916,26 +5515,23 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -5950,17 +5546,12 @@ mini-css-extract-plugin@~1.3.2: schema-utils "^3.0.0" webpack-sources "^1.1.0" -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: +minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6013,31 +5604,7 @@ minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1, mkdirp@^0.5.3: +mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -6059,18 +5626,6 @@ moment@^2.24.0: resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz" - integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ== - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" @@ -6081,39 +5636,40 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nan@^2.12.1: - version "2.17.0" - resolved "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" nanoid@^3.1.23, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -6130,40 +5686,16 @@ node-fetch@^2.6.0: dependencies: whatwg-url "^5.0.0" +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - node-releases@^2.0.8: version "2.0.10" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" @@ -6179,13 +5711,6 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -6223,15 +5748,6 @@ object-assign@^4.1.1: resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" @@ -6250,13 +5766,6 @@ object-keys@^1.1.1: resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - object.assign@^4.1.4: version "4.1.4" resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" @@ -6267,12 +5776,22 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: - isobject "^3.0.1" + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -6288,6 +5807,15 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +open@^8.0.9: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" @@ -6300,18 +5828,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" @@ -6326,13 +5842,6 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" @@ -6340,6 +5849,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" @@ -6347,6 +5863,14 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" @@ -6365,20 +5889,6 @@ paddy-react-edit-list@>=1.1.37: react "^18.0.0" react-dom "^18.0.0" -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -6386,17 +5896,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" @@ -6420,31 +5919,16 @@ parse-srcset@^1.0.2: resolved "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" @@ -6470,6 +5954,11 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" @@ -6477,26 +5966,10 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" @@ -6528,13 +6001,6 @@ pirates@^4.0.4: resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" @@ -6554,50 +6020,20 @@ popper.js@^1.14.4, popper.js@^1.16.1: resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + version "4.0.3" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - postcss-modules-scope@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" @@ -6605,14 +6041,6 @@ postcss-modules-scope@^3.0.0: dependencies: postcss-selector-parser "^6.0.4" -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - postcss-modules-values@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" @@ -6620,10 +6048,10 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.12" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz" - integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.13" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -6633,27 +6061,10 @@ postcss-value-parser@^4.1.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.39" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.1.0, postcss@^8.2.15: - version "8.4.23" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.3.11: - version "8.4.23" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== +postcss@^8.1.0, postcss@^8.2.15, postcss@^8.3.11: + version "8.4.24" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -6671,7 +6082,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.5, prettier@>=1.13.0: +prettier@^2.6.2, prettier@>=2.0.0: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -6696,11 +6107,6 @@ process@^0.11.10: resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" @@ -6723,31 +6129,19 @@ prop-types@^15.0.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, object-assign "^4.1.1" react-is "^16.13.1" +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + prr@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" @@ -6756,20 +6150,6 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" @@ -6780,10 +6160,12 @@ punycode@1.3.2: resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" querystring@0.2.0: version "0.2.0" @@ -6795,20 +6177,32 @@ querystringify@^2.1.1: resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" raw-loader@~4.0.0: version "4.0.2" @@ -6897,7 +6291,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6, "readable-stream@1 || 2": +readable-stream@^2.0.1: version "2.3.8" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -6910,7 +6304,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.6.0: +readable-stream@^3.0.6: version "3.6.2" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -6919,15 +6313,6 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" @@ -6971,14 +6356,6 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: version "1.5.0" resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" @@ -6988,11 +6365,6 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: define-properties "^1.2.0" functions-have-names "^1.2.3" -regexpp@^3.0.0, regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" @@ -7012,21 +6384,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -7059,11 +6416,6 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - resolve.exports@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz" @@ -7086,51 +6438,34 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz" - integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - aproba "^1.1.1" + queue-microtask "^1.2.2" rxjs@^7.5.1: version "7.8.1" @@ -7139,7 +6474,7 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7154,6 +6489,11 @@ safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" @@ -7163,14 +6503,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -7202,16 +6535,7 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.6.5, schema-utils@^2.7.0: version "2.7.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -7238,6 +6562,28 @@ schema-utils@^3.1.1, schema-utils@^3.1.2: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz" + integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" @@ -7263,21 +6609,21 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1: - version "7.5.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== +semver@^7.3.4: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" -semver@^7.3.2: +semver@^7.3.5: version "7.5.0" resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" -semver@^7.3.5: +semver@^7.3.7: version "7.5.0" resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== @@ -7296,12 +6642,24 @@ semver@7.x: dependencies: lru-cache "^6.0.0" -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" serialize-javascript@^5.0.1: version "5.0.1" @@ -7317,28 +6675,38 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallow-clone@^3.0.0: version "3.0.1" @@ -7371,7 +6739,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1: +shell-quote@^1.6.1, shell-quote@^1.7.3: version "1.8.1" resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -7423,35 +6791,14 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" source-list-map@^2.0.0: version "2.0.1" @@ -7482,25 +6829,6 @@ source-map-loader@~1.0.2: schema-utils "^2.7.0" source-map "^0.6.1" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12, source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -7509,15 +6837,13 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" @@ -7550,25 +6876,34 @@ spdx-license-ids@^3.0.0: resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: - extend-shallow "^3.0.0" + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - ssri@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" @@ -7583,47 +6918,17 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: +string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== @@ -7731,15 +7036,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^0.23.1: - version "0.23.1" - resolved "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz" - integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - -style-loader@~2.0.0: +style-loader@^2.0.0, style-loader@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz" integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== @@ -7786,13 +7083,13 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-url-loader@~3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-3.0.3.tgz" - integrity sha512-MKGiRNDs8fnHcZcPkhGcw9+130IXyFM9H8m6T7u3ScUuZYEeVzX0vNMru30D4MCF6vMYas5iw/Ru9lwFKBjaGw== +svg-url-loader@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-7.1.1.tgz" + integrity sha512-NlsMCePODm7FQhU9aEZyGLPx5Xe1QRI1cSEUE6vTq5LJc9l9pStagvXoEIyZ9O3r00w6G3+Wbkimb+SC3DI/Aw== dependencies: - file-loader "~4.3.0" - loader-utils "~1.2.3" + file-loader "~6.2.0" + loader-utils "~2.0.0" svg-url-loader@~6.0.0: version "6.0.0" @@ -7802,18 +7099,7 @@ svg-url-loader@~6.0.0: file-loader "~6.0.0" loader-utils "~2.0.0" -table@^6.0.9: - version "6.8.1" - resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^1.0.0, tapable@^1.1.3: +tapable@^1.0.0: version "1.1.3" resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== @@ -7843,21 +7129,6 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - terser-webpack-plugin@^4.1.0: version "4.2.3" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz" @@ -7884,15 +7155,6 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.5" -terser@^4.1.2: - version "4.8.1" - resolved "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz" - integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - terser@^5.16.5, terser@^5.3.4: version "5.17.1" resolved "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz" @@ -7922,31 +7184,16 @@ through@^2.3.8: resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== tmpl@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" - integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== - to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" @@ -7957,21 +7204,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -7979,16 +7211,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - to-string-loader@^1.1.6: version "1.2.0" resolved "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.2.0.tgz" @@ -7996,6 +7218,11 @@ to-string-loader@^1.1.6: dependencies: loader-utils "^1.0.0" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + tr46@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" @@ -8022,16 +7249,16 @@ ts-jest@^28.0.8: semver "7.x" yargs-parser "^21.0.1" -ts-loader@^6.0.4: - version "6.2.2" - resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.2.tgz" - integrity sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ== +ts-loader@^8.0.14: + version "8.4.0" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz" + integrity sha512-6nFY3IZ2//mrPc+ImY3hNWx1vCHyEhl6V+wLmL4CZcm6g1CqX7UKrkc6y0i4FwcfOhxyMPCfaEvh20f4r9GNpw== dependencies: - chalk "^2.3.0" + chalk "^4.1.0" enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" + loader-utils "^2.0.0" micromatch "^4.0.0" - semver "^6.0.0" + semver "^7.3.4" tslib@^1.8.1: version "1.14.1" @@ -8048,18 +7275,13 @@ tslib@~2.3.1: resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tsutils@^3.17.1: +tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" - integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" @@ -8082,6 +7304,14 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" @@ -8096,15 +7326,10 @@ typed-styles@^0.0.7: resolved "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typescript@*, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3, typescript@~4.3.0: - version "4.3.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typescript@*, typescript@^4.4.3, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3: + version "4.4.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== typestyle@^2.0.4: version "2.4.0" @@ -8152,16 +7377,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" @@ -8186,18 +7401,10 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unset-value@^1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.0.10: version "1.0.11" @@ -8214,11 +7421,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - url-loader@^4.1.0, url-loader@~4.1.0: version "4.1.1" resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" @@ -8244,34 +7446,20 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.11.0: - version "0.11.1" - resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz" - integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== - dependencies: - inherits "2.0.1" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-to-istanbul@^9.0.1: version "9.1.0" @@ -8320,10 +7508,10 @@ validate.io-number@^1.0.3: resolved "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== -vm-browserify@^1.0.1: +vary@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== walker@^1.0.8: version "1.0.8" @@ -8339,24 +7527,6 @@ warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - watchpack@^2.4.0: version "2.4.0" resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" @@ -8365,6 +7535,13 @@ watchpack@^2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -8375,7 +7552,7 @@ webidl-conversions@^6.1.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-cli@^4.1.0, webpack-cli@^4.4.0, webpack-cli@4.x.x: +webpack-cli@^4.1.0, webpack-cli@^4.5.0, webpack-cli@4.x.x: version "4.10.0" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -8393,6 +7570,53 @@ webpack-cli@^4.1.0, webpack-cli@^4.4.0, webpack-cli@4.x.x: rechoir "^0.7.0" webpack-merge "^5.7.3" +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.0.0: + version "4.15.0" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz" + integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + webpack-merge@^5.1.2, webpack-merge@^5.7.3: version "5.8.0" resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" @@ -8401,7 +7625,7 @@ webpack-merge@^5.1.2, webpack-merge@^5.7.3: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: +webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -8414,7 +7638,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -"webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5, webpack@^5.1.0, webpack@^5.41.1, "webpack@4.x.x || 5.x.x": +webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5, webpack@^5.1.0, webpack@^5.41.1, "webpack@4.x.x || 5.x.x": version "5.81.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz" integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q== @@ -8444,34 +7668,19 @@ webpack-sources@^3.2.3: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@^4.0.0: - version "4.46.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz" - integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.5.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-mimetype@^2.3.0: version "2.3.0" @@ -8542,13 +7751,6 @@ word-wrap@^1.2.3: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - worker-loader@^3.0.2: version "3.0.8" resolved "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz" @@ -8593,15 +7795,10 @@ ws@^7.4.6: resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== y18n@^5.0.5: version "5.0.8" From e72f5014d9c79ae8e4293857bb290e1e5a4ac852 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 30 May 2023 15:08:52 -0400 Subject: [PATCH 058/250] it seems to be compiling tsx files properly now --- js/comp1.tsx | 5 + package.json | 4 + tsconfig.json | 9 +- webpack.config.js | 24 ++++- yarn.lock | 234 ++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 265 insertions(+), 11 deletions(-) create mode 100644 js/comp1.tsx diff --git a/js/comp1.tsx b/js/comp1.tsx new file mode 100644 index 000000000..9a4c8d658 --- /dev/null +++ b/js/comp1.tsx @@ -0,0 +1,5 @@ +import React from 'react'; +export function comp1(){ +console.log("comp1"); + return

comp1

+} diff --git a/package.json b/package.json index a5a664234..5e2445c6f 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,8 @@ "eslint": "^8.6.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0", "fs-extra": "^7.0.0", "jest": "^28", "lint-staged": "^10.2.11", @@ -94,8 +96,10 @@ "source-map-loader": "^0.2.4", "style-loader": "^2.0.0", "svg-url-loader": "^7.1.1", + "tsconfig-paths-webpack-plugin": "^3.3.0", "ts-jest": "^28.0.8", "ts-loader": "^8.0.14", + "ts-node": "^9.1.1", "typescript": "^4.4.3", "url-loader": "^4.1.0", "webpack": "^5", diff --git a/tsconfig.json b/tsconfig.json index 781206139..f66a0a497 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "declaration": true, "esModuleInterop": true, + "allowSyntheticDefaultImports": true, "lib": ["es2015", "dom"], "module": "commonjs", "moduleResolution": "node", @@ -15,7 +16,11 @@ "strict": true, // This allows us to initialize members in the "initialize" method "strictPropertyInitialization": false, - "target": "es2015" + "target": "es2015", + "jsx": "react" }, - "include": ["js/*.ts", "js/*.tsx", "js/core/*.ts", "js/core/*.tsx"] + "include": ["js/*.ts", "js/*.tsx", "js/core/*.ts", "js/core/*.tsx"], + "ts-node": { + "transpileOnly": true + } } diff --git a/webpack.config.js b/webpack.config.js index 8c98fd57d..c1b15c9c0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,6 +1,7 @@ const path = require('path'); const version = require('./package.json').version; - +//import {TsconfigPathsPlugin} from 'tsconfig-paths-webpack-plugin'; +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); const luminoThemeImages = /^.*@lumino\/default-theme.*.png$/; const crypto = require('crypto'); @@ -13,9 +14,25 @@ crypto.createHash = (algorithm) => // Custom webpack rules const rules = [ - { test: /\.ts$/, loader: 'ts-loader' }, + { test: /\.tsx?$/, loader: 'ts-loader' }, { test: /\.js$/, loader: 'source-map-loader' }, { test: /\.css$/, use: ['style-loader', 'css-loader'] }, + + +// { +// test: /\.tsx?$/, +// exclude: /node_modules/, +// loader: 'ts-loader' +// }, + + // { + // test: /\.tsx?$/, + // loader: 'ts-loader', + // options: { + // transpileOnly: true, + // configFile: 'examples/tsconfig.json' + // } + // }, { test: luminoThemeImages, issuer: /\.css$/, @@ -43,7 +60,8 @@ const externals = ['@jupyter-widgets/base']; const resolve = { // Add '.ts' and '.tsx' as resolvable extensions. - extensions: ['.webpack.js', '.web.js', '.ts', '.js'], + extensions: ['.webpack.js', '.web.js', '.ts', '.js', '.tsx'], + plugins: [new TsconfigPathsPlugin()], fallback: { crypto: false }, }; diff --git a/yarn.lock b/yarn.lock index b24792647..7c1b4f4c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1905,6 +1905,11 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + "@types/lodash@^4.14.134", "@types/lodash@^4.14.191": version "4.14.194" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz" @@ -2513,6 +2518,11 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2543,11 +2553,43 @@ array-flatten@1.1.1: resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" @@ -3195,6 +3237,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" @@ -3358,6 +3405,11 @@ diff-sequences@^28.1.1: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -3377,6 +3429,13 @@ dns-packet@^5.2.2: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" @@ -3490,6 +3549,14 @@ enhanced-resolve@^5.13.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.7.0: + version "5.14.1" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz" + integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" @@ -3575,6 +3642,13 @@ es-set-tostringtag@^2.0.1: has "^1.0.3" has-tostringtag "^1.0.0" +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" @@ -3621,6 +3695,32 @@ eslint-plugin-prettier@^4.0.0: dependencies: prettier-linter-helpers "^1.0.0" +eslint-plugin-react-hooks@^4.3.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.28.0: + version "7.32.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" @@ -3642,7 +3742,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.6.0, eslint@>=7.0.0, eslint@>=7.28.0: +eslint@*, "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.6.0, eslint@>=7.0.0, eslint@>=7.28.0: version "8.41.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz" integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== @@ -3730,6 +3830,11 @@ estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -4462,7 +4567,7 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -internal-slot@^1.0.5: +internal-slot@^1.0.3, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -4542,7 +4647,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0: +is-core-module@^2.11.0, is-core-module@^2.9.0: version "2.12.0" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== @@ -5217,6 +5322,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + json5@^2.1.1, json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" @@ -5243,6 +5355,14 @@ jsonpointer@^5.0.0: resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.3" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" @@ -5450,7 +5570,7 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" -make-error@1.x: +make-error@^1.1.1, make-error@1.x: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -5766,7 +5886,7 @@ object-keys@^1.1.1: resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: +object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -5776,6 +5896,41 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" @@ -6430,6 +6585,15 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" @@ -6829,6 +6993,14 @@ source-map-loader@~1.0.2: schema-utils "^2.7.0" source-map "^0.6.1" +source-map-support@^0.5.17: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" @@ -6957,6 +7129,20 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + string.prototype.padend@^3.0.0: version "3.1.4" resolved "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz" @@ -7260,6 +7446,37 @@ ts-loader@^8.0.14: micromatch "^4.0.0" semver "^7.3.4" +ts-node@^9.1.1, ts-node@>=9.0.0: + version "9.1.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tsconfig-paths-webpack-plugin@^3.3.0: + version "3.5.2" + resolved "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz" + integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^3.9.0" + +tsconfig-paths@^3.9.0: + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" @@ -7326,7 +7543,7 @@ typed-styles@^0.0.7: resolved "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typescript@*, typescript@^4.4.3, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3: +typescript@*, typescript@^4.4.3, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3: version "4.4.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz" integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== @@ -7838,6 +8055,11 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" From e3888117656bc70a207272c19a3c3b534ec51d26 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 31 May 2023 10:49:42 -0400 Subject: [PATCH 059/250] seems to be a working dev site --- package.json | 7 +- webpack.config.js | 34 +++++++ yarn.lock | 253 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 275 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 5e2445c6f..62d3d2a8a 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,8 @@ "watch": "npm-run-all -p watch:*", "watch:lib": "tsc -w", "watch:nbextension": "webpack --watch", - "watch:labextension": "jupyter labextension watch ." + "watch:labextension": "jupyter labextension watch .", + "dev": "webpack-cli serve --mode=development --env development --open" }, "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", @@ -87,8 +88,12 @@ "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", "fs-extra": "^7.0.0", + "html-loader": "^2.1.2", + "html-webpack-plugin": "^5.0.0", + "jest": "^28", "lint-staged": "^10.2.11", + "markdown-loader": "^7.0.0", "mkdirp": "^0.5.1", "npm-run-all": "^4.1.3", "prettier": "^2.6.2", diff --git a/webpack.config.js b/webpack.config.js index c1b15c9c0..23b5df748 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,6 +2,9 @@ const path = require('path'); const version = require('./package.json').version; //import {TsconfigPathsPlugin} from 'tsconfig-paths-webpack-plugin'; const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); + +//import HtmlWebpackPlugin from 'html-webpack-plugin'; +const HtmlWebpackPlugin = require('html-webpack-plugin'); const luminoThemeImages = /^.*@lumino\/default-theme.*.png$/; const crypto = require('crypto'); @@ -45,6 +48,10 @@ const rules = [ exclude: luminoThemeImages, use: ['file-loader'], }, + { + test: /\.md$/, + use: ['html-loader', 'markdown-loader'] + }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, issuer: /\.css$/, @@ -66,6 +73,26 @@ const resolve = { }; module.exports = [ + // { + // entry: './js/extension.ts', + // output: { + // filename: 'index.js', + // path: path.resolve(__dirname, 'buckaroo', 'nbextension'), + // libraryTarget: 'amd', + // }, + // module: { + // rules: rules, + // }, + // devtool: 'source-map', + // externals, + // resolve, + // plugins: [new HtmlWebpackPlugin({ + // template: './examples/index.html' + // })] + + // }, + + /** * Notebook extension * @@ -85,6 +112,10 @@ module.exports = [ devtool: 'source-map', externals, resolve, + plugins: [new HtmlWebpackPlugin({ + template: './examples/index.html' + })] + }, /** @@ -112,6 +143,9 @@ module.exports = [ }, externals, resolve, + devServer: { + port: 8030 + } }, /** diff --git a/yarn.lock b/yarn.lock index 7c1b4f4c3..a351d6166 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1859,6 +1859,11 @@ dependencies: "@types/node" "*" +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + "@types/http-proxy@^1.17.5", "@types/http-proxy@^1.17.8": version "1.17.11" resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz" @@ -2834,6 +2839,11 @@ bonjour-service@^1.0.11: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -2925,6 +2935,14 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.1, camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -3021,6 +3039,20 @@ classnames@^2.2: resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== +clean-css@^4.2.3: + version "4.2.4" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== + dependencies: + source-map "~0.6.0" + +clean-css@^5.2.2: + version "5.3.2" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + dependencies: + source-map "~0.6.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" @@ -3103,7 +3135,7 @@ commander@^2.20.0: resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1: +commander@^4.0.1, commander@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== @@ -3118,6 +3150,11 @@ commander@^7.0.0: resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + commander@~6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz" @@ -3283,6 +3320,22 @@ css-loader@^5.0.0, css-loader@^5.0.1: schema-utils "^3.0.0" semver "^7.3.5" +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" @@ -3443,6 +3496,13 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + dom-helpers@^3.4.0: version "3.4.0" resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz" @@ -3469,14 +3529,14 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.0.0, domhandler@^4.2.0: +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" -domutils@^2.5.2: +domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== @@ -3485,6 +3545,14 @@ domutils@^2.5.2: domelementtype "^2.2.0" domhandler "^4.2.0" +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + duplicate-package-checker-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz" @@ -4387,6 +4455,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -4412,7 +4485,52 @@ html-escaper@^2.0.0: resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -htmlparser2@^6.0.0: +html-loader@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/html-loader/-/html-loader-2.1.2.tgz" + integrity sha512-XB4O1+6mpLp4qy/3qg5+1QPZ/uXvWtO64hNAX87sKHwcHkp1LJGU7V3sJ9iVmRACElAZXQ4YOO/Lbkx5kYfl9A== + dependencies: + html-minifier-terser "^5.1.1" + parse5 "^6.0.1" + +html-minifier-terser@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + camel-case "^4.1.1" + clean-css "^4.2.3" + commander "^4.1.1" + he "^1.2.0" + param-case "^3.0.3" + relateurl "^0.2.7" + terser "^4.6.3" + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.0.0: + version "5.5.1" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz" + integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.0.0, htmlparser2@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== @@ -5457,7 +5575,7 @@ loader-runner@^4.2.0: resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^1.0.0, loader-utils@^1.1.0: +loader-utils@^1.0.0, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.4.2" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== @@ -5504,7 +5622,7 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5534,6 +5652,13 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" @@ -5582,6 +5707,19 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +markdown-loader@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/markdown-loader/-/markdown-loader-7.0.0.tgz" + integrity sha512-ZUZXYadxu177a+dBTunr+whAIz0PdVuOJnLde/dowczEoog6wwXKuzgKmFP/ZeJjQ/Nyf9NxOGXxnilEYHKxQQ== + dependencies: + loader-utils "^1.2.3" + marked "^4.0.12" + +marked@^4.0.12: + version "4.3.0" + resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" @@ -5799,6 +5937,14 @@ nice-try@^1.0.4: resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-fetch@^2.6.0: version "2.6.9" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" @@ -5863,6 +6009,13 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -6044,6 +6197,14 @@ paddy-react-edit-list@>=1.1.37: react "^18.0.0" react-dom "^18.0.0" +param-case@^3.0.3, param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -6074,11 +6235,24 @@ parse-srcset@^1.0.2: resolved "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz" integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" @@ -6242,6 +6416,14 @@ prettier@^2.6.2, prettier@>=2.0.0: resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + pretty-format@^28.0.0, pretty-format@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" @@ -6539,6 +6721,22 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -7001,23 +7199,23 @@ source-map-support@^0.5.17: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== +source-map-support@~0.5.12, source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -7290,6 +7488,11 @@ tapable@^1.0.0: resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tapable@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" @@ -7341,7 +7544,16 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.5" -terser@^5.16.5, terser@^5.3.4: +terser@^4.6.3: + version "4.8.1" + resolved "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.10.0, terser@^5.16.5, terser@^5.3.4: version "5.17.1" resolved "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz" integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== @@ -7482,7 +7694,7 @@ tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: +tslib@^2.0.3, tslib@^2.1.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -7668,6 +7880,11 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" @@ -7855,7 +8072,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5, webpack@^5.1.0, webpack@^5.41.1, "webpack@4.x.x || 5.x.x": +webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5, webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.41.1, "webpack@4.x.x || 5.x.x": version "5.81.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz" integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q== From 7d605a9cc22b9848487a419b9cf39ac2c9ce4bb8 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 31 May 2023 12:48:13 -0400 Subject: [PATCH 060/250] working demo site --- examples/App.tsx | 104 +++++++ examples/app.css | 67 +++++ examples/example.css | 20 ++ examples/index-react18.tsx | 8 + examples/index.html | 20 ++ examples/tsconfig.json | 31 ++ js/npm-styles.scss | 153 ++++++++++ package.json | 281 +++++++++--------- webpack.config.js | 95 +++--- yarn.lock | 579 ++++++++++++++++++++++++++++++++++++- 10 files changed, 1173 insertions(+), 185 deletions(-) create mode 100644 examples/App.tsx create mode 100644 examples/app.css create mode 100644 examples/example.css create mode 100644 examples/index-react18.tsx create mode 100644 examples/index.html create mode 100644 examples/tsconfig.json create mode 100644 js/npm-styles.scss diff --git a/examples/App.tsx b/examples/App.tsx new file mode 100644 index 000000000..e96fb899f --- /dev/null +++ b/examples/App.tsx @@ -0,0 +1,104 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +//import 'bootstrap/dist/css/bootstrap.min.css'; +import React from 'react'; +import {HashRouter as Router, Route, Link} from 'react-router-dom'; +//import {Button} from 'react-bootstrap'; + +import './app.css'; + +import 'ag-grid-community/styles/ag-grid.css'; +import 'ag-grid-community/styles/ag-theme-alpine.css'; +import '../js/npm-styles.scss'; + + +const examples = { + DCFCellEx: {title: 'DCFCell', file: 'DCFCellEx'}, + WidgetDCFCellEx: {title: 'WigetDCFCell', file: 'WidgetDCFCellEx'}, + ColumnsEditorEx: {title: 'ColumnsEditor', file: 'ColumnsEditorEx'}, + CommandViewerEx: {title: 'CommandViewer', file: 'CommandViewerEx'}, + DFViewerEx: {title: 'DFViewer', file: 'DFViewerEx'}, + StatusBarEx: {title: 'StatusBar', file: 'StatusBarEx'} +}; + +// The examples use a code-loading technique that I have described in +// https://mmomtchev.medium.com/making-examples-displaying-code-along-its-output-with-webpack-a28dcf5439c6 + +const CodeBlock = React.lazy(() => import(/* webpackPrefetch: true */ './CodeBlock')); + +for (const ex of Object.keys(examples)) { + examples[ex].comp = React.lazy( + () => import(/* webpackPrefetch: true */ `./ex/${examples[ex].file}.tsx`) + ); + examples[ex].code = 'asfd' + examples[ex].text = 'text' + + // examples[ex].code = import( + // /* webpackPrefetch: true */ `!!html-loader?{"minimize":false}!./jsx-loader.ts!./ex/${examples[ex].file}.tsx` + // ) + + +// .then((code) => code.default); +// examples[ex].text = import( +// /* webpackPrefetch: true */ `!!raw-loader!./ex/${examples[ex].file}.tsx` +// ).then((text) => text.default); + +} + +const LeftMenuItem = (props): JSX.Element => ( + + + {props.title} + + +); + + +// eslint-disable-next-line no-var + +const App = (): JSX.Element => { + const [jsText, setJSText] = React.useState(''); + + return ( + +

+ buckaroo stuff examples +

+
+
+ + {Object.keys(examples).map((e) => ( + + ))} +
+
+
+ +
+ Loading...
}> + +
+ + {Object.keys(examples).map((e) => ( + +
+
+ Loading component...
}> + {React.createElement(examples[e].comp)} + +
+
+ Parsing code...
}> + + +
+
+ + ))} + + + +
+ ); +}; + +export default App; diff --git a/examples/app.css b/examples/app.css new file mode 100644 index 000000000..2802ab690 --- /dev/null +++ b/examples/app.css @@ -0,0 +1,67 @@ +.left-menu button { + text-align: left; + font-weight: bold; + color: #333333; +} + +.left-menu a:hover { + text-decoration: none; +} + +.left-menu { + width: 10em; + min-width: 10em; + max-width: 10em; +} + +.codeblock { + max-height: 90vh; + overflow-y: scroll; +} + +.codeblock > pre { + margin-top: 0 !important; +} + +.codeblock > pre > code { + font-size: 0.9rem !important; + line-height: 1.1 !important; +} + + + +:root +{ + --color-example: #fff; +} + + +html,body +{ + font-family: "Roboto", sans-serif; + display: flex; + flex-grow: 1; + width: 100%; + height: 100%; + min-height: 100vh; + font-size: 16px; + text-align: center; + color: var(--color-example); + margin: 0; +} + +#app +{ + background-color: #4158D0; + background-image: linear-gradient(43deg, #4158D0 0%, #C850C0 46%, #FFCC70 100%); + color: var(--color-example); + + justify-content: center; + display: flex; + flex-grow: 1; + flex-direction:column; + align-items: center; + font-size: 2rem; + outline:4px solid pink; +} + diff --git a/examples/example.css b/examples/example.css new file mode 100644 index 000000000..8841db871 --- /dev/null +++ b/examples/example.css @@ -0,0 +1,20 @@ +.table-fixed { + table-layout: fixed; +} + +.btn-width { + width: 3rem; + text-align: end; +} + +.table-rounded td { + border-bottom-width: 0; +} + +.table-rounded td:first-child { + border-radius: 10px 0 0 10px; +} + +.table-rounded td:last-child { + border-radius: 0 10px 10px 0; +} diff --git a/examples/index-react18.tsx b/examples/index-react18.tsx new file mode 100644 index 000000000..c20065879 --- /dev/null +++ b/examples/index-react18.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import ReactDOMClient from 'react-dom/client'; + +import App from './App'; + +// eslint-disable-next-line no-console +console.debug('React 18 mode'); +ReactDOMClient.createRoot(document.getElementById('root')).render(); diff --git a/examples/index.html b/examples/index.html new file mode 100644 index 000000000..3e97d8e6c --- /dev/null +++ b/examples/index.html @@ -0,0 +1,20 @@ + + + + + + + + + react-edit-list - Universal Editable List React Component + + + +
+
+ <%= require('../README.md').default %> +
+
+ + + \ No newline at end of file diff --git a/examples/tsconfig.json b/examples/tsconfig.json new file mode 100644 index 000000000..9e37f82d2 --- /dev/null +++ b/examples/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "sourceMap": true, + "noImplicitAny": false, + "module": "esnext", + "target": "es2018", + "lib": [ + "esnext", + "dom", + "dom.iterable" + ], + "declaration": true, + "declarationMap": true, + "removeComments": false, + "allowSyntheticDefaultImports": true, + "jsx": "react", + "allowJs": true, + "baseUrl": "./", + "esModuleInterop": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "downlevelIteration": true, + "paths": { + "paddy-react-edit-list": ["../js"] + } + }, + "include": [ + ".", + "../js" + ] +} diff --git a/js/npm-styles.scss b/js/npm-styles.scss new file mode 100644 index 000000000..5b792bc14 --- /dev/null +++ b/js/npm-styles.scss @@ -0,0 +1,153 @@ + +.column-list { + width:100%; font-size:1rem; + dl { + display:flex; margin:0; padding:0; + div.list-item { + padding:3px; + dt { + float:left; max-width:90px; overflow:hidden; max-height:1rem; + } + dd { + float:right; + } + .column-editor { + width:100%; clear:both; height:30px; + label { + span { float:left; } + input[type=checkbox] { + float:left; + } + input[type=text] {} + } + } + } + } +} + +.dependent-tabs { + font-size:1rem; + ul.tabs { + li {float:left; + background:var(--ag-background-color); + color: var(--ag-foreground-color); + + border:1px solid purple; + border-bottom:none; + list-style:none; margin-right:5px; + padding:2px + } + li.active { + background: var(--ag-range-selection-background-color-3); + color:var(--ag-alpine-active-color); + } + + } + .output-area { + clear:both; float:none; + } +} + + +.python-displayer, .command-displayer { + width:100%; + height:100%; + background: hsl(0deg 0% 13%); + overflow:hidden; + padding:16px; + /*border:1px solid red; */ + pre { + + + color: #41FF00 + + } + +} +.command-displayer { + pre { + overflow:hidden; + } +} + +.features +{ + font-size: 1.7rem; + + & div + { + padding: 0.5rem; + } +} + + +.modal { + position: absolute; + background-color: #ffffff; + border: 1px solid black; + padding: 16px; + list-style: none; + + > li { + padding: 8px; + } +} + + +.command-viewer { + border:1px solid ; + color:black; + font-size:1rem; + .operation-adder { + // border:2px solid brown; + span.column-name { + float:left; + display:block; + color:black; + } + fieldset { + float:left; + } + clear:both; + } + + .operations-box { + clear:left; + display:flex; + // height:80px; + overflow:auto; + h4 { + font-size:1em; + border:1px orange; + color:black; + + } + div { + + overflow-x:scroll + } + } + +} + +.operation-detail { + overflow:auto; + button { float:left;} + .arg-getters { + button { + float:left; + } + fieldset { + float:left + } + div.col-enum { + float:left; + width:800px; + overflow-x:scroll; + table { + td, th {border:1px solid black;} + } + } + + } +} diff --git a/package.json b/package.json index 62d3d2a8a..f64d28b89 100644 --- a/package.json +++ b/package.json @@ -3,161 +3,172 @@ "version": "0.2.1", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ - "jupyter", - "jupyterlab", - "jupyterlab-extension", - "widgets" + "jupyter", + "jupyterlab", + "jupyterlab-extension", + "widgets" ], "files": [ - "lib/**/*.js", - "lib/**/*.js.map", - "lib/**/*.ts", - "dist/*.js", - "dist/*.js.map", - "dist/*.png", - "style/**/*.*" + "lib/**/*.js", + "lib/**/*.js.map", + "lib/**/*.ts", + "dist/*.js", + "dist/*.js.map", + "dist/*.png", + "style/**/*.*" ], "homepage": "https://github.com/paddymul/buckaroo", "bugs": { - "url": "https://github.com/paddymul/buckaroo/issues" + "url": "https://github.com/paddymul/buckaroo/issues" }, "license": "BSD-3-Clause", "author": { - "name": "Paddy Mullen", - "email": "" + "name": "Paddy Mullen", + "email": "" }, "main": "lib/index.js", "types": "./lib/index.d.ts", "repository": { - "type": "git", - "url": "https://github.com/paddymul/buckaroo" + "type": "git", + "url": "https://github.com/paddymul/buckaroo" }, "scripts": { - "build": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension", - "build:dev": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension:dev", - "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "jupyter labextension build --development True .", - "build:lib": "tsc", - "build:nbextension": "webpack --mode=production --no-devtool", - "build:widget-examples": "cd widget-examples/basic && webpack --mode=production", - "build:all": "yarn run build:labextension && yarn run build:nbextension && yarn run build:widget-examples", - "clean": "rimraf dist && yarn run clean:lib && yarn run clean:labextension && yarn run clean:nbextension", - "clean:lib": "rimraf lib", - "clean:labextension": "rimraf buckaroo/labextension", - "clean:nbextension": "rimraf buckaroo/nbextension/index.*", - "lint": "eslint 'js/**/*.{ts,tsx}'", - "lint:check": "eslint 'js/**/*.{ts,tsx}'", - "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", - "prepack": "yarn run build:labextension && yarn run build:nbextension", - "test": "jest --verbose --passWithNoTests", - "watch": "npm-run-all -p watch:*", - "watch:lib": "tsc -w", - "watch:nbextension": "webpack --watch", - "watch:labextension": "jupyter labextension watch .", - "dev": "webpack-cli serve --mode=development --env development --open" + "build": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension", + "build:dev": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension:dev", + "build:labextension": "jupyter labextension build .", + "build:labextension:dev": "jupyter labextension build --development True .", + "build:lib": "tsc", + "build:nbextension": "webpack --mode=production --no-devtool", + "build:widget-examples": "cd widget-examples/basic && webpack --mode=production", + "build:all": "yarn run build:labextension && yarn run build:nbextension && yarn run build:widget-examples", + "clean": "rimraf dist && yarn run clean:lib && yarn run clean:labextension && yarn run clean:nbextension", + "clean:lib": "rimraf lib", + "clean:labextension": "rimraf buckaroo/labextension", + "clean:nbextension": "rimraf buckaroo/nbextension/index.*", + "lint": "eslint 'js/**/*.{ts,tsx}'", + "lint:check": "eslint 'js/**/*.{ts,tsx}'", + "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", + "prepack": "yarn run build:labextension && yarn run build:nbextension", + "test": "jest --verbose --passWithNoTests", + "watch": "npm-run-all -p watch:*", + "watch:lib": "tsc -w", + "watch:nbextension": "webpack --watch", + "watch:labextension": "jupyter labextension watch .", + "dev": "webpack-cli serve --mode=development --env development --open" }, "dependencies": { - "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", - "@jupyterlab/apputils": "^3.0.2", - "lodash": "^4.17.21", - "paddy-react-edit-list": ">=1.1.37", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", + "@jupyterlab/apputils": "^3.0.2", + "lodash": "^4.17.21", + "paddy-react-edit-list": ">=1.1.37", + "prettier-standalone": "^1.3.1-0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "prismjs": "^1.28.0" }, "devDependencies": { - "@babel/cli": "^7.6.3", - "@babel/core": "^7.6.3", - "@babel/preset-env": "^7.6.11", - "@babel/preset-typescript": "7.16.7", - "@jupyterlab/builder": "^3.0.1", - "@types/jest": "^28", - "@types/node": "^10.11.6", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "@types/webpack-env": "^1.13.6", - "@typescript-eslint/eslint-plugin": "^5.9.1", - "@typescript-eslint/parser": "^5.9.1", - "@types/webpack-dev-server": "^3.11.1", - "acorn": "^6.2.0", - "babel-jest": "^28", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "css-loader": "^5.0.0", - "eslint": "^8.6.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0", - "fs-extra": "^7.0.0", - "html-loader": "^2.1.2", - "html-webpack-plugin": "^5.0.0", + "@babel/cli": "^7.6.3", + "@babel/core": "^7.6.3", + "@babel/preset-env": "^7.6.11", + "@babel/preset-typescript": "7.16.7", + "@jupyterlab/builder": "^3.0.1", + "@types/jest": "^28", + "@types/node": "^10.11.6", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "@types/webpack-dev-server": "^3.11.1", + "@types/webpack-env": "^1.13.6", + "@typescript-eslint/eslint-plugin": "^5.9.1", + "@typescript-eslint/parser": "^5.9.1", + "acorn": "^6.2.0", + "babel-jest": "^28", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "css-loader": "^5.0.0", + "eslint": "^8.6.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0", + "fs-extra": "^7.0.0", + "html-loader": "^2.1.2", + "html-webpack-plugin": "^5.0.0", + "jest": "^28", + "lint-staged": "^10.2.11", + "markdown-loader": "^7.0.0", + "mkdirp": "^0.5.1", + "npm-run-all": "^4.1.3", + "prettier": "^2.6.2", - "jest": "^28", - "lint-staged": "^10.2.11", - "markdown-loader": "^7.0.0", - "mkdirp": "^0.5.1", - "npm-run-all": "^4.1.3", - "prettier": "^2.6.2", - "rimraf": "^3.0.2", - "source-map-loader": "^0.2.4", - "style-loader": "^2.0.0", - "svg-url-loader": "^7.1.1", - "tsconfig-paths-webpack-plugin": "^3.3.0", - "ts-jest": "^28.0.8", - "ts-loader": "^8.0.14", - "ts-node": "^9.1.1", - "typescript": "^4.4.3", - "url-loader": "^4.1.0", - "webpack": "^5", - "webpack-cli": "^4.5.0", - "webpack-dev-server": "^4.0.0" + "postcss": "^8.4.14", + "postcss-loader": "^7.0.1", + "postcss-preset-env": "^7.7.2", + "postcss-nested": "^6.0.0", + "sass": "^1.53.0", + "sass-loader": "^13.0.2", + + "react-router": "^6.3.0", + "react-router-dom": "^5.2.0", + "rimraf": "^3.0.2", + "source-map-loader": "^0.2.4", + "style-loader": "^2.0.0", + "svg-url-loader": "^7.1.1", + "ts-jest": "^28.0.8", + "ts-loader": "^8.0.14", + "ts-node": "^9.1.1", + "tsconfig-paths-webpack-plugin": "^3.3.0", + "typescript": "^4.4.3", + "url-loader": "^4.1.0", + "webpack": "^5", + "webpack-cli": "^4.5.0", + "webpack-dev-server": "^4.0.0" }, "jupyterlab": { - "extension": "lib/plugin", - "webpackConfig": "webpack.lab.config.js", - "outputDir": "./buckaroo/labextension", - "sharedPackages": { - "@jupyter-widgets/base": { - "bundled": false, - "singleton": true - }, - "@lumino/algorithm": { - "bundled": false, - "singleton": true - }, - "@lumino/commands": { - "bundled": false, - "singleton": true - }, - "@lumino/coreutils": { - "bundled": false, - "singleton": true - }, - "@lumino/datagrid": { - "bundled": false, - "singleton": true - }, - "@lumino/default-theme": { - "bundled": false, - "singleton": true - }, - "@lumino/domutils": { - "bundled": false, - "singleton": true - }, - "@lumino/messaging": { - "bundled": false, - "singleton": true - }, - "@lumino/virtualdom": { - "bundled": false, - "singleton": true - }, - "@lumino/widgets": { - "bundled": false, - "singleton": true - }, - "react": false, - "react-dom": false - } + "extension": "lib/plugin", + "webpackConfig": "webpack.lab.config.js", + "outputDir": "./buckaroo/labextension", + "sharedPackages": { + "@jupyter-widgets/base": { + "bundled": false, + "singleton": true + }, + "@lumino/algorithm": { + "bundled": false, + "singleton": true + }, + "@lumino/commands": { + "bundled": false, + "singleton": true + }, + "@lumino/coreutils": { + "bundled": false, + "singleton": true + }, + "@lumino/datagrid": { + "bundled": false, + "singleton": true + }, + "@lumino/default-theme": { + "bundled": false, + "singleton": true + }, + "@lumino/domutils": { + "bundled": false, + "singleton": true + }, + "@lumino/messaging": { + "bundled": false, + "singleton": true + }, + "@lumino/virtualdom": { + "bundled": false, + "singleton": true + }, + "@lumino/widgets": { + "bundled": false, + "singleton": true + }, + "react": false, + "react-dom": false + } } } diff --git a/webpack.config.js b/webpack.config.js index 23b5df748..160d74ee5 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -16,26 +16,30 @@ crypto.createHash = (algorithm) => // Custom webpack rules -const rules = [ - { test: /\.tsx?$/, loader: 'ts-loader' }, +const baseRules = [ + { test: /\.js$/, loader: 'source-map-loader' }, { test: /\.css$/, use: ['style-loader', 'css-loader'] }, - - -// { -// test: /\.tsx?$/, -// exclude: /node_modules/, -// loader: 'ts-loader' -// }, - - // { - // test: /\.tsx?$/, - // loader: 'ts-loader', - // options: { - // transpileOnly: true, - // configFile: 'examples/tsconfig.json' - // } - // }, + { + test: /\.scss$/, + use: [ + // We're in dev and want HMR, SCSS is handled in JS + // In production, we want our css as files + "style-loader", + "css-loader", + { + loader: "postcss-loader", + options: { + postcssOptions: { + plugins: [ + ["postcss-preset-env"], + ], + }, + }, + }, + "sass-loader" + ], + }, { test: luminoThemeImages, issuer: /\.css$/, @@ -62,6 +66,19 @@ const rules = [ }, ]; + +const rules = [...baseRules, { test: /\.tsx?$/, loader: 'ts-loader' }]; +const demoRules = [...baseRules, + { + test: /\.tsx?$/, + loader: 'ts-loader', + options: { + transpileOnly: true, + configFile: 'examples/tsconfig.json' + } + }] + + // Packages that shouldn't be bundled but loaded at runtime const externals = ['@jupyter-widgets/base']; @@ -73,24 +90,24 @@ const resolve = { }; module.exports = [ - // { - // entry: './js/extension.ts', - // output: { - // filename: 'index.js', - // path: path.resolve(__dirname, 'buckaroo', 'nbextension'), - // libraryTarget: 'amd', - // }, - // module: { - // rules: rules, - // }, - // devtool: 'source-map', - // externals, - // resolve, - // plugins: [new HtmlWebpackPlugin({ - // template: './examples/index.html' - // })] - - // }, + { + entry: './examples/index-react18.tsx', + output: { + path: path.join(__dirname, '/docs'), + filename: 'bundle.js' + }, + module: { + rules: demoRules, + }, + devtool: 'source-map', + externals, + resolve, + plugins: [new HtmlWebpackPlugin({ + //template: './examples/index.html' + template: './examples/index.html' + })] + + }, /** @@ -112,9 +129,9 @@ module.exports = [ devtool: 'source-map', externals, resolve, - plugins: [new HtmlWebpackPlugin({ - template: './examples/index.html' - })] + // plugins: [new HtmlWebpackPlugin({ + // template: './examples/index.html' + // })] }, diff --git a/yarn.lock b/yarn.lock index a351d6166..c26f0a2da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -932,7 +932,7 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.1.2", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4": version "7.21.5" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz" integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== @@ -1018,6 +1018,112 @@ classnames "^2.2" tslib "~2.3.1" +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" @@ -1701,6 +1807,11 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@remix-run/router@1.6.2": + version "1.6.2" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz" + integrity sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA== + "@rjsf/core@^3.1.0": version "3.2.1" resolved "https://registry.npmjs.org/@rjsf/core/-/core-3.2.1.tgz" @@ -2612,6 +2723,18 @@ at-least-node@^1.0.0: resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +autoprefixer@^10.4.13: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" @@ -2859,7 +2982,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -2953,7 +3076,7 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001449: +caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: version "1.0.30001482" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz" integrity sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ== @@ -2999,7 +3122,7 @@ char-regex@^1.0.2: resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chokidar@^3.4.0, chokidar@^3.5.3: +chokidar@^3.4.0, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3274,6 +3397,16 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.1.3: + version "8.1.3" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" @@ -3304,6 +3437,20 @@ crypto@1.0.1: resolved "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + css-loader@^5.0.0, css-loader@^5.0.1: version "5.2.7" resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz" @@ -3320,6 +3467,11 @@ css-loader@^5.0.0, css-loader@^5.0.1: schema-utils "^3.0.0" semver "^7.3.5" +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + css-select@^4.1.3: version "4.3.0" resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" @@ -3336,6 +3488,11 @@ css-what@^6.0.1: resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +cssdb@^7.1.0: + version "7.6.0" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz" + integrity sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" @@ -4166,6 +4323,11 @@ forwarded@0.2.0: resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + free-style@3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/free-style/-/free-style-3.1.0.tgz" @@ -4460,6 +4622,25 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +history@^4.9.0: + version "4.10.1" + resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -4636,6 +4817,11 @@ ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immutable@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" @@ -4924,6 +5110,11 @@ isarray@~1.0.0: resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -5352,6 +5543,11 @@ jest@^28, jest@^28.0.0: import-local "^3.0.2" jest-cli "^28.1.3" +jiti@^1.18.2: + version "1.18.2" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + jquery@^3.1.1: version "3.6.4" resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" @@ -5491,6 +5687,11 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +klona@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + launch-editor@^2.6.0: version "2.6.0" resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz" @@ -5645,7 +5846,7 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -5982,6 +6183,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + normalize.css@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz" @@ -6283,6 +6489,13 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" @@ -6349,6 +6562,148 @@ popper.js@^1.14.4, popper.js@^1.16.1: resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-loader@^7.0.1: + version "7.3.2" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.2.tgz" + integrity sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig== + dependencies: + cosmiconfig "^8.1.3" + jiti "^1.18.2" + klona "^2.0.6" + semver "^7.3.8" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" @@ -6377,7 +6732,120 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: +postcss-nested@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.7.2: + version "7.8.3" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.9: version "6.0.13" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== @@ -6385,12 +6853,12 @@ postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-value-parser@^4.1.0: +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.0, postcss@^8.2.15, postcss@^8.3.11: +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3, postcss@^8.3.11, postcss@^8.4, postcss@^8.4.14, postcss@^8.4.6: version "8.4.24" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== @@ -6411,6 +6879,11 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" +prettier-standalone@^1.3.1-0: + version "1.3.1-0" + resolved "https://registry.npmjs.org/prettier-standalone/-/prettier-standalone-1.3.1-0.tgz" + integrity sha512-wxJiwE5XS45BQD8QTXcTeqnWzsYrCliIYOYrURM8MiJaw8NA5q+BSd9UBhM5QPDFShn+pFWa8X2XH3y5A47q+Q== + prettier@^2.6.2, prettier@>=2.0.0: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" @@ -6434,6 +6907,11 @@ pretty-format@^28.0.0, pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" +prismjs@^1.28.0: + version "1.29.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -6566,7 +7044,7 @@ raw-loader@~4.0.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-is@^16.13.1, react-is@^16.9.0: +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.9.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -6594,6 +7072,41 @@ react-popper@^1.3.7: typed-styles "^0.0.7" warning "^4.0.2" +react-router-dom@^5.2.0: + version "5.3.4" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.3.4" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@^6.3.0: + version "6.11.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz" + integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== + dependencies: + "@remix-run/router" "1.6.2" + +react-router@5.3.4: + version "5.3.4" + resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + react-transition-group@^2.9.0: version "2.9.0" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" @@ -6612,7 +7125,7 @@ react-transition-group@^2.9.0: loose-envify "^1.1.0" object-assign "^4.1.1" -"react@^16.3.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@>=0.14.0, react@>=15.0.0, react@>=16: +"react@^16.3.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@>=0.14.0, react@>=15, react@>=15.0.0, react@>=16, react@>=16.8: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -6769,6 +7282,11 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + resolve.exports@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz" @@ -6882,6 +7400,23 @@ sanitize-html@~2.7.3: parse-srcset "^1.0.2" postcss "^8.3.11" +sass-loader@^13.0.2: + version "13.3.1" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.1.tgz" + integrity sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg== + dependencies: + klona "^2.0.6" + neo-async "^2.6.2" + +sass@^1.3.0, sass@^1.53.0: + version "1.62.1" + resolved "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz" + integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + scheduler@^0.20.2: version "0.20.2" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" @@ -6992,6 +7527,13 @@ semver@^7.3.7: dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + "semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" @@ -7167,7 +7709,7 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2: +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -7587,6 +8129,16 @@ thunky@^1.0.2: resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tiny-invariant@^1.0.2: + version "1.3.1" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" @@ -7942,6 +8494,11 @@ validate.io-number@^1.0.3: resolved "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + vary@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" From 36508e0dee09cf99623a883f3a9d3aea31a0ce90 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 31 May 2023 14:14:12 -0400 Subject: [PATCH 061/250] progress on compile errors --- examples/App.tsx | 4 ++-- js/comp1.tsx | 6 +++--- js/dcefwidget.ts | 9 ++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/examples/App.tsx b/examples/App.tsx index e96fb899f..f52a88320 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -46,9 +46,9 @@ for (const ex of Object.keys(examples)) { const LeftMenuItem = (props): JSX.Element => ( - +

{props.title} - +

); diff --git a/js/comp1.tsx b/js/comp1.tsx index 9a4c8d658..88e230dfc 100644 --- a/js/comp1.tsx +++ b/js/comp1.tsx @@ -1,5 +1,5 @@ import React from 'react'; -export function comp1(){ -console.log("comp1"); - return

comp1

+export function comp1() { + console.log('comp1'); + return

comp1

; } diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 2da2ea498..62c74c071 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -7,11 +7,8 @@ import { ISerializers, } from '@jupyter-widgets/base'; -import { - WidgetDCFCell, - CommandConfigT, - Operation, -} from 'paddy-react-edit-list'; +import { WidgetDCFCell } from './components/DCFCell'; + import * as Backbone from 'backbone'; import React, { useEffect, useState } from 'react'; @@ -24,6 +21,8 @@ import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; import 'paddy-react-edit-list/css/dcf-npm.css'; import '../style/widget.css'; +import { Operation } from './components/OperationUtils'; +import { CommandConfigT } from './components/CommandUtils'; export class DCEFWidgetModel extends DOMWidgetModel { defaults(): Backbone.ObjectHash { From 2928b4130a22b018cacf23c3f1668c4c787d044f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 31 May 2023 14:49:14 -0400 Subject: [PATCH 062/250] seems to build with builtin components --- js/components/ColumnsEditor.tsx | 66 +++++++ js/components/CommandUtils.ts | 38 ++++ js/components/DCFCell.tsx | 87 +++++++++ js/components/DFViewer.tsx | 146 ++++++++++++++ js/components/DependentTabs.tsx | 151 +++++++++++++++ js/components/OperationDetail.tsx | 197 +++++++++++++++++++ js/components/OperationUtils.ts | 34 ++++ js/components/Operations.tsx | 243 ++++++++++++++++++++++++ js/components/StatusBar.tsx | 97 ++++++++++ js/components/bakedOperationDefaults.ts | 14 ++ js/components/gridUtils.ts | 26 +++ js/components/staticData.ts | 132 +++++++++++++ js/components/utils.ts | 41 ++++ 13 files changed, 1272 insertions(+) create mode 100644 js/components/ColumnsEditor.tsx create mode 100644 js/components/CommandUtils.ts create mode 100644 js/components/DCFCell.tsx create mode 100644 js/components/DFViewer.tsx create mode 100644 js/components/DependentTabs.tsx create mode 100644 js/components/OperationDetail.tsx create mode 100644 js/components/OperationUtils.ts create mode 100644 js/components/Operations.tsx create mode 100644 js/components/StatusBar.tsx create mode 100644 js/components/bakedOperationDefaults.ts create mode 100644 js/components/gridUtils.ts create mode 100644 js/components/staticData.ts create mode 100644 js/components/utils.ts diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx new file mode 100644 index 000000000..4b1f2b538 --- /dev/null +++ b/js/components/ColumnsEditor.tsx @@ -0,0 +1,66 @@ +import React, { useState } from 'react'; +import { DFWhole, EmptyDf, bakedOperations } from './staticData'; +import { OperationViewer } from './Operations'; +import { Operation } from './OperationUtils'; +import { CommandConfigT } from './CommandUtils'; +//import {bakedCommandConfig} from './bakedOperationDefaults'; +import { DependentTabs, OperationResult } from './DependentTabs'; +import { staticData } from 'paddy-react-edit-list'; + +export type OperationSetter = (ops: Operation[]) => void; + +export function ColumnsEditor({ + df, + activeColumn, + operations, + setOperations, + operationResult, + + commandConfig, +}: { + df: DFWhole; + activeColumn: string; + operations: Operation[]; + setOperations: OperationSetter; + operationResult: OperationResult; + commandConfig: CommandConfigT; +}) { + const allColumns = df.schema.fields.map((field) => field.name); + //console.log('Columns Editor, commandConfig', commandConfig); + return ( +
+ + +
+ ); +} + +export function ColumnsEditorEx() { + const [operations, setOperations] = useState(bakedOperations); + + const baseOperationResults: OperationResult = { + transformed_df: EmptyDf, + generated_py_code: 'default py code', + transform_error: undefined, + // transform_error:"asdfasf" + }; + return ( + + ); +} diff --git a/js/components/CommandUtils.ts b/js/components/CommandUtils.ts new file mode 100644 index 000000000..eb5085c6e --- /dev/null +++ b/js/components/CommandUtils.ts @@ -0,0 +1,38 @@ +import { OperationDefaultArgs } from './OperationUtils'; + +export type TypeSpec = [number, string, 'type', 'integer' | 'float' | 'string']; +export type EnumSpec = [number, string, 'enum', string[]]; +export type ColEnumSpec = [number, string, 'colEnum', string[]]; + +export type NoArgs = null; +export type ActualArg = TypeSpec | EnumSpec | ColEnumSpec; +export type ArgSpec = TypeSpec | EnumSpec | ColEnumSpec | NoArgs; + +export interface SymbolT { + symbol: string; +} + +export interface SymbolDf { + symbol: 'df'; +} + +export const symDf: SymbolDf = { + symbol: 'df', +}; + +export type ColEnumArgs = Record; + +export type CommandArgSpec = Record; +export const bakedArgSpecs: CommandArgSpec = { + dropcol: [null], + fillna: [[3, 'fillVal', 'type', 'integer']], + resample: [ + [3, 'frequency', 'enum', ['daily', 'weekly', 'monthly']], + [4, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'count']], + ], +}; + +export type CommandConfigT = { + argspecs: CommandArgSpec; + defaultArgs: OperationDefaultArgs; +}; diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx new file mode 100644 index 000000000..ca21090f0 --- /dev/null +++ b/js/components/DCFCell.tsx @@ -0,0 +1,87 @@ +import React, { useState, Dispatch, SetStateAction } from 'react'; +import _ from 'lodash'; +import { OperationResult, baseOperationResults } from './DependentTabs'; +import { ColumnsEditor } from './ColumnsEditor'; +import { tableDf, DFWhole } from './staticData'; +import { DFViewer } from './DFViewer'; +import { StatusBar, DfConfig } from './StatusBar'; +import { CommandConfigT } from './CommandUtils'; +import { bakedCommandConfig } from './bakedOperationDefaults'; +import { Operation, bakedOperations } from './OperationUtils'; + +export type CommandConfigSetterT = ( + setter: Dispatch> +) => void; + +/* + Widget DCFCell is meant to be used with callback functions and passed values, not explicit http calls + */ +export function WidgetDCFCell({ + origDf, + operations, + on_operations, + operation_results, + commandConfig, + dfConfig, + on_dfConfig, +}: { + origDf: DFWhole; + operations: Operation[]; + on_operations: (ops: Operation[]) => void; + operation_results: OperationResult; + commandConfig: CommandConfigT; + dfConfig: DfConfig; + on_dfConfig: unknown; +}) { + const [activeCol, setActiveCol] = useState('stoptime'); + + return ( +
+
+ + +
+ +
+ ); +} + +export function WidgetDCFCellExample() { + const [sampleConfig, setConfig] = useState({ + totalRows: 1309, + columns: 30, + rowsShown: 500, + sampleSize: 10_000, + summaryStats: false, + reorderdColumns: false, + }); + const [operations, setOperations] = useState(bakedOperations); + return ( + + ); +} diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx new file mode 100644 index 000000000..5330c6a20 --- /dev/null +++ b/js/components/DFViewer.tsx @@ -0,0 +1,146 @@ +import React, { + useRef, + CSSProperties, +} from 'react'; +import _ from 'lodash'; +import { DFWhole, EmptyDf } from './staticData'; +import { updateAtMatch, dfToAgrid } from './gridUtils'; +import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component +import { + GridOptions, +} from 'ag-grid-community'; + +export type setColumFunc = (newCol: string) => void; + +export function DFViewer( + { + df, + style, + activeCol, + setActiveCol, + }: { + df: DFWhole; + style?: CSSProperties; + activeCol?: string; + setActiveCol?: setColumFunc; + } = { + df: EmptyDf, + style: { height: '300px' }, + setActiveCol: () => null, + } +) { + const [agColsPure, agData] = dfToAgrid(df); + const styledColumns = updateAtMatch( + _.clone(agColsPure), + activeCol || '___never', + { + cellStyle: { background: 'var(--ag-range-selection-background-color-3)' }, + }, + { cellStyle: {} } + ); + + //console.log("styledColumns after updateAtMatch", activeCol, styledColumns) + const gridOptions: GridOptions = { + rowSelection: 'single', + onRowClicked: (event) => console.log('A row was clicked'), + onCellClicked: (event) => { + const colName = event.column.getColId(); + if (setActiveCol === undefined || colName === undefined) { + return; + } else { + setActiveCol(colName); + } + }, + }; + const gridRef = useRef>(null); + + const makeCondtionalAutosize = (count: number, delay: number) => { + let counter = count; + let timer: NodeJS.Timeout; + let colWidthHasBeenSet = false; + let currentColWidth = -10; + if (gridRef === undefined || gridRef.current === null) { + currentColWidth = 200; + } else { + try { + const dc = gridRef!.current!.columnApi.getAllDisplayedColumns(); + + if (dc.length !== 0) { + currentColWidth = dc[0].getActualWidth(); + } else { + currentColWidth = 200; + } + } catch (e) { + console.log('88, gridref not defined yet', e); + } + } + + // console.log('first pass currentColWidth'); + + const conditionallyAutosize = () => { + // console.log("conditionallyAutosize", count, delay) + if (gridRef !== undefined) { + // console.log("gridref defined") + if (gridRef.current !== undefined && gridRef.current !== null) { + // console.log("gridref.current defined") + if (gridRef.current.columnApi !== undefined) { + // console.log("calling autosizeAllColumns", count, delay); + gridRef.current.columnApi.autoSizeAllColumns(); + const dc = gridRef.current.columnApi.getAllDisplayedColumns(); + // console.log("bodyWidth", cm.bodyWidth) + // console.log("cm", cm) + + if (dc.length !== 0) { + const aw = dc[0].getActualWidth(); // this eventually changes after the resize + //console.log("dc", aw); + if (colWidthHasBeenSet === false) { + currentColWidth = aw; + colWidthHasBeenSet = true; + } else { + currentColWidth = aw; + } + } + gridRef.current.forceUpdate(); + } + } + } + // console.log("counter", counter, "colWidthHasBeenSet", colWidthHasBeenSet, originalColWidth, currentColWidth); + if (counter > 0 && colWidthHasBeenSet === false) { + counter -= 1; + // console.log("no gridRef or gridRef.current, setting delay", counter) + //@ts-ignore + timer = setTimeout(conditionallyAutosize, delay); + return; + } else if (counter > 0 && currentColWidth === 200) { + counter -= 1; + + // console.log( + // "new colwidth not recognized yet", + // counter, originalColWidth, gridRef.current!.columnApi!.columnModel!.displayedColumns[0].actualWidth) + //@ts-ignore + timer = setTimeout(conditionallyAutosize, delay); + return; + } + }; + //@ts-ignore + timer = setTimeout(conditionallyAutosize, delay); + return () => clearTimeout(timer); + }; + + makeCondtionalAutosize(50, 10); + return ( +
+
+ +
+
+ ); +} diff --git a/js/components/DependentTabs.tsx b/js/components/DependentTabs.tsx new file mode 100644 index 000000000..4cf248c70 --- /dev/null +++ b/js/components/DependentTabs.tsx @@ -0,0 +1,151 @@ +import React, { + useState, + CSSProperties, + Dispatch, + SetStateAction, +} from 'react'; +import { DFWhole, EmptyDf } from './staticData'; +import { DFViewer } from './DFViewer'; +import _ from 'lodash'; +import { Operation } from './OperationUtils'; + +//@ts-ignore +export function OperationDisplayer({ filledOperations, style }) { + const baseStyle = { margin: '0', textAlign: 'left' }; + const localStyle = { ...baseStyle, ...style }; + return ( +
+
{JSON.stringify(filledOperations)}
+
+ ); +} + +export function PythonDisplayer({ + style, + generatedPyCode, +}: { + style: any; + generatedPyCode: string; +}) { + const baseStyle = { margin: '0', textAlign: 'left' }; + const localStyle = { ...baseStyle, ...style }; + return ( +
+
{generatedPyCode}
+
+ ); +} + +export function TransformViewer({ + style, + transformedDf, +}: { + style: CSSProperties; + transformedDf: DFWhole; +}) { + return ( +
+ +
+ ); +} +export type OperationResult = { + transformed_df: DFWhole; + generated_py_code: string; + transform_error?: string; +}; + +export type OrRequesterT = (ops: Operation[]) => void; +export type getOperationResultSetterT = ( + setter: Dispatch> +) => OrRequesterT; + +export const baseOperationResults: OperationResult = { + transformed_df: EmptyDf, + generated_py_code: 'default py code', +}; + +export function TabComponent({ + currentTab, + _setTab, + tabName, +}: { + currentTab: any; + _setTab: any; + tabName: any; +}): JSX.Element { + return ( +
  • { + _setTab(tabName); + }} + className={currentTab === tabName ? 'active' : ''} + > + {tabName} +
  • + ); +} + +export function DependentTabs({ + filledOperations, + operationResult, +}: { + filledOperations: Operation[]; + operationResult: OperationResult; +}) { + const [tab, _setTab] = useState('DataFrame'); + const style = { height: '45vh' }; + console.log('dependenttabs operationResult', operationResult); + return ( +
    +
      + + + +
    +
    + {operationResult.transform_error ? ( +
    +

    error

    + +
    + ) : ( + + )} + { + { + Operations: ( + + ), + Python: ( + + ), + DataFrame: ( + + ), + }[tab] + } +
    +
    + ); +} diff --git a/js/components/OperationDetail.tsx b/js/components/OperationDetail.tsx new file mode 100644 index 000000000..8fb5de781 --- /dev/null +++ b/js/components/OperationDetail.tsx @@ -0,0 +1,197 @@ +import _ from 'lodash'; +import { + Operation, + SettableArg, + OperationEventFunc, + NoArgEventFunc, +} from './OperationUtils'; +import { ActualArg, CommandArgSpec } from './CommandUtils'; +import { objWithoutNull, replaceAtIdx, replaceAtKey } from './utils'; +import React from 'react'; + + +export const OperationDetail = ({ + command, + setCommand, + deleteCB, + columns, + commandPatterns, +}: { + command: Operation; + setCommand: OperationEventFunc; + deleteCB: NoArgEventFunc; + columns: string[]; + commandPatterns: CommandArgSpec; +}) => { + if (command === undefined) { + return

    error undefined command

    ; + } + const commandName = command[0]['symbol']; + const pattern = commandPatterns[commandName]; + + if (!_.isArray(pattern)) { + //we shouldn't get here + return

    unknown command {commandName}

    ; + } else if (_.isEqual(pattern, [null])) { + return ( +
    + +
    + ); + } else { + const fullPattern = pattern as ActualArg[]; + return ( +
    + +
    + ); + } + return

    ; +}; + +export const ArgGetters = ({ + command, + fullPattern, + setCommand, + columns, + deleteCB, +}: { + command: Operation; + fullPattern: ActualArg[]; + setCommand: OperationEventFunc; + columns: string[]; + deleteCB: () => void; +}) => { + const makeArgGetter = (pattern: ActualArg) => { + const idx = pattern[0]; + const val = command[idx] as SettableArg; + const valSetter = (newVal:unknown) => { + const newCommand = replaceAtIdx(command, idx, newVal); + //console.log('newCommand', newCommand); + setCommand(newCommand as Operation); + }; + return ( +
    + +
    + ); + }; + return ( +
    + + {fullPattern.map(makeArgGetter)} +
    + ); +}; + +const ArgGetter = ({ + argProps, + val, + setter, + columns, +}: { + argProps: ActualArg; + val: SettableArg; + setter: (arg: SettableArg) => void; + columns: string[]; +}) => { + const [_argPos, label, argType, lastArg] = argProps; + + const defaultShim = (event: { target: { value: SettableArg; }; }) => setter(event.target.value); + if (argType === 'enum' && _.isArray(lastArg)) { + return ( +
    + + +
    + ); + } else if (argType === 'type') { + if (lastArg === 'integer') { + const valSetterShim = (event: { target: { value: string; }; }) => setter(parseInt(event.target.value)); + return ( +
    + + +
    + ); + } else { + return ( +
    + + +
    + ); + } + } else if (argType === 'colEnum') { + const widgetRow = columns.map((colName: string) => { + const colSetter = (event: { target: { value: any; }; }) => { + const newColVal = event.target.value; + if (_.isString(newColVal)) { + const updatedColDict = replaceAtKey( + val as Record, + colName, + newColVal as string + ); // as Record + setter(objWithoutNull(updatedColDict, ['null'])); + } + }; + const colVal = _.get(val, colName, 'null'); + if(!_.isArray(lastArg)) { + + return

    arg error

    + } + return ( + + + + ); + }); + + return ( +
    + + + + {columns.map((colName) => ( + + ))} + + + + {widgetRow} + +
    {colName}
    +
    + ); + } else { + return

    unknown argtype

    ; + } +}; diff --git a/js/components/OperationUtils.ts b/js/components/OperationUtils.ts new file mode 100644 index 000000000..239c25458 --- /dev/null +++ b/js/components/OperationUtils.ts @@ -0,0 +1,34 @@ +import _ from 'lodash'; +import { SymbolT, ColEnumArgs, SymbolDf, symDf } from './CommandUtils'; + +export const sym = (symbolName: string) => { + return { symbol: symbolName }; +}; + + +export type Atom = number | string | SymbolT | ColEnumArgs; +export type SettableArg = number | string | ColEnumArgs; + +export type OperationSingleColumn = [SymbolT, SymbolDf, string]; +export type OperationSingleArg = [SymbolT, SymbolDf, string, Atom]; +export type OperationTwoArg = [SymbolT, SymbolDf, string, Atom, Atom]; +export type Operation = + | OperationSingleColumn + | OperationSingleArg + | OperationTwoArg; + +export type SetOperationFunc = (newCommand: Operation) => void; +export type SetOperationsFunc = (newCommands: Operation[]) => void; + +export type OperationDefaultArgs = Record; + +//const ArgNames = ['Idx', 'label', 'specName', 'extraSpecArgs']; +export const bakedOperations: Operation[] = [ + [sym('dropcol'), symDf, 'col1'], + [sym('fillna'), symDf, 'col2', 5], + [sym('resample'), symDf, 'month', 'monthly', {}], +]; + +//this will become OperationEventFunc +export type OperationEventFunc = (newCommand: Operation) => void; +export type NoArgEventFunc = () => void; diff --git a/js/components/Operations.tsx b/js/components/Operations.tsx new file mode 100644 index 000000000..58c5ce248 --- /dev/null +++ b/js/components/Operations.tsx @@ -0,0 +1,243 @@ +import React, { + useState, + useEffect, +} from 'react'; +import _ from 'lodash'; +import { + Operation, + SetOperationsFunc, + OperationEventFunc, + NoArgEventFunc, +} from './OperationUtils'; +import { CommandConfigT } from './CommandUtils'; +import { replaceInArr } from './utils'; +import { bakedCommandConfig } from './bakedOperationDefaults'; +import { OperationDetail } from './OperationDetail'; +import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component +import { ColDef, GridOptions } from 'ag-grid-community'; +import { updateAtMatch } from './gridUtils'; +import 'ag-grid-community/styles/ag-grid.css'; +import 'ag-grid-community/styles/ag-theme-alpine.css'; +import { bakedOperations } from './staticData'; + +const getColumns = (passedOperations: Operation[]): ColDef[] => + _.map(Array.from(passedOperations.entries()), ([index, element]) => { + const name = element[0]['symbol']; + const key = name + index.toString(); + const column = { field: key, headerName: name }; // width: 20, maxWidth: 60}; + return column; + }); + +export const OperationsList = ({ + operations, + activeKey, + setActiveKey, +}: { + operations: Operation[]; + activeKey?: string; + setActiveKey: React.Dispatch>; +}) => { + const rowElements = _.map( + Array.from(operations.entries()), + ([index, element]) => { + const name = element[0]['symbol']; + const key = name + index.toString(); + const rowEl: Record = {}; + rowEl[key] = element[2]; + return rowEl; + } + ); + const rows = [_.merge({}, ...rowElements)]; + const columns = getColumns(operations); + + const styledColumns = updateAtMatch( + _.clone(columns), + activeKey || '___never', + { + cellStyle: { background: 'var(--ag-range-selection-background-color-3)' }, + }, + { cellStyle: {} } + ); + + //console.log('OperationsList columns', columns); + + const gridOptions: GridOptions = { + rowSelection: 'single', + headerHeight: 30, + //onRowClicked: (event) => console.log('A row was clicked'), + onCellClicked: (event) => { + const colName = event.column.getColId(); + //console.log('operationsList onCellClicked'); + setActiveKey(colName); + }, + }; + return ( +
    + +
    + ); +}; + +export const OperationAdder = ({ column, addOperationCb, defaultArgs }:{ column:string, addOperationCb:any, defaultArgs:any } ): JSX.Element => { + const addOperationByName = (localOperationName: string) => { + return () => { + const defaultOperation = defaultArgs[localOperationName]; + addOperationCb(replaceInArr(defaultOperation, 'col', column)); + }; + }; + + return ( +
    + Column: {column} +
    + {_.keys(defaultArgs).map((optionVal) => ( + + ))} +
    +
    + ); +}; + +export const OperationViewer = ({ + operations, + setOperations, + activeColumn, + allColumns, + commandConfig, +}: { + operations: Operation[]; + setOperations: SetOperationsFunc; + activeColumn: string; + allColumns: string[]; + commandConfig: CommandConfigT; +}) => { + const operationObjs = _.map( + Array.from(operations.entries()), + ([index, element]) => { + const name = element[0]['symbol']; + const key = name + index.toString(); + const rowEl: Record = {}; + rowEl[key] = element; + return rowEl; + } + ); + //why am I doing this? probably something so I gauruntee a clean dict + + const operationDict = _.merge({}, ...operationObjs); + + const idxObjs = _.map( + Array.from(operations.entries()), + ([index, element]) => { + const name = element[0]['symbol']; + const key = name + index.toString(); + const rowEl: Record = {}; + rowEl[key] = index; + return rowEl; + } + ); + const keyToIdx = _.merge({}, ...idxObjs); + + // previously was null + const [activeKey, setActiveKey] = useState(''); + + function getSetOperation(key: string): OperationEventFunc { + return (newOperation: Operation) => { + const index = keyToIdx[key]; + const nextOperations = operations.map((c, i) => { + if (i === index) { + return newOperation; + } else { + return c; + } + }); + setOperations(nextOperations); + }; + } + + function getDeleteOperation(key: string): NoArgEventFunc { + return (): void => { + const index = keyToIdx[key]; + const nextOperations = operations.map((c, i) => { + if (i === index) { + return undefined; + } else { + return c; + } + }); + setActiveKey(''); + setOperations(_.filter(nextOperations) as Operation[]); + }; + } + + const addOperation: OperationEventFunc = (newOperation: Operation) => { + const newOperationArr = [...operations, newOperation]; + setOperations(newOperationArr); + const newOperationKey = + getColumns(newOperationArr)[newOperationArr.length - 1].field; + if (newOperationKey !== undefined) { + setActiveKey(newOperationKey); + } + }; + const { argspecs, defaultArgs } = commandConfig; + //console.log('OperationsViewer operationDict', operationDict, 'activeKey', activeKey); + return ( +
    + +
    +

    Operations

    + +
    + {activeKey && ( + + )} +
    + ); +}; + +export const Commands = () => { + const [c, setC] = useState(bakedOperations); + const [commandConfig, setCommandConfig] = useState(bakedCommandConfig); + + useEffect(() => { + fetch('http://localhost:5000/dcf/command-config').then(async (response) => { + setCommandConfig(await response.json()); + }); + }, []); + + return ( +
    + + + {' '} + {JSON.stringify(c, null, '\t\n\r')}{' '} + +
    + ); +}; diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx new file mode 100644 index 000000000..5814c1133 --- /dev/null +++ b/js/components/StatusBar.tsx @@ -0,0 +1,97 @@ +import React, { + useState, + useRef, +} from 'react'; +import _ from 'lodash'; +import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component +import { + ColDef, + GridOptions, +} from 'ag-grid-community'; + +export type setColumFunc = (newCol: string) => void; + +export interface DfConfig { + totalRows: number; + columns: number; + rowsShown: number; + sampleSize: number; + summaryStats: boolean; + reorderdColumns: boolean; +} + +const columnDefs: ColDef[] = [ + { field: 'totalRows' }, + { field: 'columns' }, + { field: 'rowsShown' }, + { field: 'sampleSize' }, + { field: 'summaryStats' }, + { field: 'reorderdColumns' }, +]; + +export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) { + const { + totalRows, + columns, + rowsShown, + sampleSize, + summaryStats, + reorderdColumns, + } = config; + + const rowData = [ + { + totalRows, + columns, + rowsShown, + sampleSize, + summaryStats: summaryStats.toString(), + reorderdColumns: reorderdColumns.toString(), + }, + ]; + + const updateDict = (event:any) => { + const colName = event.column.getColId(); + if (colName === 'summaryStats') { + setConfig({ ...config, summaryStats: !config.summaryStats }); + } else if (colName === 'reorderdColumns') { + setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); + } + }; + const gridOptions: GridOptions = { + rowSelection: 'single', + }; + + const gridRef = useRef>(null); + const defaultColDef = { + type: 'left-aligned', + cellStyle: { textAlign: 'left' }, + }; + return ( +
    +
    + +
    +
    + ); +} + +export function StatusBarEx() { + const [sampleConfig, setConfig] = useState({ + totalRows: 1309, + columns: 30, + rowsShown: 500, + sampleSize: 10_000, + summaryStats: false, + reorderdColumns: false, + }); + + return ; +} diff --git a/js/components/bakedOperationDefaults.ts b/js/components/bakedOperationDefaults.ts new file mode 100644 index 000000000..5b922344e --- /dev/null +++ b/js/components/bakedOperationDefaults.ts @@ -0,0 +1,14 @@ +import { OperationDefaultArgs } from './OperationUtils'; +import { sym } from './utils'; +import { symDf, CommandConfigT, bakedArgSpecs } from './CommandUtils'; + +export const bakedOperationDefaults: OperationDefaultArgs = { + dropcol: [sym('dropcol'), symDf, 'col'], + fillna: [sym('fillna'), symDf, 'col', 8], + resample: [sym('resample'), symDf, 'col', 'monthly', {}], +}; + +export const bakedCommandConfig: CommandConfigT = { + argspecs: bakedArgSpecs, + defaultArgs: bakedOperationDefaults, +}; diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts new file mode 100644 index 000000000..8321e1489 --- /dev/null +++ b/js/components/gridUtils.ts @@ -0,0 +1,26 @@ +import { ColDef } from 'ag-grid-community'; +import { DFWhole, DFColumn } from './staticData'; + +export const updateAtMatch = ( + cols: ColDef[], + key: string, + subst: Partial, + negative: Partial +) => { + const retColumns = cols.map((x) => { + if (x.field === key) { + return { ...x, ...subst }; + } else { + return { ...x, ...negative }; + } + }); + return retColumns; +}; + +export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { + const fields = tdf.schema.fields; + const retColumns = fields.map((f: DFColumn) => { + return { field: f.name }; + }); + return [retColumns, tdf.data]; +} diff --git a/js/components/staticData.ts b/js/components/staticData.ts new file mode 100644 index 000000000..9bf76a964 --- /dev/null +++ b/js/components/staticData.ts @@ -0,0 +1,132 @@ +import { OperationDefaultArgs, Operation } from './OperationUtils'; +import { sym } from './utils'; +import { symDf, CommandConfigT, bakedArgSpecs } from './CommandUtils'; + +export const bakedOperationDefaults: OperationDefaultArgs = { + dropcol: [sym('dropcol'), symDf, 'col'], + fillna: [sym('fillna'), symDf, 'col', 8], + resample: [sym('resample'), symDf, 'col', 'monthly', {}], +}; + +export const bakedCommandConfig: CommandConfigT = { + argspecs: bakedArgSpecs, + defaultArgs: bakedOperationDefaults, +}; + +export const bakedOperations: Operation[] = [ + [sym('dropcol'), symDf, 'col1'], + [sym('fillna'), symDf, 'col2', 5], + [sym('resample'), symDf, 'month', 'monthly', {}], +]; +/* +const origColumns = [ + { key: 'id', name: 'ID' }, + { key: 'title', name: 'Title' }, +]; + +const origRows = [ + { id: 0, title: 'Example' }, + { id: 1, title: 'Demo' }, +]; +*/ +export interface DFColumn { + name: string; +} +export type DFDataRow = Record; + +export type DFData = DFDataRow[]; + +export interface DFWhole { + schema: { + fields: DFColumn[]; + }; + data: DFData; +} + +export const EmptyDf: DFWhole = { + schema: { fields: [] }, + data: [], +}; + +//print(sdf.to_json(orient='table', indent=2)) + +export const tableDf = { + schema: { + fields: [ + { name: 'index', type: 'integer' }, + { name: 'tripduration', type: 'integer' }, + { name: 'starttime', type: 'string' }, + { name: 'stoptime', type: 'string' }, + { name: 'start station id', type: 'integer' }, + { name: 'start station name', type: 'string' }, + { name: 'start station latitude', type: 'number' }, + { name: 'bikeid', type: 'integer' }, + { name: 'birth year', type: 'string' }, + { name: 'gender', type: 'integer' }, + ], + primaryKey: ['index'], + pandas_version: '1.4.0', + }, + data: [ + { + index: 0, + tripduration: 404, + starttime: '2014-07-01 00:00:04', + stoptime: '2014-07-01 00:06:48', + 'start station id': 545, + 'start station name': 'E 23 St & 1 Ave', + 'start station latitude': 40.736502, + bikeid: 19578, + 'birth year': '1987', + gender: 2, + }, + { + index: 1, + tripduration: 850, + starttime: '2014-07-01 00:00:06', + stoptime: '2014-07-01 00:14:16', + 'start station id': 238, + 'start station name': 'Bank St & Washington St', + 'start station latitude': 40.7361967, + bikeid: 19224, + 'birth year': '1987', + gender: 1, + }, + { + index: 2, + tripduration: 1550, + starttime: '2014-07-01 00:00:21', + stoptime: '2014-07-01 00:26:11', + 'start station id': 223, + 'start station name': 'W 13 St & 7 Ave', + 'start station latitude': 40.73781509, + bikeid: 17627, + 'birth year': '1973', + gender: 2, + }, + { + index: 3, + tripduration: 397, + starttime: '2014-07-01 00:00:29', + stoptime: '2014-07-01 00:07:06', + 'start station id': 224, + 'start station name': 'Spruce St & Nassau St', + 'start station latitude': 40.71146364, + bikeid: 15304, + 'birth year': '1982', + gender: 1, + }, + { + index: 4, + tripduration: 609, + starttime: '2014-07-01 00:00:37', + stoptime: '2014-07-01 00:10:46', + 'start station id': 346, + 'start station name': 'Bank St & Hudson St', + 'start station latitude': 40.73652889, + bikeid: 20062, + 'birth year': '1972', + gender: 2, + }, + ], +}; diff --git a/js/components/utils.ts b/js/components/utils.ts new file mode 100644 index 000000000..773acd0b2 --- /dev/null +++ b/js/components/utils.ts @@ -0,0 +1,41 @@ +import _ from 'lodash'; +import { DFWhole } from './staticData'; + +export type setDFFunc = (newDf: DFWhole) => void; + +export const requestDf = (url: string, setCallBack: setDFFunc) => { + const retPromise = fetch(url).then(async (response) => { + const tableDf = await response.json(); + setCallBack(tableDf); + }); + return retPromise; +}; + +export const sym = (symbolName: string) => { + return { symbol: symbolName }; +}; + +export function replaceInArr(arr: T[], old: T, subst: T): T[] { + return arr.map((item: T) => (item === old ? subst : item)); +} + +export function replaceAtIdx(arr: T[], idx: number, subst: T): T[] { + return arr.map((item: T, innerIdx: number) => + innerIdx === idx ? subst : item + ); +} + +export function replaceAtKey( + obj: Record, + key: string, + subst: T +): Record { + const objCopy = _.clone(obj); + objCopy[key] = subst; + return objCopy; +} + +export const objWithoutNull = ( + obj: Record, + extraStrips: string[] = [] +) => _.pickBy(obj, (x) => ![null, undefined, ...extraStrips].includes(x)); From 24d0e1fd38ce06e4dea7556e15a07332ed95ebf2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 31 May 2023 14:56:11 -0400 Subject: [PATCH 063/250] seems to compile without paddy-react-edit-iost --- .../_static/embed-bundle.js.LICENSE.txt | 4 +- js/components/ColumnsEditor.tsx | 6 +-- js/dcefwidget.ts | 2 +- package.json | 4 +- yarn.lock | 41 ++++--------------- 5 files changed, 17 insertions(+), 40 deletions(-) diff --git a/docs/source/_static/embed-bundle.js.LICENSE.txt b/docs/source/_static/embed-bundle.js.LICENSE.txt index 554109d98..cfe1226b7 100644 --- a/docs/source/_static/embed-bundle.js.LICENSE.txt +++ b/docs/source/_static/embed-bundle.js.LICENSE.txt @@ -1,12 +1,12 @@ /** - * @ag-grid-community/all-modules - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue * @version v29.3.3 + * @ag-grid-community/all-modules - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue * @version v29.3.5 * @link https://www.ag-grid.com/ * @license MIT */ /** * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue - * @version v29.3.3 + * @version v29.3.5 * @link https://www.ag-grid.com/ * @license MIT */ diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx index 4b1f2b538..7b18bda91 100644 --- a/js/components/ColumnsEditor.tsx +++ b/js/components/ColumnsEditor.tsx @@ -5,7 +5,7 @@ import { Operation } from './OperationUtils'; import { CommandConfigT } from './CommandUtils'; //import {bakedCommandConfig} from './bakedOperationDefaults'; import { DependentTabs, OperationResult } from './DependentTabs'; -import { staticData } from 'paddy-react-edit-list'; +import { tableDf, bakedCommandConfig } from './staticData' export type OperationSetter = (ops: Operation[]) => void; @@ -55,9 +55,9 @@ export function ColumnsEditorEx() { }; return ( =1.1.37", "prettier-standalone": "^1.3.1-0", "react": "^18.0.0", "react-dom": "^18.0.0", diff --git a/yarn.lock b/yarn.lock index c26f0a2da..29845eb70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,18 +2,6 @@ # yarn lockfile v1 -"@ag-grid-community/client-side-row-model@^29.2.0": - version "29.3.3" - resolved "https://registry.npmjs.org/@ag-grid-community/client-side-row-model/-/client-side-row-model-29.3.3.tgz" - integrity sha512-7BjLseiB625CiDECsSJBDn6xt59VMl0Fs1PwaCWtrTX0AKYBoU5W/SaOezRKW6saH6FnXxEW+47Vyrz+s+rRJQ== - dependencies: - "@ag-grid-community/core" "~29.3.3" - -"@ag-grid-community/core@~29.3.3": - version "29.3.3" - resolved "https://registry.npmjs.org/@ag-grid-community/core/-/core-29.3.3.tgz" - integrity sha512-cr15doApCrzf7QJYAi0X4zZMv7sFi4nBmEFN4asxSTxrbFGzqzVjO2ymQi5U60NikRTQOuYx3Kzx4PzOTuH4dA== - "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" @@ -2026,7 +2014,7 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/lodash@^4.14.134", "@types/lodash@^4.14.191": +"@types/lodash@^4.14.134": version "4.14.194" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz" integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== @@ -2499,15 +2487,15 @@ acorn@^8.8.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -ag-grid-community@^29.2.0, ag-grid-community@~29.3.3: - version "29.3.3" - resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.3.tgz" - integrity sha512-5XHG2NtXfUFroST/IvWyIYzM7GnbAM1mX7YsKvUHRWk0iMY1kAMJMk6AOoNKe1BBj7jg+Wgbig123T4X7bNZPw== +ag-grid-community@^29.2.0, ag-grid-community@~29.3.5: + version "29.3.5" + resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.5.tgz" + integrity sha512-LxUo21f2/CH31ACEs1C7Q/ggGGI1fQPSTB4aY5OThmM+lBkygZ7QszBE8jpfgWOIjvjdtcdIeQbmbjkHeMsA7A== ag-grid-react@^29.2.0: - version "29.3.3" - resolved "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-29.3.3.tgz" - integrity sha512-xciimp9q8FXv2bgLOIyPT11dKEW0KNDTF8hyDuAKuK3541YBTZpiycwtmYxVimUM4c007TRTEYgw6Kql/gqWiA== + version "29.3.5" + resolved "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-29.3.5.tgz" + integrity sha512-Eg0GJ8hEBuxdVaN5g+qITOzhw0MGL9avL0Oaajr+p7QRtq2pIFHLZSknWsCBzUTjidiu75WZMKwlZjtGEuafdQ== dependencies: prop-types "^15.8.1" @@ -6390,19 +6378,6 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -paddy-react-edit-list@>=1.1.37: - version "1.1.37" - resolved "https://registry.npmjs.org/paddy-react-edit-list/-/paddy-react-edit-list-1.1.37.tgz" - integrity sha512-NdR9oKZ8y1GrLvHOCKWkLTIQODCtqD/CI1Yz1cS2znKhDvwDibx1bnS66mxrN1U80PxbKNgv/4i8/j71WgwuTw== - dependencies: - "@ag-grid-community/client-side-row-model" "^29.2.0" - "@types/lodash" "^4.14.191" - ag-grid-community "^29.2.0" - ag-grid-react "^29.2.0" - lodash "^4.17.21" - react "^18.0.0" - react-dom "^18.0.0" - param-case@^3.0.3, param-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" From 85174c199814f4920c3cf654b0f122d95cf40ca3 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 31 May 2023 14:56:27 -0400 Subject: [PATCH 064/250] seems to compile without paddy-react-edit-iost --- style/dcf-npm.css | 140 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 style/dcf-npm.css diff --git a/style/dcf-npm.css b/style/dcf-npm.css new file mode 100644 index 000000000..08d3f3955 --- /dev/null +++ b/style/dcf-npm.css @@ -0,0 +1,140 @@ +.column-list { + width: 100%; + font-size: 1rem; +} +.column-list dl { + display: flex; + margin: 0; + padding: 0; +} +.column-list dl div.list-item { + padding: 3px; +} +.column-list dl div.list-item dt { + float: left; + max-width: 90px; + overflow: hidden; + max-height: 1rem; +} +.column-list dl div.list-item dd { + float: right; +} +.column-list dl div.list-item .column-editor { + width: 100%; + clear: both; + height: 30px; +} +.column-list dl div.list-item .column-editor label span { + float: left; +} +.column-list dl div.list-item .column-editor label input[type=checkbox] { + float: left; +} +.dependent-tabs { + font-size: 1rem; +} +.dependent-tabs ul.tabs li { + float: left; + background: var(--ag-background-color); + color: var(--ag-foreground-color); + border: 1px solid purple; + border-bottom: none; + list-style: none; + margin-right: 5px; + padding: 2px; +} +.dependent-tabs ul.tabs li.active { + background: var(--ag-range-selection-background-color-3); + color: var(--ag-alpine-active-color); +} +.dependent-tabs .output-area { + clear: both; + float: none; +} + +.python-displayer, .command-displayer { + width: 100%; + height: 100%; + background: hsl(0, 0%, 13%); + overflow: hidden; + padding: 16px; + /*border:1px solid red; */ +} +.python-displayer pre, .command-displayer pre { + color: #41FF00; +} + +.command-displayer pre { + overflow: hidden; +} + +.features { + font-size: 1.7rem; +} +.features div { + padding: 0.5rem; +} + +.modal { + position: absolute; + background-color: #ffffff; + border: 1px solid black; + padding: 16px; + list-style: none; +} +.modal > li { + padding: 8px; +} + +.command-viewer { + border: 1px solid; + color: black; + font-size: 1rem; +} +.command-viewer .operation-adder { + clear: both; +} +.command-viewer .operation-adder span.column-name { + float: left; + display: block; + color: black; +} +.command-viewer .operation-adder fieldset { + float: left; +} +.command-viewer .operations-box { + clear: left; + display: flex; + overflow: auto; +} +.command-viewer .operations-box h4 { + font-size: 1em; + border: 1px orange; + color: black; +} +.command-viewer .operations-box div { + overflow-x: scroll; +} + +.operation-detail { + overflow: auto; +} +.operation-detail button { + float: left; +} +.operation-detail .arg-getters button { + float: left; +} +.operation-detail .arg-getters fieldset { + float: left; +} +.operation-detail .arg-getters div.col-enum { + float: left; + width: 800px; + overflow-x: scroll; +} +.operation-detail .arg-getters div.col-enum table td, .operation-detail .arg-getters div.col-enum table th { + border: 1px solid black; +} + +/*# sourceMappingURL=dcf-npm.css.map */ From 59fdfbdb087a4ad49bc4555eccb376a25891b65a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 31 May 2023 15:08:31 -0400 Subject: [PATCH 065/250] actually including the example files --- examples/App.tsx | 1 - examples/ex/ColumnsEditorEx.tsx | 9 +++++++++ examples/ex/CommandViewerEx.tsx | 20 ++++++++++++++++++++ examples/ex/DFViewerEx.tsx | 9 +++++++++ examples/ex/StatusBarEx.tsx | 6 ++++++ examples/ex/WidgetDCFCellEx.tsx | 7 +++++++ package.json | 21 +++++++++------------ 7 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 examples/ex/ColumnsEditorEx.tsx create mode 100644 examples/ex/CommandViewerEx.tsx create mode 100644 examples/ex/DFViewerEx.tsx create mode 100644 examples/ex/StatusBarEx.tsx create mode 100644 examples/ex/WidgetDCFCellEx.tsx diff --git a/examples/App.tsx b/examples/App.tsx index f52a88320..dc0954451 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -12,7 +12,6 @@ import '../js/npm-styles.scss'; const examples = { - DCFCellEx: {title: 'DCFCell', file: 'DCFCellEx'}, WidgetDCFCellEx: {title: 'WigetDCFCell', file: 'WidgetDCFCellEx'}, ColumnsEditorEx: {title: 'ColumnsEditor', file: 'ColumnsEditorEx'}, CommandViewerEx: {title: 'CommandViewer', file: 'CommandViewerEx'}, diff --git a/examples/ex/ColumnsEditorEx.tsx b/examples/ex/ColumnsEditorEx.tsx new file mode 100644 index 000000000..45d62c226 --- /dev/null +++ b/examples/ex/ColumnsEditorEx.tsx @@ -0,0 +1,9 @@ +import * as React from 'react'; + +import {ColumnsEditorEx} from '../../js/components/ColumnsEditor'; +import 'ag-grid-community/styles/ag-grid.css'; +import 'ag-grid-community/styles/ag-theme-alpine.css'; + +//import '../../css/dcf-npm.css'; + +export default ColumnsEditorEx; diff --git a/examples/ex/CommandViewerEx.tsx b/examples/ex/CommandViewerEx.tsx new file mode 100644 index 000000000..e1b90bc72 --- /dev/null +++ b/examples/ex/CommandViewerEx.tsx @@ -0,0 +1,20 @@ +import * as React from 'react'; +import { + OperationViewer, +} from '../../js/components/Operations'; +import {bakedOperations, bakedCommandConfig } from '../../js/components/staticData'; + + +export default function Simple() { + return ( + { + console.log('setCommands sent', foo); + }} + activeColumn={'foo-column'} + allColumns={['foo-col', 'bar-col', 'baz-col']} + commandConfig={bakedCommandConfig} + /> + ); +} diff --git a/examples/ex/DFViewerEx.tsx b/examples/ex/DFViewerEx.tsx new file mode 100644 index 000000000..c7185ab8a --- /dev/null +++ b/examples/ex/DFViewerEx.tsx @@ -0,0 +1,9 @@ +import {DFViewer} from '../../js/components/DFViewer'; +import {tableDf } from '../../js/components/staticData'; +import React, { useState} from 'react'; + + +export default function Simple() { + const [activeCol, setActiveCol] = useState('tripduration'); + return ; +} diff --git a/examples/ex/StatusBarEx.tsx b/examples/ex/StatusBarEx.tsx new file mode 100644 index 000000000..9074996f0 --- /dev/null +++ b/examples/ex/StatusBarEx.tsx @@ -0,0 +1,6 @@ +import {StatusBarEx} from '../../js/components/StatusBar'; + +export default StatusBarEx; +// export default function Simple() { +// return ; +// } diff --git a/examples/ex/WidgetDCFCellEx.tsx b/examples/ex/WidgetDCFCellEx.tsx new file mode 100644 index 000000000..0464120a5 --- /dev/null +++ b/examples/ex/WidgetDCFCellEx.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; +//import {WidgetDCFCellExample} from 'react-edit-list'; +import {WidgetDCFCellExample} from '../../js/components/DCFCell'; + +export default function Simple() { + return ; +} diff --git a/package.json b/package.json index 8f784659b..14c697aa1 100644 --- a/package.json +++ b/package.json @@ -61,12 +61,9 @@ "@jupyterlab/apputils": "^3.0.2", "ag-grid-community": "^29.2.0", "ag-grid-react": "^29.2.0", - "lodash": "^4.17.21", - "prettier-standalone": "^1.3.1-0", "react": "^18.0.0", - "react-dom": "^18.0.0", - "prismjs": "^1.28.0" + "react-dom": "^18.0.0" }, "devDependencies": { "@babel/cli": "^7.6.3", @@ -100,14 +97,14 @@ "mkdirp": "^0.5.1", "npm-run-all": "^4.1.3", "prettier": "^2.6.2", - - "postcss": "^8.4.14", - "postcss-loader": "^7.0.1", - "postcss-preset-env": "^7.7.2", - "postcss-nested": "^6.0.0", - "sass": "^1.53.0", - "sass-loader": "^13.0.2", - + "prettier-standalone": "^1.3.1-0", + "prismjs": "^1.28.0", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.1", + "postcss-preset-env": "^7.7.2", + "postcss-nested": "^6.0.0", + "sass": "^1.53.0", + "sass-loader": "^13.0.2", "react-router": "^6.3.0", "react-router-dom": "^5.2.0", "rimraf": "^3.0.2", From 924b15e5fca4aeb3f1795103ecacdb402e66afd0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 2 Jun 2023 10:39:48 -0400 Subject: [PATCH 066/250] columns now sortable --- js/components/DFViewer.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx index 5330c6a20..1adc5e182 100644 --- a/js/components/DFViewer.tsx +++ b/js/components/DFViewer.tsx @@ -43,6 +43,10 @@ export function DFViewer( const gridOptions: GridOptions = { rowSelection: 'single', onRowClicked: (event) => console.log('A row was clicked'), + defaultColDef: { + sortable:true + }, + onCellClicked: (event) => { const colName = event.column.getColId(); if (setActiveCol === undefined || colName === undefined) { From b32bfc51e3727c9e68c0d94f508717ae682873d5 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 2 Jun 2023 13:01:07 -0400 Subject: [PATCH 067/250] WIP --- pyproject.toml | 2 +- yarn.lock | 428 ++++++++++++++++--------------------------------- 2 files changed, 143 insertions(+), 287 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2e9128ca6..580d56a9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.2.10" +version = "0.3.0" [project.license] file = "LICENSE.txt" diff --git a/yarn.lock b/yarn.lock index 29845eb70..d23f4e1aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,7 +38,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz" integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0", "@babel/core@^7.6.3", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.6.3": version "7.21.8" resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz" integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== @@ -1378,7 +1378,7 @@ slash "^3.0.0" write-file-atomic "^4.0.1" -"@jest/types@^28.0.0", "@jest/types@^28.1.3": +"@jest/types@^28.1.3": version "28.1.3" resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== @@ -1417,16 +1417,16 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -1766,7 +1766,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2228,7 +2228,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.9.1": +"@typescript-eslint/parser@^5.9.1": version "5.59.8" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz" integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== @@ -2296,7 +2296,7 @@ "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" -"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.5": +"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz" integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== @@ -2397,7 +2397,7 @@ "@webassemblyjs/wasm-gen" "1.11.5" "@webassemblyjs/wasm-parser" "1.11.5" -"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.5": +"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": version "1.11.5" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz" integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== @@ -2467,27 +2467,17 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^6.2.0: +acorn@^6.2.0: version "6.4.2" resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8, acorn@^8.7.1: +acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -acorn@^8.5.0: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -ag-grid-community@^29.2.0, ag-grid-community@~29.3.5: +ag-grid-community@^29.2.0: version "29.3.5" resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.5.tgz" integrity sha512-LxUo21f2/CH31ACEs1C7Q/ggGGI1fQPSTB4aY5OThmM+lBkygZ7QszBE8jpfgWOIjvjdtcdIeQbmbjkHeMsA7A== @@ -2526,7 +2516,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0, ajv@^6.9.1: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2536,17 +2526,7 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^8.8.2, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2595,14 +2575,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2647,16 +2620,16 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" @@ -2737,7 +2710,7 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-jest@^28, babel-jest@^28.0.0, babel-jest@^28.1.3: +babel-jest@^28, babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== @@ -2970,7 +2943,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, "browserslist@>= 4.21.0": +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -3089,15 +3062,7 @@ chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3110,7 +3075,7 @@ char-regex@^1.0.2: resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chokidar@^3.4.0, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3226,16 +3191,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -3420,11 +3385,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" - integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== - css-blank-pseudo@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" @@ -3486,16 +3446,16 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - csstype@3.0.10: version "3.0.10" resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" @@ -3505,7 +3465,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@^2.6.8: +debug@2.6.9, debug@^2.6.8: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3519,13 +3479,6 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - dedent@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" @@ -3573,16 +3526,16 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -3770,7 +3723,7 @@ enhanced-resolve@^5.7.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": +enquirer@^2.3.6: version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3934,7 +3887,7 @@ eslint-plugin-react@^7.28.0: semver "^6.3.0" string.prototype.matchall "^4.0.8" -eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3955,7 +3908,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@*, "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.6.0, eslint@>=7.0.0, eslint@>=7.28.0: +eslint@^8.6.0: version "8.41.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz" integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== @@ -4033,17 +3986,7 @@ estraverse@^4.1.1: resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estraverse@^5.3.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -4172,7 +4115,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.x: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -4215,7 +4158,7 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@*, file-loader@~6.0.0: +file-loader@~6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz" integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== @@ -4714,16 +4657,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -4735,6 +4668,16 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -4781,13 +4724,6 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -4795,6 +4731,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" @@ -4849,7 +4792,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4880,16 +4823,16 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -5093,16 +5036,16 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -5357,7 +5300,7 @@ jest-resolve-dependencies@^28.1.3: jest-regex-util "^28.0.2" jest-snapshot "^28.1.3" -jest-resolve@*, jest-resolve@^28.1.3: +jest-resolve@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== @@ -5521,7 +5464,7 @@ jest-worker@^28.1.3: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^28, jest@^28.0.0: +jest@^28: version "28.1.3" resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== @@ -5617,14 +5560,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^1.0.2: +json5@^1.0.1, json5@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -5870,21 +5806,14 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: +make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1, make-error@1.x: +make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -5962,7 +5891,7 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -6058,12 +5987,7 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -6464,6 +6388,11 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" @@ -6471,11 +6400,6 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" @@ -6833,7 +6757,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3, postcss@^8.3.11, postcss@^8.4, postcss@^8.4.14, postcss@^8.4.6: +postcss@^8.2.15, postcss@^8.3.11, postcss@^8.4.14: version "8.4.24" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== @@ -6859,7 +6783,7 @@ prettier-standalone@^1.3.1-0: resolved "https://registry.npmjs.org/prettier-standalone/-/prettier-standalone-1.3.1-0.tgz" integrity sha512-wxJiwE5XS45BQD8QTXcTeqnWzsYrCliIYOYrURM8MiJaw8NA5q+BSd9UBhM5QPDFShn+pFWa8X2XH3y5A47q+Q== -prettier@^2.6.2, prettier@>=2.0.0: +prettier@^2.6.2: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -6910,7 +6834,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -6940,16 +6864,16 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - punycode@1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + qs@6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" @@ -7002,7 +6926,7 @@ raw-loader@~4.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -"react-dom@^15.3.0 || 16 || 17", react-dom@^17.0.1: +react-dom@^17.0.1: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -7011,7 +6935,7 @@ raw-loader@~4.0.0: object-assign "^4.1.1" scheduler "^0.20.2" -"react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, react-dom@>=15.0.0: +react-dom@^18.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -7060,13 +6984,6 @@ react-router-dom@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@^6.3.0: - version "6.11.2" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz" - integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== - dependencies: - "@remix-run/router" "1.6.2" - react-router@5.3.4: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" @@ -7082,6 +6999,13 @@ react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" +react-router@^6.3.0: + version "6.11.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz" + integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== + dependencies: + "@remix-run/router" "1.6.2" + react-transition-group@^2.9.0: version "2.9.0" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" @@ -7092,7 +7016,7 @@ react-transition-group@^2.9.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -"react@^15.3.0 || 16 || 17", react@^17.0.1, "react@0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0", react@17.0.2: +react@^17.0.1: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -7100,7 +7024,7 @@ react-transition-group@^2.9.0: loose-envify "^1.1.0" object-assign "^4.1.1" -"react@^16.3.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@>=0.14.0, react@>=15, react@>=15.0.0, react@>=16, react@>=16.8: +react@^18.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -7329,25 +7253,15 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" -safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: version "1.0.0" @@ -7383,7 +7297,7 @@ sass-loader@^13.0.2: klona "^2.0.6" neo-async "^2.6.2" -sass@^1.3.0, sass@^1.53.0: +sass@^1.53.0: version "1.62.1" resolved "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz" integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== @@ -7416,16 +7330,7 @@ schema-utils@^2.6.5, schema-utils@^2.7.0: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - version "3.1.2" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1, schema-utils@^3.1.2: +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz" integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== @@ -7461,66 +7366,30 @@ semver-compare@^1.0.0: resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -semver@^5.4.1: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.4: - version "7.5.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.5: +semver@7.x, semver@^7.3.5, semver@^7.3.7: version "7.5.0" resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" -semver@^7.3.7: - version "7.5.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.8: +semver@^7.3.4, semver@^7.3.8: version "7.5.1" resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" -"semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.x: - version "7.5.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" - send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -7684,7 +7553,7 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -7708,15 +7577,7 @@ source-map-loader@~1.0.2: schema-utils "^2.7.0" source-map "^0.6.1" -source-map-support@^0.5.17: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.12, source-map-support@0.5.13: +source-map-support@0.5.13, source-map-support@~0.5.12: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== @@ -7724,7 +7585,7 @@ source-map-support@~0.5.12, source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.20: +source-map-support@^0.5.17, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -7805,22 +7666,15 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== string-argv@0.3.1: version "0.3.1" @@ -7894,6 +7748,13 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -8005,12 +7866,7 @@ tapable@^1.0.0: resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.0.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -8185,7 +8041,7 @@ ts-loader@^8.0.14: micromatch "^4.0.0" semver "^7.3.4" -ts-node@^9.1.1, ts-node@>=9.0.0: +ts-node@^9.1.1: version "9.1.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== @@ -8282,7 +8138,7 @@ typed-styles@^0.0.7: resolved "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typescript@*, typescript@^4.4.3, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3: +typescript@^4.4.3: version "4.4.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz" integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== @@ -8357,7 +8213,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -8518,7 +8374,7 @@ webidl-conversions@^6.1.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-cli@^4.1.0, webpack-cli@^4.5.0, webpack-cli@4.x.x: +webpack-cli@^4.1.0, webpack-cli@^4.5.0: version "4.10.0" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -8604,7 +8460,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5, webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.41.1, "webpack@4.x.x || 5.x.x": +webpack@^5, webpack@^5.41.1: version "5.81.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz" integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q== @@ -8634,7 +8490,7 @@ webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4. watchpack "^2.4.0" webpack-sources "^3.2.3" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== From eefcf8a6ee766857655490c0ca422bc5a6696ffe Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 2 Jun 2023 15:00:03 -0400 Subject: [PATCH 068/250] working if janky sampling --- buckaroo/buckaroo_widget.py | 40 +++++-- introduction.ipynb | 212 ++++++++++++++++++++++++++++++++++++ js/components/StatusBar.tsx | 5 + 3 files changed, 249 insertions(+), 8 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index ac0475997..3bf3bd5ab 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -7,7 +7,7 @@ """ TODO: Add module docstring """ - +import numpy as np from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe import pandas as pd @@ -17,6 +17,24 @@ import json +def sample(df, sample_size=500, include_outliers=True): + + sdf = df.sample(np.min([sample_size, len(df)])) + + + if include_outliers: + outlier_idxs = [] + for col in df.columns: + idxs = df[col].sort_values().index + outlier_idxs.extend(idxs[:5]) + outlier_idxs.extend(idxs[-5:]) + outlier_idxs.extend(sdf.index) + uniq_idx = np.unique(outlier_idxs) + print("len uniq_idx", len(uniq_idx)) + return df.iloc[uniq_idx] + return sdf + + class BuckarooWidget(DOMWidget): """TODO: Add docstring here """ @@ -45,6 +63,7 @@ class BuckarooWidget(DOMWidget): 'columns': 30, 'rowsShown': 500, 'sampleSize': 10_000, + 'sampled':True, 'summaryStats': False, 'reorderdColumns': False }).tag(sync=True) @@ -63,7 +82,7 @@ def __init__(self, df): super().__init__() self.df = df self.setup_dfconfig(df) - self.origDf = json.loads(df.to_json(orient='table', indent=2)) + #self.origDf = json.loads(df.to_json(orient='table', indent=2)) self.operation_results = { 'transformed_df':self.origDf, 'generated_py_code':'#from py widget init'} @@ -75,6 +94,7 @@ def setup_dfconfig(self, df): totalRows=len(df), columns=len(df.columns), sampleSize=self.dfConfig['sampleSize'], + sampled=True, summaryStats=self.dfConfig['summaryStats'], reorderdColumns=self.dfConfig['reorderdColumns'] ) @@ -83,15 +103,19 @@ def setup_dfconfig(self, df): def update_based_on_df_config(self, change): old = change['old'] new = change['new'] - if not old['summaryStats'] == new['summaryStats']: - self.reset_summary_stats() + tdf = self.df_from_dfConfig() + print("len tdf", len(tdf)) + self.origDf = json.loads(tdf.to_json(orient='table', indent=2, default_handler=str)) + - def reset_summary_stats(self): + def df_from_dfConfig(self): + print(self.dfConfig) if self.dfConfig['summaryStats']: - temp_df = summarize_df(self.df) + return summarize_df(self.df) + elif self.dfConfig['sampled']: + return sample(self.df) else: - temp_df = self.df - self.origDf = json.loads(temp_df.to_json(orient='table', indent=2, default_handler=str)) + return self.df @observe('operations') def interpret_operations(self, change): diff --git a/introduction.ipynb b/introduction.ipynb index 289d91bef..1a18c5688 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -7,9 +7,99 @@ "outputs": [], "source": [ "import pandas as pd\n", + "import numpy as np\n", "from buckaroo.buckaroo_widget import BuckarooWidget" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')\n", + "BuckarooWidget(df[:10_000])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def sample(df, sample_size=500, include_outliers=True):\n", + " \n", + " sample_size = np.min([sample_size, len(df)])\n", + " sdf = df.sample(sample_size)\n", + " \n", + " \n", + " if include_outliers:\n", + " outlier_idxs = []\n", + " for col in df.columns:\n", + " idxs = df[col].sort_values().index\n", + " outlier_idxs.extend(idxs[:5])\n", + " outlier_idxs.extend(idxs[-5:])\n", + " outlier_idxs.extend(sdf.index)\n", + " uniq_idx = np.unique(outlier_idxs)\n", + " #print(uniq_idx)\n", + " return df.iloc[uniq_idx]\n", + " return sdf\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%timeit sample(df, 500)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%timeit sample(df, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%timeit sample(df, 5000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "len(sample(df))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.iloc[[23,58, 1023]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, { "cell_type": "code", "execution_count": null, @@ -21,6 +111,128 @@ "w" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ab = df['tripduration']\n", + "ab.sort_values()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sorted_ab = ab.sort_values()\n", + "sorted_ab.index[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "np.unique([2,2,3])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df['start station name'].sort_values()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "np.array([2,2,3]).unique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = []\n", + "a.extend([23,45], [32,5])\n", + "a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bc = df.sample(300)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bc.index" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = [2,3]\n", + "arr.extend(df.index)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.iloc[[137, 137, 138]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.concat([df.iloc[sorted_ab.index[:5]], df[20:50]])" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 5814c1133..5f79b326b 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -16,6 +16,7 @@ export interface DfConfig { columns: number; rowsShown: number; sampleSize: number; + sampled: boolean; summaryStats: boolean; reorderdColumns: boolean; } @@ -25,6 +26,7 @@ const columnDefs: ColDef[] = [ { field: 'columns' }, { field: 'rowsShown' }, { field: 'sampleSize' }, + { field: 'sampled' }, { field: 'summaryStats' }, { field: 'reorderdColumns' }, ]; @@ -54,6 +56,9 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) const colName = event.column.getColId(); if (colName === 'summaryStats') { setConfig({ ...config, summaryStats: !config.summaryStats }); + } + else if (colName === 'sampled') { + setConfig({ ...config, summaryStats: !config.sampled }); } else if (colName === 'reorderdColumns') { setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); } From a6f31d9444c5d2013b84c2430ed539c2aaaa0b0f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 2 Jun 2023 15:58:39 -0400 Subject: [PATCH 069/250] sampling working and controllable from the gui --- buckaroo/buckaroo_widget.py | 7 ------- js/components/DCFCell.tsx | 1 + js/components/StatusBar.tsx | 5 ++++- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 3bf3bd5ab..44ab39a21 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -18,10 +18,7 @@ def sample(df, sample_size=500, include_outliers=True): - sdf = df.sample(np.min([sample_size, len(df)])) - - if include_outliers: outlier_idxs = [] for col in df.columns: @@ -30,7 +27,6 @@ def sample(df, sample_size=500, include_outliers=True): outlier_idxs.extend(idxs[-5:]) outlier_idxs.extend(sdf.index) uniq_idx = np.unique(outlier_idxs) - print("len uniq_idx", len(uniq_idx)) return df.iloc[uniq_idx] return sdf @@ -104,12 +100,9 @@ def update_based_on_df_config(self, change): old = change['old'] new = change['new'] tdf = self.df_from_dfConfig() - print("len tdf", len(tdf)) self.origDf = json.loads(tdf.to_json(orient='table', indent=2, default_handler=str)) - def df_from_dfConfig(self): - print(self.dfConfig) if self.dfConfig['summaryStats']: return summarize_df(self.df) elif self.dfConfig['sampled']: diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index ca21090f0..aea589bb4 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -69,6 +69,7 @@ export function WidgetDCFCellExample() { columns: 30, rowsShown: 500, sampleSize: 10_000, + sampled: true, summaryStats: false, reorderdColumns: false, }); diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 5f79b326b..2db7a19a6 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -37,6 +37,7 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) columns, rowsShown, sampleSize, + sampled, summaryStats, reorderdColumns, } = config; @@ -47,6 +48,7 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) columns, rowsShown, sampleSize, + sampled: sampled.toString(), summaryStats: summaryStats.toString(), reorderdColumns: reorderdColumns.toString(), }, @@ -58,7 +60,7 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) setConfig({ ...config, summaryStats: !config.summaryStats }); } else if (colName === 'sampled') { - setConfig({ ...config, summaryStats: !config.sampled }); + setConfig({ ...config, sampled: !config.sampled }); } else if (colName === 'reorderdColumns') { setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); } @@ -94,6 +96,7 @@ export function StatusBarEx() { columns: 30, rowsShown: 500, sampleSize: 10_000, + sampled: true, summaryStats: false, reorderdColumns: false, }); From 41aedec952cf9ba1c67dd5ef48896328a1187451 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 2 Jun 2023 16:10:50 -0400 Subject: [PATCH 070/250] BuckarooWidget is now the default way to display dataframes once imported --- buckaroo/buckaroo_widget.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 44ab39a21..25f30dcf7 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -15,6 +15,9 @@ from .all_transforms import configure_buckaroo, DefaultCommandKlsList from .summary_stats import summarize_df import json +from IPython.core.getipython import get_ipython +from IPython.display import display + def sample(df, sample_size=500, include_outliers=True): @@ -100,8 +103,10 @@ def update_based_on_df_config(self, change): old = change['old'] new = change['new'] tdf = self.df_from_dfConfig() + self.origDf = json.loads(tdf.to_json(orient='table', indent=2, default_handler=str)) + def df_from_dfConfig(self): if self.dfConfig['summaryStats']: return summarize_df(self.df) @@ -151,8 +156,23 @@ def add_command(self, incomingCommandKls): self.command_classes = without_incoming self.setup_from_command_kls_list() - - +def _display_as_buckaroo(df): + return display(BuckarooWidget(df)) - - +def enable(): + """ + Automatically use buckaroo to display all DataFrames + instances in the notebook. + + """ + try: + from IPython.core.getipython import get_ipython + except ImportError: + raise ImportError('This feature requires IPython 1.0+') + + ip = get_ipython() + ip_formatter = ip.display_formatter.ipython_display_formatter + + ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) + +enable() From 05e31989d9721ed063e57e425888924280600e85 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 3 Jun 2023 11:32:57 -0400 Subject: [PATCH 071/250] minimally working column ordering --- buckaroo/buckaroo_widget.py | 25 +++++++++-- buckaroo/summary_stats.py | 82 ++++++++++++++++++++++++++----------- 2 files changed, 78 insertions(+), 29 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 25f30dcf7..a5f7dd631 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -13,7 +13,7 @@ import pandas as pd from ._frontend import module_name, module_version from .all_transforms import configure_buckaroo, DefaultCommandKlsList -from .summary_stats import summarize_df +from .summary_stats import summarize_df, reorder_columns import json from IPython.core.getipython import get_ipython from IPython.display import display @@ -21,6 +21,8 @@ def sample(df, sample_size=500, include_outliers=True): + if len(df) <= sample_size: + return df sdf = df.sample(np.min([sample_size, len(df)])) if include_outliers: outlier_idxs = [] @@ -64,7 +66,7 @@ class BuckarooWidget(DOMWidget): 'sampleSize': 10_000, 'sampled':True, 'summaryStats': False, - 'reorderdColumns': False + 'reorderdColumns': True }).tag(sync=True) @@ -103,8 +105,8 @@ def update_based_on_df_config(self, change): old = change['old'] new = change['new'] tdf = self.df_from_dfConfig() - - self.origDf = json.loads(tdf.to_json(orient='table', indent=2, default_handler=str)) + otdf = reorder_columns(tdf) + self.origDf = json.loads(otdf.to_json(orient='table', indent=2, default_handler=str)) def df_from_dfConfig(self): @@ -176,3 +178,18 @@ def enable(): ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) enable() + +def disable(): + """ + Automatically use buckaroo to display all DataFrames + instances in the notebook. + + """ + try: + from IPython.core.getipython import get_ipython + except ImportError: + raise ImportError('This feature requires IPython 1.0+') + + ip = get_ipython() + ip_formatter = ip.display_formatter.ipython_display_formatter + ip_formatter.type_printers.pop(pd.DataFrame, None) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index 904fd02b4..102a3f33c 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -1,5 +1,7 @@ from functools import reduce import pandas as pd +import numpy as np + def summarize_string(ser): l = len(ser) @@ -9,6 +11,9 @@ def summarize_string(ser): unique_count = len(val_counts[val_counts==1]) empty_count = val_counts.get('', 0) + #[pd.api.types.is_integer_dtype(df2[col]) for col in df2.columns] + #[pd.api.types.is_numeric_dtype(df2[col]) for col in df2.columns] + return dict( dtype=ser.dtype, length=l, @@ -18,6 +23,8 @@ def summarize_string(ser): empty_per = empty_count/l, unique_per = unique_count/l, nan_per = nan_count/l, + is_numeric=pd.api.types.is_numeric_dtype(ser), + is_integer=pd.api.types.is_integer_dtype(ser), mode=ser.mode().values[0]) def summarize_numeric(ser): @@ -39,8 +46,6 @@ def summarize_df(df): summary_df = pd.DataFrame({col:summarize_column(df[col]) for col in df}) return summary_df - - def make_num_categorical(ser): ser_uniq = ser.unique() name_to_idx = {name:idx for idx, name in enumerate(ser_uniq)} @@ -53,7 +58,11 @@ def get_cor_pair_dict(df, summary_stats): #this needs to be vectorized corrable_cols = [col for col in df if summary_stats[col]['distinct_count'] > 1] - num_df = pd.DataFrame({col:numerize_column(df[col]) for col in corrable_cols}) + #print("corrable_cols", corrable_cols) + #num_df = pd.DataFrame({col:numerize_column(df[col]) for col in corrable_cols}) + + num_df = pd.DataFrame({col:make_num_categorical(df[col]) for col in corrable_cols}) + corr_df = num_df.corr() high_corr_df = corr_df[corr_df > 0.99] cor_dict = {} @@ -65,6 +74,15 @@ def get_cor_pair_dict(df, summary_stats): cor_dict[col] = cor_cols.tolist() return cor_dict + + +def set_when(df, cond_row_name, target_row_name, true_val, false_val): + true_row = df.loc[cond_row_name] + df.loc[target_row_name] = false_val + df.loc[target_row_name, true_row[true_row==True].index.values] = true_val + return df + + def without(arr, search_keys): new_arr = [] for v in arr: @@ -72,40 +90,54 @@ def without(arr, search_keys): new_arr.append(v) return new_arr -def one_directional_dict(raw_corr_pair): - # convert from two way links to only one way based on first seen - seen = [] - ret_corr_pair = {} - for key, other_key_list in raw_corr_pair.items(): - seen.append(key) - stripped_other = without(other_key_list, seen) - if len(stripped_other) > 0: - ret_corr_pair[key] = stripped_other - return ret_corr_pair - -def all_duplicates(raw_corr_pairs): - flatlist = reduce(lambda a,b:a+b, raw_corr_pairs.values()) - return set(flatlist) +def find_groupings(corr_pairs): + all_groupings = [] + for key, other_key_list in corr_pairs.items(): + ab = other_key_list.copy() + ab.append(key) + all_groupings.append(set(ab)) + return np.unique(all_groupings) + +def order_groupings(grps, ranked_cols): + first_cols, rest_cols = [], [] + for col in ranked_cols: + for grp in grps: + if col in grp: + first_cols.append(col) + rest_cols.extend(list(without(grp, [col]))) + grps = without(grps, [grp]) + return first_cols, rest_cols def order_columns(summary_stats_df, corr_pair_dict): sdf = summary_stats_df.copy() - sdf.loc['one_distinct'] = 0 + only_ones = (sdf.loc['distinct_count'] <= 1) sdf.loc['one_distinct', only_ones[only_ones==True].index.values] = -20 + sdf.loc['first_col'] = 0 sdf.loc['is_duplicate'] = 0 - dups = list(all_duplicates(corr_pair_dict)) - sdf.loc['is_duplicate', dups] = -10 - sdf.loc['is_first_dup'] = 0 - first_dups = list(one_directional_dict(corr_pair_dict).keys()) - sdf.loc['is_first_dup', first_dups] = 5 + set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) + set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) + grouping_col_scores = sdf.loc[['grouping_score_integer', 'grouping_score_numeric']].sum() + duplicate_col_rankings = grouping_col_scores.sort_values().index[::-1].values + + groupings = find_groupings(corr_pair_dict) + first_cols, duplicate_cols = order_groupings(groupings, duplicate_col_rankings) + + sdf.loc['first_col':, first_cols] = 5 + sdf.loc['is_duplicate':, duplicate_cols] = -5 - col_scores = sdf.loc[['one_distinct', 'is_duplicate', 'is_first_dup']].sum() + col_scores = sdf.loc[['one_distinct', 'first_col', 'is_duplicate']].sum() return col_scores.sort_values().index.values[::-1] - #return sdf + +def reorder_columns(df): + tdf_stats = summarize_df(df) + cpd = get_cor_pair_dict(df, tdf_stats) + col_order = order_columns(tdf_stats, cpd) + return df[col_order] def make_df_metadata(df): summary_stats_df = summarize_df(df) From 3cf6899d4228e521365eb590f2bcf59c0fa0dcc0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 5 Jun 2023 09:19:31 -0400 Subject: [PATCH 072/250] summary stats updates --- .gitignore | 7 +++++-- buckaroo/summary_stats.py | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 979639bd4..58444a9a2 100644 --- a/.gitignore +++ b/.gitignore @@ -156,5 +156,8 @@ myproject/labextension ipydatagrid/labextension/* ipydatagrid/nbextension/* -dcf/nbextension/* -dcf/labextension/* \ No newline at end of file +buckaroo/nbextension/* +buckaroo/labextension/* +docs/*.js +docs/*.js.map +docs/*js* \ No newline at end of file diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index 102a3f33c..011a2e97c 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -3,6 +3,20 @@ import numpy as np +def probable_datetime(ser): + s_ser = ser.sample(np.min([len(ser), 500])) + try: + dt_ser = pd.to_datetime(s_ser) + #pd.to_datetime(1_00_000_000_000_000_000) == pd.to_datetime('1973-01-01') + if dt_ser.max() < pd.to_datetime('1973-01-01'): + return False + return True + + except Exception as e: + return False +#probable_datetime(df['start station name']) + + def summarize_string(ser): l = len(ser) val_counts = ser.value_counts() @@ -25,6 +39,7 @@ def summarize_string(ser): nan_per = nan_count/l, is_numeric=pd.api.types.is_numeric_dtype(ser), is_integer=pd.api.types.is_integer_dtype(ser), + is_datetime=probable_datetime(ser), mode=ser.mode().values[0]) def summarize_numeric(ser): @@ -118,6 +133,7 @@ def order_columns(summary_stats_df, corr_pair_dict): sdf.loc['first_col'] = 0 sdf.loc['is_duplicate'] = 0 + set_when(sdf, 'is_datetime', 'datetime_score', 11, 0) set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) @@ -130,7 +146,7 @@ def order_columns(summary_stats_df, corr_pair_dict): sdf.loc['first_col':, first_cols] = 5 sdf.loc['is_duplicate':, duplicate_cols] = -5 - col_scores = sdf.loc[['one_distinct', 'first_col', 'is_duplicate']].sum() + col_scores = sdf.loc[['one_distinct', 'first_col', 'datetime_score', 'is_duplicate']].sum() return col_scores.sort_values().index.values[::-1] def reorder_columns(df): From d4e7cd21266012e9b2c502972dc9a09fec437da6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 5 Jun 2023 11:08:32 -0400 Subject: [PATCH 073/250] janky but somewhat working autoscroll --- js/dcefwidget.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 1dcee4d1c..9b135c8bd 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -1,6 +1,6 @@ // Copyright (c) Paddy Mullen // Distributed under the terms of the Modified BSD License. - +import _ from 'lodash'; import { DOMWidgetModel, DOMWidgetView, @@ -78,15 +78,19 @@ export class DCEFWidgetView extends DOMWidgetView { } return React.createElement(WidgetDCFCell, props); }; - //console.log("widget el", this.el) - const notebookEl = document.getElementsByClassName( - 'jp-NotebookPanel-notebook' - )[0]; - const elTop = this.el.getBoundingClientRect()['y']; - const notebookTop = notebookEl.getBoundingClientRect()['y']; - const scrollOffset = notebookTop - elTop + 50; - //console.log("scrollOffset", scrollOffset); - notebookEl.scroll(0, scrollOffset); + console.log("widget el", this.el) + const el = this.el; + _.delay(() => { + //only get the active notebook + const notebookEl = document.querySelector(':not(.lm-mod-hidden) > .jp-NotebookPanel-notebook') as any + const elTop = el.getBoundingClientRect()['y']; + const notebookTop = notebookEl.getBoundingClientRect()['y']; + const scrollOffset = notebookTop - elTop + 50; + + console.log("elTop", elTop, "notebookTop", notebookTop, "scrollOffset", scrollOffset); + //console.log("scrollOffset", scrollOffset); + notebookEl.scroll(0, -1*scrollOffset); + }, 300) const root = ReactDOMClient.createRoot(this.el); const componentEl = React.createElement(Component, {}); root.render(componentEl); From 97eb26ed5a3a14da1e7965814ecadc18ed526754 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 5 Jun 2023 12:54:09 -0400 Subject: [PATCH 074/250] hide/show transform and command editor --- buckaroo/buckaroo_widget.py | 4 ++++ js/components/ColumnsEditor.tsx | 18 ++++++++++++++---- js/components/DCFCell.tsx | 10 ++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index a5f7dd631..81ab14d35 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -69,6 +69,10 @@ class BuckarooWidget(DOMWidget): 'reorderdColumns': True }).tag(sync=True) + widgetConfig = Dict( + {'showCommands':True, 'showTransformed':True} + ).tag(sync=True) + # #config for the python pre-processing, waiting for inspiration for a better name # python_massaging = Dict({ diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx index 7b18bda91..9725a33b7 100644 --- a/js/components/ColumnsEditor.tsx +++ b/js/components/ColumnsEditor.tsx @@ -8,6 +8,11 @@ import { DependentTabs, OperationResult } from './DependentTabs'; import { tableDf, bakedCommandConfig } from './staticData' export type OperationSetter = (ops: Operation[]) => void; +export interface WidgetConfig { + showCommands:boolean; + showTransformed:boolean; +} + export function ColumnsEditor({ df, @@ -15,8 +20,8 @@ export function ColumnsEditor({ operations, setOperations, operationResult, - commandConfig, + widgetConfig }: { df: DFWhole; activeColumn: string; @@ -24,22 +29,26 @@ export function ColumnsEditor({ setOperations: OperationSetter; operationResult: OperationResult; commandConfig: CommandConfigT; + widgetConfig:WidgetConfig }) { const allColumns = df.schema.fields.map((field) => field.name); //console.log('Columns Editor, commandConfig', commandConfig); return (
    + {(widgetConfig.showCommands) ? ( + />) : } + {(widgetConfig.showTransformed) ?( + /> + ) : }
    ); } @@ -60,7 +69,8 @@ export function ColumnsEditorEx() { commandConfig={bakedCommandConfig} operations={operations} setOperations={setOperations} - operationResult={baseOperationResults} + operationResult={baseOperationResults} + widgetConfig={{showCommands:true, showTransformed:true}} /> ); } diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index aea589bb4..dd49e23ee 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -1,7 +1,7 @@ import React, { useState, Dispatch, SetStateAction } from 'react'; import _ from 'lodash'; import { OperationResult, baseOperationResults } from './DependentTabs'; -import { ColumnsEditor } from './ColumnsEditor'; +import { ColumnsEditor, WidgetConfig } from './ColumnsEditor'; import { tableDf, DFWhole } from './staticData'; import { DFViewer } from './DFViewer'; import { StatusBar, DfConfig } from './StatusBar'; @@ -13,6 +13,7 @@ export type CommandConfigSetterT = ( setter: Dispatch> ) => void; + /* Widget DCFCell is meant to be used with callback functions and passed values, not explicit http calls */ @@ -24,6 +25,7 @@ export function WidgetDCFCell({ commandConfig, dfConfig, on_dfConfig, + widgetConfig }: { origDf: DFWhole; operations: Operation[]; @@ -32,6 +34,7 @@ export function WidgetDCFCell({ commandConfig: CommandConfigT; dfConfig: DfConfig; on_dfConfig: unknown; + widgetConfig:WidgetConfig; }) { const [activeCol, setActiveCol] = useState('stoptime'); @@ -51,6 +54,7 @@ export function WidgetDCFCell({ setActiveCol={setActiveCol} /> + {(widgetConfig.showCommands || widgetConfig.showTransformed) ? ( + widgetConfig={widgetConfig} + />) : } ); } @@ -83,6 +88,7 @@ export function WidgetDCFCellExample() { commandConfig={bakedCommandConfig} dfConfig={sampleConfig} on_dfConfig={setConfig} + widgetConfig={{showCommands:true, showTransformed:true}} /> ); } From d9172dc48b2a7eedc6041eb3aa072c98f9b252f6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 5 Jun 2023 13:11:33 -0400 Subject: [PATCH 075/250] toggable display of extra components --- buckaroo/buckaroo_widget.py | 19 +++++++------------ js/components/DCFCell.tsx | 7 +++---- js/components/StatusBar.tsx | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 81ab14d35..06862807d 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -66,12 +66,11 @@ class BuckarooWidget(DOMWidget): 'sampleSize': 10_000, 'sampled':True, 'summaryStats': False, - 'reorderdColumns': True + 'reorderdColumns': True, + 'showTransformed': True, + 'showCommands': True, }).tag(sync=True) - widgetConfig = Dict( - {'showCommands':True, 'showTransformed':True} - ).tag(sync=True) # #config for the python pre-processing, waiting for inspiration for a better name @@ -95,14 +94,10 @@ def __init__(self, df): #Maybe tie this to a watcher on DF? def setup_dfconfig(self, df): - self.dfConfig = dict( - totalRows=len(df), - columns=len(df.columns), - sampleSize=self.dfConfig['sampleSize'], - sampled=True, - summaryStats=self.dfConfig['summaryStats'], - reorderdColumns=self.dfConfig['reorderdColumns'] - ) + dfc = self.dfConfig.copy() + dfc.update(dict(totalRows=len(df), + columns=len(df.columns))) + self.dfConfig = dfc @observe('dfConfig') def update_based_on_df_config(self, change): diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index dd49e23ee..2851b9246 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -25,7 +25,6 @@ export function WidgetDCFCell({ commandConfig, dfConfig, on_dfConfig, - widgetConfig }: { origDf: DFWhole; operations: Operation[]; @@ -34,10 +33,9 @@ export function WidgetDCFCell({ commandConfig: CommandConfigT; dfConfig: DfConfig; on_dfConfig: unknown; - widgetConfig:WidgetConfig; }) { const [activeCol, setActiveCol] = useState('stoptime'); - + const widgetConfig: WidgetConfig = {showCommands:dfConfig.showCommands, showTransformed:dfConfig.showTransformed} return (
    (bakedOperations); return ( @@ -88,7 +88,6 @@ export function WidgetDCFCellExample() { commandConfig={bakedCommandConfig} dfConfig={sampleConfig} on_dfConfig={setConfig} - widgetConfig={{showCommands:true, showTransformed:true}} /> ); } diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 2db7a19a6..2c5a6c9a2 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -19,6 +19,8 @@ export interface DfConfig { sampled: boolean; summaryStats: boolean; reorderdColumns: boolean; + showCommands:boolean; + showTransformed:boolean; } const columnDefs: ColDef[] = [ @@ -29,6 +31,8 @@ const columnDefs: ColDef[] = [ { field: 'sampled' }, { field: 'summaryStats' }, { field: 'reorderdColumns' }, + { field: 'showTransformed'}, + { field: 'showCommands'} ]; export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) { @@ -40,6 +44,8 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) sampled, summaryStats, reorderdColumns, + showTransformed, + showCommands } = config; const rowData = [ @@ -51,6 +57,8 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) sampled: sampled.toString(), summaryStats: summaryStats.toString(), reorderdColumns: reorderdColumns.toString(), + showTransformed: showTransformed.toString(), + showCommands: showCommands.toString(), }, ]; @@ -63,6 +71,10 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) setConfig({ ...config, sampled: !config.sampled }); } else if (colName === 'reorderdColumns') { setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); + } else if (colName === 'showTransformed') { + setConfig({ ...config, showTransformed: !config.showTransformed }); + } else if (colName === 'showCommands') { + setConfig({ ...config, showCommands: !config.showCommands }); } }; const gridOptions: GridOptions = { @@ -99,6 +111,8 @@ export function StatusBarEx() { sampled: true, summaryStats: false, reorderdColumns: false, + showTransformed: true, + showCommands: true, }); return ; From 33968fd4d906ba49d882a9001433179e94b62ffe Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 5 Jun 2023 13:22:23 -0400 Subject: [PATCH 076/250] you can now see the entire unomodified dataframe --- js/components/DCFCell.tsx | 2 +- js/components/DFViewer.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 2851b9246..6fcee471b 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -43,7 +43,7 @@ export function WidgetDCFCell({ >
    Date: Mon, 5 Jun 2023 15:20:48 -0400 Subject: [PATCH 077/250] more error tolerant summary stats functions --- buckaroo/buckaroo_widget.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 06862807d..b88f9ca15 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -19,6 +19,16 @@ from IPython.display import display +def get_outlier_idxs(ser): + outlier_idxs = [] + try: + idxs = ser.sort_values().index + except Exception as e: + print(e) + idxs = ser.index + outlier_idxs.extend(idxs[:5]) + outlier_idxs.extend(idxs[-5:]) + return outlier_idxs def sample(df, sample_size=500, include_outliers=True): if len(df) <= sample_size: @@ -27,13 +37,12 @@ def sample(df, sample_size=500, include_outliers=True): if include_outliers: outlier_idxs = [] for col in df.columns: - idxs = df[col].sort_values().index - outlier_idxs.extend(idxs[:5]) - outlier_idxs.extend(idxs[-5:]) + outlier_idxs.extend(get_outlier_idxs(df[col]) ) outlier_idxs.extend(sdf.index) uniq_idx = np.unique(outlier_idxs) return df.iloc[uniq_idx] return sdf + class BuckarooWidget(DOMWidget): From fa02f3440271d1b6d41a7866c9c875d1cc52bc8d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 5 Jun 2023 18:08:29 -0400 Subject: [PATCH 078/250] improvements to default summary stats behavior --- buckaroo/buckaroo_widget.py | 45 ++++++++++++++++++++++++------------- buckaroo/summary_stats.py | 30 ++++++++++++++----------- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index b88f9ca15..85677f101 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -18,6 +18,8 @@ from IPython.core.getipython import get_ipython from IPython.display import display +#from pandas.io.json._json import JSONTableWriter +#jst = JSONTableWriter(df3, orient='table', date_format="iso", double_precision=10, ensure_ascii=True, date_unit="ms", index=None, default_handler=str) def get_outlier_idxs(ser): outlier_idxs = [] @@ -44,7 +46,10 @@ def sample(df, sample_size=500, include_outliers=True): return sdf +def df_to_obj(df): + return json.loads(df.to_json(orient='table', indent=2, default_handler=str)) +FAST_SUMMARY_WHEN_GREATER = 1_000_000 class BuckarooWidget(DOMWidget): """TODO: Add docstring here """ @@ -55,9 +60,7 @@ class BuckarooWidget(DOMWidget): _view_module = Unicode(module_name).tag(sync=True) _view_module_version = Unicode(module_version).tag(sync=True) - value = Unicode('Hello World').tag(sync=True) commandConfig = Dict({}).tag(sync=True) - operations = List().tag(sync=True) command_classes = DefaultCommandKlsList @@ -80,22 +83,29 @@ class BuckarooWidget(DOMWidget): 'showCommands': True, }).tag(sync=True) - - # #config for the python pre-processing, waiting for inspiration for a better name - # python_massaging = Dict({ - # sample_threshold=20000, - # reorder_columns=True, - # max_rows=500, - # default_display='rows', #rows, summary, header+rows - # }).tag(sync=True) + def __init__(self, df, + sampled=True, + summaryStats=False, + reorderdColumns=True, + showTransformed=True, + showCommands=True, + really_reorder_columns=False): + super().__init__() + rows = len(df) + cols = len(df.columns) + item_count = rows * cols + if item_count > FAST_SUMMARY_WHEN_GREATER or reorderdColumns==False: + self.dfConfig['reorderdColumns'] = False + if really_reorder_columns: #an override + self.dfConfig['reorderdColumns'] = True + self.dfConfig['showTransformed'] = showTransformed + self.dfConfig['showCommands'] = showCommands - def __init__(self, df): - super().__init__() self.df = df + self.setup_dfconfig(df) - #self.origDf = json.loads(df.to_json(orient='table', indent=2)) self.operation_results = { 'transformed_df':self.origDf, 'generated_py_code':'#from py widget init'} @@ -113,8 +123,11 @@ def update_based_on_df_config(self, change): old = change['old'] new = change['new'] tdf = self.df_from_dfConfig() - otdf = reorder_columns(tdf) - self.origDf = json.loads(otdf.to_json(orient='table', indent=2, default_handler=str)) + if self.dfConfig['reorderdColumns']: + otdf = reorder_columns(tdf) + self.origDf = df_to_obj(otdf) + else: + self.origDf = df_to_obj(tdf) def df_from_dfConfig(self): @@ -167,7 +180,7 @@ def add_command(self, incomingCommandKls): self.setup_from_command_kls_list() def _display_as_buckaroo(df): - return display(BuckarooWidget(df)) + return display(BuckarooWidget(df, showCommands=False, showTransformed=False)) def enable(): """ diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index 011a2e97c..bcde096f3 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -14,8 +14,13 @@ def probable_datetime(ser): except Exception as e: return False -#probable_datetime(df['start station name']) +def get_mode(ser): + mode_raw = ser.mode() + if len(mode_raw) == 0: + return np.nan + else: + return mode_raw.values[0] def summarize_string(ser): l = len(ser) @@ -25,9 +30,6 @@ def summarize_string(ser): unique_count = len(val_counts[val_counts==1]) empty_count = val_counts.get('', 0) - #[pd.api.types.is_integer_dtype(df2[col]) for col in df2.columns] - #[pd.api.types.is_numeric_dtype(df2[col]) for col in df2.columns] - return dict( dtype=ser.dtype, length=l, @@ -40,7 +42,7 @@ def summarize_string(ser): is_numeric=pd.api.types.is_numeric_dtype(ser), is_integer=pd.api.types.is_integer_dtype(ser), is_datetime=probable_datetime(ser), - mode=ser.mode().values[0]) + mode=get_mode(ser)) def summarize_numeric(ser): @@ -61,11 +63,12 @@ def summarize_df(df): summary_df = pd.DataFrame({col:summarize_column(df[col]) for col in df}) return summary_df + def make_num_categorical(ser): - ser_uniq = ser.unique() + ser_uniq = ser.dropna().unique() name_to_idx = {name:idx for idx, name in enumerate(ser_uniq)} #needs to be vectorized - num_categorical = ser.apply(lambda x:name_to_idx[x]) + num_categorical = ser.dropna().apply(lambda x:name_to_idx[x]) return num_categorical def get_cor_pair_dict(df, summary_stats): @@ -89,15 +92,12 @@ def get_cor_pair_dict(df, summary_stats): cor_dict[col] = cor_cols.tolist() return cor_dict - - def set_when(df, cond_row_name, target_row_name, true_val, false_val): true_row = df.loc[cond_row_name] df.loc[target_row_name] = false_val df.loc[target_row_name, true_row[true_row==True].index.values] = true_val return df - def without(arr, search_keys): new_arr = [] for v in arr: @@ -152,8 +152,13 @@ def order_columns(summary_stats_df, corr_pair_dict): def reorder_columns(df): tdf_stats = summarize_df(df) cpd = get_cor_pair_dict(df, tdf_stats) - col_order = order_columns(tdf_stats, cpd) - return df[col_order] + try: + col_order = order_columns(tdf_stats, cpd) + return df[col_order] + except Exception as e: + print("error reordering columns", e) + return df + def make_df_metadata(df): summary_stats_df = summarize_df(df) @@ -162,4 +167,3 @@ def make_df_metadata(df): ordered_df = df[col_order] ordered_sdf = summary_stats_df[col_order] return [ordered_df, ordered_sdf] - From 276f65670808c9c9dc92ab9791cab848af39c1d0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 6 Jun 2023 07:12:57 -0400 Subject: [PATCH 079/250] smarter stats at import --- buckaroo/buckaroo_widget.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 85677f101..8c26c966b 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -66,6 +66,7 @@ class BuckarooWidget(DOMWidget): command_classes = DefaultCommandKlsList origDf = Dict({}).tag(sync=True) + summaryDf = Dict({}).tag(sync=True) operation_results = Dict({}).tag(sync=True) @@ -95,16 +96,27 @@ def __init__(self, df, rows = len(df) cols = len(df.columns) item_count = rows * cols - if item_count > FAST_SUMMARY_WHEN_GREATER or reorderdColumns==False: + + + if reorderdColumns == False: self.dfConfig['reorderdColumns'] = False - if really_reorder_columns: #an override + self.summary_df = df[:5] + elif item_count > FAST_SUMMARY_WHEN_GREATER: + self.dfConfig['reorderdColumns'] = False + self.summary_df = df[:5] + elif really_reorder_columns: #an override self.dfConfig['reorderdColumns'] = True + self.summary_df = summarize_df(df) + else: + self.dfConfig['reorderdColumns'] = True + self.summary_df = summarize_df(df) + self.summaryDf = df_to_obj(self.summary_df) self.dfConfig['showTransformed'] = showTransformed self.dfConfig['showCommands'] = showCommands self.df = df - + self.setup_dfconfig(df) self.operation_results = { 'transformed_df':self.origDf, @@ -131,9 +143,9 @@ def update_based_on_df_config(self, change): def df_from_dfConfig(self): - if self.dfConfig['summaryStats']: - return summarize_df(self.df) - elif self.dfConfig['sampled']: + # if self.dfConfig['summaryStats']: + # return summarize_df(self.df) + if self.dfConfig['sampled']: return sample(self.df) else: return self.df From 95b54c38d2a8d481c64d307d1154a371811633ee Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 6 Jun 2023 10:26:52 -0400 Subject: [PATCH 080/250] more refinements to summary stats --- buckaroo/buckaroo_widget.py | 7 +++++-- buckaroo/summary_stats.py | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 8c26c966b..42f09b587 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -11,9 +11,10 @@ from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe import pandas as pd +from pandas.io.json import dumps as pdumps from ._frontend import module_name, module_version from .all_transforms import configure_buckaroo, DefaultCommandKlsList -from .summary_stats import summarize_df, reorder_columns +from .summary_stats import summarize_df, reorder_columns, table_sumarize import json from IPython.core.getipython import get_ipython from IPython.display import display @@ -47,7 +48,9 @@ def sample(df, sample_size=500, include_outliers=True): def df_to_obj(df): - return json.loads(df.to_json(orient='table', indent=2, default_handler=str)) + obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) + obj['table_hints'] = json.loads(pdumps(table_sumarize(df))) + return obj FAST_SUMMARY_WHEN_GREATER = 1_000_000 class BuckarooWidget(DOMWidget): diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index bcde096f3..41964fd7d 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -22,6 +22,43 @@ def get_mode(ser): else: return mode_raw.values[0] +def int_digits(n): + if n == 0: + return 1 + if np.sign(n) == -1: + return int(np.floor(np.log10(np.abs(n)))) + 2 + return int(np.floor(np.log10(n)+1)) + + +def histogram(ser): + raw_counts, bins = np.histogram(ser, 10) + scaled_counts = np.round(raw_counts/raw_counts.sum(),2) + return [scaled_counts, bins] + +def table_sumarize_num_ser(ser): + if len(ser) == 0: + return dict(is_numeric=False) + return dict( + is_numeric=True, + is_integer=pd.api.types.is_integer_dtype(ser), + min_digits=int_digits(ser.min()), + max_digits=int_digits(ser.max()), + histogram=histogram(ser)) + +def table_sumarize_obj_ser(ser): + return dict( + is_numeric=False) + +def table_sumarize_ser(ser): + if pd.api.types.is_numeric_dtype(ser.dtype): + return table_sumarize_num_ser(ser.dropna()) + else: + return table_sumarize_obj_ser(ser) + +def table_sumarize(df): + return {col:table_sumarize_ser(df[col]) for col in df} + + def summarize_string(ser): l = len(ser) val_counts = ser.value_counts() From 8d799b8ce61ecc1fbaa1d9f59dd803443ae2e879 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 6 Jun 2023 10:32:25 -0400 Subject: [PATCH 081/250] some testcases that just exercise the numeric portions of buckaroo --- example-notebooks/testcases-fast.ipynb | 205 +++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 example-notebooks/testcases-fast.ipynb diff --git a/example-notebooks/testcases-fast.ipynb b/example-notebooks/testcases-fast.ipynb new file mode 100644 index 000000000..49776dd7a --- /dev/null +++ b/example-notebooks/testcases-fast.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "51091834-6d31-4e0e-b13c-a7be0a02ddb4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n", + "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import json\n", + "from buckaroo.buckaroo_widget import BuckarooWidget, disable, enable\n", + "import matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "30063897-1b67-4507-a3b8-0d98ab0f4b9f", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_parquet('banklist.parquet')\n", + "bw = BuckarooWidget(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "dd8b3a75-a615-402d-9c6c-fc57c2759fe4", + "metadata": {}, + "outputs": [], + "source": [ + "df2 = pd.read_csv('death-by-suicide-hispanic.csv')\n", + "bw = BuckarooWidget(df2)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c223dcb4-a354-4f3a-b492-e6ae33c99188", + "metadata": {}, + "outputs": [], + "source": [ + "df3 = pd.read_parquet('Covid-data.gzip.parquet')\n", + "bw = BuckarooWidget(df3)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c1c73c91-0343-417a-a45f-ef5f8c39e884", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/th/jfr8ccjx09g2j_18ty_t3xnh0000gn/T/ipykernel_93516/1813779222.py:1: DtypeWarning: Columns (2) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'<' not supported between instances of 'float' and 'str'\n" + ] + } + ], + "source": [ + "df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n", + "bw = BuckarooWidget(df4)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "97851149-49b4-41e2-a14f-ee9fbfcf7848", + "metadata": {}, + "outputs": [], + "source": [ + "df5 = pd.read_parquet('2014-01-citibike-trip-data.parquet')\n", + "bw = BuckarooWidget(df5)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "415dc2c0-dd8f-457b-a4f2-e067003ccb4b", + "metadata": {}, + "outputs": [], + "source": [ + "df6 = pd.read_parquet('1993-flights.gzip.parquet')\n", + "bw = BuckarooWidget(df6[:10_000])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ddcc8ec2-4045-4fa3-a80f-cde9e1864dff", + "metadata": {}, + "outputs": [], + "source": [ + "df8 = pd.read_csv('train_extended.csv')\n", + "bw = BuckarooWidget(df8)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1bb274bb-27b0-4bb4-b296-7c246ced9ce5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "error reordering columns cannot reindex on an axis with duplicate labels\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/paddy/buckaroo/buckaroo/summary_stats.py:184: FutureWarning: reindexing with a non-unique Index is deprecated and will raise in a future version.\n", + " sdf.loc['is_duplicate':, duplicate_cols] = -5\n" + ] + } + ], + "source": [ + "df9 = pd.read_csv('scorecard.csv')\n", + "bw = BuckarooWidget(df9)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8e620ba5-7883-4422-9223-d4e67e03b243", + "metadata": {}, + "outputs": [], + "source": [ + "df10 = pd.read_csv('Machine_readable_file_bd_employ.csv')\n", + "bw = BuckarooWidget(df10)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "12553bd6-be53-4001-be9a-dfc939981d38", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12.7 s ± 2.16 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%timeit bw = BuckarooWidget(df6)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d790153-359a-45dd-8b88-bfd87a5eb7f8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From a8cdeae6faaf73610c8be8641f1262ea3a2111e2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 6 Jun 2023 20:33:59 -0400 Subject: [PATCH 082/250] much better number formatting --- js/components/DCFCell.tsx | 5 ++- js/components/DFViewer.tsx | 2 +- js/components/gridUtils.ts | 66 +++++++++++++++++++++++++++-- js/components/staticData.ts | 83 +++++++++++++++++++++++++++++++++++-- 4 files changed, 147 insertions(+), 9 deletions(-) diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 6fcee471b..9661eb195 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -25,6 +25,7 @@ export function WidgetDCFCell({ commandConfig, dfConfig, on_dfConfig, + summaryDf }: { origDf: DFWhole; operations: Operation[]; @@ -33,6 +34,7 @@ export function WidgetDCFCell({ commandConfig: CommandConfigT; dfConfig: DfConfig; on_dfConfig: unknown; + summaryDf: DFWhole }) { const [activeCol, setActiveCol] = useState('stoptime'); const widgetConfig: WidgetConfig = {showCommands:dfConfig.showCommands, showTransformed:dfConfig.showTransformed} @@ -47,7 +49,7 @@ export function WidgetDCFCell({ > @@ -88,6 +90,7 @@ export function WidgetDCFCellExample() { commandConfig={bakedCommandConfig} dfConfig={sampleConfig} on_dfConfig={setConfig} + summaryDf={tableDf} /> ); } diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx index c71b5b65f..bc8f056eb 100644 --- a/js/components/DFViewer.tsx +++ b/js/components/DFViewer.tsx @@ -44,7 +44,7 @@ export function DFViewer( rowSelection: 'single', onRowClicked: (event) => console.log('A row was clicked'), defaultColDef: { - sortable:true + sortable:true, type: 'rightAligned' }, onCellClicked: (event) => { diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index 8321e1489..a932468c7 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -1,5 +1,5 @@ -import { ColDef } from 'ag-grid-community'; -import { DFWhole, DFColumn } from './staticData'; +import { ColDef, ValueFormatterFunc, ValueFormatterParams } from 'ag-grid-community'; +import { DFWhole, DFColumn, ColumnHint } from './staticData'; export const updateAtMatch = ( cols: ColDef[], @@ -17,10 +17,68 @@ export const updateAtMatch = ( return retColumns; }; +/* + console.log((new Intl.NumberFormat('en-US')).format(amount)) + console.log((new Intl.NumberFormat('en-US', { maximumFractionDigits: 1})).format(number)) + + console.log(`|${last4Digits.padStart(7, ' ')}|`) + + valueFormatter: currencyFormatter} + ]; + + function currencyFormatter(params) { + return '£' + formatNumber(params.value); + } +*/ +function getFormatter(hint: ColumnHint): ValueFormatterFunc { + if (hint === undefined || hint.is_numeric === false) { + return (params: ValueFormatterParams):string => params.value; + } else { + const commas = Math.floor(hint.max_digits / 3); + + if (hint.is_integer) { + const totalWidth = commas + hint.max_digits; + return (params: ValueFormatterParams):string => { + console.log("params", params) + + const formatter = new Intl.NumberFormat('en-US'); + //console.log(`|${last4Digits.padStart(7, ' ')}|`) + return formatter.format(params.value).padStart(totalWidth, ' '); + }; + } else { + /* + + const intWidth = commas + hint.max_digits; + const fracWidth = 4; + return (params: ValueFormatterParams):string => { + console.log("params", params) + const formatter = new Intl.NumberFormat('en-US', { maximumFractionDigits: 3 }); + //console.log(`|${last4Digits.padStart(7, ' ')}|`) + const numFormatted = formatter.format(params.value); + if(numFormatted.includes(".")){ + const [intPart, fracPart] = numFormatted.split(".") + return [intPart.padStart(intWidth, " "), fracPart.padEnd(3, " ")].join(".") } + else { + return numFormatted.padStart(intWidth, " ").padEnd(intWidth + fracWidth, " ") + } + };*/ + return (params: ValueFormatterParams):string => { + //console.log("params", params) + const formatter = new Intl.NumberFormat('en-US', { minimumFractionDigits:3, maximumFractionDigits: 3 }); + return formatter.format(params.value); + }; + + } + } +} + export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { const fields = tdf.schema.fields; - const retColumns = fields.map((f: DFColumn) => { - return { field: f.name }; + //console.log("tdf", tdf); + //console.log("hints", tdf.table_hints); + const retColumns:ColDef[] = fields.map((f: DFColumn) => { + //console.log(f.name, tdf.table_hints[f.name]) + return { field: f.name, valueFormatter:getFormatter(tdf.table_hints[f.name]) }; }); return [retColumns, tdf.data]; } diff --git a/js/components/staticData.ts b/js/components/staticData.ts index 9bf76a964..d8449f70c 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -30,27 +30,48 @@ const origRows = [ ]; */ export interface DFColumn { - name: string; + name: string; type:string; } export type DFDataRow = Record; export type DFData = DFDataRow[]; +export interface ColumnObjHint { + is_numeric:false; +} + +export interface ColumnNumHint { + is_numeric:true; + is_integer:boolean; + min_digits:number; + max_digits:number; + histogram:number[][]; +} + +export type ColumnHint = ColumnObjHint | ColumnNumHint export interface DFWhole { schema: { fields: DFColumn[]; + primaryKey: string[]; //['index'] + pandas_version: string; //'1.4.0', + + }; + table_hints:Record; data: DFData; } export const EmptyDf: DFWhole = { - schema: { fields: [] }, + schema: { fields: [], primaryKey:[], pandas_version:"" }, + table_hints:{}, data: [], }; //print(sdf.to_json(orient='table', indent=2)) -export const tableDf = { +//export const tableDf2:DFWhole = { +export const foo:DFWhole = { + schema: { fields: [ { name: 'index', type: 'integer' }, @@ -64,9 +85,20 @@ export const tableDf = { { name: 'birth year', type: 'string' }, { name: 'gender', type: 'integer' }, ], + primaryKey: ['index'], pandas_version: '1.4.0', }, + table_hints: { 'index': { is_numeric:false}, + 'tripduration': { is_numeric:false}, + 'starttime': { is_numeric:false}, + 'stoptime': { is_numeric:false}, + 'start station id': { is_numeric:false}, + 'start station name': { is_numeric:false}, + 'start station latitude': { is_numeric:false}, + 'bikeid': { is_numeric:false}, + 'birth year': { is_numeric:false}, + 'gender': { is_numeric:false}}, data: [ { index: 0, @@ -130,3 +162,48 @@ export const tableDf = { }, ], }; + +export const tableDf: DFWhole = {'schema': {'fields': [{'name': 'index', 'type': 'integer'}, + {'name': 'end station name', 'type': 'string'}, + {'name': 'tripduration', 'type': 'integer'}, + {'name': 'start station name', 'type': 'string'}], + 'primaryKey': ['index'], + 'pandas_version': '1.4.0'}, + 'data': [{'index': 0, + 'end station name': 'Elizabeth St & Hester St', + 'tripduration': 471, + 'start station name': 'Catherine St & Monroe St'}, + {'index': 1, + 'end station name': 'South St & Whitehall St', + 'tripduration': 1494, + 'start station name': '1 Ave & E 30 St'}, + {'index': 2, + 'end station name': 'E 59 St & Sutton Pl', + 'tripduration': 464, + 'start station name': 'E 48 St & 3 Ave'}, + {'index': 3, + 'end station name': 'E 33 St & 5 Ave', + 'tripduration': 373, + 'start station name': 'Pershing Square N'}, + {'index': 4, + 'end station name': 'Hancock St & Bedford Ave', + 'tripduration': 660, + 'start station name': 'Atlantic Ave & Fort Greene Pl'}], + 'table_hints': {'end station name': {'is_numeric': false}, + 'tripduration': {'is_numeric': true, + 'is_integer': true, + 'min_digits': 3, + 'max_digits': 4, + 'histogram': [[0.6, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2], + [373.0, + 485.1, + 597.2, + 709.3, + 821.4, + 933.5, + 1045.6, + 1157.7, + 1269.8, + 1381.9, + 1494.0]]}, + 'start station name': {'is_numeric': false}}} From bd0b5817fb1fd9b00fb8c7c19fe6e2501c393f4f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 7 Jun 2023 08:26:16 -0400 Subject: [PATCH 083/250] better number formatting --- examples/App.tsx | 2 + js/components/staticData.ts | 105 +++++++++++++++++++++--------------- style/widget.css | 5 ++ 3 files changed, 68 insertions(+), 44 deletions(-) diff --git a/examples/App.tsx b/examples/App.tsx index dc0954451..a89990580 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -44,11 +44,13 @@ for (const ex of Object.keys(examples)) { } const LeftMenuItem = (props): JSX.Element => ( +

    paddy

    {props.title}

    +
    ); diff --git a/js/components/staticData.ts b/js/components/staticData.ts index d8449f70c..1c0418f18 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -163,47 +163,64 @@ export const foo:DFWhole = { ], }; -export const tableDf: DFWhole = {'schema': {'fields': [{'name': 'index', 'type': 'integer'}, - {'name': 'end station name', 'type': 'string'}, - {'name': 'tripduration', 'type': 'integer'}, - {'name': 'start station name', 'type': 'string'}], - 'primaryKey': ['index'], - 'pandas_version': '1.4.0'}, - 'data': [{'index': 0, - 'end station name': 'Elizabeth St & Hester St', - 'tripduration': 471, - 'start station name': 'Catherine St & Monroe St'}, - {'index': 1, - 'end station name': 'South St & Whitehall St', - 'tripduration': 1494, - 'start station name': '1 Ave & E 30 St'}, - {'index': 2, - 'end station name': 'E 59 St & Sutton Pl', - 'tripduration': 464, - 'start station name': 'E 48 St & 3 Ave'}, - {'index': 3, - 'end station name': 'E 33 St & 5 Ave', - 'tripduration': 373, - 'start station name': 'Pershing Square N'}, - {'index': 4, - 'end station name': 'Hancock St & Bedford Ave', - 'tripduration': 660, - 'start station name': 'Atlantic Ave & Fort Greene Pl'}], - 'table_hints': {'end station name': {'is_numeric': false}, - 'tripduration': {'is_numeric': true, - 'is_integer': true, - 'min_digits': 3, - 'max_digits': 4, - 'histogram': [[0.6, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2], - [373.0, - 485.1, - 597.2, - 709.3, - 821.4, - 933.5, - 1045.6, - 1157.7, - 1269.8, - 1381.9, - 1494.0]]}, - 'start station name': {'is_numeric': false}}} +export const tableDf: DFWhole = { + 'schema': {'fields': [ + {'name': 'index', 'type': 'integer'}, + {'name': 'end station name', 'type': 'string'}, + {'name': 'tripduration', 'type': 'integer'}, + {'name': 'start station name', 'type': 'string'}, + {'name': 'floatCol', 'type': 'float'} + ], + 'primaryKey': ['index'], + 'pandas_version': '1.4.0'}, + 'data': [{'index': 0, + 'end station name': 'Elizabeth St & Hester St', + 'tripduration': 471, + 'start station name': 'Catherine St & Monroe St', + 'floatCol': '1.111', + } + + , + {'index': 1, + 'end station name': 'South St & Whitehall St', + 'tripduration': 1494, + 'start station name': '1 Ave & E 30 St', + 'floatCol': '8.888' + }, + {'index': 2, + 'end station name': 'E 59 St & Sutton Pl', + 'tripduration': 464, + 'start station name': 'E 48 St & 3 Ave', + 'floatCol': '9.999' + }, + {'index': 3, + 'end station name': 'E 33 St & 5 Ave', + 'tripduration': 373, + 'start station name': 'Pershing Square N', + 'floatCol': '-10.1' + }, + {'index': 4, + 'end station name': 'Hancock St & Bedford Ave', + 'tripduration': 660, + 'start station name': 'Atlantic Ave & Fort Greene Pl', + 'floatCol': '10.99' + }], + 'table_hints': + { + 'end station name': {'is_numeric': false}, + 'tripduration': {'is_numeric': true, + 'is_integer': true, + 'min_digits': 3, + 'max_digits': 4, + 'histogram': [[0.6, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2], + [373.0, 485.1, 597.2, 709.3, 821.4, 933.5, 1045.6, + 1157.7, 1269.8, 1381.9, 1494.0]]}, + 'start station name': {'is_numeric': false}, + 'floatCol': {'is_numeric': true, + 'is_integer': false, + 'min_digits': 1, + 'max_digits': 3, + 'histogram': [[0.6, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2], + [373.0, 485.1, 597.2, 709.3, 821.4, 933.5, 1045.6, + 1157.7, 1269.8, 1381.9, 1494.0]]}, + }} diff --git a/style/widget.css b/style/widget.css index 47fc49606..205834dff 100644 --- a/style/widget.css +++ b/style/widget.css @@ -11,3 +11,8 @@ div.dependent-tabs ul.tabs li.active { background:rgba(33, 150, 243, 0.49); /* border:1px solid red; */ } + +.ag-row .ag-cell { + font-family: monospace; +} + From 1cca6198a94380ed425aadfd9ffd13ccd2ba01c0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 7 Jun 2023 10:21:52 -0400 Subject: [PATCH 084/250] no more baseurl errors --- tsconfig.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index f66a0a497..660a404e7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,9 +17,10 @@ // This allows us to initialize members in the "initialize" method "strictPropertyInitialization": false, "target": "es2015", - "jsx": "react" + "jsx": "react", + "baseUrl": "." }, - "include": ["js/*.ts", "js/*.tsx", "js/core/*.ts", "js/core/*.tsx"], + "include": ["js/*.ts", "js/*.tsx", "js/core/*.ts", "js/core/*.tsx", "js/core/*"], "ts-node": { "transpileOnly": true } From f5ae1c982398d6daf5a90304a07b007a5c121bde Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 7 Jun 2023 12:48:54 -0400 Subject: [PATCH 085/250] now only a single component --- examples/App.tsx | 2 +- js/dcefwidget.ts | 1 - js/npm-styles.scss | 153 --------------------------------------------- style/dcf-npm.css | 22 +++++++ style/widget.css | 18 ------ 5 files changed, 23 insertions(+), 173 deletions(-) delete mode 100644 js/npm-styles.scss delete mode 100644 style/widget.css diff --git a/examples/App.tsx b/examples/App.tsx index a89990580..4d9346761 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -8,7 +8,7 @@ import './app.css'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; -import '../js/npm-styles.scss'; +import '../style/dcf-npm.css'; const examples = { diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 9b135c8bd..8780f5bfb 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -20,7 +20,6 @@ import { MODULE_NAME, MODULE_VERSION } from './version'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; import '../style/dcf-npm.css'; -import '../style/widget.css'; import { Operation } from './components/OperationUtils'; import { CommandConfigT } from './components/CommandUtils'; diff --git a/js/npm-styles.scss b/js/npm-styles.scss deleted file mode 100644 index 5b792bc14..000000000 --- a/js/npm-styles.scss +++ /dev/null @@ -1,153 +0,0 @@ - -.column-list { - width:100%; font-size:1rem; - dl { - display:flex; margin:0; padding:0; - div.list-item { - padding:3px; - dt { - float:left; max-width:90px; overflow:hidden; max-height:1rem; - } - dd { - float:right; - } - .column-editor { - width:100%; clear:both; height:30px; - label { - span { float:left; } - input[type=checkbox] { - float:left; - } - input[type=text] {} - } - } - } - } -} - -.dependent-tabs { - font-size:1rem; - ul.tabs { - li {float:left; - background:var(--ag-background-color); - color: var(--ag-foreground-color); - - border:1px solid purple; - border-bottom:none; - list-style:none; margin-right:5px; - padding:2px - } - li.active { - background: var(--ag-range-selection-background-color-3); - color:var(--ag-alpine-active-color); - } - - } - .output-area { - clear:both; float:none; - } -} - - -.python-displayer, .command-displayer { - width:100%; - height:100%; - background: hsl(0deg 0% 13%); - overflow:hidden; - padding:16px; - /*border:1px solid red; */ - pre { - - - color: #41FF00 - - } - -} -.command-displayer { - pre { - overflow:hidden; - } -} - -.features -{ - font-size: 1.7rem; - - & div - { - padding: 0.5rem; - } -} - - -.modal { - position: absolute; - background-color: #ffffff; - border: 1px solid black; - padding: 16px; - list-style: none; - - > li { - padding: 8px; - } -} - - -.command-viewer { - border:1px solid ; - color:black; - font-size:1rem; - .operation-adder { - // border:2px solid brown; - span.column-name { - float:left; - display:block; - color:black; - } - fieldset { - float:left; - } - clear:both; - } - - .operations-box { - clear:left; - display:flex; - // height:80px; - overflow:auto; - h4 { - font-size:1em; - border:1px orange; - color:black; - - } - div { - - overflow-x:scroll - } - } - -} - -.operation-detail { - overflow:auto; - button { float:left;} - .arg-getters { - button { - float:left; - } - fieldset { - float:left - } - div.col-enum { - float:left; - width:800px; - overflow-x:scroll; - table { - td, th {border:1px solid black;} - } - } - - } -} diff --git a/style/dcf-npm.css b/style/dcf-npm.css index 08d3f3955..06800fd77 100644 --- a/style/dcf-npm.css +++ b/style/dcf-npm.css @@ -137,4 +137,26 @@ border: 1px solid black; } +.col-enum table { + margin-bottom:9px; +} + +.ag-theme-alpine-dark { + --ag-grid-size:3px; + --ag-list-item-height: 20px; + } + +div.dependent-tabs ul.tabs li.active { + background:rgba(33, 150, 243, 0.49); +/* border:1px solid red; */ +} + +.ag-row .ag-cell { + font-family: monospace; + white-space: pre; +} +.left-menu { + color:black; +} + /*# sourceMappingURL=dcf-npm.css.map */ diff --git a/style/widget.css b/style/widget.css deleted file mode 100644 index 205834dff..000000000 --- a/style/widget.css +++ /dev/null @@ -1,18 +0,0 @@ -.col-enum table { - margin-bottom:9px; -} - -.ag-theme-alpine-dark { - --ag-grid-size:3px; - --ag-list-item-height: 20px; - } - -div.dependent-tabs ul.tabs li.active { - background:rgba(33, 150, 243, 0.49); -/* border:1px solid red; */ -} - -.ag-row .ag-cell { - font-family: monospace; -} - From 5303ad8e420ec5cdf30f203b63faed21c3fcd39e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 7 Jun 2023 13:29:19 -0400 Subject: [PATCH 086/250] removing a top level domain --- examples/App.tsx | 2 +- js/dcefwidget.ts | 2 +- {style => js/style}/dcf-npm.css | 0 {style => js/style}/icons/arrow-down-short-dark.svg | 0 {style => js/style}/icons/arrow-down-short.svg | 0 {style => js/style}/icons/arrow-up-short-dark.svg | 0 {style => js/style}/icons/arrow-up-short.svg | 0 {style => js/style}/icons/filter-dark.svg | 0 {style => js/style}/icons/filter.svg | 0 9 files changed, 2 insertions(+), 2 deletions(-) rename {style => js/style}/dcf-npm.css (100%) rename {style => js/style}/icons/arrow-down-short-dark.svg (100%) rename {style => js/style}/icons/arrow-down-short.svg (100%) rename {style => js/style}/icons/arrow-up-short-dark.svg (100%) rename {style => js/style}/icons/arrow-up-short.svg (100%) rename {style => js/style}/icons/filter-dark.svg (100%) rename {style => js/style}/icons/filter.svg (100%) diff --git a/examples/App.tsx b/examples/App.tsx index 4d9346761..fafcdb801 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -8,7 +8,7 @@ import './app.css'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; -import '../style/dcf-npm.css'; +import '../js/style/dcf-npm.css'; const examples = { diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 8780f5bfb..7d7a11721 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -19,7 +19,7 @@ import { MODULE_NAME, MODULE_VERSION } from './version'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; -import '../style/dcf-npm.css'; +import '../js/style/dcf-npm.css'; import { Operation } from './components/OperationUtils'; import { CommandConfigT } from './components/CommandUtils'; diff --git a/style/dcf-npm.css b/js/style/dcf-npm.css similarity index 100% rename from style/dcf-npm.css rename to js/style/dcf-npm.css diff --git a/style/icons/arrow-down-short-dark.svg b/js/style/icons/arrow-down-short-dark.svg similarity index 100% rename from style/icons/arrow-down-short-dark.svg rename to js/style/icons/arrow-down-short-dark.svg diff --git a/style/icons/arrow-down-short.svg b/js/style/icons/arrow-down-short.svg similarity index 100% rename from style/icons/arrow-down-short.svg rename to js/style/icons/arrow-down-short.svg diff --git a/style/icons/arrow-up-short-dark.svg b/js/style/icons/arrow-up-short-dark.svg similarity index 100% rename from style/icons/arrow-up-short-dark.svg rename to js/style/icons/arrow-up-short-dark.svg diff --git a/style/icons/arrow-up-short.svg b/js/style/icons/arrow-up-short.svg similarity index 100% rename from style/icons/arrow-up-short.svg rename to js/style/icons/arrow-up-short.svg diff --git a/style/icons/filter-dark.svg b/js/style/icons/filter-dark.svg similarity index 100% rename from style/icons/filter-dark.svg rename to js/style/icons/filter-dark.svg diff --git a/style/icons/filter.svg b/js/style/icons/filter.svg similarity index 100% rename from style/icons/filter.svg rename to js/style/icons/filter.svg From 0c46cb8a857a384a174edb453ac5b43cb4e7065f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 08:46:17 -0400 Subject: [PATCH 087/250] better summary stats mechanism in the works --- buckaroo/buckaroo_widget.py | 118 ++++++++++++++++-------------------- buckaroo/summary_stats.py | 57 ++++++++++++----- 2 files changed, 93 insertions(+), 82 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 42f09b587..ab3243380 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -11,47 +11,57 @@ from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe import pandas as pd -from pandas.io.json import dumps as pdumps from ._frontend import module_name, module_version from .all_transforms import configure_buckaroo, DefaultCommandKlsList -from .summary_stats import summarize_df, reorder_columns, table_sumarize +from .summary_stats import summarize_df, table_sumarize, sample, DfStats import json from IPython.core.getipython import get_ipython from IPython.display import display - +from pandas.io.json import dumps as pdumps #from pandas.io.json._json import JSONTableWriter #jst = JSONTableWriter(df3, orient='table', date_format="iso", double_precision=10, ensure_ascii=True, date_unit="ms", index=None, default_handler=str) -def get_outlier_idxs(ser): - outlier_idxs = [] - try: - idxs = ser.sort_values().index - except Exception as e: - print(e) - idxs = ser.index - outlier_idxs.extend(idxs[:5]) - outlier_idxs.extend(idxs[-5:]) - return outlier_idxs - -def sample(df, sample_size=500, include_outliers=True): - if len(df) <= sample_size: - return df - sdf = df.sample(np.min([sample_size, len(df)])) - if include_outliers: - outlier_idxs = [] - for col in df.columns: - outlier_idxs.extend(get_outlier_idxs(df[col]) ) - outlier_idxs.extend(sdf.index) - uniq_idx = np.unique(outlier_idxs) - return df.iloc[uniq_idx] - return sdf - - -def df_to_obj(df): + +def df_to_obj(df, order = None): + if order is None: + order = df.columns obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) obj['table_hints'] = json.loads(pdumps(table_sumarize(df))) + obj['schema'] = dict( + fields=[{'name':c} for c in order]) return obj + +''' def __init__(self, df, + sampled=True, + summaryStats=False, + reorderdColumns=True, + showTransformed=True, + showCommands=True, + really_reorder_columns=False): + super().__init__() + rows = len(df) + cols = len(df.columns) + item_count = rows * cols + + + if reorderdColumns == False: + self.dfConfig['reorderdColumns'] = False + self.summary_df = df[:5] + elif item_count > FAST_SUMMARY_WHEN_GREATER: + self.dfConfig['reorderdColumns'] = False + self.summary_df = df[:5] + elif really_reorder_columns: #an override + self.dfConfig['reorderdColumns'] = True + self.summary_df = summarize_df(df) + else: + self.dfConfig['reorderdColumns'] = True + self.summary_df = summarize_df(df) + + + +''' + FAST_SUMMARY_WHEN_GREATER = 1_000_000 class BuckarooWidget(DOMWidget): """TODO: Add docstring here @@ -80,7 +90,7 @@ class BuckarooWidget(DOMWidget): 'columns': 30, 'rowsShown': 500, 'sampleSize': 10_000, - 'sampled':True, + 'sampled':False, 'summaryStats': False, 'reorderdColumns': True, 'showTransformed': True, @@ -96,58 +106,32 @@ def __init__(self, df, showCommands=True, really_reorder_columns=False): super().__init__() - rows = len(df) - cols = len(df.columns) - item_count = rows * cols + self.stats = DfStats(df) + self.summaryDf = df_to_obj(self.stats.sdf, self.stats.col_order) - if reorderdColumns == False: - self.dfConfig['reorderdColumns'] = False - self.summary_df = df[:5] - elif item_count > FAST_SUMMARY_WHEN_GREATER: - self.dfConfig['reorderdColumns'] = False - self.summary_df = df[:5] - elif really_reorder_columns: #an override - self.dfConfig['reorderdColumns'] = True - self.summary_df = summarize_df(df) - else: - self.dfConfig['reorderdColumns'] = True - self.summary_df = summarize_df(df) - self.summaryDf = df_to_obj(self.summary_df) - - self.dfConfig['showTransformed'] = showTransformed - self.dfConfig['showCommands'] = showCommands - + self.dfConfig.update(dict( + totalRows=len(df), + columns=len(df.columns), + showTransformed=showTransformed, + showCommands=showCommands)) self.df = df - - self.setup_dfconfig(df) + self.dfConfig = self.dfConfig.copy() + self.update_based_on_df_config('foo') self.operation_results = { 'transformed_df':self.origDf, 'generated_py_code':'#from py widget init'} self.setup_from_command_kls_list() - #Maybe tie this to a watcher on DF? - def setup_dfconfig(self, df): - dfc = self.dfConfig.copy() - dfc.update(dict(totalRows=len(df), - columns=len(df.columns))) - self.dfConfig = dfc - @observe('dfConfig') def update_based_on_df_config(self, change): - old = change['old'] - new = change['new'] tdf = self.df_from_dfConfig() - if self.dfConfig['reorderdColumns']: - otdf = reorder_columns(tdf) - self.origDf = df_to_obj(otdf) + if self.dfConfig['reorderdColumns']: + self.origDf = df_to_obj(tdf, self.stats.col_order) else: self.origDf = df_to_obj(tdf) - def df_from_dfConfig(self): - # if self.dfConfig['summaryStats']: - # return summarize_df(self.df) if self.dfConfig['sampled']: return sample(self.df) else: diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index 41964fd7d..7fd2be29c 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -1,8 +1,11 @@ from functools import reduce import pandas as pd +from pandas.io.json import dumps as pdumps import numpy as np + + def probable_datetime(ser): s_ser = ser.sample(np.min([len(ser), 500])) try: @@ -113,9 +116,7 @@ def get_cor_pair_dict(df, summary_stats): #this needs to be vectorized corrable_cols = [col for col in df if summary_stats[col]['distinct_count'] > 1] - #print("corrable_cols", corrable_cols) - #num_df = pd.DataFrame({col:numerize_column(df[col]) for col in corrable_cols}) - + num_df = pd.DataFrame({col:make_num_categorical(df[col]) for col in corrable_cols}) corr_df = num_df.corr() @@ -142,7 +143,6 @@ def without(arr, search_keys): new_arr.append(v) return new_arr - def find_groupings(corr_pairs): all_groupings = [] for key, other_key_list in corr_pairs.items(): @@ -189,18 +189,45 @@ def order_columns(summary_stats_df, corr_pair_dict): def reorder_columns(df): tdf_stats = summarize_df(df) cpd = get_cor_pair_dict(df, tdf_stats) + # try: + col_order = order_columns(tdf_stats, cpd) + return df[col_order] + + +def get_outlier_idxs(ser): + outlier_idxs = [] try: - col_order = order_columns(tdf_stats, cpd) - return df[col_order] + idxs = ser.sort_values().index except Exception as e: - print("error reordering columns", e) + print(e) + idxs = ser.index + outlier_idxs.extend(idxs[:5]) + outlier_idxs.extend(idxs[-5:]) + return outlier_idxs + +def sample(df, sample_size=500, include_outliers=True): + if len(df) <= sample_size: return df + sdf = df.sample(np.min([sample_size, len(df)])) + if include_outliers: + outlier_idxs = [] + for col in df.columns: + outlier_idxs.extend(get_outlier_idxs(df[col]) ) + outlier_idxs.extend(sdf.index) + uniq_idx = np.unique(outlier_idxs) + return df.iloc[uniq_idx] + return sdf + +class DfStats(object): + def __init__(self, + df, + # summary_func=summary_stats.summarize_df, + # order_col_func=summary_stats.order_columns): + summary_func=summarize_df, + order_col_func=order_columns): + + self.df = df + self.sdf = summary_func(df) + self.cpd = get_cor_pair_dict(self.df, self.sdf) + self.col_order = order_col_func(self.sdf, self.cpd) - -def make_df_metadata(df): - summary_stats_df = summarize_df(df) - corr_dict = get_cor_pair_dict(df, summary_stats_df) - col_order = order_columns(summary_stats_df, corr_dict) - ordered_df = df[col_order] - ordered_sdf = summary_stats_df[col_order] - return [ordered_df, ordered_sdf] From 1d86ebc7572efdd2e69a2c194619e2d152603e8f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 11:24:08 -0400 Subject: [PATCH 088/250] able to run through all testcases without errors --- buckaroo/buckaroo_widget.py | 33 ++++++++++++++++++++++++++++--- buckaroo/summary_stats.py | 39 ++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index ab3243380..7b28e7431 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -27,8 +27,10 @@ def df_to_obj(df, order = None): order = df.columns obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) obj['table_hints'] = json.loads(pdumps(table_sumarize(df))) - obj['schema'] = dict( - fields=[{'name':c} for c in order]) + fields=[{'name':'index'}] + for c in order: + fields.append({'name':c}) + obj['schema'] = dict(fields=fields) return obj @@ -98,6 +100,12 @@ class BuckarooWidget(DOMWidget): }).tag(sync=True) + summary_df_cols = [ + 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count', + 'empty_per', 'unique_per', 'nan_per', 'is_numeric', 'is_integer', + 'is_datetime', 'mode', 'min', 'max','mean', + ] + def __init__(self, df, sampled=True, summaryStats=False, @@ -107,8 +115,27 @@ def __init__(self, df, really_reorder_columns=False): super().__init__() + rows = len(df) + cols = len(df.columns) + item_count = rows * cols + + + if reorderdColumns == False: + self.dfConfig['reorderdColumns'] = False + self.summary_df = df[:5] + elif item_count > FAST_SUMMARY_WHEN_GREATER: + self.dfConfig['reorderdColumns'] = False + self.summary_df = df[:5] + elif really_reorder_columns: #an override + self.dfConfig['reorderdColumns'] = True + else: + self.dfConfig['reorderdColumns'] = True + + + + self.stats = DfStats(df) - self.summaryDf = df_to_obj(self.stats.sdf, self.stats.col_order) + self.summaryDf = df_to_obj(self.stats.sdf.loc[self.summary_df_cols], self.stats.col_order) self.dfConfig.update(dict( totalRows=len(df), diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index 7fd2be29c..d151950b2 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -159,30 +159,20 @@ def order_groupings(grps, ranked_cols): first_cols.append(col) rest_cols.extend(list(without(grp, [col]))) grps = without(grps, [grp]) - return first_cols, rest_cols + return list(set(first_cols)), list(set(rest_cols)) -def order_columns(summary_stats_df, corr_pair_dict): - sdf = summary_stats_df.copy() - sdf.loc['one_distinct'] = 0 - - only_ones = (sdf.loc['distinct_count'] <= 1) - sdf.loc['one_distinct', only_ones[only_ones==True].index.values] = -20 - - sdf.loc['first_col'] = 0 - sdf.loc['is_duplicate'] = 0 - set_when(sdf, 'is_datetime', 'datetime_score', 11, 0) - - set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) - set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) +def order_columns(sdf, corr_pair_dict): grouping_col_scores = sdf.loc[['grouping_score_integer', 'grouping_score_numeric']].sum() duplicate_col_rankings = grouping_col_scores.sort_values().index[::-1].values groupings = find_groupings(corr_pair_dict) + #print("groupings", groupings) first_cols, duplicate_cols = order_groupings(groupings, duplicate_col_rankings) + #print("duplicate_cols", duplicate_cols) sdf.loc['first_col':, first_cols] = 5 sdf.loc['is_duplicate':, duplicate_cols] = -5 - + #print(sdf.index) col_scores = sdf.loc[['one_distinct', 'first_col', 'datetime_score', 'is_duplicate']].sum() return col_scores.sort_values().index.values[::-1] @@ -218,9 +208,24 @@ def sample(df, sample_size=500, include_outliers=True): return df.iloc[uniq_idx] return sdf +def add_col_rankings(df, sdf): + sdf.loc['one_distinct'] = 0 + + only_ones = (sdf.loc['distinct_count'] <= 1) + sdf.loc['one_distinct', only_ones[only_ones==True].index.values] = -20 + + sdf.loc['first_col'] = 0 + sdf.loc['is_duplicate'] = 0 + set_when(sdf, 'is_datetime', 'datetime_score', 11, 0) + + set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) + set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) + + class DfStats(object): def __init__(self, df, + annotate_funcs=[add_col_rankings], # summary_func=summary_stats.summarize_df, # order_col_func=summary_stats.order_columns): summary_func=summarize_df, @@ -228,6 +233,8 @@ def __init__(self, self.df = df self.sdf = summary_func(df) + for func in annotate_funcs: + func(df, self.sdf) self.cpd = get_cor_pair_dict(self.df, self.sdf) self.col_order = order_col_func(self.sdf, self.cpd) - + From 3480e143a0913dec2a5f8566dab718c98ac5708d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 13:41:50 -0400 Subject: [PATCH 089/250] turned off autoscroll because it was buggy --- js/dcefwidget.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 7d7a11721..5d8f19200 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -78,6 +78,8 @@ export class DCEFWidgetView extends DOMWidgetView { return React.createElement(WidgetDCFCell, props); }; console.log("widget el", this.el) + + /* const el = this.el; _.delay(() => { //only get the active notebook @@ -90,6 +92,7 @@ export class DCEFWidgetView extends DOMWidgetView { //console.log("scrollOffset", scrollOffset); notebookEl.scroll(0, -1*scrollOffset); }, 300) + */ const root = ReactDOMClient.createRoot(this.el); const componentEl = React.createElement(Component, {}); root.render(componentEl); From 22c30c4cdd85a0b36d4d1d908690e251cdf945c6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 13:42:32 -0400 Subject: [PATCH 090/250] much faster get_cor_pair_dict --- buckaroo/summary_stats.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index d151950b2..ef4ec65ec 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -75,6 +75,7 @@ def summarize_string(ser): length=l, nan_count = nan_count, distinct_count= distinct_count, + distinct_per = distinct_count/l, empty_count = empty_count, empty_per = empty_count/l, unique_per = unique_count/l, @@ -103,24 +104,23 @@ def summarize_df(df): summary_df = pd.DataFrame({col:summarize_column(df[col]) for col in df}) return summary_df - def make_num_categorical(ser): - ser_uniq = ser.dropna().unique() - name_to_idx = {name:idx for idx, name in enumerate(ser_uniq)} - #needs to be vectorized - num_categorical = ser.dropna().apply(lambda x:name_to_idx[x]) - return num_categorical + return ser.dropna().astype('category').cat.codes -def get_cor_pair_dict(df, summary_stats): - #we need to remove columns with only nans or a single value, they mess up corr() +def get_cor_pair_dict(df, sdf): + + corrable_cols = sdf.columns[ + (sdf.loc['distinct_count'] > 1) & + ((sdf.loc['distinct_per'] < .3) | + (sdf.loc['distinct_count'] < 50))] - #this needs to be vectorized - corrable_cols = [col for col in df if summary_stats[col]['distinct_count'] > 1] - num_df = pd.DataFrame({col:make_num_categorical(df[col]) for col in corrable_cols}) corr_df = num_df.corr() - high_corr_df = corr_df[corr_df > 0.99] + high_corr_df = corr_df[corr_df > 0.6] + + #print(high_corr_df) + cor_dict = {} for col in high_corr_df.columns: #columns with high correlation that aren't the column itself From 425aee32ec93f2c7e39f008fe59c4c789563e78b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 14:06:45 -0400 Subject: [PATCH 091/250] faster sample --- buckaroo/summary_stats.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index ef4ec65ec..295291a78 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -183,16 +183,12 @@ def reorder_columns(df): col_order = order_columns(tdf_stats, cpd) return df[col_order] - def get_outlier_idxs(ser): + if not pd.api.types.is_numeric_dtype(ser.dtype): + return [] outlier_idxs = [] - try: - idxs = ser.sort_values().index - except Exception as e: - print(e) - idxs = ser.index - outlier_idxs.extend(idxs[:5]) - outlier_idxs.extend(idxs[-5:]) + outlier_idxs.extend(ser.nlargest(5).index) + outlier_idxs.extend(ser.nsmallest(5).index) return outlier_idxs def sample(df, sample_size=500, include_outliers=True): From 06b0428d0e0202833a73b6a6e5273a2585a083a8 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 14:49:36 -0400 Subject: [PATCH 092/250] much faster handling, more sensible defaults of very large dataframes --- buckaroo/buckaroo_widget.py | 17 +++++++---------- buckaroo/summary_stats.py | 9 ++++++++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 7b28e7431..f1632a554 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -119,18 +119,15 @@ def __init__(self, df, cols = len(df.columns) item_count = rows * cols - - if reorderdColumns == False: - self.dfConfig['reorderdColumns'] = False - self.summary_df = df[:5] - elif item_count > FAST_SUMMARY_WHEN_GREATER: - self.dfConfig['reorderdColumns'] = False - self.summary_df = df[:5] + fast_mode = sampled or reorderdColumns + if item_count > FAST_SUMMARY_WHEN_GREATER: + fast_mode = True elif really_reorder_columns: #an override - self.dfConfig['reorderdColumns'] = True - else: - self.dfConfig['reorderdColumns'] = True + fast_mode = True + if fast_mode: + self.dfConfig['reorderdColumns'] = False + self.dfConfig['sampled'] = True diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index 295291a78..81f32e5cc 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -217,7 +217,7 @@ def add_col_rankings(df, sdf): set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) - +FAST_SUMMARY_WHEN_GREATER = 1_000_000 class DfStats(object): def __init__(self, df, @@ -227,6 +227,13 @@ def __init__(self, summary_func=summarize_df, order_col_func=order_columns): + rows = len(df) + cols = len(df.columns) + item_count = rows * cols + + + if item_count > FAST_SUMMARY_WHEN_GREATER: + df = df.sample(np.min([50_000, len(df)])) self.df = df self.sdf = summary_func(df) for func in annotate_funcs: From 2f088ecaa53191e93fffdfa1ac8fb48bdbddf1c7 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 15:09:10 -0400 Subject: [PATCH 093/250] proper respect of show transformed and show commands --- buckaroo/buckaroo_widget.py | 44 +++++-------------------------------- 1 file changed, 6 insertions(+), 38 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index f1632a554..0b708cf7f 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -33,37 +33,6 @@ def df_to_obj(df, order = None): obj['schema'] = dict(fields=fields) return obj - -''' def __init__(self, df, - sampled=True, - summaryStats=False, - reorderdColumns=True, - showTransformed=True, - showCommands=True, - really_reorder_columns=False): - super().__init__() - rows = len(df) - cols = len(df.columns) - item_count = rows * cols - - - if reorderdColumns == False: - self.dfConfig['reorderdColumns'] = False - self.summary_df = df[:5] - elif item_count > FAST_SUMMARY_WHEN_GREATER: - self.dfConfig['reorderdColumns'] = False - self.summary_df = df[:5] - elif really_reorder_columns: #an override - self.dfConfig['reorderdColumns'] = True - self.summary_df = summarize_df(df) - else: - self.dfConfig['reorderdColumns'] = True - self.summary_df = summarize_df(df) - - - -''' - FAST_SUMMARY_WHEN_GREATER = 1_000_000 class BuckarooWidget(DOMWidget): """TODO: Add docstring here @@ -88,7 +57,7 @@ class BuckarooWidget(DOMWidget): dfConfig = Dict( { - 'totalRows': 5309, + 'totalRows': 1234569, 'columns': 30, 'rowsShown': 500, 'sampleSize': 10_000, @@ -124,9 +93,7 @@ def __init__(self, df, fast_mode = True elif really_reorder_columns: #an override fast_mode = True - if fast_mode: - self.dfConfig['reorderdColumns'] = False self.dfConfig['sampled'] = True @@ -134,14 +101,15 @@ def __init__(self, df, self.stats = DfStats(df) self.summaryDf = df_to_obj(self.stats.sdf.loc[self.summary_df_cols], self.stats.col_order) - self.dfConfig.update(dict( + tempDfc = self.dfConfig.copy() + tempDfc.update(dict( totalRows=len(df), columns=len(df.columns), showTransformed=showTransformed, showCommands=showCommands)) self.df = df - self.dfConfig = self.dfConfig.copy() - self.update_based_on_df_config('foo') + self.dfConfig = tempDfc + self.update_based_on_df_config(3) self.operation_results = { 'transformed_df':self.origDf, 'generated_py_code':'#from py widget init'} @@ -157,7 +125,7 @@ def update_based_on_df_config(self, change): def df_from_dfConfig(self): if self.dfConfig['sampled']: - return sample(self.df) + return sample(self.df, self.dfConfig['sampleSize']) else: return self.df From 165eae229ea14092c6b19694d6bc475f6873cf0a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 18:47:05 -0400 Subject: [PATCH 094/250] more error tolerant summary stats --- buckaroo/summary_stats.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index 81f32e5cc..fcc6aad9b 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -73,6 +73,9 @@ def summarize_string(ser): return dict( dtype=ser.dtype, length=l, + min='', + max='', + mean='', nan_count = nan_count, distinct_count= distinct_count, distinct_per = distinct_count/l, @@ -87,11 +90,12 @@ def summarize_string(ser): def summarize_numeric(ser): - num_stats = dict( + num_stats = summarize_string(ser) + num_stats.update(dict( min=ser.min(), max=ser.max(), - mean=ser.mean()) - num_stats.update(summarize_string(ser)) + mean=ser.mean())) + return num_stats def summarize_column(ser): @@ -105,7 +109,7 @@ def summarize_df(df): return summary_df def make_num_categorical(ser): - return ser.dropna().astype('category').cat.codes + return ser.dropna().astype('category', errors='ignore').cat.codes def get_cor_pair_dict(df, sdf): @@ -238,6 +242,11 @@ def __init__(self, self.sdf = summary_func(df) for func in annotate_funcs: func(df, self.sdf) - self.cpd = get_cor_pair_dict(self.df, self.sdf) - self.col_order = order_col_func(self.sdf, self.cpd) + try: + self.cpd = get_cor_pair_dict(self.df, self.sdf) + self.col_order = order_col_func(self.sdf, self.cpd) + except Exception as e: + print(e) + self.col_order = self.df.columns + From 55247a1de8e0aa7a307c6d9aeeebbc293705a4e6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Jun 2023 18:47:53 -0400 Subject: [PATCH 095/250] pinned index column --- js/components/DFViewer.tsx | 2 +- js/components/gridUtils.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx index bc8f056eb..7d5a585fe 100644 --- a/js/components/DFViewer.tsx +++ b/js/components/DFViewer.tsx @@ -131,7 +131,7 @@ export function DFViewer( return () => clearTimeout(timer); }; - makeCondtionalAutosize(50, 10); + makeCondtionalAutosize(50, 350); return (
    { //console.log(f.name, tdf.table_hints[f.name]) - return { field: f.name, valueFormatter:getFormatter(tdf.table_hints[f.name]) }; + const colDef:ColDef = {field: f.name, valueFormatter:getFormatter(tdf.table_hints[f.name]) } + if (f.name === 'index') { + colDef.pinned = 'left'; + } + return colDef; }); return [retColumns, tdf.data]; } From 7b3db9d9eab933df3a402982cd980e90ee8173fc Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 9 Jun 2023 08:23:55 -0400 Subject: [PATCH 096/250] styles specifically targetting the dev env --- examples/App.tsx | 2 ++ js/style/dcf-npm.css | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/examples/App.tsx b/examples/App.tsx index fafcdb801..4c382f9dc 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -61,6 +61,7 @@ const App = (): JSX.Element => { return ( +

    buckaroo stuff examples

    @@ -98,6 +99,7 @@ const App = (): JSX.Element => {
    +
    ); }; diff --git a/js/style/dcf-npm.css b/js/style/dcf-npm.css index 06800fd77..cd62d846f 100644 --- a/js/style/dcf-npm.css +++ b/js/style/dcf-npm.css @@ -159,4 +159,10 @@ div.dependent-tabs ul.tabs li.active { color:black; } +.dev-examples .statusBar { + width:800px; border:3px dashed purple; + + +} + /*# sourceMappingURL=dcf-npm.css.map */ From e17d912a6ad44232ff1b2183caf9b264883cb201 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 9 Jun 2023 11:03:33 -0400 Subject: [PATCH 097/250] greek symbols for statusbar icons --- js/components/StatusBar.tsx | 51 ++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 2c5a6c9a2..988a02c5b 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -24,15 +24,36 @@ export interface DfConfig { } const columnDefs: ColDef[] = [ - { field: 'totalRows' }, - { field: 'columns' }, - { field: 'rowsShown' }, - { field: 'sampleSize' }, - { field: 'sampled' }, - { field: 'summaryStats' }, - { field: 'reorderdColumns' }, - { field: 'showTransformed'}, - { field: 'showCommands'} + { field: 'summaryStats', + headerName:'Σ', + headerTooltip:'Summary Stats', + width:30 + }, + { field: 'reorderdColumns', + headerName: "Θ", + headerTooltip:"Reorder Columns", + width:30 +}, + { field: 'showTransformed', + headerName:"Δ", + headerTooltip:"Show Transformation", + width:30 +}, + { field: 'showCommands', + headerName: "λ", + headerTooltip:"Show Commands", + width:30 +}, + + { field: 'sampled', + headerName: "Ξ", + headerTooltip:"Sampled", + width:30 +}, + { field: 'totalRows', width:100}, + { field: 'columns', width:100 }, + { field: 'rowsShown', width:120}, + { field: 'sampleSize', width:120 } ]; export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) { @@ -54,11 +75,11 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) columns, rowsShown, sampleSize, - sampled: sampled.toString(), - summaryStats: summaryStats.toString(), - reorderdColumns: reorderdColumns.toString(), - showTransformed: showTransformed.toString(), - showCommands: showCommands.toString(), + sampled: sampled ? "Ϋ" : "ό", + summaryStats: summaryStats ? "Ϋ" : "ό", + reorderdColumns: reorderdColumns ? "Ϋ" : "ό", + showTransformed: showTransformed ? "Ϋ" : "ό", + showCommands: showCommands ? "Ϋ" : "ό", }, ]; @@ -110,7 +131,7 @@ export function StatusBarEx() { sampleSize: 10_000, sampled: true, summaryStats: false, - reorderdColumns: false, + reorderdColumns: true, showTransformed: true, showCommands: true, }); From 8ce976d4bac15353ee9dfeaeafd1c67652ffe1f2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 9 Jun 2023 11:11:33 -0400 Subject: [PATCH 098/250] with timings --- example-notebooks/testcases-fast.ipynb | 184 +++++++++++++++++-------- 1 file changed, 126 insertions(+), 58 deletions(-) diff --git a/example-notebooks/testcases-fast.ipynb b/example-notebooks/testcases-fast.ipynb index 49776dd7a..8c6ee8ddd 100644 --- a/example-notebooks/testcases-fast.ipynb +++ b/example-notebooks/testcases-fast.ipynb @@ -28,10 +28,20 @@ "execution_count": 2, "id": "30063897-1b67-4507-a3b8-0d98ab0f4b9f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3962 566 7\n", + "39.5 ms ± 674 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], "source": [ "df = pd.read_parquet('banklist.parquet')\n", - "bw = BuckarooWidget(df)" + "print(len(df) * len(df.columns), len(df), len(df.columns))\n", + "%timeit bw = BuckarooWidget(df)" ] }, { @@ -39,124 +49,180 @@ "execution_count": 3, "id": "dd8b3a75-a615-402d-9c6c-fc57c2759fe4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "83070 6390 13\n", + "54 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], "source": [ "df2 = pd.read_csv('death-by-suicide-hispanic.csv')\n", - "bw = BuckarooWidget(df2)" + "print(len(df2) * len(df2.columns), len(df2), len(df2.columns))\n", + "%timeit bw = BuckarooWidget(df2)" ] }, { "cell_type": "code", "execution_count": 4, - "id": "c223dcb4-a354-4f3a-b492-e6ae33c99188", - "metadata": {}, - "outputs": [], - "source": [ - "df3 = pd.read_parquet('Covid-data.gzip.parquet')\n", - "bw = BuckarooWidget(df3)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "c1c73c91-0343-417a-a45f-ef5f8c39e884", + "id": "5e338ccf-5a61-457d-addd-bdfd8510aa86", "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/th/jfr8ccjx09g2j_18ty_t3xnh0000gn/T/ipykernel_93516/1813779222.py:1: DtypeWarning: Columns (2) have mixed types. Specify dtype option on import or set low_memory=False.\n", - " df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n" - ] - }, { "name": "stdout", "output_type": "stream", "text": [ - "'<' not supported between instances of 'float' and 'str'\n" + "168014 12001 14\n", + "62.5 ms ± 857 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ - "df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n", - "bw = BuckarooWidget(df4)" + "df10 = pd.read_csv('Machine_readable_file_bd_employ.csv')\n", + "print(len(df10) * len(df10.columns), len(df10), len(df10.columns))\n", + "%timeit bw = BuckarooWidget(df10)" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "97851149-49b4-41e2-a14f-ee9fbfcf7848", + "execution_count": 5, + "id": "dd5b1809-5d8d-4c26-b263-165592918b2a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "436005 48445 9\n", + "93 ms ± 209 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], "source": [ - "df5 = pd.read_parquet('2014-01-citibike-trip-data.parquet')\n", - "bw = BuckarooWidget(df5)" + "df9 = pd.read_csv('scorecard.csv')\n", + "print(len(df9) * len(df9.columns), len(df9), len(df9.columns))\n", + "%timeit bw = BuckarooWidget(df9)" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "415dc2c0-dd8f-457b-a4f2-e067003ccb4b", + "execution_count": 6, + "id": "5159536e-bad0-46cd-ba99-77c17f42dacd", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "147044529 5070501 29\n", + "104 ms ± 581 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], "source": [ "df6 = pd.read_parquet('1993-flights.gzip.parquet')\n", - "bw = BuckarooWidget(df6[:10_000])" + "print(len(df6) * len(df6.columns), len(df6), len(df6.columns))\n", + "%timeit bw = BuckarooWidget(df6[:10_000])" ] }, { "cell_type": "code", - "execution_count": 9, - "id": "ddcc8ec2-4045-4fa3-a80f-cde9e1864dff", + "execution_count": 7, + "id": "c223dcb4-a354-4f3a-b492-e6ae33c99188", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2000000 200000 10\n", + "124 ms ± 719 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" + ] + } + ], "source": [ "df8 = pd.read_csv('train_extended.csv')\n", - "bw = BuckarooWidget(df8)" + "print(len(df8) * len(df8.columns), len(df8), len(df8.columns))\n", + "%timeit bw = BuckarooWidget(df8)" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "1bb274bb-27b0-4bb4-b296-7c246ced9ce5", + "execution_count": 2, + "id": "c1c73c91-0343-417a-a45f-ef5f8c39e884", "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "error reordering columns cannot reindex on an axis with duplicate labels\n" + "/var/folders/th/jfr8ccjx09g2j_18ty_t3xnh0000gn/T/ipykernel_11944/805401924.py:1: DtypeWarning: Columns (2) have mixed types. Specify dtype option on import or set low_memory=False.\n", + " df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n" ] }, { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "/Users/paddy/buckaroo/buckaroo/summary_stats.py:184: FutureWarning: reindexing with a non-unique Index is deprecated and will raise in a future version.\n", - " sdf.loc['is_duplicate':, duplicate_cols] = -5\n" + "2912624 43472 67\n", + "622 ms ± 9.39 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ - "df9 = pd.read_csv('scorecard.csv')\n", - "bw = BuckarooWidget(df9)" + "df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n", + "print(len(df4) * len(df4.columns), len(df4), len(df4.columns))\n", + "%timeit bw = BuckarooWidget(df4)" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "8e620ba5-7883-4422-9223-d4e67e03b243", + "execution_count": 3, + "id": "97851149-49b4-41e2-a14f-ee9fbfcf7848", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4506000 300400 15\n", + "249 ms ± 7.34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], "source": [ - "df10 = pd.read_csv('Machine_readable_file_bd_employ.csv')\n", - "bw = BuckarooWidget(df10)" + "df5 = pd.read_parquet('2014-01-citibike-trip-data.parquet')\n", + "print(len(df5) * len(df5.columns), len(df5), len(df5.columns))\n", + "%timeit bw = BuckarooWidget(df5)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1bb274bb-27b0-4bb4-b296-7c246ced9ce5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22020075 1048575 21\n", + "395 ms ± 5.73 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "df3 = pd.read_parquet('Covid-data.gzip.parquet')\n", + "print(len(df3) * len(df3.columns), len(df3), len(df3.columns))\n", + "%timeit bw = BuckarooWidget(df3)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "id": "12553bd6-be53-4001-be9a-dfc939981d38", "metadata": {}, "outputs": [ @@ -164,7 +230,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "12.7 s ± 2.16 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "2.09 s ± 18.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -175,10 +241,12 @@ { "cell_type": "code", "execution_count": null, - "id": "5d790153-359a-45dd-8b88-bfd87a5eb7f8", + "id": "257f2303-2b64-447b-8523-f8defac60cd9", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "%prun -s cumtime " + ] } ], "metadata": { From 45ac4cbe953762fddd8d7aa652992776946e49ea Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 9 Jun 2023 15:24:46 -0400 Subject: [PATCH 099/250] this exact repo config worked to build a package and upload it. praies the lord --- full_build.sh | 4 +- package.json | 13 +- pyproject.toml | 9 +- tsconfig.json | 2 +- webpack.config.js | 15 +- yarn.lock | 1636 +++++++++++++++++++++++++-------------------- 6 files changed, 941 insertions(+), 738 deletions(-) diff --git a/full_build.sh b/full_build.sh index 7aac4e27b..17daf733f 100755 --- a/full_build.sh +++ b/full_build.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -rm -rf node_modules -rm -rf dist +#rm -rf node_modules +#rm -rf dist python -m build . rm dist/index.js dist/index.js.LICENSE.txt twine check dist/* diff --git a/package.json b/package.json index 14c697aa1..0fa606fdc 100644 --- a/package.json +++ b/package.json @@ -33,22 +33,23 @@ "url": "https://github.com/paddymul/buckaroo" }, "scripts": { - "build": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension", - "build:dev": "yarn run build:lib && yarn run build:nbextension && yarn run build:labextension:dev", + "build": "npm run build:lib && npm run build:labextension", + "build-full": "npm run build:lib && run build:nbextension && npm run build:labextension", + "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev", "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "jupyter labextension build --development True .", + "build:labextension:dev": "which jupyter && jupyter labextension build --development True .", "build:lib": "tsc", "build:nbextension": "webpack --mode=production --no-devtool", "build:widget-examples": "cd widget-examples/basic && webpack --mode=production", - "build:all": "yarn run build:labextension && yarn run build:nbextension && yarn run build:widget-examples", - "clean": "rimraf dist && yarn run clean:lib && yarn run clean:labextension && yarn run clean:nbextension", + "build:all": "npm run build:labextension && npm run build:nbextension && npm run build:widget-examples", + "clean": "rimraf dist && npm run clean:lib && npm run clean:labextension && npm run clean:nbextension", "clean:lib": "rimraf lib", "clean:labextension": "rimraf buckaroo/labextension", "clean:nbextension": "rimraf buckaroo/nbextension/index.*", "lint": "eslint 'js/**/*.{ts,tsx}'", "lint:check": "eslint 'js/**/*.{ts,tsx}'", "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", - "prepack": "yarn run build:labextension && yarn run build:nbextension", + "prepack": "npm run build:labextension && npm run build:nbextension", "test": "jest --verbose --passWithNoTests", "watch": "npm-run-all -p watch:*", "watch:lib": "tsc -w", diff --git a/pyproject.toml b/pyproject.toml index 580d56a9d..8cb13aee7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,20 +85,21 @@ exclude = [ ] [tool.hatch.build.hooks.jupyter-builder] + ensured-targets = [ "buckaroo/nbextension/index.js", "buckaroo/labextension/package.json", ] -dependencies = [ - "hatch-jupyter-builder>=0.8.1", -] +#"hatch-jupyter-builder>=0.8.1", +dependencies = ["hatch-jupyter-builder@file:///Users/paddy/code/hatch-jupyter-builder"] + build-function = "hatch_jupyter_builder.npm_builder" [tool.hatch.build.hooks.jupyter-builder.build-kwargs] path = "." build_cmd = "build" npm = [ - "yarn", + "npm", ] [tool.isort] diff --git a/tsconfig.json b/tsconfig.json index 660a404e7..eae169e1b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,7 +20,7 @@ "jsx": "react", "baseUrl": "." }, - "include": ["js/*.ts", "js/*.tsx", "js/core/*.ts", "js/core/*.tsx", "js/core/*"], + "include": ["js/*.ts", "js/*.tsx", "js/core/*.ts", "js/core/*.tsx", ], "ts-node": { "transpileOnly": true } diff --git a/webpack.config.js b/webpack.config.js index 160d74ee5..b4a7912c1 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,6 +14,9 @@ const cryptoOrigCreateHash = crypto.createHash; crypto.createHash = (algorithm) => cryptoOrigCreateHash(algorithm == 'md4' ? 'sha256' : algorithm); +const performance = { + maxAssetSize: 100_000_000, +}; // Custom webpack rules const baseRules = [ @@ -105,8 +108,8 @@ module.exports = [ plugins: [new HtmlWebpackPlugin({ //template: './examples/index.html' template: './examples/index.html' - })] - + })], + performance }, @@ -132,6 +135,8 @@ module.exports = [ // plugins: [new HtmlWebpackPlugin({ // template: './examples/index.html' // })] + performance + }, @@ -162,7 +167,9 @@ module.exports = [ resolve, devServer: { port: 8030 - } + }, + performance + }, /** @@ -184,5 +191,7 @@ module.exports = [ devtool: 'source-map', externals, resolve, + performance + }, ]; diff --git a/yarn.lock b/yarn.lock index d23f4e1aa..eeab12e52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,45 +26,45 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz" integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": - version "7.21.7" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz" - integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.6.3": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.4.0-0", "@babel/core@^7.6.3", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.21.5", "@babel/generator@^7.7.2": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz" - integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== +"@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.3" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -77,51 +77,51 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz" - integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g== + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz" + integrity sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.3" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz" - integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== dependencies: - "@babel/compat-data" "^7.21.5" + "@babel/compat-data" "^7.22.0" "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz" - integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== +"@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz" + integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.5" + "@babel/helper-member-expression-to-functions" "^7.22.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.21.5" + "@babel/helper-replace-supers" "^7.22.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz" - integrity sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz" + integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.3.1" semver "^6.3.0" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-define-polyfill-provider@^0.4.0": + version "0.4.0" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz" + integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== dependencies: "@babel/helper-compilation-targets" "^7.17.7" "@babel/helper-plugin-utils" "^7.16.7" @@ -130,10 +130,10 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== "@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" @@ -150,12 +150,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz" - integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== +"@babel/helper-member-expression-to-functions@^7.22.0": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz" + integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.3" "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": version "7.21.4" @@ -164,19 +164,19 @@ dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz" - integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== dependencies: - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-module-imports" "^7.21.4" "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -200,17 +200,17 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz" - integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz" + integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== dependencies: - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-member-expression-to-functions" "^7.21.5" + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-member-expression-to-functions" "^7.22.0" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" "@babel/helper-simple-access@^7.21.5": version "7.21.5" @@ -258,14 +258,14 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz" - integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== +"@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" "@babel/highlight@^7.18.6": version "7.18.6" @@ -276,10 +276,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz" - integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -288,125 +288,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz" + integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-optional-chaining" "^7.22.3" "@babel/plugin-proposal-private-property-in-object@^7.21.0": version "7.21.0" @@ -418,7 +307,7 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -475,6 +364,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@babel/plugin-syntax-import-attributes@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz" + integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" @@ -545,13 +441,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": +"@babel/plugin-syntax-typescript@^7.21.4", "@babel/plugin-syntax-typescript@^7.7.2": version "7.21.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz" integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-arrow-functions@^7.21.5": version "7.21.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz" @@ -559,6 +463,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.21.5" +"@babel/plugin-transform-async-generator-functions@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz" + integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== + dependencies: + "@babel/helper-environment-visitor" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-transform-async-to-generator@^7.20.7": version "7.20.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" @@ -582,6 +496,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" +"@babel/plugin-transform-class-properties@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz" + integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-class-static-block@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz" + integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-transform-classes@^7.21.0": version "7.21.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz" @@ -627,6 +558,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-dynamic-import@^7.22.1": + version "7.22.1" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz" + integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" @@ -635,6 +574,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-export-namespace-from@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz" + integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-transform-for-of@^7.21.5": version "7.21.5" resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz" @@ -651,6 +598,14 @@ "@babel/helper-function-name" "^7.18.9" "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-json-strings@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz" + integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-transform-literals@^7.18.9": version "7.18.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" @@ -658,6 +613,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-logical-assignment-operators@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz" + integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-transform-member-expression-literals@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" @@ -682,14 +645,14 @@ "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-simple-access" "^7.21.5" -"@babel/plugin-transform-modules-systemjs@^7.20.11": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-modules-systemjs@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz" + integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": @@ -700,20 +663,47 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz" + integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-new-target@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz" + integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz" + integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz" + integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz" + integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== + dependencies: + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.3" "@babel/plugin-transform-object-super@^7.18.6": version "7.18.6" @@ -723,12 +713,47 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== +"@babel/plugin-transform-optional-catch-binding@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz" + integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz" + integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz" + integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-methods@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz" + integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz" + integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-transform-property-literals@^7.18.6": version "7.18.6" @@ -789,14 +814,14 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-transform-typescript@^7.16.7": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz" - integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz" + integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-create-class-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-typescript" "^7.21.4" "@babel/plugin-transform-unicode-escapes@^7.21.5": version "7.21.5" @@ -805,6 +830,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.21.5" +"@babel/plugin-transform-unicode-property-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz" + integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" @@ -813,38 +846,33 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-transform-unicode-sets-regex@^7.22.3": + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz" + integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.1" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/preset-env@^7.6.11": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz" - integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz" + integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== dependencies: - "@babel/compat-data" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" + "@babel/compat-data" "^7.22.3" + "@babel/helper-compilation-targets" "^7.22.1" "@babel/helper-plugin-utils" "^7.21.5" "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-attributes" "^7.22.3" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -855,28 +883,43 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.3" "@babel/plugin-transform-async-to-generator" "^7.20.7" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-class-properties" "^7.22.3" + "@babel/plugin-transform-class-static-block" "^7.22.3" "@babel/plugin-transform-classes" "^7.21.0" "@babel/plugin-transform-computed-properties" "^7.21.5" "@babel/plugin-transform-destructuring" "^7.21.3" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-dynamic-import" "^7.22.1" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-export-namespace-from" "^7.22.3" "@babel/plugin-transform-for-of" "^7.21.5" "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-json-strings" "^7.22.3" "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" "@babel/plugin-transform-member-expression-literals" "^7.18.6" "@babel/plugin-transform-modules-amd" "^7.20.11" "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" + "@babel/plugin-transform-modules-systemjs" "^7.22.3" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" + "@babel/plugin-transform-new-target" "^7.22.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" + "@babel/plugin-transform-numeric-separator" "^7.22.3" + "@babel/plugin-transform-object-rest-spread" "^7.22.3" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" + "@babel/plugin-transform-optional-catch-binding" "^7.22.3" + "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-private-methods" "^7.22.3" + "@babel/plugin-transform-private-property-in-object" "^7.22.3" "@babel/plugin-transform-property-literals" "^7.18.6" "@babel/plugin-transform-regenerator" "^7.21.5" "@babel/plugin-transform-reserved-words" "^7.18.6" @@ -886,13 +929,15 @@ "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" "@babel/plugin-transform-unicode-escapes" "^7.21.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.3" "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" + "@babel/types" "^7.22.4" + babel-plugin-polyfill-corejs2 "^0.4.3" + babel-plugin-polyfill-corejs3 "^0.8.1" + babel-plugin-polyfill-regenerator "^0.5.0" + core-js-compat "^3.30.2" semver "^6.3.0" "@babel/preset-modules@^0.1.5": @@ -921,41 +966,41 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz" - integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== + version "7.22.3" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz" + integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3": + version "7.21.9" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" -"@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== +"@babel/traverse@^7.20.5", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== dependencies: "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== dependencies: "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" @@ -967,9 +1012,11 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@blueprintjs/colors@^4.0.0-alpha.3": - version "4.1.22" - resolved "https://registry.npmjs.org/@blueprintjs/colors/-/colors-4.1.22.tgz" - integrity sha512-qcC7nWW9TTSS7aDxE5gbo9vrxo+IOpC6/Kzpi0rdOBYFDd02PppCdnCCjGYw1/IopSsZ9EWqDLmD7zuy0H+WEA== + version "4.2.1" + resolved "https://registry.npmjs.org/@blueprintjs/colors/-/colors-4.2.1.tgz" + integrity sha512-Cx7J2YnUuxn+fi+y5XtXnBB7+cFHN4xBrRkaAetp78i3VTCXjUk+d1omrOr8TqbRucUXTdrhbZOUHpzRLFcJpQ== + dependencies: + tslib "~2.5.0" "@blueprintjs/core@^3.36.0", "@blueprintjs/core@^3.54.0": version "3.54.0" @@ -1155,9 +1202,9 @@ integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== "@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + version "0.11.10" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1378,7 +1425,7 @@ slash "^3.0.0" write-file-atomic "^4.0.1" -"@jest/types@^28.1.3": +"@jest/types@^28.0.0", "@jest/types@^28.1.3": version "28.1.3" resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== @@ -1409,7 +1456,7 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": +"@jridgewell/source-map@^0.3.3": version "0.3.3" resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz" integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== @@ -1417,16 +1464,16 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -1456,17 +1503,17 @@ lodash "^4.17.4" "@jupyterlab/apputils@^3.0.2": - version "3.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/apputils/-/apputils-3.6.3.tgz" - integrity sha512-um2Aaa5fOUwHFpAqKTDA+MFpnAldzOILIi5QsKOWRxiJA2W8x+hlg5HvHbq+eSWuWEU3ah15M7htzBcL3g9d4Q== - dependencies: - "@jupyterlab/coreutils" "^5.6.3" - "@jupyterlab/observables" "^4.6.3" - "@jupyterlab/services" "^6.6.3" - "@jupyterlab/settingregistry" "^3.6.3" - "@jupyterlab/statedb" "^3.6.3" - "@jupyterlab/translation" "^3.6.3" - "@jupyterlab/ui-components" "^3.6.3" + version "3.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/apputils/-/apputils-3.6.4.tgz" + integrity sha512-NUBcUv30HTWh5svKc46mE82gGpL9u2BxdYQRrtMpZmE2Dy4oFOnArdff2qYICBRtIbVZWwmyeYMBJbZV7Wb5ow== + dependencies: + "@jupyterlab/coreutils" "^5.6.4" + "@jupyterlab/observables" "^4.6.4" + "@jupyterlab/services" "^6.6.4" + "@jupyterlab/settingregistry" "^3.6.4" + "@jupyterlab/statedb" "^3.6.4" + "@jupyterlab/translation" "^3.6.4" + "@jupyterlab/ui-components" "^3.6.4" "@lumino/algorithm" "^1.9.0" "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" @@ -1485,9 +1532,9 @@ url "^0.11.0" "@jupyterlab/builder@^3.0.1": - version "3.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/builder/-/builder-3.6.3.tgz" - integrity sha512-oY1a/r75RMoPzhSmuVu+DfjL0cKk1ceHTniZsM2wPuhjjyoF875u6CDzArJatpOOuTgLm7CY5OcU3LCIK1OAgg== + version "3.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/builder/-/builder-3.6.4.tgz" + integrity sha512-ycTW4P7VRF+67JCb/PlJ358CBsoUYxxkiAEkR6R9QJEY0Zk4S4NuuHq2Sv87Zclpj+xlrxlnSR9WaLq8zEvR7A== dependencies: "@lumino/algorithm" "^1.9.0" "@lumino/application" "^1.31.4" @@ -1525,10 +1572,10 @@ webpack-merge "^5.1.2" worker-loader "^3.0.2" -"@jupyterlab/coreutils@^5.6.3": - version "5.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-5.6.3.tgz" - integrity sha512-jRVTpwGzP9wBNYuaZTip89FS1qbeSYrEO2qdNVdW2rs0mQHcIlu3Fkv5muMFmKYGi0XHhG3UhZiWQ7qiPw2svQ== +"@jupyterlab/coreutils@^5.6.4": + version "5.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-5.6.4.tgz" + integrity sha512-KKZcX+b4YPhoOkDKpxPXhc/QUmPNImgcsVsxceCNrznXNxLwwQcreSCMfKQ+i9Z1QayvYUETphAO5dUmfUQkjg== dependencies: "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" @@ -1538,17 +1585,17 @@ path-browserify "^1.0.0" url-parse "~1.5.1" -"@jupyterlab/nbformat@^3.6.3": - version "3.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/nbformat/-/nbformat-3.6.3.tgz" - integrity sha512-0qJLa4dtOmu9EmHFeM7gaZi4qheovIPc9ZrgGGRuG0obajs4YYlvh4MQvCSgpVhme4AuBfGlcfzhlx+Gbzr5Xw== +"@jupyterlab/nbformat@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/nbformat/-/nbformat-3.6.4.tgz" + integrity sha512-FIXm3PjtVJOyd+og8mMBcKMgSSq5iGf11rDH9rjFzd1Uo6TwCBiKmkipyAaa8wVcB07A5ocpU0wCE/do2m24kg== dependencies: "@lumino/coreutils" "^1.11.0" -"@jupyterlab/observables@^4.6.3": - version "4.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/observables/-/observables-4.6.3.tgz" - integrity sha512-CvQoL+9WHXOy/CXp/PQLi4c5iZVJ4psz11+GrycDDinX1AdVQ8a43OLTC0gxWl3Tk2C8ZvAi1sgn4FS68E1ACQ== +"@jupyterlab/observables@^4.6.4": + version "4.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/observables/-/observables-4.6.4.tgz" + integrity sha512-HqIYzHj+HYWnZTFMWr6b0GG92UfrFk7k8ihLlVm0W289Pz+0YlOBPgXhEJsTPPIm+YiICXD8WzvySXUWo92ryA== dependencies: "@lumino/algorithm" "^1.9.0" "@lumino/coreutils" "^1.11.0" @@ -1556,16 +1603,16 @@ "@lumino/messaging" "^1.10.0" "@lumino/signaling" "^1.10.0" -"@jupyterlab/services@^6.0.0", "@jupyterlab/services@^6.6.3": - version "6.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/services/-/services-6.6.3.tgz" - integrity sha512-BxEOMRl9X18T5wY7iV6ZJhARnibFghpD3OruqeSbnGdbRv6XJi8prsRbCQQ6Mf9agvf81B20KmDvYKikPHC0xQ== +"@jupyterlab/services@^6.0.0", "@jupyterlab/services@^6.6.4": + version "6.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/services/-/services-6.6.4.tgz" + integrity sha512-qtPnCfPWyKvQmr5w/YLO3+Tif1fYkJvCAufLljiWpAORFF06LvURbP9Lb+GOsXS9VHZQTcXLBv8sdlQSbj5qNg== dependencies: - "@jupyterlab/coreutils" "^5.6.3" - "@jupyterlab/nbformat" "^3.6.3" - "@jupyterlab/observables" "^4.6.3" - "@jupyterlab/settingregistry" "^3.6.3" - "@jupyterlab/statedb" "^3.6.3" + "@jupyterlab/coreutils" "^5.6.4" + "@jupyterlab/nbformat" "^3.6.4" + "@jupyterlab/observables" "^4.6.4" + "@jupyterlab/settingregistry" "^3.6.4" + "@jupyterlab/statedb" "^3.6.4" "@lumino/algorithm" "^1.9.0" "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" @@ -1574,12 +1621,12 @@ node-fetch "^2.6.0" ws "^7.4.6" -"@jupyterlab/settingregistry@^3.6.3": - version "3.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/settingregistry/-/settingregistry-3.6.3.tgz" - integrity sha512-pnzIge0ZC8V63R97HiNroJ0eaPM0DN6x65SStyLuv/K8Qez4XqpOdc0Wfell5ri5mxMvm1qKekuFeTikqSXQKQ== +"@jupyterlab/settingregistry@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/settingregistry/-/settingregistry-3.6.4.tgz" + integrity sha512-DD3qrd2X6fvkC67MlNkPlHZBh14mecu5+fkE8KBbAQwPZsn9E/JdOVbNVc3sd5Jl/hzobGdtcMhQUTfK46g6ow== dependencies: - "@jupyterlab/statedb" "^3.6.3" + "@jupyterlab/statedb" "^3.6.4" "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" "@lumino/disposable" "^1.10.0" @@ -1587,10 +1634,10 @@ ajv "^6.12.3" json5 "^2.1.1" -"@jupyterlab/statedb@^3.6.3": - version "3.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/statedb/-/statedb-3.6.3.tgz" - integrity sha512-A36L+0NN8f0WOES2GdtZjp9uFuC7IBjhKiO/RlKRX5AFjNxoJ9oO3PZtoxJQYPnGBljMqVdRa+m9aYEfvKhYyQ== +"@jupyterlab/statedb@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/statedb/-/statedb-3.6.4.tgz" + integrity sha512-sfbAMU7wTf8pzdyW1TLOUzdki1wu7amtDD9JgrD6RrUXTve9QaiKjC+FenFEBPMzogWDogZGAtBEoTLMY+k3pg== dependencies: "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" @@ -1598,25 +1645,25 @@ "@lumino/properties" "^1.8.0" "@lumino/signaling" "^1.10.0" -"@jupyterlab/translation@^3.6.3": - version "3.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/translation/-/translation-3.6.3.tgz" - integrity sha512-m+wwBv/hiN5Y6Sb7Ij150ZhPXZdhN5wI8CT3afnzARwKr2Aww5AIURO3upmMwnKaPVQTrWqsS3+7bZS/21JuJA== +"@jupyterlab/translation@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/translation/-/translation-3.6.4.tgz" + integrity sha512-iPMH6eta1UdR82pR40JPBXOnjtQ5JinuVziojE9NlbR8J0/y/Yka2QPt1x3Pt4t+6+wF/No5NtbY/u+i5wPkYw== dependencies: - "@jupyterlab/coreutils" "^5.6.3" - "@jupyterlab/services" "^6.6.3" - "@jupyterlab/statedb" "^3.6.3" + "@jupyterlab/coreutils" "^5.6.4" + "@jupyterlab/services" "^6.6.4" + "@jupyterlab/statedb" "^3.6.4" "@lumino/coreutils" "^1.11.0" -"@jupyterlab/ui-components@^3.6.3": - version "3.6.3" - resolved "https://registry.npmjs.org/@jupyterlab/ui-components/-/ui-components-3.6.3.tgz" - integrity sha512-XzseUo2IXclPlYcGxCIz8evjWF+dCBMmbJlvoE5OF29BYBvI5N/DUaTem8bHN5kmQwHIXX6BImHu7rbC9Xjl6w== +"@jupyterlab/ui-components@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@jupyterlab/ui-components/-/ui-components-3.6.4.tgz" + integrity sha512-Xkms2fWLVUBGG/2DFRhyJq2LOjlGATMcb2Cw0/zHlTWDdzUw4n8EvzikvvyOY20twt8hYiBsHs+JmCSLw974LA== dependencies: "@blueprintjs/core" "^3.36.0" "@blueprintjs/select" "^3.15.0" - "@jupyterlab/coreutils" "^5.6.3" - "@jupyterlab/translation" "^3.6.3" + "@jupyterlab/coreutils" "^5.6.4" + "@jupyterlab/translation" "^3.6.4" "@lumino/algorithm" "^1.9.0" "@lumino/commands" "^1.19.0" "@lumino/coreutils" "^1.11.0" @@ -1766,7 +1813,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1835,9 +1882,9 @@ "@sinonjs/commons" "^1.7.0" "@types/babel__core@^7.1.14": - version "7.20.0" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -1861,11 +1908,11 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.5" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz" - integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/backbone@1.4.14": version "1.4.14" @@ -1919,9 +1966,9 @@ "@types/estree" "*" "@types/eslint@*": - version "8.37.0" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz" - integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== + version "8.40.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz" + integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2005,9 +2052,9 @@ "@types/sizzle" "*" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.12" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" @@ -2015,9 +2062,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.134": - version "4.14.194" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== + version "4.14.195" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/mime@*", "@types/mime@^1": version "1.3.2" @@ -2035,9 +2082,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + version "2.7.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": version "15.7.5" @@ -2055,25 +2102,25 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^18.0.0": - version "18.2.1" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.1.tgz" - integrity sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w== + version "18.2.4" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz" + integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.0": - version "18.2.0" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz" - integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA== + version "18.2.8" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz" + integrity sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17.0.0": - version "17.0.58" - resolved "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz" - integrity sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A== + version "17.0.60" + resolved "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz" + integrity sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2152,9 +2199,9 @@ source-map "^0.6.1" "@types/underscore@*": - version "1.11.4" - resolved "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz" - integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== + version "1.11.5" + resolved "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.5.tgz" + integrity sha512-b8e//LrIlhoXaaBcMC0J/s2/lIF9y5VJYKqbW4nA+tW/nqqDk1Dacd1ULLT7zgGsKs7PGbSnqCPzqEniZ0RxYg== "@types/webpack-dev-server@^3.11.1": version "3.11.6" @@ -2168,11 +2215,20 @@ http-proxy-middleware "^1.0.0" "@types/webpack-env@^1.13.6": - version "1.18.0" - resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz" - integrity sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg== + version "1.18.1" + resolved "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.1.tgz" + integrity sha512-D0HJET2/UY6k9L6y3f5BL+IDxZmPkYmPT4+qBrRdmRLYRuV0qNKizMgTvYxXZYn+36zjPeoDZAEYBCM6XB+gww== -"@types/webpack-sources@*", "@types/webpack-sources@^0.1.5": +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack-sources@^0.1.5": version "0.1.9" resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz" integrity sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new== @@ -2228,7 +2284,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.9.1": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.9.1": version "5.59.8" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz" integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== @@ -2296,125 +2352,125 @@ "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" -"@webassemblyjs/ast@1.11.5", "@webassemblyjs/ast@^1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz" - integrity sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ== +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz" - integrity sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz" - integrity sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz" - integrity sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg== +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@webassemblyjs/helper-numbers@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz" - integrity sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.5" - "@webassemblyjs/helper-api-error" "1.11.5" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz" - integrity sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz" - integrity sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA== +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz" - integrity sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz" - integrity sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz" - integrity sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ== +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz" - integrity sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/helper-wasm-section" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-opt" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - "@webassemblyjs/wast-printer" "1.11.5" - -"@webassemblyjs/wasm-gen@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz" - integrity sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - -"@webassemblyjs/wasm-opt@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz" - integrity sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-buffer" "1.11.5" - "@webassemblyjs/wasm-gen" "1.11.5" - "@webassemblyjs/wasm-parser" "1.11.5" - -"@webassemblyjs/wasm-parser@1.11.5", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz" - integrity sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew== - dependencies: - "@webassemblyjs/ast" "1.11.5" - "@webassemblyjs/helper-api-error" "1.11.5" - "@webassemblyjs/helper-wasm-bytecode" "1.11.5" - "@webassemblyjs/ieee754" "1.11.5" - "@webassemblyjs/leb128" "1.11.5" - "@webassemblyjs/utf8" "1.11.5" - -"@webassemblyjs/wast-printer@1.11.5": - version "1.11.5" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz" - integrity sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA== - dependencies: - "@webassemblyjs/ast" "1.11.5" + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.2.0": @@ -2457,27 +2513,37 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + acorn@^6.2.0: version "6.4.2" resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn@^8, acorn@^8.7.1: version "8.8.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -ag-grid-community@^29.2.0: +acorn@^8.8.2: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ag-grid-community@^29.2.0, ag-grid-community@~29.3.5: version "29.3.5" resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.5.tgz" integrity sha512-LxUo21f2/CH31ACEs1C7Q/ggGGI1fQPSTB4aY5OThmM+lBkygZ7QszBE8jpfgWOIjvjdtcdIeQbmbjkHeMsA7A== @@ -2516,7 +2582,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0, ajv@^6.9.1: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2526,7 +2592,7 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2620,16 +2686,16 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" @@ -2710,7 +2776,7 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-jest@^28, babel-jest@^28.1.3: +babel-jest@^28, babel-jest@^28.0.0, babel-jest@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== @@ -2751,29 +2817,29 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.3: + version "0.4.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz" + integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== dependencies: "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.0" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz" + integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.0" + core-js-compat "^3.30.1" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz" + integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.0" babel-plugin-transform-es2015-modules-commonjs@^6.26.2: version "6.26.2" @@ -2943,15 +3009,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5, "browserslist@>= 4.21.0": + version "4.21.7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz" + integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + caniuse-lite "^1.0.30001489" + electron-to-chromium "^1.4.411" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" bs-logger@0.x: version "0.2.6" @@ -3037,10 +3103,10 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: - version "1.0.30001482" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz" - integrity sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ== +caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489: + version "1.0.30001492" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz" + integrity sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw== chalk@^1.1.3: version "1.1.3" @@ -3053,7 +3119,25 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.3.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.4.1: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3075,7 +3159,7 @@ char-regex@^1.0.2: resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.5.3: +chokidar@^3.4.0, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3187,20 +3271,20 @@ color-convert@^1.9.0: color-convert@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -3211,7 +3295,12 @@ commander@^2.20.0: resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1, commander@^4.1.1: +commander@^4.0.1: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== @@ -3317,17 +3406,17 @@ cookie@0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -core-js-compat@^3.25.1: - version "3.30.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz" - integrity sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw== +core-js-compat@^3.30.1, core-js-compat@^3.30.2: + version "3.30.2" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== dependencies: browserslist "^4.21.5" core-js-pure@^3.6.5: - version "3.30.1" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.1.tgz" - integrity sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg== + version "3.30.2" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz" + integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg== core-js@^2.4.0: version "2.6.12" @@ -3385,6 +3474,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz" + integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== + css-blank-pseudo@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" @@ -3446,16 +3540,16 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@3.0.10: - version "3.0.10" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - csstype@^3.0.2: version "3.1.2" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +csstype@3.0.10: + version "3.0.10" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" @@ -3465,7 +3559,7 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -debug@2.6.9, debug@^2.6.8: +debug@^2.6.8: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3479,6 +3573,13 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" @@ -3526,16 +3627,16 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -3666,10 +3767,10 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.284: - version "1.4.380" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.380.tgz" - integrity sha512-XKGdI4pWM78eLH2cbXJHiBnWUwFSzZM7XujsB6stDiGu9AeSqziedP6amNLpJzE3i0rLTcfAwdCTs5ecP5yeSg== +electron-to-chromium@^1.4.411: + version "1.4.417" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.417.tgz" + integrity sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA== emittery@^0.10.2: version "0.10.2" @@ -3707,15 +3808,7 @@ enhanced-resolve@^4.0.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.13.0: - version "5.13.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz" - integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enhanced-resolve@^5.7.0: +enhanced-resolve@^5.14.1, enhanced-resolve@^5.7.0: version "5.14.1" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz" integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== @@ -3723,7 +3816,7 @@ enhanced-resolve@^5.7.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6: +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.3.6" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3887,7 +3980,7 @@ eslint-plugin-react@^7.28.0: semver "^6.3.0" string.prototype.matchall "^4.0.8" -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-scope@^5.1.1, eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -3908,7 +4001,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@^8.6.0: +eslint@*, "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.6.0, eslint@>=7.0.0, eslint@>=7.28.0: version "8.41.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz" integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== @@ -4100,9 +4193,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9: version "3.2.12" @@ -4115,7 +4208,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@2.x: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -4158,7 +4251,7 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@~6.0.0: +file-loader@*, file-loader@~6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz" integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== @@ -4296,9 +4389,9 @@ fs-minipass@^2.0.0: minipass "^3.0.0" fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + version "1.0.4" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== fs-readdir-recursive@^1.1.0: version "1.1.0" @@ -4346,12 +4439,13 @@ get-caller-file@^2.0.5: integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-own-enumerable-property-symbols@^3.0.0: @@ -4657,6 +4751,16 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -4668,16 +4772,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" @@ -4724,13 +4818,6 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" @@ -4738,6 +4825,13 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" @@ -4792,7 +4886,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4823,16 +4917,16 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" @@ -4883,9 +4977,9 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.12.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== + version "2.12.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" @@ -5036,16 +5130,16 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -5300,7 +5394,7 @@ jest-resolve-dependencies@^28.1.3: jest-regex-util "^28.0.2" jest-snapshot "^28.1.3" -jest-resolve@^28.1.3: +jest-resolve@*, jest-resolve@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== @@ -5464,7 +5558,7 @@ jest-worker@^28.1.3: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^28: +jest@^28, jest@^28.0.0: version "28.1.3" resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== @@ -5480,9 +5574,9 @@ jiti@^1.18.2: integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== jquery@^3.1.1: - version "3.6.4" - resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz" - integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== + version "3.7.0" + resolved "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz" + integrity sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -5560,7 +5654,14 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.1, json5@^1.0.2: +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -5700,7 +5801,25 @@ loader-runner@^4.2.0: resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^1.0.0, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@^1.0.0: + version "1.4.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^1.2.3: version "1.4.2" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== @@ -5813,7 +5932,7 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1, make-error@1.x: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -5891,7 +6010,7 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -5987,7 +6106,12 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -6059,9 +6183,9 @@ no-case@^3.0.4: tslib "^2.0.3" node-fetch@^2.6.0: - version "2.6.9" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + version "2.6.11" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== dependencies: whatwg-url "^5.0.0" @@ -6075,10 +6199,10 @@ node-int64@^0.4.0: resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== normalize-package-data@^2.3.2: version "2.5.0" @@ -6388,11 +6512,6 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" @@ -6400,6 +6519,11 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" @@ -6757,7 +6881,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.2.15, postcss@^8.3.11, postcss@^8.4.14: +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.1.0, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3, postcss@^8.3.11, postcss@^8.4, postcss@^8.4.14, postcss@^8.4.6: version "8.4.24" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== @@ -6783,7 +6907,7 @@ prettier-standalone@^1.3.1-0: resolved "https://registry.npmjs.org/prettier-standalone/-/prettier-standalone-1.3.1-0.tgz" integrity sha512-wxJiwE5XS45BQD8QTXcTeqnWzsYrCliIYOYrURM8MiJaw8NA5q+BSd9UBhM5QPDFShn+pFWa8X2XH3y5A47q+Q== -prettier@^2.6.2: +prettier@^2.6.2, prettier@>=2.0.0: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -6834,7 +6958,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -6864,16 +6988,16 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + qs@6.11.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" @@ -6926,7 +7050,7 @@ raw-loader@~4.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -react-dom@^17.0.1: +"react-dom@^15.3.0 || 16 || 17", react-dom@^17.0.1, react-dom@>=15.0.0: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -6935,7 +7059,7 @@ react-dom@^17.0.1: object-assign "^4.1.1" scheduler "^0.20.2" -react-dom@^18.0.0: +"react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -6984,6 +7108,13 @@ react-router-dom@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" +react-router@^6.3.0: + version "6.11.2" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz" + integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== + dependencies: + "@remix-run/router" "1.6.2" + react-router@5.3.4: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" @@ -6999,13 +7130,6 @@ react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@^6.3.0: - version "6.11.2" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz" - integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== - dependencies: - "@remix-run/router" "1.6.2" - react-transition-group@^2.9.0: version "2.9.0" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" @@ -7016,7 +7140,7 @@ react-transition-group@^2.9.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@^17.0.1: +"react@^15.3.0 || 16 || 17", react@^17.0.1, react@>=0.14.0, react@>=15.0.0, react@>=16, "react@0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0", react@17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -7024,7 +7148,7 @@ react@^17.0.1: loose-envify "^1.1.0" object-assign "^4.1.1" -react@^18.0.0: +"react@^16.3.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@>=15, react@>=16.8: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -7253,15 +7377,25 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex-test@^1.0.0: version "1.0.0" @@ -7297,7 +7431,7 @@ sass-loader@^13.0.2: klona "^2.0.6" neo-async "^2.6.2" -sass@^1.53.0: +sass@^1.3.0, sass@^1.53.0: version "1.62.1" resolved "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz" integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== @@ -7321,7 +7455,16 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^2.7.0: version "2.7.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -7366,24 +7509,60 @@ semver-compare@^1.0.0: resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +semver@^5.4.1: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.5.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4, semver@^7.3.8: +semver@^7.3.4: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.5: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.8: + version "7.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.x: version "7.5.1" resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== @@ -7553,7 +7732,7 @@ source-list-map@^2.0.0: resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -7577,7 +7756,15 @@ source-map-loader@~1.0.2: schema-utils "^2.7.0" source-map "^0.6.1" -source-map-support@0.5.13, source-map-support@~0.5.12: +source-map-support@^0.5.17: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.12, source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== @@ -7585,7 +7772,7 @@ source-map-support@0.5.13, source-map-support@~0.5.12: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.17, source-map-support@~0.5.20: +source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -7598,6 +7785,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" @@ -7666,15 +7858,22 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" string-argv@0.3.1: version "0.3.1" @@ -7748,13 +7947,6 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -string_decoder@^1.1.1, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" @@ -7872,9 +8064,9 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^6.0.2: - version "6.1.14" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz" - integrity sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw== + version "6.1.15" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -7907,15 +8099,15 @@ terser-webpack-plugin@^4.1.0: webpack-sources "^1.4.3" terser-webpack-plugin@^5.3.7: - version "5.3.7" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== + version "5.3.9" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.5" + terser "^5.16.8" terser@^4.6.3: version "4.8.1" @@ -7926,13 +8118,13 @@ terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.10.0, terser@^5.16.5, terser@^5.3.4: - version "5.17.1" - resolved "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz" - integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== +terser@^5.10.0, terser@^5.16.8, terser@^5.3.4: + version "5.17.7" + resolved "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz" + integrity sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -8041,7 +8233,7 @@ ts-loader@^8.0.14: micromatch "^4.0.0" semver "^7.3.4" -ts-node@^9.1.1: +ts-node@^9.1.1, ts-node@>=9.0.0: version "9.1.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== @@ -8077,10 +8269,10 @@ tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.0.3, tslib@^2.1.0, tslib@~2.5.0: + version "2.5.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== tslib@~2.3.1: version "2.3.1" @@ -8138,10 +8330,10 @@ typed-styles@^0.0.7: resolved "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz" integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== -typescript@^4.4.3: - version "4.4.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== +typescript@*, typescript@^4.4.3, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.3: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typestyle@^2.0.4: version "2.4.0" @@ -8213,12 +8405,12 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.10: +update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== @@ -8374,7 +8566,7 @@ webidl-conversions@^6.1.0: resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-cli@^4.1.0, webpack-cli@^4.5.0: +webpack-cli@^4.1.0, webpack-cli@^4.5.0, webpack-cli@4.x.x: version "4.10.0" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -8440,9 +8632,9 @@ webpack-dev-server@^4.0.0: ws "^8.13.0" webpack-merge@^5.1.2, webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + version "5.9.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" @@ -8460,10 +8652,10 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5, webpack@^5.41.1: - version "5.81.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz" - integrity sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q== +webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5, webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.41.1, "webpack@4.x.x || 5.x.x": + version "5.85.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz" + integrity sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -8471,10 +8663,10 @@ webpack@^5, webpack@^5.41.1: "@webassemblyjs/wasm-edit" "^1.11.5" "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" + enhanced-resolve "^5.14.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -8490,7 +8682,7 @@ webpack@^5, webpack@^5.41.1: watchpack "^2.4.0" webpack-sources "^3.2.3" -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== From 5ee2327855ba7f150ef98a736a8c63b908905eea Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 12 Jun 2023 10:31:14 -0400 Subject: [PATCH 100/250] live dev builds will no longer output to /docs --- webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index b4a7912c1..dadcd8565 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -96,7 +96,7 @@ module.exports = [ { entry: './examples/index-react18.tsx', output: { - path: path.join(__dirname, '/docs'), + path: path.join(__dirname, '/examples/dist'), filename: 'bundle.js' }, module: { From bcd90f5229ebb638933ce6c810c02fbc52bfe25e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 12 Jun 2023 10:42:21 -0400 Subject: [PATCH 101/250] another try at getting the youtube video to embed --- docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 03df4e1c3..4ded71fb7 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,7 +12,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell .. raw:: html - + From 5ef47d0239c7ccd4e8f8d073667e8d11d132dc23 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 13 Jun 2023 10:40:51 -0400 Subject: [PATCH 102/250] more fault tolerant rendering of transformed df --- js/components/gridUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index 747460cbf..61a932a10 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -1,6 +1,6 @@ import { ColDef, ValueFormatterFunc, ValueFormatterParams } from 'ag-grid-community'; import { DFWhole, DFColumn, ColumnHint } from './staticData'; - +import _ from 'lodash'; export const updateAtMatch = ( cols: ColDef[], key: string, @@ -78,7 +78,7 @@ export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { //console.log("hints", tdf.table_hints); const retColumns:ColDef[] = fields.map((f: DFColumn) => { //console.log(f.name, tdf.table_hints[f.name]) - const colDef:ColDef = {field: f.name, valueFormatter:getFormatter(tdf.table_hints[f.name]) } + const colDef:ColDef = {field: f.name, valueFormatter:getFormatter(_.get(tdf.table_hints,f.name, { is_numeric:false})) } if (f.name === 'index') { colDef.pinned = 'left'; } From 9bd6cf8c0b8de23e4738e1ad0a3ee78f193dfcb5 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 14 Jun 2023 11:02:47 -0400 Subject: [PATCH 103/250] sampling now works with non contiguous indexes because it indexes by label not location --- buckaroo/summary_stats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index fcc6aad9b..f9be547d8 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -205,7 +205,7 @@ def sample(df, sample_size=500, include_outliers=True): outlier_idxs.extend(get_outlier_idxs(df[col]) ) outlier_idxs.extend(sdf.index) uniq_idx = np.unique(outlier_idxs) - return df.iloc[uniq_idx] + return df.loc[uniq_idx] return sdf def add_col_rankings(df, sdf): From 3e28796b0e99aba3f64c09ea0e51a14081afe8d0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 14 Jun 2023 11:03:24 -0400 Subject: [PATCH 104/250] turning off column reordering by default because it doesn't work reliably --- buckaroo/buckaroo_widget.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 0b708cf7f..a306f3ff2 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -59,11 +59,11 @@ class BuckarooWidget(DOMWidget): { 'totalRows': 1234569, 'columns': 30, - 'rowsShown': 500, + 'rowsShown': 0, 'sampleSize': 10_000, 'sampled':False, 'summaryStats': False, - 'reorderdColumns': True, + 'reorderdColumns': False, 'showTransformed': True, 'showCommands': True, }).tag(sync=True) @@ -78,7 +78,7 @@ class BuckarooWidget(DOMWidget): def __init__(self, df, sampled=True, summaryStats=False, - reorderdColumns=True, + reorderdColumns=False, showTransformed=True, showCommands=True, really_reorder_columns=False): From 35d9045736b95e500decbc0b38ed41694e959dc4 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 14 Jun 2023 11:04:52 -0400 Subject: [PATCH 105/250] moving enable to __init__ for easier importing --- buckaroo/__init__.py | 5 ++++- buckaroo/buckaroo_widget.py | 4 +--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index ddc23b8b5..5d5a2c241 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- - +from .buckaroo_widget import BuckarooWidget, enable, disable dest = 'buckaroo-labextension' def _jupyter_labextension_paths(): @@ -42,3 +42,6 @@ def _jupyter_nbextension_paths(): 'dest': dest, 'require': '%s/extension' % dest }] + + +enable() diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index a306f3ff2..b209e9fbc 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -189,12 +189,10 @@ def enable(): ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) -enable() def disable(): """ - Automatically use buckaroo to display all DataFrames - instances in the notebook. + disable bucakroo as the default display method for DataFrames """ try: From ab0e64a85b1d6945a4d74bcdaa5ebac230d9f507 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 14 Jun 2023 11:05:04 -0400 Subject: [PATCH 106/250] updated youtube link --- docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 4ded71fb7..b7ba06bc9 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,7 +12,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell .. raw:: html - + From e1fe6b214ebd4a754b095baa16dc155d4b96beb7 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 14 Jun 2023 11:17:44 -0400 Subject: [PATCH 107/250] version bump to 0.3.3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8cb13aee7..4777b3cec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.3.0" +version = "0.3.3" [project.license] file = "LICENSE.txt" From a94f38b65cce6a3e87a7493f49debae989fecd5e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 15 Jun 2023 08:23:12 -0400 Subject: [PATCH 108/250] better formatting for ancilary numbers --- buckaroo/summary_stats.py | 4 +++- full_build.sh | 2 +- js/components/DCFCell.tsx | 3 ++- js/components/StatusBar.tsx | 8 ++++---- js/components/gridUtils.ts | 34 ++++++++++++++++++++++++++++++---- pyproject.toml | 2 +- 6 files changed, 41 insertions(+), 12 deletions(-) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index f9be547d8..df1247e96 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -59,7 +59,9 @@ def table_sumarize_ser(ser): return table_sumarize_obj_ser(ser) def table_sumarize(df): - return {col:table_sumarize_ser(df[col]) for col in df} + table_hints = {col:table_sumarize_ser(df[col]) for col in df} + table_hints['index'] = table_sumarize_ser(df.index) + return table_hints def summarize_string(ser): diff --git a/full_build.sh b/full_build.sh index 17daf733f..65d6de453 100755 --- a/full_build.sh +++ b/full_build.sh @@ -3,7 +3,7 @@ set -e #rm -rf node_modules #rm -rf dist python -m build . -rm dist/index.js dist/index.js.LICENSE.txt +rm -f dist/index.js dist/index.js.LICENSE.txt twine check dist/* python -m twine upload --repository testpypi dist/* python -m twine upload --repository pypi dist/* diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 9661eb195..9f399b104 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -38,6 +38,7 @@ export function WidgetDCFCell({ }) { const [activeCol, setActiveCol] = useState('stoptime'); const widgetConfig: WidgetConfig = {showCommands:dfConfig.showCommands, showTransformed:dfConfig.showTransformed} + const localDfConfig = {...dfConfig, 'rowsShown': origDf.data.length || 0} return (
    - + void; export interface DfConfig { @@ -71,10 +71,10 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) const rowData = [ { - totalRows, + totalRows: intFormatter.format(totalRows), columns, - rowsShown, - sampleSize, + rowsShown : intFormatter.format(rowsShown), + sampleSize : intFormatter.format(sampleSize), sampled: sampled ? "Ϋ" : "ό", summaryStats: summaryStats ? "Ϋ" : "ό", reorderdColumns: reorderdColumns ? "Ϋ" : "ό", diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index 61a932a10..ea26f34d8 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -17,6 +17,33 @@ export const updateAtMatch = ( return retColumns; }; +export const intFormatter = new Intl.NumberFormat( + 'en-US', { minimumFractionDigits:0, maximumFractionDigits: 3 }); + +const floatFormatter = new Intl.NumberFormat('en-US', { minimumFractionDigits:3, maximumFractionDigits: 3 }); + +export const anyFormatter = (params: ValueFormatterParams):string => { + const val = params.value; + try { + const num = Number(val) + if (val === null) { + return ""; + } else if (val === undefined) { + return ""; + } + else if (Number.isFinite(num)) { + if (Number.isInteger(num)) { + const formatted = intFormatter.format(num) + return `${formatted} ` + } else { + return floatFormatter.format(num) + } + } + } catch (e:any) { + //console.log("formatting error", val, e); + } + return val +} /* console.log((new Intl.NumberFormat('en-US')).format(amount)) console.log((new Intl.NumberFormat('en-US', { maximumFractionDigits: 1})).format(number)) @@ -32,7 +59,7 @@ export const updateAtMatch = ( */ function getFormatter(hint: ColumnHint): ValueFormatterFunc { if (hint === undefined || hint.is_numeric === false) { - return (params: ValueFormatterParams):string => params.value; + return anyFormatter; } else { const commas = Math.floor(hint.max_digits / 3); @@ -42,7 +69,6 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { console.log("params", params) const formatter = new Intl.NumberFormat('en-US'); - //console.log(`|${last4Digits.padStart(7, ' ')}|`) return formatter.format(params.value).padStart(totalWidth, ' '); }; } else { @@ -64,8 +90,8 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { };*/ return (params: ValueFormatterParams):string => { //console.log("params", params) - const formatter = new Intl.NumberFormat('en-US', { minimumFractionDigits:3, maximumFractionDigits: 3 }); - return formatter.format(params.value); + + return floatFormatter.format(params.value); }; } diff --git a/pyproject.toml b/pyproject.toml index 4777b3cec..327b9a33a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.3.3" +version = "0.3.4" [project.license] file = "LICENSE.txt" From eb294d56e8cfa7460812258a910c6c1745dc5eba Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 21 Jun 2023 13:50:38 -0400 Subject: [PATCH 109/250] Pushed a new version that works with VS-Code --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 327b9a33a..2797c2354 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.3.4" +version = "0.3.6" [project.license] file = "LICENSE.txt" From b21331e424bde7e9a781d925bf2abaabcf7a7d04 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 21 Jun 2023 13:59:17 -0400 Subject: [PATCH 110/250] added info about running in visual studio code to the FAQ --- docs/source/FAQ.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index e539d1a0e..46da3dcd9 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -5,6 +5,11 @@ Buckaroo - FAQ ========================================== + +* **Does Buckaroo work in Visual Studio Code** + + As of 0.3.6 Buckaroo works properly in Visual Studio Code. You must install the `Visual Studio Code Jupyter Extension `_ and the `Jupyter Renderer extension `_. Then install buckaroo from pip and everything should work. + * **Are there any similar projects to Buckaroo?** There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. From d5b7ac2b5810219fcb8f0eec300a3e8e266226f9 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 22 Jun 2023 10:22:18 -0400 Subject: [PATCH 111/250] WIP, first blog article --- .../dont-use-df-head-buckaroo-instead.rst | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 docs/source/articles/dont-use-df-head-buckaroo-instead.rst diff --git a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst new file mode 100644 index 000000000..1d19cd24a --- /dev/null +++ b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst @@ -0,0 +1,40 @@ +.. Buckaroo documentation master file, created by + sphinx-quickstart on Wed Apr 19 14:07:15 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Don't use df.head(), try buckaroo instead +========================================= + +* **Why using df.head() is an anti-pattern** + +In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably :python:`df.head()`. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing `df` and seeing a rendered dataframe. Pandas has sensible defaults fo it's builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with `pd.options.display.(width|max_rows)` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up `df.info()` and `df.describe()` + +* **Buckaroo fixes this in a natural way** + +With the new release of buckaroo, I we can stop using df.head(). I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 5000 rows, all rows are shown. If there are more than 5000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. + +Buckaroo is already the fastest table widget for the jupyter notebook from my testing. Being fast isn't just a bragging rights matter. To be usable as the default dataframe display method, some performance guarantees are necessary. Having your kernel lock up for 30 seconds or longer is unacceptable. So the system has to make some decisions for you. this is why sampling is automatically performed for larger datasets. + + +* **It gets even better though** + +There is also column reordering. Column reordering tries to put the most interesting columns to the far left where they are easily visible without scrolling. What's an interesting column, well that's complicated, but an uninteresting column is simple to describe. A column of data that offers no insight into the dataset, a column that you will not run a computation against, a column that duplicates information from other columns. So a column that only has a single value for all rows offers no additional actionable information. Those columns are ranked lowest. Next are duplicate columns, in my favorite dataset there are two sets of four duplicate columns. Each citibike trip has a start station and an end station, there are 4 columns for both - 'station id', 'station name', 'longitude', 'latitude'. For every row with 'station id' `359`, 'station name' will always be 'E 47 St & Park Ave', 'latitude' will be `40.755` and 'longitude' will be `-73.975`. We only need one of those columns, and station name is the most descriptive. So 'Station name' is put to the left, and the other 3 columns are put to the right. + +* **Common manipulations are also quickly available** + +Finally the Buckaroo command UI is available with a single click. The command interface allows you to iterate through normal data cleaning operations with a GUI… while generating python code to perform the operations in a function. Want to drop a column, click the column then the "dropcol" button. + +* **What this means for your workflows** + +When I worked with a trading desk at a hedge fund, every time I would show analysts a model the first thing they wanted to do was look at the raw and intermediate data. I would say "well obviously because of this command, the column will have these values”, the response would come "SHOW ME THE DATA". Many times the analyst was right. This key part of any analysis workflow is made unnecessarily difficult, partly because of tooling, partly because of calluses built up from the pain of tooling that doesn't support the workflow. + +When working with data we are constantly doing exploratory data analysis, our tools should help us do that, buckaroo does. You can just visualize data frames and all of their important attributes with a single command. This encourages you to look at the data instead of making assumptions about it. This also leads to less cluttered notebooks. + +* **Planned developments for the default table experience** + +The biggest feature in this area is making the summary stats and column reordering algorithms pluggable. This will speed up my own development of features. I also want to to experiment with running the initial analysis in a separate thread, dynamically sizing the sample size, this way I can ensure that the table always loads in a reasonable and tunable timeframe. I will also be adding unit tests and integrating it with the pluggable stats algorithms (run a series of tests over user supplied summary stats to check for exceptions). There are also performance improvements, histograms, and group colors coming. + +* **Try Buckaroo** + +Install buckaroo with `pip install buckaroo` then import it into your notebook with `import buckaroo`. Buckaroo becomes the default dataframe viewer. Give it a try and reach out about what you think. From a7ca04fb7ffbbe2f0811a30dd04d0ebfbffce1fc Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 22 Jun 2023 10:29:53 -0400 Subject: [PATCH 112/250] better highlighting --- docs/source/articles/dont-use-df-head-buckaroo-instead.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst index 1d19cd24a..0825d314c 100644 --- a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst +++ b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst @@ -8,7 +8,7 @@ Don't use df.head(), try buckaroo instead * **Why using df.head() is an anti-pattern** -In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably :python:`df.head()`. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing `df` and seeing a rendered dataframe. Pandas has sensible defaults fo it's builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with `pd.options.display.(width|max_rows)` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up `df.info()` and `df.describe()` +In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably ``df.head()``. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing ``df`` and seeing a rendered dataframe. Pandas has sensible defaults fo it's builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with ``pd.options.display.(width|max_rows)`` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up ``df.info()`` and ``df.describe()`` * **Buckaroo fixes this in a natural way** @@ -19,7 +19,7 @@ Buckaroo is already the fastest table widget for the jupyter notebook from my te * **It gets even better though** -There is also column reordering. Column reordering tries to put the most interesting columns to the far left where they are easily visible without scrolling. What's an interesting column, well that's complicated, but an uninteresting column is simple to describe. A column of data that offers no insight into the dataset, a column that you will not run a computation against, a column that duplicates information from other columns. So a column that only has a single value for all rows offers no additional actionable information. Those columns are ranked lowest. Next are duplicate columns, in my favorite dataset there are two sets of four duplicate columns. Each citibike trip has a start station and an end station, there are 4 columns for both - 'station id', 'station name', 'longitude', 'latitude'. For every row with 'station id' `359`, 'station name' will always be 'E 47 St & Park Ave', 'latitude' will be `40.755` and 'longitude' will be `-73.975`. We only need one of those columns, and station name is the most descriptive. So 'Station name' is put to the left, and the other 3 columns are put to the right. +There is also column reordering. Column reordering tries to put the most interesting columns to the far left where they are easily visible without scrolling. What's an interesting column, well that's complicated, but an uninteresting column is simple to describe. A column of data that offers no insight into the dataset, a column that you will not run a computation against, a column that duplicates information from other columns. So a column that only has a single value for all rows offers no additional actionable information. Those columns are ranked lowest. Next are duplicate columns, in my favorite dataset there are two sets of four duplicate columns. Each citibike trip has a start station and an end station, there are 4 columns for both - 'station id', 'station name', 'longitude', 'latitude'. For every row with 'station id' ``359``, 'station name' will always be 'E 47 St & Park Ave', 'latitude' will be ``40.755`` and 'longitude' will be ``-73.975``. We only need one of those columns, and station name is the most descriptive. So 'Station name' is put to the left, and the other 3 columns are put to the right. * **Common manipulations are also quickly available** @@ -37,4 +37,4 @@ The biggest feature in this area is making the summary stats and column reorderi * **Try Buckaroo** -Install buckaroo with `pip install buckaroo` then import it into your notebook with `import buckaroo`. Buckaroo becomes the default dataframe viewer. Give it a try and reach out about what you think. +Install buckaroo with ``pip install buckaroo`` then import it into your notebook with ``import buckaroo``. Buckaroo becomes the default dataframe viewer. Give it a try and reach out about what you think. From b31ee928e34f15fa148814a9811629f0754e04d7 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 22 Jun 2023 13:03:37 -0400 Subject: [PATCH 113/250] second articles list --- docs/source/articles/index.rst | 35 ++++++++++++++++++++++++++++++++++ docs/source/index.rst | 6 +----- 2 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 docs/source/articles/index.rst diff --git a/docs/source/articles/index.rst b/docs/source/articles/index.rst new file mode 100644 index 000000000..fee09a965 --- /dev/null +++ b/docs/source/articles/index.rst @@ -0,0 +1,35 @@ +.. Buckaroo documentation master file, created by + sphinx-quickstart on Wed Apr 19 14:07:15 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Articles and Blogposts +====================== +Articles about Buckaroo can be found here. It was more expedient to use Read The Docs for a common blog task than dealing with medium paywalls or yet another devops struggle. + +Articles +======== + +.. toctree:: + :glob: + + .//* + + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + + using + install + contributing + FAQ + articles/index + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` +* `Buckaroo on github `_ diff --git a/docs/source/index.rst b/docs/source/index.rst index b7ba06bc9..3d62c11ca 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -15,11 +15,6 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell - -.. note:: - - This project is under active development. - .. toctree:: :maxdepth: 2 :caption: Contents: @@ -28,6 +23,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell install contributing FAQ + articles/index Indices and tables ================== From aa551b4e2c42d843623390413a625d54ff989de2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 22 Jun 2023 13:26:21 -0400 Subject: [PATCH 114/250] spelling/grammar --- docs/source/articles/dont-use-df-head-buckaroo-instead.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst index 0825d314c..345d33613 100644 --- a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst +++ b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst @@ -8,18 +8,18 @@ Don't use df.head(), try buckaroo instead * **Why using df.head() is an anti-pattern** -In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably ``df.head()``. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing ``df`` and seeing a rendered dataframe. Pandas has sensible defaults fo it's builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with ``pd.options.display.(width|max_rows)`` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up ``df.info()`` and ``df.describe()`` +In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably ``df.head()``. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing ``df`` and seeing a rendered dataframe. Pandas has sensible defaults fo its builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with ``pd.options.display.(width|max_rows)`` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up ``df.info()`` and ``df.describe()`` * **Buckaroo fixes this in a natural way** -With the new release of buckaroo, I we can stop using df.head(). I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 5000 rows, all rows are shown. If there are more than 5000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. +With the new release of buckaroo, we can stop using ``df.head()``. I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 5000 rows, all rows are shown. If there are more than 5000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. Buckaroo is already the fastest table widget for the jupyter notebook from my testing. Being fast isn't just a bragging rights matter. To be usable as the default dataframe display method, some performance guarantees are necessary. Having your kernel lock up for 30 seconds or longer is unacceptable. So the system has to make some decisions for you. this is why sampling is automatically performed for larger datasets. * **It gets even better though** -There is also column reordering. Column reordering tries to put the most interesting columns to the far left where they are easily visible without scrolling. What's an interesting column, well that's complicated, but an uninteresting column is simple to describe. A column of data that offers no insight into the dataset, a column that you will not run a computation against, a column that duplicates information from other columns. So a column that only has a single value for all rows offers no additional actionable information. Those columns are ranked lowest. Next are duplicate columns, in my favorite dataset there are two sets of four duplicate columns. Each citibike trip has a start station and an end station, there are 4 columns for both - 'station id', 'station name', 'longitude', 'latitude'. For every row with 'station id' ``359``, 'station name' will always be 'E 47 St & Park Ave', 'latitude' will be ``40.755`` and 'longitude' will be ``-73.975``. We only need one of those columns, and station name is the most descriptive. So 'Station name' is put to the left, and the other 3 columns are put to the right. +There is also column reordering. Column reordering tries to put the most interesting columns to the far left where they are easily visible without scrolling. What's an interesting column, well that's complicated, but an uninteresting column is simple to describe. A column of data that offers no insight into the dataset, a column that you will not run a computation against, a column that duplicates information from other columns. So a column that only has a single value for all rows offers no additional actionable information. Those columns are ranked lowest. Next are duplicate columns, in my favorite dataset there are two sets of four duplicate columns. Each citibike trip has a start station and an end station, there are 4 columns for both - 'station id', 'station name', 'longitude', 'latitude'. For every row with 'station id' ``359``, 'station name' will always be ``E 47 St & Park Ave``, 'latitude' will be ``40.755`` and 'longitude' will be ``-73.975``. We only need one of those columns, and station name is the most descriptive. So 'Station name' is put to the left, and the other 3 columns are put to the right. * **Common manipulations are also quickly available** From b3dacc3a2e15b9e3c956b02775f9f82a34d5d86f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 22 Jun 2023 13:26:28 -0400 Subject: [PATCH 115/250] nav improvements --- docs/source/articles/index.rst | 18 +++--------------- docs/source/index.rst | 3 ++- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/docs/source/articles/index.rst b/docs/source/articles/index.rst index fee09a965..973499ea6 100644 --- a/docs/source/articles/index.rst +++ b/docs/source/articles/index.rst @@ -3,12 +3,10 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Articles and Blogposts -====================== -Articles about Buckaroo can be found here. It was more expedient to use Read The Docs for a common blog task than dealing with medium paywalls or yet another devops struggle. - Articles ======== +Articles about Buckaroo can be found here. It was more expedient to use Read The Docs for a common blog task than dealing with medium paywalls or yet another devops struggle. + .. toctree:: :glob: @@ -16,18 +14,8 @@ Articles .//* -.. toctree:: - :maxdepth: 3 - :caption: Contents: - - using - install - contributing - FAQ - articles/index -Indices and tables -================== +* **Footer nav** * :ref:`genindex` * :ref:`modindex` diff --git a/docs/source/index.rst b/docs/source/index.rst index 3d62c11ca..b243458ed 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -17,7 +17,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell .. toctree:: :maxdepth: 2 - :caption: Contents: + :caption: Sitemap: using install @@ -31,4 +31,5 @@ Indices and tables * :ref:`genindex` * :ref:`modindex` * :ref:`search` + * `Buckaroo on github `_ From cbc44f8c62797ff84a273e8c435a5ff60419560f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 1 Jul 2023 14:00:10 -0400 Subject: [PATCH 116/250] WIP --- docs/source/articles/dont-use-df-head-buckaroo-instead.rst | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst index 345d33613..f5ca56934 100644 --- a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst +++ b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst @@ -16,11 +16,6 @@ With the new release of buckaroo, we can stop using ``df.head()``. I have worked Buckaroo is already the fastest table widget for the jupyter notebook from my testing. Being fast isn't just a bragging rights matter. To be usable as the default dataframe display method, some performance guarantees are necessary. Having your kernel lock up for 30 seconds or longer is unacceptable. So the system has to make some decisions for you. this is why sampling is automatically performed for larger datasets. - -* **It gets even better though** - -There is also column reordering. Column reordering tries to put the most interesting columns to the far left where they are easily visible without scrolling. What's an interesting column, well that's complicated, but an uninteresting column is simple to describe. A column of data that offers no insight into the dataset, a column that you will not run a computation against, a column that duplicates information from other columns. So a column that only has a single value for all rows offers no additional actionable information. Those columns are ranked lowest. Next are duplicate columns, in my favorite dataset there are two sets of four duplicate columns. Each citibike trip has a start station and an end station, there are 4 columns for both - 'station id', 'station name', 'longitude', 'latitude'. For every row with 'station id' ``359``, 'station name' will always be ``E 47 St & Park Ave``, 'latitude' will be ``40.755`` and 'longitude' will be ``-73.975``. We only need one of those columns, and station name is the most descriptive. So 'Station name' is put to the left, and the other 3 columns are put to the right. - * **Common manipulations are also quickly available** Finally the Buckaroo command UI is available with a single click. The command interface allows you to iterate through normal data cleaning operations with a GUI… while generating python code to perform the operations in a function. Want to drop a column, click the column then the "dropcol" button. @@ -33,7 +28,7 @@ When working with data we are constantly doing exploratory data analysis, our to * **Planned developments for the default table experience** -The biggest feature in this area is making the summary stats and column reordering algorithms pluggable. This will speed up my own development of features. I also want to to experiment with running the initial analysis in a separate thread, dynamically sizing the sample size, this way I can ensure that the table always loads in a reasonable and tunable timeframe. I will also be adding unit tests and integrating it with the pluggable stats algorithms (run a series of tests over user supplied summary stats to check for exceptions). There are also performance improvements, histograms, and group colors coming. +The biggest feature in this area is making the summary stats and column reordering algorithms pluggable. This will speed up my own development of features. I also want to to experiment with running the initial analysis in a separate thread, dynamically sizing the sample size, this way I can ensure that the table always loads in a reasonable and tunable timeframe. I will also be adding unit tests and integrating it with the pluggable stats algorithms (run a series of tests over user supplied summary stats to check for exceptions). There are also performance improvements, histograms, automatic column grouping, column reordering, and group colors coming. * **Try Buckaroo** From 67968d1ac73f03639d299f0ca33f1af5520bb85e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 10 Jul 2023 12:45:24 -0400 Subject: [PATCH 117/250] simplified the widget controls --- js/components/ColumnsEditor.tsx | 10 +++---- js/components/DCFCell.tsx | 9 +++--- js/components/StatusBar.tsx | 52 ++++++++++++++++----------------- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx index 9725a33b7..0b41d678b 100644 --- a/js/components/ColumnsEditor.tsx +++ b/js/components/ColumnsEditor.tsx @@ -10,7 +10,7 @@ import { tableDf, bakedCommandConfig } from './staticData' export type OperationSetter = (ops: Operation[]) => void; export interface WidgetConfig { showCommands:boolean; - showTransformed:boolean; +// showTransformed:boolean; } @@ -36,18 +36,18 @@ export function ColumnsEditor({ return (
    {(widgetConfig.showCommands) ? ( +
    ) : } - {(widgetConfig.showTransformed) ?( + commandConfig={commandConfig}/> +
    ) : }
    ); @@ -70,7 +70,7 @@ export function ColumnsEditorEx() { operations={operations} setOperations={setOperations} operationResult={baseOperationResults} - widgetConfig={{showCommands:true, showTransformed:true}} + widgetConfig={{showCommands:true}} /> ); } diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 9f399b104..3767ee15d 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -37,7 +37,7 @@ export function WidgetDCFCell({ summaryDf: DFWhole }) { const [activeCol, setActiveCol] = useState('stoptime'); - const widgetConfig: WidgetConfig = {showCommands:dfConfig.showCommands, showTransformed:dfConfig.showTransformed} + const widgetConfig: WidgetConfig = {showCommands:dfConfig.showCommands} const localDfConfig = {...dfConfig, 'rowsShown': origDf.data.length || 0} return (
    - {(widgetConfig.showCommands || widgetConfig.showTransformed) ? ( + {(widgetConfig.showCommands) ? ( (bakedOperations); return ( diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index e829a1be8..823cca037 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -18,27 +18,22 @@ export interface DfConfig { sampleSize: number; sampled: boolean; summaryStats: boolean; - reorderdColumns: boolean; showCommands:boolean; - showTransformed:boolean; + //reorderdColumns: boolean; } + const columnDefs: ColDef[] = [ { field: 'summaryStats', headerName:'Σ', headerTooltip:'Summary Stats', width:30 }, - { field: 'reorderdColumns', - headerName: "Θ", - headerTooltip:"Reorder Columns", - width:30 -}, - { field: 'showTransformed', - headerName:"Δ", - headerTooltip:"Show Transformation", - width:30 -}, +// { field: 'reorderdColumns', +// headerName: "Θ", +// headerTooltip:"Reorder Columns", +// width:30 +// }, { field: 'showCommands', headerName: "λ", headerTooltip:"Show Commands", @@ -50,6 +45,15 @@ const columnDefs: ColDef[] = [ headerTooltip:"Sampled", width:30 }, + { field: 'help', + headerName: "Help", + headerTooltip:"Help", + width:70, + cellRenderer: function(params:any) { + return
    Help} + +}, + { field: 'totalRows', width:100}, { field: 'columns', width:100 }, { field: 'rowsShown', width:120}, @@ -64,9 +68,8 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) sampleSize, sampled, summaryStats, - reorderdColumns, - showTransformed, - showCommands + showCommands, + //reorderdColumns } = config; const rowData = [ @@ -75,11 +78,10 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) columns, rowsShown : intFormatter.format(rowsShown), sampleSize : intFormatter.format(sampleSize), - sampled: sampled ? "Ϋ" : "ό", - summaryStats: summaryStats ? "Ϋ" : "ό", - reorderdColumns: reorderdColumns ? "Ϋ" : "ό", - showTransformed: showTransformed ? "Ϋ" : "ό", - showCommands: showCommands ? "Ϋ" : "ό", + sampled: sampled ? "1" : "0", + summaryStats: summaryStats ? "1" : "0", + // reorderdColumns: reorderdColumns ? "Ϋ" : "ό", + showCommands: showCommands ? "1" : "0" }, ]; @@ -90,13 +92,12 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) } else if (colName === 'sampled') { setConfig({ ...config, sampled: !config.sampled }); - } else if (colName === 'reorderdColumns') { - setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); - } else if (colName === 'showTransformed') { - setConfig({ ...config, showTransformed: !config.showTransformed }); } else if (colName === 'showCommands') { setConfig({ ...config, showCommands: !config.showCommands }); } + // } else if (colName === 'reorderdColumns') { + // setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); + }; const gridOptions: GridOptions = { rowSelection: 'single', @@ -131,9 +132,8 @@ export function StatusBarEx() { sampleSize: 10_000, sampled: true, summaryStats: false, - reorderdColumns: true, - showTransformed: true, showCommands: true, + //reorderdColumns: true, }); return ; From 2f5fd746d602cd9d3bac790a377312e5750ca79b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 10 Jul 2023 13:11:58 -0400 Subject: [PATCH 118/250] using ? for the help icon --- js/components/StatusBar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 823cca037..9b233c0b9 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -46,11 +46,11 @@ const columnDefs: ColDef[] = [ width:30 }, { field: 'help', - headerName: "Help", + headerName: "?", headerTooltip:"Help", width:70, cellRenderer: function(params:any) { - return Help} + return ?} }, From 2a58eb25f169a6ab408fbe3ce82bc1ce54e24272 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 10 Jul 2023 17:08:10 -0400 Subject: [PATCH 119/250] added annotated diagrams of the app --- docs/source/_static/Buckaroo-labled.png | Bin 0 -> 835431 bytes docs/source/_static/Statusbar.png | Bin 0 -> 15539 bytes docs/source/feature_reference.rst | 42 ++++++++++++++++++++++++ docs/source/index.rst | 1 + js/components/StatusBar.tsx | 5 ++- 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 docs/source/_static/Buckaroo-labled.png create mode 100644 docs/source/_static/Statusbar.png create mode 100644 docs/source/feature_reference.rst diff --git a/docs/source/_static/Buckaroo-labled.png b/docs/source/_static/Buckaroo-labled.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f28f6167e222116f4edfff25da31be64d63b28 GIT binary patch literal 835431 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

    Kd{0$Wmh)@eRL13ZsY~#M( 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ٷ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%0DUpeQv)L?Zn#9OgI`IGi5gLlIYa& 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îi$DZBs!pTzMj!Os`DA!;Gid{>8Wdg-Exy1vqU4 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%0D!=r`~_fs@_4S{J>{~G=62OlL0)t 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 z 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 bg#keItrZ&d#pnnM@}vAg<9*FL%WwY=pQd-A literal 0 HcmV?d00001 diff --git a/docs/source/_static/Statusbar.png b/docs/source/_static/Statusbar.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4e3b9f5697bc2d87d053105a7543ce234fce29 GIT binary patch literal 15539 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

    qC+YcDVaMNtD9FQHqtt4PI zaqb-hz|fza@PoIOF1yg24soJEQek)y==Ph|WWmGsJEgL)6yL)r95A+-f_`0*9B`r1 z>W{fL3(cAxxv7WECX?V;O_pv=@T0oFo_mNHB!wE79uBzPOswO-}&uK`1PH z!PrBeFWeivM_IF-D%r%RBPh@9porMeC9E2CvtLC8_lx#h1L5@4Vg;dLfsg*;A^mOf zsIg%=&5-F0glhT->yfDG9er?I@n~JSG0@5k$_M7*ekS#+XZau4NcjPOKiEtC>IKj! z4|tTviWL8VMw}E9$XwhYND^8ROa-A8;B>6yte{O%g(>-W;xzIetuUPUBL+kRn%0DB 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 literal 0 HcmV?d00001 diff --git a/docs/source/feature_reference.rst b/docs/source/feature_reference.rst new file mode 100644 index 000000000..6fad20e69 --- /dev/null +++ b/docs/source/feature_reference.rst @@ -0,0 +1,42 @@ +.. _Feature_reference: + +================= +Feature Reference +================= + +Full App Diagram +================ +.. image:: _static/Buckaroo-labled.png + :width: 281 + :alt: Full widget + + +Status Bar Features +=================== +The status bar is displayed above every table, it allows quick toggling of different UI modes + +.. image:: _static/Statusbar.png + :width: 200 + :alt: Status Bar + + +Summary Statistics +------------------ +To View Summary Statistics click on the Σ cell . When the value below is ``1``, the summary stats view will be show in the table. + +Command Editting Mode +--------------------- + +To turn on Command Editting mode, click on the λ cell. This will bring up the command UI and the transformed dataframe view + +Sampled Data Mode +----------------- + +When a dataframe has more than 10k rows, Bucakroo inteligently downsamples the dataframe to only 10k rows + extents for each column. Sometimes you want to see the entire dataframe, toggling the Ξ cell enables this. Turning off sampling for large datasets can cause the table to take a long time to render, so use with caution. + +Sort by a column +---------------- + +To sort the dataframe by any column, click on the header for that column, sorting will cycle through ``ascending``, ``descending`` and ``off`` + + diff --git a/docs/source/index.rst b/docs/source/index.rst index b7ba06bc9..4ba306942 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -25,6 +25,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell :caption: Contents: using + feature_reference install contributing FAQ diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 9b233c0b9..991f17fb8 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -48,10 +48,9 @@ const columnDefs: ColDef[] = [ { field: 'help', headerName: "?", headerTooltip:"Help", - width:70, + width:30, cellRenderer: function(params:any) { - return ?} - + return ?} }, { field: 'totalRows', width:100}, From 041251c73869878bc9dcf5842d921c6c2d080583 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 10 Jul 2023 17:23:38 -0400 Subject: [PATCH 120/250] new release with online help --- package.json | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0fa606fdc..2af00837c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.1", + "version": "0.2.2", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 2797c2354..3ebccf8e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.3.6" +version = "0.3.7" [project.license] file = "LICENSE.txt" From aa58042ccc2056e4d068294faad98f1df94deebc Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 10 Jul 2023 18:05:20 -0400 Subject: [PATCH 121/250] updated feature list and icons --- docs/source/feature_reference.rst | 45 ++++++++++++++++++++++++------- docs/source/index.rst | 5 ---- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/docs/source/feature_reference.rst b/docs/source/feature_reference.rst index 6fad20e69..b3181f3af 100644 --- a/docs/source/feature_reference.rst +++ b/docs/source/feature_reference.rst @@ -16,27 +16,52 @@ Status Bar Features The status bar is displayed above every table, it allows quick toggling of different UI modes .. image:: _static/Statusbar.png - :width: 200 :alt: Status Bar -Summary Statistics ------------------- -To View Summary Statistics click on the Σ cell . When the value below is ``1``, the summary stats view will be show in the table. +Σ Summary Statistics +-------------------- -Command Editting Mode ---------------------- +To View Summary Statistics click on the ``Σ`` cell . When the value below is ``1``, the summary stats view will be show in the table. -To turn on Command Editting mode, click on the λ cell. This will bring up the command UI and the transformed dataframe view +λ Command Editting Mode +----------------------- -Sampled Data Mode ------------------ +To turn on Command Editting mode, click on the ``λ`` cell. This will bring up the command UI and the transformed dataframe view + +Ξ Sampled Data Mode +------------------- + +When a dataframe has more than 10k rows, Bucakroo inteligently downsamples the dataframe to only 10k rows + extents for each column. Sometimes you want to see the entire dataframe, toggling the ``Ξ`` cell enables this. Turning off sampling for large datasets can cause the table to take a long time to render, so use with caution. + +? Help +------ + +Click the ``?`` cell to display this document. + + +Other Features +============== -When a dataframe has more than 10k rows, Bucakroo inteligently downsamples the dataframe to only 10k rows + extents for each column. Sometimes you want to see the entire dataframe, toggling the Ξ cell enables this. Turning off sampling for large datasets can cause the table to take a long time to render, so use with caution. Sort by a column ---------------- To sort the dataframe by any column, click on the header for that column, sorting will cycle through ``ascending``, ``descending`` and ``off`` +Operations UI +------------- + +The operations UI allows quick manipulation of dataframes. Commands operate on columns. First click on the column you want to operate on, then click on the command. This command will be added to the "operations" list. Some commands take extra arguments (fillna, groupby) and these must be provided via the UI. The transformed dataframe is instantly updated below. Further you can click the ``python`` tab to see generated python code that will perform the same transform. + +Disabling Dataframe Autodisplay +------------------------------- + +When you run ``import buckaroo`` the Buckaroo widget is automatically registered with the jupyter notebook as the default display mechanism for objects of type ``pd.DataFrame``. Occasionally you will run into bugs with Buckaroo, that prevent the table from working. Please file a bug at `Buckaroo issues `_ . You can restore the default pandas behavior with + +.. code-block:: python + + import buckaroo + buckaroo.disable() + diff --git a/docs/source/index.rst b/docs/source/index.rst index 4ba306942..5aa954126 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -15,11 +15,6 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell - -.. note:: - - This project is under active development. - .. toctree:: :maxdepth: 2 :caption: Contents: From 07317aa47044637501bf98f678bf23990b6cdaee Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 13 Jul 2023 17:32:14 -0400 Subject: [PATCH 122/250] trying to link to the buckaroo-assets for the gif --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 323f16938..c82218d47 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Buckaroo - The Data Wrangling Assistant We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaro makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the Buckaroo is a tool built to interactively explore, clean, and transform pandas dataframes. -![Buckaroo Screenshot](static/images/Buckaroo-screenshot.png) +![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) ## Installation From e02e1333d834d4c3343d9337f4b871de12a50f09 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 14 Jul 2023 10:18:27 -0400 Subject: [PATCH 123/250] blog improvements --- .../articles/dont-use-df-head-buckaroo-instead.rst | 11 +++++++++++ docs/source/articles/index.rst | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst index f5ca56934..e1862c56f 100644 --- a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst +++ b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst @@ -10,7 +10,18 @@ Don't use df.head(), try buckaroo instead In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably ``df.head()``. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing ``df`` and seeing a rendered dataframe. Pandas has sensible defaults fo its builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with ``pd.options.display.(width|max_rows)`` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up ``df.info()`` and ``df.describe()`` + + +.. image:: https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif + :alt: df.head() vs buckaroo annotated walkthrough + :align: right + + + * **Buckaroo fixes this in a natural way** + :scale: 50 % + :width: 200px + :height: 100px With the new release of buckaroo, we can stop using ``df.head()``. I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 5000 rows, all rows are shown. If there are more than 5000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. diff --git a/docs/source/articles/index.rst b/docs/source/articles/index.rst index 973499ea6..2264a168a 100644 --- a/docs/source/articles/index.rst +++ b/docs/source/articles/index.rst @@ -15,7 +15,6 @@ Articles about Buckaroo can be found here. It was more expedient to use Read Th -* **Footer nav** * :ref:`genindex` * :ref:`modindex` From 7f64f263fcfe79e6c7836a48ab889e9d62464f2b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 14 Jul 2023 10:42:57 -0400 Subject: [PATCH 124/250] styling tweaks --- .../articles/dont-use-df-head-buckaroo-instead.rst | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst index e1862c56f..7b4517261 100644 --- a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst +++ b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst @@ -18,14 +18,12 @@ In tutorials and common use, whenever we inspect a new dataset with pandas and j -* **Buckaroo fixes this in a natural way** - :scale: 50 % - :width: 200px - :height: 100px +* **Buckaroo fixes this intuitively** -With the new release of buckaroo, we can stop using ``df.head()``. I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 5000 rows, all rows are shown. If there are more than 5000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. -Buckaroo is already the fastest table widget for the jupyter notebook from my testing. Being fast isn't just a bragging rights matter. To be usable as the default dataframe display method, some performance guarantees are necessary. Having your kernel lock up for 30 seconds or longer is unacceptable. So the system has to make some decisions for you. this is why sampling is automatically performed for larger datasets. +With the new release of buckaroo, we can stop using ``df.head()``. I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 10,000 rows, all rows are shown. If there are more than 5000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. + +Buckaroo is already the fastest table widget (comparison coming) for the jupyter notebook from my testing. Being fast isn't just a bragging rights matter. To be usable as the default dataframe display method, some performance guarantees are necessary. Having your kernel lock up for 30 seconds or longer is unacceptable. So the system has to make some decisions for you. this is why sampling is automatically performed for larger datasets. * **Common manipulations are also quickly available** From 49a9bdc2c16c2da549244e6b2bcdf5f541cd4a0a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 14 Jul 2023 11:04:42 -0400 Subject: [PATCH 125/250] wording fixes --- .../source/articles/dont-use-df-head-buckaroo-instead.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst index 7b4517261..62be76b2d 100644 --- a/docs/source/articles/dont-use-df-head-buckaroo-instead.rst +++ b/docs/source/articles/dont-use-df-head-buckaroo-instead.rst @@ -8,7 +8,7 @@ Don't use df.head(), try buckaroo instead * **Why using df.head() is an anti-pattern** -In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably ``df.head()``. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing ``df`` and seeing a rendered dataframe. Pandas has sensible defaults fo its builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with ``pd.options.display.(width|max_rows)`` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up ``df.info()`` and ``df.describe()`` +In tutorials and common use, whenever we inspect a new dataset with pandas and jupyter, the first command is inevitably ``df.head()``. The next commands and cells dig into the contents of the dataframe. In a *more perfect world* we would just be typing ``df`` and seeing a rendered dataframe. Pandas has sensible defaults for its builtin table html rendering system that limits the number of rows and columns displayed in the interest of performance and visual compactness. Soon you find yourself playing with ``pd.options.display.(width|max_rows)`` and looking up sorting and filtering commands. Some might remember these commands off the top of their head, but even so, typing them repeatedly is slow and litters the notebook with temp work. Next you'll look up ``df.info()`` and ``df.describe()`` @@ -21,9 +21,9 @@ In tutorials and common use, whenever we inspect a new dataset with pandas and j * **Buckaroo fixes this intuitively** -With the new release of buckaroo, we can stop using ``df.head()``. I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 10,000 rows, all rows are shown. If there are more than 5000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. +With the new release of buckaroo, we can stop using ``df.head()``. I have worked to make Buckaroo usable as the default table visualization for pandas dataframes. It does this through sensible defaults and down sampling. All columns are shown, if there are less than 10,000 rows, all rows are shown. If there are more than 10,000 rows, sampling is turned on. But not just any sampling, sampling that also includes the 5 largest and smallest values of each column. At this point you will have around 10k rows in the interactive widget, which can be sorted by any column. Summary stats are a toggle away. -Buckaroo is already the fastest table widget (comparison coming) for the jupyter notebook from my testing. Being fast isn't just a bragging rights matter. To be usable as the default dataframe display method, some performance guarantees are necessary. Having your kernel lock up for 30 seconds or longer is unacceptable. So the system has to make some decisions for you. this is why sampling is automatically performed for larger datasets. +Buckaroo is already the fastest table widget (comparison coming from my testing) for the jupyter notebook. Being fast isn't just a bragging rights matter. To be usable as the default dataframe display method, some performance guarantees are necessary. Having your kernel lock up for 30 seconds or longer is unacceptable. So the system has to make some decisions for you. this is why sampling is automatically turned on for larger datasets. * **Common manipulations are also quickly available** @@ -33,7 +33,7 @@ Finally the Buckaroo command UI is available with a single click. The command in When I worked with a trading desk at a hedge fund, every time I would show analysts a model the first thing they wanted to do was look at the raw and intermediate data. I would say "well obviously because of this command, the column will have these values”, the response would come "SHOW ME THE DATA". Many times the analyst was right. This key part of any analysis workflow is made unnecessarily difficult, partly because of tooling, partly because of calluses built up from the pain of tooling that doesn't support the workflow. -When working with data we are constantly doing exploratory data analysis, our tools should help us do that, buckaroo does. You can just visualize data frames and all of their important attributes with a single command. This encourages you to look at the data instead of making assumptions about it. This also leads to less cluttered notebooks. +When working with data we are constantly doing exploratory data analysis, when you transform a dataframe with code, you should explore the resulting dataframe. Our tools should help that process, buckaroo does. You can just visualize data frames and all of their important attributes with a single command. This encourages you to look at the data instead of making assumptions about it. This also leads to less cluttered notebooks. * **Planned developments for the default table experience** From 9e095bc0ad1b1dc613edc2e952c4a0248cb6c3f5 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sun, 16 Jul 2023 11:50:08 -0400 Subject: [PATCH 126/250] build 0.3.8 release --- full_build.sh | 3 ++- package.json | 2 +- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/full_build.sh b/full_build.sh index 65d6de453..e13eda9c3 100755 --- a/full_build.sh +++ b/full_build.sh @@ -5,5 +5,6 @@ set -e python -m build . rm -f dist/index.js dist/index.js.LICENSE.txt twine check dist/* -python -m twine upload --repository testpypi dist/* +#python -m twine upload --repository testpypi dist/* python -m twine upload --repository pypi dist/* +npm publish diff --git a/package.json b/package.json index 2af00837c..36ef96ed5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.2", + "version": "0.3.8", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 3ebccf8e5..06cc87e52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ classifiers = [ dependencies = [ "ipywidgets>=7.6.0,<9" ] -version = "0.3.7" +version = "0.3.8" [project.license] file = "LICENSE.txt" From 04d84514ddd71bc8df4388e5c5c27638708281c3 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sun, 16 Jul 2023 13:10:17 -0400 Subject: [PATCH 127/250] new releases of buckaroo, with better dependency reqs to force jupyterlab > 3.6.0 --- docs/source/FAQ.rst | 8 ++++++++ package.json | 6 +++--- pyproject.toml | 5 +++-- webpack.config.js | 2 ++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index 46da3dcd9..61d4a0246 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -10,6 +10,14 @@ Buckaroo - FAQ As of 0.3.6 Buckaroo works properly in Visual Studio Code. You must install the `Visual Studio Code Jupyter Extension `_ and the `Jupyter Renderer extension `_. Then install buckaroo from pip and everything should work. +* **Does Buckaroo work with Google Colab** + +Yes Buckaroo has been tested to work with Google Colab. + +* **Does Buckaroo work with Jupyter Notebook** + +Right now, buckaroo only works with the latest release - NB7. The recommended way to run buckaroo is with "jupyter lab". It could be possible to make buckaroo work with the older notebook versions, but this takes significant packaging work. File a bug, when support for previous versions of Notebook becomes a serious barier to buckaroo adoption, it will be addressed. + * **Are there any similar projects to Buckaroo?** There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. diff --git a/package.json b/package.json index 36ef96ed5..1e40b26d8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.3.8", + "version": "0.3.9", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", @@ -30,10 +30,10 @@ "types": "./lib/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/paddymul/buckaroo" + "url": "https://github.com/paddymulp/buckaroo" }, "scripts": { - "build": "npm run build:lib && npm run build:labextension", + "build": "npm run build:lib && run build:labextension", "build-full": "npm run build:lib && run build:nbextension && npm run build:labextension", "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev", "build:labextension": "jupyter labextension build .", diff --git a/pyproject.toml b/pyproject.toml index 06cc87e52..49e665adb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,9 +33,10 @@ classifiers = [ "Programming Language :: Python :: 3.10", ] dependencies = [ - "ipywidgets>=7.6.0,<9" + "ipywidgets>=7.6.0,<9", + "jupyterlab>=3.6.0" ] -version = "0.3.8" +version = "0.3.10" [project.license] file = "LICENSE.txt" diff --git a/webpack.config.js b/webpack.config.js index dadcd8565..e47700ee4 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -93,6 +93,8 @@ const resolve = { }; module.exports = [ +// the following section must be commented out for the nbextension to work +// I think it must be enabled for the dev mode of the react app to work { entry: './examples/index-react18.tsx', output: { From b6b98ae080dd1d67e3815c1759406c14c659e7fd Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 19 Jul 2023 19:43:42 -0400 Subject: [PATCH 128/250] WIP, works in the notebook in dev mode --- buckaroo.json | 2 +- buckaroo/__init__.py | 9 +++++--- buckaroo/nbextension/extension.js | 2 +- introduction.ipynb | 2 +- js/extension.ts | 2 +- package.json | 4 ++-- pyproject.toml | 2 +- webpack.config.js | 36 +++++++++++++++---------------- 8 files changed, 31 insertions(+), 28 deletions(-) diff --git a/buckaroo.json b/buckaroo.json index e41e064f7..4c259e7fd 100644 --- a/buckaroo.json +++ b/buckaroo.json @@ -1,5 +1,5 @@ { "load_extensions": { - 'buckaroo-labextension':true + "buckaroo-labextension":true } } diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index 5d5a2c241..ef06b9863 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -39,9 +39,12 @@ def _jupyter_nbextension_paths(): return [{ 'section': 'notebook', 'src': 'nbextension', - 'dest': dest, - 'require': '%s/extension' % dest + 'dest': "buckaroo", + 'require': 'buckaroo/extension' }] -enable() +try: + enable() +except: + print("error enabling buckaroo as default display formatter for dataframes (ignore message during testing/builds") diff --git a/buckaroo/nbextension/extension.js b/buckaroo/nbextension/extension.js index 569692de6..8373518e1 100644 --- a/buckaroo/nbextension/extension.js +++ b/buckaroo/nbextension/extension.js @@ -6,7 +6,7 @@ define(function() { window['requirejs'].config({ map: { '*': { - 'dcf': 'nbextensions/dcf/index', + 'buckaroo': 'nbextensions/buckaroo/index', }, } }); diff --git a/introduction.ipynb b/introduction.ipynb index 1a18c5688..f8a27c1db 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -318,7 +318,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.8.0" } }, "nbformat": 4, diff --git a/js/extension.ts b/js/extension.ts index 2448859cb..86f007172 100644 --- a/js/extension.ts +++ b/js/extension.ts @@ -12,6 +12,6 @@ (window as any).__webpack_public_path__ = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion document.querySelector('body')!.getAttribute('data-base-url') + - 'nbextensions/dcef'; + 'nbextensions/buckaroo'; export * from './index'; diff --git a/package.json b/package.json index 1e40b26d8..dc0857e7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.3.9", + "version": "0.3.11", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", @@ -33,7 +33,7 @@ "url": "https://github.com/paddymulp/buckaroo" }, "scripts": { - "build": "npm run build:lib && run build:labextension", + "build": "npm run build:lib && npm run build:nbextension && npm run build:labextension", "build-full": "npm run build:lib && run build:nbextension && npm run build:labextension", "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev", "build:labextension": "jupyter labextension build .", diff --git a/pyproject.toml b/pyproject.toml index 49e665adb..82dc195b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "jupyterlab>=3.6.0" ] -version = "0.3.10" +version = "0.3.11" [project.license] file = "LICENSE.txt" diff --git a/webpack.config.js b/webpack.config.js index e47700ee4..6f90a2c76 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -95,24 +95,24 @@ const resolve = { module.exports = [ // the following section must be commented out for the nbextension to work // I think it must be enabled for the dev mode of the react app to work - { - entry: './examples/index-react18.tsx', - output: { - path: path.join(__dirname, '/examples/dist'), - filename: 'bundle.js' - }, - module: { - rules: demoRules, - }, - devtool: 'source-map', - externals, - resolve, - plugins: [new HtmlWebpackPlugin({ - //template: './examples/index.html' - template: './examples/index.html' - })], - performance - }, + // { + // entry: './examples/index-react18.tsx', + // output: { + // path: path.join(__dirname, '/examples/dist'), + // filename: 'bundle.js' + // }, + // module: { + // rules: demoRules, + // }, + // devtool: 'source-map', + // externals, + // resolve, + // plugins: [new HtmlWebpackPlugin({ + // //template: './examples/index.html' + // template: './examples/index.html' + // })], + // performance + // }, /** From d0a9b712993324b0959e06d1c9d717e44eb7c9d3 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 19 Jul 2023 23:30:31 -0400 Subject: [PATCH 129/250] added debug_packages to buckaroo --- buckaroo/__init__.py | 36 ++++++++++++++++++++++++++++++++++++ buckaroo/_version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index ef06b9863..f0b37491a 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from ._version import __version__ from .buckaroo_widget import BuckarooWidget, enable, disable dest = 'buckaroo-labextension' @@ -43,6 +44,41 @@ def _jupyter_nbextension_paths(): 'require': 'buckaroo/extension' }] +def debug_jupyter_packages(): + print("Selected Jupyter core packages...") + packages = [ + "buckaroo", + "jupyterlab", + "notebook", + "ipywidgets", + "traitlets", + "jupyter_core", + "pandas", + "numpy", + "IPython", + "ipykernel", + "jupyter_client", + "jupyter_server", + "nbclient", + "nbconvert", + "nbformat", + "qtconsole", + ] + + for package in packages: + try: + mod = __import__(package) + version = mod.__version__ + except ImportError: + version = "not installed" + print(f"{package:<17}:", version) + for package in packages: + try: + mod = __import__(package) + path = mod.__file__ + except ImportError: + path = "not installed" + print(f"{package:<17}:", path) try: enable() diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 4fc4fe6dc..44561ad38 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Bloomberg. # Distributed under the terms of the Modified BSD License. -__version__ = "0.2.1" +__version__ = "0.3.12" diff --git a/pyproject.toml b/pyproject.toml index 82dc195b6..40688edc8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "jupyterlab>=3.6.0" ] -version = "0.3.11" +version = "0.3.12" [project.license] file = "LICENSE.txt" From b4726c89e8e88104ab9a73882ad31caa4ac1b949 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 20 Jul 2023 09:15:53 -0400 Subject: [PATCH 130/250] cleaning up for the merge to main --- buckaroo/__init__.py | 2 ++ introduction.ipynb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index f0b37491a..9e0a407d4 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -84,3 +84,5 @@ def debug_jupyter_packages(): enable() except: print("error enabling buckaroo as default display formatter for dataframes (ignore message during testing/builds") + + diff --git a/introduction.ipynb b/introduction.ipynb index f8a27c1db..1a18c5688 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -318,7 +318,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.0" + "version": "3.11.3" } }, "nbformat": 4, From 59d498e25ce6b1207c0728c59bc04115f0adcf86 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 20 Jul 2023 09:16:59 -0400 Subject: [PATCH 131/250] better name for debug packages --- buckaroo/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index 9e0a407d4..0ec444d8a 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -44,7 +44,7 @@ def _jupyter_nbextension_paths(): 'require': 'buckaroo/extension' }] -def debug_jupyter_packages(): +def debug_packages(): print("Selected Jupyter core packages...") packages = [ "buckaroo", From 85d1ebc9990b4ea66f5c4b399d1d101c4a2b984c Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 21 Jul 2023 10:42:52 -0400 Subject: [PATCH 132/250] working build frankenstein between main and 5a80cec --- buckaroo.json | 2 +- buckaroo/__init__.py | 47 +++----------------------------------------- buckaroo/_version.py | 2 +- introduction.ipynb | 35 ++++++++++++++++++++++++++++----- package.json | 6 +++--- webpack.config.js | 38 +++++++++++++++++------------------ 6 files changed, 56 insertions(+), 74 deletions(-) diff --git a/buckaroo.json b/buckaroo.json index 4c259e7fd..e41e064f7 100644 --- a/buckaroo.json +++ b/buckaroo.json @@ -1,5 +1,5 @@ { "load_extensions": { - "buckaroo-labextension":true + 'buckaroo-labextension':true } } diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index 0ec444d8a..7021ed20e 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from ._version import __version__ from .buckaroo_widget import BuckarooWidget, enable, disable dest = 'buckaroo-labextension' @@ -40,49 +39,9 @@ def _jupyter_nbextension_paths(): return [{ 'section': 'notebook', 'src': 'nbextension', - 'dest': "buckaroo", - 'require': 'buckaroo/extension' + 'dest': dest, + 'require': '%s/extension' % dest }] -def debug_packages(): - print("Selected Jupyter core packages...") - packages = [ - "buckaroo", - "jupyterlab", - "notebook", - "ipywidgets", - "traitlets", - "jupyter_core", - "pandas", - "numpy", - "IPython", - "ipykernel", - "jupyter_client", - "jupyter_server", - "nbclient", - "nbconvert", - "nbformat", - "qtconsole", - ] - - for package in packages: - try: - mod = __import__(package) - version = mod.__version__ - except ImportError: - version = "not installed" - print(f"{package:<17}:", version) - for package in packages: - try: - mod = __import__(package) - path = mod.__file__ - except ImportError: - path = "not installed" - print(f"{package:<17}:", path) - -try: - enable() -except: - print("error enabling buckaroo as default display formatter for dataframes (ignore message during testing/builds") - +#enable() diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 44561ad38..4fc4fe6dc 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Bloomberg. # Distributed under the terms of the Modified BSD License. -__version__ = "0.3.12" +__version__ = "0.2.1" diff --git a/introduction.ipynb b/introduction.ipynb index 1a18c5688..f7445f3bd 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,9 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n", + "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n" + ] + } + ], "source": [ "import pandas as pd\n", "import numpy as np\n", @@ -13,9 +22,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1ab9f44b82a345749e10b78c2097dcd4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "BuckarooWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'filln…" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = pd.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')\n", "BuckarooWidget(df[:10_000])" @@ -318,7 +343,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/package.json b/package.json index dc0857e7a..0431abea8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.3.11", + "version": "0.2.3", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", @@ -30,10 +30,10 @@ "types": "./lib/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/paddymulp/buckaroo" + "url": "https://github.com/paddymul/buckaroo" }, "scripts": { - "build": "npm run build:lib && npm run build:nbextension && npm run build:labextension", + "build": "npm run build:lib && npm run build:labextension", "build-full": "npm run build:lib && run build:nbextension && npm run build:labextension", "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev", "build:labextension": "jupyter labextension build .", diff --git a/webpack.config.js b/webpack.config.js index 6f90a2c76..dadcd8565 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -93,26 +93,24 @@ const resolve = { }; module.exports = [ -// the following section must be commented out for the nbextension to work -// I think it must be enabled for the dev mode of the react app to work - // { - // entry: './examples/index-react18.tsx', - // output: { - // path: path.join(__dirname, '/examples/dist'), - // filename: 'bundle.js' - // }, - // module: { - // rules: demoRules, - // }, - // devtool: 'source-map', - // externals, - // resolve, - // plugins: [new HtmlWebpackPlugin({ - // //template: './examples/index.html' - // template: './examples/index.html' - // })], - // performance - // }, + { + entry: './examples/index-react18.tsx', + output: { + path: path.join(__dirname, '/examples/dist'), + filename: 'bundle.js' + }, + module: { + rules: demoRules, + }, + devtool: 'source-map', + externals, + resolve, + plugins: [new HtmlWebpackPlugin({ + //template: './examples/index.html' + template: './examples/index.html' + })], + performance + }, /** From fc58b4c6a754808e310efa675224d6236d8de580 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 21 Jul 2023 10:45:40 -0400 Subject: [PATCH 133/250] working build, going back to main webpack.config.js --- webpack.config.js | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index dadcd8565..6f90a2c76 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -93,24 +93,26 @@ const resolve = { }; module.exports = [ - { - entry: './examples/index-react18.tsx', - output: { - path: path.join(__dirname, '/examples/dist'), - filename: 'bundle.js' - }, - module: { - rules: demoRules, - }, - devtool: 'source-map', - externals, - resolve, - plugins: [new HtmlWebpackPlugin({ - //template: './examples/index.html' - template: './examples/index.html' - })], - performance - }, +// the following section must be commented out for the nbextension to work +// I think it must be enabled for the dev mode of the react app to work + // { + // entry: './examples/index-react18.tsx', + // output: { + // path: path.join(__dirname, '/examples/dist'), + // filename: 'bundle.js' + // }, + // module: { + // rules: demoRules, + // }, + // devtool: 'source-map', + // externals, + // resolve, + // plugins: [new HtmlWebpackPlugin({ + // //template: './examples/index.html' + // template: './examples/index.html' + // })], + // performance + // }, /** From 0b23b21fff76dce7bb25ad48990d95704cc76457 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 21 Jul 2023 11:30:53 -0400 Subject: [PATCH 134/250] working ported over main's __init__ --- buckaroo.json | 2 +- buckaroo/__init__.py | 84 +++++++++++++++++++++++++++++++++----------- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/buckaroo.json b/buckaroo.json index e41e064f7..409718511 100644 --- a/buckaroo.json +++ b/buckaroo.json @@ -1,5 +1,5 @@ { "load_extensions": { - 'buckaroo-labextension':true + 'buckaroo/extension':true } } diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index 7021ed20e..ba6feb3cf 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -1,24 +1,7 @@ # -*- coding: utf-8 -*- +from ._version import __version__ from .buckaroo_widget import BuckarooWidget, enable, disable -dest = 'buckaroo-labextension' -def _jupyter_labextension_paths(): - """Called by Jupyter Lab Server to detect if it is a valid labextension and - to install the widget - Returns - ======= - src: Source directory name to copy files from. Webpack outputs generated files - into this directory and Jupyter Lab copies from this directory during - widget installation - dest: Destination directory name to install widget files to. Jupyter Lab copies - from `src` directory into /labextensions/ directory - during widget installation - """ - return [{ - 'src': 'labextension', - 'dest': dest - }] - def _jupyter_nbextension_paths(): """Called by Jupyter Notebook Server to detect if it is a valid nbextension and @@ -39,9 +22,68 @@ def _jupyter_nbextension_paths(): return [{ 'section': 'notebook', 'src': 'nbextension', - 'dest': dest, - 'require': '%s/extension' % dest + 'dest': "buckaroo", + 'require': 'buckaroo/extension' + }] + + +def _jupyter_labextension_paths(): + """Called by Jupyter Lab Server to detect if it is a valid labextension and + to install the widget + Returns + ======= + src: Source directory name to copy files from. Webpack outputs generated files + into this directory and Jupyter Lab copies from this directory during + widget installation + dest: Destination directory name to install widget files to. Jupyter Lab copies + from `src` directory into /labextensions/ directory + during widget installation + """ + return [{ + 'src': 'labextension', + 'dest': "buckaroo" }] -#enable() +def debug_packages(): + print("Selected Jupyter core packages...") + packages = [ + "buckaroo", + "jupyterlab", + "notebook", + "ipywidgets", + "traitlets", + "jupyter_core", + "pandas", + "numpy", + "IPython", + "ipykernel", + "jupyter_client", + "jupyter_server", + "nbclient", + "nbconvert", + "nbformat", + "qtconsole", + ] + + for package in packages: + try: + mod = __import__(package) + version = mod.__version__ + except ImportError: + version = "not installed" + print(f"{package:<17}:", version) + for package in packages: + try: + mod = __import__(package) + path = mod.__file__ + except ImportError: + path = "not installed" + print(f"{package:<17}:", path) + +try: + enable() +except: + print("error enabling buckaroo as default display formatter for dataframes (ignore message during testing/builds") + + From 1f6edae7f8e143489d69dc7e52ec5004d4e36100 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 21 Jul 2023 11:36:39 -0400 Subject: [PATCH 135/250] works in jupyter notebook, changed double quotes to single to make notebook installer happy --- buckaroo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buckaroo.json b/buckaroo.json index 409718511..2e0ad579b 100644 --- a/buckaroo.json +++ b/buckaroo.json @@ -1,5 +1,5 @@ { "load_extensions": { - 'buckaroo/extension':true + "buckaroo/extension":true } } From 89868cbd72eae30e2d23f11b74e89d7be073590e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 21 Jul 2023 13:51:42 -0400 Subject: [PATCH 136/250] succesfully installing package for jupyterlab, still not working for jupyter notebook --- package.json | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0431abea8..f018f4f36 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "url": "https://github.com/paddymul/buckaroo" }, "scripts": { - "build": "npm run build:lib && npm run build:labextension", + "build": "npm run build:lib && npm run build:nbextension && npm run build:labextension", "build-full": "npm run build:lib && run build:nbextension && npm run build:labextension", "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev", "build:labextension": "jupyter labextension build .", diff --git a/pyproject.toml b/pyproject.toml index 40688edc8..8899cedc7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "jupyterlab>=3.6.0" ] -version = "0.3.12" +version = "0.3.16" [project.license] file = "LICENSE.txt" From ad5d550292192b4fe3e173d0e50941c07bd30e30 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 22 Jul 2023 10:58:50 -0400 Subject: [PATCH 137/250] released 0.3.17 --- full_build.sh | 6 +++--- package.json | 2 +- pyproject.toml | 12 ++++++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/full_build.sh b/full_build.sh index e13eda9c3..91e33f393 100755 --- a/full_build.sh +++ b/full_build.sh @@ -1,10 +1,10 @@ #!/bin/bash set -e #rm -rf node_modules -#rm -rf dist +rm -rf dist python -m build . rm -f dist/index.js dist/index.js.LICENSE.txt twine check dist/* -#python -m twine upload --repository testpypi dist/* +python -m twine upload --repository testpypi dist/* python -m twine upload --repository pypi dist/* -npm publish +#npm publish diff --git a/package.json b/package.json index f018f4f36..16a7d948b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.3", + "version": "0.2.25", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 8899cedc7..38f73cc19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,9 +34,8 @@ classifiers = [ ] dependencies = [ "ipywidgets>=7.6.0,<9", - "jupyterlab>=3.6.0" ] -version = "0.3.16" +version = "0.3.17" [project.license] file = "LICENSE.txt" @@ -49,9 +48,18 @@ test = [ "pytest>=6", ] +jupyterlab = ["jupyterlab>=3.6.0"] +notebook = ["notebook>=7.0.0"] + + docs = [ "sphinx>=1.5" ] + +build = [ +"twine", +"build" +] [project.urls] Homepage = "https://github.com/paddymul/buckaroo" From a0b33ba65ec5517227924b16e6c7d212ac721feb Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 7 Aug 2023 10:12:40 -0400 Subject: [PATCH 138/250] initial commit of pluggable analysis framework (#29) * Adds the initial implementation of the pluggable analysis framework. This allows summary stats to be added and configured dynamically in a notebook. --- .github/workflows/build.yml | 5 +- buckaroo/__init__.py | 3 +- buckaroo/analysis.py | 125 +++++++++++++++ buckaroo/analysis_management.py | 142 ++++++++++++++++++ buckaroo/buckaroo_widget.py | 108 ++++++------- buckaroo/pluggable_analysis_framework.py | 100 ++++++++++++ buckaroo/summary_stats.py | 67 +++++---- buckaroo/widget_utils.py | 40 +++++ docs/source/articles/pluggable.rst | 167 +++++++++++++++++++++ pyproject.toml | 5 +- tests/analysis_management_test.py | 96 ++++++++++++ tests/analysis_test.py | 30 ++++ tests/basic_widget_test.py | 8 + tests/fixtures.py | 73 +++++++++ tests/pluggable_analysis_framework_test.py | 92 ++++++++++++ 15 files changed, 968 insertions(+), 93 deletions(-) create mode 100644 buckaroo/analysis.py create mode 100644 buckaroo/analysis_management.py create mode 100644 buckaroo/pluggable_analysis_framework.py create mode 100644 buckaroo/widget_utils.py create mode 100644 docs/source/articles/pluggable.rst create mode 100644 tests/analysis_management_test.py create mode 100644 tests/analysis_test.py create mode 100644 tests/fixtures.py create mode 100644 tests/pluggable_analysis_framework_test.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 17aadd3cd..e07553494 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,12 +13,15 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - python-version: ["3.7", "3.10"] + python-version: ["3.8", "3.11"] steps: - name: Checkout uses: actions/checkout@v2 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" - name: Install dependencies run: | diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index ba6feb3cf..df0722a4c 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from ._version import __version__ -from .buckaroo_widget import BuckarooWidget, enable, disable +from .buckaroo_widget import BuckarooWidget +from .widget_utils import enable, disable def _jupyter_nbextension_paths(): diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py new file mode 100644 index 000000000..260f6e5b1 --- /dev/null +++ b/buckaroo/analysis.py @@ -0,0 +1,125 @@ +from functools import reduce +import pandas as pd +from pandas.io.json import dumps as pdumps +import numpy as np +from buckaroo.pluggable_analysis_framework import ColAnalysis + +def probable_datetime(ser): + s_ser = ser.sample(np.min([len(ser), 500])) + try: + dt_ser = pd.to_datetime(s_ser) + #pd.to_datetime(1_00_000_000_000_000_000) == pd.to_datetime('1973-01-01') + if dt_ser.max() < pd.to_datetime('1973-01-01'): + return False + return True + + except Exception as e: + return False + +def get_mode(ser): + mode_raw = ser.mode() + if len(mode_raw) == 0: + return np.nan + else: + return mode_raw.values[0] + +""" +to best take advantage of the DAG and pluggable_analysis_framework, structure your code as follows +a single ColAnalysis can return multiple facts, but those facts shouldn't be interdepedent +That way individual facts can be overridden via the DAG machinery, and other facts that depend on them will +get the proper value + +Overtime codebases will probably trend towards many classes with single facts, but it doesn't have to be that way. Code what comes naturally to you + + +""" + +class TypingStats(ColAnalysis): + provided_summary = [ + 'dtype', 'is_numeric', 'is_integer', 'is_datetime',] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + return dict( + dtype=ser.dtype, + is_numeric=pd.api.types.is_numeric_dtype(ser), + is_integer=pd.api.types.is_integer_dtype(ser), + is_datetime=probable_datetime(ser), + memory_usage=ser.memory_usage() + ) + +class DefaultSummaryStats(ColAnalysis): + provided_summary = [ + 'length', 'min', 'max', 'mean', 'nan_count', 'distinct_count', + 'distinct_per', 'empty_count', 'empty_per', 'unique_per', 'nan_per', + 'mode'] + + summary_stats_display = [ + 'dtype', + 'length', 'nan_count', 'distinct_count', 'empty_count', + 'empty_per', 'unique_per', 'nan_per', 'is_numeric', 'is_integer', + 'is_datetime', 'mode', 'min', 'max','mean'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + l = len(ser) + val_counts = ser.value_counts() + distinct_count= len(val_counts) + nan_count = l - len(ser.dropna()) + unique_count = len(val_counts[val_counts==1]) + empty_count = val_counts.get('', 0) + + is_numeric = pd.api.types.is_numeric_dtype(ser) + is_object = pd.api.types.is_object_dtype + + base_d = dict( + length=l, + nan_count=nan_count, + distinct_count=distinct_count, + distinct_per=distinct_count/l, + empty_count=empty_count, + empty_per=empty_count/l, + unique_per=unique_count/l, + nan_per=nan_count/l, + mode=get_mode(ser), + min=(is_numeric and ser.dropna().min() or np.nan), + max=(is_numeric and ser.dropna().max() or np.nan), + mean=(is_numeric and ser.dropna().mean() or np.nan)) + if is_numeric: + base_d['mean'] = ser.mean() + return base_d + + +def int_digits(n): + if n == 0: + return 1 + if np.sign(n) == -1: + return int(np.floor(np.log10(np.abs(n)))) + 2 + return int(np.floor(np.log10(n)+1)) + +def histogram(ser): + raw_counts, bins = np.histogram(ser, 10) + scaled_counts = np.round(raw_counts/raw_counts.sum(),2) + return [scaled_counts, bins] + + +class ColDisplayHints(ColAnalysis): + requires_summary = ['min', 'max'] # What summary stats does this analysis provide + provided_summary = [] + + provides_hints = [ + 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram'] + + @staticmethod + def col_hints(sampled_ser, summary_ser, ser): + is_numeric = pd.api.types.is_numeric_dtype(ser.dtype) + if not is_numeric: + return dict(is_numeric=False) + if len(ser) == 0: + return dict(is_numeric=False) + return dict( + is_numeric=True, + is_integer=pd.api.types.is_integer_dtype(ser), + min_digits=int_digits(summary_ser.loc['min']), + max_digits=int_digits(summary_ser.loc['max']), + histogram=histogram(ser)) diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py new file mode 100644 index 000000000..b5eff8eda --- /dev/null +++ b/buckaroo/analysis_management.py @@ -0,0 +1,142 @@ +import numpy as np +import pandas as pd + +from buckaroo.pluggable_analysis_framework import ( + ColAnalysis, order_analysis, check_solvable, NotProvidedException) + + +FAST_SUMMARY_WHEN_GREATER = 1_000_000 + + +def produce_summary_df(df, ordered_objs, df_name='test_df'): + """ + takes a dataframe and a list of analyses that have been ordered by a graph sort, + then it produces a summary dataframe + """ + errs = {} + summary_col_dict = {} + table_hint_col_dict = {} + #figure out how to add in "index"... but just for table_hints + for ser_name in df.columns: + ser = df[ser_name] + #fixme + sampled_ser = ser + summary_ser = pd.Series({}, dtype='object') + table_hint_dict = {} + for a_kls in ordered_objs: + try: + summary_res = a_kls.summary(ser, summary_ser, ser) + for k,v in summary_res.items(): + summary_ser.loc[k] = v + for k,v in a_kls.table_hints(sampled_ser, summary_ser, table_hint_dict): + table_hint_dict[k] = v + except Exception as e: + print("summary_ser", summary_ser) + errs[ser_name] = e, a_kls + continue + summary_col_dict[ser_name] = summary_ser + table_hint_col_dict[ser_name] = table_hint_dict + if errs: + for ser_name, err_kls in errs.items(): + err, kls = err_kls + print("%r failed on %s with %r" % (kls, ser_name, err)) + print("Reproduce") + print("from pluggable_analysis import test_ser") + for ser_name, err_kls in errs.items(): + err, kls = err_kls + print("%s.summary(test_ser.%s)" % (kls.__name__, ser_name)) + return pd.DataFrame(summary_col_dict), table_hint_col_dict + +class NonExistentSummaryRowException(Exception): + pass + +class AnalsysisPipeline(object): + """ + manage the ordering of a set of col_analysis objects + allow for computing summary_stats (and other oberservation sets) based on col_analysis objects + allow col_anlysis objects to be added + """ + def __init__(self, analysis_objects, unit_test_objs=True): + self.summary_stats_display = "all" + self.unit_test_objs = unit_test_objs + self.verify_analysis_objects(analysis_objects) + + def process_summary_facts_set(self): + all_provided = [] + for a_obj in self.ordered_a_objs: + all_provided.extend(a_obj.provided_summary) + if a_obj.summary_stats_display: + self.summary_stats_display = a_obj.summary_stats_display + + self.provided_summary_facts_set = set(all_provided) + + + #all is a special value that will dipslay every row + if self.summary_stats_display and not self.summary_stats_display == "all": + #verify that we have a way of computing all of the facts we are displaying + if not self.provided_summary_facts_set.issuperset(set(self.summary_stats_display)): + raise NonExistentSummaryRowException() + + def verify_analysis_objects(self, analysis_objects): + self.ordered_a_objs = order_analysis(analysis_objects) + check_solvable(self.ordered_a_objs) + self.process_summary_facts_set() + if self.unit_test_objs: + self.unit_test() + + def unit_test(self): + """test a single, or each col_analysis object with a set of commonly difficult series. + not implemented yet. + + This helps interactive development by doing a smoke test on + each new iteration of summary stats function + + """ + pass + + def process_df(self, input_df): + output_df, table_hint_dict = produce_summary_df(input_df, self.ordered_a_objs) + return output_df, table_hint_dict + + def add_analysis(self, new_aobj): + new_cname = new_aobj.cname() + new_aobj_set = [] + for aobj in self.ordered_a_objs: + if aobj.cname() == new_cname: + continue + new_aobj_set.append(aobj) + new_aobj_set.append(new_aobj) + self.verify_analysis_objects(new_aobj_set) + +class DfStats(object): + ''' + DfStats exists to handle inteligent downampling and applying the ColAnalysis functions + ''' + + def __init__(self, df, col_analysis_objs): + self.df = self.get_operating_df(df, force_full_eval=False) + self.col_order = self.df.columns + self.ap = AnalsysisPipeline(col_analysis_objs) + self.sdf, self.table_hints = self.ap.process_df(self.df) + + + def get_operating_df(self, df, force_full_eval): + rows = len(df) + cols = len(df.columns) + item_count = rows * cols + + if item_count > FAST_SUMMARY_WHEN_GREATER: + return df.sample(np.min([50_000, len(df)])) + else: + return df + + @property + def presentation_sdf(self): + if self.ap.summary_stats_display == "all": + return self.sdf + return self.sdf.loc[self.ap.summary_stats_display] + + def add_analysis(self, a_obj): + self.ap.add_analysis(a_obj) + self.sdf, self.table_hints = self.ap.process_df(self.df) + diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index b209e9fbc..04ec3f8aa 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -7,26 +7,44 @@ """ TODO: Add module docstring """ -import numpy as np +import json + from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe -import pandas as pd + from ._frontend import module_name, module_version from .all_transforms import configure_buckaroo, DefaultCommandKlsList -from .summary_stats import summarize_df, table_sumarize, sample, DfStats -import json -from IPython.core.getipython import get_ipython -from IPython.display import display +from .summary_stats import sample + +from .analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) +from .analysis_management import DfStats + from pandas.io.json import dumps as pdumps -#from pandas.io.json._json import JSONTableWriter -#jst = JSONTableWriter(df3, orient='table', date_format="iso", double_precision=10, ensure_ascii=True, date_unit="ms", index=None, default_handler=str) -def df_to_obj(df, order = None): +#empty_df = pd.DataFrame({}) +#json.loads(empty_df.to_json(orient='table', indent=2)) +EMPTY_DF_OBJ = {'schema': {'fields': [{'name': 'index', 'type': 'string'}], + 'primaryKey': ['index'], + 'pandas_version': '1.4.0'}, + 'data': []} + + +def dumb_table_sumarize(df): + """used when table_hints aren't provided. Trests every column as a string""" + table_hints = {col:{'is_numeric':False} for col in df} + table_hints['index'] = {'is_numeric': False} + return table_hints + + +def df_to_obj(df, order = None, table_hints=None): if order is None: order = df.columns obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) - obj['table_hints'] = json.loads(pdumps(table_sumarize(df))) + if table_hints is None: + obj['table_hints'] = json.loads(pdumps(dumb_table_sumarize(df))) + else: + obj['table_hints'] = json.loads(pdumps(table_hints)) fields=[{'name':'index'}] for c in order: fields.append({'name':c}) @@ -54,7 +72,6 @@ class BuckarooWidget(DOMWidget): operation_results = Dict({}).tag(sync=True) - dfConfig = Dict( { 'totalRows': 1234569, @@ -67,13 +84,7 @@ class BuckarooWidget(DOMWidget): 'showTransformed': True, 'showCommands': True, }).tag(sync=True) - - summary_df_cols = [ - 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count', - 'empty_per', 'unique_per', 'nan_per', 'is_numeric', 'is_integer', - 'is_datetime', 'mode', 'min', 'max','mean', - ] def __init__(self, df, sampled=True, @@ -96,10 +107,8 @@ def __init__(self, df, if fast_mode: self.dfConfig['sampled'] = True - - - self.stats = DfStats(df) - self.summaryDf = df_to_obj(self.stats.sdf.loc[self.summary_df_cols], self.stats.col_order) + self.stats = DfStats(df, [TypingStats, DefaultSummaryStats, ColDisplayHints]) + self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) tempDfc = self.dfConfig.copy() tempDfc.update(dict( @@ -107,21 +116,33 @@ def __init__(self, df, columns=len(df.columns), showTransformed=showTransformed, showCommands=showCommands)) + self.df = df self.dfConfig = tempDfc + #just called to trigger setting origDf properly self.update_based_on_df_config(3) self.operation_results = { 'transformed_df':self.origDf, 'generated_py_code':'#from py widget init'} self.setup_from_command_kls_list() + def add_analysis(self, analysis_obj): + self.stats.add_analysis(analysis_obj) + self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) + #just trigger redisplay + self.update_based_on_df_config(3) + @observe('dfConfig') def update_based_on_df_config(self, change): tdf = self.df_from_dfConfig() - if self.dfConfig['reorderdColumns']: - self.origDf = df_to_obj(tdf, self.stats.col_order) + if self.dfConfig['reorderdColumns']: + #ideally this won't require a reserialization. All + #possible col_orders shoudl be serialized once, and the + #frontend should just toggle from them + #self.origDf = df_to_obj(tdf, self.stats.col_order, table_hints=self.stats.table_hints) + self.origDf = df_to_obj(tdf, self.stats.col_order) #, table_hints=self.stats.table_hints) else: - self.origDf = df_to_obj(tdf) + self.origDf = df_to_obj(tdf) #, table_hints=self.stats.table_hints) def df_from_dfConfig(self): if self.dfConfig['sampled']: @@ -145,14 +166,14 @@ def interpret_operations(self, change): #print('exiting early') return #generating python code seems slightly less error prone than the transform - results['generated_py_code'] = self.buckaroo_to_py_core(operations[1:]) + results['generated_py_code'] = self.buckaroo_to_py_core(operations[1:]) + #note doesn't use df_to_obj transformed_df = self.buckaroo_transform(operations, self.df) results['transformed_df'] = json.loads(transformed_df.to_json(orient='table', indent=2)) results['transform_error'] = False except Exception as e: - empty_df = pd.DataFrame({}) - results['transformed_df'] = json.loads(empty_df.to_json(orient='table', indent=2)) + results['transformed_df'] = EMPTY_DF_OBJ print(e) results['transform_error'] = str(e) self.operation_results = results @@ -170,36 +191,5 @@ def add_command(self, incomingCommandKls): self.command_classes = without_incoming self.setup_from_command_kls_list() -def _display_as_buckaroo(df): - return display(BuckarooWidget(df, showCommands=False, showTransformed=False)) - -def enable(): - """ - Automatically use buckaroo to display all DataFrames - instances in the notebook. - - """ - try: - from IPython.core.getipython import get_ipython - except ImportError: - raise ImportError('This feature requires IPython 1.0+') - - ip = get_ipython() - ip_formatter = ip.display_formatter.ipython_display_formatter - - ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) - - -def disable(): - """ - disable bucakroo as the default display method for DataFrames + - """ - try: - from IPython.core.getipython import get_ipython - except ImportError: - raise ImportError('This feature requires IPython 1.0+') - - ip = get_ipython() - ip_formatter = ip.display_formatter.ipython_display_formatter - ip_formatter.type_printers.pop(pd.DataFrame, None) diff --git a/buckaroo/pluggable_analysis_framework.py b/buckaroo/pluggable_analysis_framework.py new file mode 100644 index 000000000..86f290831 --- /dev/null +++ b/buckaroo/pluggable_analysis_framework.py @@ -0,0 +1,100 @@ +import graphlib +import unittest +import pandas as pd +import numpy as np +from collections import OrderedDict + +class ColAnalysis(object): + """ + Col Analysis runs on a single column + """ + requires_raw = False + requires_summary = [] # What summary stats does this analysis provide + provided_summary = [] # mean/max/histogram + provided_cleaning = None # or the name of the set of transforms this provides for column reordering + provides_table_hints = None # display hints provided ex 'red_negative' + summary_stats_display = None + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + return {} + + @staticmethod + def column_order(sampled_ser, summary_ser): + pass + + @staticmethod + def cleaning(sampled_ser, summary_ser): + #I want this to emit Operations for consumption by the UI and + #possibly the transformed dataframe, not sure + pass + + @staticmethod + def table_hints(sampled_ser, summary_ser, existing_table_hints): + return {} + + @classmethod + def cname(kls): + #print(dir(kls)) + return kls.__qualname__ + + + +class NotProvidedException(Exception): + pass + +def check_solvable(a_objs): + """ + checks taht all of the required inputs are provided by another analysis object. + """ + provided = [] + required = [] + for ao in a_objs: + provided.extend(ao.provided_summary) + required.extend(ao.requires_summary) + all_provided = set(provided) + all_required = set(required) + if not all_required.issubset(all_provided): + missing = all_required - all_provided + raise NotProvidedException("Missing provided analysis for %r" % missing) + +def remove_duplicates(lst): + return list(OrderedDict.fromkeys(lst)) + +def clean_list(full_class_list): + only_kls_lst = [kls for kls in full_class_list if not kls == None] + #note I also want someway to detect that classes don't alternate + # ['a', 'a', 'b', 'c', 'c'] # fine + # ['a', 'a', 'b', 'a', 'c'] # something went wrong with the graph algo + return remove_duplicates(only_kls_lst) + + +def order_analysis(a_objs): + """order a set of col analysis objects such that the dag of their + provided_summary and requires_summary is ordered for computation + """ + + graph = {} + key_class_objs = {} + for ao in a_objs: + if len(ao.provided_summary) == 0: + temp_provided = "__no_provided_keys__" + else: + temp_provided = ao.provided_summary[0] + first_mid_key = mid_key = ao.__name__ + "###" + temp_provided + for k in ao.provided_summary[1:]: + #print("k", k) + next_mid_key = ao.__name__ + "###" + k + graph[mid_key] = set([next_mid_key]) + key_class_objs[mid_key] = ao + mid_key = next_mid_key + graph[mid_key] = set(ao.requires_summary) + key_class_objs[mid_key] = ao + for j in ao.provided_summary: + #print("j", j) + graph[j] = set([first_mid_key]) + ts = graphlib.TopologicalSorter(graph) + seq = tuple(ts.static_order()) + #print("seq", seq) + full_class_list = [key_class_objs.get(k, None) for k in seq] + return clean_list(full_class_list) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py index df1247e96..510cc5983 100644 --- a/buckaroo/summary_stats.py +++ b/buckaroo/summary_stats.py @@ -4,8 +4,6 @@ import numpy as np - - def probable_datetime(ser): s_ser = ser.sample(np.min([len(ser), 500])) try: @@ -223,32 +221,41 @@ def add_col_rankings(df, sdf): set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) -FAST_SUMMARY_WHEN_GREATER = 1_000_000 -class DfStats(object): - def __init__(self, - df, - annotate_funcs=[add_col_rankings], - # summary_func=summary_stats.summarize_df, - # order_col_func=summary_stats.order_columns): - summary_func=summarize_df, - order_col_func=order_columns): - - rows = len(df) - cols = len(df.columns) - item_count = rows * cols - - - if item_count > FAST_SUMMARY_WHEN_GREATER: - df = df.sample(np.min([50_000, len(df)])) - self.df = df - self.sdf = summary_func(df) - for func in annotate_funcs: - func(df, self.sdf) - try: - self.cpd = get_cor_pair_dict(self.df, self.sdf) - self.col_order = order_col_func(self.sdf, self.cpd) - except Exception as e: - print(e) - self.col_order = self.df.columns - +def int_digits(n): + if n == 0: + return 1 + if np.sign(n) == -1: + return int(np.floor(np.log10(np.abs(n)))) + 2 + return int(np.floor(np.log10(n)+1)) + + +def histogram(ser): + raw_counts, bins = np.histogram(ser, 10) + scaled_counts = np.round(raw_counts/raw_counts.sum(),2) + return [scaled_counts, bins] + +def table_sumarize_num_ser(ser): + if len(ser) == 0: + return dict(is_numeric=False) + return dict( + is_numeric=True, + is_integer=pd.api.types.is_integer_dtype(ser), + min_digits=int_digits(ser.min()), + max_digits=int_digits(ser.max()), + histogram=histogram(ser)) + +def table_sumarize_obj_ser(ser): + return dict( + is_numeric=False) + +def table_sumarize_ser(ser): + if pd.api.types.is_numeric_dtype(ser.dtype): + return table_sumarize_num_ser(ser.dropna()) + else: + return table_sumarize_obj_ser(ser) + +def table_sumarize(df): + table_hints = {col:table_sumarize_ser(df[col]) for col in df} + table_hints['index'] = table_sumarize_ser(df.index) + return table_hints diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py new file mode 100644 index 000000000..b33493bfe --- /dev/null +++ b/buckaroo/widget_utils.py @@ -0,0 +1,40 @@ +from .buckaroo_widget import BuckarooWidget +import pandas as pd + +def _display_as_buckaroo(df): + from IPython.display import display + return display(BuckarooWidget(df, showCommands=False, showTransformed=False)) + +def enable(): + """ + Automatically use buckaroo to display all DataFrames + instances in the notebook. + + """ + try: + from IPython.core.getipython import get_ipython + except ImportError: + raise ImportError('This feature requires IPython 1.0+') + + ip = get_ipython() + if ip is None: + print("must be running inside ipython to enable default display via enable()") + return + ip_formatter = ip.display_formatter.ipython_display_formatter + ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) + + +def disable(): + """ + disable bucakroo as the default display method for DataFrames + + """ + try: + from IPython.core.getipython import get_ipython + except ImportError: + raise ImportError('This feature requires IPython 1.0+') + + ip = get_ipython() + + ip_formatter = ip.display_formatter.ipython_display_formatter + ip_formatter.type_printers.pop(pd.DataFrame, None) diff --git a/docs/source/articles/pluggable.rst b/docs/source/articles/pluggable.rst new file mode 100644 index 000000000..f0abe603a --- /dev/null +++ b/docs/source/articles/pluggable.rst @@ -0,0 +1,167 @@ +.. _using: + +============================ +Pluggable analysis framework +============================ + +The pluggable analysis framework is built to allow the different bits of analysis done by buckaroo to be mixed and matched as configuration, without requiring editting the core of buckaroo. Pieces of analysis can build on each other, and errors are flagged intelligently. + + +Analysis In Action +================== + +The most obvious piece of analysis is adding a new measure/fact to summary stats. + +A monolithic summary_stats would look like this + +.. code-block:: python + + def summarize_string(ser): + l = len(ser) + val_counts = ser.value_counts() + distinct_count= len(val_counts) + + return dict( + dtype=ser.dtype, + length=l, + min='', + distinct_count= distinct_count, + distinct_percent = distinct_count/l) + + def summarize_df(df): + summary_df = pd.DataFrame({col:summarize_string(df[col]) for col in df}) + return summary_df + + +If you wanted to enhance that simple summary_stat by adding nan_count and nan_percent, you would have to rewrite the entire function and get buckaroo to use your new function. Instead, imagine that the existing ``sumarize_string`` was already built into Buckaroo and you wanted to add to it. Here's what the code looks like. + + +.. code-block:: python + + bw = BuckarooWidget(df) + @bw.add_analysis + class NanStats(ColAnalysis): + provided_summary = [ + 'nan_count', 'nan_percent'] + requires_summary = ['length'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + l = summary_ser.loc['min'] + nan_count = l - len(ser.dropna()) + return dict( + nan_count = nan_count, + nan_percent = nan_count/l) + bw #render the buckaroo widget + + + + +Now buckaroo will be displayed with the new summary stats of 'nan_count' and 'nan_percent'. Buckaroo knows that ``NanStats`` must be called after the ``ColAnalysis`` object that provides ``length`` and that ordering is handled for you automatically (via a DAG). + +You can then iteratively and interactively update your analysis in the jupyter notebook focussing on the core of your business logic without worrying about how to structure your code. When ``add_analysis`` is called, a set of simple unit tests are run that catch common errors with weird datashapes. This means you can focus on coding and not worry about all the edge cases. + + +Features of the Pluggable Analysis Framework +============================================ + +Every aspect of the interactive experience of buckaroo can be manipulated through Analysis objects + +summary_stats + different facts can be added to the summary stats view... This is the most basic type of analysis to add + +table_hints + # used for styling hints like coloring or font. The frontend currently doesn't do much with table_hints + +column_ordering + Allows a custom ordering of columns + + .. code-block:: python + + class NumbersFirst(ColAnalysis): + requires_summary = ['is_numeric'] + + @staticmethod + def column_ordering(summary_df): + # I know that this could be done in pure pandas on the summary_df + col_dicts = [] + for i, col in enumerate(df.columns): + col_facts = { + 'name':col, + 'existing_order_score': i/len(df.columns)} + if summary_df[col]['is_numeric']: + col_facts['numeric_boost'] = 2 + else: + col_facts['numeric_boost'] = 0 + col_facts['total_score'] = col_facts['existing_order_score'] + col_facts['numeric_boost'] + return [cd['name'] for cd in sorted(col_dicts, key=lambda x: x['total_score'])] + +default_cleaning_instructions + + If a column has 5000 rows, and 3000 of them are parseable as an integer, and the other 2000 rows are "n/a", it was probably the intention of the original data for this to be an integer column with nulls. DefaultCleaningInstructions. The transform to integer can be coded as a custom command for the low-code-ui, then you can write a ColAnalysis that suggests this transform be automatically executed on load of a dataframe. + + It would look like this + + .. code-block:: python + + def safe_int(x): + try: + return int(x) + except: + return np.nan + + class IntClean(ColAnalysis): + provided_summary = [ + 'cleanable_int'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + counts = sampled_ser.value_counts() + parseable = 0 + for val in counts.index: + if safe_int(val) not np.nan: + parseable += 1 + + mostly_parseable = parseable / len(counts) > 0.95 + return {'cleanable_int': mostly_parseable} + + @staticmethod + def cleaning_instruction(summary_ser, col_name): + if summary_ser.loc['cleanable_int'] == False: + return None + return ['safe_int', col_name] + + + Then this clean_int will be automatically loaded into the instruction viewer in the low code ui, and it will already have been executed for the loaded dataframe + + I'm still figuring out how to toggle through different cleanings. I'm worried about modifying the default columns. I guess I can make the returned cleaning instructions do a column rename by convention. so for the above cleaning instruction first copy the original column name to "_orig" + +summary_stats_set + a list of which rows from summary stats to display. Currently only the last added summary_stats_set is used + + +multiple column_orderings and summary_stats_facts can be added. Then the UI allows the user to toggle through the different column orderings to see the view of the table they want. + +Order of Operations +=================== + + +The pluggable analysis framework runs different functions on analysis functions in a specific order. First the DAG for all of the analysis objects and verifies that all of the needed facts can be computed. once all of the analysis objects are ordered the computations start. + +1. Compute the order of analysis objects. This builds a DAG and makes sure all of the facts can be computed. +2. Run all of the ``summary`` methods and build the ``summary_df`` +3. Run all of the ``cleaning_instructions`` methods and get the list of interpreter instructions +4. Run the interpreter and produce a new "cleaned" dataframe +5. Run all of the ``summary`` methods and build the ``summary_df`` for the cleaned dataframe. +6. Run all of the ``table_hints`` methods and build the table_hints dictionary +7. Run all of the ``col_ordering`` methods and produce the different col_orderings. + +Porting to polars +================= + +I would really like to be able to run these computations in lazy polars, there should be very significant speed increases. I think this stackoverflow answer might be the key... but I'm not sure https://stackoverflow.com/a/76560342 + + +For now I'm just focussing on writing the framework and making sure it works... I can make it fast later... I think. + +After further thought, I think I can make all of the base series calcs lazy with pl.struct. Then do all the other calcs in pure python (they should be fast). diff --git a/pyproject.toml b/pyproject.toml index 38f73cc19..fe1e5939d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ classifiers = [ ] dependencies = [ "ipywidgets>=7.6.0,<9", + "graphlib_backport>=1.0.0" ] version = "0.3.17" @@ -99,8 +100,8 @@ ensured-targets = [ "buckaroo/nbextension/index.js", "buckaroo/labextension/package.json", ] -#"hatch-jupyter-builder>=0.8.1", -dependencies = ["hatch-jupyter-builder@file:///Users/paddy/code/hatch-jupyter-builder"] +dependencies = ["hatch-jupyter-builder>=0.8.1"] +#dependencies = ["hatch-jupyter-builder@file:///Users/paddy/code/hatch-jupyter-builder"] build-function = "hatch_jupyter_builder.npm_builder" diff --git a/tests/analysis_management_test.py b/tests/analysis_management_test.py new file mode 100644 index 000000000..cf2f92048 --- /dev/null +++ b/tests/analysis_management_test.py @@ -0,0 +1,96 @@ +import unittest +import pytest + +from buckaroo.pluggable_analysis_framework import ( + ColAnalysis) + +from buckaroo.analysis_management import ( + AnalsysisPipeline, produce_summary_df, NonExistentSummaryRowException) + +from buckaroo.analysis import (TypingStats, DefaultSummaryStats) +from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen) + +class TestAnalysisPipeline(unittest.TestCase): + def test_produce_summary_df(self): + produce_summary_df(test_df, [DistinctCount, Len, DistinctPer], 'test_df') + + + def test_pipeline_base(self): + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + #just verify that there are no errors + ap.process_df(df) + + def test_add_aobj(self): + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + class Foo(ColAnalysis): + provided_summary = [ + 'foo',] + requires_summary = ['length'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + return dict(foo=8) + ap.add_analysis(Foo) + sdf, _unused = ap.process_df(df) + self.assertEqual(sdf.loc['foo']['tripduration'], 8) + + def test_replace_aobj(self): + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + class Foo(ColAnalysis): + provided_summary = [ + 'foo',] + requires_summary = ['length'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + return dict(foo=8) + ap.add_analysis(Foo) + sdf, _unused = ap.process_df(df) + self.assertEqual(sdf.loc['foo']['tripduration'], 8) + #18 facts returned about tripduration + self.assertEqual(len(sdf['tripduration']), 18) + #Create an updated Foo that returns 9 + class Foo(ColAnalysis): + provided_summary = [ + 'foo',] + requires_summary = ['length'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + return dict(foo=9) + ap.add_analysis(Foo) + sdf2, _unused = ap.process_df(df) + self.assertEqual(sdf2.loc['foo']['tripduration'], 9) + #still 18 facts returned about tripduration + self.assertEqual(len(sdf2['tripduration']), 18) + #Create an updated Foo that returns 9 + + def test_summary_stats_display(self): + ap = AnalsysisPipeline([TypingStats]) + self.assertEqual(ap.summary_stats_display, "all") + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + print(ap.summary_stats_display) + self.assertTrue("dtype" in ap.summary_stats_display) + + def test_add_summary_stats_display(self): + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + class Foo(ColAnalysis): + provided_summary = ['foo'] + requires_summary = ['length'] + summary_stats_display = ['foo'] + + ap.add_analysis(Foo) + self.assertEquals(ap.summary_stats_display, ['foo']) + + def test_invalid_summary_stats_display_throws(self): + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + class Foo(ColAnalysis): + provided_summary = ['foo'] + requires_summary = ['length'] + summary_stats_display = ['not_provided'] + + def bad_add(): + ap.add_analysis(Foo) + + self.assertRaises(NonExistentSummaryRowException, bad_add) + diff --git a/tests/analysis_test.py b/tests/analysis_test.py new file mode 100644 index 000000000..c92959c9a --- /dev/null +++ b/tests/analysis_test.py @@ -0,0 +1,30 @@ +import numpy as np +import pandas as pd +from buckaroo.analysis import TypingStats, DefaultSummaryStats + + +text_ser = pd.Series(["foo", "bar", "baz"]) +datelike_ser = pd.Series([ + "2014-01-01 00:00:06", + "2014-01-01 00:00:38", + "2014-01-01 00:03:59"]) +all_nan_ser = pd.Series([np.nan, np.nan]) +int_ser = pd.Series([10, 30, -10, 33]) +fp_ser = pd.Series([33.2, 83.2, -1.0, 0]) + +nan_text_ser = pd.Series([np.nan, np.nan, 'y', 'y']) +nan_mixed_type_ser = pd.Series([np.nan, np.nan, 'y', 'y', 8.0]) + + +all_sers = [ + text_ser, datelike_ser, all_nan_ser, + int_ser, fp_ser, nan_text_ser, nan_mixed_type_ser] + +def test_text_ser(): + DefaultSummaryStats.summary(nan_text_ser, nan_text_ser, nan_text_ser) + DefaultSummaryStats.summary(nan_mixed_type_ser, nan_mixed_type_ser, nan_mixed_type_ser) + +def test_default_summary_stats(): + for ser in all_sers: + DefaultSummaryStats.summary(ser, ser, ser) + diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index 28ab28171..4b4e13728 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -1,4 +1,5 @@ import pandas as pd +from IPython.display import display from buckaroo.buckaroo_widget import BuckarooWidget @@ -7,6 +8,11 @@ def test_basic_instantiation(): w = BuckarooWidget(df) assert w.dfConfig['totalRows'] == 499 +def test_basic_display(): + df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + w = BuckarooWidget(df) + display(w) + def test_interpreter(): df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') w = BuckarooWidget(df) @@ -27,3 +33,5 @@ def test_interpreter_errors(): [{"symbol":"dropcol"},{"symbol":"df"},"starttime"], [{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] assert w.operation_results['transform_error'] == '''"['starttime'] not found in axis"''' + + diff --git a/tests/fixtures.py b/tests/fixtures.py new file mode 100644 index 000000000..b3b04741a --- /dev/null +++ b/tests/fixtures.py @@ -0,0 +1,73 @@ +import numpy as np +import pandas as pd +from buckaroo.pluggable_analysis_framework import (ColAnalysis) + +test_df = pd.DataFrame({ + 'normal_int_series' : pd.Series([1,2,3,4]), + 'empty_na_ser' : pd.Series([], dtype="Int64"), + 'float_nan_ser' : pd.Series([3.5, np.nan, 4.8]) + }) + +df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + + +class DistinctCount(ColAnalysis): + requires_raw = True + provided_summary = ["distinct_count"] + @staticmethod + def summary(sampled_ser, summary_ser, raw_ser): + val_counts = raw_ser.value_counts() + distinct_count= len(val_counts) + return {'distinct_count': distinct_count} + +class Len(ColAnalysis): + provided_summary = ["len"] + requires_raw = True + @staticmethod + def summary(sampled_ser, summary_ser, raw_ser): + return {'len': len(raw_ser)} + + +class DistinctPer(ColAnalysis): + provided_summary = ["distinct_per"] + requires_summary = ["len", "distinct_count"] + + @staticmethod + def summary(sampled_ser, summary_ser, raw_ser): + return {'distinct_per': summary_ser.loc['distinct_count'] / summary_ser.loc['len']} + +class DistinctCount(ColAnalysis): + requires_raw = True + provided_summary = ["distinct_count"] + @staticmethod + def summary(sampled_ser, summary_ser, raw_ser): + val_counts = raw_ser.value_counts() + distinct_count= len(val_counts) + return {'distinct_count': distinct_count} + +class Len(ColAnalysis): + provided_summary = ["len"] + requires_raw = True + @staticmethod + def summary(sampled_ser, summary_ser, raw_ser): + return {'len': len(raw_ser)} + +class DCLen(ColAnalysis): + provided_summary = ["len", "distinct_count"] + requires_raw = True + @staticmethod + def summary(sampled_ser, summary_ser, raw_ser): + val_counts = raw_ser.value_counts() + distinct_count= len(val_counts) + return {'len':len(raw_ser), 'distinct_count':distinct_count} + +class DistinctPer(ColAnalysis): + provided_summary = ["distinct_per"] + requires_summary = ["len", "distinct_count"] + + @staticmethod + def summary(sampled_ser, summary_ser, raw_ser): + return {'distinct_per': summary_ser.loc['distinct_count'] / summary_ser.loc['len']} + +class DependsNoProvides(ColAnalysis): + requires_summary = ["len"] diff --git a/tests/pluggable_analysis_framework_test.py b/tests/pluggable_analysis_framework_test.py new file mode 100644 index 000000000..c30a0cc1c --- /dev/null +++ b/tests/pluggable_analysis_framework_test.py @@ -0,0 +1,92 @@ +import unittest +import pytest +import pandas as pd +import numpy as np +import graphlib +from buckaroo.pluggable_analysis_framework import ( + ColAnalysis, order_analysis, check_solvable, NotProvidedException) + +from buckaroo.analysis_management import ( + AnalsysisPipeline, produce_summary_df) + +from buckaroo.analysis import (TypingStats, DefaultSummaryStats) + +from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen, DependsNoProvides) + +class NoRoute(ColAnalysis): + provided_summary = ['not_used'] + requires_summary = ["does_not_exist"] + +class CycleA(ColAnalysis): + provided_summary = ['cycle_a'] + requires_summary = ["cycle_b"] + +class CycleB(ColAnalysis): + provided_summary = ['cycle_b'] + requires_summary = ["cycle_a"] + +class CA_AB(ColAnalysis): + provided_summary = ["a", "b"] + +class CA_CD(ColAnalysis): + provided_summary = ["c", "d"] + +class CA_EF(ColAnalysis): + provided_summary = ["e", "f"] + requires_summary = ["a", "b", "c", "d"] + +class CA_G(ColAnalysis): + provided_summary = ["g"] + requires_summary = ["e"] + + +class TestOrderAnalysis(unittest.TestCase): + + def test_default_order(self): + self.assertEqual( + order_analysis([DistinctCount, Len, DistinctPer]), + [DistinctCount, Len, DistinctPer]) + self.assertEqual( + order_analysis([DistinctPer, DistinctCount, Len]), + [DistinctCount, Len, DistinctPer]) + + def test_multiple_provides(self): + self.assertEqual( + order_analysis([DCLen, DistinctPer]), + [DCLen, DistinctPer]) + self.assertEqual( + order_analysis([DistinctPer, DCLen]), + [DCLen, DistinctPer]) + self.assertEqual( + order_analysis([CA_G, CA_CD, CA_AB, CA_EF]), + [CA_CD, CA_AB, CA_EF, CA_G]) + #note the order between CA_CD and CA_AB doesn't matter - + # as long as they occur before other classes + + def test_no_provides(self): + # order_analysis should work properly with ColAnalysis objects taht don't provide any summary_stats + self.assertEqual( + order_analysis([DCLen, DistinctPer, DependsNoProvides]), + [DCLen, DependsNoProvides, DistinctPer]) + + def test_cycle(self): + with self.assertRaises(graphlib.CycleError): + order_analysis([CycleA, CycleB]) + + def test_no_route(self): + check_solvable([Len]) + with self.assertRaises(NotProvidedException): + check_solvable([NoRoute]) + + + +""" +to run the tests as regular python functions use the following code. +This will be useful for live testing adding analysis funcs + +loader = unittest.TestLoader() +suite = unittest.TestSuite() +tests = loader.loadTestsFromTestCase(TestOrderAnalysis) +suite.addTests(tests) +ab = unittest.TextTestRunner(verbosity=3).run(suite) +""" From cb631c70f26129615b4869c9a36e8eb043e6aa19 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 7 Aug 2023 10:45:07 -0400 Subject: [PATCH 139/250] released 0.3.18 --- package.json | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 16a7d948b..4e7344bbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.25", + "version": "0.2.26", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index fe1e5939d..c614f8da4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.17" +version = "0.3.18" [project.license] file = "LICENSE.txt" From 094b178e0c1ca74de734c4ee95b9f3f7b6e4f822 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 7 Aug 2023 11:04:36 -0400 Subject: [PATCH 140/250] removed old unused summary_stats, split existing functions into separate files with better names --- buckaroo/buckaroo_widget.py | 2 +- buckaroo/down_sample.py | 18 +++ buckaroo/order_columns.py | 104 ++++++++++++++ buckaroo/summary_stats.py | 261 ------------------------------------ 4 files changed, 123 insertions(+), 262 deletions(-) create mode 100644 buckaroo/down_sample.py create mode 100644 buckaroo/order_columns.py delete mode 100644 buckaroo/summary_stats.py diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 04ec3f8aa..831bd679c 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -14,7 +14,7 @@ from ._frontend import module_name, module_version from .all_transforms import configure_buckaroo, DefaultCommandKlsList -from .summary_stats import sample +from .down_sample import sample from .analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) from .analysis_management import DfStats diff --git a/buckaroo/down_sample.py b/buckaroo/down_sample.py new file mode 100644 index 000000000..2ebe5c881 --- /dev/null +++ b/buckaroo/down_sample.py @@ -0,0 +1,18 @@ +import pandas as pd +import numpy as np + + + +def sample(df, sample_size=500, include_outliers=True): + if len(df) <= sample_size: + return df + sdf = df.sample(np.min([sample_size, len(df)])) + if include_outliers: + outlier_idxs = [] + for col in df.columns: + outlier_idxs.extend(get_outlier_idxs(df[col]) ) + outlier_idxs.extend(sdf.index) + uniq_idx = np.unique(outlier_idxs) + return df.loc[uniq_idx] + return sdf + diff --git a/buckaroo/order_columns.py b/buckaroo/order_columns.py new file mode 100644 index 000000000..0b4ac8d61 --- /dev/null +++ b/buckaroo/order_columns.py @@ -0,0 +1,104 @@ +from functools import reduce +import pandas as pd +import numpy as np + + +def make_num_categorical(ser): + return ser.dropna().astype('category', errors='ignore').cat.codes + +def get_cor_pair_dict(df, sdf): + + corrable_cols = sdf.columns[ + (sdf.loc['distinct_count'] > 1) & + ((sdf.loc['distinct_per'] < .3) | + (sdf.loc['distinct_count'] < 50))] + + num_df = pd.DataFrame({col:make_num_categorical(df[col]) for col in corrable_cols}) + + corr_df = num_df.corr() + high_corr_df = corr_df[corr_df > 0.6] + + #print(high_corr_df) + + cor_dict = {} + for col in high_corr_df.columns: + #columns with high correlation that aren't the column itself + other_cor_cols = high_corr_df[col].dropna().drop(col) + cor_cols = other_cor_cols.index.values + if len(cor_cols) > 0: + cor_dict[col] = cor_cols.tolist() + return cor_dict + +def set_when(df, cond_row_name, target_row_name, true_val, false_val): + true_row = df.loc[cond_row_name] + df.loc[target_row_name] = false_val + df.loc[target_row_name, true_row[true_row==True].index.values] = true_val + return df + +def without(arr, search_keys): + new_arr = [] + for v in arr: + if v not in search_keys: + new_arr.append(v) + return new_arr + +def find_groupings(corr_pairs): + all_groupings = [] + for key, other_key_list in corr_pairs.items(): + ab = other_key_list.copy() + ab.append(key) + all_groupings.append(set(ab)) + return np.unique(all_groupings) + +def order_groupings(grps, ranked_cols): + first_cols, rest_cols = [], [] + for col in ranked_cols: + for grp in grps: + if col in grp: + first_cols.append(col) + rest_cols.extend(list(without(grp, [col]))) + grps = without(grps, [grp]) + return list(set(first_cols)), list(set(rest_cols)) + +def order_columns(sdf, corr_pair_dict): + grouping_col_scores = sdf.loc[['grouping_score_integer', 'grouping_score_numeric']].sum() + duplicate_col_rankings = grouping_col_scores.sort_values().index[::-1].values + + groupings = find_groupings(corr_pair_dict) + #print("groupings", groupings) + first_cols, duplicate_cols = order_groupings(groupings, duplicate_col_rankings) + + #print("duplicate_cols", duplicate_cols) + sdf.loc['first_col':, first_cols] = 5 + sdf.loc['is_duplicate':, duplicate_cols] = -5 + #print(sdf.index) + col_scores = sdf.loc[['one_distinct', 'first_col', 'datetime_score', 'is_duplicate']].sum() + return col_scores.sort_values().index.values[::-1] + +def reorder_columns(df): + tdf_stats = summarize_df(df) + cpd = get_cor_pair_dict(df, tdf_stats) + # try: + col_order = order_columns(tdf_stats, cpd) + return df[col_order] + +def get_outlier_idxs(ser): + if not pd.api.types.is_numeric_dtype(ser.dtype): + return [] + outlier_idxs = [] + outlier_idxs.extend(ser.nlargest(5).index) + outlier_idxs.extend(ser.nsmallest(5).index) + return outlier_idxs + +def add_col_rankings(df, sdf): + sdf.loc['one_distinct'] = 0 + + only_ones = (sdf.loc['distinct_count'] <= 1) + sdf.loc['one_distinct', only_ones[only_ones==True].index.values] = -20 + + sdf.loc['first_col'] = 0 + sdf.loc['is_duplicate'] = 0 + set_when(sdf, 'is_datetime', 'datetime_score', 11, 0) + + set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) + set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) diff --git a/buckaroo/summary_stats.py b/buckaroo/summary_stats.py deleted file mode 100644 index 510cc5983..000000000 --- a/buckaroo/summary_stats.py +++ /dev/null @@ -1,261 +0,0 @@ -from functools import reduce -import pandas as pd -from pandas.io.json import dumps as pdumps -import numpy as np - - -def probable_datetime(ser): - s_ser = ser.sample(np.min([len(ser), 500])) - try: - dt_ser = pd.to_datetime(s_ser) - #pd.to_datetime(1_00_000_000_000_000_000) == pd.to_datetime('1973-01-01') - if dt_ser.max() < pd.to_datetime('1973-01-01'): - return False - return True - - except Exception as e: - return False - -def get_mode(ser): - mode_raw = ser.mode() - if len(mode_raw) == 0: - return np.nan - else: - return mode_raw.values[0] - -def int_digits(n): - if n == 0: - return 1 - if np.sign(n) == -1: - return int(np.floor(np.log10(np.abs(n)))) + 2 - return int(np.floor(np.log10(n)+1)) - - -def histogram(ser): - raw_counts, bins = np.histogram(ser, 10) - scaled_counts = np.round(raw_counts/raw_counts.sum(),2) - return [scaled_counts, bins] - -def table_sumarize_num_ser(ser): - if len(ser) == 0: - return dict(is_numeric=False) - return dict( - is_numeric=True, - is_integer=pd.api.types.is_integer_dtype(ser), - min_digits=int_digits(ser.min()), - max_digits=int_digits(ser.max()), - histogram=histogram(ser)) - -def table_sumarize_obj_ser(ser): - return dict( - is_numeric=False) - -def table_sumarize_ser(ser): - if pd.api.types.is_numeric_dtype(ser.dtype): - return table_sumarize_num_ser(ser.dropna()) - else: - return table_sumarize_obj_ser(ser) - -def table_sumarize(df): - table_hints = {col:table_sumarize_ser(df[col]) for col in df} - table_hints['index'] = table_sumarize_ser(df.index) - return table_hints - - -def summarize_string(ser): - l = len(ser) - val_counts = ser.value_counts() - distinct_count= len(val_counts) - nan_count = l - len(ser.dropna()) - unique_count = len(val_counts[val_counts==1]) - empty_count = val_counts.get('', 0) - - return dict( - dtype=ser.dtype, - length=l, - min='', - max='', - mean='', - nan_count = nan_count, - distinct_count= distinct_count, - distinct_per = distinct_count/l, - empty_count = empty_count, - empty_per = empty_count/l, - unique_per = unique_count/l, - nan_per = nan_count/l, - is_numeric=pd.api.types.is_numeric_dtype(ser), - is_integer=pd.api.types.is_integer_dtype(ser), - is_datetime=probable_datetime(ser), - mode=get_mode(ser)) - -def summarize_numeric(ser): - - num_stats = summarize_string(ser) - num_stats.update(dict( - min=ser.min(), - max=ser.max(), - mean=ser.mean())) - - return num_stats - -def summarize_column(ser): - if pd.api.types.is_numeric_dtype(ser.dtype): - return summarize_numeric(ser) - else: - return summarize_string(ser) - -def summarize_df(df): - summary_df = pd.DataFrame({col:summarize_column(df[col]) for col in df}) - return summary_df - -def make_num_categorical(ser): - return ser.dropna().astype('category', errors='ignore').cat.codes - -def get_cor_pair_dict(df, sdf): - - corrable_cols = sdf.columns[ - (sdf.loc['distinct_count'] > 1) & - ((sdf.loc['distinct_per'] < .3) | - (sdf.loc['distinct_count'] < 50))] - - num_df = pd.DataFrame({col:make_num_categorical(df[col]) for col in corrable_cols}) - - corr_df = num_df.corr() - high_corr_df = corr_df[corr_df > 0.6] - - #print(high_corr_df) - - cor_dict = {} - for col in high_corr_df.columns: - #columns with high correlation that aren't the column itself - other_cor_cols = high_corr_df[col].dropna().drop(col) - cor_cols = other_cor_cols.index.values - if len(cor_cols) > 0: - cor_dict[col] = cor_cols.tolist() - return cor_dict - -def set_when(df, cond_row_name, target_row_name, true_val, false_val): - true_row = df.loc[cond_row_name] - df.loc[target_row_name] = false_val - df.loc[target_row_name, true_row[true_row==True].index.values] = true_val - return df - -def without(arr, search_keys): - new_arr = [] - for v in arr: - if v not in search_keys: - new_arr.append(v) - return new_arr - -def find_groupings(corr_pairs): - all_groupings = [] - for key, other_key_list in corr_pairs.items(): - ab = other_key_list.copy() - ab.append(key) - all_groupings.append(set(ab)) - return np.unique(all_groupings) - -def order_groupings(grps, ranked_cols): - first_cols, rest_cols = [], [] - for col in ranked_cols: - for grp in grps: - if col in grp: - first_cols.append(col) - rest_cols.extend(list(without(grp, [col]))) - grps = without(grps, [grp]) - return list(set(first_cols)), list(set(rest_cols)) - -def order_columns(sdf, corr_pair_dict): - grouping_col_scores = sdf.loc[['grouping_score_integer', 'grouping_score_numeric']].sum() - duplicate_col_rankings = grouping_col_scores.sort_values().index[::-1].values - - groupings = find_groupings(corr_pair_dict) - #print("groupings", groupings) - first_cols, duplicate_cols = order_groupings(groupings, duplicate_col_rankings) - - #print("duplicate_cols", duplicate_cols) - sdf.loc['first_col':, first_cols] = 5 - sdf.loc['is_duplicate':, duplicate_cols] = -5 - #print(sdf.index) - col_scores = sdf.loc[['one_distinct', 'first_col', 'datetime_score', 'is_duplicate']].sum() - return col_scores.sort_values().index.values[::-1] - -def reorder_columns(df): - tdf_stats = summarize_df(df) - cpd = get_cor_pair_dict(df, tdf_stats) - # try: - col_order = order_columns(tdf_stats, cpd) - return df[col_order] - -def get_outlier_idxs(ser): - if not pd.api.types.is_numeric_dtype(ser.dtype): - return [] - outlier_idxs = [] - outlier_idxs.extend(ser.nlargest(5).index) - outlier_idxs.extend(ser.nsmallest(5).index) - return outlier_idxs - -def sample(df, sample_size=500, include_outliers=True): - if len(df) <= sample_size: - return df - sdf = df.sample(np.min([sample_size, len(df)])) - if include_outliers: - outlier_idxs = [] - for col in df.columns: - outlier_idxs.extend(get_outlier_idxs(df[col]) ) - outlier_idxs.extend(sdf.index) - uniq_idx = np.unique(outlier_idxs) - return df.loc[uniq_idx] - return sdf - -def add_col_rankings(df, sdf): - sdf.loc['one_distinct'] = 0 - - only_ones = (sdf.loc['distinct_count'] <= 1) - sdf.loc['one_distinct', only_ones[only_ones==True].index.values] = -20 - - sdf.loc['first_col'] = 0 - sdf.loc['is_duplicate'] = 0 - set_when(sdf, 'is_datetime', 'datetime_score', 11, 0) - - set_when(sdf, 'is_integer', 'grouping_score_integer', -3, 0) - set_when(sdf, 'is_numeric', 'grouping_score_numeric', -3, 5) - - -def int_digits(n): - if n == 0: - return 1 - if np.sign(n) == -1: - return int(np.floor(np.log10(np.abs(n)))) + 2 - return int(np.floor(np.log10(n)+1)) - - -def histogram(ser): - raw_counts, bins = np.histogram(ser, 10) - scaled_counts = np.round(raw_counts/raw_counts.sum(),2) - return [scaled_counts, bins] - -def table_sumarize_num_ser(ser): - if len(ser) == 0: - return dict(is_numeric=False) - return dict( - is_numeric=True, - is_integer=pd.api.types.is_integer_dtype(ser), - min_digits=int_digits(ser.min()), - max_digits=int_digits(ser.max()), - histogram=histogram(ser)) - -def table_sumarize_obj_ser(ser): - return dict( - is_numeric=False) - -def table_sumarize_ser(ser): - if pd.api.types.is_numeric_dtype(ser.dtype): - return table_sumarize_num_ser(ser.dropna()) - else: - return table_sumarize_obj_ser(ser) - -def table_sumarize(df): - table_hints = {col:table_sumarize_ser(df[col]) for col in df} - table_hints['index'] = table_sumarize_ser(df.index) - return table_hints From 6175d0e3b18c2e2b6b2b3e697b84e42f77188fe5 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 26 Sep 2023 17:43:44 -0400 Subject: [PATCH 141/250] Feat/auto clean (#33) the 0.3.19 release adds Histograms and auto cleaning of dataframes. --- buckaroo/all_transforms.py | 11 +- buckaroo/analysis.py | 120 ++++- buckaroo/analysis_management.py | 6 +- buckaroo/auto_clean.py | 208 ++++++++ buckaroo/buckaroo_widget.py | 172 ++++--- buckaroo/cleaning_commands.py | 102 ++++ buckaroo/configure_utils.py | 3 - buckaroo/down_sample.py | 8 + buckaroo/lisp_utils.py | 46 ++ buckaroo/lispy.py | 32 +- buckaroo/order_columns.py | 8 - buckaroo/widget_utils.py | 2 +- .../_static/embed-bundle.js.LICENSE.txt | 157 ++++++ docs/source/articles/histograms.rst | 56 +++ examples/App.tsx | 5 +- examples/app.css | 113 ++++- examples/ex/HistogramEx.tsx | 77 +++ examples/index.tsx | 8 + introduction.ipynb | 291 ++++++++++- js/components/BaseHeader.tsx | 465 ++++++++++++++++++ js/components/ColumnsEditor.tsx | 46 +- js/components/CustomHeader.tsx | 257 ++++++++++ js/components/DCFCell.tsx | 36 +- js/components/DFViewer.tsx | 38 +- js/components/OperationDetail.tsx | 18 +- js/components/OperationUtils.ts | 1 - js/components/Operations.tsx | 15 +- js/components/RechartExtra.ts | 68 +++ js/components/RechartTooltip.tsx | 373 ++++++++++++++ js/components/StatusBar.tsx | 106 ++-- js/components/gridUtils.ts | 60 ++- js/components/staticData.ts | 291 +++++++---- js/dcefwidget.ts | 2 +- js/style/dcf-npm.css | 47 ++ package.json | 345 ++++++------- pyproject.toml | 2 +- tests/auto_clean_test.py | 130 +++++ tests/basic_widget_test.py | 54 +- tests/lispy_test.py | 29 ++ tsconfig.json | 5 + webpack.config.js | 39 +- yarn.lock | 298 +++++++++-- 42 files changed, 3563 insertions(+), 587 deletions(-) create mode 100644 buckaroo/auto_clean.py create mode 100644 buckaroo/cleaning_commands.py create mode 100644 buckaroo/lisp_utils.py create mode 100644 docs/source/articles/histograms.rst create mode 100644 examples/ex/HistogramEx.tsx create mode 100644 examples/index.tsx create mode 100644 js/components/BaseHeader.tsx create mode 100644 js/components/CustomHeader.tsx create mode 100644 js/components/RechartExtra.ts create mode 100644 js/components/RechartTooltip.tsx create mode 100644 tests/auto_clean_test.py create mode 100644 tests/lispy_test.py diff --git a/buckaroo/all_transforms.py b/buckaroo/all_transforms.py index eff7a4dcd..9b4613c54 100644 --- a/buckaroo/all_transforms.py +++ b/buckaroo/all_transforms.py @@ -1,8 +1,10 @@ -from .lispy import s -from .configure_utils import configure_buckaroo import pandas as pd import numpy as np +from .lispy import s +from .configure_utils import configure_buckaroo +from .cleaning_commands import (to_bool, to_datetime, to_int, to_float, to_string) + class Command(object): pass @@ -122,7 +124,7 @@ def transform_to_py(df, col, col_spec): -class to_datetime(Command): +class ato_datetime(Command): #argument_names = ["df", "col"] command_default = [s('to_datetime'), s('df'), "col"] command_pattern = [None] @@ -154,6 +156,7 @@ def transform_to_py(df, col): " df.drop('%s', axis=1, inplace=True)" % col, " df.index = old_col.values"]) -DefaultCommandKlsList = [DropCol, to_datetime, SafeInt, FillNA, reindex, OneHot, GroupBy] +DefaultCommandKlsList = [DropCol, SafeInt, FillNA, reindex, OneHot, GroupBy, + to_bool, to_datetime, to_int, to_float, to_string] command_defaults, command_patterns, buckaroo_transform, buckaroo_to_py_core = configure_buckaroo(DefaultCommandKlsList) diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index 260f6e5b1..493502846 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -91,18 +91,107 @@ def summary(sampled_ser, summary_ser, ser): def int_digits(n): + if np.isnan(n): + return 1 if n == 0: return 1 if np.sign(n) == -1: return int(np.floor(np.log10(np.abs(n)))) + 2 return int(np.floor(np.log10(n)+1)) -def histogram(ser): - raw_counts, bins = np.histogram(ser, 10) - scaled_counts = np.round(raw_counts/raw_counts.sum(),2) - return [scaled_counts, bins] +def numeric_histogram_labels(endpoints): + left = endpoints[0] + labels = [] + for edge in endpoints[1:]: + labels.append("{:.0f}-{:.0f}".format(left, edge)) + left = edge + return labels +#histogram_labels(endpoints) + +def numeric_histogram(arr, nan_per): + ret_histo = [] + nan_observation = {'name':'NA', 'NA':np.round(nan_per*100, 0)} + if nan_per == 1.0: + return [nan_observation] + + vals = arr.dropna() + low_tail, high_tail = np.quantile(vals, 0.01), np.quantile(vals, 0.99) + low_pass = arr>low_tail + high_pass = arr < high_tail + meat = vals[low_pass & high_pass] + populations, endpoints =np.histogram(meat, 10) + + labels = numeric_histogram_labels(endpoints) + normalized_pop = populations / populations.sum() + low_label = "%r - %r" % (vals.min(), low_tail) + high_label = "%r - %r" % (high_tail, vals.max()) + ret_histo.append({'name': low_label, 'tail':1}) + for label, pop in zip(labels, normalized_pop): + ret_histo.append({'name': label, 'population':np.round(pop * 100, 0)}) + high_label = "%r - %r" % (high_tail, vals.max()) + ret_histo.append({'name': high_label, 'tail':1}) + if nan_per > 0.0: + ret_histo.append(nan_observation) + return ret_histo + + +def histo_format(v, l): + scaled = v/l + + +def categorical_dict(ser, val_counts, top_n_positions=7): + l = len(ser) + top = min(len(val_counts), top_n_positions) + + + top_vals = val_counts.iloc[:top] + #top_percentage = top_vals.sum() / l + #if len(val_counts) > 5 and top_percentage < .05: + + rest_vals = val_counts.iloc[top:] + histogram = top_vals.to_dict() + + + full_long_tail = rest_vals.sum() + unique_count = sum(val_counts == 1) + long_tail = full_long_tail - unique_count + if unique_count > 0: + histogram['unique'] = np.round( (unique_count/l)* 100, 0) + if long_tail > 0: + histogram['longtail'] = np.round((long_tail/l) * 100,0) + return histogram + +def categorical_histogram(ser, val_counts, nan_per, top_n_positions=7): + nan_observation = {'name':'NA', 'NA':np.round(nan_per*100, 0)} + cd = categorical_dict(ser, val_counts, top_n_positions) + + l = len(ser) + histogram = [] + longtail_obs = {'name': 'longtail'} + for k,v in cd.items(): + if k in ["longtail", "unique"]: + longtail_obs[k] = v + continue + histogram.append({'name':k, 'cat_pop': np.round((v/l)*100,0) }) + if len(longtail_obs) > 1: + histogram.append(longtail_obs) + if nan_per > 0.0: + histogram.append(nan_observation) + return histogram + + +def histogram(ser, nan_per): + is_numeric = pd.api.types.is_numeric_dtype(ser.dtype) + val_counts = ser.value_counts() + if is_numeric and len(val_counts)>5: + temp_histo = numeric_histogram(ser, nan_per) + if len(temp_histo) > 5: + #if we had basically a categorical variable encoded into an integer.. don't return it + return temp_histo + return categorical_histogram(ser, val_counts, nan_per) + class ColDisplayHints(ColAnalysis): requires_summary = ['min', 'max'] # What summary stats does this analysis provide provided_summary = [] @@ -111,15 +200,16 @@ class ColDisplayHints(ColAnalysis): 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram'] @staticmethod - def col_hints(sampled_ser, summary_ser, ser): - is_numeric = pd.api.types.is_numeric_dtype(ser.dtype) - if not is_numeric: - return dict(is_numeric=False) - if len(ser) == 0: - return dict(is_numeric=False) + def table_hints(sampled_ser, summary_ser, table_hint_col_dict): + is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype) + # if not is_numeric: + # return dict(is_numeric=False) + # if len(sampled_ser) == 0: + # return dict(is_numeric=False) return dict( - is_numeric=True, - is_integer=pd.api.types.is_integer_dtype(ser), - min_digits=int_digits(summary_ser.loc['min']), - max_digits=int_digits(summary_ser.loc['max']), - histogram=histogram(ser)) + is_numeric=is_numeric, + is_integer=pd.api.types.is_integer_dtype(sampled_ser), + min_digits=(is_numeric and int_digits(summary_ser.loc['min'])) or 0, + max_digits=(is_numeric and int_digits(summary_ser.loc['max'])) or 0, + histogram=histogram(sampled_ser, summary_ser['nan_per'])) + diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py index b5eff8eda..e707eb63c 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/analysis_management.py @@ -1,6 +1,6 @@ import numpy as np import pandas as pd - +import traceback from buckaroo.pluggable_analysis_framework import ( ColAnalysis, order_analysis, check_solvable, NotProvidedException) @@ -28,11 +28,13 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): summary_res = a_kls.summary(ser, summary_ser, ser) for k,v in summary_res.items(): summary_ser.loc[k] = v - for k,v in a_kls.table_hints(sampled_ser, summary_ser, table_hint_dict): + th_dict = a_kls.table_hints(sampled_ser, summary_ser, table_hint_dict) + for k,v in th_dict.items(): table_hint_dict[k] = v except Exception as e: print("summary_ser", summary_ser) errs[ser_name] = e, a_kls + traceback.print_exc() continue summary_col_dict[ser_name] = summary_ser table_hint_col_dict[ser_name] = table_hint_dict diff --git a/buckaroo/auto_clean.py b/buckaroo/auto_clean.py new file mode 100644 index 000000000..7cfd7f684 --- /dev/null +++ b/buckaroo/auto_clean.py @@ -0,0 +1,208 @@ +import sys +import math +import warnings + +from datetime import timedelta +from collections import defaultdict + +import pandas as pd +import numpy as np + + +#adapted from https://docs.python.org/3/library/warnings.html + +# this is needed to see if a series that we think should be datetime +# would throw a warning indicating a slow coercion this saves a huge +# (100x) slowdown + +def check_for_datetime_warnings(ser): + "return 1 if to_datetime throws errors for the series" + with warnings.catch_warnings(record=True) as w: + pd.to_datetime(ser, errors='coerce') + if len(w) == 0: + return 0 + if "Could not infer format" in str(w[-1].message): + return 1 + else: + #not sure how we'd get here + return 1 + +default_type_dict = { + 'datetime':0, 'datetime_error':0, + 'int':0, 'int_error':0, + 'float':0, 'float_error':0, + 'bool':0, 'bool_error':0} + + +#pandas parses ints and floats as datetimes in ns, you end up with a +# lot of values around 1970 Unix epoch we use 1971 as a cutoff, a bit +# of a hack, but pragmatic +SEVENTY_ONE_CUTOFF = pd.to_datetime('1971-01-01') + +def get_object_typing_metadata(ser): + # this function should just return percentages, to separate + # introspection from action. This way we can pass in a different + # decision weighting. As is this function is complex enough + counts = defaultdict(lambda: 0) + counts.update(default_type_dict) # we always want these keys present + assert pd.api.types.is_object_dtype(ser.dtype) + #this is slow because it goes through python as opposed to vectorized C code + for v in ser.values: + try: + dt = pd.to_datetime(v) + if dt > SEVENTY_ONE_CUTOFF: + counts['datetime'] += 1 + else: + counts['datetime_error'] += 1 + except (pd.core.tools.datetimes.DateParseError, ValueError, TypeError): + counts['datetime_error'] += 1 + try: + int(v) + counts['int'] += 1 + except ValueError: + counts['int_error'] += 1 + try: + float(v) + counts['float'] += 1 + except ValueError: + counts['float_error'] += 1 + + if isinstance(v, bool): + counts['bool'] += 1 + else: + counts['bool_error'] += 1 + + if len(ser) == 0: + return counts + ret_dict = dict([[k, v/len(ser)] for k,v in counts.items()]) + + #this is an ugly hack, but it really speeds things up if there are + #abberant kind of datetime columns + if ret_dict['datetime_error'] < .5: + if check_for_datetime_warnings(ser): + ret_dict['datetime_error'] = 1.0 + if ret_dict['int_error'] < .5: + float_remainder = (pd.to_numeric(ser, errors='coerce').abs() % 1).sum() + if float_remainder > 0.0001: + ret_dict['int_error'] = 1 + return ret_dict + +def get_typing_metadata(ser): + td = type_dict = default_type_dict.copy() + dt = ser.dtype + if not pd.api.types.is_object_dtype(dt): + td['exact_type'] = str(dt) + if pd.api.types.is_datetime64_any_dtype(dt): + #general_type is used as a pass through + td['general_type'] = 'datetime' + elif pd.api.types.is_bool_dtype(dt): + td['general_type'] = 'bool' + elif pd.api.types.is_categorical_dtype(dt): + pass #not sure how to handle this yet, it will end up being handled as an object/string + elif pd.api.types.is_float_dtype(dt): + #could still be a float that includes only ints + td['general_type'] = 'float' + td['float'], td['float_error'] = 1, 0 + elif pd.api.types.is_integer_dtype(dt): + td['general_type'] = 'int' + td['int'], td['int_error'] = 1, 0 + return td + else: + return get_object_typing_metadata(ser.dropna()) + +def recommend_type(type_dict): + if type_dict.get('general_type', None) is not None: + return type_dict['general_type'] + if type_dict['datetime_error'] < 0.5: + return 'datetime' + if type_dict['bool_error'] < 0.5: + #bool ends up being stricter than int or float + return 'bool' + if type_dict['float_error'] < 0.5 or type_dict['int_error'] < 0.5: + #numeric type, figure out if float or int float will parse for + # everything that also parses as int + if math.isclose(type_dict['float'], type_dict['int']) or type_dict['int'] > type_dict['float']: + return 'int' + else: + return 'float' + return 'string' + +def smart_to_int(ser): + + if pd.api.types.is_numeric_dtype(ser): + working_ser = ser + lower, upper = ser.min(), ser.max() + else: + working_ser = pd.to_numeric(ser, errors='coerce') + lower, upper = working_ser.min(), working_ser.max() + + + if lower < 0: + if upper < np.iinfo(np.int8).max: + new_type = 'Int8' + elif upper < np.iinfo(np.int16).max: + new_type = 'Int16' + elif upper < np.iinfo(np.int32).max: + new_type = 'Int32' + else: + new_type = 'Int64' + else: + if upper < np.iinfo(np.uint8).max: + new_type = 'UInt8' + elif upper < np.iinfo(np.uint16).max: + new_type = 'UInt16' + elif upper < np.iinfo(np.uint32).max: + new_type = 'UInt32' + else: + new_type = 'UInt64' + base_ser = pd.to_numeric(ser, errors='coerce').dropna() + return base_ser.astype(new_type).reindex(ser.index) + +def coerce_series(ser, new_type): + if new_type == 'bool': + #dropna is key here, otherwise Nan's and errors are treated as true + return pd.to_numeric(ser, errors='coerce').dropna().astype('boolean').reindex(ser.index) + elif new_type == 'datetime': + return pd.to_datetime(ser, errors='coerce').reindex(ser.index) + elif new_type == 'int': + # try: + return smart_to_int(ser) + # except: + # #just let pandas figure it out, we recommended the wrong type + # return pd.to_numeric(ser, errors='coerce') + + elif new_type == 'float': + return pd.to_numeric(ser, errors='coerce').dropna().astype('float').reindex(ser.index) + elif new_type == 'string': + return ser.fillna(value="").astype('string').replace("", None).reindex(ser.index) + else: + raise Exception("Unkown type of %s" % new_type) + +def emit_command(col_name, new_type): + # I need a "no-op" new_type that doesn't change a column at all + # also possible meta tags about commands taht will change data, vs just re-typing + return [{"symbol":"to_%s" % new_type , "meta":{"precleaning":True}},{"symbol":"df"}, col_name] + +def auto_type_df(df): + #this is much faster because we only run the slow function on a maximum of 200 rows. + #That's a good size for an estimate + sample_size = min(len(df), 200) + recommended_types = {} + new_data = {} + for c in df.columns: + recommended_types[c] = recommend_type(get_typing_metadata(df[c].sample(sample_size))) + new_data[c] = coerce_series(df[c], recommended_types[c]) + return pd.DataFrame(new_data) + +def get_auto_type_operations(df): + #this is much faster because we only run the slow function on a maximum of 200 rows. + #That's a good size for an estimate + sample_size = min(len(df), 200) + cleaning_commands = [] + for c in df.columns: + new_type = recommend_type(get_typing_metadata(df[c].sample(sample_size))) + cleaning_commands.append(emit_command(c, new_type)) + return cleaning_commands + + + diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 831bd679c..8d42d187c 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -8,17 +8,25 @@ TODO: Add module docstring """ import json +import warnings from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe from ._frontend import module_name, module_version from .all_transforms import configure_buckaroo, DefaultCommandKlsList +from .lisp_utils import (lists_match, split_operations) + +from .auto_clean import get_auto_type_operations from .down_sample import sample from .analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) + + from .analysis_management import DfStats + + from pandas.io.json import dumps as pdumps @@ -51,6 +59,7 @@ def df_to_obj(df, order = None, table_hints=None): obj['schema'] = dict(fields=fields) return obj + FAST_SUMMARY_WHEN_GREATER = 1_000_000 class BuckarooWidget(DOMWidget): """TODO: Add docstring here @@ -64,13 +73,15 @@ class BuckarooWidget(DOMWidget): commandConfig = Dict({}).tag(sync=True) operations = List().tag(sync=True) - + machine_gen_operations = List().tag(sync=True) command_classes = DefaultCommandKlsList origDf = Dict({}).tag(sync=True) summaryDf = Dict({}).tag(sync=True) - operation_results = Dict({}).tag(sync=True) + operation_results = Dict( + {'transformed_df':EMPTY_DF_OBJ, 'generated_py_code':'# instantiation, unused'} + ).tag(sync=True) dfConfig = Dict( { @@ -85,104 +96,119 @@ class BuckarooWidget(DOMWidget): 'showCommands': True, }).tag(sync=True) - - def __init__(self, df, - sampled=True, - summaryStats=False, - reorderdColumns=False, - showTransformed=True, - showCommands=True, - really_reorder_columns=False): - super().__init__() + def should_sample(self, df, sampled, reorderdColumns): rows = len(df) cols = len(df.columns) item_count = rows * cols - fast_mode = sampled or reorderdColumns if item_count > FAST_SUMMARY_WHEN_GREATER: fast_mode = True - elif really_reorder_columns: #an override - fast_mode = True if fast_mode: - self.dfConfig['sampled'] = True - - self.stats = DfStats(df, [TypingStats, DefaultSummaryStats, ColDisplayHints]) - self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) + return True + return False + def get_df_config(self, df, sampled, reorderdColumns, showCommands): tempDfc = self.dfConfig.copy() tempDfc.update(dict( totalRows=len(df), columns=len(df.columns), - showTransformed=showTransformed, + #removing showCommands for now, mirroring showTransformed showCommands=showCommands)) + tempDfc['sampled'] = self.should_sample(df, sampled, reorderdColumns) + return tempDfc + + def __init__(self, df, + sampled=True, + summaryStats=False, + reorderdColumns=False, + showCommands=True): + super().__init__() + warnings.filterwarnings('ignore') + #moving setup_from_command_kls_list early in the init because + #it's relatively benign and not tied to other linked updates - self.df = df - self.dfConfig = tempDfc - #just called to trigger setting origDf properly - self.update_based_on_df_config(3) - self.operation_results = { - 'transformed_df':self.origDf, - 'generated_py_code':'#from py widget init'} self.setup_from_command_kls_list() + self.dfConfig = self.get_df_config(df, sampled, reorderdColumns, showCommands) + #we need dfConfig setup first before we get the proper + #working_df and generate the typed_df + self.raw_df = df - def add_analysis(self, analysis_obj): - self.stats.add_analysis(analysis_obj) - self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) - #just trigger redisplay - self.update_based_on_df_config(3) + # this will trigger the setting of self.typed_df + self.operations = get_auto_type_operations(df) + warnings.filterwarnings('default') @observe('dfConfig') def update_based_on_df_config(self, change): - tdf = self.df_from_dfConfig() - if self.dfConfig['reorderdColumns']: - #ideally this won't require a reserialization. All - #possible col_orders shoudl be serialized once, and the - #frontend should just toggle from them - #self.origDf = df_to_obj(tdf, self.stats.col_order, table_hints=self.stats.table_hints) - self.origDf = df_to_obj(tdf, self.stats.col_order) #, table_hints=self.stats.table_hints) - else: - self.origDf = df_to_obj(tdf) #, table_hints=self.stats.table_hints) - - def df_from_dfConfig(self): - if self.dfConfig['sampled']: - return sample(self.df, self.dfConfig['sampleSize']) - else: - return self.df + if hasattr(self, 'typed_df'): + self.origDf = df_to_obj(self.typed_df, self.typed_df.columns, table_hints=self.stats.table_hints) + #otherwise this is a call before typed_df has been completely setup @observe('operations') - def interpret_operations(self, change): - print("interpret_operations") + def handle_operations(self, change): + if lists_match(change['old'], change['new']): + return + new_ops = change['new'] + split_ops = split_operations(new_ops) + self.machine_gen_operations = split_ops[0] + + user_gen_ops = split_ops[1] + + #if either the user_gen part or the machine_gen part changes, + #we still have to recompute the generated code and + #resulting_df because the input df will be different + results = {} - results['generated_py_code'] = 'before interpreter' try: - operations = [{'symbol': 'begin'}] - operations.extend(change['new']) - #print("interpret_operations", operations) - - if len(operations) == 1: - results['transformed_df'] = self.origDf - results['generated_py_code'] = 'no operations' - #print('exiting early') - return - #generating python code seems slightly less error prone than the transform - results['generated_py_code'] = self.buckaroo_to_py_core(operations[1:]) - #note doesn't use df_to_obj - transformed_df = self.buckaroo_transform(operations, self.df) + transformed_df = self.interpret_ops(user_gen_ops, self.typed_df) + #note we call gneerate_py_code based on the full + #self.operations, this makes sure that machine_gen + #cleaning code shows up too + results['generated_py_code'] = self.generate_code(new_ops) results['transformed_df'] = json.loads(transformed_df.to_json(orient='table', indent=2)) results['transform_error'] = False - except Exception as e: results['transformed_df'] = EMPTY_DF_OBJ print(e) results['transform_error'] = str(e) self.operation_results = results + @observe('machine_gen_operations') + def interpret_machine_gen_ops(self, change, force=False): + if (not force) and lists_match(change['old'], change['new']): + return # nothing changed, do no computations + new_ops = change['new'] + + #this won't listen to sampled changes proeprly + if self.dfConfig['sampled']: + working_df = sample(self.raw_df, self.dfConfig['sampleSize']) + else: + working_df = self.raw_df + self.typed_df = self.interpret_ops(new_ops, working_df) + + # stats need to be rerun each time + self.stats = DfStats(self.typed_df, [TypingStats, DefaultSummaryStats, ColDisplayHints]) + self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) + self.update_based_on_df_config(3) + + def generate_code(self, operations): + if len(operations) == 0: + return 'no operations' + return self.buckaroo_to_py_core(operations) + + def interpret_ops(self, new_ops, df): + operations = [{'symbol': 'begin'}] + operations.extend(new_ops) + if len(operations) == 1: + return df + return self.buckaroo_transform(operations , df) + def setup_from_command_kls_list(self): + #used to initially setup the interpreter, and when a command + #is added interactively command_defaults, command_patterns, self.buckaroo_transform, self.buckaroo_to_py_core = configure_buckaroo( self.command_classes) - self.commandConfig = dict( - argspecs=command_patterns, defaultArgs=command_defaults) + self.commandConfig = dict(argspecs=command_patterns, defaultArgs=command_defaults) def add_command(self, incomingCommandKls): @@ -191,5 +217,21 @@ def add_command(self, incomingCommandKls): self.command_classes = without_incoming self.setup_from_command_kls_list() + def add_analysis(self, analysis_obj): + self.stats.add_analysis(analysis_obj) + self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) + #just trigger redisplay + self.update_based_on_df_config(3) + +class Unused(): + def update_based_on_df_config(self, change): + if self.dfConfig['reorderdColumns']: + #ideally this won't require a reserialization. All + #possible col_orders shoudl be serialized once, and the + #frontend should just toggle from them + #self.origDf = df_to_obj(tdf, self.stats.col_order, table_hints=self.stats.table_hints) + self.origDf = df_to_obj(self.typed_df, self.stats.col_order, table_hints=self.stats.table_hints) + else: + self.origDf = df_to_obj(tdf, tdf.columns, table_hints=self.stats.table_hints) diff --git a/buckaroo/cleaning_commands.py b/buckaroo/cleaning_commands.py new file mode 100644 index 000000000..5a1f68531 --- /dev/null +++ b/buckaroo/cleaning_commands.py @@ -0,0 +1,102 @@ +from .lispy import s +from .configure_utils import configure_buckaroo +from .auto_clean import smart_to_int, get_auto_type_operations +import pandas as pd +import numpy as np + +class Command(object): + pass + +class to_bool(Command): + #argument_names = ["df", "col"] + command_default = [s('to_bool'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + ser = df[col] + df[col] = pd.to_numeric(ser, errors='coerce').dropna().astype('boolean').reindex(ser.index) + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = pd.to_numeric(df['%s'], errors='coerce').dropna().astype('boolean').reindex(df['%s'].index)" % (col, col, col) + +class to_datetime(Command): + #argument_names = ["df", "col"] + command_default = [s('to_datetime'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + ser = df[col] + df[col] = pd.to_datetime(ser, errors='coerce').reindex(ser.index) + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = pd.to_datetime(df['%s'], errors='coerce').reindex(df['%s'].index)" % (col, col, col) + +class to_int(Command): + #argument_names = ["df", "col"] + command_default = [s('to_int'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + ser = df[col] + try: + df[col] = smart_to_int(ser) + except Exception as e: + #just let pandas figure it out, we recommended the wrong type + df[col] = pd.to_numeric(ser, errors='coerce') + + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = smart_int(df['%s'])" % (col, col) + +class to_float(Command): + #argument_names = ["df", "col"] + command_default = [s('to_float'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + ser = df[col] + df[col] = pd.to_numeric(ser, errors='coerce').dropna().astype('float').reindex(ser.index) + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = pd.to_numeric(df['%s'], errors='coerce')" % (col, col) + +class to_string(Command): + #argument_names = ["df", "col"] + command_default = [s('to_string'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + ser = df[col] + df[col] = ser.fillna(value="").astype('string').replace("", None).reindex(ser.index) + return df + + @staticmethod + def transform_to_py(df, col): + return " df['%s'] = df['%s'].fillna(value='').astype('string').replace('', None)" % (col, col) + + + +cleaning_classes = [to_bool, to_datetime, to_int, to_float, to_string,] + +def auto_type_df2(df): + _command_defaults, _command_patterns, transform, buckaroo_to_py_core = configure_buckaroo( + cleaning_classes) + + cleaning_operations = get_auto_type_operations(df) + + full_ops = [{'symbol': 'begin'}] + full_ops.extend(cleaning_operations) + return transform(full_ops, df) diff --git a/buckaroo/configure_utils.py b/buckaroo/configure_utils.py index 219874db8..b47f9498b 100644 --- a/buckaroo/configure_utils.py +++ b/buckaroo/configure_utils.py @@ -17,7 +17,6 @@ def configure_buckaroo(transforms): def buckaroo_transform(instructions, df): df_copy = df.copy() ret_val = buckaroo_eval(instructions, {'df':df_copy}) - #print(ret_val) return ret_val convert_to_python, __unused = make_interpreter(to_py_lisp_primitives) @@ -28,8 +27,6 @@ def buckaroo_to_py(instructions): #interpreter as 'begin'... that way the exact same instructions #could be sent to either interpreter. For now, this will do individual_instructions = [x for x in map(lambda x:convert_to_python(x, {'df':5}), instructions)] - #print("individual_instructions", individual_instructions) code_block = '\n'.join(individual_instructions) - return "def clean(df):\n" + code_block + "\n return df" return command_defaults, command_patterns, buckaroo_transform, buckaroo_to_py diff --git a/buckaroo/down_sample.py b/buckaroo/down_sample.py index 2ebe5c881..b168f845c 100644 --- a/buckaroo/down_sample.py +++ b/buckaroo/down_sample.py @@ -2,6 +2,14 @@ import numpy as np +def get_outlier_idxs(ser): + if not pd.api.types.is_numeric_dtype(ser.dtype): + return [] + outlier_idxs = [] + outlier_idxs.extend(ser.nlargest(5).index) + outlier_idxs.extend(ser.nsmallest(5).index) + return outlier_idxs + def sample(df, sample_size=500, include_outliers=True): if len(df) <= sample_size: diff --git a/buckaroo/lisp_utils.py b/buckaroo/lisp_utils.py new file mode 100644 index 000000000..08a0b6584 --- /dev/null +++ b/buckaroo/lisp_utils.py @@ -0,0 +1,46 @@ +""" +It would be awesome to have cleaning and verification commands that add new columns with related names + +The new columns are null accept for errored values. + +Could use this to show original values that were removed/cleaned. Combined with conditional styling in the UI + +sick. And still ahve high perfromance properly typed columns + + + +""" + +def is_symbol(obj): + return isinstance(obj, dict) and "symbol" in obj + +def is_generated_symbol(obj): + return is_symbol(obj) and obj.get("meta", False) + +def split_operations(full_operations): + """ + utitlity to split a combined set of operations with machine generated commands and user entered commands into two lists, machine_generated and user_generated + + machine_generated commands have function calls with the symbol token also having a meta key with a value of {"precleaning":True} + """ + + machine_generated, user_entered = [], [] + for command in full_operations: + assert isinstance(command, list) + sym_atom = command[0] + if is_symbol(sym_atom): + if is_generated_symbol(sym_atom): + machine_generated.append(command) + else: + user_entered.append(command) + continue + raise Exception("Unexpected token %r" % command) + return machine_generated, user_entered + +def lists_match(l1, l2): + #https://note.nkmk.me/en/python-list-compare/#checking-the-exact-match-of-lists + if len(l1) != len(l2): + return False + return all(x == y and type(x) == type(y) for x, y in zip(l1, l2)) + + diff --git a/buckaroo/lispy.py b/buckaroo/lispy.py index 27d58939d..b5e740c56 100644 --- a/buckaroo/lispy.py +++ b/buckaroo/lispy.py @@ -186,7 +186,6 @@ def eval(x, env=global_env): eval(exp, env) x = x[-1] else: # (proc exp*) - print("exp", x) exps = [eval(exp, env) for exp in x] proc = exps.pop(0) if isa(proc, Procedure): @@ -197,6 +196,22 @@ def eval(x, env=global_env): return proc(*exps) + def is_unparsed_atom_a_symbol(obj): + if isinstance(obj, dict): + if obj.get('symbol', False): + if len(obj) == 1: + return True + elif len(obj) == 2 and obj.get('meta', False) is not False: + #our symbols can have a meta key too + return True + return False + + def is_unparsed_atom_a_quote(obj): + if isinstance(obj, dict) and len(obj) == 1: + if obj.get('quote', False) is not False: + return True + return False + def list_parse(lst): ret_list = [] if isinstance(lst, list) == False: @@ -207,15 +222,12 @@ def list_parse(lst): while True: if isinstance(x, list): ret_list.append(list_parse(x)) - elif isinstance(x, dict) and len(x) == 1: #hack to make the aprser easier - if x.get('symbol', False): - ret_list.append(Sym(x['symbol'])) - elif x.get('quote', False): - quote_char = x.get('quote') - quote_func = quotes[quote_char] - ret_list.append([quote_func, list_parse(next(lst))]) - else: - ret_list.append(x) + elif is_unparsed_atom_a_symbol(x): + ret_list.append(Sym(x['symbol'])) + elif is_unparsed_atom_a_quote(x): + quote_char = x.get('quote') + quote_func = quotes[quote_char] + ret_list.append([quote_func, list_parse(next(lst))]) elif isinstance(x, dict): print("x was a dict", x) ret_list.append(x) diff --git a/buckaroo/order_columns.py b/buckaroo/order_columns.py index 0b4ac8d61..f54383460 100644 --- a/buckaroo/order_columns.py +++ b/buckaroo/order_columns.py @@ -82,14 +82,6 @@ def reorder_columns(df): col_order = order_columns(tdf_stats, cpd) return df[col_order] -def get_outlier_idxs(ser): - if not pd.api.types.is_numeric_dtype(ser.dtype): - return [] - outlier_idxs = [] - outlier_idxs.extend(ser.nlargest(5).index) - outlier_idxs.extend(ser.nsmallest(5).index) - return outlier_idxs - def add_col_rankings(df, sdf): sdf.loc['one_distinct'] = 0 diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index b33493bfe..07db0d15e 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -3,7 +3,7 @@ def _display_as_buckaroo(df): from IPython.display import display - return display(BuckarooWidget(df, showCommands=False, showTransformed=False)) + return display(BuckarooWidget(df, showCommands=False)) def enable(): """ diff --git a/docs/source/_static/embed-bundle.js.LICENSE.txt b/docs/source/_static/embed-bundle.js.LICENSE.txt index cfe1226b7..6ef8448c4 100644 --- a/docs/source/_static/embed-bundle.js.LICENSE.txt +++ b/docs/source/_static/embed-bundle.js.LICENSE.txt @@ -1,3 +1,151 @@ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ + +/*! Conditions:: INITIAL */ + +/*! Production:: css_value : ANGLE */ + +/*! Production:: css_value : CHS */ + +/*! Production:: css_value : EMS */ + +/*! Production:: css_value : EXS */ + +/*! Production:: css_value : FREQ */ + +/*! Production:: css_value : LENGTH */ + +/*! Production:: css_value : PERCENTAGE */ + +/*! Production:: css_value : REMS */ + +/*! Production:: css_value : RES */ + +/*! Production:: css_value : SUB css_value */ + +/*! Production:: css_value : TIME */ + +/*! Production:: css_value : VHS */ + +/*! Production:: css_value : VMAXS */ + +/*! Production:: css_value : VMINS */ + +/*! Production:: css_value : VWS */ + +/*! Production:: css_variable : CSS_VAR LPAREN CSS_CPROP COMMA math_expression RPAREN */ + +/*! Production:: css_variable : CSS_VAR LPAREN CSS_CPROP RPAREN */ + +/*! Production:: expression : math_expression EOF */ + +/*! Production:: math_expression : LPAREN math_expression RPAREN */ + +/*! Production:: math_expression : NESTED_CALC LPAREN math_expression RPAREN */ + +/*! Production:: math_expression : SUB PREFIX SUB NESTED_CALC LPAREN math_expression RPAREN */ + +/*! Production:: math_expression : css_value */ + +/*! Production:: math_expression : css_variable */ + +/*! Production:: math_expression : math_expression ADD math_expression */ + +/*! Production:: math_expression : math_expression DIV math_expression */ + +/*! Production:: math_expression : math_expression MUL math_expression */ + +/*! Production:: math_expression : math_expression SUB math_expression */ + +/*! Production:: math_expression : value */ + +/*! Production:: value : NUMBER */ + +/*! Production:: value : SUB NUMBER */ + +/*! Rule:: $ */ + +/*! Rule:: (--[0-9a-z-A-Z-]*) */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)% */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)Hz\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)ch\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)cm\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)deg\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)dpcm\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)dpi\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)dppx\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)em\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)ex\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)grad\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)in\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)kHz\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)mm\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)ms\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)pc\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)pt\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)px\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)rad\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)rem\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)s\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)turn\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)vh\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)vmax\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)vmin\b */ + +/*! Rule:: ([0-9]+(\.[0-9]*)?|\.[0-9]+)vw\b */ + +/*! Rule:: ([a-z]+) */ + +/*! Rule:: (calc) */ + +/*! Rule:: (var) */ + +/*! Rule:: , */ + +/*! Rule:: - */ + +/*! Rule:: \( */ + +/*! Rule:: \) */ + +/*! Rule:: \* */ + +/*! Rule:: \+ */ + +/*! Rule:: \/ */ + +/*! decimal.js-light v2.5.1 https://github.com/MikeMcl/decimal.js-light/LICENCE */ + /** * @ag-grid-community/all-modules - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue * @version v29.3.5 * @link https://www.ag-grid.com/ @@ -69,3 +217,12 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/docs/source/articles/histograms.rst b/docs/source/articles/histograms.rst new file mode 100644 index 000000000..4cb9988bc --- /dev/null +++ b/docs/source/articles/histograms.rst @@ -0,0 +1,56 @@ +.. _using: + +========== +Histograms +========== + +Buckaroo uses histograms to convey the general shape of a colum in the minimum amount of screen real estate. Like the rest of buckaroo, this is an opionated feature. + + +Simple histograms for numeric columns +===================================== + +Histograms traditionally show the distribution of values in a column allowing different distributions to be identified (normal distribution, bimodal, random, skew). This works well for accurate data without outliers. + +There are a couple types of outliers that mess up normal histogrrams. + +Traditional histograms make no provision for NaNs. There are two ways we could deal with NaN's treating them as another bar, or as an independent bar. We chose a separate bar because NaNs are a property of the entire dataset and the histogram is a function of the relevant values. NaNs are displayed in a different color and pattern. + +Sentinel values. Columns frquently have sentinel values mixed in to convey missing data or some special condition. After dropping NaNs, we then look at the value counts, here is one explanation of a sampling + +imagine a dataset inserts 0 for NaNs, without 0's the range of numbers goes from 55 to 235, 0's account for 10% of observations. 0 is obviosuly a sentinel here and should be plotted as a categorical. If you disagree you can write your own histogram implementation and plug it in with the pluggable analysis framework. + +Extreme values. Buckaroo limits the extents of the set where the histogram is computed so that of the 10 bins, no single bin represents more than 50% of samples, limited to the quantile range from (0.1 to 0.9). The reasoning is that the extreme values represent errant values if they are so far off that they mess up the range of the rest of the histogram. I haven't decided how to convey which quantile range was chosen. + + +Categorical Histograms for everything else +========================================== + +Histograms are generally considered for numeric columns. Most datasets have many categorical or non numeric values, how can we get a quick overview of them? + +Well we already know how to plot NaNs, there are three other sentinel values that matter False, True, and "0". + +Remaining categoricals are plotted as a long tail plot, most frequent on the left with decreasing frequency to the right. The top 7 most frequent values are plotted, with a final bar of "long tail" consisting of the sum of all the remaining values" + + +Objections to this approach +=========================== + +This is not a traditional histogram and should not be read as such. It is the best way to show the most insight about frequency of values in a column that we could come up with. + + +Other research +============== + +https://edwinth.github.io/blog/outlier-bin/ + +https://stackoverflow.com/questions/11882393/matplotlib-disregard-outliers-when-plotting +references + + Boris Iglewicz and David Hoaglin (1993), "Volume 16: How to Detect and + Handle Outliers", The ASQC Basic References in Quality Control: + Statistical Techniques, Edward F. Mykytka, Ph.D., Editor. + + + + diff --git a/examples/App.tsx b/examples/App.tsx index 4c382f9dc..fa2539942 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ -//import 'bootstrap/dist/css/bootstrap.min.css'; +import 'bootstrap/dist/css/bootstrap.min.css'; import React from 'react'; import {HashRouter as Router, Route, Link} from 'react-router-dom'; //import {Button} from 'react-bootstrap'; @@ -16,7 +16,8 @@ const examples = { ColumnsEditorEx: {title: 'ColumnsEditor', file: 'ColumnsEditorEx'}, CommandViewerEx: {title: 'CommandViewer', file: 'CommandViewerEx'}, DFViewerEx: {title: 'DFViewer', file: 'DFViewerEx'}, - StatusBarEx: {title: 'StatusBar', file: 'StatusBarEx'} + StatusBarEx: {title: 'StatusBar', file: 'StatusBarEx'}, + HistogramEx: {title: 'Histogram', file: 'HistogramEx'} }; // The examples use a code-loading technique that I have described in diff --git a/examples/app.css b/examples/app.css index 2802ab690..c464b4569 100644 --- a/examples/app.css +++ b/examples/app.css @@ -9,9 +9,10 @@ } .left-menu { - width: 10em; - min-width: 10em; - max-width: 10em; + width: 105; + min-width: 15em; + max-width: 15em; + overflow:hidden } .codeblock { @@ -35,6 +36,9 @@ --color-example: #fff; } +.fluid-container { + min-width:950px +} html,body { @@ -65,3 +69,106 @@ html,body outline:4px solid pink; } +.histogram { + color:black; +} + +.customHeaderRenderer { + height:100%; +} +.customHeaderLabel { + padding:0; +} + + +.histogram-ex { + +} + +.histogram-ex .histogram-wrap {border: 1px solid gray; clear:both} +.histogram-ex span {color:black; width:200px; float:left; text-align:left; } +.histogram-ex .histogram-component {width:105px; float:left} +.patterns { + width: 100vw; + height: 100vw; +} + + +.small-bar { + height:30px; width:10px; +} + +.med-bar { + height:100px; width:100px; +} + +/* +from https://www.magicpattern.design/tools/css-backgrounds +*/ +.pt1 { +background-color: #e5e5f7; +opacity: 0.8; +background-image: repeating-linear-gradient(45deg, #444cf7 25%, transparent 25%, transparent 75%, #444cf7 75%, #444cf7), repeating-linear-gradient(45deg, #444cf7 25%, #e5e5f7 25%, #e5e5f7 75%, #444cf7 75%, #444cf7); +background-position: 0 0, 2px 2px; +background-size: 4px 4px; + +} +.pt4 { + background-color: #e5e5f7; + opacity: 0.8; + background: repeating-linear-gradient( 45deg, #444cf7, #444cf7 3px, #e5e5f7 3px, #e5e5f7 6px ); +} + +.pt5 { +background-color: #e5e5f7; +opacity: 0.8; +background-image: linear-gradient(135deg, #444cf7 25%, transparent 25%), linear-gradient(225deg, #444cf7 25%, transparent 25%), linear-gradient(45deg, #444cf7 25%, transparent 25%), linear-gradient(315deg, #444cf7 25%, #e5e5f7 25%); +background-position: 3px 0, 3px 0, 0 0, 0 0; +background-size: 6px 6px; +background-repeat: repeat; +} + +.pt6 { +background-color: #e5e5f7; +opacity: 0.8; +background-image: radial-gradient(#444cf7 1.2px, #e5e5f7 1.2px); +background-size: 4px 4px; +} + +.pt7 { +background-color: #e5e5f7; +opacity: 0.8; +background-image: radial-gradient( ellipse farthest-corner at 4px 4px , #444cf7, #444cf7 50%, #e5e5f7 50%); +background-size: 4px 4px; + +} +/* +body { + + margin: 0; + min-height: 100vh; +} + +html { + background: #fff; +} + +special values + +true +false +n/a +long tail +completely unique + + +*/ + + +.ag-column-hover: { + overflow: visible +} +.histogram-ex { background:#181d1f} +.histogram-ex span { color : white } + + diff --git a/examples/ex/HistogramEx.tsx b/examples/ex/HistogramEx.tsx new file mode 100644 index 000000000..b65c747a2 --- /dev/null +++ b/examples/ex/HistogramEx.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { HistogramCell} from '../../js/components/CustomHeader'; +import {histograms } from '../../js/components/staticData'; + + + +export default function Simple() { + const { + num_histo, bool_histo, NA_Only, simple_catgeorical, categorical_histo, + categorical_histo_lt, all_unique, unique_na, unique_continuous, + unique_continuous_scaled, unique_continuous_scaled_50, + start_station_categorical} = histograms; + return

    +
    + Numeric + +
    +
    + Boolean with NA + +
    +
    + NA Only + +
    +
    + Simple Categorical + +
    + +
    + Categorical unique NA + +
    +
    + Categorical_longtail + +
    + +
    + Categorical All unique + +
    + +
    + Categorical Unique with NA + +
    + +
    + Numeric all Unique + +
    +
    + start station categorical + +
    + + +
    + Numeric 50% unique + +
    + + + +
    +} +/* + + + */ diff --git a/examples/index.tsx b/examples/index.tsx new file mode 100644 index 000000000..221b5b5d6 --- /dev/null +++ b/examples/index.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; + +import App from './App'; + +// eslint-disable-next-line no-console +console.debug('React 16/17 mode'); +ReactDOM.render(, document.getElementById('root')); diff --git a/introduction.ipynb b/introduction.ipynb index f7445f3bd..f0d1fe228 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -22,25 +22,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1ab9f44b82a345749e10b78c2097dcd4", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "BuckarooWidget(commandConfig={'argspecs': {'dropcol': [None], 'to_datetime': [None], 'safeint': [None], 'filln…" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = pd.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')\n", "BuckarooWidget(df[:10_000])" @@ -314,10 +298,275 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.98543491, 0.88189975, 0.8519125 , 0.34405232, 0.64923551,\n", + " 0.76498397, 0.08317026, 0.33898759, 0.8959272 , 0.84532194,\n", + " 0.61846565, 0.97065402, 0.33760845, 0.14928914, 0.46931127,\n", + " 0.44402314, 0.3851214 , 0.30878261, 0.15215036, 0.30283917,\n", + " 0.34619956, 0.94479008, 0.52277332, 0.46966805, 0.01990334,\n", + " 0.0090225 , 0.18186927, 0.67424679, 0.38775559, 0.48266829,\n", + " 0.83345845, 0.7639416 , 0.71366249, 0.40440437, 0.0687034 ,\n", + " 0.99350699, 0.02384897, 0.61694475, 0.16986129, 0.76552384,\n", + " 0.49479425, 0.50517121, 0.80248113, 0.38342123, 0.25053957,\n", + " 0.09369322, 0.53027412, 0.80884121, 0.96754405, 0.10643695,\n", + " 0.30732228, 0.09244387, 0.75280274, 0.66100238, 0.21485027,\n", + " 0.74945128, 0.45370822, 0.88729706, 0.18465771, 0.01511092,\n", + " 0.13943961, 0.68186614, 0.68525074, 0.90057088, 0.58703984,\n", + " 0.47070748, 0.85631468, 0.48696279, 0.94382412, 0.91341682,\n", + " 0.85296105, 0.05317179, 0.68182398, 0.13682457, 0.43423833,\n", + " 0.98276478, 0.26740801, 0.73420044, 0.80780702, 0.476105 ,\n", + " 0.587292 , 0.00186236, 0.81152695, 0.42044342, 0.13466556,\n", + " 0.76170374, 0.52000642, 0.93240774, 0.97551015, 0.65619746,\n", + " 0.81113788, 0.90734312, 0.76348578, 0.15419325, 0.56967834,\n", + " 0.89901476, 0.87296504, 0.6050323 , 0.87922915, 0.58874466])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.random.rand(1,100)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.12371643, 0.27411337, 0.44275076, 0.21505491, 0.57833314])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.random.random_sample(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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fvOb3xhJ5tlnnw2af+yxx0xSUpLZvHmz+eMf/2i+8IUvmKysLPO3v/3NWTNt2jRz7bXXml27dplXXnnFXHHFFebuu+/u5U66Lz8/36xfv94cPHjQ1NXVmdtuu82MGDHCnD592llz3333mczMTLNjxw6zd+9ec/3115vJkyc78925r0eS559/3rzwwgvmjTfeMEePHjXf+973TFxcnDl48KAxJvr6/SACTA9t3brVXH311ebQoUMdAsyPf/xjM2TIEOP3+52xhx56yFx11VXO9pe//GUzY8aMoGNOmjTJfPOb3wx77aHw3HPPGZfLZVpaWowx/aPn8vJyk5WV5WxHc8/r16/vNMBs3brVxMTEGJ/P54w9+eSTxuPxOD+HBx980IwZMyZov6985SsmPz8/rDWHysSJE01xcbGz3draajIyMsyyZcv6sKrQ+HCAaWtrM+np6ebxxx93xpqamozb7Ta/+MUvjDHGHD582Egye/bscda8+OKLxuVymXfffbfXav97NDQ0GEnm5ZdfNsZc6DEuLs4888wzzpojR44YSaa6utoY0737eqQbMmSI+bd/+7eo75eXkHqgvr5es2fP1r//+78rMTGxw3x1dbVuvvlmxcfHO2P5+fk6evSo3nvvPWdNbm5u0H75+fmqrq4Ob/Eh0NjYqI0bN2ry5MmKi4uTFP09S9KpU6eUkpLibPeHnj+surpa48aNC/ogyfz8fDU3N+vQoUPOGlt7bmlpUW1tbVD9MTExys3NtaL+njp27Jh8Pl9Qv0lJSZo0aZLTb3V1tZKTk5Wdne2syc3NVUxMjGpqanq95ktx6tQpSXIev7W1tQoEAkF9X3311RoxYkRQ3xe7r0eq1tZWPf300zpz5oxycnKivl8CTDcZY3TvvffqvvvuC3pAf5DP5+vwScHt2z6fr8s17fOR6KGHHtKgQYM0dOhQnThxQs8995wzF609t/vzn/+siooKffOb33TGor3nzvw9PTc3N+tvf/tb7xR6if73f/9Xra2tUXWbdaW9p6769fl8Sk1NDZofMGCAUlJSrPiZtLW1ae7cubrhhhs0duxYSRd6io+P7/A+rw/3fbH7eqQ5cOCALrvsMrndbt1333169tlnNXr06Kjtt12/DzDz58+Xy+Xq8utPf/qTKioq9P7776usrKyvS/67dbfndvPmzdO+fftUWVmp2NhYfe1rX5Ox7AOce9qzJL377ruaNm2avvSlL2n27Nl9VPmlu5SegWhRXFysgwcP6umnn+7rUsLuqquuUl1dnWpqanT//ferqKhIhw8f7uuywi5i/xZSb3nggQd07733drnmk5/8pHbu3Knq6uoOf0MiOztbhYWF+tnPfqb09PQO7+5u305PT3e+d7amfb43dLfndsOGDdOwYcP06U9/WqNGjVJmZqZ27dqlnJycqO355MmTuvXWWzV58mStW7cuaF209tyV9PT0DlfkdLdnj8ejgQMHdrPqvjFs2DDFxsb2+W3WW9p7qq+v1/Dhw53x+vp6jR8/3lnT0NAQtN/58+fV2NgY8T+TkpISbdmyRVVVVfrEJz7hjKenp6ulpUVNTU1Bz0p88Hbuzn090sTHx+uKK66QJE2YMEF79uzRE088oa985StR2a+jr9+EY4u33nrLHDhwwPnavn27kWR+/etfm7ffftsY8/9v7mx/g6sxxpSVlXV4c+fnP//5oGPn5ORE/Js727311ltGknnppZeMMdHZ8zvvvGOuvPJKU1BQYM6fP99hPhp7bnexN/F+8Iqcn/zkJ8bj8Zhz584ZYy68iXfs2LFB+919991WvYm3pKTE2W5tbTUf//jHo/pNvCtWrHDGTp061embePfu3eus2b59e0S/ibetrc0UFxebjIwM88Ybb3SYb39T669//Wtn7E9/+lOnb2rt6r4e6W699VZTVFQU9f0SYC7RsWPHOlyF1NTUZNLS0sw999xjDh48aJ5++mmTmJjY4fLaAQMGmBUrVpgjR46YRx55JGIvr921a5epqKgw+/btM8ePHzc7duwwkydPNp/61KecO3a09fzOO++YK664wkyZMsW888475r//+7+dr3bR1rMxF4Lpvn37zOLFi81ll11m9u3bZ/bt22fef/99Y8z/X2qZl5dn6urqzLZt28zHPvaxTi+jnjdvnjly5IhZs2aNdZdRu91us2HDBnP48GEzZ84ck5ycHHR1hk3ef/9953aUZFauXGn27dtn3nrrLWPMhcuok5OTzXPPPWf2799v7rjjjk4vo77uuutMTU2N+cMf/mCuvPLKiL6M+v777zdJSUnm97//fdBj9+zZs86a++67z4wYMcLs3LnT7N27t8NHQ3Tnvh5J5s+fb15++WVz7Ngxs3//fjN//nzjcrlMZWWlMSb6+v0gAswl6izAGGPMH//4R3PjjTcat9ttPv7xj5vHHnusw76/+tWvzKc//WkTHx9vxowZY1544YVeqrpn9u/fb2699VaTkpJi3G63ufzyy819991n3nnnnaB10dTz+vXrjaROvz4omno2xpiioqJOe25/ps0YY44fP26mT59uBg4caIYNG2YeeOABEwgEgo7z0ksvmfHjx5v4+HjzyU9+0qxfv753G/k7VVRUmBEjRpj4+HgzceJEs2vXrr4u6ZK99NJLnd6mRUVFxpgLz1YsWLDApKWlGbfbbaZMmWKOHj0adIy//vWv5u677zaXXXaZ8Xg85utf/7oTaiPRRz12P3g//Nvf/ma+9a1vmSFDhpjExERz1113Bf0PijHdu69Him984xtm5MiRJj4+3nzsYx8zU6ZMccKLMdHX7we5jLHs3ZgAAKDf6/dXIQEAAPsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgnf8D9iExpIWQKPsAAAAASUVORK5CYII=", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "arr = np.random.standard_normal(5000) * 100\n", + "arr = arr.astype(int)\n", + "ser = pd.Series(arr)\n", + "ser.hist()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 3, 17, 124, 501, 1079, 1483, 1123, 497, 156, 17])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "populations, endpoints = np.histogram(arr, 10)\n", + "populations" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-406. , -332.3, -258.6, -184.9, -111.2, -37.5, 36.2, 109.9,\n", + " 183.6, 257.3, 331. ])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "endpoints" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['-406 -332',\n", + " '-332 -258',\n", + " '-258 -184',\n", + " '-184 -111',\n", + " '-111 -37',\n", + " '-37 36',\n", + " '36 109',\n", + " '109 183',\n", + " '183 257',\n", + " '257 331']" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def histogram_labels(endpoints):\n", + " left = endpoints[0]\n", + " labels = []\n", + " for edge in endpoints[1:]:\n", + " labels.append(\"%d %d\" % (left, edge))\n", + " left = edge\n", + " return labels\n", + "histogram_labels(endpoints)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.0006, 0.0034, 0.0248, 0.1002, 0.2158, 0.2966, 0.2246, 0.0994,\n", + " 0.0312, 0.0034])" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "normalized_pop = populations / populations.sum()\n", + "normalized_pop" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'-406 -332': 0.0006,\n", + " '-332 -258': 0.0034,\n", + " '-258 -184': 0.0248,\n", + " '-184 -111': 0.1002,\n", + " '-111 -37': 0.2158,\n", + " '-37 36': 0.2966,\n", + " '36 109': 0.2246,\n", + " '109 183': 0.0994,\n", + " '183 257': 0.0312,\n", + " '257 331': 0.0034}" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dict(zip( histogram_labels(endpoints), normalized_pop))" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'name': '-406 -332', 'population': 0.0006},\n", + " {'name': '-332 -258', 'population': 0.0034},\n", + " {'name': '-258 -184', 'population': 0.0248},\n", + " {'name': '-184 -111', 'population': 0.1002},\n", + " {'name': '-111 -37', 'population': 0.2158},\n", + " {'name': '-37 36', 'population': 0.2966},\n", + " {'name': '36 109', 'population': 0.2246},\n", + " {'name': '109 183', 'population': 0.0994},\n", + " {'name': '183 257', 'population': 0.0312},\n", + " {'name': '257 331', 'population': 0.0034}]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def histogram_formatted_dict(arr):\n", + " populations, endpoints = np.histogram(arr, 10)\n", + " labels = histogram_labels(endpoints)\n", + " normalized_pop = populations / populations.sum()\n", + " ret_histo = []\n", + " for label, pop in zip(labels, normalized_pop):\n", + " ret_histo.append({'name': label, 'population':pop})\n", + " return ret_histo\n", + "histogram_formatted_dict(arr)" + ] }, { "cell_type": "code", diff --git a/js/components/BaseHeader.tsx b/js/components/BaseHeader.tsx new file mode 100644 index 000000000..ece765f9e --- /dev/null +++ b/js/components/BaseHeader.tsx @@ -0,0 +1,465 @@ +/* +import { Autowired } from "../../../context/context"; +import { Column } from "../../../entities/column"; +import { IComponent } from "../../../interfaces/iComponent"; +import { IMenuFactory } from "../../../interfaces/iMenuFactory"; +import { AgGridCommon } from "../../../interfaces/iCommon"; +import { SortController } from "../../../sortController"; +import { firstExistingValue } from "../../../utils/array"; +import { isIOSUserAgent } from "../../../utils/browser"; +import { removeFromParent, setDisplayed } from "../../../utils/dom"; +import { exists } from "../../../utils/generic"; +import { createIconNoSpan } from "../../../utils/icon"; +import { escapeString } from "../../../utils/string"; +import { Component } from "../../../widgets/component"; +import { RefSelector } from "../../../widgets/componentAnnotations"; +import { LongTapEvent, TapEvent, TouchListener } from "../../../widgets/touchListener"; +import { SortIndicatorComp } from "./sortIndicatorComp"; +import { ColumnModel } from "../../../columns/columnModel"; +import { Events } from "../../../eventKeys"; +import { SortDirection } from "../../../entities/colDef"; + + +import { firstExistingValue } from "../../../utils/array"; +*/ + +import { + Autowired, + Column, + IComponent, + IMenuFactory, + SortController, + _, // contains all of the utils stuff + Component, + RefSelector, + LongTapEvent, + TapEvent, + TouchListener, + SortIndicatorComp, + ColumnModel, + Events, + SortDirection, + GridApi, + ColumnApi, +} from 'ag-grid-community'; + +const escapeString = _.escapeString; +const removeFromParent = _.removeFromParent; +const setDisplayed = _.setDisplayed; +const firstExistingValue = _.firstExistingValue; +const isIOSUserAgent = _.isIOSUserAgent; + +const exists = _.exists; +const createIconNoSpan = _.createIconNoSpan; + +export interface AgGridCommon { + /** The grid api. */ + api: GridApi; + /** The column api. */ + columnApi: ColumnApi; + /** Application context as set on `gridOptions.context`. */ + context: TContext; +} + +export interface IHeaderParams + extends AgGridCommon { + /** The column the header is for. */ + column: Column; + /** + * The name to display for the column. + * If the column is using a headerValueGetter, the displayName will take this into account. + */ + displayName: string; + /** + * Whether sorting is enabled for the column. + * Only put sort logic into your header if this is true. + */ + enableSorting: boolean | undefined; + /** + * Whether menu is enabled for the column. + * Only display a menu button in your header if this is true. + */ + enableMenu: boolean; + /** + * Callback to request the grid to show the column menu. + * Pass in the html element of the column menu to have the + * grid position the menu over the button. + */ + showColumnMenu: (source: HTMLElement) => void; + /** + * Callback to progress the sort for this column. + * The grid will decide the next sort direction eg ascending, descending or 'no sort'. + * Pass `multiSort=true` if you want to do a multi sort (eg user has Shift held down when they click). + */ + progressSort: (multiSort?: boolean) => void; + /** + * Callback to set the sort for this column. + * Pass the sort direction to use ignoring the current sort eg one of 'asc', 'desc' or null (for no sort). + * Pass `multiSort=true` if you want to do a multi sort (eg user has Shift held down when they click) + */ + setSort: (sort: SortDirection, multiSort?: boolean) => void; + + /** Custom header template if provided to `headerComponentParams`, otherwise will be `undefined`. See [Header Templates](https://ag-grid.com/javascript-data-grid/column-headers/#header-templates) */ + template?: string; + /** + * The header the grid provides. + * The custom header component is a child of the grid provided header. + * The grid's header component is what contains the grid managed functionality such as resizing, keyboard navigation etc. + * This is provided should you want to make changes to this cell, + * eg add ARIA tags, or add keyboard event listener (as focus goes here when navigating to the header). + */ + eGridHeader: HTMLElement; +} + +export interface IHeader { + /** Get the header to refresh. Gets called whenever Column Defs are updated. */ + refresh(params: IHeaderParams): boolean; +} + +export interface IHeaderComp extends IHeader, IComponent {} + +export class HeaderComp extends Component implements IHeaderComp { + private static TEMPLATE /* html */ = ``; + + @Autowired('sortController') private sortController: SortController; + @Autowired('menuFactory') private menuFactory: IMenuFactory; + @Autowired('columnModel') private readonly columnModel: ColumnModel; + + @RefSelector('eFilter') private eFilter: HTMLElement; + @RefSelector('eSortIndicator') private eSortIndicator: SortIndicatorComp; + @RefSelector('eMenu') private eMenu: HTMLElement; + @RefSelector('eLabel') private eLabel: HTMLElement; + @RefSelector('eText') private eText: HTMLElement; + + /** + * Selectors for custom headers templates + */ + @RefSelector('eSortOrder') private eSortOrder: HTMLElement; + @RefSelector('eSortAsc') private eSortAsc: HTMLElement; + @RefSelector('eSortDesc') private eSortDesc: HTMLElement; + @RefSelector('eSortMixed') private eSortMixed: HTMLElement; + @RefSelector('eSortNone') private eSortNone: HTMLElement; + + private params: IHeaderParams; + + private lastMovingChanged = 0; + + private currentDisplayName: string; + private currentTemplate: string | null | undefined; + private currentShowMenu: boolean; + private currentSort: boolean | undefined; + + // this is a user component, and IComponent has "public destroy()" as part of the interface. + // so we need to override destroy() just to make the method public. + public destroy(): void { + super.destroy(); + } + + public refresh(params: IHeaderParams): boolean { + this.params = params; + + // if template changed, then recreate the whole comp, the code required to manage + // a changing template is to difficult for what it's worth. + if (this.workOutTemplate() != this.currentTemplate) { + return false; + } + if (this.workOutShowMenu() != this.currentShowMenu) { + return false; + } + if (this.workOutSort() != this.currentSort) { + return false; + } + + this.setDisplayName(params); + + return true; + } + + private workOutTemplate(): string | null | undefined { + let template: string | null | undefined = firstExistingValue( + this.params.template, + HeaderComp.TEMPLATE + ); + + // take account of any newlines & whitespace before/after the actual template + template = template && template.trim ? template.trim() : template; + return template; + } + + public init(params: IHeaderParams): void { + this.params = params; + + this.currentTemplate = this.workOutTemplate(); + this.setTemplate(this.currentTemplate); + this.setupTap(); + this.setupIcons(params.column); + this.setMenu(); + this.setupSort(); + this.setupFilterIcon(); + this.setDisplayName(params); + } + + private setDisplayName(params: IHeaderParams): void { + if (this.currentDisplayName != params.displayName) { + this.currentDisplayName = params.displayName; + const displayNameSanitised = escapeString(this.currentDisplayName); + if (this.eText) { + this.eText.innerHTML = displayNameSanitised!; + } + } + } + + private setupIcons(column: Column): void { + this.addInIcon('menu', this.eMenu, column); + this.addInIcon('filter', this.eFilter, column); + } + + private addInIcon( + iconName: string, + eParent: HTMLElement, + column: Column + ): void { + if (eParent == null) { + return; + } + + const eIcon = createIconNoSpan(iconName, this.gridOptionsService, column); + if (eIcon) { + eParent.appendChild(eIcon); + } + } + + private setupTap(): void { + const { gridOptionsService } = this; + + if (gridOptionsService.is('suppressTouch')) { + return; + } + + const touchListener = new TouchListener(this.getGui(), true); + const suppressMenuHide = gridOptionsService.is('suppressMenuHide'); + const tapMenuButton = suppressMenuHide && exists(this.eMenu); + const menuTouchListener = tapMenuButton + ? new TouchListener(this.eMenu, true) + : touchListener; + + if (this.params.enableMenu) { + const eventType = tapMenuButton ? 'EVENT_TAP' : 'EVENT_LONG_TAP'; + const showMenuFn = (event: TapEvent | LongTapEvent) => { + gridOptionsService.api.showColumnMenuAfterMouseClick( + this.params.column, + event.touchStart + ); + }; + this.addManagedListener( + menuTouchListener, + TouchListener[eventType], + showMenuFn + ); + } + + if (this.params.enableSorting) { + const tapListener = (event: TapEvent) => { + const target = event.touchStart.target as HTMLElement; + // When suppressMenuHide is true, a tap on the menu icon will bubble up + // to the header container, in that case we should not sort + if (suppressMenuHide && this.eMenu.contains(target)) { + return; + } + + this.sortController.progressSort( + this.params.column, + false, + 'uiColumnSorted' + ); + }; + + this.addManagedListener( + touchListener, + TouchListener.EVENT_TAP, + tapListener + ); + } + + // if tapMenuButton is true `touchListener` and `menuTouchListener` are different + // so we need to make sure to destroy both listeners here + this.addDestroyFunc(() => touchListener.destroy()); + + if (tapMenuButton) { + this.addDestroyFunc(() => menuTouchListener.destroy()); + } + } + + private workOutShowMenu(): boolean { + // we don't show the menu if on an iPad/iPhone, as the user cannot have a pointer device/ + // However if suppressMenuHide is set to true the menu will be displayed alwasys, so it's ok + // to show it on iPad in this case (as hover isn't needed). If suppressMenuHide + // is false (default) user will need to use longpress to display the menu. + const menuHides = !this.gridOptionsService.is('suppressMenuHide'); + + const onIpadAndMenuHides = isIOSUserAgent() && menuHides; + const showMenu = this.params.enableMenu && !onIpadAndMenuHides; + + return showMenu; + } + + private setMenu(): void { + // if no menu provided in template, do nothing + if (!this.eMenu) { + return; + } + + this.currentShowMenu = this.workOutShowMenu(); + if (!this.currentShowMenu) { + removeFromParent(this.eMenu); + return; + } + + const suppressMenuHide = this.gridOptionsService.is('suppressMenuHide'); + this.addManagedListener(this.eMenu, 'click', () => + this.showMenu(this.eMenu) + ); + this.eMenu.classList.toggle('ag-header-menu-always-show', suppressMenuHide); + } + + public showMenu(eventSource?: HTMLElement) { + if (!eventSource) { + eventSource = this.eMenu; + } + + this.menuFactory.showMenuAfterButtonClick( + this.params.column, + eventSource, + 'columnMenu' + ); + } + + private workOutSort(): boolean | undefined { + return this.params.enableSorting; + } + + public setupSort(): void { + this.currentSort = this.params.enableSorting; + + // eSortIndicator will not be present when customers provided custom header + // templates, in that case, we need to look for provided sort elements and + // manually create eSortIndicator. + if (!this.eSortIndicator) { + this.eSortIndicator = this.context.createBean( + new SortIndicatorComp(true) + ); + this.eSortIndicator.attachCustomElements( + this.eSortOrder, + this.eSortAsc, + this.eSortDesc, + this.eSortMixed, + this.eSortNone + ); + } + this.eSortIndicator.setupSort(this.params.column); + + // we set up the indicator prior to the check for whether this column is sortable, as it allows the indicator to + // set up the multi sort indicator which can appear irrelevant of whether this column can itself be sorted. + // this can occur in the case of a non-sortable group display column. + if (!this.currentSort) { + return; + } + + const sortUsingCtrl = + this.gridOptionsService.get('multiSortKey') === 'ctrl'; + + // keep track of last time the moving changed flag was set + this.addManagedListener( + this.params.column, + Column.EVENT_MOVING_CHANGED, + () => { + this.lastMovingChanged = new Date().getTime(); + } + ); + + // add the event on the header, so when clicked, we do sorting + if (this.eLabel) { + this.addManagedListener(this.eLabel, 'click', (event: MouseEvent) => { + // sometimes when moving a column via dragging, this was also firing a clicked event. + // here is issue raised by user: https://ag-grid.zendesk.com/agent/tickets/1076 + // this check stops sort if a) column is moving or b) column moved less than 200ms ago (so caters for race condition) + const moving = this.params.column.isMoving(); + const nowTime = new Date().getTime(); + // typically there is <2ms if moving flag was set recently, as it would be done in same VM turn + const movedRecently = nowTime - this.lastMovingChanged < 50; + const columnMoving = moving || movedRecently; + + if (!columnMoving) { + const multiSort = sortUsingCtrl + ? event.ctrlKey || event.metaKey + : event.shiftKey; + this.params.progressSort(multiSort); + } + }); + } + + const onSortingChanged = () => { + this.addOrRemoveCssClass( + 'ag-header-cell-sorted-asc', + this.params.column.isSortAscending() + ); + this.addOrRemoveCssClass( + 'ag-header-cell-sorted-desc', + this.params.column.isSortDescending() + ); + this.addOrRemoveCssClass( + 'ag-header-cell-sorted-none', + this.params.column.isSortNone() + ); + + if (this.params.column.getColDef().showRowGroup) { + const sourceColumns = this.columnModel.getSourceColumnsForGroupColumn( + this.params.column + ); + // this == is intentional, as it allows null and undefined to match, which are both unsorted states + const sortDirectionsMatch = sourceColumns?.every( + (sourceCol) => this.params.column.getSort() == sourceCol.getSort() + ); + const isMultiSorting = !sortDirectionsMatch; + + this.addOrRemoveCssClass('ag-header-cell-sorted-mixed', isMultiSorting); + } + }; + this.addManagedListener( + this.eventService, + Events.EVENT_SORT_CHANGED, + onSortingChanged + ); + this.addManagedListener( + this.eventService, + Events.EVENT_COLUMN_ROW_GROUP_CHANGED, + onSortingChanged + ); + } + + private setupFilterIcon(): void { + if (!this.eFilter) { + return; + } + + this.addManagedListener( + this.params.column, + Column.EVENT_FILTER_CHANGED, + this.onFilterChanged.bind(this) + ); + this.onFilterChanged(); + } + + private onFilterChanged(): void { + const filterPresent = this.params.column.isFilterActive(); + setDisplayed(this.eFilter, filterPresent, { skipAriaHidden: true }); + } +} diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx index 0b41d678b..461dc22c9 100644 --- a/js/components/ColumnsEditor.tsx +++ b/js/components/ColumnsEditor.tsx @@ -5,15 +5,14 @@ import { Operation } from './OperationUtils'; import { CommandConfigT } from './CommandUtils'; //import {bakedCommandConfig} from './bakedOperationDefaults'; import { DependentTabs, OperationResult } from './DependentTabs'; -import { tableDf, bakedCommandConfig } from './staticData' +import { tableDf, bakedCommandConfig } from './staticData'; export type OperationSetter = (ops: Operation[]) => void; export interface WidgetConfig { - showCommands:boolean; -// showTransformed:boolean; + showCommands: boolean; + // showTransformed:boolean; } - export function ColumnsEditor({ df, activeColumn, @@ -21,7 +20,7 @@ export function ColumnsEditor({ setOperations, operationResult, commandConfig, - widgetConfig + widgetConfig, }: { df: DFWhole; activeColumn: string; @@ -29,26 +28,29 @@ export function ColumnsEditor({ setOperations: OperationSetter; operationResult: OperationResult; commandConfig: CommandConfigT; - widgetConfig:WidgetConfig + widgetConfig: WidgetConfig; }) { const allColumns = df.schema.fields.map((field) => field.name); //console.log('Columns Editor, commandConfig', commandConfig); return (
    - {(widgetConfig.showCommands) ? ( -
    - - -
    - ) : } + {widgetConfig.showCommands ? ( +
    + + +
    + ) : ( + + )}
    ); } @@ -69,8 +71,8 @@ export function ColumnsEditorEx() { commandConfig={bakedCommandConfig} operations={operations} setOperations={setOperations} - operationResult={baseOperationResults} - widgetConfig={{showCommands:true}} + operationResult={baseOperationResults} + widgetConfig={{ showCommands: true }} /> ); } diff --git a/js/components/CustomHeader.tsx b/js/components/CustomHeader.tsx new file mode 100644 index 000000000..9fd20d036 --- /dev/null +++ b/js/components/CustomHeader.tsx @@ -0,0 +1,257 @@ +import _ from 'lodash'; +import React from 'react'; +import { createPortal } from 'react-dom'; +import { IHeaderParams } from './BaseHeader'; + +import { + BarChart, + Bar, + //Tooltip, + //Legend, + //Cell, XAxis, YAxis, CartesianGrid, , ResponsiveContainer, +} from 'recharts'; +import { Tooltip } from './RechartTooltip'; +import { isNumOrStr, ValueType } from './RechartExtra'; +//import { ICellRendererParams } from 'ag-grid-community'; + +export interface ICustomHeaderParams extends IHeaderParams { + menuIcon: string; + histogram?: number[]; +} + +function defaultFormatter(value: TValue) { + return _.isArray(value) && isNumOrStr(value[0]) && isNumOrStr(value[1]) + ? (value.join(' ~ ') as TValue) + : value; +} + +export const bakedData = [ + { + name: 'Page A', + population: 4000, + }, + { + name: 'Page B', + population: 3000, + }, + { + name: 'Page C', + population: 2000, + }, + { + name: 'Page D', + population: 2780, + }, + { + name: 'Page E', + population: 1890, + }, +]; + +export const makeData = (histogram: number[]) => { + const accum = []; + for (let i = 0; i < histogram.length; i++) { + accum.push({ + name: `${i + 1}/${histogram.length}`, + population: histogram[i], + }); + } + //console.log('accum', accum) + return accum; +}; + +const formatter = (value: any, name: any, props: any) => { + if (props.payload.name === 'longtail') { + return [value, name]; + } + else { + return [value, props.payload.name]; + } +}; + + +export function FloatingTooltip({ items, x, y }: any) { + const offset = 30; + const renderedItems = items.map((name: [string, number], value: number | string) => { + + const [realName, realValue] = name; + const formattedVal = realValue == 0 ? "<1" : realValue; + return ( + +
    {realName}
    +
    {formattedVal}%
    +
    + ); + }); + return createPortal( +
    +
    {renderedItems}
    +
    , + document.body + ); +} + +export const ToolTipAdapter = (args: any) => { + const { active, formatter, payload, label } = args; + console.log('label', label); + //console.log("args", args, formatter); + //console.log("coordinate, box", args.coordinate, args.box); + //console.log("payload", payload) + //const anchor = useRef(null); + + if (active && payload && payload.length) { + const renderContent2 = () => { + //const items = (itemSorter ? _.sortBy(payload, itemSorter) : payload).map((entry, i) => { + const items = payload.map((entry: any, i: number) => { + if (entry.type === 'none') { + return null; + } + + const finalFormatter = entry.formatter || formatter || defaultFormatter; + const { value, name } = entry; + let finalValue: React.ReactNode = value; + let finalName: React.ReactNode = name; + if (finalFormatter && finalValue != null && finalName != null) { + const formatted = finalFormatter(value, name, entry, i, payload); + if (Array.isArray(formatted)) { + [finalValue, finalName] = formatted; + } else { + finalValue = formatted; + } + } + + return [finalName, finalValue]; + }); + return items; + }; + /* +

    {`${label} : ${payload[0].value}`}

    +

    {label}

    +

    Anything you want can be displayed here.

    + + + */ + return ( +
    + +
    + ); + } + + return null; +}; + +//export const HistogramCell = ({histogram}: {histogram:any}) => { +export const HistogramCell = (props: any) => { + if (props == undefined || props.value == undefined) { + return ; + } + const histogram = props.value.histogram; + return ( +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + offset={20} + allowEscapeViewBox={{ x: true }} + /> + +
    + ); +}; diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 3767ee15d..b12d3d407 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -13,7 +13,6 @@ export type CommandConfigSetterT = ( setter: Dispatch> ) => void; - /* Widget DCFCell is meant to be used with callback functions and passed values, not explicit http calls */ @@ -25,7 +24,7 @@ export function WidgetDCFCell({ commandConfig, dfConfig, on_dfConfig, - summaryDf + summaryDf, }: { origDf: DFWhole; operations: Operation[]; @@ -34,11 +33,11 @@ export function WidgetDCFCell({ commandConfig: CommandConfigT; dfConfig: DfConfig; on_dfConfig: unknown; - summaryDf: DFWhole + summaryDf: DFWhole; }) { const [activeCol, setActiveCol] = useState('stoptime'); - const widgetConfig: WidgetConfig = {showCommands:dfConfig.showCommands} - const localDfConfig = {...dfConfig, 'rowsShown': origDf.data.length || 0} + const widgetConfig: WidgetConfig = { showCommands: dfConfig.showCommands }; + const localDfConfig = { ...dfConfig, rowsShown: origDf.data.length || 0 }; return (
    - {(widgetConfig.showCommands) ? ( - ) : } + {widgetConfig.showCommands ? ( + + ) : ( + + )}
    ); } @@ -90,7 +92,7 @@ export function WidgetDCFCellExample() { commandConfig={bakedCommandConfig} dfConfig={sampleConfig} on_dfConfig={setConfig} - summaryDf={tableDf} + summaryDf={tableDf} /> ); } diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx index 7d5a585fe..30a756d0b 100644 --- a/js/components/DFViewer.tsx +++ b/js/components/DFViewer.tsx @@ -1,14 +1,16 @@ import React, { useRef, CSSProperties, + // useMemo, } from 'react'; import _ from 'lodash'; import { DFWhole, EmptyDf } from './staticData'; + import { updateAtMatch, dfToAgrid } from './gridUtils'; import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component -import { - GridOptions, -} from 'ag-grid-community'; +import { GridOptions } from 'ag-grid-community'; + +import { HistogramCell } from './CustomHeader'; export type setColumFunc = (newCol: string) => void; @@ -44,7 +46,21 @@ export function DFViewer( rowSelection: 'single', onRowClicked: (event) => console.log('A row was clicked'), defaultColDef: { - sortable:true, type: 'rightAligned' + sortable: true, + type: 'rightAligned', + cellRendererSelector: (params) => { + if (params.node.rowPinned) { + return { + component: HistogramCell, + params: { + style: { fontStyle: 'italic' }, + }, + }; + } else { + // rows that are not pinned don't use any cell renderer + return undefined; + } + }, }, onCellClicked: (event) => { @@ -132,6 +148,19 @@ export function DFViewer( }; makeCondtionalAutosize(50, 350); + //const histograms = _.fromPairs( _.map({'a':10, 'b':20}, function(val,key) {return [y, x] })) + // const histograms = _.fromPairs( _.map(df.table_hints, + // function(val,key) { + // return [key, val.histogram || []] })) + const pinnedTopRowData = [df.table_hints]; + //const pinnedTopRowData = [histograms]; + // const pinnedTopRowData = [{'index': 'foo', + // 'end station name': 'bar', + // 'tripduration': 471, + // 'start station name': 'Catherine St & Monroe St', + // 'floatCol': '1.111', + // }]; + return (
    diff --git a/js/components/OperationDetail.tsx b/js/components/OperationDetail.tsx index 8fb5de781..ee0e5cf9c 100644 --- a/js/components/OperationDetail.tsx +++ b/js/components/OperationDetail.tsx @@ -9,7 +9,6 @@ import { ActualArg, CommandArgSpec } from './CommandUtils'; import { objWithoutNull, replaceAtIdx, replaceAtKey } from './utils'; import React from 'react'; - export const OperationDetail = ({ command, setCommand, @@ -71,7 +70,7 @@ export const ArgGetters = ({ const makeArgGetter = (pattern: ActualArg) => { const idx = pattern[0]; const val = command[idx] as SettableArg; - const valSetter = (newVal:unknown) => { + const valSetter = (newVal: unknown) => { const newCommand = replaceAtIdx(command, idx, newVal); //console.log('newCommand', newCommand); setCommand(newCommand as Operation); @@ -108,8 +107,9 @@ const ArgGetter = ({ }) => { const [_argPos, label, argType, lastArg] = argProps; - const defaultShim = (event: { target: { value: SettableArg; }; }) => setter(event.target.value); - if (argType === 'enum' && _.isArray(lastArg)) { + const defaultShim = (event: { target: { value: SettableArg } }) => + setter(event.target.value); + if (argType === 'enum' && _.isArray(lastArg)) { return (
    @@ -124,7 +124,8 @@ const ArgGetter = ({ ); } else if (argType === 'type') { if (lastArg === 'integer') { - const valSetterShim = (event: { target: { value: string; }; }) => setter(parseInt(event.target.value)); + const valSetterShim = (event: { target: { value: string } }) => + setter(parseInt(event.target.value)); return (
    @@ -146,7 +147,7 @@ const ArgGetter = ({ } } else if (argType === 'colEnum') { const widgetRow = columns.map((colName: string) => { - const colSetter = (event: { target: { value: any; }; }) => { + const colSetter = (event: { target: { value: any } }) => { const newColVal = event.target.value; if (_.isString(newColVal)) { const updatedColDict = replaceAtKey( @@ -158,9 +159,8 @@ const ArgGetter = ({ } }; const colVal = _.get(val, colName, 'null'); - if(!_.isArray(lastArg)) { - - return

    arg error

    + if (!_.isArray(lastArg)) { + return

    arg error

    ; } return ( diff --git a/js/components/OperationUtils.ts b/js/components/OperationUtils.ts index 239c25458..4a2969f14 100644 --- a/js/components/OperationUtils.ts +++ b/js/components/OperationUtils.ts @@ -5,7 +5,6 @@ export const sym = (symbolName: string) => { return { symbol: symbolName }; }; - export type Atom = number | string | SymbolT | ColEnumArgs; export type SettableArg = number | string | ColEnumArgs; diff --git a/js/components/Operations.tsx b/js/components/Operations.tsx index 58c5ce248..7be4e3a02 100644 --- a/js/components/Operations.tsx +++ b/js/components/Operations.tsx @@ -1,7 +1,4 @@ -import React, { - useState, - useEffect, -} from 'react'; +import React, { useState, useEffect } from 'react'; import _ from 'lodash'; import { Operation, @@ -82,7 +79,15 @@ export const OperationsList = ({ ); }; -export const OperationAdder = ({ column, addOperationCb, defaultArgs }:{ column:string, addOperationCb:any, defaultArgs:any } ): JSX.Element => { +export const OperationAdder = ({ + column, + addOperationCb, + defaultArgs, +}: { + column: string; + addOperationCb: any; + defaultArgs: any; +}): JSX.Element => { const addOperationByName = (localOperationName: string) => { return () => { const defaultOperation = defaultArgs[localOperationName]; diff --git a/js/components/RechartExtra.ts b/js/components/RechartExtra.ts new file mode 100644 index 000000000..d0a19f9ca --- /dev/null +++ b/js/components/RechartExtra.ts @@ -0,0 +1,68 @@ +import _ from 'lodash'; +import { CSSProperties, ReactNode } from 'react'; +export { Global, DefaultTooltipContent } from 'recharts'; + +//export Global; + +//import { AnimationDuration, AnimationTiming } from '../util/types'; +/** The type of easing function to use for animations */ +export type AnimationTiming = + | 'ease' + | 'ease-in' + | 'ease-out' + | 'ease-in-out' + | 'linear'; +/** Specifies the duration of animation, the unit of this option is ms. */ +export type AnimationDuration = number; + +export type TooltipType = 'none'; +export type ValueType = number | string | Array; +export type NameType = number | string; + +export type Formatter = ( + value: TValue, + name: TName, + item: Payload, + index: number, + payload: Array> +) => [React.ReactNode, TName] | React.ReactNode; + +export interface Payload { + type?: TooltipType; + color?: string; + formatter?: Formatter; + name?: TName; + value?: TValue; + unit?: ReactNode; + dataKey?: string | number; + payload?: any; + chartType?: string; + stroke?: string; + strokeDasharray?: string | number; + strokeWidth?: number | string; +} + +export interface DefaultProps< + TValue extends ValueType, + TName extends NameType +> { + separator?: string; + wrapperClassName?: string; + labelClassName?: string; + formatter?: Formatter; + contentStyle?: CSSProperties; + itemStyle?: CSSProperties; + labelStyle?: CSSProperties; + labelFormatter?: ( + label: any, + payload: Array> + ) => ReactNode; + label?: any; + payload?: Array>; + itemSorter?: (item: Payload) => number | string; +} + +export const isNumber = (value: unknown): value is number => + _.isNumber(value) && !_.isNaN(value); +export const isNumOrStr = (value: unknown): value is number | string => + isNumber(value as number) || _.isString(value); diff --git a/js/components/RechartTooltip.tsx b/js/components/RechartTooltip.tsx new file mode 100644 index 000000000..bf4dc7f29 --- /dev/null +++ b/js/components/RechartTooltip.tsx @@ -0,0 +1,373 @@ +//@ts-nocheck +/** + * @fileOverview Tooltip + */ +import React, { + CSSProperties, + ReactNode, + ReactElement, + SVGProps, + useEffect, + useState, + useRef, + useCallback, +} from 'react'; +import { translateStyle } from 'react-smooth'; +import _ from 'lodash'; +//import classNames from 'classnames'; + +//import { DefaultTooltipContent, ValueType, NameType, Payload, Props as DefaultProps } from './DefaultTooltipContent'; + +import type { + ValueType, + NameType, + Payload, + DefaultProps, +} from './RechartExtra'; +//import { Global } from '../util/Global'; +//import { isNumber } from '../util/DataUtils'; +import { Global, isNumber } from './RechartExtra'; + +//import { AnimationDuration, AnimationTiming } from '../util/types'; +import { AnimationDuration, AnimationTiming } from './RechartExtra'; + +import { DefaultTooltipContent } from 'recharts'; + +const CLS_PREFIX = 'recharts-tooltip-wrapper'; + +const EPS = 1; + +export type ContentType = + | ReactElement + | ((props: TooltipProps) => ReactNode); + +type UniqueFunc = ( + entry: Payload +) => unknown; +type UniqueOption = + | boolean + | UniqueFunc; +function defaultUniqBy( + entry: Payload +) { + return entry.dataKey; +} +function getUniqPayload( + option: UniqueOption, + payload: Array> +) { + if (option === true) { + //@ts-ignore + return _.uniqBy(payload, defaultUniqBy); + } + + if (_.isFunction(option)) { + return _.uniqBy(payload, option); + } + + return payload; +} + +function renderContent( + content: ContentType, + props: TooltipProps +) { + if (React.isValidElement(content)) { + return React.cloneElement(content, props); + } + if (_.isFunction(content)) { + return React.createElement(content as any, props); + } + + return ; +} + +export type OptionalCoords = { + x?: number; + y?: number; +}; + +export type TooltipProps< + TValue extends ValueType, + TName extends NameType +> = DefaultProps & { + allowEscapeViewBox?: { + x?: boolean; + y?: boolean; + }; + reverseDirection?: { + x?: boolean; + y?: boolean; + }; + content?: ContentType; + viewBox?: { + x?: number; + y?: number; + width?: number; + height?: number; + }; + active?: boolean; + offset?: number; + wrapperStyle?: CSSProperties; + cursor?: boolean | ReactElement | SVGProps; + coordinate?: OptionalCoords; + position?: OptionalCoords; + trigger?: 'hover' | 'click'; + shared?: boolean; + payloadUniqBy?: UniqueOption; + isAnimationActive?: boolean; + animationDuration?: AnimationDuration; + animationEasing?: AnimationTiming; + filterNull?: boolean; + useTranslate3d?: boolean; + box?: OptionalCoords; +}; + +const tooltipDefaultProps: TooltipProps = { + active: false, + allowEscapeViewBox: { x: false, y: false }, + reverseDirection: { x: false, y: false }, + offset: 10, + viewBox: { x: 0, y: 0, height: 0, width: 0 }, + coordinate: { x: 0, y: 0 }, + // this doesn't exist on TooltipProps + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + cursorStyle: {}, + separator: ' : ', + wrapperStyle: {}, + contentStyle: {}, + itemStyle: {}, + labelStyle: {}, + cursor: true, + trigger: 'hover', + isAnimationActive: !Global.isSsr, + animationEasing: 'ease', + animationDuration: 400, + filterNull: true, + useTranslate3d: false, + box: { x: 0, y: 0 }, +}; + +export const Tooltip = ( + props: TooltipProps & { children?: React.ReactNode } +) => { + const [boxWidth, setBoxWidth] = useState(-1); + const [boxHeight, setBoxHeight] = useState(-1); + const [dismissed, setDismissed] = useState(false); + const [dismissedAtCoordinate, setDismissedAtCoordinate] = useState({ + x: 0, + y: 0, + }); + const [boxCoords, setBoxCoords] = useState({ x: 0, y: 0 }); + + const wrapperNode = useRef(); + const { + allowEscapeViewBox, + reverseDirection, + coordinate, + offset, + position, + viewBox, + } = props; + + const handleKeyDown = useCallback( + (event: KeyboardEvent) => { + if (event.key === 'Escape') { + setDismissed(true); + setDismissedAtCoordinate((prev) => ({ + ...prev, + x: coordinate?.x, + y: coordinate?.y, + })); + } + }, + [coordinate?.x, coordinate?.y] + ); + + useEffect(() => { + const updateBBox = () => { + if (dismissed) { + document.removeEventListener('keydown', handleKeyDown); + if ( + coordinate?.x !== dismissedAtCoordinate.x || + coordinate?.y !== dismissedAtCoordinate.y + ) { + setDismissed(false); + } + } else { + document.addEventListener('keydown', handleKeyDown); + } + + if (wrapperNode.current && wrapperNode.current.getBoundingClientRect) { + const box = wrapperNode.current.getBoundingClientRect(); + setBoxCoords({ x: box.x, y: box.y }); + if ( + Math.abs(box.width - boxWidth) > EPS || + Math.abs(box.height - boxHeight) > EPS + ) { + setBoxWidth(box.width); + setBoxHeight(box.height); + } + } else if (boxWidth !== -1 || boxHeight !== -1) { + setBoxWidth(-1); + setBoxHeight(-1); + } + }; + + updateBBox(); + + return () => { + document.removeEventListener('keydown', handleKeyDown); + }; + }, [ + boxHeight, + boxWidth, + coordinate, + dismissed, + dismissedAtCoordinate.x, + dismissedAtCoordinate.y, + handleKeyDown, + ]); + + const getTranslate = ({ + key, + tooltipDimension, + viewBoxDimension, + }: { + key: 'x' | 'y'; + tooltipDimension: number; + viewBoxDimension: number; + }) => { + if (position && isNumber(position[key])) { + return position[key]; + } + + const pCoordinate = coordinate || { x: 0, y: 0 }; + const negative = (pCoordinate[key] || 0) - tooltipDimension - (offset || 0); + const positive = (pCoordinate[key] || 0) + offset; + if (allowEscapeViewBox?.[key]) { + return reverseDirection[key] ? negative : positive; + } + + if (reverseDirection?.[key]) { + const tooltipBoundary = negative; + const viewBoxBoundary = viewBox[key]; + if (tooltipBoundary < viewBoxBoundary) { + return Math.max(positive, viewBox[key]); + } + return Math.max(negative, viewBox[key]); + } + const tooltipBoundary = positive + tooltipDimension; + const viewBoxBoundary = viewBox[key] + viewBoxDimension; + if (tooltipBoundary > viewBoxBoundary) { + return Math.max(negative, viewBox[key]); + } + return Math.max(positive, viewBox[key]); + }; + + const { + payload, + payloadUniqBy, + filterNull, + active, + wrapperStyle, + useTranslate3d, + isAnimationActive, + animationDuration, + animationEasing, + } = props; + const finalPayload = getUniqPayload( + payloadUniqBy, + filterNull && payload && payload.length + ? payload.filter((entry) => !_.isNil(entry.value)) + : payload + ); + const hasPayload = finalPayload && finalPayload.length; + const { content } = props; + let outerStyle: CSSProperties = { + pointerEvents: 'none', + visibility: !dismissed && active && hasPayload ? 'visible' : 'hidden', + position: 'absolute', + top: 0, + left: 0, + ...wrapperStyle, + }; + let translateX, translateY; + + if (position && isNumber(position.x) && isNumber(position.y)) { + translateX = position.x; + translateY = position.y; + } else if (boxWidth > 0 && boxHeight > 0 && coordinate) { + translateX = getTranslate({ + key: 'x', + tooltipDimension: boxWidth, + viewBoxDimension: viewBox.width, + }); + + translateY = getTranslate({ + key: 'y', + tooltipDimension: boxHeight, + viewBoxDimension: viewBox.height, + }); + } else { + outerStyle.visibility = 'hidden'; + } + + outerStyle = { + ...translateStyle({ + transform: useTranslate3d + ? `translate3d(${translateX}px, ${translateY}px, 0)` + : `translate(${translateX}px, ${translateY}px)`, + }), + ...outerStyle, + }; + + if (isAnimationActive && active) { + outerStyle = { + ...translateStyle({ + transition: `transform ${animationDuration}ms ${animationEasing}`, + }), + ...outerStyle, + }; + } + + // eslint-disable-next-line + // const cls = classNames(CLS_PREFIX, { + // [`${CLS_PREFIX}-right`]: isNumber(translateX) && coordinate && isNumber(coordinate.x) && translateX >= coordinate.x, + // [`${CLS_PREFIX}-left`]: isNumber(translateX) && coordinate && isNumber(coordinate.x) && translateX < coordinate.x, + // [`${CLS_PREFIX}-bottom`]: + // isNumber(translateY) && coordinate && isNumber(coordinate.y) && translateY >= coordinate.y, + // [`${CLS_PREFIX}-top`]: isNumber(translateY) && coordinate && isNumber(coordinate.y) && translateY < coordinate.y, + // }); + + const cls = `${CLS_PREFIX}-top`; + return ( + // ESLint is disabled to allow listening to the `Escape` key. Refer to + // https://github.com/recharts/recharts/pull/2925 + // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions +
    + {renderContent(content, { + ...props, + box: boxCoords, + payload: finalPayload, + })} +
    + ); +}; + +// needs to be set so that renderByOrder can find the correct handler function +Tooltip.displayName = 'Tooltip'; + +/** + * needs to be set so that renderByOrder can access an have default values for + * children.props when there are no props set by the consumer + * doesn't work if using default parameters + */ +Tooltip.defaultProps = tooltipDefaultProps; diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 991f17fb8..fdce74317 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -1,13 +1,8 @@ -import React, { - useState, - useRef, -} from 'react'; +// https://plnkr.co/edit/QTNwBb2VEn81lf4t?open=index.tsx +import React, { useState, useRef } from 'react'; import _ from 'lodash'; import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component -import { - ColDef, - GridOptions, -} from 'ag-grid-community'; +import { ColDef, GridOptions } from 'ag-grid-community'; import { intFormatter } from './gridUtils'; export type setColumFunc = (newCol: string) => void; @@ -18,48 +13,61 @@ export interface DfConfig { sampleSize: number; sampled: boolean; summaryStats: boolean; - showCommands:boolean; + showCommands: boolean; //reorderdColumns: boolean; } - const columnDefs: ColDef[] = [ - { field: 'summaryStats', - headerName:'Σ', - headerTooltip:'Summary Stats', - width:30 + { + field: 'summaryStats', + headerName: 'Σ', + headerTooltip: 'Summary Stats', + width: 30, + }, + // { field: 'reorderdColumns', + // headerName: "Θ", + // headerTooltip:"Reorder Columns", + // width:30 + // }, + { + field: 'showCommands', + headerName: 'λ', + headerTooltip: 'Show Commands', + width: 30, }, -// { field: 'reorderdColumns', -// headerName: "Θ", -// headerTooltip:"Reorder Columns", -// width:30 -// }, - { field: 'showCommands', - headerName: "λ", - headerTooltip:"Show Commands", - width:30 -}, - { field: 'sampled', - headerName: "Ξ", - headerTooltip:"Sampled", - width:30 -}, - { field: 'help', - headerName: "?", - headerTooltip:"Help", - width:30, - cellRenderer: function(params:any) { - return ?} -}, + { field: 'sampled', headerName: 'Ξ', headerTooltip: 'Sampled', width: 30 }, + { + field: 'help', + headerName: '?', + headerTooltip: 'Help', + width: 30, + cellRenderer: function (params: any) { + return ( + + ? + + ); + }, + }, - { field: 'totalRows', width:100}, - { field: 'columns', width:100 }, - { field: 'rowsShown', width:120}, - { field: 'sampleSize', width:120 } + { field: 'totalRows', width: 100 }, + { field: 'columns', width: 100 }, + { field: 'rowsShown', width: 120 }, + { field: 'sampleSize', width: 120 }, ]; -export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) { +export function StatusBar({ + config, + setConfig, +}: { + config: any; + setConfig: any; +}) { const { totalRows, columns, @@ -75,28 +83,26 @@ export function StatusBar({ config, setConfig }: { config:any, setConfig:any }) { totalRows: intFormatter.format(totalRows), columns, - rowsShown : intFormatter.format(rowsShown), - sampleSize : intFormatter.format(sampleSize), - sampled: sampled ? "1" : "0", - summaryStats: summaryStats ? "1" : "0", + rowsShown: intFormatter.format(rowsShown), + sampleSize: intFormatter.format(sampleSize), + sampled: sampled ? '1' : '0', + summaryStats: summaryStats ? '1' : '0', // reorderdColumns: reorderdColumns ? "Ϋ" : "ό", - showCommands: showCommands ? "1" : "0" + showCommands: showCommands ? '1' : '0', }, ]; - const updateDict = (event:any) => { + const updateDict = (event: any) => { const colName = event.column.getColId(); if (colName === 'summaryStats') { setConfig({ ...config, summaryStats: !config.summaryStats }); - } - else if (colName === 'sampled') { + } else if (colName === 'sampled') { setConfig({ ...config, sampled: !config.sampled }); } else if (colName === 'showCommands') { setConfig({ ...config, showCommands: !config.showCommands }); } // } else if (colName === 'reorderdColumns') { // setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); - }; const gridOptions: GridOptions = { rowSelection: 'single', diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index ea26f34d8..b2ae809d5 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -1,4 +1,8 @@ -import { ColDef, ValueFormatterFunc, ValueFormatterParams } from 'ag-grid-community'; +import { + ColDef, + ValueFormatterFunc, + ValueFormatterParams, +} from 'ag-grid-community'; import { DFWhole, DFColumn, ColumnHint } from './staticData'; import _ from 'lodash'; export const updateAtMatch = ( @@ -17,33 +21,37 @@ export const updateAtMatch = ( return retColumns; }; -export const intFormatter = new Intl.NumberFormat( - 'en-US', { minimumFractionDigits:0, maximumFractionDigits: 3 }); +export const intFormatter = new Intl.NumberFormat('en-US', { + minimumFractionDigits: 0, + maximumFractionDigits: 3, +}); -const floatFormatter = new Intl.NumberFormat('en-US', { minimumFractionDigits:3, maximumFractionDigits: 3 }); +const floatFormatter = new Intl.NumberFormat('en-US', { + minimumFractionDigits: 3, + maximumFractionDigits: 3, +}); -export const anyFormatter = (params: ValueFormatterParams):string => { +export const anyFormatter = (params: ValueFormatterParams): string => { const val = params.value; try { - const num = Number(val) + const num = Number(val); if (val === null) { - return ""; + return ''; } else if (val === undefined) { - return ""; - } - else if (Number.isFinite(num)) { + return ''; + } else if (Number.isFinite(num)) { if (Number.isInteger(num)) { - const formatted = intFormatter.format(num) - return `${formatted} ` + const formatted = intFormatter.format(num); + return `${formatted} `; } else { - return floatFormatter.format(num) + return floatFormatter.format(num); } } - } catch (e:any) { + } catch (e: any) { //console.log("formatting error", val, e); } - return val -} + return val; +}; /* console.log((new Intl.NumberFormat('en-US')).format(amount)) console.log((new Intl.NumberFormat('en-US', { maximumFractionDigits: 1})).format(number)) @@ -57,7 +65,7 @@ export const anyFormatter = (params: ValueFormatterParams):string => { return '£' + formatNumber(params.value); } */ -function getFormatter(hint: ColumnHint): ValueFormatterFunc { +function getFormatter(hint: ColumnHint): ValueFormatterFunc { if (hint === undefined || hint.is_numeric === false) { return anyFormatter; } else { @@ -65,8 +73,8 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { if (hint.is_integer) { const totalWidth = commas + hint.max_digits; - return (params: ValueFormatterParams):string => { - console.log("params", params) + return (params: ValueFormatterParams): string => { + console.log('params', params); const formatter = new Intl.NumberFormat('en-US'); return formatter.format(params.value).padStart(totalWidth, ' '); @@ -88,12 +96,11 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { return numFormatted.padStart(intWidth, " ").padEnd(intWidth + fracWidth, " ") } };*/ - return (params: ValueFormatterParams):string => { + return (params: ValueFormatterParams): string => { //console.log("params", params) return floatFormatter.format(params.value); }; - } } } @@ -102,13 +109,18 @@ export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { const fields = tdf.schema.fields; //console.log("tdf", tdf); //console.log("hints", tdf.table_hints); - const retColumns:ColDef[] = fields.map((f: DFColumn) => { + const retColumns: ColDef[] = fields.map((f: DFColumn) => { //console.log(f.name, tdf.table_hints[f.name]) - const colDef:ColDef = {field: f.name, valueFormatter:getFormatter(_.get(tdf.table_hints,f.name, { is_numeric:false})) } + const colDef: ColDef = { + field: f.name, + valueFormatter: getFormatter( + _.get(tdf.table_hints, f.name, { is_numeric: false }) + ), + }; if (f.name === 'index') { colDef.pinned = 'left'; } - return colDef; + return colDef; }); return [retColumns, tdf.data]; } diff --git a/js/components/staticData.ts b/js/components/staticData.ts index 1c0418f18..26822d076 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -30,48 +30,151 @@ const origRows = [ ]; */ export interface DFColumn { - name: string; type:string; + name: string; + type: string; } export type DFDataRow = Record; export type DFData = DFDataRow[]; export interface ColumnObjHint { - is_numeric:false; + is_numeric: false; + histogram?: any[]; } export interface ColumnNumHint { - is_numeric:true; - is_integer:boolean; - min_digits:number; - max_digits:number; - histogram:number[][]; + is_numeric: true; + is_integer: boolean; + min_digits: number; + max_digits: number; + histogram: any[]; } -export type ColumnHint = ColumnObjHint | ColumnNumHint +export type ColumnHint = ColumnObjHint | ColumnNumHint; export interface DFWhole { schema: { fields: DFColumn[]; primaryKey: string[]; //['index'] pandas_version: string; //'1.4.0', - - }; - table_hints:Record; + table_hints: Record; data: DFData; } export const EmptyDf: DFWhole = { - schema: { fields: [], primaryKey:[], pandas_version:"" }, - table_hints:{}, + schema: { fields: [], primaryKey: [], pandas_version: '' }, + table_hints: {}, data: [], }; //print(sdf.to_json(orient='table', indent=2)) -//export const tableDf2:DFWhole = { -export const foo:DFWhole = { +export const histograms = { + num_histo : [ + {'name': '-406 - -332', 'population': 1}, + {'name': '-332 - -258', 'population': 0}, + {'name': '-258 - -184', 'population': 2}, + {'name': '-184 - -111', 'population': 10}, + {'name': '-111 - -37', 'population': 22}, + {'name': '-37 - 36', 'population': 30}, + {'name': '36 - 109', 'population': 22}, + {'name': '109 - 183', 'population': 10}, + {'name': '183 - 257', 'population': 3}, + {'name': '257 - 331', 'population': 0}], + + bool_histo : [ + {'name': 'False', 'false': 50}, + {'name': 'True', 'true': 30}, + {'name': 'NA', 'NA': 20}], + + NA_Only : [ + {'name': 'NA', 'NA': 100}], + + simple_catgeorical : [ + {'name': 2, 'cat_pop': 87.0}, + {'name': 1, 'cat_pop': 13.0}], + + categorical_histo : [ + {'name': 'KTM', 'cat_pop': 30}, + {'name': 'Gas Gas', 'cat_pop': 15}, + {'name': 'Yamaha', 'cat_pop': 10}, + {'name': 'unique', 'unique': 25}, + {'name': 'NA', 'NA': 20} + ], + + categorical_histo_lt : [ + {'name': 'KTM', 'cat_pop': 25}, + {'name': 'Gas Gas', 'cat_pop': 12}, + {'name': 'Yamaha', 'cat_pop': 8}, + {'name': 'NA', 'NA': 20}, + {'name': 'longtail', 'unique': 15, 'longtail':20}, + ], + + all_unique : [ + {'name': 'unique', 'unique': 100}, + ], + + unique_na : [ + {'name': 'unique', 'unique': 80}, + {'name': 'NA', 'NA': 20} + ], + unique_continuous : [ + {'name': '-406 -332', 'population': 1}, + {'name': '-332 -258', 'population': 0}, + {'name': '-258 -184', 'population': 0}, + {'name': '-184 -111', 'population': 10}, + {'name': '-111 -37', 'population': 21}, + {'name': '-37 36', 'population': 29}, + {'name': '36 109', 'population': 22}, + {'name': '109 183', 'population': 9}, + {'name': '183 257', 'population': 3}, + {'name': '257 331', 'population': 0}, + {'name': 'unique', 'unique': 100}, + ], + + unique_continuous_scaled : [ + {'name': '-406 -332', 'population': 0}, + {'name': '-332 -258', 'population': 0}, + {'name': '-258 -184', 'population': 0}, + {'name': '-184 -111', 'population': 10}, + {'name': '-111 -37', 'population': 21}, + {'name': '-37 36', 'population': 29}, + {'name': '36 109', 'population': 22}, + {'name': '109 183', 'population': 9}, + {'name': '183 257', 'population': 3}, + {'name': '257 331', 'population': 0}, + {'name': 'unique', 'unique': 29}, + ], + + unique_continuous_scaled_50 : [ + {'name': '-406 -332', 'population': 0}, + {'name': '-332 -258', 'population': 0}, + {'name': '-258 -184', 'population': 0}, + {'name': '-184 -111', 'population': 10}, + {'name': '-111 -37', 'population': 21}, + {'name': '-37 36', 'population': 29}, + {'name': '36 109', 'population': 22}, + {'name': '109 183', 'population': 9}, + {'name': '183 257', 'population': 3}, + {'name': '257 331', 'population': 0}, + {'name': 'longtail', 'unique': 15}, + ], + start_station_categorical : [{'name': 'Pershing Square N', 'cat_pop': 1}, + {'name': '8 Ave & W 31 St', 'cat_pop': 1}, + {'name': 'Lafayette St & E 8 St', 'cat_pop': 1}, + {'name': 'W 21 St & 6 Ave', 'cat_pop': 1}, + {'name': 'E 17 St & Broadway', 'cat_pop': 1}, + {'name': '8 Ave & W 33 St', 'cat_pop': 1}, + {'name': 'E 43 St & Vanderbilt Ave', 'cat_pop': 1}, + {'name': 'unique', 'cat_pop': 0}, + {'name': 'long_tail', 'cat_pop': 92}, + {'name': 'NA', 'cat_pop': 0}] + +}; + +//export const tableDf2:DFWhole = { +export const foo: DFWhole = { schema: { fields: [ { name: 'index', type: 'integer' }, @@ -89,16 +192,18 @@ export const foo:DFWhole = { primaryKey: ['index'], pandas_version: '1.4.0', }, - table_hints: { 'index': { is_numeric:false}, - 'tripduration': { is_numeric:false}, - 'starttime': { is_numeric:false}, - 'stoptime': { is_numeric:false}, - 'start station id': { is_numeric:false}, - 'start station name': { is_numeric:false}, - 'start station latitude': { is_numeric:false}, - 'bikeid': { is_numeric:false}, - 'birth year': { is_numeric:false}, - 'gender': { is_numeric:false}}, + table_hints: { + index: { is_numeric: false }, + tripduration: { is_numeric: false, histogram:histograms.num_histo}, + starttime: { is_numeric: false }, + stoptime: { is_numeric: false }, + 'start station id': { is_numeric: false }, + 'start station name': { is_numeric: false }, + 'start station latitude': { is_numeric: false }, + bikeid: { is_numeric: false }, + 'birth year': { is_numeric: false }, + gender: { is_numeric: false }, + }, data: [ { index: 0, @@ -164,63 +269,81 @@ export const foo:DFWhole = { }; export const tableDf: DFWhole = { - 'schema': {'fields': [ - {'name': 'index', 'type': 'integer'}, - {'name': 'end station name', 'type': 'string'}, - {'name': 'tripduration', 'type': 'integer'}, - {'name': 'start station name', 'type': 'string'}, - {'name': 'floatCol', 'type': 'float'} + schema: { + fields: [ + { name: 'index', type: 'integer' }, + { name: 'end station name', type: 'string' }, + { name: 'tripduration', type: 'integer' }, + { name: 'start station name', type: 'string' }, + { name: 'floatCol', type: 'float' }, + ], + primaryKey: ['index'], + pandas_version: '1.4.0', + }, + data: [ + { + index: 0, + 'end station name': 'Elizabeth St & Hester St', + tripduration: 471, + 'start station name': 'Catherine St & Monroe St', + floatCol: '1.111', + }, + { + index: 1, + 'end station name': 'South St & Whitehall St', + tripduration: 1494, + 'start station name': '1 Ave & E 30 St', + floatCol: '8.888', + }, + { + index: 2, + 'end station name': 'E 59 St & Sutton Pl', + tripduration: 464, + 'start station name': 'E 48 St & 3 Ave', + floatCol: '9.999', + }, + { + index: 3, + 'end station name': 'E 33 St & 5 Ave', + tripduration: 373, + 'start station name': 'Pershing Square N', + floatCol: '-10.1', + }, + { + index: 4, + 'end station name': 'Hancock St & Bedford Ave', + tripduration: 660, + 'start station name': 'Atlantic Ave & Fort Greene Pl', + floatCol: '10.99', + }, ], - 'primaryKey': ['index'], - 'pandas_version': '1.4.0'}, - 'data': [{'index': 0, - 'end station name': 'Elizabeth St & Hester St', - 'tripduration': 471, - 'start station name': 'Catherine St & Monroe St', - 'floatCol': '1.111', - } - - , - {'index': 1, - 'end station name': 'South St & Whitehall St', - 'tripduration': 1494, - 'start station name': '1 Ave & E 30 St', - 'floatCol': '8.888' - }, - {'index': 2, - 'end station name': 'E 59 St & Sutton Pl', - 'tripduration': 464, - 'start station name': 'E 48 St & 3 Ave', - 'floatCol': '9.999' - }, - {'index': 3, - 'end station name': 'E 33 St & 5 Ave', - 'tripduration': 373, - 'start station name': 'Pershing Square N', - 'floatCol': '-10.1' - }, - {'index': 4, - 'end station name': 'Hancock St & Bedford Ave', - 'tripduration': 660, - 'start station name': 'Atlantic Ave & Fort Greene Pl', - 'floatCol': '10.99' - }], - 'table_hints': - { - 'end station name': {'is_numeric': false}, - 'tripduration': {'is_numeric': true, - 'is_integer': true, - 'min_digits': 3, - 'max_digits': 4, - 'histogram': [[0.6, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2], - [373.0, 485.1, 597.2, 709.3, 821.4, 933.5, 1045.6, - 1157.7, 1269.8, 1381.9, 1494.0]]}, - 'start station name': {'is_numeric': false}, - 'floatCol': {'is_numeric': true, - 'is_integer': false, - 'min_digits': 1, - 'max_digits': 3, - 'histogram': [[0.6, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2], - [373.0, 485.1, 597.2, 709.3, 821.4, 933.5, 1045.6, - 1157.7, 1269.8, 1381.9, 1494.0]]}, - }} + table_hints: { + 'end station name': { is_numeric: false, histogram: histograms.categorical_histo_lt }, + tripduration: { + is_numeric: true, + is_integer: true, + min_digits: 3, + max_digits: 4, + histogram:histograms.num_histo + }, + 'start station name': { is_numeric: false, histogram: histograms.bool_histo }, + floatCol: { + is_numeric: true, + is_integer: false, + min_digits: 1, + max_digits: 3, + histogram: [ + { name: 521, cat_pop: 0.0103 }, + { name: 358, cat_pop: 0.0096 }, + { name: 519, cat_pop: 0.009 }, + { name: 497, cat_pop: 0.0087 }, + { name: 293, cat_pop: 0.0082 }, + { name: 285, cat_pop: 0.0081 }, + { name: 435, cat_pop: 0.008 }, + { name: 'unique', cat_pop: 0.0001 }, + { name: 'long_tail', cat_pop: 0.938 }, + { name: 'NA', cat_pop: 0.0 }, + ], + }, + }, +}; diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 5d8f19200..65f4ccf36 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -77,7 +77,7 @@ export class DCEFWidgetView extends DOMWidgetView { } return React.createElement(WidgetDCFCell, props); }; - console.log("widget el", this.el) + console.log('widget el', this.el); /* const el = this.el; diff --git a/js/style/dcf-npm.css b/js/style/dcf-npm.css index cd62d846f..be5556c9f 100644 --- a/js/style/dcf-npm.css +++ b/js/style/dcf-npm.css @@ -163,6 +163,53 @@ div.dependent-tabs ul.tabs li.active { width:800px; border:3px dashed purple; + + + +} + +.custom-tooltip { + color:black; + background:green; +} + + +.histogram-component { + margin:0; + border-left:1px solid #68686e; + border-right:1px solid #68686e; + + +} + +.floating-tooltip { + color:black;; + background:white; } + +.floating-tooltip dl { + border:1px solid black; + padding:1px 4px; + margin:0; + display:flow-root; +} +.floating-tooltip dl dt { + font-weight:bold; + float:left; + margin:0; + padding:0; + +} +.floating-tooltip dl dd { + + float:left; + margin:0 0 0 10px; + clear:right; +} + + + /*# sourceMappingURL=dcf-npm.css.map */ + + diff --git a/package.json b/package.json index 4e7344bbd..96f6d06c6 100644 --- a/package.json +++ b/package.json @@ -1,174 +1,177 @@ { - "name": "buckaroo", - "version": "0.2.26", - "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", - "keywords": [ - "jupyter", - "jupyterlab", - "jupyterlab-extension", - "widgets" - ], - "files": [ - "lib/**/*.js", - "lib/**/*.js.map", - "lib/**/*.ts", - "dist/*.js", - "dist/*.js.map", - "dist/*.png", - "style/**/*.*" - ], - "homepage": "https://github.com/paddymul/buckaroo", - "bugs": { - "url": "https://github.com/paddymul/buckaroo/issues" - }, - "license": "BSD-3-Clause", - "author": { - "name": "Paddy Mullen", - "email": "" - }, - "main": "lib/index.js", - "types": "./lib/index.d.ts", - "repository": { - "type": "git", - "url": "https://github.com/paddymul/buckaroo" - }, - "scripts": { - "build": "npm run build:lib && npm run build:nbextension && npm run build:labextension", - "build-full": "npm run build:lib && run build:nbextension && npm run build:labextension", - "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev", - "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "which jupyter && jupyter labextension build --development True .", - "build:lib": "tsc", - "build:nbextension": "webpack --mode=production --no-devtool", - "build:widget-examples": "cd widget-examples/basic && webpack --mode=production", - "build:all": "npm run build:labextension && npm run build:nbextension && npm run build:widget-examples", - "clean": "rimraf dist && npm run clean:lib && npm run clean:labextension && npm run clean:nbextension", - "clean:lib": "rimraf lib", - "clean:labextension": "rimraf buckaroo/labextension", - "clean:nbextension": "rimraf buckaroo/nbextension/index.*", - "lint": "eslint 'js/**/*.{ts,tsx}'", - "lint:check": "eslint 'js/**/*.{ts,tsx}'", - "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", - "prepack": "npm run build:labextension && npm run build:nbextension", - "test": "jest --verbose --passWithNoTests", - "watch": "npm-run-all -p watch:*", - "watch:lib": "tsc -w", - "watch:nbextension": "webpack --watch", - "watch:labextension": "jupyter labextension watch .", - "dev": "webpack-cli serve --mode=development --env development --open" - }, - "dependencies": { - "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", - "@jupyterlab/apputils": "^3.0.2", - "ag-grid-community": "^29.2.0", - "ag-grid-react": "^29.2.0", - "lodash": "^4.17.21", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "devDependencies": { - "@babel/cli": "^7.6.3", - "@babel/core": "^7.6.3", - "@babel/preset-env": "^7.6.11", - "@babel/preset-typescript": "7.16.7", - "@jupyterlab/builder": "^3.0.1", - "@types/jest": "^28", - "@types/node": "^10.11.6", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "@types/webpack-dev-server": "^3.11.1", - "@types/webpack-env": "^1.13.6", - "@typescript-eslint/eslint-plugin": "^5.9.1", - "@typescript-eslint/parser": "^5.9.1", - "acorn": "^6.2.0", - "babel-jest": "^28", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "css-loader": "^5.0.0", - "eslint": "^8.6.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-hooks": "^4.3.0", - "fs-extra": "^7.0.0", - "html-loader": "^2.1.2", - "html-webpack-plugin": "^5.0.0", - "jest": "^28", - "lint-staged": "^10.2.11", - "markdown-loader": "^7.0.0", - "mkdirp": "^0.5.1", - "npm-run-all": "^4.1.3", - "prettier": "^2.6.2", - "prettier-standalone": "^1.3.1-0", - "prismjs": "^1.28.0", - "postcss": "^8.4.14", - "postcss-loader": "^7.0.1", - "postcss-preset-env": "^7.7.2", - "postcss-nested": "^6.0.0", - "sass": "^1.53.0", - "sass-loader": "^13.0.2", - "react-router": "^6.3.0", - "react-router-dom": "^5.2.0", - "rimraf": "^3.0.2", - "source-map-loader": "^0.2.4", - "style-loader": "^2.0.0", - "svg-url-loader": "^7.1.1", - "ts-jest": "^28.0.8", - "ts-loader": "^8.0.14", - "ts-node": "^9.1.1", - "tsconfig-paths-webpack-plugin": "^3.3.0", - "typescript": "^4.4.3", - "url-loader": "^4.1.0", - "webpack": "^5", - "webpack-cli": "^4.5.0", - "webpack-dev-server": "^4.0.0" - }, - "jupyterlab": { - "extension": "lib/plugin", - "webpackConfig": "webpack.lab.config.js", - "outputDir": "./buckaroo/labextension", - "sharedPackages": { - "@jupyter-widgets/base": { - "bundled": false, - "singleton": true - }, - "@lumino/algorithm": { - "bundled": false, - "singleton": true - }, - "@lumino/commands": { - "bundled": false, - "singleton": true - }, - "@lumino/coreutils": { - "bundled": false, - "singleton": true - }, - "@lumino/datagrid": { - "bundled": false, - "singleton": true - }, - "@lumino/default-theme": { - "bundled": false, - "singleton": true - }, - "@lumino/domutils": { - "bundled": false, - "singleton": true - }, - "@lumino/messaging": { - "bundled": false, - "singleton": true - }, - "@lumino/virtualdom": { - "bundled": false, - "singleton": true - }, - "@lumino/widgets": { - "bundled": false, - "singleton": true - }, - "react": false, - "react-dom": false - } + "name": "buckaroo", + "version": "0.2.27", + "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", + "keywords": [ + "jupyter", + "jupyterlab", + "jupyterlab-extension", + "widgets" + ], + "files": [ + "lib/**/*.js", + "lib/**/*.js.map", + "lib/**/*.ts", + "dist/*.js", + "dist/*.js.map", + "dist/*.png", + "style/**/*.*" + ], + "homepage": "https://github.com/paddymul/buckaroo", + "bugs": { + "url": "https://github.com/paddymul/buckaroo/issues" + }, + "license": "BSD-3-Clause", + "author": { + "name": "Paddy Mullen", + "email": "" + }, + "main": "lib/index.js", + "types": "./lib/index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/paddymul/buckaroo" + }, + "scripts": { + "build": "npm run build:lib && npm run build:nbextension && npm run build:labextension", + "build-full": "npm run build:lib && run build:nbextension && npm run build:labextension", + "build:dev": "npm run build:lib && npm run build:nbextension && npm run build:labextension:dev", + "build:labextension": "jupyter labextension build .", + "build:labextension:dev": "which jupyter && jupyter labextension build --development True .", + "build:lib": "tsc", + "build:nbextension": "webpack --mode=production --no-devtool", + "build:widget-examples": "cd widget-examples/basic && webpack --mode=production", + "build:all": "npm run build:labextension && npm run build:nbextension && npm run build:widget-examples", + "clean": "rimraf dist && npm run clean:lib && npm run clean:labextension && npm run clean:nbextension", + "clean:lib": "rimraf lib", + "clean:labextension": "rimraf buckaroo/labextension", + "clean:nbextension": "rimraf buckaroo/nbextension/index.*", + "lint": "eslint 'js/**/*.{ts,tsx}'", + "lint:check": "eslint 'js/**/*.{ts,tsx}'", + "lint:fix": "eslint 'js/**/*.{ts,tsx}' --fix", + "prepack": "npm run build:labextension && npm run build:nbextension", + "test": "jest --verbose --passWithNoTests", + "watch": "npm-run-all -p watch:*", + "watch:lib": "tsc -w", + "watch:nbextension": "webpack --watch", + "watch:labextension": "jupyter labextension watch .", + "dev": "webpack-cli serve --mode=development --env development --open" + }, + "dependencies": { + "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", + "@jupyterlab/apputils": "^3.0.2", + "ag-grid-community": "^29.2.0", + "ag-grid-react": "^29.2.0", + "lodash": "^4.17.21", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "react-smooth": "^2.0.3", + "recharts": "^2.7.3" + }, + "devDependencies": { + "@babel/cli": "^7.6.3", + "@babel/core": "^7.6.3", + "@babel/preset-env": "^7.6.11", + "@babel/preset-typescript": "7.16.7", + "@jupyterlab/builder": "^3.0.1", + "@types/jest": "^28", + "@types/node": "^10.11.6", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "@types/webpack-dev-server": "^3.11.1", + "@types/webpack-env": "^1.13.6", + "@typescript-eslint/eslint-plugin": "^5.9.1", + "@typescript-eslint/parser": "^5.9.1", + "acorn": "^6.2.0", + "babel-jest": "^28", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "bootstrap": "^5.1.3", + "css-loader": "^5.0.0", + "eslint": "^8.6.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-hooks": "^4.3.0", + "fs-extra": "^7.0.0", + "html-loader": "^2.1.2", + "html-webpack-plugin": "^5.0.0", + "jest": "^28", + "lint-staged": "^10.2.11", + "markdown-loader": "^7.0.0", + "mkdirp": "^0.5.1", + "npm-run-all": "^4.1.3", + "prettier": "^2.6.2", + "prettier-standalone": "^1.3.1-0", + "prismjs": "^1.28.0", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.1", + "postcss-preset-env": "^7.7.2", + "postcss-nested": "^6.0.0", + "sass": "^1.53.0", + "sass-loader": "^13.0.2", + "react-router": "^6.3.0", + "react-router-dom": "^5.2.0", + "rimraf": "^3.0.2", + "source-map-loader": "^0.2.4", + "style-loader": "^2.0.0", + "svg-url-loader": "^7.1.1", + "ts-jest": "^28.0.8", + "ts-loader": "^8.0.14", + "ts-node": "^9.1.1", + "tsconfig-paths-webpack-plugin": "^3.3.0", + "typescript": "^4.4.3", + "url-loader": "^4.1.0", + "webpack": "^5", + "webpack-cli": "^4.5.0", + "webpack-dev-server": "^4.0.0" + }, + "jupyterlab": { + "extension": "lib/plugin", + "webpackConfig": "webpack.lab.config.js", + "outputDir": "./buckaroo/labextension", + "sharedPackages": { + "@jupyter-widgets/base": { + "bundled": false, + "singleton": true + }, + "@lumino/algorithm": { + "bundled": false, + "singleton": true + }, + "@lumino/commands": { + "bundled": false, + "singleton": true + }, + "@lumino/coreutils": { + "bundled": false, + "singleton": true + }, + "@lumino/datagrid": { + "bundled": false, + "singleton": true + }, + "@lumino/default-theme": { + "bundled": false, + "singleton": true + }, + "@lumino/domutils": { + "bundled": false, + "singleton": true + }, + "@lumino/messaging": { + "bundled": false, + "singleton": true + }, + "@lumino/virtualdom": { + "bundled": false, + "singleton": true + }, + "@lumino/widgets": { + "bundled": false, + "singleton": true + }, + "react": false, + "react-dom": false } + } } diff --git a/pyproject.toml b/pyproject.toml index c614f8da4..0926b1cf4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.18" +version = "0.3.19" [project.license] file = "LICENSE.txt" diff --git a/tests/auto_clean_test.py b/tests/auto_clean_test.py new file mode 100644 index 000000000..a4c9c2a03 --- /dev/null +++ b/tests/auto_clean_test.py @@ -0,0 +1,130 @@ +import unittest +import pytest + +import pandas as pd +from buckaroo import auto_clean as ac +from pandas import NA as NA +from numpy import nan +from pandas.testing import assert_series_equal, assert_frame_equal + + +DATETIME_META = {'datetime': 0.75, 'datetime_error': 0.25, 'int': 0.25, 'int_error': 0.75, 'float': 0.25, 'float_error': 0.75, 'bool': 0, 'bool_error':1} + +INT_META = {'datetime': 0.0, 'datetime_error': 1.0, 'int': 0.75, 'int_error': 0.25, 'float': 0.75, 'float_error': 0.25, 'bool': 0.0, 'bool_error': 1.0} + +FLOAT_META = {'datetime': 0.0, 'datetime_error': 1.0, 'int': 0.25, 'int_error': 0.75, 'float': 0.75, 'float_error': 0.25, 'bool': 0.0, 'bool_error': 1.0} + +STRING_META = {'datetime': 0.0, 'datetime_error': 1.0, 'int': 0.0, 'int_error': 1.0, 'float': 0.25, 'float_error': 0.75, 'bool': 0.0, 'bool_error': 1.0} + +DATETIME_EDGECASE_META = {'datetime': 1.0, 'datetime_error': 1.0, 'int': 0.0, 'int_error': 1.0, 'float': 0.0, 'float_error': 1, 'bool': 0.0, 'bool_error': 1.0} + +BOOL_META = {'bool': .6, 'bool_error': 0.4, + 'datetime': 0.0, 'datetime_error': 1.0, + 'float': 0.6, 'float_error': 0.4, + 'int': 0.6, 'int_error': 0.4} + + +MIXED_NUMERIC_META = {'bool': 0.0, 'bool_error': 1.0, + 'datetime': 0.0, 'datetime_error': 1.0, + 'float': (2/3), 'float_error': (1/3), + 'int': (2/3), 'int_error': (1/3)} + +def assign_values(d, new_values): + d2 = d.copy() + d2.update(new_values) + return d2 + +DATETIME_DTYPE_META = assign_values(ac.default_type_dict, + {'general_type':'datetime', 'exact_type': 'datetime64[ns]'}) + +MIXED_EXACT = assign_values(ac.default_type_dict, {'exact_type': 'Int64', 'general_type': 'int', 'int':1}) + +ONLY_NANS_META = {'datetime': 0, 'datetime_error': 0, 'int': 0, 'int_error': 0, 'float': 0, 'float_error': 0, 'bool': 0, 'bool_error': 0} + +# WEIRD_INT = {'bool': 0.0, 'bool_error': 1.0, +# 'datetime': 0.0, 'datetime_error': 1.0, +# 'float': (2/3), 'float_error': (1/3), +# 'int': (2/3), 'int_error': (1/3)} + + +def test_get_typing_metadata(): + # assert WEIRD_INT == ac.get_typing_metadata(pd.Series([5, 2, 3.1, None, NA])) + assert INT_META == ac.get_typing_metadata(pd.Series(['181', '182', '183', 'a'])) + assert FLOAT_META == ac.get_typing_metadata(pd.Series(['181.1', '182.2', '183', 'a'])) + assert STRING_META == ac.get_typing_metadata(pd.Series(['181.1', 'b', 'c', 'a'])) + assert DATETIME_META == ac.get_typing_metadata(pd.Series(['1981-05-11', '1982-05-11', '1983', 'a'])) + assert DATETIME_EDGECASE_META == ac.get_typing_metadata(pd.Series(['00:01.6', '00:01.6', '00:01.6', None])) + assert DATETIME_DTYPE_META == ac.get_typing_metadata(pd.date_range('2010-01-01', '2010-01-31')) + + assert MIXED_EXACT == ac.get_typing_metadata(pd.Series([NA, 2, 3, NA, NA], dtype='Int64')) + assert MIXED_NUMERIC_META == ac.get_typing_metadata(pd.Series(['a', 2.0, 3.0, None, NA])) + + #there are still problems here, the code isn't properly distinguishing bools from ints and bools + assert BOOL_META == ac.get_typing_metadata(pd.Series(['a', 'b', False, True, False])) + + #only nans + assert ac.get_typing_metadata(pd.Series([None])) == ONLY_NANS_META + assert ac.get_typing_metadata(pd.Series([NA, NA])) == ONLY_NANS_META + assert ac.get_typing_metadata(pd.Series([])) == ONLY_NANS_META + assert ac.get_typing_metadata(pd.Series([nan, NA])) == ONLY_NANS_META + #assert ac.get_typing_metadata(pd.Series([nan, nan])) == ONLY_NANS_META + +def test_recommend_type(): + assert ac.recommend_type(DATETIME_META) == 'datetime' + assert ac.recommend_type(INT_META) == 'int' + assert ac.recommend_type(FLOAT_META) == 'float' + assert ac.recommend_type(STRING_META) == 'string' + assert ac.recommend_type(DATETIME_DTYPE_META) == 'datetime' + + WEIRD_INT_SER = pd.Series(['a', 2, 3, 4, None]) + assert ac.recommend_type( ac.get_typing_metadata(WEIRD_INT_SER)) == 'int' + +def test_smart_to_int(): + assert_series_equal( + ac.smart_to_int(pd.Series(['a', 2, 3, 4, None])), + pd.Series([NA, 2,3,4, NA], dtype='UInt8')) + + + # this should throw an error + # assert_series_equal( + # ac.smart_to_int(pd.Series(['a', 2.0, 3.1, None, NA])), + # pd.Series([NA, 2,3,4, NA], dtype='UInt8')) + + +def test_coerce_series(): + assert_series_equal( + ac.coerce_series(pd.Series(['a', 2, 3, 4, None]), 'int'), + pd.Series([NA, 2,3,4, NA], dtype='UInt8')) + + assert_series_equal( + ac.coerce_series(pd.Series(['a', False, True, None]), 'bool'), + pd.Series([NA, False, True, NA], dtype='boolean')) + + assert_series_equal( + ac.coerce_series(pd.Series(['a', 2.0, 3.0, None, NA]), 'int'), + pd.Series([NA, 2, 3, NA, NA], dtype='UInt8')) + + assert_series_equal( + ac.coerce_series(pd.Series(['a', 2.0, 3.1, None, NA]), 'float'), + pd.Series([nan, 2, 3.1, nan, nan], dtype='float')) + +def atest_autotype_df(): + assert_frame_equal( + ac.auto_type_df( + pd.DataFrame({ + 'int':pd.Series(['a', 2, 3, 4, None]), + 'bool':pd.Series(['a', False, True, None]), + 'int2':pd.Series(['a', 2.0, 3.0, None, NA]), + 'float':pd.Series(['a', 2.0, 3.1, None, NA]), + 'allNA':pd.Series([NA, NA, NA, None, NA]), + 'string_':pd.Series(['a', 'b', 'c', 'd', 'e']) + } + )), + pd.DataFrame({ + 'int' : pd.Series([NA, 2,3,4, NA], dtype='UInt8'), + 'bool': pd.Series([NA, False, True, NA], dtype='boolean'), + 'int2': pd.Series([NA, 2, 3, NA, NA], dtype='UInt8'), + 'float': pd.Series([nan, 2, 3.1, nan, nan], dtype='float'), + 'allNA':pd.Series([NA, NA, NA, None, NA]), + 'string_':pd.Series(['a', 'b', 'c', 'd', 'e']) + })) diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index 4b4e13728..d44c96c08 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -3,21 +3,53 @@ from buckaroo.buckaroo_widget import BuckarooWidget +simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) + def test_basic_instantiation(): - df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + df = simple_df w = BuckarooWidget(df) - assert w.dfConfig['totalRows'] == 499 + assert w.dfConfig['totalRows'] == 3 def test_basic_display(): - df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + df = simple_df w = BuckarooWidget(df) display(w) def test_interpreter(): + #df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + + w = BuckarooWidget(simple_df) + assert w.operation_results['generated_py_code'] == '''def clean(df): + df['int_col'] = smart_int(df['int_col']) + df['str_col'] = df['str_col'].fillna(value='').astype('string').replace('', None) + return df''' + + temp_ops = w.operations.copy() + temp_ops.append([{"symbol":"dropcol"},{"symbol":"df"},"str_col"]) + w.operations = temp_ops + + tdf = w.operation_results['transformed_df'] + assert w.operation_results['transform_error'] == False + field_names = [ f['name'] for f in tdf['schema']['fields'] ] + assert 'str_col' not in field_names + assert w.operation_results['generated_py_code'] == """def clean(df): + df['int_col'] = smart_int(df['int_col']) + df['str_col'] = df['str_col'].fillna(value='').astype('string').replace('', None) + df.drop('str_col', axis=1, inplace=True) + return df""" + +def atest_symbol_meta(): + """verifies that a symbol with a meta key can be added and + properly interpretted. This should probably be a lower level + parser test + + """ + + df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') w = BuckarooWidget(df) - assert w.operation_results['generated_py_code'] == '#from py widget init' - w.operations = [[{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] + assert w.operation_results['generated_py_code'] == '# instantiation, unused' + w.operations = [[{"symbol":"dropcol", "meta":{}},{"symbol":"df"},"starttime"]] tdf = w.operation_results['transformed_df'] assert w.operation_results['transform_error'] == False @@ -26,12 +58,10 @@ def test_interpreter(): def test_interpreter_errors(): - df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') - w = BuckarooWidget(df) - assert w.operation_results['generated_py_code'] == '#from py widget init' + w = BuckarooWidget(simple_df) w.operations = [ - [{"symbol":"dropcol"},{"symbol":"df"},"starttime"], - [{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] - assert w.operation_results['transform_error'] == '''"['starttime'] not found in axis"''' - + [{"symbol":"dropcol"},{"symbol":"df"},"int_col"], + #dropping the same column will result in an error + [{"symbol":"dropcol"},{"symbol":"df"},"int_col"]] + assert w.operation_results['transform_error'] == '''"['int_col'] not found in axis"''' diff --git a/tests/lispy_test.py b/tests/lispy_test.py new file mode 100644 index 000000000..08db504cf --- /dev/null +++ b/tests/lispy_test.py @@ -0,0 +1,29 @@ +import unittest +import pytest +from buckaroo.lisp_utils import split_operations, lists_match + +def test_split_operations(): + + full_ops = [ + [{"symbol":"dropcol", "meta":{"precleaning":True}},{"symbol":"df"},"starttime"], + [{"symbol":"dropcol"},{"symbol":"df"},"starttime"], + ] + + EXPECTED_cleaning_ops = [ + [{"symbol":"dropcol", "meta":{"precleaning":True}},{"symbol":"df"},"starttime"]] + + EXPECTED_user_gen_ops = [ + [{"symbol":"dropcol"},{"symbol":"df"},"starttime"]] + + cleaning_ops, user_gen_ops = split_operations(full_ops) + + assert EXPECTED_cleaning_ops == cleaning_ops + assert EXPECTED_user_gen_ops == user_gen_ops + +def test_lists_match(): + + assert lists_match(["a", "b"], ["a", "b"]) + assert lists_match([["a", "b"]], [["a", "b"]]) + assert not lists_match(["a", "b"], ["a", "b", "c"]) + assert not lists_match([["a", "b"]], [["a", "b", "c"]]) + diff --git a/tsconfig.json b/tsconfig.json index eae169e1b..3e9415ee4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,12 +14,17 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, + "experimentalDecorators": true, // This allows us to initialize members in the "initialize" method "strictPropertyInitialization": false, "target": "es2015", "jsx": "react", "baseUrl": "." }, + "typeRoots": [ + "./js/typings", + "./node_modules/@types/" + ], "include": ["js/*.ts", "js/*.tsx", "js/core/*.ts", "js/core/*.tsx", ], "ts-node": { "transpileOnly": true diff --git a/webpack.config.js b/webpack.config.js index 6f90a2c76..11e2acfe6 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -95,26 +95,27 @@ const resolve = { module.exports = [ // the following section must be commented out for the nbextension to work // I think it must be enabled for the dev mode of the react app to work - // { - // entry: './examples/index-react18.tsx', - // output: { - // path: path.join(__dirname, '/examples/dist'), - // filename: 'bundle.js' - // }, - // module: { - // rules: demoRules, - // }, - // devtool: 'source-map', - // externals, - // resolve, - // plugins: [new HtmlWebpackPlugin({ - // //template: './examples/index.html' - // template: './examples/index.html' - // })], - // performance - // }, - +/* + { + entry: './examples/index-react18.tsx', + output: { + path: path.join(__dirname, '/examples/dist'), + filename: 'bundle.js' + }, + module: { + rules: demoRules, + }, + devtool: 'source-map', + externals, + resolve, + plugins: [new HtmlWebpackPlugin({ + //template: './examples/index.html' + template: './examples/index.html' + })], + performance + }, +*/ /** * Notebook extension * diff --git a/yarn.lock b/yarn.lock index eeab12e52..58dd8598b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1532,9 +1532,9 @@ url "^0.11.0" "@jupyterlab/builder@^3.0.1": - version "3.6.4" - resolved "https://registry.npmjs.org/@jupyterlab/builder/-/builder-3.6.4.tgz" - integrity sha512-ycTW4P7VRF+67JCb/PlJ358CBsoUYxxkiAEkR6R9QJEY0Zk4S4NuuHq2Sv87Zclpj+xlrxlnSR9WaLq8zEvR7A== + version "3.6.5" + resolved "https://registry.npmjs.org/@jupyterlab/builder/-/builder-3.6.5.tgz" + integrity sha512-J9WO50gxjJ1bUo7BCix0fSxpRySCwaR8AaWNQ5QdYT1ARSGuSnfM9ZyeUOS61DvL3+h7IqsPTQQr5tbhIWv91Q== dependencies: "@lumino/algorithm" "^1.9.0" "@lumino/application" "^1.31.4" @@ -1842,6 +1842,11 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + "@remix-run/router@1.6.2": version "1.6.2" resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz" @@ -1952,6 +1957,57 @@ dependencies: "@types/node" "*" +"@types/d3-array@^3.0.3": + version "3.0.5" + resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz" + integrity sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A== + +"@types/d3-color@*": + version "3.1.0" + resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz" + integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== + +"@types/d3-ease@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz" + integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== + +"@types/d3-interpolate@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz" + integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz" + integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== + +"@types/d3-scale@^4.0.2": + version "4.0.3" + resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz" + integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-shape@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz" + integrity sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time@*", "@types/d3-time@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz" + integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== + +"@types/d3-timer@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz" + integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== + "@types/dom4@^2.0.1": version "2.0.2" resolved "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.2.tgz" @@ -2592,7 +2648,17 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.2, ajv@^8.9.0: +ajv@^8.0.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.2, ajv@^8.9.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2994,6 +3060,11 @@ boolbase@^1.0.0: resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bootstrap@^5.1.3: + version "5.3.1" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.1.tgz" + integrity sha512-jzwza3Yagduci2x0rr9MeFSORjcHpt0lRZukZPZQJT1Dth5qzV7XcgGqYzi39KGAVYR8QEDVoO0ubFKOxzMG+g== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -3194,10 +3265,10 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -classnames@^2.2: - version "2.3.2" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== +classnames@^2.2, classnames@^2.2.5: + version "2.2.5" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz" + integrity sha512-DTt3GhOUDKhh4ONwIJW4lmhyotQmV2LjNlGK/J2hkwUcqcbKkCLAdJPtxQnxnlc7SR3f1CEXCyMmc7WLUsWbNA== clean-css@^4.2.3: version "4.2.4" @@ -3525,6 +3596,11 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + css-what@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" @@ -3550,6 +3626,77 @@ csstype@3.0.10: resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== +d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3": + version "3.2.4" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +"d3-color@1 - 3": + version "3.1.0" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-ease@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-format@1 - 3": + version "3.1.0" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3": + version "3.0.1" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-shape@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4": + version "4.1.0" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3": + version "3.1.0" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" @@ -3580,6 +3727,11 @@ debug@2.6.9: dependencies: ms "2.0.0" +decimal.js-light@^2.4.1: + version "2.5.1" + resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + dedent@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" @@ -4094,7 +4246,7 @@ etag@~1.8.1: resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -eventemitter3@^4.0.0: +eventemitter3@^4.0.0, eventemitter3@^4.0.1: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -4197,6 +4349,11 @@ fast-diff@^1.1.2: resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-equals@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" @@ -4905,6 +5062,11 @@ internal-slot@^1.0.3, internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + interpret@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" @@ -5866,7 +6028,7 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6876,6 +7038,11 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-select cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" @@ -6958,7 +7125,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -7050,7 +7217,15 @@ raw-loader@~4.0.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -"react-dom@^15.3.0 || 16 || 17", react-dom@^17.0.1, react-dom@>=15.0.0: +"react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0, react-dom@>=15.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +"react-dom@^15.3.0 || 16 || 17", react-dom@^17.0.1: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -7059,15 +7234,7 @@ raw-loader@~4.0.0: object-assign "^4.1.1" scheduler "^0.20.2" -"react-dom@^16.3.0 || ^17.0.0 || ^18.0.0", react-dom@^18.0.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.9.0: +react-is@^16.10.2, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.9.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -7095,6 +7262,13 @@ react-popper@^1.3.7: typed-styles "^0.0.7" warning "^4.0.2" +react-resize-detector@^8.0.4: + version "8.1.0" + resolved "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz" + integrity sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w== + dependencies: + lodash "^4.17.21" + react-router-dom@^5.2.0: version "5.3.4" resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" @@ -7130,7 +7304,15 @@ react-router@5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-transition-group@^2.9.0: +react-smooth@^2.0.2, react-smooth@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz" + integrity sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg== + dependencies: + fast-equals "^5.0.0" + react-transition-group "2.9.0" + +react-transition-group@^2.9.0, react-transition-group@2.9.0: version "2.9.0" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== @@ -7140,7 +7322,14 @@ react-transition-group@^2.9.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -"react@^15.3.0 || 16 || 17", react@^17.0.1, react@>=0.14.0, react@>=15.0.0, react@>=16, "react@0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0", react@17.0.2: +"react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@>=15, react@>=15.0.0, react@>=16.8: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +"react@^15.3.0 || 16 || 17", react@^17.0.1, react@>=0.14.0, react@>=16, "react@0.14.x || ^15.0.0 || ^16.0.0 || ^17.0.0", react@17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -7148,13 +7337,6 @@ react-transition-group@^2.9.0: loose-envify "^1.1.0" object-assign "^4.1.1" -"react@^16.3.0 || ^17.0.0 || ^18.0.0", react@^18.0.0, react@^18.2.0, react@>=15, react@>=16.8: - version "18.2.0" - resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" @@ -7193,6 +7375,28 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^2.7.3: + version "2.7.3" + resolved "https://registry.npmjs.org/recharts/-/recharts-2.7.3.tgz" + integrity sha512-cKoO9jUZRQavn06H6Ih2EcG82zUNdQH3OEGWVCmluSDyp3d7fIpDAsbMTd8hE8+T+MD8P76iicv/J4pJspDP7A== + dependencies: + classnames "^2.2.5" + eventemitter3 "^4.0.1" + lodash "^4.17.19" + react-is "^16.10.2" + react-resize-detector "^8.0.4" + react-smooth "^2.0.2" + recharts-scale "^0.4.4" + reduce-css-calc "^2.1.8" + victory-vendor "^36.6.8" + rechoir@^0.7.0: version "0.7.1" resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" @@ -7200,6 +7404,14 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" @@ -7537,9 +7749,9 @@ semver@^7.3.4: lru-cache "^6.0.0" semver@^7.3.5: - version "7.5.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -8527,6 +8739,26 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +victory-vendor@^36.6.8: + version "36.6.11" + resolved "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.11.tgz" + integrity sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg== + dependencies: + "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" + "@types/d3-timer" "^3.0.0" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" + walker@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" From 9e4d92144b44f9b8c640029424ac5f40f6663bf0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 4 Oct 2023 21:40:31 -0400 Subject: [PATCH 142/250] Chore/analysis resilient (#34) * basic unit tests built into pluggable_analysis_framework, accessed in the whole unit tests * more resilient coldisplayhints * analysis management tests run every time an analysis object is added to an analysis pipeline * added more columns to PERVERSE_DF used for testing analysis * auto typing can now be controlled widget instantiation * working towards customizable auto-typing * more work towards settable metadata and recommend functions * reincorporated column reordering into render flow * added post_procdesing funcitonality * added post_processing_func * released * mend released 0.3.20 --- buckaroo/analysis.py | 5 +- buckaroo/analysis_management.py | 39 +++++++++-- buckaroo/auto_clean.py | 36 +++++----- buckaroo/buckaroo_widget.py | 105 +++++++++++++++++++----------- package.json | 2 +- pyproject.toml | 2 +- tests/analysis_management_test.py | 15 ++++- tests/auto_clean_test.py | 8 +++ tests/basic_widget_test.py | 22 ++++++- 9 files changed, 170 insertions(+), 64 deletions(-) diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index 493502846..0c403643e 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -202,6 +202,7 @@ class ColDisplayHints(ColAnalysis): @staticmethod def table_hints(sampled_ser, summary_ser, table_hint_col_dict): is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype) + is_bool = pd.api.types.is_bool_dtype(sampled_ser) # if not is_numeric: # return dict(is_numeric=False) # if len(sampled_ser) == 0: @@ -209,7 +210,7 @@ def table_hints(sampled_ser, summary_ser, table_hint_col_dict): return dict( is_numeric=is_numeric, is_integer=pd.api.types.is_integer_dtype(sampled_ser), - min_digits=(is_numeric and int_digits(summary_ser.loc['min'])) or 0, - max_digits=(is_numeric and int_digits(summary_ser.loc['max'])) or 0, + min_digits=(is_numeric and not is_bool and int_digits(summary_ser.loc['min'])) or 0, + max_digits=(is_numeric and not is_bool and int_digits(summary_ser.loc['max'])) or 0, histogram=histogram(sampled_ser, summary_ser['nan_per'])) diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py index e707eb63c..f6aa7da7f 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/analysis_management.py @@ -47,11 +47,27 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): for ser_name, err_kls in errs.items(): err, kls = err_kls print("%s.summary(test_ser.%s)" % (kls.__name__, ser_name)) - return pd.DataFrame(summary_col_dict), table_hint_col_dict + return pd.DataFrame(summary_col_dict), table_hint_col_dict, errs + + class NonExistentSummaryRowException(Exception): pass + + +PERVERSE_DF = pd.DataFrame({ + 'all_nan': [np.nan] * 10, + 'all_false': [False] * 10, + 'all_True': [True] * 10, + 'mixed_bool': np.concatenate([[True]*5, [False]*5]), + 'mixed_float': np.concatenate([[0.5, np.nan, None], [6]*7]), + 'float': [0.5] *10, + 'int': [8] *10, + 'negative': [-1] *10, + 'UInt32': pd.Series([5]*10, dtype='UInt32') + }) + class AnalsysisPipeline(object): """ manage the ordering of a set of col_analysis objects @@ -72,7 +88,6 @@ def process_summary_facts_set(self): self.provided_summary_facts_set = set(all_provided) - #all is a special value that will dipslay every row if self.summary_stats_display and not self.summary_stats_display == "all": #verify that we have a way of computing all of the facts we are displaying @@ -91,13 +106,22 @@ def unit_test(self): not implemented yet. This helps interactive development by doing a smoke test on - each new iteration of summary stats function + each new iteration of summary stats function. """ - pass + try: + output_df, table_hint_dict, errs = produce_summary_df(PERVERSE_DF, self.ordered_a_objs) + if len(errs) == 0: + return True + return False + except Exception as e: + print("analysis pipeline unit_test failed") + print(e) + return False + def process_df(self, input_df): - output_df, table_hint_dict = produce_summary_df(input_df, self.ordered_a_objs) + output_df, table_hint_dict, errs = produce_summary_df(input_df, self.ordered_a_objs) return output_df, table_hint_dict def add_analysis(self, new_aobj): @@ -109,6 +133,11 @@ def add_analysis(self, new_aobj): new_aobj_set.append(aobj) new_aobj_set.append(new_aobj) self.verify_analysis_objects(new_aobj_set) + if not self.unit_test(): + print("new analysis fails unit tests") + return False + return True + class DfStats(object): ''' diff --git a/buckaroo/auto_clean.py b/buckaroo/auto_clean.py index 7cfd7f684..498eca831 100644 --- a/buckaroo/auto_clean.py +++ b/buckaroo/auto_clean.py @@ -56,21 +56,29 @@ def get_object_typing_metadata(ser): counts['datetime_error'] += 1 except (pd.core.tools.datetimes.DateParseError, ValueError, TypeError): counts['datetime_error'] += 1 - try: + + if isinstance(v, bool): + counts['bool'] += 1 + else: + counts['bool_error'] += 1 + if isinstance(v, str): + try: + int(v) + counts['int'] += 1 + except ValueError: + counts['int_error'] += 1 + try: + float(v) + counts['float'] += 1 + except ValueError: + counts['float_error'] += 1 + elif isinstance(v, float) or isinstance(v, int): int(v) counts['int'] += 1 - except ValueError: - counts['int_error'] += 1 - try: float(v) counts['float'] += 1 - except ValueError: - counts['float_error'] += 1 + - if isinstance(v, bool): - counts['bool'] += 1 - else: - counts['bool_error'] += 1 if len(ser) == 0: return counts @@ -194,15 +202,13 @@ def auto_type_df(df): new_data[c] = coerce_series(df[c], recommended_types[c]) return pd.DataFrame(new_data) -def get_auto_type_operations(df): +def get_auto_type_operations(df, metadata_f, recommend_f): #this is much faster because we only run the slow function on a maximum of 200 rows. #That's a good size for an estimate sample_size = min(len(df), 200) cleaning_commands = [] for c in df.columns: - new_type = recommend_type(get_typing_metadata(df[c].sample(sample_size))) + metadata = metadata_f(df[c].sample(sample_size)) + new_type = recommend_f(metadata) cleaning_commands.append(emit_command(c, new_type)) return cleaning_commands - - - diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 8d42d187c..1da6f31b7 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -9,6 +9,7 @@ """ import json import warnings +import traceback from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe @@ -17,21 +18,14 @@ from .all_transforms import configure_buckaroo, DefaultCommandKlsList from .lisp_utils import (lists_match, split_operations) -from .auto_clean import get_auto_type_operations +from .auto_clean import get_auto_type_operations, get_typing_metadata, recommend_type from .down_sample import sample from .analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) - - from .analysis_management import DfStats - - - from pandas.io.json import dumps as pdumps -#empty_df = pd.DataFrame({}) -#json.loads(empty_df.to_json(orient='table', indent=2)) EMPTY_DF_OBJ = {'schema': {'fields': [{'name': 'index', 'type': 'string'}], 'primaryKey': ['index'], 'pandas_version': '1.4.0'}, @@ -76,6 +70,9 @@ class BuckarooWidget(DOMWidget): machine_gen_operations = List().tag(sync=True) command_classes = DefaultCommandKlsList + typing_metadata_f = staticmethod(get_typing_metadata) + typing_recommend_f = staticmethod(recommend_type) + origDf = Dict({}).tag(sync=True) summaryDf = Dict({}).tag(sync=True) @@ -92,8 +89,8 @@ class BuckarooWidget(DOMWidget): 'sampled':False, 'summaryStats': False, 'reorderdColumns': False, - 'showTransformed': True, 'showCommands': True, + 'autoType': True, }).tag(sync=True) @@ -113,7 +110,6 @@ def get_df_config(self, df, sampled, reorderdColumns, showCommands): tempDfc.update(dict( totalRows=len(df), columns=len(df.columns), - #removing showCommands for now, mirroring showTransformed showCommands=showCommands)) tempDfc['sampled'] = self.should_sample(df, sampled, reorderdColumns) return tempDfc @@ -122,27 +118,57 @@ def __init__(self, df, sampled=True, summaryStats=False, reorderdColumns=False, - showCommands=True): + showCommands=True, + autoType=True, + postProcessingF=None, + ): + super().__init__() warnings.filterwarnings('ignore') #moving setup_from_command_kls_list early in the init because #it's relatively benign and not tied to other linked updates + self.postProcessingF = postProcessingF + self.processed_result = None + self.transformed_df = None self.setup_from_command_kls_list() self.dfConfig = self.get_df_config(df, sampled, reorderdColumns, showCommands) - #we need dfConfig setup first before we get the proper - #working_df and generate the typed_df + #we need dfConfig setup first before we get the proper working_df for auto_cleaning self.raw_df = df - - # this will trigger the setting of self.typed_df - self.operations = get_auto_type_operations(df) + self.run_autoclean(autoType) + warnings.filterwarnings('default') + def run_autoclean(self, autoType): + if autoType: + # this will trigger the setting of self.typed_df + self.operations = get_auto_type_operations( + self.raw_df, metadata_f=self.typing_metadata_f, + recommend_f=self.typing_recommend_f) + else: + self.set_typed_df(self.get_working_df()) + #need to run this for the no autoclean case + self.run_post_processing() + + def set_metadata_f(self, new_f): + self.typing_metadata_f = staticmethod(new_f) + self.run_autoclean() + + def set_recommend_f(self, new_f): + self.typing_recommend_f = staticmethod(new_f) + self.run_autoclean() + @observe('dfConfig') def update_based_on_df_config(self, change): - if hasattr(self, 'typed_df'): - self.origDf = df_to_obj(self.typed_df, self.typed_df.columns, table_hints=self.stats.table_hints) #otherwise this is a call before typed_df has been completely setup + if hasattr(self, 'typed_df'): + if self.dfConfig['reorderdColumns']: + #ideally this won't require a reserialization. All + #possible col_orders shoudl be serialized once, and the + #frontend should just toggle from them + self.origDf = df_to_obj(self.typed_df, self.stats.col_order, table_hints=self.stats.table_hints) + else: + self.origDf = df_to_obj(self.typed_df, self.typed_df.columns, table_hints=self.stats.table_hints) @observe('operations') def handle_operations(self, change): @@ -160,37 +186,53 @@ def handle_operations(self, change): results = {} try: - transformed_df = self.interpret_ops(user_gen_ops, self.typed_df) + self.transformed_df = self.interpret_ops(user_gen_ops, self.typed_df) #note we call gneerate_py_code based on the full #self.operations, this makes sure that machine_gen #cleaning code shows up too results['generated_py_code'] = self.generate_code(new_ops) - results['transformed_df'] = json.loads(transformed_df.to_json(orient='table', indent=2)) + results['transformed_df'] = json.loads(self.transformed_df.to_json(orient='table', indent=2)) results['transform_error'] = False + self.run_post_processing() except Exception as e: results['transformed_df'] = EMPTY_DF_OBJ print(e) results['transform_error'] = str(e) self.operation_results = results + def run_post_processing(self): + if self.postProcessingF: + try: + if self.transformed_df is None: + working_df = self.get_working_df() + else: + working_df = self.transformed_df + self.processed_result = self.postProcessingF(working_df) + except Exception as e: + traceback.print_exc() + @observe('machine_gen_operations') def interpret_machine_gen_ops(self, change, force=False): if (not force) and lists_match(change['old'], change['new']): return # nothing changed, do no computations new_ops = change['new'] - + self.set_typed_df(self.interpret_ops(new_ops, self.get_working_df())) + + def get_working_df(self): #this won't listen to sampled changes proeprly if self.dfConfig['sampled']: - working_df = sample(self.raw_df, self.dfConfig['sampleSize']) + return sample(self.raw_df, self.dfConfig['sampleSize']) else: - working_df = self.raw_df - self.typed_df = self.interpret_ops(new_ops, working_df) - + return self.raw_df + + def set_typed_df(self, new_df): + self.typed_df = new_df # stats need to be rerun each time self.stats = DfStats(self.typed_df, [TypingStats, DefaultSummaryStats, ColDisplayHints]) self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) self.update_based_on_df_config(3) + def generate_code(self, operations): if len(operations) == 0: return 'no operations' @@ -222,16 +264,3 @@ def add_analysis(self, analysis_obj): self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) #just trigger redisplay self.update_based_on_df_config(3) - - -class Unused(): - def update_based_on_df_config(self, change): - - if self.dfConfig['reorderdColumns']: - #ideally this won't require a reserialization. All - #possible col_orders shoudl be serialized once, and the - #frontend should just toggle from them - #self.origDf = df_to_obj(tdf, self.stats.col_order, table_hints=self.stats.table_hints) - self.origDf = df_to_obj(self.typed_df, self.stats.col_order, table_hints=self.stats.table_hints) - else: - self.origDf = df_to_obj(tdf, tdf.columns, table_hints=self.stats.table_hints) diff --git a/package.json b/package.json index 96f6d06c6..bdf4f5ed2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.27", + "version": "0.2.28", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 0926b1cf4..7e15146f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.19" +version = "0.3.20" [project.license] file = "LICENSE.txt" diff --git a/tests/analysis_management_test.py b/tests/analysis_management_test.py index cf2f92048..d2b07b8ed 100644 --- a/tests/analysis_management_test.py +++ b/tests/analysis_management_test.py @@ -30,10 +30,23 @@ class Foo(ColAnalysis): @staticmethod def summary(sampled_ser, summary_ser, ser): return dict(foo=8) - ap.add_analysis(Foo) + assert ap.add_analysis(Foo) == True #verify no errors thrown sdf, _unused = ap.process_df(df) self.assertEqual(sdf.loc['foo']['tripduration'], 8) + def test_add_buggy_aobj(self): + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + class Foo(ColAnalysis): + provided_summary = [ + 'foo',] + requires_summary = ['length'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + 1/0 #throw an error + return dict(foo=8) + assert ap.add_analysis(Foo) == False + def test_replace_aobj(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): diff --git a/tests/auto_clean_test.py b/tests/auto_clean_test.py index a4c9c2a03..8db2fbdef 100644 --- a/tests/auto_clean_test.py +++ b/tests/auto_clean_test.py @@ -12,6 +12,8 @@ INT_META = {'datetime': 0.0, 'datetime_error': 1.0, 'int': 0.75, 'int_error': 0.25, 'float': 0.75, 'float_error': 0.25, 'bool': 0.0, 'bool_error': 1.0} +FULL_INT_META = {'datetime': 0.0, 'datetime_error': 0, 'int': 1, 'int_error': 0, 'float': 0, 'float_error': 0, 'bool': 0.0, 'bool_error': 0, 'exact_type': 'UInt32', 'general_type':'int'} + FLOAT_META = {'datetime': 0.0, 'datetime_error': 1.0, 'int': 0.25, 'int_error': 0.75, 'float': 0.75, 'float_error': 0.25, 'bool': 0.0, 'bool_error': 1.0} STRING_META = {'datetime': 0.0, 'datetime_error': 1.0, 'int': 0.0, 'int_error': 1.0, 'float': 0.25, 'float_error': 0.75, 'bool': 0.0, 'bool_error': 1.0} @@ -61,6 +63,12 @@ def test_get_typing_metadata(): #there are still problems here, the code isn't properly distinguishing bools from ints and bools assert BOOL_META == ac.get_typing_metadata(pd.Series(['a', 'b', False, True, False])) + assert FULL_INT_META == ac.get_typing_metadata(pd.Series([5]*10, dtype='UInt32')) + + # what does the typing code do on "dtype" objects + ac.get_typing_metadata(pd.Series([pd.Series([5], dtype='UInt32').dtype]*3)) + + #only nans assert ac.get_typing_metadata(pd.Series([None])) == ONLY_NANS_META diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index d44c96c08..f1fededc0 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -45,7 +45,6 @@ def atest_symbol_meta(): """ - df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') w = BuckarooWidget(df) assert w.operation_results['generated_py_code'] == '# instantiation, unused' @@ -65,3 +64,24 @@ def test_interpreter_errors(): [{"symbol":"dropcol"},{"symbol":"df"},"int_col"]] assert w.operation_results['transform_error'] == '''"['int_col'] not found in axis"''' +def test_analysis_pipeline(): + """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" + w = BuckarooWidget(simple_df) + assert w.stats.ap.unit_test() == True + +def test_autotype_false(): + """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" + w = BuckarooWidget(simple_df, autoType=False) + assert w.stats.ap.unit_test() == True + +def test_post_processing(): + def my_func(df): + return df['int_col'].sum() + + bw = BuckarooWidget(simple_df, postProcessingF=my_func) + assert bw.processed_result == 6 + + bw2 = BuckarooWidget(simple_df, autoType=False, postProcessingF=my_func) + assert bw2.processed_result == 6 + + From f88fcb81ddb36995e5ea2d636452c5744ee16930 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 4 Oct 2023 23:30:57 -0400 Subject: [PATCH 143/250] Chore/analysis management exercise (#35) released 0.3.21 --- buckaroo/buckaroo_widget.py | 2 +- introduction.ipynb | 527 ++++++------------------------------ package.json | 2 +- pyproject.toml | 2 +- 4 files changed, 90 insertions(+), 443 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 1da6f31b7..8c5255ded 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -191,7 +191,7 @@ def handle_operations(self, change): #self.operations, this makes sure that machine_gen #cleaning code shows up too results['generated_py_code'] = self.generate_code(new_ops) - results['transformed_df'] = json.loads(self.transformed_df.to_json(orient='table', indent=2)) + results['transformed_df'] = df_to_obj(self.transformed_df) results['transform_error'] = False self.run_post_processing() except Exception as e: diff --git a/introduction.ipynb b/introduction.ipynb index f0d1fe228..041e647de 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -2,18 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n", - "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", @@ -27,77 +18,7 @@ "outputs": [], "source": [ "df = pd.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')\n", - "BuckarooWidget(df[:10_000])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def sample(df, sample_size=500, include_outliers=True):\n", - " \n", - " sample_size = np.min([sample_size, len(df)])\n", - " sdf = df.sample(sample_size)\n", - " \n", - " \n", - " if include_outliers:\n", - " outlier_idxs = []\n", - " for col in df.columns:\n", - " idxs = df[col].sort_values().index\n", - " outlier_idxs.extend(idxs[:5])\n", - " outlier_idxs.extend(idxs[-5:])\n", - " outlier_idxs.extend(sdf.index)\n", - " uniq_idx = np.unique(outlier_idxs)\n", - " #print(uniq_idx)\n", - " return df.iloc[uniq_idx]\n", - " return sdf\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit sample(df, 500)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit sample(df, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%timeit sample(df, 5000)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(sample(df))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df.iloc[[23,58, 1023]]" + "df" ] }, { @@ -106,103 +27,76 @@ "metadata": {}, "outputs": [], "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv')\n", - "w = BuckarooWidget(df)\n", + "w = BuckarooWidget(df, showCommands=False)\n", "w" ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ab = df['tripduration']\n", - "ab.sort_values()" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "sorted_ab = ab.sort_values()\n", - "sorted_ab.index[:5]" + "# Adding a summary stat" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.unique([2,2,3])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df['start station name'].sort_values()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.array([2,2,3]).unique()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "a = []\n", - "a.extend([23,45], [32,5])\n", - "a" + "from buckaroo.pluggable_analysis_framework import (ColAnalysis)\n", + "from scipy.stats import skew\n", + "class Skew(ColAnalysis):\n", + " provided_summary = [\"skew\"]\n", + " requires_summary = []\n", + " \n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " if pd.api.types.is_integer_dtype(sampled_ser):\n", + " return dict(skew=skew(sampled_ser.astype('int64')))\n", + " elif pd.api.types.is_float_dtype(sampled_ser):\n", + " return dict(skew=skew(sampled_ser.astype('float64')))\n", + " else:\n", + " return dict(skew=\"NA\")\n", + " summary_stats_display = [\n", + " 'dtype',\n", + " 'length',\n", + " 'nan_count',\n", + " 'distinct_count',\n", + " 'empty_count',\n", + " 'empty_per',\n", + " 'unique_per',\n", + " 'nan_per',\n", + " 'is_numeric',\n", + " 'is_integer',\n", + " 'is_datetime',\n", + " 'mode',\n", + " 'min',\n", + " 'max',\n", + " 'mean',\n", + " # we must add skew to the list of summary_stats_display, otherwise our new stat won't be displayed\n", + " 'skew']\n", + "w.add_analysis(Skew)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "df.columns" + "w.stats.presentation_sdf" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "bc = df.sample(300)" + "# Making a new default dataframe display function" ] }, { @@ -210,36 +104,61 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "bc.index" - ] + "source": [] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "arr = [2,3]\n", - "arr.extend(df.index)" + "from buckaroo.widget_utils import disable\n", + "from IPython.core.getipython import get_ipython\n", + "from IPython.display import display\n", + "import warnings\n", + "\n", + "disable()\n", + "def my_display_as_buckaroo(df):\n", + " w = BuckarooWidget(df, showCommands=False)\n", + " #the analysis we added throws warnings, let's muffle that when used as the default display\n", + " warnings.filterwarnings('ignore')\n", + " w.add_analysis(Skew)\n", + " warnings.filterwarnings('default')\n", + " return display(w)\n", + "\n", + "def my_enable():\n", + " \"\"\"\n", + " Automatically use buckaroo to display all DataFrames\n", + " instances in the notebook.\n", + "\n", + " \"\"\"\n", + " ip = get_ipython()\n", + " if ip is None:\n", + " print(\"must be running inside ipython to enable default display via enable()\")\n", + " return\n", + " ip_formatter = ip.display_formatter.ipython_display_formatter\n", + " ip_formatter.for_type(pd.DataFrame, my_display_as_buckaroo)\n", + "my_enable()" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "df.iloc[[137, 137, 138]]" + "df" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "pd.concat([df.iloc[sorted_ab.index[:5]], df[20:50]])" + "# Adding a Command to the Low Code UI" ] }, { @@ -290,282 +209,10 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 2, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.98543491, 0.88189975, 0.8519125 , 0.34405232, 0.64923551,\n", - " 0.76498397, 0.08317026, 0.33898759, 0.8959272 , 0.84532194,\n", - " 0.61846565, 0.97065402, 0.33760845, 0.14928914, 0.46931127,\n", - " 0.44402314, 0.3851214 , 0.30878261, 0.15215036, 0.30283917,\n", - " 0.34619956, 0.94479008, 0.52277332, 0.46966805, 0.01990334,\n", - " 0.0090225 , 0.18186927, 0.67424679, 0.38775559, 0.48266829,\n", - " 0.83345845, 0.7639416 , 0.71366249, 0.40440437, 0.0687034 ,\n", - " 0.99350699, 0.02384897, 0.61694475, 0.16986129, 0.76552384,\n", - " 0.49479425, 0.50517121, 0.80248113, 0.38342123, 0.25053957,\n", - " 0.09369322, 0.53027412, 0.80884121, 0.96754405, 0.10643695,\n", - " 0.30732228, 0.09244387, 0.75280274, 0.66100238, 0.21485027,\n", - " 0.74945128, 0.45370822, 0.88729706, 0.18465771, 0.01511092,\n", - " 0.13943961, 0.68186614, 0.68525074, 0.90057088, 0.58703984,\n", - " 0.47070748, 0.85631468, 0.48696279, 0.94382412, 0.91341682,\n", - " 0.85296105, 0.05317179, 0.68182398, 0.13682457, 0.43423833,\n", - " 0.98276478, 0.26740801, 0.73420044, 0.80780702, 0.476105 ,\n", - " 0.587292 , 0.00186236, 0.81152695, 0.42044342, 0.13466556,\n", - " 0.76170374, 0.52000642, 0.93240774, 0.97551015, 0.65619746,\n", - " 0.81113788, 0.90734312, 0.76348578, 0.15419325, 0.56967834,\n", - " 0.89901476, 0.87296504, 0.6050323 , 0.87922915, 0.58874466])" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.rand(1,100)[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.12371643, 0.27411337, 0.44275076, 0.21505491, 0.57833314])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.random_sample(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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fvOb3xhJ5tlnnw2af+yxx0xSUpLZvHmz+eMf/2i+8IUvmKysLPO3v/3NWTNt2jRz7bXXml27dplXXnnFXHHFFebuu+/u5U66Lz8/36xfv94cPHjQ1NXVmdtuu82MGDHCnD592llz3333mczMTLNjxw6zd+9ec/3115vJkyc78925r0eS559/3rzwwgvmjTfeMEePHjXf+973TFxcnDl48KAxJvr6/SACTA9t3brVXH311ebQoUMdAsyPf/xjM2TIEOP3+52xhx56yFx11VXO9pe//GUzY8aMoGNOmjTJfPOb3wx77aHw3HPPGZfLZVpaWowx/aPn8vJyk5WV5WxHc8/r16/vNMBs3brVxMTEGJ/P54w9+eSTxuPxOD+HBx980IwZMyZov6985SsmPz8/rDWHysSJE01xcbGz3draajIyMsyyZcv6sKrQ+HCAaWtrM+np6ebxxx93xpqamozb7Ta/+MUvjDHGHD582Egye/bscda8+OKLxuVymXfffbfXav97NDQ0GEnm5ZdfNsZc6DEuLs4888wzzpojR44YSaa6utoY0737eqQbMmSI+bd/+7eo75eXkHqgvr5es2fP1r//+78rMTGxw3x1dbVuvvlmxcfHO2P5+fk6evSo3nvvPWdNbm5u0H75+fmqrq4Ob/Eh0NjYqI0bN2ry5MmKi4uTFP09S9KpU6eUkpLibPeHnj+surpa48aNC/ogyfz8fDU3N+vQoUPOGlt7bmlpUW1tbVD9MTExys3NtaL+njp27Jh8Pl9Qv0lJSZo0aZLTb3V1tZKTk5Wdne2syc3NVUxMjGpqanq95ktx6tQpSXIev7W1tQoEAkF9X3311RoxYkRQ3xe7r0eq1tZWPf300zpz5oxycnKivl8CTDcZY3TvvffqvvvuC3pAf5DP5+vwScHt2z6fr8s17fOR6KGHHtKgQYM0dOhQnThxQs8995wzF609t/vzn/+siooKffOb33TGor3nzvw9PTc3N+tvf/tb7xR6if73f/9Xra2tUXWbdaW9p6769fl8Sk1NDZofMGCAUlJSrPiZtLW1ae7cubrhhhs0duxYSRd6io+P7/A+rw/3fbH7eqQ5cOCALrvsMrndbt1333169tlnNXr06Kjtt12/DzDz58+Xy+Xq8utPf/qTKioq9P7776usrKyvS/67dbfndvPmzdO+fftUWVmp2NhYfe1rX5Ox7AOce9qzJL377ruaNm2avvSlL2n27Nl9VPmlu5SegWhRXFysgwcP6umnn+7rUsLuqquuUl1dnWpqanT//ferqKhIhw8f7uuywi5i/xZSb3nggQd07733drnmk5/8pHbu3Knq6uoOf0MiOztbhYWF+tnPfqb09PQO7+5u305PT3e+d7amfb43dLfndsOGDdOwYcP06U9/WqNGjVJmZqZ27dqlnJycqO355MmTuvXWWzV58mStW7cuaF209tyV9PT0DlfkdLdnj8ejgQMHdrPqvjFs2DDFxsb2+W3WW9p7qq+v1/Dhw53x+vp6jR8/3lnT0NAQtN/58+fV2NgY8T+TkpISbdmyRVVVVfrEJz7hjKenp6ulpUVNTU1Bz0p88Hbuzn090sTHx+uKK66QJE2YMEF79uzRE088oa985StR2a+jr9+EY4u33nrLHDhwwPnavn27kWR+/etfm7ffftsY8/9v7mx/g6sxxpSVlXV4c+fnP//5oGPn5ORE/Js727311ltGknnppZeMMdHZ8zvvvGOuvPJKU1BQYM6fP99hPhp7bnexN/F+8Iqcn/zkJ8bj8Zhz584ZYy68iXfs2LFB+919991WvYm3pKTE2W5tbTUf//jHo/pNvCtWrHDGTp061embePfu3eus2b59e0S/ibetrc0UFxebjIwM88Ybb3SYb39T669//Wtn7E9/+lOnb2rt6r4e6W699VZTVFQU9f0SYC7RsWPHOlyF1NTUZNLS0sw999xjDh48aJ5++mmTmJjY4fLaAQMGmBUrVpgjR46YRx55JGIvr921a5epqKgw+/btM8ePHzc7duwwkydPNp/61KecO3a09fzOO++YK664wkyZMsW888475r//+7+dr3bR1rMxF4Lpvn37zOLFi81ll11m9u3bZ/bt22fef/99Y8z/X2qZl5dn6urqzLZt28zHPvaxTi+jnjdvnjly5IhZs2aNdZdRu91us2HDBnP48GEzZ84ck5ycHHR1hk3ef/9953aUZFauXGn27dtn3nrrLWPMhcuok5OTzXPPPWf2799v7rjjjk4vo77uuutMTU2N+cMf/mCuvPLKiL6M+v777zdJSUnm97//fdBj9+zZs86a++67z4wYMcLs3LnT7N27t8NHQ3Tnvh5J5s+fb15++WVz7Ngxs3//fjN//nzjcrlMZWWlMSb6+v0gAswl6izAGGPMH//4R3PjjTcat9ttPv7xj5vHHnusw76/+tWvzKc//WkTHx9vxowZY1544YVeqrpn9u/fb2699VaTkpJi3G63ufzyy819991n3nnnnaB10dTz+vXrjaROvz4omno2xpiioqJOe25/ps0YY44fP26mT59uBg4caIYNG2YeeOABEwgEgo7z0ksvmfHjx5v4+HjzyU9+0qxfv753G/k7VVRUmBEjRpj4+HgzceJEs2vXrr4u6ZK99NJLnd6mRUVFxpgLz1YsWLDApKWlGbfbbaZMmWKOHj0adIy//vWv5u677zaXXXaZ8Xg85utf/7oTaiPRRz12P3g//Nvf/ma+9a1vmSFDhpjExERz1113Bf0PijHdu69Him984xtm5MiRJj4+3nzsYx8zU6ZMccKLMdHX7we5jLHs3ZgAAKDf6/dXIQEAAPsQYAAAgHUIMAAAwDoEGAAAYB0CDAAAsA4BBgAAWIcAAwAArEOAAQAA1iHAAAAA6xBgAACAdQgwAADAOgQYAABgnf8D9iExpIWQKPsAAAAASUVORK5CYII=", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "arr = np.random.standard_normal(5000) * 100\n", - "arr = arr.astype(int)\n", - "ser = pd.Series(arr)\n", - "ser.hist()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 3, 17, 124, 501, 1079, 1483, 1123, 497, 156, 17])" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "populations, endpoints = np.histogram(arr, 10)\n", - "populations" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-406. , -332.3, -258.6, -184.9, -111.2, -37.5, 36.2, 109.9,\n", - " 183.6, 257.3, 331. ])" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "endpoints" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['-406 -332',\n", - " '-332 -258',\n", - " '-258 -184',\n", - " '-184 -111',\n", - " '-111 -37',\n", - " '-37 36',\n", - " '36 109',\n", - " '109 183',\n", - " '183 257',\n", - " '257 331']" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def histogram_labels(endpoints):\n", - " left = endpoints[0]\n", - " labels = []\n", - " for edge in endpoints[1:]:\n", - " labels.append(\"%d %d\" % (left, edge))\n", - " left = edge\n", - " return labels\n", - "histogram_labels(endpoints)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.0006, 0.0034, 0.0248, 0.1002, 0.2158, 0.2966, 0.2246, 0.0994,\n", - " 0.0312, 0.0034])" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "normalized_pop = populations / populations.sum()\n", - "normalized_pop" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{'-406 -332': 0.0006,\n", - " '-332 -258': 0.0034,\n", - " '-258 -184': 0.0248,\n", - " '-184 -111': 0.1002,\n", - " '-111 -37': 0.2158,\n", - " '-37 36': 0.2966,\n", - " '36 109': 0.2246,\n", - " '109 183': 0.0994,\n", - " '183 257': 0.0312,\n", - " '257 331': 0.0034}" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dict(zip( histogram_labels(endpoints), normalized_pop))" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'name': '-406 -332', 'population': 0.0006},\n", - " {'name': '-332 -258', 'population': 0.0034},\n", - " {'name': '-258 -184', 'population': 0.0248},\n", - " {'name': '-184 -111', 'population': 0.1002},\n", - " {'name': '-111 -37', 'population': 0.2158},\n", - " {'name': '-37 36', 'population': 0.2966},\n", - " {'name': '36 109', 'population': 0.2246},\n", - " {'name': '109 183', 'population': 0.0994},\n", - " {'name': '183 257', 'population': 0.0312},\n", - " {'name': '257 331', 'population': 0.0034}]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "def histogram_formatted_dict(arr):\n", - " populations, endpoints = np.histogram(arr, 10)\n", - " labels = histogram_labels(endpoints)\n", - " normalized_pop = populations / populations.sum()\n", - " ret_histo = []\n", - " for label, pop in zip(labels, normalized_pop):\n", - " ret_histo.append({'name': label, 'population':pop})\n", - " return ret_histo\n", - "histogram_formatted_dict(arr)" + "Note that `groupby2` has been added to the commands" ] }, { diff --git a/package.json b/package.json index bdf4f5ed2..4e04129da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.28", + "version": "0.2.29", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 7e15146f4..bebfe68f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.20" +version = "0.3.21" [project.license] file = "LICENSE.txt" From e0f764f7e3608af0540869166abaf6793841f3df Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 5 Oct 2023 18:02:59 -0400 Subject: [PATCH 144/250] Chore/fix nan display (#36) * nulls/na are now diplayed as blank --- README.md | 4 +++- buckaroo/analysis.py | 27 +++++++++++++++-------- buckaroo/analysis_management.py | 28 ++++++++++------------- js/components/DFViewer.tsx | 4 ++++ js/components/gridUtils.ts | 23 +++++++++++++------ js/components/staticData.ts | 39 ++++++++++++++++++++++++++++++++- tests/basic_widget_test.py | 8 +++++-- 7 files changed, 97 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index c82218d47..9d501979c 100644 --- a/README.md +++ b/README.md @@ -221,7 +221,9 @@ For a development installation: ```bash git clone https://github.com/paddymul/buckaroo.git cd buckaroo -conda install ipywidgets=8 jupyterlab +#we need to build against 3.6.5, jupyterlab 4.0 has different JS typing that conflicts +# the installable still works in JL4 +pip install build twine pytest jupyterlab==3.6.5 pip install -ve . ``` diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index 0c403643e..cbefe5603 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -71,6 +71,7 @@ def summary(sampled_ser, summary_ser, ser): is_numeric = pd.api.types.is_numeric_dtype(ser) is_object = pd.api.types.is_object_dtype + is_bool = pd.api.types.is_bool_dtype(ser) base_d = dict( length=l, @@ -82,15 +83,18 @@ def summary(sampled_ser, summary_ser, ser): unique_per=unique_count/l, nan_per=nan_count/l, mode=get_mode(ser), - min=(is_numeric and ser.dropna().min() or np.nan), - max=(is_numeric and ser.dropna().max() or np.nan), - mean=(is_numeric and ser.dropna().mean() or np.nan)) - if is_numeric: - base_d['mean'] = ser.mean() + min=np.nan, + max=np.nan) + if is_numeric and not is_bool: + base_d.update({ + 'mean': ser.mean(), + 'min': ser.dropna().min(), + 'max': ser.dropna().max()}) return base_d - def int_digits(n): + if pd.isna(n): + return 1 if np.isnan(n): return 1 if n == 0: @@ -207,10 +211,15 @@ def table_hints(sampled_ser, summary_ser, table_hint_col_dict): # return dict(is_numeric=False) # if len(sampled_ser) == 0: # return dict(is_numeric=False) - return dict( + base_dict = dict( is_numeric=is_numeric, is_integer=pd.api.types.is_integer_dtype(sampled_ser), - min_digits=(is_numeric and not is_bool and int_digits(summary_ser.loc['min'])) or 0, - max_digits=(is_numeric and not is_bool and int_digits(summary_ser.loc['max'])) or 0, histogram=histogram(sampled_ser, summary_ser['nan_per'])) + if is_numeric and not is_bool: + base_dict.update({ + 'min_digits':int_digits(summary_ser.loc['min']), + 'max_digits':int_digits(summary_ser.loc['max']), + }) + return base_dict + diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py index f6aa7da7f..1a2cb4e6f 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/analysis_management.py @@ -4,9 +4,20 @@ from buckaroo.pluggable_analysis_framework import ( ColAnalysis, order_analysis, check_solvable, NotProvidedException) - FAST_SUMMARY_WHEN_GREATER = 1_000_000 +PERVERSE_DF = pd.DataFrame({ + 'all_nan': [np.nan] * 10, + 'all_false': [False] * 10, + 'all_True': [True] * 10, + 'mixed_bool': np.concatenate([[True]*5, [False]*5]), + 'mixed_float': np.concatenate([[0.5, np.nan, None], [6]*7]), + 'float': [0.5] *10, + 'int': [8] *10, + 'negative': [-1] *10, + 'UInt32': pd.Series([5]*10, dtype='UInt32'), + 'UInt8None':pd.Series([None] * 10, dtype='UInt8') + }) def produce_summary_df(df, ordered_objs, df_name='test_df'): """ @@ -49,25 +60,10 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): print("%s.summary(test_ser.%s)" % (kls.__name__, ser_name)) return pd.DataFrame(summary_col_dict), table_hint_col_dict, errs - - class NonExistentSummaryRowException(Exception): pass - -PERVERSE_DF = pd.DataFrame({ - 'all_nan': [np.nan] * 10, - 'all_false': [False] * 10, - 'all_True': [True] * 10, - 'mixed_bool': np.concatenate([[True]*5, [False]*5]), - 'mixed_float': np.concatenate([[0.5, np.nan, None], [6]*7]), - 'float': [0.5] *10, - 'int': [8] *10, - 'negative': [-1] *10, - 'UInt32': pd.Series([5]*10, dtype='UInt32') - }) - class AnalsysisPipeline(object): """ manage the ordering of a set of col_analysis objects diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx index 30a756d0b..1880a2b66 100644 --- a/js/components/DFViewer.tsx +++ b/js/components/DFViewer.tsx @@ -31,7 +31,11 @@ export function DFViewer( setActiveCol: () => null, } ) { + const [agColsPure, agData] = dfToAgrid(df); + console.log("dfviewer df", df); + console.log("dfviewer agData", agData); + const styledColumns = updateAtMatch( _.clone(agColsPure), activeCol || '___never', diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index b2ae809d5..e86f9d1e7 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -52,6 +52,18 @@ export const anyFormatter = (params: ValueFormatterParams): string => { } return val; }; + +const getNumericFormatter = (totalWidth:number) => { + const formatter = new Intl.NumberFormat('en-US'); + const numericFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + if(val === null) { + return '' + } + return formatter.format(params.value).padStart(totalWidth, ' '); + } + return numericFormatter +} /* console.log((new Intl.NumberFormat('en-US')).format(amount)) console.log((new Intl.NumberFormat('en-US', { maximumFractionDigits: 1})).format(number)) @@ -73,12 +85,7 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { if (hint.is_integer) { const totalWidth = commas + hint.max_digits; - return (params: ValueFormatterParams): string => { - console.log('params', params); - - const formatter = new Intl.NumberFormat('en-US'); - return formatter.format(params.value).padStart(totalWidth, ' '); - }; + return getNumericFormatter(totalWidth); } else { /* @@ -98,7 +105,9 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { };*/ return (params: ValueFormatterParams): string => { //console.log("params", params) - + if(params.value === null) { + return ''; + } return floatFormatter.format(params.value); }; } diff --git a/js/components/staticData.ts b/js/components/staticData.ts index 26822d076..bcd31a136 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -33,7 +33,7 @@ export interface DFColumn { name: string; type: string; } -export type DFDataRow = Record; +export type DFDataRow = Record; export type DFData = DFDataRow[]; @@ -272,6 +272,9 @@ export const tableDf: DFWhole = { schema: { fields: [ { name: 'index', type: 'integer' }, + { name: 'nanNumeric', type: 'int' }, + { name: 'nanObject', type: 'int' }, + { name: 'nanFloat', type: 'float' }, { name: 'end station name', type: 'string' }, { name: 'tripduration', type: 'integer' }, { name: 'start station name', type: 'string' }, @@ -287,6 +290,9 @@ export const tableDf: DFWhole = { tripduration: 471, 'start station name': 'Catherine St & Monroe St', floatCol: '1.111', + nanNumeric: null, + nanObject: null, + nanFloat: null, }, { index: 1, @@ -294,6 +300,9 @@ export const tableDf: DFWhole = { tripduration: 1494, 'start station name': '1 Ave & E 30 St', floatCol: '8.888', + nanNumeric: null, + nanObject: null, + nanFloat: null, }, { index: 2, @@ -301,6 +310,9 @@ export const tableDf: DFWhole = { tripduration: 464, 'start station name': 'E 48 St & 3 Ave', floatCol: '9.999', + nanNumeric: null, + nanObject: null, + nanFloat: null, }, { index: 3, @@ -308,6 +320,10 @@ export const tableDf: DFWhole = { tripduration: 373, 'start station name': 'Pershing Square N', floatCol: '-10.1', + nanCol: null, + nanNumeric: null, + nanObject: null, + nanFloat: null, }, { index: 4, @@ -315,6 +331,9 @@ export const tableDf: DFWhole = { tripduration: 660, 'start station name': 'Atlantic Ave & Fort Greene Pl', floatCol: '10.99', + nanNumeric: null, + nanObject: null, + nanFloat: null, }, ], table_hints: { @@ -345,5 +364,23 @@ export const tableDf: DFWhole = { { name: 'NA', cat_pop: 0.0 }, ], }, + nanNumeric: { + is_numeric: true, + is_integer: true, + min_digits: 1, + max_digits: 3, + histogram:histograms.num_histo + }, + nanFloat: { + is_numeric: true, + is_integer: false, + min_digits: 1, + max_digits: 3, + histogram:histograms.num_histo + }, + nanObject: { + is_numeric: false, + } + }, }; diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index f1fededc0..88285e0a7 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -1,15 +1,19 @@ import pandas as pd from IPython.display import display from buckaroo.buckaroo_widget import BuckarooWidget +from buckaroo.analysis_management import PERVERSE_DF simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) def test_basic_instantiation(): - df = simple_df - w = BuckarooWidget(df) + w = BuckarooWidget(simple_df) assert w.dfConfig['totalRows'] == 3 +def test_perverse_instantiation(): + w = BuckarooWidget(PERVERSE_DF) + assert w.dfConfig['totalRows'] == 10 + def test_basic_display(): df = simple_df w = BuckarooWidget(df) From 1e574af256ca7c89e37542309eeb4ec17aac1bc2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 5 Oct 2023 18:27:54 -0400 Subject: [PATCH 145/250] Add rudimentary support for polars (#37) * 0.3.22 release, now supporting polars, better nan display --- buckaroo/widget_utils.py | 19 +++++++++++++++++++ introduction.ipynb | 14 +++++++++++++- package.json | 2 +- pyproject.toml | 2 +- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 07db0d15e..8297f4770 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -5,6 +5,13 @@ def _display_as_buckaroo(df): from IPython.display import display return display(BuckarooWidget(df, showCommands=False)) + +def _display_polars_as_buckaroo(polars_df): + from IPython.display import display + pandas_df = polars_df.to_pandas() + return display(BuckarooWidget(pandas_df, showCommands=False)) + + def enable(): """ Automatically use buckaroo to display all DataFrames @@ -24,6 +31,12 @@ def enable(): ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) + try: + import polars as pl + ip_formatter.for_type(pl.DataFrame, _display_polars_as_buckaroo) + except ImportError: + pass + def disable(): """ disable bucakroo as the default display method for DataFrames @@ -38,3 +51,9 @@ def disable(): ip_formatter = ip.display_formatter.ipython_display_formatter ip_formatter.type_printers.pop(pd.DataFrame, None) + try: + import polars as pl + ip_formatter.type_printers.pop(pl.DataFrame, None) + except ImportError: + pass + diff --git a/introduction.ipynb b/introduction.ipynb index 041e647de..79c757b52 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -215,6 +215,18 @@ "Note that `groupby2` has been added to the commands" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import polars as pl\n", + "pl.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')" + ] + }, { "cell_type": "code", "execution_count": null, @@ -239,7 +251,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.5" } }, "nbformat": 4, diff --git a/package.json b/package.json index 4e04129da..34f5a61fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.29", + "version": "0.2.31", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index bebfe68f8..5fecb3894 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.21" +version = "0.3.22" [project.license] file = "LICENSE.txt" From 3382c96578ca255a0491b7e2b76da6e05ee97d3c Mon Sep 17 00:00:00 2001 From: RichardScottOZ <72196131+RichardScottOZ@users.noreply.github.com> Date: Sat, 14 Oct 2023 01:09:15 +1030 Subject: [PATCH 146/250] Minor edits (#38) README cleanup. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9d501979c..6f0250259 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ This `transform` is the function that manipulates the dataframe. For `dropcol` def transform_to_py(df, col): return " df.drop('%s', axis=1, inplace=True)" % col ``` -`transform_to_py` emits equivalent python code for this transform. Code is indented 4 space for use in a function. +`transform_to_py` emits equivalent python code for this transform. Code is indented 4 spaces for use in a function. ### Complex example ```python @@ -175,7 +175,7 @@ There are a couple of projects like Buckaroo that aim to provide a better table * responds to buckaroo commands * shows generated python code * Developer User experience - * define Buckaroo commands in python onloy + * define Buckaroo commands in python only * Buckaroo Intepreter * Based on Peter Norvig's lispy.py, a simple syntax that is easy for the frontend to generate (no parens, just JSON arrays) * Buckaroo core (actual transforms supported) From 9a6c18f00168fe34b83272643a8d21ead0828194 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 13 Oct 2023 12:23:08 -0400 Subject: [PATCH 147/250] Chore/cleanup js (#39) Tidy up some of the TS, remove a bunch of unneeded comments. --- js/components/BaseHeader.tsx | 465 ------------------------------- js/components/ColumnsEditor.tsx | 3 - js/components/CustomHeader.tsx | 65 ++--- js/components/DCFCell.tsx | 2 + js/components/DFViewer.tsx | 36 +-- js/components/OperationUtils.ts | 3 + js/components/Operations.tsx | 5 - js/components/RechartExtra.ts | 4 + js/components/RechartTooltip.tsx | 4 +- js/components/StatusBar.tsx | 5 +- js/components/gridUtils.ts | 53 +--- js/components/staticData.ts | 202 +++++++------- 12 files changed, 161 insertions(+), 686 deletions(-) delete mode 100644 js/components/BaseHeader.tsx diff --git a/js/components/BaseHeader.tsx b/js/components/BaseHeader.tsx deleted file mode 100644 index ece765f9e..000000000 --- a/js/components/BaseHeader.tsx +++ /dev/null @@ -1,465 +0,0 @@ -/* -import { Autowired } from "../../../context/context"; -import { Column } from "../../../entities/column"; -import { IComponent } from "../../../interfaces/iComponent"; -import { IMenuFactory } from "../../../interfaces/iMenuFactory"; -import { AgGridCommon } from "../../../interfaces/iCommon"; -import { SortController } from "../../../sortController"; -import { firstExistingValue } from "../../../utils/array"; -import { isIOSUserAgent } from "../../../utils/browser"; -import { removeFromParent, setDisplayed } from "../../../utils/dom"; -import { exists } from "../../../utils/generic"; -import { createIconNoSpan } from "../../../utils/icon"; -import { escapeString } from "../../../utils/string"; -import { Component } from "../../../widgets/component"; -import { RefSelector } from "../../../widgets/componentAnnotations"; -import { LongTapEvent, TapEvent, TouchListener } from "../../../widgets/touchListener"; -import { SortIndicatorComp } from "./sortIndicatorComp"; -import { ColumnModel } from "../../../columns/columnModel"; -import { Events } from "../../../eventKeys"; -import { SortDirection } from "../../../entities/colDef"; - - -import { firstExistingValue } from "../../../utils/array"; -*/ - -import { - Autowired, - Column, - IComponent, - IMenuFactory, - SortController, - _, // contains all of the utils stuff - Component, - RefSelector, - LongTapEvent, - TapEvent, - TouchListener, - SortIndicatorComp, - ColumnModel, - Events, - SortDirection, - GridApi, - ColumnApi, -} from 'ag-grid-community'; - -const escapeString = _.escapeString; -const removeFromParent = _.removeFromParent; -const setDisplayed = _.setDisplayed; -const firstExistingValue = _.firstExistingValue; -const isIOSUserAgent = _.isIOSUserAgent; - -const exists = _.exists; -const createIconNoSpan = _.createIconNoSpan; - -export interface AgGridCommon { - /** The grid api. */ - api: GridApi; - /** The column api. */ - columnApi: ColumnApi; - /** Application context as set on `gridOptions.context`. */ - context: TContext; -} - -export interface IHeaderParams - extends AgGridCommon { - /** The column the header is for. */ - column: Column; - /** - * The name to display for the column. - * If the column is using a headerValueGetter, the displayName will take this into account. - */ - displayName: string; - /** - * Whether sorting is enabled for the column. - * Only put sort logic into your header if this is true. - */ - enableSorting: boolean | undefined; - /** - * Whether menu is enabled for the column. - * Only display a menu button in your header if this is true. - */ - enableMenu: boolean; - /** - * Callback to request the grid to show the column menu. - * Pass in the html element of the column menu to have the - * grid position the menu over the button. - */ - showColumnMenu: (source: HTMLElement) => void; - /** - * Callback to progress the sort for this column. - * The grid will decide the next sort direction eg ascending, descending or 'no sort'. - * Pass `multiSort=true` if you want to do a multi sort (eg user has Shift held down when they click). - */ - progressSort: (multiSort?: boolean) => void; - /** - * Callback to set the sort for this column. - * Pass the sort direction to use ignoring the current sort eg one of 'asc', 'desc' or null (for no sort). - * Pass `multiSort=true` if you want to do a multi sort (eg user has Shift held down when they click) - */ - setSort: (sort: SortDirection, multiSort?: boolean) => void; - - /** Custom header template if provided to `headerComponentParams`, otherwise will be `undefined`. See [Header Templates](https://ag-grid.com/javascript-data-grid/column-headers/#header-templates) */ - template?: string; - /** - * The header the grid provides. - * The custom header component is a child of the grid provided header. - * The grid's header component is what contains the grid managed functionality such as resizing, keyboard navigation etc. - * This is provided should you want to make changes to this cell, - * eg add ARIA tags, or add keyboard event listener (as focus goes here when navigating to the header). - */ - eGridHeader: HTMLElement; -} - -export interface IHeader { - /** Get the header to refresh. Gets called whenever Column Defs are updated. */ - refresh(params: IHeaderParams): boolean; -} - -export interface IHeaderComp extends IHeader, IComponent {} - -export class HeaderComp extends Component implements IHeaderComp { - private static TEMPLATE /* html */ = ``; - - @Autowired('sortController') private sortController: SortController; - @Autowired('menuFactory') private menuFactory: IMenuFactory; - @Autowired('columnModel') private readonly columnModel: ColumnModel; - - @RefSelector('eFilter') private eFilter: HTMLElement; - @RefSelector('eSortIndicator') private eSortIndicator: SortIndicatorComp; - @RefSelector('eMenu') private eMenu: HTMLElement; - @RefSelector('eLabel') private eLabel: HTMLElement; - @RefSelector('eText') private eText: HTMLElement; - - /** - * Selectors for custom headers templates - */ - @RefSelector('eSortOrder') private eSortOrder: HTMLElement; - @RefSelector('eSortAsc') private eSortAsc: HTMLElement; - @RefSelector('eSortDesc') private eSortDesc: HTMLElement; - @RefSelector('eSortMixed') private eSortMixed: HTMLElement; - @RefSelector('eSortNone') private eSortNone: HTMLElement; - - private params: IHeaderParams; - - private lastMovingChanged = 0; - - private currentDisplayName: string; - private currentTemplate: string | null | undefined; - private currentShowMenu: boolean; - private currentSort: boolean | undefined; - - // this is a user component, and IComponent has "public destroy()" as part of the interface. - // so we need to override destroy() just to make the method public. - public destroy(): void { - super.destroy(); - } - - public refresh(params: IHeaderParams): boolean { - this.params = params; - - // if template changed, then recreate the whole comp, the code required to manage - // a changing template is to difficult for what it's worth. - if (this.workOutTemplate() != this.currentTemplate) { - return false; - } - if (this.workOutShowMenu() != this.currentShowMenu) { - return false; - } - if (this.workOutSort() != this.currentSort) { - return false; - } - - this.setDisplayName(params); - - return true; - } - - private workOutTemplate(): string | null | undefined { - let template: string | null | undefined = firstExistingValue( - this.params.template, - HeaderComp.TEMPLATE - ); - - // take account of any newlines & whitespace before/after the actual template - template = template && template.trim ? template.trim() : template; - return template; - } - - public init(params: IHeaderParams): void { - this.params = params; - - this.currentTemplate = this.workOutTemplate(); - this.setTemplate(this.currentTemplate); - this.setupTap(); - this.setupIcons(params.column); - this.setMenu(); - this.setupSort(); - this.setupFilterIcon(); - this.setDisplayName(params); - } - - private setDisplayName(params: IHeaderParams): void { - if (this.currentDisplayName != params.displayName) { - this.currentDisplayName = params.displayName; - const displayNameSanitised = escapeString(this.currentDisplayName); - if (this.eText) { - this.eText.innerHTML = displayNameSanitised!; - } - } - } - - private setupIcons(column: Column): void { - this.addInIcon('menu', this.eMenu, column); - this.addInIcon('filter', this.eFilter, column); - } - - private addInIcon( - iconName: string, - eParent: HTMLElement, - column: Column - ): void { - if (eParent == null) { - return; - } - - const eIcon = createIconNoSpan(iconName, this.gridOptionsService, column); - if (eIcon) { - eParent.appendChild(eIcon); - } - } - - private setupTap(): void { - const { gridOptionsService } = this; - - if (gridOptionsService.is('suppressTouch')) { - return; - } - - const touchListener = new TouchListener(this.getGui(), true); - const suppressMenuHide = gridOptionsService.is('suppressMenuHide'); - const tapMenuButton = suppressMenuHide && exists(this.eMenu); - const menuTouchListener = tapMenuButton - ? new TouchListener(this.eMenu, true) - : touchListener; - - if (this.params.enableMenu) { - const eventType = tapMenuButton ? 'EVENT_TAP' : 'EVENT_LONG_TAP'; - const showMenuFn = (event: TapEvent | LongTapEvent) => { - gridOptionsService.api.showColumnMenuAfterMouseClick( - this.params.column, - event.touchStart - ); - }; - this.addManagedListener( - menuTouchListener, - TouchListener[eventType], - showMenuFn - ); - } - - if (this.params.enableSorting) { - const tapListener = (event: TapEvent) => { - const target = event.touchStart.target as HTMLElement; - // When suppressMenuHide is true, a tap on the menu icon will bubble up - // to the header container, in that case we should not sort - if (suppressMenuHide && this.eMenu.contains(target)) { - return; - } - - this.sortController.progressSort( - this.params.column, - false, - 'uiColumnSorted' - ); - }; - - this.addManagedListener( - touchListener, - TouchListener.EVENT_TAP, - tapListener - ); - } - - // if tapMenuButton is true `touchListener` and `menuTouchListener` are different - // so we need to make sure to destroy both listeners here - this.addDestroyFunc(() => touchListener.destroy()); - - if (tapMenuButton) { - this.addDestroyFunc(() => menuTouchListener.destroy()); - } - } - - private workOutShowMenu(): boolean { - // we don't show the menu if on an iPad/iPhone, as the user cannot have a pointer device/ - // However if suppressMenuHide is set to true the menu will be displayed alwasys, so it's ok - // to show it on iPad in this case (as hover isn't needed). If suppressMenuHide - // is false (default) user will need to use longpress to display the menu. - const menuHides = !this.gridOptionsService.is('suppressMenuHide'); - - const onIpadAndMenuHides = isIOSUserAgent() && menuHides; - const showMenu = this.params.enableMenu && !onIpadAndMenuHides; - - return showMenu; - } - - private setMenu(): void { - // if no menu provided in template, do nothing - if (!this.eMenu) { - return; - } - - this.currentShowMenu = this.workOutShowMenu(); - if (!this.currentShowMenu) { - removeFromParent(this.eMenu); - return; - } - - const suppressMenuHide = this.gridOptionsService.is('suppressMenuHide'); - this.addManagedListener(this.eMenu, 'click', () => - this.showMenu(this.eMenu) - ); - this.eMenu.classList.toggle('ag-header-menu-always-show', suppressMenuHide); - } - - public showMenu(eventSource?: HTMLElement) { - if (!eventSource) { - eventSource = this.eMenu; - } - - this.menuFactory.showMenuAfterButtonClick( - this.params.column, - eventSource, - 'columnMenu' - ); - } - - private workOutSort(): boolean | undefined { - return this.params.enableSorting; - } - - public setupSort(): void { - this.currentSort = this.params.enableSorting; - - // eSortIndicator will not be present when customers provided custom header - // templates, in that case, we need to look for provided sort elements and - // manually create eSortIndicator. - if (!this.eSortIndicator) { - this.eSortIndicator = this.context.createBean( - new SortIndicatorComp(true) - ); - this.eSortIndicator.attachCustomElements( - this.eSortOrder, - this.eSortAsc, - this.eSortDesc, - this.eSortMixed, - this.eSortNone - ); - } - this.eSortIndicator.setupSort(this.params.column); - - // we set up the indicator prior to the check for whether this column is sortable, as it allows the indicator to - // set up the multi sort indicator which can appear irrelevant of whether this column can itself be sorted. - // this can occur in the case of a non-sortable group display column. - if (!this.currentSort) { - return; - } - - const sortUsingCtrl = - this.gridOptionsService.get('multiSortKey') === 'ctrl'; - - // keep track of last time the moving changed flag was set - this.addManagedListener( - this.params.column, - Column.EVENT_MOVING_CHANGED, - () => { - this.lastMovingChanged = new Date().getTime(); - } - ); - - // add the event on the header, so when clicked, we do sorting - if (this.eLabel) { - this.addManagedListener(this.eLabel, 'click', (event: MouseEvent) => { - // sometimes when moving a column via dragging, this was also firing a clicked event. - // here is issue raised by user: https://ag-grid.zendesk.com/agent/tickets/1076 - // this check stops sort if a) column is moving or b) column moved less than 200ms ago (so caters for race condition) - const moving = this.params.column.isMoving(); - const nowTime = new Date().getTime(); - // typically there is <2ms if moving flag was set recently, as it would be done in same VM turn - const movedRecently = nowTime - this.lastMovingChanged < 50; - const columnMoving = moving || movedRecently; - - if (!columnMoving) { - const multiSort = sortUsingCtrl - ? event.ctrlKey || event.metaKey - : event.shiftKey; - this.params.progressSort(multiSort); - } - }); - } - - const onSortingChanged = () => { - this.addOrRemoveCssClass( - 'ag-header-cell-sorted-asc', - this.params.column.isSortAscending() - ); - this.addOrRemoveCssClass( - 'ag-header-cell-sorted-desc', - this.params.column.isSortDescending() - ); - this.addOrRemoveCssClass( - 'ag-header-cell-sorted-none', - this.params.column.isSortNone() - ); - - if (this.params.column.getColDef().showRowGroup) { - const sourceColumns = this.columnModel.getSourceColumnsForGroupColumn( - this.params.column - ); - // this == is intentional, as it allows null and undefined to match, which are both unsorted states - const sortDirectionsMatch = sourceColumns?.every( - (sourceCol) => this.params.column.getSort() == sourceCol.getSort() - ); - const isMultiSorting = !sortDirectionsMatch; - - this.addOrRemoveCssClass('ag-header-cell-sorted-mixed', isMultiSorting); - } - }; - this.addManagedListener( - this.eventService, - Events.EVENT_SORT_CHANGED, - onSortingChanged - ); - this.addManagedListener( - this.eventService, - Events.EVENT_COLUMN_ROW_GROUP_CHANGED, - onSortingChanged - ); - } - - private setupFilterIcon(): void { - if (!this.eFilter) { - return; - } - - this.addManagedListener( - this.params.column, - Column.EVENT_FILTER_CHANGED, - this.onFilterChanged.bind(this) - ); - this.onFilterChanged(); - } - - private onFilterChanged(): void { - const filterPresent = this.params.column.isFilterActive(); - setDisplayed(this.eFilter, filterPresent, { skipAriaHidden: true }); - } -} diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx index 461dc22c9..0b77e6590 100644 --- a/js/components/ColumnsEditor.tsx +++ b/js/components/ColumnsEditor.tsx @@ -10,7 +10,6 @@ import { tableDf, bakedCommandConfig } from './staticData'; export type OperationSetter = (ops: Operation[]) => void; export interface WidgetConfig { showCommands: boolean; - // showTransformed:boolean; } export function ColumnsEditor({ @@ -31,7 +30,6 @@ export function ColumnsEditor({ widgetConfig: WidgetConfig; }) { const allColumns = df.schema.fields.map((field) => field.name); - //console.log('Columns Editor, commandConfig', commandConfig); return (
    {widgetConfig.showCommands ? ( @@ -62,7 +60,6 @@ export function ColumnsEditorEx() { transformed_df: EmptyDf, generated_py_code: 'default py code', transform_error: undefined, - // transform_error:"asdfasf" }; return ( (value: TValue) { return _.isArray(value) && isNumOrStr(value[0]) && isNumOrStr(value[1]) @@ -63,30 +55,30 @@ export const makeData = (histogram: number[]) => { const formatter = (value: any, name: any, props: any) => { if (props.payload.name === 'longtail') { return [value, name]; - } - else { + } else { return [value, props.payload.name]; } }; - export function FloatingTooltip({ items, x, y }: any) { const offset = 30; - const renderedItems = items.map((name: [string, number], value: number | string) => { - - const [realName, realValue] = name; - const formattedVal = realValue == 0 ? "<1" : realValue; - return ( - -
    {realName}
    -
    {formattedVal}%
    -
    - ); - }); + const renderedItems = items.map( + (name: [string, number], value: number | string) => { + const [realName, realValue] = name; + const formattedVal = realValue === 0 ? '<1' : realValue; + return ( + +
    {realName}
    +
    {formattedVal}%
    +
    + ); + } + ); return createPortal(
    + style={{ position: 'absolute', top: y + offset, left: x + offset }} + >
    {renderedItems}
    , document.body @@ -94,13 +86,7 @@ export function FloatingTooltip({ items, x, y }: any) { } export const ToolTipAdapter = (args: any) => { - const { active, formatter, payload, label } = args; - console.log('label', label); - //console.log("args", args, formatter); - //console.log("coordinate, box", args.coordinate, args.box); - //console.log("payload", payload) - //const anchor = useRef(null); - + const { active, formatter, payload } = args; if (active && payload && payload.length) { const renderContent2 = () => { //const items = (itemSorter ? _.sortBy(payload, itemSorter) : payload).map((entry, i) => { @@ -113,7 +99,7 @@ export const ToolTipAdapter = (args: any) => { const { value, name } = entry; let finalValue: React.ReactNode = value; let finalName: React.ReactNode = name; - if (finalFormatter && finalValue != null && finalName != null) { + if (finalFormatter && finalValue !== null && finalName !== null) { const formatted = finalFormatter(value, name, entry, i, payload); if (Array.isArray(formatted)) { [finalValue, finalName] = formatted; @@ -126,13 +112,6 @@ export const ToolTipAdapter = (args: any) => { }); return items; }; - /* -

    {`${label} : ${payload[0].value}`}

    -

    {label}

    -

    Anything you want can be displayed here.

    - - - */ return (
    { //export const HistogramCell = ({histogram}: {histogram:any}) => { export const HistogramCell = (props: any) => { - if (props == undefined || props.value == undefined) { + if (props === undefined || props.value === undefined) { return ; } const histogram = props.value.histogram; @@ -163,8 +142,10 @@ export const HistogramCell = (props: any) => { height="10" patternUnits="userSpaceOnUse" > - + { formatter={formatter} labelStyle={{ display: 'None' }} wrapperStyle={{ zIndex: 999991 }} - contentStyle={{'color':'black'}} + contentStyle={{ color: 'black' }} content={} offset={20} allowEscapeViewBox={{ x: true }} diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index b12d3d407..90809a585 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -15,6 +15,8 @@ export type CommandConfigSetterT = ( /* Widget DCFCell is meant to be used with callback functions and passed values, not explicit http calls + + TODO:add height settings to dfConfig rather than hardcoded. */ export function WidgetDCFCell({ origDf, diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx index 1880a2b66..9f688f399 100644 --- a/js/components/DFViewer.tsx +++ b/js/components/DFViewer.tsx @@ -1,8 +1,4 @@ -import React, { - useRef, - CSSProperties, - // useMemo, -} from 'react'; +import React, { useRef, CSSProperties } from 'react'; import _ from 'lodash'; import { DFWhole, EmptyDf } from './staticData'; @@ -31,11 +27,9 @@ export function DFViewer( setActiveCol: () => null, } ) { - const [agColsPure, agData] = dfToAgrid(df); - console.log("dfviewer df", df); - console.log("dfviewer agData", agData); - + // console.log('dfviewer agData', agData); + const styledColumns = updateAtMatch( _.clone(agColsPure), activeCol || '___never', @@ -45,7 +39,6 @@ export function DFViewer( { cellStyle: {} } ); - //console.log("styledColumns after updateAtMatch", activeCol, styledColumns) const gridOptions: GridOptions = { rowSelection: 'single', onRowClicked: (event) => console.log('A row was clicked'), @@ -79,6 +72,12 @@ export function DFViewer( const gridRef = useRef>(null); const makeCondtionalAutosize = (count: number, delay: number) => { + /* + this code is buggy and I'm not confident in it. I'm very + surprised that automatically autosizing AG-grid requires custom + functions to be written vs just a flag. + */ + let counter = count; let timer: NodeJS.Timeout; let colWidthHasBeenSet = false; @@ -99,16 +98,10 @@ export function DFViewer( } } - // console.log('first pass currentColWidth'); - const conditionallyAutosize = () => { - // console.log("conditionallyAutosize", count, delay) if (gridRef !== undefined) { - // console.log("gridref defined") if (gridRef.current !== undefined && gridRef.current !== null) { - // console.log("gridref.current defined") if (gridRef.current.columnApi !== undefined) { - // console.log("calling autosizeAllColumns", count, delay); gridRef.current.columnApi.autoSizeAllColumns(); const dc = gridRef.current.columnApi.getAllDisplayedColumns(); // console.log("bodyWidth", cm.bodyWidth) @@ -152,18 +145,7 @@ export function DFViewer( }; makeCondtionalAutosize(50, 350); - //const histograms = _.fromPairs( _.map({'a':10, 'b':20}, function(val,key) {return [y, x] })) - // const histograms = _.fromPairs( _.map(df.table_hints, - // function(val,key) { - // return [key, val.histogram || []] })) const pinnedTopRowData = [df.table_hints]; - //const pinnedTopRowData = [histograms]; - // const pinnedTopRowData = [{'index': 'foo', - // 'end station name': 'bar', - // 'tripduration': 471, - // 'start station name': 'Catherine St & Monroe St', - // 'floatCol': '1.111', - // }]; return (
    diff --git a/js/components/OperationUtils.ts b/js/components/OperationUtils.ts index 4a2969f14..57b503a6b 100644 --- a/js/components/OperationUtils.ts +++ b/js/components/OperationUtils.ts @@ -1,3 +1,6 @@ +/* + used for manipulating the JSON Flavored lisp of operations and commands + */ import _ from 'lodash'; import { SymbolT, ColEnumArgs, SymbolDf, symDf } from './CommandUtils'; diff --git a/js/components/Operations.tsx b/js/components/Operations.tsx index 7be4e3a02..245a1fbab 100644 --- a/js/components/Operations.tsx +++ b/js/components/Operations.tsx @@ -56,15 +56,11 @@ export const OperationsList = ({ { cellStyle: {} } ); - //console.log('OperationsList columns', columns); - const gridOptions: GridOptions = { rowSelection: 'single', headerHeight: 30, - //onRowClicked: (event) => console.log('A row was clicked'), onCellClicked: (event) => { const colName = event.column.getColId(); - //console.log('operationsList onCellClicked'); setActiveKey(colName); }, }; @@ -191,7 +187,6 @@ export const OperationViewer = ({ } }; const { argspecs, defaultArgs } = commandConfig; - //console.log('OperationsViewer operationDict', operationDict, 'activeKey', activeKey); return (
    { return val; }; -const getNumericFormatter = (totalWidth:number) => { +const getNumericFormatter = (totalWidth: number) => { const formatter = new Intl.NumberFormat('en-US'); const numericFormatter = (params: ValueFormatterParams): string => { const val = params.value; - if(val === null) { - return '' + if (val === null) { + return ''; } return formatter.format(params.value).padStart(totalWidth, ' '); - } - return numericFormatter -} -/* - console.log((new Intl.NumberFormat('en-US')).format(amount)) - console.log((new Intl.NumberFormat('en-US', { maximumFractionDigits: 1})).format(number)) + }; + return numericFormatter; +}; - console.log(`|${last4Digits.padStart(7, ' ')}|`) - - valueFormatter: currencyFormatter} - ]; - - function currencyFormatter(params) { - return '£' + formatNumber(params.value); - } -*/ function getFormatter(hint: ColumnHint): ValueFormatterFunc { if (hint === undefined || hint.is_numeric === false) { return anyFormatter; @@ -87,27 +81,10 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { const totalWidth = commas + hint.max_digits; return getNumericFormatter(totalWidth); } else { - /* - - const intWidth = commas + hint.max_digits; - const fracWidth = 4; - return (params: ValueFormatterParams):string => { - console.log("params", params) - const formatter = new Intl.NumberFormat('en-US', { maximumFractionDigits: 3 }); - //console.log(`|${last4Digits.padStart(7, ' ')}|`) - const numFormatted = formatter.format(params.value); - if(numFormatted.includes(".")){ - const [intPart, fracPart] = numFormatted.split(".") - return [intPart.padStart(intWidth, " "), fracPart.padEnd(3, " ")].join(".") } - else { - return numFormatted.padStart(intWidth, " ").padEnd(intWidth + fracWidth, " ") - } - };*/ return (params: ValueFormatterParams): string => { - //console.log("params", params) - if(params.value === null) { - return ''; - } + if (params.value === null) { + return ''; + } return floatFormatter.format(params.value); }; } diff --git a/js/components/staticData.ts b/js/components/staticData.ts index bcd31a136..98220b90a 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -18,17 +18,7 @@ export const bakedOperations: Operation[] = [ [sym('fillna'), symDf, 'col2', 5], [sym('resample'), symDf, 'month', 'monthly', {}], ]; -/* -const origColumns = [ - { key: 'id', name: 'ID' }, - { key: 'title', name: 'Title' }, -]; -const origRows = [ - { id: 0, title: 'Example' }, - { id: 1, title: 'Demo' }, -]; -*/ export interface DFColumn { name: string; type: string; @@ -70,107 +60,108 @@ export const EmptyDf: DFWhole = { //print(sdf.to_json(orient='table', indent=2)) export const histograms = { - num_histo : [ - {'name': '-406 - -332', 'population': 1}, - {'name': '-332 - -258', 'population': 0}, - {'name': '-258 - -184', 'population': 2}, - {'name': '-184 - -111', 'population': 10}, - {'name': '-111 - -37', 'population': 22}, - {'name': '-37 - 36', 'population': 30}, - {'name': '36 - 109', 'population': 22}, - {'name': '109 - 183', 'population': 10}, - {'name': '183 - 257', 'population': 3}, - {'name': '257 - 331', 'population': 0}], + num_histo: [ + { name: '-406 - -332', population: 1 }, + { name: '-332 - -258', population: 0 }, + { name: '-258 - -184', population: 2 }, + { name: '-184 - -111', population: 10 }, + { name: '-111 - -37', population: 22 }, + { name: '-37 - 36', population: 30 }, + { name: '36 - 109', population: 22 }, + { name: '109 - 183', population: 10 }, + { name: '183 - 257', population: 3 }, + { name: '257 - 331', population: 0 }, + ], - bool_histo : [ - {'name': 'False', 'false': 50}, - {'name': 'True', 'true': 30}, - {'name': 'NA', 'NA': 20}], + bool_histo: [ + { name: 'False', false: 50 }, + { name: 'True', true: 30 }, + { name: 'NA', NA: 20 }, + ], - NA_Only : [ - {'name': 'NA', 'NA': 100}], + NA_Only: [{ name: 'NA', NA: 100 }], - simple_catgeorical : [ - {'name': 2, 'cat_pop': 87.0}, - {'name': 1, 'cat_pop': 13.0}], - - categorical_histo : [ - {'name': 'KTM', 'cat_pop': 30}, - {'name': 'Gas Gas', 'cat_pop': 15}, - {'name': 'Yamaha', 'cat_pop': 10}, - {'name': 'unique', 'unique': 25}, - {'name': 'NA', 'NA': 20} + simple_catgeorical: [ + { name: 2, cat_pop: 87.0 }, + { name: 1, cat_pop: 13.0 }, ], - categorical_histo_lt : [ - {'name': 'KTM', 'cat_pop': 25}, - {'name': 'Gas Gas', 'cat_pop': 12}, - {'name': 'Yamaha', 'cat_pop': 8}, - {'name': 'NA', 'NA': 20}, - {'name': 'longtail', 'unique': 15, 'longtail':20}, + categorical_histo: [ + { name: 'KTM', cat_pop: 30 }, + { name: 'Gas Gas', cat_pop: 15 }, + { name: 'Yamaha', cat_pop: 10 }, + { name: 'unique', unique: 25 }, + { name: 'NA', NA: 20 }, ], - all_unique : [ - {'name': 'unique', 'unique': 100}, + categorical_histo_lt: [ + { name: 'KTM', cat_pop: 25 }, + { name: 'Gas Gas', cat_pop: 12 }, + { name: 'Yamaha', cat_pop: 8 }, + { name: 'NA', NA: 20 }, + { name: 'longtail', unique: 15, longtail: 20 }, ], - unique_na : [ - {'name': 'unique', 'unique': 80}, - {'name': 'NA', 'NA': 20} - ], + all_unique: [{ name: 'unique', unique: 100 }], - unique_continuous : [ - {'name': '-406 -332', 'population': 1}, - {'name': '-332 -258', 'population': 0}, - {'name': '-258 -184', 'population': 0}, - {'name': '-184 -111', 'population': 10}, - {'name': '-111 -37', 'population': 21}, - {'name': '-37 36', 'population': 29}, - {'name': '36 109', 'population': 22}, - {'name': '109 183', 'population': 9}, - {'name': '183 257', 'population': 3}, - {'name': '257 331', 'population': 0}, - {'name': 'unique', 'unique': 100}, + unique_na: [ + { name: 'unique', unique: 80 }, + { name: 'NA', NA: 20 }, ], - unique_continuous_scaled : [ - {'name': '-406 -332', 'population': 0}, - {'name': '-332 -258', 'population': 0}, - {'name': '-258 -184', 'population': 0}, - {'name': '-184 -111', 'population': 10}, - {'name': '-111 -37', 'population': 21}, - {'name': '-37 36', 'population': 29}, - {'name': '36 109', 'population': 22}, - {'name': '109 183', 'population': 9}, - {'name': '183 257', 'population': 3}, - {'name': '257 331', 'population': 0}, - {'name': 'unique', 'unique': 29}, + unique_continuous: [ + { name: '-406 -332', population: 1 }, + { name: '-332 -258', population: 0 }, + { name: '-258 -184', population: 0 }, + { name: '-184 -111', population: 10 }, + { name: '-111 -37', population: 21 }, + { name: '-37 36', population: 29 }, + { name: '36 109', population: 22 }, + { name: '109 183', population: 9 }, + { name: '183 257', population: 3 }, + { name: '257 331', population: 0 }, + { name: 'unique', unique: 100 }, ], - unique_continuous_scaled_50 : [ - {'name': '-406 -332', 'population': 0}, - {'name': '-332 -258', 'population': 0}, - {'name': '-258 -184', 'population': 0}, - {'name': '-184 -111', 'population': 10}, - {'name': '-111 -37', 'population': 21}, - {'name': '-37 36', 'population': 29}, - {'name': '36 109', 'population': 22}, - {'name': '109 183', 'population': 9}, - {'name': '183 257', 'population': 3}, - {'name': '257 331', 'population': 0}, - {'name': 'longtail', 'unique': 15}, + unique_continuous_scaled: [ + { name: '-406 -332', population: 0 }, + { name: '-332 -258', population: 0 }, + { name: '-258 -184', population: 0 }, + { name: '-184 -111', population: 10 }, + { name: '-111 -37', population: 21 }, + { name: '-37 36', population: 29 }, + { name: '36 109', population: 22 }, + { name: '109 183', population: 9 }, + { name: '183 257', population: 3 }, + { name: '257 331', population: 0 }, + { name: 'unique', unique: 29 }, ], - start_station_categorical : [{'name': 'Pershing Square N', 'cat_pop': 1}, - {'name': '8 Ave & W 31 St', 'cat_pop': 1}, - {'name': 'Lafayette St & E 8 St', 'cat_pop': 1}, - {'name': 'W 21 St & 6 Ave', 'cat_pop': 1}, - {'name': 'E 17 St & Broadway', 'cat_pop': 1}, - {'name': '8 Ave & W 33 St', 'cat_pop': 1}, - {'name': 'E 43 St & Vanderbilt Ave', 'cat_pop': 1}, - {'name': 'unique', 'cat_pop': 0}, - {'name': 'long_tail', 'cat_pop': 92}, - {'name': 'NA', 'cat_pop': 0}] + unique_continuous_scaled_50: [ + { name: '-406 -332', population: 0 }, + { name: '-332 -258', population: 0 }, + { name: '-258 -184', population: 0 }, + { name: '-184 -111', population: 10 }, + { name: '-111 -37', population: 21 }, + { name: '-37 36', population: 29 }, + { name: '36 109', population: 22 }, + { name: '109 183', population: 9 }, + { name: '183 257', population: 3 }, + { name: '257 331', population: 0 }, + { name: 'longtail', unique: 15 }, + ], + start_station_categorical: [ + { name: 'Pershing Square N', cat_pop: 1 }, + { name: '8 Ave & W 31 St', cat_pop: 1 }, + { name: 'Lafayette St & E 8 St', cat_pop: 1 }, + { name: 'W 21 St & 6 Ave', cat_pop: 1 }, + { name: 'E 17 St & Broadway', cat_pop: 1 }, + { name: '8 Ave & W 33 St', cat_pop: 1 }, + { name: 'E 43 St & Vanderbilt Ave', cat_pop: 1 }, + { name: 'unique', cat_pop: 0 }, + { name: 'long_tail', cat_pop: 92 }, + { name: 'NA', cat_pop: 0 }, + ], }; //export const tableDf2:DFWhole = { @@ -194,7 +185,7 @@ export const foo: DFWhole = { }, table_hints: { index: { is_numeric: false }, - tripduration: { is_numeric: false, histogram:histograms.num_histo}, + tripduration: { is_numeric: false, histogram: histograms.num_histo }, starttime: { is_numeric: false }, stoptime: { is_numeric: false }, 'start station id': { is_numeric: false }, @@ -337,15 +328,21 @@ export const tableDf: DFWhole = { }, ], table_hints: { - 'end station name': { is_numeric: false, histogram: histograms.categorical_histo_lt }, + 'end station name': { + is_numeric: false, + histogram: histograms.categorical_histo_lt, + }, tripduration: { is_numeric: true, is_integer: true, min_digits: 3, max_digits: 4, - histogram:histograms.num_histo + histogram: histograms.num_histo, + }, + 'start station name': { + is_numeric: false, + histogram: histograms.bool_histo, }, - 'start station name': { is_numeric: false, histogram: histograms.bool_histo }, floatCol: { is_numeric: true, is_integer: false, @@ -369,18 +366,17 @@ export const tableDf: DFWhole = { is_integer: true, min_digits: 1, max_digits: 3, - histogram:histograms.num_histo + histogram: histograms.num_histo, }, nanFloat: { is_numeric: true, is_integer: false, min_digits: 1, max_digits: 3, - histogram:histograms.num_histo + histogram: histograms.num_histo, }, nanObject: { is_numeric: false, - } - + }, }, }; From 7ba9f9be72ebfd662c5321bae6d5e0029a4ad924 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 13 Oct 2023 14:40:33 -0400 Subject: [PATCH 148/250] pluggable analysis improvements (#40) * renamed provided to provides... consistent with requires * tests for new method of getting col_hints * removed separate method for table hints * basic working reproduce test * tests for tricky python serialization * much better error reproduction hints * added quiet functionality for pluggable_analysis * updated introduction notebook showing built in unit testing of analysis and reproduction instructions * example notebook showing pain of regular summary stats * histograms docs updates --- README.md | 14 +- buckaroo/analysis.py | 14 +- buckaroo/analysis_management.py | 74 +- buckaroo/pluggable_analysis_framework.py | 38 +- buckaroo/serialization_utils.py | 48 + .../_static/histograms-categorical-1.png | Bin 0 -> 305847 bytes docs/source/_static/histograms-common.png | Bin 0 -> 276591 bytes docs/source/_static/histograms-numeric.png | Bin 0 -> 56452 bytes docs/source/articles/histograms.rst | 57 +- example-notebooks/Histograms-demo.ipynb | 241 ++ introduction.ipynb | 89 +- regular-summary-stats.ipynb | 3039 +++++++++++++++++ tests/analysis_management_test.py | 55 +- tests/basic_widget_test.py | 4 + tests/fixtures.py | 14 +- tests/pluggable_analysis_framework_test.py | 32 +- tests/serialization_utils_test.py | 9 + 17 files changed, 3607 insertions(+), 121 deletions(-) create mode 100644 buckaroo/serialization_utils.py create mode 100644 docs/source/_static/histograms-categorical-1.png create mode 100644 docs/source/_static/histograms-common.png create mode 100644 docs/source/_static/histograms-numeric.png create mode 100644 example-notebooks/Histograms-demo.ipynb create mode 100644 regular-summary-stats.ipynb create mode 100644 tests/serialization_utils_test.py diff --git a/README.md b/README.md index 6f0250259..f4670ef8e 100644 --- a/README.md +++ b/README.md @@ -223,7 +223,7 @@ git clone https://github.com/paddymul/buckaroo.git cd buckaroo #we need to build against 3.6.5, jupyterlab 4.0 has different JS typing that conflicts # the installable still works in JL4 -pip install build twine pytest jupyterlab==3.6.5 +pip install build twine pytest sphinx-build jupyterlab==3.6.5 pip install -ve . ``` @@ -238,6 +238,18 @@ jupyter labextension develop . --overwrite Note for developers: the `--symlink` argument on Linux or OS X allows one to modify the JavaScript code in-place. This feature is not available with Windows. ` +### Developing the JS side + +There are a series of examples of the components in [examples/ex](./examples/ex). + + + +Instructions +```bash +npm install +npm run dev +``` + ## Contributions diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index cbefe5603..707c90334 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -35,7 +35,7 @@ def get_mode(ser): """ class TypingStats(ColAnalysis): - provided_summary = [ + provides_summary = [ 'dtype', 'is_numeric', 'is_integer', 'is_datetime',] @staticmethod @@ -49,7 +49,7 @@ def summary(sampled_ser, summary_ser, ser): ) class DefaultSummaryStats(ColAnalysis): - provided_summary = [ + provides_summary = [ 'length', 'min', 'max', 'mean', 'nan_count', 'distinct_count', 'distinct_per', 'empty_count', 'empty_per', 'unique_per', 'nan_per', 'mode'] @@ -198,19 +198,13 @@ def histogram(ser, nan_per): class ColDisplayHints(ColAnalysis): requires_summary = ['min', 'max'] # What summary stats does this analysis provide - provided_summary = [] - - provides_hints = [ + provides_summary = [ 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram'] @staticmethod - def table_hints(sampled_ser, summary_ser, table_hint_col_dict): + def summary(sampled_ser, summary_ser, ser): is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype) is_bool = pd.api.types.is_bool_dtype(sampled_ser) - # if not is_numeric: - # return dict(is_numeric=False) - # if len(sampled_ser) == 0: - # return dict(is_numeric=False) base_dict = dict( is_numeric=is_numeric, is_integer=pd.api.types.is_integer_dtype(sampled_ser), diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py index 1a2cb4e6f..170a56b8a 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/analysis_management.py @@ -3,6 +3,7 @@ import traceback from buckaroo.pluggable_analysis_framework import ( ColAnalysis, order_analysis, check_solvable, NotProvidedException) +from buckaroo.serialization_utils import pd_py_serialize, pick, d_update FAST_SUMMARY_WHEN_GREATER = 1_000_000 @@ -12,13 +13,30 @@ 'all_True': [True] * 10, 'mixed_bool': np.concatenate([[True]*5, [False]*5]), 'mixed_float': np.concatenate([[0.5, np.nan, None], [6]*7]), - 'float': [0.5] *10, + 'float': [0.5]*10, 'int': [8] *10, - 'negative': [-1] *10, + 'negative': [-1]*10, 'UInt32': pd.Series([5]*10, dtype='UInt32'), 'UInt8None':pd.Series([None] * 10, dtype='UInt8') }) + +BASE_COL_HINT = { + 'is_numeric': False, + 'is_integer': None, + 'min_digits':None, + 'max_digits':None, + 'histogram': []} + +def reproduce_summary(ser_name, kls, summary_df): + summary_ser = summary_df[ser_name] + minimal_summary_dict = pick(summary_ser, kls.requires_summary) + sum_ser_repr = "pd.Series(%s)" % pd_py_serialize(minimal_summary_dict) + + print("%s.summary(PERVERSE_DF['%s'], %s, PERVERSE_DF['%s'])" % ( + kls.cname(), ser_name, sum_ser_repr, ser_name)) + + def produce_summary_df(df, ordered_objs, df_name='test_df'): """ takes a dataframe and a list of analyses that have been ordered by a graph sort, @@ -27,43 +45,56 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): errs = {} summary_col_dict = {} table_hint_col_dict = {} + #figure out how to add in "index"... but just for table_hints for ser_name in df.columns: ser = df[ser_name] - #fixme + #FIXME: actually sample the series. waiting until I have time + #to proeprly benchmark + sampled_ser = ser summary_ser = pd.Series({}, dtype='object') table_hint_dict = {} for a_kls in ordered_objs: try: - summary_res = a_kls.summary(ser, summary_ser, ser) + if a_kls.quiet or a_kls.quiet_warnings: + warnings.filterwarnings('ignore') + summary_res = a_kls.summary(ser, summary_ser, ser) + warnings.filterwarnings('default') + else: + summary_res = a_kls.summary(ser, summary_ser, ser) for k,v in summary_res.items(): summary_ser.loc[k] = v - th_dict = a_kls.table_hints(sampled_ser, summary_ser, table_hint_dict) - for k,v in th_dict.items(): - table_hint_dict[k] = v except Exception as e: - print("summary_ser", summary_ser) - errs[ser_name] = e, a_kls - traceback.print_exc() + if not a_kls.quiet: + errs[ser_name] = e, a_kls + #traceback.print_exc() continue summary_col_dict[ser_name] = summary_ser - table_hint_col_dict[ser_name] = table_hint_dict + + table_hint_col_dict[ser_name] = pick( + d_update(BASE_COL_HINT, summary_ser.to_dict()), + BASE_COL_HINT.keys()) + summary_df = pd.DataFrame(summary_col_dict) + table_hints = table_hint_col_dict if errs: for ser_name, err_kls in errs.items(): - err, kls = err_kls - print("%r failed on %s with %r" % (kls, ser_name, err)) - print("Reproduce") - print("from pluggable_analysis import test_ser") + err, kls = err_kls + print("%r failed on %s with %r" % (kls, ser_name, err)) + + print("Reproduction code") + print("-" * 80) + print("from buckaroo.analysis_management import PERVERSE_DF") for ser_name, err_kls in errs.items(): - err, kls = err_kls - print("%s.summary(test_ser.%s)" % (kls.__name__, ser_name)) - return pd.DataFrame(summary_col_dict), table_hint_col_dict, errs + err, kls = err_kls + reproduce_summary(ser_name, kls, summary_df) + print("-" * 80) + + return summary_df, table_hints, errs class NonExistentSummaryRowException(Exception): pass - class AnalsysisPipeline(object): """ manage the ordering of a set of col_analysis objects @@ -78,7 +109,7 @@ def __init__(self, analysis_objects, unit_test_objs=True): def process_summary_facts_set(self): all_provided = [] for a_obj in self.ordered_a_objs: - all_provided.extend(a_obj.provided_summary) + all_provided.extend(a_obj.provides_summary) if a_obj.summary_stats_display: self.summary_stats_display = a_obj.summary_stats_display @@ -88,7 +119,8 @@ def process_summary_facts_set(self): if self.summary_stats_display and not self.summary_stats_display == "all": #verify that we have a way of computing all of the facts we are displaying if not self.provided_summary_facts_set.issuperset(set(self.summary_stats_display)): - raise NonExistentSummaryRowException() + missing = set(self.summary_stats_display) - set(self.provided_summary_facts_set) + raise NonExistentSummaryRowException(missing) def verify_analysis_objects(self, analysis_objects): self.ordered_a_objs = order_analysis(analysis_objects) diff --git a/buckaroo/pluggable_analysis_framework.py b/buckaroo/pluggable_analysis_framework.py index 86f290831..b57944e76 100644 --- a/buckaroo/pluggable_analysis_framework.py +++ b/buckaroo/pluggable_analysis_framework.py @@ -10,11 +10,11 @@ class ColAnalysis(object): """ requires_raw = False requires_summary = [] # What summary stats does this analysis provide - provided_summary = [] # mean/max/histogram - provided_cleaning = None # or the name of the set of transforms this provides for column reordering - provides_table_hints = None # display hints provided ex 'red_negative' + provides_summary = [] # mean/max/histogram summary_stats_display = None - + quiet = False + quiet_warnings = False + @staticmethod def summary(sampled_ser, summary_ser, ser): return {} @@ -23,12 +23,6 @@ def summary(sampled_ser, summary_ser, ser): def column_order(sampled_ser, summary_ser): pass - @staticmethod - def cleaning(sampled_ser, summary_ser): - #I want this to emit Operations for consumption by the UI and - #possibly the transformed dataframe, not sure - pass - @staticmethod def table_hints(sampled_ser, summary_ser, existing_table_hints): return {} @@ -38,24 +32,22 @@ def cname(kls): #print(dir(kls)) return kls.__qualname__ - - class NotProvidedException(Exception): pass def check_solvable(a_objs): """ - checks taht all of the required inputs are provided by another analysis object. + checks that all of the required inputs are provided by another analysis object. """ - provided = [] + provides = [] required = [] for ao in a_objs: - provided.extend(ao.provided_summary) + provides.extend(ao.provides_summary) required.extend(ao.requires_summary) - all_provided = set(provided) + all_provides = set(provides) all_required = set(required) - if not all_required.issubset(all_provided): - missing = all_required - all_provided + if not all_required.issubset(all_provides): + missing = all_required - all_provides raise NotProvidedException("Missing provided analysis for %r" % missing) def remove_duplicates(lst): @@ -71,18 +63,18 @@ def clean_list(full_class_list): def order_analysis(a_objs): """order a set of col analysis objects such that the dag of their - provided_summary and requires_summary is ordered for computation + provides_summary and requires_summary is ordered for computation """ graph = {} key_class_objs = {} for ao in a_objs: - if len(ao.provided_summary) == 0: + if len(ao.provides_summary) == 0: temp_provided = "__no_provided_keys__" else: - temp_provided = ao.provided_summary[0] + temp_provided = ao.provides_summary[0] first_mid_key = mid_key = ao.__name__ + "###" + temp_provided - for k in ao.provided_summary[1:]: + for k in ao.provides_summary[1:]: #print("k", k) next_mid_key = ao.__name__ + "###" + k graph[mid_key] = set([next_mid_key]) @@ -90,7 +82,7 @@ def order_analysis(a_objs): mid_key = next_mid_key graph[mid_key] = set(ao.requires_summary) key_class_objs[mid_key] = ao - for j in ao.provided_summary: + for j in ao.provides_summary: #print("j", j) graph[j] = set([first_mid_key]) ts = graphlib.TopologicalSorter(graph) diff --git a/buckaroo/serialization_utils.py b/buckaroo/serialization_utils.py new file mode 100644 index 000000000..81bb187b0 --- /dev/null +++ b/buckaroo/serialization_utils.py @@ -0,0 +1,48 @@ +import numpy as np +import pandas as pd + +def d_update(d1, d2): + ret_dict = d1.copy() + ret_dict.update(d2) + return ret_dict + +def pick(dct, keys): + new_dict = {} + for k in keys: + new_dict[k] = dct[k] + return new_dict + + +def val_replace(dct, replacements): + ret_dict = {} + for k, v in dct.items(): + if v in replacements: + ret_dict[k] = replacements[v] + else: + ret_dict[k] = v + return ret_dict + +class UnquotedString(str): + pass + +def dict_repr(dct): + ret_str = "{" + for k, v in dct.items(): + ret_str += "'%s': " % k + if type(v) == UnquotedString: + ret_str += "%s, " % v + else: + ret_str += "%r, " % v + ret_str += "}" + return ret_str + +def pd_py_serialize(dct): + """ + This is used to output an exact string that is valid python code. + """ + + cleaned_dct = val_replace(dct, + {pd.NA: UnquotedString("pd.NA"), + np.nan: UnquotedString("np.nan")}) + return dict_repr(cleaned_dct) + diff --git a/docs/source/_static/histograms-categorical-1.png b/docs/source/_static/histograms-categorical-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e9e42d27d057e8f1774b28db952c21c12b22c8 GIT binary patch literal 305847 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

    F@#+wg8q`hp!o(W0O&TF#JAr^GFqV(F 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

    y&tVN8PXXrPS! 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

  • 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

    V8{Oj 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%0A4g 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/histograms-common.png b/docs/source/_static/histograms-common.png new file mode 100644 index 0000000000000000000000000000000000000000..4278f77ad39b32cd642e9912c98c5ec816750856 GIT binary patch literal 276591 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

    !%D?bKJ}^ZudZ}~;I371gKIY{1(Pgr?e9sVv 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

    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstarttimestoptimestart station idstart station namestart station latitudestart station longitudeend station idend station nameend station latitudeend station longitudebikeidusertypebirth yeargender
    04712014-01-01 00:00:062014-01-01 00:07:572009Catherine St & Monroe St40.711174-73.996826263Elizabeth St & Hester St40.717290-73.99637516379Subscriber19861
    114942014-01-01 00:00:382014-01-01 00:25:325361 Ave & E 30 St40.741444-73.975361259South St & Whitehall St40.701221-74.01234215611Subscriber19631
    24642014-01-01 00:03:592014-01-01 00:11:43228E 48 St & 3 Ave40.754601-73.9718792022E 59 St & Sutton Pl40.758491-73.95920616613Subscriber19911
    33732014-01-01 00:05:152014-01-01 00:11:28519Pershing Square N40.751884-73.977702526E 33 St & 5 Ave40.747659-73.98490715938Subscriber19891
    46602014-01-01 00:05:182014-01-01 00:16:1883Atlantic Ave & Fort Greene Pl40.683826-73.976323436Hancock St & Bedford Ave40.682166-73.95399019830Subscriber19901
    ................................................
    3003957802014-01-31 23:57:342014-02-01 00:10:34308St James Pl & Oliver St40.713079-73.998512312Allen St & E Houston St40.722055-73.98911117299Subscriber19881
    30039610742014-01-31 23:57:452014-02-01 00:15:39482W 15 St & 7 Ave40.739355-73.999318488W 39 St & 9 Ave40.756458-73.99372219886Subscriber19821
    3003971912014-01-31 23:58:162014-02-01 00:01:27247Perry St & Bleecker St40.735354-74.004831368Carmine St & 6 Ave40.730386-74.00215020249Subscriber19692
    30039810522014-01-31 23:58:342014-02-01 00:16:06482W 15 St & 7 Ave40.739355-73.999318488W 39 St & 9 Ave40.756458-73.99372219922Subscriber19812
    30039911332014-01-31 23:58:432014-02-01 00:17:36450W 49 St & 8 Ave40.762272-73.987882294Washington Square E40.730494-73.99572118944Subscriber19691
    \n", + "

    300400 rows × 15 columns

    \n", + "
    " + ], + "text/plain": [ + " tripduration starttime stoptime \\\n", + "0 471 2014-01-01 00:00:06 2014-01-01 00:07:57 \n", + "1 1494 2014-01-01 00:00:38 2014-01-01 00:25:32 \n", + "2 464 2014-01-01 00:03:59 2014-01-01 00:11:43 \n", + "3 373 2014-01-01 00:05:15 2014-01-01 00:11:28 \n", + "4 660 2014-01-01 00:05:18 2014-01-01 00:16:18 \n", + "... ... ... ... \n", + "300395 780 2014-01-31 23:57:34 2014-02-01 00:10:34 \n", + "300396 1074 2014-01-31 23:57:45 2014-02-01 00:15:39 \n", + "300397 191 2014-01-31 23:58:16 2014-02-01 00:01:27 \n", + "300398 1052 2014-01-31 23:58:34 2014-02-01 00:16:06 \n", + "300399 1133 2014-01-31 23:58:43 2014-02-01 00:17:36 \n", + "\n", + " start station id start station name \\\n", + "0 2009 Catherine St & Monroe St \n", + "1 536 1 Ave & E 30 St \n", + "2 228 E 48 St & 3 Ave \n", + "3 519 Pershing Square N \n", + "4 83 Atlantic Ave & Fort Greene Pl \n", + "... ... ... \n", + "300395 308 St James Pl & Oliver St \n", + "300396 482 W 15 St & 7 Ave \n", + "300397 247 Perry St & Bleecker St \n", + "300398 482 W 15 St & 7 Ave \n", + "300399 450 W 49 St & 8 Ave \n", + "\n", + " start station latitude start station longitude end station id \\\n", + "0 40.711174 -73.996826 263 \n", + "1 40.741444 -73.975361 259 \n", + "2 40.754601 -73.971879 2022 \n", + "3 40.751884 -73.977702 526 \n", + "4 40.683826 -73.976323 436 \n", + "... ... ... ... \n", + "300395 40.713079 -73.998512 312 \n", + "300396 40.739355 -73.999318 488 \n", + "300397 40.735354 -74.004831 368 \n", + "300398 40.739355 -73.999318 488 \n", + "300399 40.762272 -73.987882 294 \n", + "\n", + " end station name end station latitude end station longitude \\\n", + "0 Elizabeth St & Hester St 40.717290 -73.996375 \n", + "1 South St & Whitehall St 40.701221 -74.012342 \n", + "2 E 59 St & Sutton Pl 40.758491 -73.959206 \n", + "3 E 33 St & 5 Ave 40.747659 -73.984907 \n", + "4 Hancock St & Bedford Ave 40.682166 -73.953990 \n", + "... ... ... ... \n", + "300395 Allen St & E Houston St 40.722055 -73.989111 \n", + "300396 W 39 St & 9 Ave 40.756458 -73.993722 \n", + "300397 Carmine St & 6 Ave 40.730386 -74.002150 \n", + "300398 W 39 St & 9 Ave 40.756458 -73.993722 \n", + "300399 Washington Square E 40.730494 -73.995721 \n", + "\n", + " bikeid usertype birth year gender \n", + "0 16379 Subscriber 1986 1 \n", + "1 15611 Subscriber 1963 1 \n", + "2 16613 Subscriber 1991 1 \n", + "3 15938 Subscriber 1989 1 \n", + "4 19830 Subscriber 1990 1 \n", + "... ... ... ... ... \n", + "300395 17299 Subscriber 1988 1 \n", + "300396 19886 Subscriber 1982 1 \n", + "300397 20249 Subscriber 1969 2 \n", + "300398 19922 Subscriber 1981 2 \n", + "300399 18944 Subscriber 1969 1 \n", + "\n", + "[300400 rows x 15 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "183717a8-d476-4dd1-a024-8e33ff8cbcf1", + "metadata": {}, + "source": [ + "# Basic Dataframe exploration" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d5e43b62-a8ea-4d98-a9f2-f2cf97edcd83", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstarttimestoptimestart station idstart station namestart station latitudestart station longitudeend station idend station nameend station latitudeend station longitudebikeidusertypebirth yeargender
    04712014-01-01 00:00:062014-01-01 00:07:572009Catherine St & Monroe St40.711174-73.996826263Elizabeth St & Hester St40.717290-73.99637516379Subscriber19861
    114942014-01-01 00:00:382014-01-01 00:25:325361 Ave & E 30 St40.741444-73.975361259South St & Whitehall St40.701221-74.01234215611Subscriber19631
    24642014-01-01 00:03:592014-01-01 00:11:43228E 48 St & 3 Ave40.754601-73.9718792022E 59 St & Sutton Pl40.758491-73.95920616613Subscriber19911
    33732014-01-01 00:05:152014-01-01 00:11:28519Pershing Square N40.751884-73.977702526E 33 St & 5 Ave40.747659-73.98490715938Subscriber19891
    46602014-01-01 00:05:182014-01-01 00:16:1883Atlantic Ave & Fort Greene Pl40.683826-73.976323436Hancock St & Bedford Ave40.682166-73.95399019830Subscriber19901
    53302014-01-01 00:05:552014-01-01 00:11:25422W 59 St & 10 Ave40.770513-73.988038526E 33 St & 5 Ave40.747659-73.98490717343Subscriber19871
    62612014-01-01 00:06:042014-01-01 00:10:25516E 47 St & 1 Ave40.752069-73.967844167E 39 St & 3 Ave40.748901-73.97604917880Subscriber19831
    73372014-01-01 00:06:412014-01-01 00:12:18380W 4 St & 7 Ave S40.734011-74.002939435W 21 St & 6 Ave40.741740-73.99415616275Subscriber19631
    84292014-01-01 00:07:332014-01-01 00:14:42296Division St & Bowery40.714131-73.997047306Cliff St & Fulton St40.708235-74.00530117318Subscriber19722
    910252014-01-01 00:08:272014-01-01 00:25:32540Lexington Ave & E 26 St40.741473-73.9832094478 Ave & W 52 St40.763707-73.98516215525Subscriber19811
    107182014-01-01 00:09:322014-01-01 00:21:30263Elizabeth St & Hester St40.717290-73.996375251Mott St & Prince St40.723180-73.99480015693Customer\\N0
    117862014-01-01 00:10:592014-01-01 00:24:05153E 40 St & 5 Ave40.752062-73.9816322902 Ave & E 58 St40.760203-73.96478515281Subscriber19681
    122672014-01-01 00:11:172014-01-01 00:15:44151Cleveland Pl & Spring St40.721816-73.997203410Suffolk St & Stanton St40.720664-73.98518015159Subscriber19831
    137442014-01-01 00:12:232014-01-01 00:24:47450W 49 St & 8 Ave40.762272-73.9878825056 Ave & W 33 St40.749013-73.98848415157Subscriber19761
    147042014-01-01 00:12:252014-01-01 00:24:09331Pike St & Monroe St40.711731-73.991930195Liberty St & Broadway40.709056-74.01043417080Subscriber19802
    1513672014-01-01 00:12:472014-01-01 00:35:34519Pershing Square N40.751884-73.977702386Centre St & Worth St40.714948-74.00234520731Customer\\N0
    163272014-01-01 00:13:112014-01-01 00:18:38502Henry St & Grand St40.714215-73.981346411E 6 St & Avenue D40.722281-73.97668715655Subscriber19732
    172232014-01-01 00:15:302014-01-01 00:19:135282 Ave & E 31 St40.742909-73.977061518E 39 St & 2 Ave40.747804-73.97344215737Subscriber19821
    185772014-01-01 00:16:042014-01-01 00:25:41467Dean St & 4 Ave40.683125-73.978951270Adelphi St & Myrtle Ave40.693083-73.97178916115Subscriber19831
    195662014-01-01 00:16:132014-01-01 00:25:39467Dean St & 4 Ave40.683125-73.978951270Adelphi St & Myrtle Ave40.693083-73.97178915753Subscriber19832
    206372014-01-01 00:16:322014-01-01 00:27:09285Broadway & E 14 St40.734546-73.9907415056 Ave & W 33 St40.749013-73.98848415440Subscriber19811
    215132014-01-01 00:16:382014-01-01 00:25:11382University Pl & E 14 St40.734927-73.992005401Allen St & Rivington St40.720196-73.98997814650Subscriber19901
    224302014-01-01 00:18:472014-01-01 00:25:57285Broadway & E 14 St40.734546-73.990741380W 4 St & 7 Ave S40.734011-74.00293919415Subscriber19712
    238372014-01-01 00:18:542014-01-01 00:32:51488W 39 St & 9 Ave40.756458-73.993722380W 4 St & 7 Ave S40.734011-74.00293916827Subscriber19631
    248342014-01-01 00:19:032014-01-01 00:32:57488W 39 St & 9 Ave40.756458-73.993722380W 4 St & 7 Ave S40.734011-74.00293920280Subscriber19631
    \n", + "
    " + ], + "text/plain": [ + " tripduration starttime stoptime start station id \\\n", + "0 471 2014-01-01 00:00:06 2014-01-01 00:07:57 2009 \n", + "1 1494 2014-01-01 00:00:38 2014-01-01 00:25:32 536 \n", + "2 464 2014-01-01 00:03:59 2014-01-01 00:11:43 228 \n", + "3 373 2014-01-01 00:05:15 2014-01-01 00:11:28 519 \n", + "4 660 2014-01-01 00:05:18 2014-01-01 00:16:18 83 \n", + "5 330 2014-01-01 00:05:55 2014-01-01 00:11:25 422 \n", + "6 261 2014-01-01 00:06:04 2014-01-01 00:10:25 516 \n", + "7 337 2014-01-01 00:06:41 2014-01-01 00:12:18 380 \n", + "8 429 2014-01-01 00:07:33 2014-01-01 00:14:42 296 \n", + "9 1025 2014-01-01 00:08:27 2014-01-01 00:25:32 540 \n", + "10 718 2014-01-01 00:09:32 2014-01-01 00:21:30 263 \n", + "11 786 2014-01-01 00:10:59 2014-01-01 00:24:05 153 \n", + "12 267 2014-01-01 00:11:17 2014-01-01 00:15:44 151 \n", + "13 744 2014-01-01 00:12:23 2014-01-01 00:24:47 450 \n", + "14 704 2014-01-01 00:12:25 2014-01-01 00:24:09 331 \n", + "15 1367 2014-01-01 00:12:47 2014-01-01 00:35:34 519 \n", + "16 327 2014-01-01 00:13:11 2014-01-01 00:18:38 502 \n", + "17 223 2014-01-01 00:15:30 2014-01-01 00:19:13 528 \n", + "18 577 2014-01-01 00:16:04 2014-01-01 00:25:41 467 \n", + "19 566 2014-01-01 00:16:13 2014-01-01 00:25:39 467 \n", + "20 637 2014-01-01 00:16:32 2014-01-01 00:27:09 285 \n", + "21 513 2014-01-01 00:16:38 2014-01-01 00:25:11 382 \n", + "22 430 2014-01-01 00:18:47 2014-01-01 00:25:57 285 \n", + "23 837 2014-01-01 00:18:54 2014-01-01 00:32:51 488 \n", + "24 834 2014-01-01 00:19:03 2014-01-01 00:32:57 488 \n", + "\n", + " start station name start station latitude \\\n", + "0 Catherine St & Monroe St 40.711174 \n", + "1 1 Ave & E 30 St 40.741444 \n", + "2 E 48 St & 3 Ave 40.754601 \n", + "3 Pershing Square N 40.751884 \n", + "4 Atlantic Ave & Fort Greene Pl 40.683826 \n", + "5 W 59 St & 10 Ave 40.770513 \n", + "6 E 47 St & 1 Ave 40.752069 \n", + "7 W 4 St & 7 Ave S 40.734011 \n", + "8 Division St & Bowery 40.714131 \n", + "9 Lexington Ave & E 26 St 40.741473 \n", + "10 Elizabeth St & Hester St 40.717290 \n", + "11 E 40 St & 5 Ave 40.752062 \n", + "12 Cleveland Pl & Spring St 40.721816 \n", + "13 W 49 St & 8 Ave 40.762272 \n", + "14 Pike St & Monroe St 40.711731 \n", + "15 Pershing Square N 40.751884 \n", + "16 Henry St & Grand St 40.714215 \n", + "17 2 Ave & E 31 St 40.742909 \n", + "18 Dean St & 4 Ave 40.683125 \n", + "19 Dean St & 4 Ave 40.683125 \n", + "20 Broadway & E 14 St 40.734546 \n", + "21 University Pl & E 14 St 40.734927 \n", + "22 Broadway & E 14 St 40.734546 \n", + "23 W 39 St & 9 Ave 40.756458 \n", + "24 W 39 St & 9 Ave 40.756458 \n", + "\n", + " start station longitude end station id end station name \\\n", + "0 -73.996826 263 Elizabeth St & Hester St \n", + "1 -73.975361 259 South St & Whitehall St \n", + "2 -73.971879 2022 E 59 St & Sutton Pl \n", + "3 -73.977702 526 E 33 St & 5 Ave \n", + "4 -73.976323 436 Hancock St & Bedford Ave \n", + "5 -73.988038 526 E 33 St & 5 Ave \n", + "6 -73.967844 167 E 39 St & 3 Ave \n", + "7 -74.002939 435 W 21 St & 6 Ave \n", + "8 -73.997047 306 Cliff St & Fulton St \n", + "9 -73.983209 447 8 Ave & W 52 St \n", + "10 -73.996375 251 Mott St & Prince St \n", + "11 -73.981632 290 2 Ave & E 58 St \n", + "12 -73.997203 410 Suffolk St & Stanton St \n", + "13 -73.987882 505 6 Ave & W 33 St \n", + "14 -73.991930 195 Liberty St & Broadway \n", + "15 -73.977702 386 Centre St & Worth St \n", + "16 -73.981346 411 E 6 St & Avenue D \n", + "17 -73.977061 518 E 39 St & 2 Ave \n", + "18 -73.978951 270 Adelphi St & Myrtle Ave \n", + "19 -73.978951 270 Adelphi St & Myrtle Ave \n", + "20 -73.990741 505 6 Ave & W 33 St \n", + "21 -73.992005 401 Allen St & Rivington St \n", + "22 -73.990741 380 W 4 St & 7 Ave S \n", + "23 -73.993722 380 W 4 St & 7 Ave S \n", + "24 -73.993722 380 W 4 St & 7 Ave S \n", + "\n", + " end station latitude end station longitude bikeid usertype \\\n", + "0 40.717290 -73.996375 16379 Subscriber \n", + "1 40.701221 -74.012342 15611 Subscriber \n", + "2 40.758491 -73.959206 16613 Subscriber \n", + "3 40.747659 -73.984907 15938 Subscriber \n", + "4 40.682166 -73.953990 19830 Subscriber \n", + "5 40.747659 -73.984907 17343 Subscriber \n", + "6 40.748901 -73.976049 17880 Subscriber \n", + "7 40.741740 -73.994156 16275 Subscriber \n", + "8 40.708235 -74.005301 17318 Subscriber \n", + "9 40.763707 -73.985162 15525 Subscriber \n", + "10 40.723180 -73.994800 15693 Customer \n", + "11 40.760203 -73.964785 15281 Subscriber \n", + "12 40.720664 -73.985180 15159 Subscriber \n", + "13 40.749013 -73.988484 15157 Subscriber \n", + "14 40.709056 -74.010434 17080 Subscriber \n", + "15 40.714948 -74.002345 20731 Customer \n", + "16 40.722281 -73.976687 15655 Subscriber \n", + "17 40.747804 -73.973442 15737 Subscriber \n", + "18 40.693083 -73.971789 16115 Subscriber \n", + "19 40.693083 -73.971789 15753 Subscriber \n", + "20 40.749013 -73.988484 15440 Subscriber \n", + "21 40.720196 -73.989978 14650 Subscriber \n", + "22 40.734011 -74.002939 19415 Subscriber \n", + "23 40.734011 -74.002939 16827 Subscriber \n", + "24 40.734011 -74.002939 20280 Subscriber \n", + "\n", + " birth year gender \n", + "0 1986 1 \n", + "1 1963 1 \n", + "2 1991 1 \n", + "3 1989 1 \n", + "4 1990 1 \n", + "5 1987 1 \n", + "6 1983 1 \n", + "7 1963 1 \n", + "8 1972 2 \n", + "9 1981 1 \n", + "10 \\N 0 \n", + "11 1968 1 \n", + "12 1983 1 \n", + "13 1976 1 \n", + "14 1980 2 \n", + "15 \\N 0 \n", + "16 1973 2 \n", + "17 1982 1 \n", + "18 1983 1 \n", + "19 1983 2 \n", + "20 1981 1 \n", + "21 1990 1 \n", + "22 1971 2 \n", + "23 1963 1 \n", + "24 1963 1 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(25)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "bd6ccdd6-b2e6-4d7b-b824-12d01469a6f6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['tripduration', 'starttime', 'stoptime', 'start station id',\n", + " 'start station name', 'start station latitude',\n", + " 'start station longitude', 'end station id', 'end station name',\n", + " 'end station latitude', 'end station longitude', 'bikeid', 'usertype',\n", + " 'birth year', 'gender'],\n", + " dtype='object')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fa48ade1-86de-4fcd-84c0-2064a4a42b0a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstart station idstart station latitudestart station longitudeend station idend station latitudeend station longitudebikeidgender
    count3.004000e+05300400.000000300400.000000300400.000000300400.000000300400.000000300400.000000300400.000000300400.000000
    mean7.339689e+02436.93659840.734996-73.990135437.74276340.734814-73.99032817992.0820441.165632
    std5.271464e+03323.8956430.0194080.011779328.9314040.0193830.0118542000.8325640.431966
    min6.000000e+0172.00000040.680342-74.01713472.00000040.680342-74.01713414529.0000000.000000
    25%3.400000e+02306.00000040.722055-73.998102306.00000040.721816-73.99852216249.0000001.000000
    50%5.130000e+02406.00000040.737050-73.990093405.00000040.736529-73.99021417971.0000001.000000
    75%7.880000e+02490.00000040.750224-73.981854489.00000040.750200-73.98185419700.0000001.000000
    max1.990440e+063002.00000040.770513-73.9500483002.00000040.770513-73.95004821536.0000002.000000
    \n", + "
    " + ], + "text/plain": [ + " tripduration start station id start station latitude \\\n", + "count 3.004000e+05 300400.000000 300400.000000 \n", + "mean 7.339689e+02 436.936598 40.734996 \n", + "std 5.271464e+03 323.895643 0.019408 \n", + "min 6.000000e+01 72.000000 40.680342 \n", + "25% 3.400000e+02 306.000000 40.722055 \n", + "50% 5.130000e+02 406.000000 40.737050 \n", + "75% 7.880000e+02 490.000000 40.750224 \n", + "max 1.990440e+06 3002.000000 40.770513 \n", + "\n", + " start station longitude end station id end station latitude \\\n", + "count 300400.000000 300400.000000 300400.000000 \n", + "mean -73.990135 437.742763 40.734814 \n", + "std 0.011779 328.931404 0.019383 \n", + "min -74.017134 72.000000 40.680342 \n", + "25% -73.998102 306.000000 40.721816 \n", + "50% -73.990093 405.000000 40.736529 \n", + "75% -73.981854 489.000000 40.750200 \n", + "max -73.950048 3002.000000 40.770513 \n", + "\n", + " end station longitude bikeid gender \n", + "count 300400.000000 300400.000000 300400.000000 \n", + "mean -73.990328 17992.082044 1.165632 \n", + "std 0.011854 2000.832564 0.431966 \n", + "min -74.017134 14529.000000 0.000000 \n", + "25% -73.998522 16249.000000 1.000000 \n", + "50% -73.990214 17971.000000 1.000000 \n", + "75% -73.981854 19700.000000 1.000000 \n", + "max -73.950048 21536.000000 2.000000 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.describe()\n", + "# we can't edit this function\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "aad2dd62-c406-4cbc-a197-60906b365536", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstarttimestoptimestart station idstart station namestart station latitudestart station longitudeend station idend station nameend station latitudeend station longitudebikeidusertypebirth yeargender
    1637795052014-01-17 08:16:122014-01-17 08:24:3772W 52 St & 11 Ave40.767272-73.993929326E 11 St & 1 Ave40.729538-73.98426719234Subscriber19862
    1559874572014-01-16 18:02:012014-01-16 18:09:3872W 52 St & 11 Ave40.767272-73.993929510W 51 St & 6 Ave40.760660-73.98042020725Subscriber19841
    950898882014-01-13 10:20:022014-01-13 10:34:5072W 52 St & 11 Ave40.767272-73.993929462W 22 St & 10 Ave40.746920-74.00451915847Subscriber19592
    555635572014-01-09 18:13:562014-01-09 18:23:1372W 52 St & 11 Ave40.767272-73.993929405Washington St & Gansevoort St40.739323-74.00811915790Subscriber19711
    2035602312014-01-20 11:40:422014-01-20 11:44:3372W 52 St & 11 Ave40.767272-73.993929449W 52 St & 9 Ave40.764618-73.98789518405Subscriber19892
    ................................................
    15799411612014-01-16 19:03:382014-01-16 19:22:593002South End Ave & Liberty St40.711512-74.015756483E 12 St & 3 Ave40.732233-73.98890021097Subscriber19881
    2656824382014-01-29 09:23:152014-01-29 09:30:333002South End Ave & Liberty St40.711512-74.015756304Broadway & Battery Pl40.704633-74.01361719839Subscriber19821
    2655905032014-01-29 09:15:592014-01-29 09:24:223002South End Ave & Liberty St40.711512-74.015756152Warren St & Church St40.714740-74.00910619624Subscriber19772
    18343213232014-01-18 10:47:592014-01-18 11:10:023002South End Ave & Liberty St40.711512-74.015756435W 21 St & 6 Ave40.741740-73.99415617215Subscriber19682
    18564810302014-01-18 14:12:012014-01-18 14:29:113002South End Ave & Liberty St40.711512-74.01575672W 52 St & 11 Ave40.767272-73.99392921108Subscriber19841
    \n", + "

    300400 rows × 15 columns

    \n", + "
    " + ], + "text/plain": [ + " tripduration starttime stoptime \\\n", + "163779 505 2014-01-17 08:16:12 2014-01-17 08:24:37 \n", + "155987 457 2014-01-16 18:02:01 2014-01-16 18:09:38 \n", + "95089 888 2014-01-13 10:20:02 2014-01-13 10:34:50 \n", + "55563 557 2014-01-09 18:13:56 2014-01-09 18:23:13 \n", + "203560 231 2014-01-20 11:40:42 2014-01-20 11:44:33 \n", + "... ... ... ... \n", + "157994 1161 2014-01-16 19:03:38 2014-01-16 19:22:59 \n", + "265682 438 2014-01-29 09:23:15 2014-01-29 09:30:33 \n", + "265590 503 2014-01-29 09:15:59 2014-01-29 09:24:22 \n", + "183432 1323 2014-01-18 10:47:59 2014-01-18 11:10:02 \n", + "185648 1030 2014-01-18 14:12:01 2014-01-18 14:29:11 \n", + "\n", + " start station id start station name start station latitude \\\n", + "163779 72 W 52 St & 11 Ave 40.767272 \n", + "155987 72 W 52 St & 11 Ave 40.767272 \n", + "95089 72 W 52 St & 11 Ave 40.767272 \n", + "55563 72 W 52 St & 11 Ave 40.767272 \n", + "203560 72 W 52 St & 11 Ave 40.767272 \n", + "... ... ... ... \n", + "157994 3002 South End Ave & Liberty St 40.711512 \n", + "265682 3002 South End Ave & Liberty St 40.711512 \n", + "265590 3002 South End Ave & Liberty St 40.711512 \n", + "183432 3002 South End Ave & Liberty St 40.711512 \n", + "185648 3002 South End Ave & Liberty St 40.711512 \n", + "\n", + " start station longitude end station id \\\n", + "163779 -73.993929 326 \n", + "155987 -73.993929 510 \n", + "95089 -73.993929 462 \n", + "55563 -73.993929 405 \n", + "203560 -73.993929 449 \n", + "... ... ... \n", + "157994 -74.015756 483 \n", + "265682 -74.015756 304 \n", + "265590 -74.015756 152 \n", + "183432 -74.015756 435 \n", + "185648 -74.015756 72 \n", + "\n", + " end station name end station latitude \\\n", + "163779 E 11 St & 1 Ave 40.729538 \n", + "155987 W 51 St & 6 Ave 40.760660 \n", + "95089 W 22 St & 10 Ave 40.746920 \n", + "55563 Washington St & Gansevoort St 40.739323 \n", + "203560 W 52 St & 9 Ave 40.764618 \n", + "... ... ... \n", + "157994 E 12 St & 3 Ave 40.732233 \n", + "265682 Broadway & Battery Pl 40.704633 \n", + "265590 Warren St & Church St 40.714740 \n", + "183432 W 21 St & 6 Ave 40.741740 \n", + "185648 W 52 St & 11 Ave 40.767272 \n", + "\n", + " end station longitude bikeid usertype birth year gender \n", + "163779 -73.984267 19234 Subscriber 1986 2 \n", + "155987 -73.980420 20725 Subscriber 1984 1 \n", + "95089 -74.004519 15847 Subscriber 1959 2 \n", + "55563 -74.008119 15790 Subscriber 1971 1 \n", + "203560 -73.987895 18405 Subscriber 1989 2 \n", + "... ... ... ... ... ... \n", + "157994 -73.988900 21097 Subscriber 1988 1 \n", + "265682 -74.013617 19839 Subscriber 1982 1 \n", + "265590 -74.009106 19624 Subscriber 1977 2 \n", + "183432 -73.994156 17215 Subscriber 1968 2 \n", + "185648 -73.993929 21108 Subscriber 1984 1 \n", + "\n", + "[300400 rows x 15 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.sort_values('start station id')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c8ad24b4-a65c-4120-b78b-31be7991ba7f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tripduration int64\n", + "starttime object\n", + "stoptime object\n", + "start station id int64\n", + "start station name object\n", + "start station latitude float64\n", + "start station longitude float64\n", + "end station id int64\n", + "end station name object\n", + "end station latitude float64\n", + "end station longitude float64\n", + "bikeid int64\n", + "usertype object\n", + "birth year object\n", + "gender int64\n", + "dtype: object" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "6546e639-5293-4f5c-a6ce-6b9542f8b4c6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tripduration 0\n", + "starttime 0\n", + "stoptime 0\n", + "start station id 0\n", + "start station name 0\n", + "start station latitude 0\n", + "start station longitude 0\n", + "end station id 0\n", + "end station name 0\n", + "end station latitude 0\n", + "end station longitude 0\n", + "bikeid 0\n", + "usertype 0\n", + "birth year 0\n", + "gender 0\n", + "dtype: int64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "dab96c9c-b105-47e4-8781-db0148b7bbfd", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tripduration\n", + "385 512\n", + "350 505\n", + "382 502\n", + "376 499\n", + "374 497\n", + " ... \n", + "43227 1\n", + "11723 1\n", + "32886 1\n", + "3597 1\n", + "55504 1\n", + "Name: count, Length: 4502, dtype: int64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trip_d_counts = df['tripduration'].value_counts()\n", + "trip_d_counts" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "dac3af6d-7b54-4ce9-b7ef-07473ed63317", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1615" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trip_d_counts[trip_d_counts==1].sum() #durations that only happened once" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "74f69c57-d811-45fd-adc4-f30b1893cba6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tripduration starttime stoptime start station id start station name start station latitude start station longitude end station id end station name end station latitude end station longitude bikeid usertype birth year gender\n", + "60 2014-01-02 15:58:30 2014-01-02 15:59:30 492 W 33 St & 7 Ave 40.750200 -73.990931 492 W 33 St & 7 Ave 40.750200 -73.990931 16179 Subscriber 1986 1 1\n", + "671 2014-01-29 14:38:08 2014-01-29 14:49:19 472 E 32 St & Park Ave 40.745712 -73.981948 538 W 49 St & 5 Ave 40.757952 -73.977876 16002 Subscriber 1959 2 1\n", + " 2014-01-30 14:55:15 2014-01-30 15:06:26 367 E 53 St & Lexington Ave 40.758281 -73.970694 173 Broadway & W 49 St 40.760647 -73.984427 15672 Subscriber 1978 1 1\n", + " 2014-01-30 14:21:24 2014-01-30 14:32:35 531 Forsyth St & Broome St 40.718939 -73.992663 342 Columbia St & Rivington St 40.717400 -73.980166 16368 Subscriber 1982 2 1\n", + " 2014-01-30 14:02:25 2014-01-30 14:13:36 523 W 38 St & 8 Ave 40.754666 -73.991382 168 W 18 St & 6 Ave 40.739713 -73.994564 15657 Subscriber 1982 1 1\n", + " ..\n", + "395 2014-01-12 03:25:01 2014-01-12 03:31:36 465 Broadway & W 41 St 40.755136 -73.986580 498 Broadway & W 32 St 40.748549 -73.988084 20603 Subscriber 1989 1 1\n", + " 2014-01-11 22:36:28 2014-01-11 22:43:03 253 W 13 St & 5 Ave 40.735439 -73.994539 336 Sullivan St & Washington Sq 40.730477 -73.999061 20967 Subscriber 1983 1 1\n", + " 2014-01-11 20:26:23 2014-01-11 20:32:58 300 Shevchenko Pl & E 6 St 40.728145 -73.990214 317 E 6 St & Avenue B 40.724537 -73.981854 21050 Subscriber 1970 2 1\n", + " 2014-01-11 19:17:50 2014-01-11 19:24:25 310 State St & Smith St 40.689269 -73.989129 416 Cumberland St & Lafayette Ave 40.687534 -73.972652 16484 Subscriber 1967 1 1\n", + "1990440 2014-01-28 17:38:05 2014-02-20 18:32:08 524 W 43 St & 6 Ave 40.755273 -73.983169 152 Warren St & Church St 40.714740 -74.009106 15132 Subscriber 1980 1 1\n", + "Name: count, Length: 300400, dtype: int64" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ab = df.value_counts()\n", + "ab" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "0a45badb-8a1d-4527-b078-dae580e7b0d9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tripduration 4502\n", + "starttime 266586\n", + "stoptime 267463\n", + "start station id 329\n", + "start station name 329\n", + "start station latitude 329\n", + "start station longitude 329\n", + "end station id 329\n", + "end station name 329\n", + "end station latitude 329\n", + "end station longitude 329\n", + "bikeid 6354\n", + "usertype 2\n", + "birth year 79\n", + "gender 3\n", + "dtype: int64" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.Series(dict([[col, len(df[col].value_counts())] for col in df.columns]))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3e7589c2-bb34-477b-b1a6-e69485dbc7c4", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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k5WZmal//vOfAXPDhw/X559/bn+98cYb30acCwo2o/TNX0E9d/1///vfA/Y3p+sYbL4//OEPAdn27t2riIgIPfDAAwFzzekaVlVVacCAASooKGjQ/KFDh5SVlaWhQ4eqvLxceXl5mjBhQkBZuJLvi8YSbL6tW7dq2LBh2rhxo8rKyjR06FDde++92r17d8Bc3759A67he++91xjLb5BgM9Y5cOBAQIaOHTva+5rTNZSCz7hkyZKAbP/4xz/Url27ej+LzeU6btmyRTk5Odq+fbvcbrf8fr8yMzNVVVV10fs06e9FC1dt8ODBVk5Ojn27pqbGSkpKsubNm3fB+R//+MdWVlZWwLa0tDTr3/7t3yzLsqza2lorMTHR+uUvf2nvP378uBUdHW298cYbjZDg8oLNeL6zZ89arVu3tlasWGFvy87Otu67775QL/WKBZtx+fLlVnx8/EWP19yu49Vew8WLF1utW7e2Tp06ZW9rbtfwXJKstWvXXnJm6tSpVt++fQO2jR492nK5XPbtqz1vjaUh+S6kT58+1uzZs+3bM2fOtAYMGBC6hYVQQzK+++67liTrq6++uuhMc72GlnVl13Ht2rVWWFiY9be//c3e1pyv49GjRy1J1pYtWy4605S/F3lG6CpVV1errKxMGRkZ9rbw8HBlZGTI4/Fc8D4ejydgXpJcLpc9f+jQIXm93oCZ+Ph4paWlXfSYjelKMp7v9OnT8vv9ateuXcD20tJSdezYUT179tSkSZP05ZdfhnTtDXWlGU+dOqWuXbsqOTlZ9913n/bt22fva07XMRTX8NVXX9WYMWPUqlWrgO3N5Rpeicv9LIbivDUntbW1OnnyZL2fw08++URJSUm67rrr9NBDD+nw4cNNtMIrN3DgQHXq1EnDhg3T+++/b2932jWUvvlZzMjIUNeuXQO2N9freOLECUmq9313rqb8vUgRukr/+te/VFNTU+8vVSckJNR7jbqO1+u95Hzd/w3mmI3pSjKe78knn1RSUlLAN/Hw4cP12muvqaSkRM8995y2bNmiESNGqKamJqTrb4grydizZ08tW7ZMb731ln7729+qtrZWt956qz777DNJzes6Xu013Llzp/bu3asJEyYEbG9O1/BKXOxnsbKyUl9//XVIvvebkwULFujUqVP68Y9/bG9LS0tTYWGhioqK9PLLL+vQoUO64447dPLkySZcacN16tRJS5cu1e9//3v9/ve/V3JysoYMGaJdu3ZJCs3/fjUnR44c0Z/+9Kd6P4vN9TrW1tYqLy9Pt912m2644YaLzjXl70XH/xMbaHrPPvus3nzzTZWWlga8mXjMmDH2f/fr10/9+/dX9+7dVVpaqrvvvrsplhqU9PT0gH+899Zbb1Xv3r31X//1X5o7d24Triz0Xn31VfXr10+DBw8O2P5dv4YmWblypWbPnq233nor4P0zI0aMsP+7f//+SktLU9euXbV69WqNHz++KZYalJ49e6pnz5727VtvvVUHDx7U4sWL9d///d9NuLLGsWLFCrVp00YjR44M2N5cr2NOTo727t3bpO87uxyeEbpKHTp0UEREhCoqKgK2V1RUKDEx8YL3SUxMvOR83f8N5piN6Uoy1lmwYIGeffZZFRcXq3///pecve6669ShQwd9+umnV73mYF1NxjqRkZG68cYb7fU3p+t4Nfmqqqr05ptvNuh/TJvyGl6Ji/0sxsXFqWXLliH5vmgO3nzzTU2YMEGrV6+u9/LD+dq0aaPrr7/+O3MNL2Tw4MH2+p1yDaVvPjW1bNkyjR07VlFRUZecbQ7XMTc3V+vXr9e7776rzp07X3K2KX8vUoSuUlRUlFJTU1VSUmJvq62tVUlJScCzBedKT08PmJckt9ttz6ekpCgxMTFgprKyUjt27LjoMRvTlWSUvnmH/9y5c1VUVKRBgwZd9nE+++wzffnll+rUqVNI1h2MK814rpqaGu3Zs8def3O6jleTb82aNfL5fPrpT3962cdpymt4JS73sxiK74um9sYbb2jcuHF64403Av70wcWcOnVKBw8e/M5cwwspLy+31++Ea1hny5Yt+vTTTxv0/5Q05XW0LEu5ublau3atNm/erJSUlMvep0l/L17VW61hWZZlvfnmm1Z0dLRVWFhoffTRR9ajjz5qtWnTxvJ6vZZlWdbYsWOtp556yp5///33rRYtWlgLFiywPv74Y2vmzJlWZGSktWfPHnvm2Weftdq0aWO99dZb1ocffmjdd999VkpKivX1119/6/ksK/iMzz77rBUVFWX97ne/sz7//HP76+TJk5ZlWdbJkyetn//855bH47EOHTpkvfPOO9ZNN91kff/737fOnDnzncg4e/Zsa9OmTdbBgwetsrIya8yYMVZMTIy1b98+e6Y5Xcdg89W5/fbbrdGjR9fb3hyv4cmTJ63du3dbu3fvtiRZixYtsnbv3m39/e9/tyzLsp566ilr7Nix9vxf//pXKzY21poyZYr18ccfWwUFBVZERIRVVFRkz1zuvDXnfK+//rrVokULq6CgIODn8Pjx4/bMv//7v1ulpaXWoUOHrPfff9/KyMiwOnToYB09evRbz2dZwWdcvHixtW7dOuuTTz6x9uzZYz3xxBNWeHi49c4779gzzekaWlbwGev89Kc/tdLS0i54zOZ0HSdNmmTFx8dbpaWlAd93p0+ftmea0+9FilCI/OpXv7K6dOliRUVFWYMHD7a2b99u7/vBD35gZWdnB8yvXr3auv76662oqCirb9++1oYNGwL219bWWk8//bSVkJBgRUdHW3fffbd14MCBbyPKRQWTsWvXrpakel8zZ860LMuyTp8+bWVmZlrXXnutFRkZaXXt2tWaOHFik/0PU51gMubl5dmzCQkJ1j333GPt2rUr4HjN7ToG+326f/9+S5JVXFxc71jN8RrWfZT6/K+6XNnZ2dYPfvCDevcZOHCgFRUVZV133XXW8uXL6x33Uuft2xRsvh/84AeXnLesb/5cQKdOnayoqCjre9/7njV69Gjr008//XaDnSPYjM8995zVvXt3KyYmxmrXrp01ZMgQa/PmzfWO21yuoWVd2ffp8ePHrZYtW1q//vWvL3jM5nQdL5RNUsDPVnP6vRj2/xcNAABgHN4jBAAAjEURAgAAxqIIAQAAY1GEAACAsShCAADAWBQhAABgLIoQAAAwFkUIAAB867Zu3ap7771XSUlJCgsL07p164I+hmVZWrBgga6//npFR0fre9/7nv7zP/8zqGPwr88DAIBvXVVVlQYMGKBHHnlE999//xUd44knnlBxcbEWLFigfv366dixYzp27FhQx+AvSwMAgCYVFhamtWvXauTIkfY2n8+n//iP/9Abb7yh48eP64YbbtBzzz2nIUOGSJI+/vhj9e/fX3v37lXPnj2v+LF5aQwAADQ7ubm58ng8evPNN/Xhhx/qgQce0PDhw/XJJ59Ikt5++21dd911Wr9+vVJSUtStWzdNmDAh6GeEKEIAAKBZOXz4sJYvX641a9bojjvuUPfu3fXzn/9ct99+u5YvXy5J+utf/6q///3vWrNmjV577TUVFhaqrKxMP/rRj4J6LN4jBAAAmpU9e/aopqZG119/fcB2n8+n9u3bS5Jqa2vl8/n02muv2XOvvvqqUlNTdeDAgQa/XEYRAgAAzcqpU6cUERGhsrIyRUREBOy75pprJEmdOnVSixYtAspS7969JX3zjBJFCAAAfCfdeOONqqmp0dGjR3XHHXdccOa2227T2bNndfDgQXXv3l2S9L//+7+SpK5duzb4sfjUGAAA+NadOnVKn376qaRvis+iRYs0dOhQtWvXTl26dNFPf/pTvf/++1q4cKFuvPFGffHFFyopKVH//v2VlZWl2tpa3Xzzzbrmmmv0/PPPq7a2Vjk5OYqLi1NxcXGD10ERAgAA37rS0lINHTq03vbs7GwVFhbK7/frmWee0WuvvaZ//vOf6tChg2655RbNnj1b/fr1kyQdOXJEjz/+uIqLi9WqVSuNGDFCCxcuVLt27Rq8DooQAAAwFh+fBwAAxqIIAQAAY1GEAACAsShCAADAWBQhAABgLIoQAAAwFkUIAAAYiyIEAACMRRECAADGoggBAABjUYQAAICxKEIAAMBY/w8KcfRfIHEI/wAAAABJRU5ErkJggg==", + "text/plain": [ + "
    " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df['tripduration'].hist()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cabf81db-6c49-4274-8460-770405d1a405", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'nan_count': 0,\n", + " 'distinct_count': 1615,\n", + " 'min': 60,\n", + " 'mean': 733.9689447403462,\n", + " 'max': 1990440,\n", + " 'dtype': dtype('int64')}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def col_stats(ser):\n", + " l = len(ser)\n", + " values = ser.value_counts()\n", + " return dict(\n", + " nan_count = ser.isna().sum(),\n", + " distinct_count = values[values == 1].sum(),\n", + " min = ser.min(),\n", + " mean = ser.mean(),\n", + " max = ser.max(),\n", + " dtype = ser.dtype)\n", + "col_stats(df['tripduration'])" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "21d22855-7f52-41ab-b3a8-4e23b77f2e76", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "sampled_df = df.sample(50) # grab 50 random rows" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "15bdaf26-09c0-4350-bfec-0db1362a79f5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "Could not convert string '2014-01-11 07:18:292014-01-17 22:35:122014-01-25 23:03:312014-01-07 13:06:052014-01-18 09:41:582014-01-27 14:58:362014-01-08 10:36:522014-01-02 19:19:522014-01-03 08:03:132014-01-20 16:58:002014-01-14 16:43:132014-01-17 06:27:252014-01-18 11:17:332014-01-15 17:08:142014-01-13 11:40:182014-01-30 17:19:182014-01-26 03:06:292014-01-29 17:51:082014-01-17 09:03:482014-01-19 13:09:322014-01-08 08:58:282014-01-15 12:35:342014-01-30 19:19:502014-01-23 08:49:162014-01-16 15:59:092014-01-10 20:00:442014-01-28 18:24:372014-01-01 18:58:342014-01-17 18:49:252014-01-16 11:56:452014-01-14 07:16:082014-01-12 09:43:542014-01-31 15:24:332014-01-22 18:25:162014-01-20 17:55:582014-01-06 17:52:012014-01-12 10:25:442014-01-26 19:37:262014-01-20 06:37:262014-01-11 00:22:172014-01-15 16:36:232014-01-06 17:39:112014-01-15 15:12:582014-01-10 09:13:292014-01-26 11:27:172014-01-27 07:40:552014-01-27 06:50:092014-01-31 16:31:512014-01-06 19:05:402014-01-27 18:30:28' to numeric", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[20], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m pd\u001b[38;5;241m.\u001b[39mDataFrame(\u001b[38;5;28mdict\u001b[39m(\u001b[43m[\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcol_stats\u001b[49m\u001b[43m(\u001b[49m\u001b[43msampled_df\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43msampled_df\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[43m]\u001b[49m))\n", + "Cell \u001b[0;32mIn[20], line 1\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[0;32m----> 1\u001b[0m pd\u001b[38;5;241m.\u001b[39mDataFrame(\u001b[38;5;28mdict\u001b[39m([[col, \u001b[43mcol_stats\u001b[49m\u001b[43m(\u001b[49m\u001b[43msampled_df\u001b[49m\u001b[43m[\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m] \u001b[38;5;28;01mfor\u001b[39;00m col \u001b[38;5;129;01min\u001b[39;00m sampled_df\u001b[38;5;241m.\u001b[39mcolumns]))\n", + "Cell \u001b[0;32mIn[18], line 8\u001b[0m, in \u001b[0;36mcol_stats\u001b[0;34m(ser)\u001b[0m\n\u001b[1;32m 2\u001b[0m l \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(ser)\n\u001b[1;32m 3\u001b[0m values \u001b[38;5;241m=\u001b[39m ser\u001b[38;5;241m.\u001b[39mvalue_counts()\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mdict\u001b[39m(\n\u001b[1;32m 5\u001b[0m nan_count \u001b[38;5;241m=\u001b[39m ser\u001b[38;5;241m.\u001b[39misna()\u001b[38;5;241m.\u001b[39msum(),\n\u001b[1;32m 6\u001b[0m distinct_count \u001b[38;5;241m=\u001b[39m values[values \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m.\u001b[39msum(),\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28mmin\u001b[39m \u001b[38;5;241m=\u001b[39m ser\u001b[38;5;241m.\u001b[39mmin(),\n\u001b[0;32m----> 8\u001b[0m mean \u001b[38;5;241m=\u001b[39m \u001b[43mser\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmean\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mmax\u001b[39m \u001b[38;5;241m=\u001b[39m ser\u001b[38;5;241m.\u001b[39mmax(),\n\u001b[1;32m 10\u001b[0m dtype \u001b[38;5;241m=\u001b[39m ser\u001b[38;5;241m.\u001b[39mdtype)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/series.py:6221\u001b[0m, in \u001b[0;36mSeries.mean\u001b[0;34m(self, axis, skipna, numeric_only, **kwargs)\u001b[0m\n\u001b[1;32m 6213\u001b[0m \u001b[38;5;129m@doc\u001b[39m(make_doc(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmean\u001b[39m\u001b[38;5;124m\"\u001b[39m, ndim\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m))\n\u001b[1;32m 6214\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmean\u001b[39m(\n\u001b[1;32m 6215\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 6219\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m 6220\u001b[0m ):\n\u001b[0;32m-> 6221\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mNDFrame\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmean\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnumeric_only\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/generic.py:11978\u001b[0m, in \u001b[0;36mNDFrame.mean\u001b[0;34m(self, axis, skipna, numeric_only, **kwargs)\u001b[0m\n\u001b[1;32m 11971\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mmean\u001b[39m(\n\u001b[1;32m 11972\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 11973\u001b[0m axis: Axis \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 11976\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[1;32m 11977\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Series \u001b[38;5;241m|\u001b[39m \u001b[38;5;28mfloat\u001b[39m:\n\u001b[0;32m> 11978\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_stat_function\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 11979\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmean\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnanops\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mnanmean\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnumeric_only\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 11980\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/generic.py:11935\u001b[0m, in \u001b[0;36mNDFrame._stat_function\u001b[0;34m(self, name, func, axis, skipna, numeric_only, **kwargs)\u001b[0m\n\u001b[1;32m 11931\u001b[0m nv\u001b[38;5;241m.\u001b[39mvalidate_func(name, (), kwargs)\n\u001b[1;32m 11933\u001b[0m validate_bool_kwarg(skipna, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mskipna\u001b[39m\u001b[38;5;124m\"\u001b[39m, none_allowed\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[0;32m> 11935\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_reduce\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 11936\u001b[0m \u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mskipna\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnumeric_only\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnumeric_only\u001b[49m\n\u001b[1;32m 11937\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/series.py:6129\u001b[0m, in \u001b[0;36mSeries._reduce\u001b[0;34m(self, op, name, axis, skipna, numeric_only, filter_type, **kwds)\u001b[0m\n\u001b[1;32m 6124\u001b[0m \u001b[38;5;66;03m# GH#47500 - change to TypeError to match other methods\u001b[39;00m\n\u001b[1;32m 6125\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 6126\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSeries.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m does not allow \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkwd_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mnumeric_only\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 6127\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwith non-numeric dtypes.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 6128\u001b[0m )\n\u001b[0;32m-> 6129\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mop\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdelegate\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mskipna\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/nanops.py:147\u001b[0m, in \u001b[0;36mbottleneck_switch.__call__..f\u001b[0;34m(values, axis, skipna, **kwds)\u001b[0m\n\u001b[1;32m 145\u001b[0m result \u001b[38;5;241m=\u001b[39m alt(values, axis\u001b[38;5;241m=\u001b[39maxis, skipna\u001b[38;5;241m=\u001b[39mskipna, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 146\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 147\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43malt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mskipna\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 149\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/nanops.py:404\u001b[0m, in \u001b[0;36m_datetimelike_compat..new_func\u001b[0;34m(values, axis, skipna, mask, **kwargs)\u001b[0m\n\u001b[1;32m 401\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m datetimelike \u001b[38;5;129;01mand\u001b[39;00m mask \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 402\u001b[0m mask \u001b[38;5;241m=\u001b[39m isna(values)\n\u001b[0;32m--> 404\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalues\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mskipna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mskipna\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmask\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 406\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m datetimelike:\n\u001b[1;32m 407\u001b[0m result \u001b[38;5;241m=\u001b[39m _wrap_results(result, orig_values\u001b[38;5;241m.\u001b[39mdtype, fill_value\u001b[38;5;241m=\u001b[39miNaT)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/nanops.py:720\u001b[0m, in \u001b[0;36mnanmean\u001b[0;34m(values, axis, skipna, mask)\u001b[0m\n\u001b[1;32m 718\u001b[0m count \u001b[38;5;241m=\u001b[39m _get_counts(values\u001b[38;5;241m.\u001b[39mshape, mask, axis, dtype\u001b[38;5;241m=\u001b[39mdtype_count)\n\u001b[1;32m 719\u001b[0m the_sum \u001b[38;5;241m=\u001b[39m values\u001b[38;5;241m.\u001b[39msum(axis, dtype\u001b[38;5;241m=\u001b[39mdtype_sum)\n\u001b[0;32m--> 720\u001b[0m the_sum \u001b[38;5;241m=\u001b[39m \u001b[43m_ensure_numeric\u001b[49m\u001b[43m(\u001b[49m\u001b[43mthe_sum\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 722\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m axis \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(the_sum, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mndim\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m):\n\u001b[1;32m 723\u001b[0m count \u001b[38;5;241m=\u001b[39m cast(np\u001b[38;5;241m.\u001b[39mndarray, count)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-1/lib/python3.11/site-packages/pandas/core/nanops.py:1693\u001b[0m, in \u001b[0;36m_ensure_numeric\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1690\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (is_float(x) \u001b[38;5;129;01mor\u001b[39;00m is_integer(x) \u001b[38;5;129;01mor\u001b[39;00m is_complex(x)):\n\u001b[1;32m 1691\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(x, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 1692\u001b[0m \u001b[38;5;66;03m# GH#44008, GH#36703 avoid casting e.g. strings to numeric\u001b[39;00m\n\u001b[0;32m-> 1693\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCould not convert string \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mx\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to numeric\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1694\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 1695\u001b[0m x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mfloat\u001b[39m(x)\n", + "\u001b[0;31mTypeError\u001b[0m: Could not convert string '2014-01-11 07:18:292014-01-17 22:35:122014-01-25 23:03:312014-01-07 13:06:052014-01-18 09:41:582014-01-27 14:58:362014-01-08 10:36:522014-01-02 19:19:522014-01-03 08:03:132014-01-20 16:58:002014-01-14 16:43:132014-01-17 06:27:252014-01-18 11:17:332014-01-15 17:08:142014-01-13 11:40:182014-01-30 17:19:182014-01-26 03:06:292014-01-29 17:51:082014-01-17 09:03:482014-01-19 13:09:322014-01-08 08:58:282014-01-15 12:35:342014-01-30 19:19:502014-01-23 08:49:162014-01-16 15:59:092014-01-10 20:00:442014-01-28 18:24:372014-01-01 18:58:342014-01-17 18:49:252014-01-16 11:56:452014-01-14 07:16:082014-01-12 09:43:542014-01-31 15:24:332014-01-22 18:25:162014-01-20 17:55:582014-01-06 17:52:012014-01-12 10:25:442014-01-26 19:37:262014-01-20 06:37:262014-01-11 00:22:172014-01-15 16:36:232014-01-06 17:39:112014-01-15 15:12:582014-01-10 09:13:292014-01-26 11:27:172014-01-27 07:40:552014-01-27 06:50:092014-01-31 16:31:512014-01-06 19:05:402014-01-27 18:30:28' to numeric" + ] + } + ], + "source": [ + "pd.DataFrame(dict([[col, col_stats(sampled_df[col])] for col in sampled_df.columns]))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "30b99e5c-c8b2-496c-822b-b15198e22616", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstarttimestoptimestart station idstart station namestart station latitudestart station longitudeend station idend station nameend station latitudeend station longitudebikeidusertypebirth yeargender
    nan_count000000000000000
    distinct_count4850462323232328282828480170
    dtypeint64objectobjectint64objectfloat64float64int64objectfloat64float64int64objectobjectint64
    min128NaNNaN83NaN40.683125-74.015756127NaN40.682166-74.01234214650NaNNaN0
    mean720.24NaNNaN572.3NaN40.73296-73.98873400.14NaN40.730918-73.99000317363.68NaNNaN0.98
    max1957NaNNaN3002NaN40.770513-73.9678442022NaN40.763707-73.9539921183NaNNaN2
    \n", + "
    " + ], + "text/plain": [ + " tripduration starttime stoptime start station id \\\n", + "nan_count 0 0 0 0 \n", + "distinct_count 48 50 46 23 \n", + "dtype int64 object object int64 \n", + "min 128 NaN NaN 83 \n", + "mean 720.24 NaN NaN 572.3 \n", + "max 1957 NaN NaN 3002 \n", + "\n", + " start station name start station latitude \\\n", + "nan_count 0 0 \n", + "distinct_count 23 23 \n", + "dtype object float64 \n", + "min NaN 40.683125 \n", + "mean NaN 40.73296 \n", + "max NaN 40.770513 \n", + "\n", + " start station longitude end station id end station name \\\n", + "nan_count 0 0 0 \n", + "distinct_count 23 28 28 \n", + "dtype float64 int64 object \n", + "min -74.015756 127 NaN \n", + "mean -73.98873 400.14 NaN \n", + "max -73.967844 2022 NaN \n", + "\n", + " end station latitude end station longitude bikeid usertype \\\n", + "nan_count 0 0 0 0 \n", + "distinct_count 28 28 48 0 \n", + "dtype float64 float64 int64 object \n", + "min 40.682166 -74.012342 14650 NaN \n", + "mean 40.730918 -73.990003 17363.68 NaN \n", + "max 40.763707 -73.95399 21183 NaN \n", + "\n", + " birth year gender \n", + "nan_count 0 0 \n", + "distinct_count 17 0 \n", + "dtype object int64 \n", + "min NaN 0 \n", + "mean NaN 0.98 \n", + "max NaN 2 " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "def col_stats(ser):\n", + " l = len(ser)\n", + " values = ser.value_counts()\n", + " base_stats = dict(\n", + " nan_count = ser.isna().sum(),\n", + " distinct_count = values[values == 1].sum(),\n", + " dtype = ser.dtype)\n", + " if pd.api.types.is_numeric_dtype(ser):\n", + " base_stats.update(dict(\n", + " min = ser.min(),\n", + " mean = ser.mean(),\n", + " max = ser.max()))\n", + " return base_stats\n", + "def summary(df):\n", + " #we'll start with the first 50 rows as a smoke test\n", + " small_df = df.iloc[:50]\n", + " return pd.DataFrame(dict([[col, col_stats(small_df[col])] for col in small_df.columns]))\n", + "summary(df)" + ] + }, + { + "cell_type": "markdown", + "id": "243d392e-1820-446a-80ae-8552da26d6b1", + "metadata": {}, + "source": [ + "# ok let's add mode" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "0c9c5725-212f-4186-b863-ac403ef7b4a9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstarttimestoptimestart station idstart station namestart station latitudestart station longitudeend station idend station nameend station latitudeend station longitudebikeidusertypebirth yeargender
    nan_count000000000000000
    distinct_count4850462323232328282828480170
    dtypeint64objectobjectint64objectfloat64float64int64objectfloat64float64int64objectobjectint64
    min128NaNNaN83NaN40.683125-74.015756127NaN40.682166-74.01234214650NaNNaN0
    mean720.24NaNNaN572.3NaN40.73296-73.98873400.14NaN40.730918-73.99000317363.68NaNNaN0.98
    max1957NaNNaN3002NaN40.770513-73.9678442022NaN40.763707-73.9539921183NaNNaN2
    mode513NaNNaN422NaN40.770513-73.988038380NaN40.734011-74.00550915693NaNNaN1
    \n", + "
    " + ], + "text/plain": [ + " tripduration starttime stoptime start station id \\\n", + "nan_count 0 0 0 0 \n", + "distinct_count 48 50 46 23 \n", + "dtype int64 object object int64 \n", + "min 128 NaN NaN 83 \n", + "mean 720.24 NaN NaN 572.3 \n", + "max 1957 NaN NaN 3002 \n", + "mode 513 NaN NaN 422 \n", + "\n", + " start station name start station latitude \\\n", + "nan_count 0 0 \n", + "distinct_count 23 23 \n", + "dtype object float64 \n", + "min NaN 40.683125 \n", + "mean NaN 40.73296 \n", + "max NaN 40.770513 \n", + "mode NaN 40.770513 \n", + "\n", + " start station longitude end station id end station name \\\n", + "nan_count 0 0 0 \n", + "distinct_count 23 28 28 \n", + "dtype float64 int64 object \n", + "min -74.015756 127 NaN \n", + "mean -73.98873 400.14 NaN \n", + "max -73.967844 2022 NaN \n", + "mode -73.988038 380 NaN \n", + "\n", + " end station latitude end station longitude bikeid usertype \\\n", + "nan_count 0 0 0 0 \n", + "distinct_count 28 28 48 0 \n", + "dtype float64 float64 int64 object \n", + "min 40.682166 -74.012342 14650 NaN \n", + "mean 40.730918 -73.990003 17363.68 NaN \n", + "max 40.763707 -73.95399 21183 NaN \n", + "mode 40.734011 -74.005509 15693 NaN \n", + "\n", + " birth year gender \n", + "nan_count 0 0 \n", + "distinct_count 17 0 \n", + "dtype object int64 \n", + "min NaN 0 \n", + "mean NaN 0.98 \n", + "max NaN 2 \n", + "mode NaN 1 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def col_stats(ser):\n", + " l = len(ser)\n", + " values = ser.value_counts()\n", + " base_stats = dict(\n", + " nan_count = ser.isna().sum(),\n", + " distinct_count = values[values == 1].sum(),\n", + " dtype = ser.dtype)\n", + " if pd.api.types.is_numeric_dtype(ser):\n", + " base_stats.update(dict(\n", + " min = ser.min(),\n", + " mean = ser.mean(),\n", + " max = ser.max(),\n", + " mode = ser.mode()[0]\n", + " ))\n", + " return base_stats\n", + "\n", + "def summary(df):\n", + " #we'll start with the first 50 rows as a smoke test\n", + " small_df = df.iloc[:50]\n", + " return pd.DataFrame(dict([[col, col_stats(small_df[col])] for col in small_df.columns]))\n", + "summary(df)" + ] + }, + { + "cell_type": "markdown", + "id": "e6d4592c-a71e-464f-9c53-2143025c3cdf", + "metadata": {}, + "source": [ + "# Now lets add distinct_percentage\n", + "we just want to divide distinct_count by length\n", + "but we have no decent way to insert that calculation, we have to rewrite the entire function" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "c7dc1ed8-1382-448c-bdec-e740052c6458", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstarttimestoptimestart station idstart station namestart station latitudestart station longitudeend station idend station nameend station latitudeend station longitudebikeidusertypebirth yeargender
    nan_count000000000000000
    distinct_count4850462323232328282828480170
    distinct_percentage0.961.00.920.460.460.460.460.560.560.560.560.960.00.340.0
    dtypeint64objectobjectint64objectfloat64float64int64objectfloat64float64int64objectobjectint64
    min128NaNNaN83NaN40.683125-74.015756127NaN40.682166-74.01234214650NaNNaN0
    mean720.24NaNNaN572.3NaN40.73296-73.98873400.14NaN40.730918-73.99000317363.68NaNNaN0.98
    max1957NaNNaN3002NaN40.770513-73.9678442022NaN40.763707-73.9539921183NaNNaN2
    mode513NaNNaN422NaN40.770513-73.988038380NaN40.734011-74.00550915693NaNNaN1
    \n", + "
    " + ], + "text/plain": [ + " tripduration starttime stoptime start station id \\\n", + "nan_count 0 0 0 0 \n", + "distinct_count 48 50 46 23 \n", + "distinct_percentage 0.96 1.0 0.92 0.46 \n", + "dtype int64 object object int64 \n", + "min 128 NaN NaN 83 \n", + "mean 720.24 NaN NaN 572.3 \n", + "max 1957 NaN NaN 3002 \n", + "mode 513 NaN NaN 422 \n", + "\n", + " start station name start station latitude \\\n", + "nan_count 0 0 \n", + "distinct_count 23 23 \n", + "distinct_percentage 0.46 0.46 \n", + "dtype object float64 \n", + "min NaN 40.683125 \n", + "mean NaN 40.73296 \n", + "max NaN 40.770513 \n", + "mode NaN 40.770513 \n", + "\n", + " start station longitude end station id end station name \\\n", + "nan_count 0 0 0 \n", + "distinct_count 23 28 28 \n", + "distinct_percentage 0.46 0.56 0.56 \n", + "dtype float64 int64 object \n", + "min -74.015756 127 NaN \n", + "mean -73.98873 400.14 NaN \n", + "max -73.967844 2022 NaN \n", + "mode -73.988038 380 NaN \n", + "\n", + " end station latitude end station longitude bikeid \\\n", + "nan_count 0 0 0 \n", + "distinct_count 28 28 48 \n", + "distinct_percentage 0.56 0.56 0.96 \n", + "dtype float64 float64 int64 \n", + "min 40.682166 -74.012342 14650 \n", + "mean 40.730918 -73.990003 17363.68 \n", + "max 40.763707 -73.95399 21183 \n", + "mode 40.734011 -74.005509 15693 \n", + "\n", + " usertype birth year gender \n", + "nan_count 0 0 0 \n", + "distinct_count 0 17 0 \n", + "distinct_percentage 0.0 0.34 0.0 \n", + "dtype object object int64 \n", + "min NaN NaN 0 \n", + "mean NaN NaN 0.98 \n", + "max NaN NaN 2 \n", + "mode NaN NaN 1 " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def col_stats(ser):\n", + " \n", + " l = len(ser)\n", + " values = ser.value_counts()\n", + " distinct_count = values[values == 1].sum()\n", + "\n", + " base_stats = dict(\n", + " nan_count = ser.isna().sum(),\n", + " distinct_count = distinct_count,\n", + " distinct_percentage = distinct_count / l,\n", + " dtype = ser.dtype)\n", + " if pd.api.types.is_numeric_dtype(ser):\n", + " base_stats.update(dict(\n", + " min = ser.min(),\n", + " mean = ser.mean(),\n", + " max = ser.max(),\n", + " mode = ser.mode()[0]\n", + " ))\n", + " return base_stats\n", + "\n", + "def summary(df, size=50):\n", + " #we'll start with the first 50 rows as a smoke test\n", + " if size > 0:\n", + " small_df = df.iloc[:size]\n", + " else:\n", + " #use the whole thing\n", + " small_df = df\n", + " return pd.DataFrame(dict([[col, col_stats(small_df[col])] for col in small_df.columns]))\n", + "\n", + "summary(df)" + ] + }, + { + "cell_type": "markdown", + "id": "f480a73f-072c-4480-8d60-6c7929ed6c0f", + "metadata": {}, + "source": [ + "# What about individual stats functions\n", + "summary is modified to recieve a list of functions to apply in order" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "98b252c6-a5c2-4f5f-b7e2-2f046154327b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tripdurationstarttimestoptimestart station idstart station namestart station latitudestart station longitudeend station idend station nameend station latitudeend station longitudebikeidusertypebirth yeargender
    nan_count000000000000000
    distinct_count4850462323232328282828480170
    dtypeint64objectobjectint64objectfloat64float64int64objectfloat64float64int64objectobjectint64
    min128NaNNaN83NaN40.683125-74.015756127NaN40.682166-74.01234214650NaNNaN0
    mean720.24NaNNaN572.3NaN40.73296-73.98873400.14NaN40.730918-73.99000317363.68NaNNaN0.98
    max1957NaNNaN3002NaN40.770513-73.9678442022NaN40.763707-73.9539921183NaNNaN2
    mode513NaNNaN422NaN40.770513-73.988038380NaN40.734011-74.00550915693NaNNaN1
    distinct_percentage0.961.00.920.460.460.460.460.560.560.560.560.960.00.340.0
    \n", + "
    " + ], + "text/plain": [ + " tripduration starttime stoptime start station id \\\n", + "nan_count 0 0 0 0 \n", + "distinct_count 48 50 46 23 \n", + "dtype int64 object object int64 \n", + "min 128 NaN NaN 83 \n", + "mean 720.24 NaN NaN 572.3 \n", + "max 1957 NaN NaN 3002 \n", + "mode 513 NaN NaN 422 \n", + "distinct_percentage 0.96 1.0 0.92 0.46 \n", + "\n", + " start station name start station latitude \\\n", + "nan_count 0 0 \n", + "distinct_count 23 23 \n", + "dtype object float64 \n", + "min NaN 40.683125 \n", + "mean NaN 40.73296 \n", + "max NaN 40.770513 \n", + "mode NaN 40.770513 \n", + "distinct_percentage 0.46 0.46 \n", + "\n", + " start station longitude end station id end station name \\\n", + "nan_count 0 0 0 \n", + "distinct_count 23 28 28 \n", + "dtype float64 int64 object \n", + "min -74.015756 127 NaN \n", + "mean -73.98873 400.14 NaN \n", + "max -73.967844 2022 NaN \n", + "mode -73.988038 380 NaN \n", + "distinct_percentage 0.46 0.56 0.56 \n", + "\n", + " end station latitude end station longitude bikeid \\\n", + "nan_count 0 0 0 \n", + "distinct_count 28 28 48 \n", + "dtype float64 float64 int64 \n", + "min 40.682166 -74.012342 14650 \n", + "mean 40.730918 -73.990003 17363.68 \n", + "max 40.763707 -73.95399 21183 \n", + "mode 40.734011 -74.005509 15693 \n", + "distinct_percentage 0.56 0.56 0.96 \n", + "\n", + " usertype birth year gender \n", + "nan_count 0 0 0 \n", + "distinct_count 0 17 0 \n", + "dtype object object int64 \n", + "min NaN NaN 0 \n", + "mean NaN NaN 0.98 \n", + "max NaN NaN 2 \n", + "mode NaN NaN 1 \n", + "distinct_percentage 0.0 0.34 0.0 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "def base_col_stats(ser):\n", + " \n", + " l = len(ser)\n", + " values = ser.value_counts()\n", + " distinct_count = values[values == 1].sum()\n", + "\n", + " base_stats = dict(\n", + " nan_count = ser.isna().sum(),\n", + " distinct_count = distinct_count,\n", + " dtype = ser.dtype)\n", + " if pd.api.types.is_numeric_dtype(ser):\n", + " base_stats.update(dict(\n", + " min = ser.min(),\n", + " mean = ser.mean(),\n", + " max = ser.max(),\n", + " mode = ser.mode()[0]\n", + " ))\n", + " return base_stats\n", + "\n", + "def distinct_percentage(ser):\n", + " \n", + " l = len(ser)\n", + " values = ser.value_counts()\n", + " distinct_count = values[values == 1].sum()\n", + "\n", + " return dict(\n", + " distinct_percentage = distinct_count / l)\n", + " return base_stats\n", + "\n", + "def summary_funcs(df, funcs, size=50):\n", + " if size > 0:\n", + " small_df = df.iloc[:size]\n", + " else:\n", + " #use the whole thing\n", + " small_df = df\n", + " \n", + " facts_dict = {}\n", + " for col in small_df.columns:\n", + " facts = {}\n", + " for func in funcs:\n", + " facts.update(func(small_df[col]))\n", + " facts_dict[col] = facts\n", + " return pd.DataFrame(facts_dict)\n", + "\n", + "summary_funcs(df, [base_col_stats, distinct_percentage])" + ] + }, + { + "cell_type": "markdown", + "id": "064e381b-acd6-42fd-88e2-787286fae0ef", + "metadata": {}, + "source": [ + "# It works\n", + "But there's a problem. The call to value_counts is slow. watch the following timings with sampling turned off" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d1b96a21-b721-460e-871d-3ae881fe8fdc", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "237 ms ± 26.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%timeit summary(df, -1)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "c4f95f09-f149-4934-92ae-5424ce3065f4", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "374 ms ± 7.99 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + ] + } + ], + "source": [ + "%timeit summary_funcs(df, [base_col_stats, distinct_percentage], -1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a23805fe-b8de-4ecf-bf68-27312a664943", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tests/analysis_management_test.py b/tests/analysis_management_test.py index d2b07b8ed..c91edd929 100644 --- a/tests/analysis_management_test.py +++ b/tests/analysis_management_test.py @@ -10,10 +10,37 @@ from buckaroo.analysis import (TypingStats, DefaultSummaryStats) from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen) +class DumbTableHints(ColAnalysis): + provides_summary = [ + 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + return {'is_numeric':True, + 'is_integer':False, + 'min_digits':3, + 'max_digits':10, + 'histogram': []} + + class TestAnalysisPipeline(unittest.TestCase): def test_produce_summary_df(self): produce_summary_df(test_df, [DistinctCount, Len, DistinctPer], 'test_df') + def test_produce_summary_df_hints(self): + #this test should be ported over to the full basic_widget test with actaul verificaiton of values + + summary_df, hints, errs = produce_summary_df( + test_df, [DumbTableHints], 'test_df') + + for col, hint_obj in hints.items(): + #hacky replication of typescript types, just basically testing that hints are constructed properly + if hint_obj['is_numeric'] == False: + assert 'histogram' in hint_obj.keys() + else: + expected_set = set( + ['is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram']) + assert expected_set == set(hint_obj.keys()) def test_pipeline_base(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) @@ -23,8 +50,7 @@ def test_pipeline_base(self): def test_add_aobj(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provided_summary = [ - 'foo',] + provides_summary = ['foo'] requires_summary = ['length'] @staticmethod @@ -37,8 +63,7 @@ def summary(sampled_ser, summary_ser, ser): def test_add_buggy_aobj(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provided_summary = [ - 'foo',] + provides_summary = ['foo'] requires_summary = ['length'] @staticmethod @@ -50,8 +75,7 @@ def summary(sampled_ser, summary_ser, ser): def test_replace_aobj(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provided_summary = [ - 'foo',] + provides_summary = ['foo'] requires_summary = ['length'] @staticmethod @@ -64,8 +88,7 @@ def summary(sampled_ser, summary_ser, ser): self.assertEqual(len(sdf['tripduration']), 18) #Create an updated Foo that returns 9 class Foo(ColAnalysis): - provided_summary = [ - 'foo',] + provides_summary = ['foo'] requires_summary = ['length'] @staticmethod @@ -88,7 +111,7 @@ def test_summary_stats_display(self): def test_add_summary_stats_display(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provided_summary = ['foo'] + provides_summary = ['foo'] requires_summary = ['length'] summary_stats_display = ['foo'] @@ -98,7 +121,19 @@ class Foo(ColAnalysis): def test_invalid_summary_stats_display_throws(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provided_summary = ['foo'] + provides_summary = ['foo'] + requires_summary = ['length'] + summary_stats_display = ['not_provided'] + + def bad_add(): + ap.add_analysis(Foo) + + self.assertRaises(NonExistentSummaryRowException, bad_add) + + def test_invalid_summary_stats_display_throws(self): + ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + class Foo(ColAnalysis): + provides_summary = ['foo'] requires_summary = ['length'] summary_stats_display = ['not_provided'] diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index 88285e0a7..712cfdc07 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -6,6 +6,10 @@ simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) +#test against this too +word_only_df = pd.DataFrame({'letters': 'h o r s e'.split(' ')}) + + def test_basic_instantiation(): w = BuckarooWidget(simple_df) assert w.dfConfig['totalRows'] == 3 diff --git a/tests/fixtures.py b/tests/fixtures.py index b3b04741a..1a316b1bc 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -13,7 +13,7 @@ class DistinctCount(ColAnalysis): requires_raw = True - provided_summary = ["distinct_count"] + provides_summary = ["distinct_count"] @staticmethod def summary(sampled_ser, summary_ser, raw_ser): val_counts = raw_ser.value_counts() @@ -21,7 +21,7 @@ def summary(sampled_ser, summary_ser, raw_ser): return {'distinct_count': distinct_count} class Len(ColAnalysis): - provided_summary = ["len"] + provides_summary = ["len"] requires_raw = True @staticmethod def summary(sampled_ser, summary_ser, raw_ser): @@ -29,7 +29,7 @@ def summary(sampled_ser, summary_ser, raw_ser): class DistinctPer(ColAnalysis): - provided_summary = ["distinct_per"] + provides_summary = ["distinct_per"] requires_summary = ["len", "distinct_count"] @staticmethod @@ -38,7 +38,7 @@ def summary(sampled_ser, summary_ser, raw_ser): class DistinctCount(ColAnalysis): requires_raw = True - provided_summary = ["distinct_count"] + provides_summary = ["distinct_count"] @staticmethod def summary(sampled_ser, summary_ser, raw_ser): val_counts = raw_ser.value_counts() @@ -46,14 +46,14 @@ def summary(sampled_ser, summary_ser, raw_ser): return {'distinct_count': distinct_count} class Len(ColAnalysis): - provided_summary = ["len"] + provides_summary = ["len"] requires_raw = True @staticmethod def summary(sampled_ser, summary_ser, raw_ser): return {'len': len(raw_ser)} class DCLen(ColAnalysis): - provided_summary = ["len", "distinct_count"] + provides_summary = ["len", "distinct_count"] requires_raw = True @staticmethod def summary(sampled_ser, summary_ser, raw_ser): @@ -62,7 +62,7 @@ def summary(sampled_ser, summary_ser, raw_ser): return {'len':len(raw_ser), 'distinct_count':distinct_count} class DistinctPer(ColAnalysis): - provided_summary = ["distinct_per"] + provides_summary = ["distinct_per"] requires_summary = ["len", "distinct_count"] @staticmethod diff --git a/tests/pluggable_analysis_framework_test.py b/tests/pluggable_analysis_framework_test.py index c30a0cc1c..68fa63f7d 100644 --- a/tests/pluggable_analysis_framework_test.py +++ b/tests/pluggable_analysis_framework_test.py @@ -14,29 +14,29 @@ from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen, DependsNoProvides) class NoRoute(ColAnalysis): - provided_summary = ['not_used'] + provides_summary = ['not_used'] requires_summary = ["does_not_exist"] class CycleA(ColAnalysis): - provided_summary = ['cycle_a'] + provides_summary = ['cycle_a'] requires_summary = ["cycle_b"] class CycleB(ColAnalysis): - provided_summary = ['cycle_b'] + provides_summary = ['cycle_b'] requires_summary = ["cycle_a"] class CA_AB(ColAnalysis): - provided_summary = ["a", "b"] + provides_summary = ["a", "b"] class CA_CD(ColAnalysis): - provided_summary = ["c", "d"] + provides_summary = ["c", "d"] class CA_EF(ColAnalysis): - provided_summary = ["e", "f"] + provides_summary = ["e", "f"] requires_summary = ["a", "b", "c", "d"] class CA_G(ColAnalysis): - provided_summary = ["g"] + provides_summary = ["g"] requires_summary = ["e"] @@ -64,11 +64,12 @@ def test_multiple_provides(self): # as long as they occur before other classes def test_no_provides(self): - # order_analysis should work properly with ColAnalysis objects taht don't provide any summary_stats + # order_analysis should work properly with ColAnalysis objects that don't provide any summary_stats + self.assertEqual( order_analysis([DCLen, DistinctPer, DependsNoProvides]), [DCLen, DependsNoProvides, DistinctPer]) - + def test_cycle(self): with self.assertRaises(graphlib.CycleError): order_analysis([CycleA, CycleB]) @@ -77,16 +78,3 @@ def test_no_route(self): check_solvable([Len]) with self.assertRaises(NotProvidedException): check_solvable([NoRoute]) - - - -""" -to run the tests as regular python functions use the following code. -This will be useful for live testing adding analysis funcs - -loader = unittest.TestLoader() -suite = unittest.TestSuite() -tests = loader.loadTestsFromTestCase(TestOrderAnalysis) -suite.addTests(tests) -ab = unittest.TextTestRunner(verbosity=3).run(suite) -""" diff --git a/tests/serialization_utils_test.py b/tests/serialization_utils_test.py new file mode 100644 index 000000000..f75c79d7b --- /dev/null +++ b/tests/serialization_utils_test.py @@ -0,0 +1,9 @@ +import pandas as pd +import numpy as np +from buckaroo.serialization_utils import pd_py_serialize + +def test_py_serialize(): + assert pd_py_serialize({'a': pd.NA, 'b': np.nan}) == "{'a': pd.NA, 'b': np.nan, }" + assert pd_py_serialize({'a': None, 'b': "string", 'c': 4, 'd': 10.3 }) ==\ + "{'a': None, 'b': 'string', 'c': 4, 'd': 10.3, }" + From 2354c5c5758ac4d9bf390603330cb9dce58a093f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 13 Oct 2023 14:46:37 -0400 Subject: [PATCH 149/250] release for 0.3.23 (#41) --- docs/source/conf.py | 2 +- package.json | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index b06b060b3..d1d6f388d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.2.8' +release = '0.3.23' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/package.json b/package.json index 34f5a61fc..6f906130e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.31", + "version": "0.2.33", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 5fecb3894..2a3586921 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.22" +version = "0.3.23" [project.license] file = "LICENSE.txt" From 32779c3c3b586809ff47a664e8fc39f6a7b08a9a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 17 Oct 2023 17:54:11 -0400 Subject: [PATCH 150/250] Temporary README update with webinar link --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f4670ef8e..e8ef0e3da 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ -# Buckaroo - The Data Wrangling Assistant +# Buckaroo - The Data Table for Jupyter +## I will be giving a webinar about Buckaroo this Thursday, October 19 1:00 – 2:00pm EST. +Learn about Buckaroo and how it can be customized to automate your own data analysis workflow. +[Register Here](https://us06web.zoom.us/webinar/register/4216971226817/WN_P7u0oNqrRcCeYx8yOm_DWg#/registration) + We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaro makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the Buckaroo is a tool built to interactively explore, clean, and transform pandas dataframes. ![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) From 34139121d4a67b4170baf3b949902d538b256a9f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 19 Oct 2023 08:36:15 -0400 Subject: [PATCH 151/250] Feat/quick js fixes (#48) Release 0.3.25 * fixes Text row labels appear blank #44 * fixes Undo default capitalization of column names? #43 * fixes Buckaroo doesn't work properly in Google Colab #47 --- buckaroo/_version.py | 2 +- buckaroo/buckaroo_widget.py | 30 ++------------------ buckaroo/serialization_utils.py | 37 +++++++++++++++++++++++++ examples/App.tsx | 19 +------------ examples/ex/DFViewerEx_string_index.tsx | 9 ++++++ js/components/gridUtils.ts | 1 + js/components/staticData.ts | 27 ++++++++++++++++++ package.json | 2 +- pyproject.toml | 2 +- tests/serialization_utils_test.py | 9 +++++- 10 files changed, 88 insertions(+), 50 deletions(-) create mode 100644 examples/ex/DFViewerEx_string_index.tsx diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 4fc4fe6dc..fba90a075 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Bloomberg. # Distributed under the terms of the Modified BSD License. -__version__ = "0.2.1" +__version__ = "0.3.25" diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 8c5255ded..75f270fc1 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -7,7 +7,6 @@ """ TODO: Add module docstring """ -import json import warnings import traceback @@ -23,36 +22,11 @@ from .analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) from .analysis_management import DfStats -from pandas.io.json import dumps as pdumps +from .serialization_utils import df_to_obj, EMPTY_DF_OBJ -EMPTY_DF_OBJ = {'schema': {'fields': [{'name': 'index', 'type': 'string'}], - 'primaryKey': ['index'], - 'pandas_version': '1.4.0'}, - 'data': []} -def dumb_table_sumarize(df): - """used when table_hints aren't provided. Trests every column as a string""" - table_hints = {col:{'is_numeric':False} for col in df} - table_hints['index'] = {'is_numeric': False} - return table_hints - - -def df_to_obj(df, order = None, table_hints=None): - if order is None: - order = df.columns - obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) - if table_hints is None: - obj['table_hints'] = json.loads(pdumps(dumb_table_sumarize(df))) - else: - obj['table_hints'] = json.loads(pdumps(table_hints)) - fields=[{'name':'index'}] - for c in order: - fields.append({'name':c}) - obj['schema'] = dict(fields=fields) - return obj - FAST_SUMMARY_WHEN_GREATER = 1_000_000 class BuckarooWidget(DOMWidget): @@ -77,7 +51,7 @@ class BuckarooWidget(DOMWidget): summaryDf = Dict({}).tag(sync=True) operation_results = Dict( - {'transformed_df':EMPTY_DF_OBJ, 'generated_py_code':'# instantiation, unused'} + {'transformed_df': EMPTY_DF_OBJ, 'generated_py_code':'# instantiation, unused'} ).tag(sync=True) dfConfig = Dict( diff --git a/buckaroo/serialization_utils.py b/buckaroo/serialization_utils.py index 81bb187b0..a410e4089 100644 --- a/buckaroo/serialization_utils.py +++ b/buckaroo/serialization_utils.py @@ -1,5 +1,7 @@ +import json import numpy as np import pandas as pd +from pandas.io.json import dumps as pdumps def d_update(d1, d2): ret_dict = d1.copy() @@ -46,3 +48,38 @@ def pd_py_serialize(dct): np.nan: UnquotedString("np.nan")}) return dict_repr(cleaned_dct) + +EMPTY_DF_OBJ = {'schema': {'fields': [{'name': 'index', 'type': 'string'}], + 'primaryKey': ['index'], + 'pandas_version': '1.4.0'}, + 'data': []} + + +def dumb_table_sumarize(df): + """used when table_hints aren't provided. Trests every column as a string""" + table_hints = {col:{'is_numeric':False} for col in df} + table_hints['index'] = {'is_numeric': False} + return table_hints + + +def df_to_obj(df, order = None, table_hints=None): + if order is None: + order = df.columns + + temp_index_name = False + if not df.index.name is None: + temp_index_name = df.index.name + df.index.name = None + obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) + if temp_index_name: + df.index.name = temp_index_name + + if table_hints is None: + obj['table_hints'] = json.loads(pdumps(dumb_table_sumarize(df))) + else: + obj['table_hints'] = json.loads(pdumps(table_hints)) + fields=[{'name':'index'}] + for c in order: + fields.append({'name':c}) + obj['schema'] = dict(fields=fields) + return obj diff --git a/examples/App.tsx b/examples/App.tsx index fa2539942..7a5a6c270 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -16,32 +16,17 @@ const examples = { ColumnsEditorEx: {title: 'ColumnsEditor', file: 'ColumnsEditorEx'}, CommandViewerEx: {title: 'CommandViewer', file: 'CommandViewerEx'}, DFViewerEx: {title: 'DFViewer', file: 'DFViewerEx'}, + DFViewerEx_string_index: {title: 'DFViewer string index', file: 'DFViewerEx_string_index'}, StatusBarEx: {title: 'StatusBar', file: 'StatusBarEx'}, HistogramEx: {title: 'Histogram', file: 'HistogramEx'} }; -// The examples use a code-loading technique that I have described in -// https://mmomtchev.medium.com/making-examples-displaying-code-along-its-output-with-webpack-a28dcf5439c6 - -const CodeBlock = React.lazy(() => import(/* webpackPrefetch: true */ './CodeBlock')); - for (const ex of Object.keys(examples)) { examples[ex].comp = React.lazy( () => import(/* webpackPrefetch: true */ `./ex/${examples[ex].file}.tsx`) ); examples[ex].code = 'asfd' examples[ex].text = 'text' - - // examples[ex].code = import( - // /* webpackPrefetch: true */ `!!html-loader?{"minimize":false}!./jsx-loader.ts!./ex/${examples[ex].file}.tsx` - // ) - - -// .then((code) => code.default); -// examples[ex].text = import( -// /* webpackPrefetch: true */ `!!raw-loader!./ex/${examples[ex].file}.tsx` -// ).then((text) => text.default); - } const LeftMenuItem = (props): JSX.Element => ( @@ -55,8 +40,6 @@ const LeftMenuItem = (props): JSX.Element => ( ); -// eslint-disable-next-line no-var - const App = (): JSX.Element => { const [jsText, setJSText] = React.useState(''); diff --git a/examples/ex/DFViewerEx_string_index.tsx b/examples/ex/DFViewerEx_string_index.tsx new file mode 100644 index 000000000..323577054 --- /dev/null +++ b/examples/ex/DFViewerEx_string_index.tsx @@ -0,0 +1,9 @@ +import {DFViewer} from '../../js/components/DFViewer'; +import { stringIndexDf } from '../../js/components/staticData'; +import React, { useState} from 'react'; + + +export default function Simple() { + const [activeCol, setActiveCol] = useState('tripduration'); + return ; +} diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index 089c77956..95a391ac4 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -99,6 +99,7 @@ export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { //console.log(f.name, tdf.table_hints[f.name]) const colDef: ColDef = { field: f.name, + headerName: f.name, valueFormatter: getFormatter( _.get(tdf.table_hints, f.name, { is_numeric: false }) ), diff --git a/js/components/staticData.ts b/js/components/staticData.ts index 98220b90a..b19c7a3d5 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -380,3 +380,30 @@ export const tableDf: DFWhole = { }, }, }; + +export const stringIndexDf: DFWhole ={ + schema: { + fields: [ + {name: 'index', type:'integer'}, + {name: 'a', type:'integer'}, + {name: 'b', type:'boolean'}], + primaryKey: ['index'], + pandas_version: '1.4.0', + }, + data: [{index: 0, a: 1, b: true}, + {index: 1, a: 2, b: false}], + table_hints: { + a: {is_numeric: true, + is_integer: true, + min_digits: 1, + max_digits: 1, + histogram: [{name: 1, cat_pop: 50.0}, + {name: 2, cat_pop: 50.0}, + {name: 'longtail', unique: 100.0}]}, + b: {is_numeric: true, + is_integer: false, + min_digits: 1, + max_digits: 1, + histogram: [{name: true, cat_pop: 50.0}, + {name: false, cat_pop: 50.0}, + {name: 'longtail', unique: 100.0}]}}} diff --git a/package.json b/package.json index 6f906130e..3827a8c3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.2.33", + "version": "0.3.25", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 2a3586921..f0439fa6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.23" +version = "0.3.25" [project.license] file = "LICENSE.txt" diff --git a/tests/serialization_utils_test.py b/tests/serialization_utils_test.py index f75c79d7b..64b637928 100644 --- a/tests/serialization_utils_test.py +++ b/tests/serialization_utils_test.py @@ -1,9 +1,16 @@ import pandas as pd import numpy as np -from buckaroo.serialization_utils import pd_py_serialize +from buckaroo.serialization_utils import pd_py_serialize, df_to_obj def test_py_serialize(): assert pd_py_serialize({'a': pd.NA, 'b': np.nan}) == "{'a': pd.NA, 'b': np.nan, }" assert pd_py_serialize({'a': None, 'b': "string", 'c': 4, 'd': 10.3 }) ==\ "{'a': None, 'b': 'string', 'c': 4, 'd': 10.3, }" +def test_df_to_obj(): + named_index_df = pd.DataFrame( + dict(names=['one', 'two', 'three'], + values=[1, 2, 3])).set_index('names') + + serialized_df = df_to_obj(named_index_df) + assert serialized_df['data'][0]['index'] == 'one' From 2a769975597cf5b7ce3a853796cbad4d8e88e6c5 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 21 Oct 2023 11:45:27 -0400 Subject: [PATCH 152/250] Update README.md --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index e8ef0e3da..0f4417fb2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,4 @@ # Buckaroo - The Data Table for Jupyter -## I will be giving a webinar about Buckaroo this Thursday, October 19 1:00 – 2:00pm EST. -Learn about Buckaroo and how it can be customized to automate your own data analysis workflow. -[Register Here](https://us06web.zoom.us/webinar/register/4216971226817/WN_P7u0oNqrRcCeYx8yOm_DWg#/registration) We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaro makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the Buckaroo is a tool built to interactively explore, clean, and transform pandas dataframes. From 51530465d06d9a1776646e3d687adc113454b4b2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 21 Oct 2023 17:47:09 -0400 Subject: [PATCH 153/250] expanded related projects into a full article (#67) --- docs/source/FAQ.rst | 11 +----- docs/source/articles/related_projects.rst | 44 +++++++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 docs/source/articles/related_projects.rst diff --git a/docs/source/FAQ.rst b/docs/source/FAQ.rst index 61d4a0246..b75877317 100644 --- a/docs/source/FAQ.rst +++ b/docs/source/FAQ.rst @@ -20,17 +20,8 @@ Right now, buckaroo only works with the latest release - NB7. The recommended w * **Are there any similar projects to Buckaroo?** -There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. +There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. `Complete article `_ about the many related projects. -#. `Mito `_. Source Available table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. GNU Affero licensed -#. `Microsoft DataWrangler `_ . Closed source, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode by the `VS Marketplace Terms of Use `_ -#. `IpyDatagrid `_. Open source. Bloomberg's Jupyter table widget. I used the ipydatagrid repo structure as the basis for buckaroo (js build setup only) -#. `IPyAgGrid `_ . Open source. Wraps `AG Grid `_ in a jupyter widget. Buckaroo also uses AG Grid. -#. `Bamboolib `_ An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. Code no longer available. -#. `QGrid `_. Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features - - -To be clear, I had the idea for building Buckaroo like this before I saw any of the other projects... But they are all open source and we can learn from each other. If Buckaroo doesn't quite do what you want, check out one of the others * **Is Buckaroo meant to repalce knowledge of python/pandas** diff --git a/docs/source/articles/related_projects.rst b/docs/source/articles/related_projects.rst new file mode 100644 index 000000000..7016e07d2 --- /dev/null +++ b/docs/source/articles/related_projects.rst @@ -0,0 +1,44 @@ +.. _using: + +Related projects +================ + +Other jupyter widgets +--------------------- + +There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. + +#. `Mito `_. Source Available table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. GNU Affero licensed +#. `Microsoft DataWrangler `_ . Closed source, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode by the `VS Marketplace Terms of Use `_ +#. `IpyDatagrid `_. Open source. Bloomberg's Jupyter table widget. I used the ipydatagrid repo structure as the basis for buckaroo (js build setup only) +#. `IPyAgGrid `_ . Open source. Wraps `AG Grid `_ in a jupyter widget. Buckaroo also uses AG Grid. +#. `Bamboolib `_ An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. Code no longer available. +#. `QGrid `_. Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features + + +To be clear, I had the idea for building Buckaroo like this before I saw any of the other projects... But they are all open source and we can learn from each other. If Buckaroo doesn't quite do what you want, check out one of the others + + +Other exploratory datta analysis tools +-------------------------------------- + +These tools are aimed at doing more comprehensive stastical analysis of data + +#. `Dtale `_ +#. `YData profiling `_ + + +Other data tables +----------------- + +JS Table widgets. These are the core interactive tables that modern table expereinces are built around. A lot of engineering goes into making a web browser handle large scrolling tables performantly + +#. `AG-Grid `_ The most popular high performance JS data table in use. Buckaroo is built on top of the open source version of AG-Grid. The closed source version offers additional features. +#. `Finos Perspective table `_ The highest performance JS Table that I have seen. Works via a complete rendering engine that writes pixels to a canvas. Open source. + + +Why list potential competitors +------------------------------ + +Software is complex, picking open source packages is difficult, even understanding the landscape of possible solutions is difficult. If you landed on this page, and Buckaroo doesn't suit your needs, hopefully ony of these great other projects will. + From 0fdfaa1d81d24672e9ccd132b916196d220e397f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 23 Oct 2023 16:48:46 -0400 Subject: [PATCH 154/250] Basic docs explanation of the auto_clean framework --- docs/source/articles/auto_clean.rst | 67 +++++++++++++++++++++++++++++ docs/source/articles/pluggable.rst | 52 +++------------------- 2 files changed, 74 insertions(+), 45 deletions(-) create mode 100644 docs/source/articles/auto_clean.rst diff --git a/docs/source/articles/auto_clean.rst b/docs/source/articles/auto_clean.rst new file mode 100644 index 000000000..2a0876f69 --- /dev/null +++ b/docs/source/articles/auto_clean.rst @@ -0,0 +1,67 @@ +.. _using: + +============= +Auto Cleaning +============= + +By default buckaroo aggresively tries to type data and clean it up. + +Better typing +------------- +What do I mean by cleaning types? By default if an integer column contains a single missing value, pandas will use the ``float64`` dtype to represent that value as a NaN. The autotyping functionality instead casts that as ``Int64`` a new type in pandas that allows ``NA`` values in Int columns. Work is also done to constrain types to their narrowest, so if an int value is between 0 and 255, autotyping will cast that to `UInt8` using a single byte instead of 8 for a float64 or int64. + + +Heuristic cleaning +------------------ +The autocleaning tool also heursitically removes errant mistyped values from column. If a column is primarily Ints with a single string, that string is stripped so the column can be treated as numeric. + + + +Using Autocleaning +================== + +Changing individual coercions +---------------------------- + +Autotyping operations are added to the lowcode UI by default, open up the lowcode UI with the λ menu, then click on operations and delete them with the X. + + +Turning off auto cleaning +------------------------- + +Buckaroo's auto cleaning is aggressive and sometimes not wanted to use Buckaroo without autotyping, invoke it this way +.. code-block:: python + +from buckaroo import BuckarooWidget +BuckarooWidget(df, autoType=False) + + + + + +How Autotyping Works +==================== + +There are three steps to auto_cleaning + +First frequency metadata is collected with ``get_typing_metadata``, this is a dictionary with ``0`` - ``1`` ranges for the proportion of values that could be ``int``, ``float``, ``bool``, ``datetime``. + +Next ``recommend_type`` takes the typing metadata and returns ``bool``, ``datetime``, ``int``, ``float``, or ``string`` + +Finally ``emit_command`` returns a JLisp operation that will perform the conversion. + + +Why three functions? +-------------------- + +Splitting this into three distinct phases makes it much easier to customize behavior. It also allows improvements to accrue without requiring complete rewrites of the auto-typing functionality. My guess is that ``recommend_type`` is the easiest to override, and will be the most frequently. + + +How do I add special replacement functionality? +----------------------------------------------- + +What if you commonly deal with a dataset that treats ``y`` as ``True`` and ``n`` as ``False``, how would you recognize those types of values and convert them to boolean? + +Code coming soon. + + diff --git a/docs/source/articles/pluggable.rst b/docs/source/articles/pluggable.rst index f0abe603a..8205a1ff4 100644 --- a/docs/source/articles/pluggable.rst +++ b/docs/source/articles/pluggable.rst @@ -96,47 +96,8 @@ column_ordering col_facts['total_score'] = col_facts['existing_order_score'] + col_facts['numeric_boost'] return [cd['name'] for cd in sorted(col_dicts, key=lambda x: x['total_score'])] -default_cleaning_instructions - - If a column has 5000 rows, and 3000 of them are parseable as an integer, and the other 2000 rows are "n/a", it was probably the intention of the original data for this to be an integer column with nulls. DefaultCleaningInstructions. The transform to integer can be coded as a custom command for the low-code-ui, then you can write a ColAnalysis that suggests this transform be automatically executed on load of a dataframe. - - It would look like this - - .. code-block:: python - - def safe_int(x): - try: - return int(x) - except: - return np.nan - - class IntClean(ColAnalysis): - provided_summary = [ - 'cleanable_int'] - - @staticmethod - def summary(sampled_ser, summary_ser, ser): - counts = sampled_ser.value_counts() - parseable = 0 - for val in counts.index: - if safe_int(val) not np.nan: - parseable += 1 - - mostly_parseable = parseable / len(counts) > 0.95 - return {'cleanable_int': mostly_parseable} - - @staticmethod - def cleaning_instruction(summary_ser, col_name): - if summary_ser.loc['cleanable_int'] == False: - return None - return ['safe_int', col_name] - - - Then this clean_int will be automatically loaded into the instruction viewer in the low code ui, and it will already have been executed for the loaded dataframe - I'm still figuring out how to toggle through different cleanings. I'm worried about modifying the default columns. I guess I can make the returned cleaning instructions do a column rename by convention. so for the above cleaning instruction first copy the original column name to "_orig" - -summary_stats_set +summary_stats_display a list of which rows from summary stats to display. Currently only the last added summary_stats_set is used @@ -150,11 +111,12 @@ The pluggable analysis framework runs different functions on analysis functions 1. Compute the order of analysis objects. This builds a DAG and makes sure all of the facts can be computed. 2. Run all of the ``summary`` methods and build the ``summary_df`` -3. Run all of the ``cleaning_instructions`` methods and get the list of interpreter instructions -4. Run the interpreter and produce a new "cleaned" dataframe -5. Run all of the ``summary`` methods and build the ``summary_df`` for the cleaned dataframe. -6. Run all of the ``table_hints`` methods and build the table_hints dictionary -7. Run all of the ``col_ordering`` methods and produce the different col_orderings. +3. extract table_hints from the ``summary_df`` + +Table Hints +=========== + +Table hints are a subset of the complete summary dataframe. They are used to choose formatters, provide data for the histograms, and modify other display characteristics for the frontend table. Look at the `JS type hints `_ . Also note that table_hints are subject to change soon per this `bug report `_. Porting to polars ================= From 1b896e7eb6e2bf2512e129a79a44507302344ab2 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 25 Oct 2023 17:22:57 -0400 Subject: [PATCH 155/250] Added google-colab link to README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 0f4417fb2..cc2104392 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaro makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the Buckaroo is a tool built to interactively explore, clean, and transform pandas dataframes. +## Try it today + +* [Buckaroo full tour](https://ydata-profiling.ydata.ai/examples/master/meteorites/meteorites_report.html) (comprehensive set of meteorite landing - object properties and locations) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) + + + ![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) From c5a721a0f2d85db1421ffa3f3e8da2b464e86a7f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 25 Oct 2023 17:26:19 -0400 Subject: [PATCH 156/250] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc2104392..fbc3ab9c0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell ## Try it today -* [Buckaroo full tour](https://ydata-profiling.ydata.ai/examples/master/meteorites/meteorites_report.html) (comprehensive set of meteorite landing - object properties and locations) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) +* [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) (Walkthrough of Buckaroo functionality, including histograms, extending Summary Stats) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) From 02ac7b980cd8449ff420bd873ecc509400b19930 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 26 Oct 2023 09:11:06 -0400 Subject: [PATCH 157/250] Release 0.3.26 (#78) Release 0.3.26 fixes some bugs which prevented rendering and adds a good full tutorial * Added example-notebooks/Full-Tour.ipynb a documented tour of buckaroo features. * Added working google colab link to Full-Tour.ipynb (Fixes #17) https://github.com/paddymul/buckaroo/issues/17 * Fixes Stacktrace on dataframes without a numeric column #52 https://github.com/paddymul/buckaroo/issues/52 * Fixes add_analysis reproduce code is duplicated #51 https://github.com/paddymul/buckaroo/issues/51 * Fixes Quiet=False sometimes fails #50 https://github.com/paddymul/buckaroo/issues/50 --- README.md | 6 + buckaroo/_version.py | 2 +- buckaroo/analysis.py | 8 + buckaroo/analysis_management.py | 130 +++-- buckaroo/buckaroo_widget.py | 6 +- example-notebooks/Full-tour.ipynb | 608 ++++++++++++++++++++++++ example-notebooks/Histograms-demo.ipynb | 64 +-- package.json | 2 +- pyproject.toml | 2 +- tests/analysis_management_test.py | 52 +- tests/basic_widget_test.py | 11 +- tests/fixtures.py | 2 + 12 files changed, 788 insertions(+), 105 deletions(-) create mode 100644 example-notebooks/Full-tour.ipynb diff --git a/README.md b/README.md index fbc3ab9c0..e361c6bd7 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,13 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell ![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) +## Try it today + +* [Buckaroo full tour](https://ydata-profiling.ydata.ai/examples/master/meteorites/meteorites_report.html) (comprehensive set of meteorite landing - object properties and locations) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) + + +https:// ## Installation If using JupyterLab, `buckaroo` requires JupyterLab version 3 or higher. diff --git a/buckaroo/_version.py b/buckaroo/_version.py index fba90a075..4de980db7 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Bloomberg. # Distributed under the terms of the Modified BSD License. -__version__ = "0.3.25" +__version__ = "0.3.26" diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index 707c90334..f70780bf9 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -3,17 +3,25 @@ from pandas.io.json import dumps as pdumps import numpy as np from buckaroo.pluggable_analysis_framework import ColAnalysis +import warnings def probable_datetime(ser): + #turning off warnings in this single function is a bit of a hack. + #Understandable since this is explicitly abusing pd.to_datetime + #which throws warnings. + + warnings.filterwarnings('ignore') s_ser = ser.sample(np.min([len(ser), 500])) try: dt_ser = pd.to_datetime(s_ser) #pd.to_datetime(1_00_000_000_000_000_000) == pd.to_datetime('1973-01-01') + warnings.filterwarnings('default') if dt_ser.max() < pd.to_datetime('1973-01-01'): return False return True except Exception as e: + warnings.filterwarnings('default') return False def get_mode(ser): diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py index 170a56b8a..9d82b99be 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/analysis_management.py @@ -1,6 +1,8 @@ +import sys +import traceback + import numpy as np import pandas as pd -import traceback from buckaroo.pluggable_analysis_framework import ( ColAnalysis, order_analysis, check_solvable, NotProvidedException) from buckaroo.serialization_utils import pd_py_serialize, pick, d_update @@ -28,13 +30,63 @@ 'max_digits':None, 'histogram': []} -def reproduce_summary(ser_name, kls, summary_df): - summary_ser = summary_df[ser_name] + + +def get_df_name(df, level=0): + """ looks up the call stack until it finds the variable with this name""" + if level == 0: + _globals = globals() + elif level < 60: + try: + call_frame = sys._getframe(level) + _globals = call_frame.f_globals + except ValueError: + return None #we went to far up the stacktrace to a non-existent frame + else: + return None + + name_possibs = [x for x in _globals.keys() if _globals[x] is df] + if name_possibs: + return name_possibs[0] + else: + #+2 because the function is recursive, and we need to skip over this frame + return get_df_name(df, level + 2) + +def safe_summary_df(base_summary_df, index_list): + #there are instances where not all indexes of the summary_df will + #be available, because there was no valid data to produce those + #indexes. This fixes them and explicitly. Empty rows will have NaN + return pd.DataFrame(base_summary_df, index_list) + +def reproduce_summary(ser_name, kls, summary_df, err, operating_df_name): + ssdf = safe_summary_df(summary_df, kls.requires_summary) + summary_ser = ssdf[ser_name] minimal_summary_dict = pick(summary_ser, kls.requires_summary) sum_ser_repr = "pd.Series(%s)" % pd_py_serialize(minimal_summary_dict) - print("%s.summary(PERVERSE_DF['%s'], %s, PERVERSE_DF['%s'])" % ( - kls.cname(), ser_name, sum_ser_repr, ser_name)) + f = "{kls}.summary({df_name}['{ser_name}'], {summary_ser_repr}, {df_name}['{ser_name}']) # {err_msg}" + print(f.format( + kls=kls.cname(), df_name=operating_df_name, ser_name=ser_name, + summary_ser_repr=sum_ser_repr, err_msg=err)) + +def output_reproduce_preamble(): + print("#Reproduction code") + print("#" + "-" * 80) + print("from buckaroo.analysis_management import PERVERSE_DF") + +def output_full_reproduce(errs, summary_df, df_name): + if len(errs) == 0: + raise Exception("output_full_reproduce called with 0 len errs") + + try: + for ser_name, err_kls in errs.items(): + err, kls = err_kls + reproduce_summary(ser_name, kls, summary_df, err, df_name) + except Exception as e: + #this is tricky stuff that shouldn't error, I want these stack traces to escape being caught + traceback.print_exc() + + def produce_summary_df(df, ordered_objs, df_name='test_df'): @@ -68,7 +120,6 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): except Exception as e: if not a_kls.quiet: errs[ser_name] = e, a_kls - #traceback.print_exc() continue summary_col_dict[ser_name] = summary_ser @@ -77,19 +128,6 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): BASE_COL_HINT.keys()) summary_df = pd.DataFrame(summary_col_dict) table_hints = table_hint_col_dict - if errs: - for ser_name, err_kls in errs.items(): - err, kls = err_kls - print("%r failed on %s with %r" % (kls, ser_name, err)) - - print("Reproduction code") - print("-" * 80) - print("from buckaroo.analysis_management import PERVERSE_DF") - for ser_name, err_kls in errs.items(): - err, kls = err_kls - reproduce_summary(ser_name, kls, summary_df) - print("-" * 80) - return summary_df, table_hints, errs class NonExistentSummaryRowException(Exception): @@ -126,8 +164,6 @@ def verify_analysis_objects(self, analysis_objects): self.ordered_a_objs = order_analysis(analysis_objects) check_solvable(self.ordered_a_objs) self.process_summary_facts_set() - if self.unit_test_objs: - self.unit_test() def unit_test(self): """test a single, or each col_analysis object with a set of commonly difficult series. @@ -140,17 +176,16 @@ def unit_test(self): try: output_df, table_hint_dict, errs = produce_summary_df(PERVERSE_DF, self.ordered_a_objs) if len(errs) == 0: - return True - return False - except Exception as e: - print("analysis pipeline unit_test failed") - print(e) - return False + return True, [] + else: + return False, errs + except KeyError: + pass def process_df(self, input_df): output_df, table_hint_dict, errs = produce_summary_df(input_df, self.ordered_a_objs) - return output_df, table_hint_dict + return output_df, table_hint_dict, errs def add_analysis(self, new_aobj): new_cname = new_aobj.cname() @@ -161,10 +196,10 @@ def add_analysis(self, new_aobj): new_aobj_set.append(aobj) new_aobj_set.append(new_aobj) self.verify_analysis_objects(new_aobj_set) - if not self.unit_test(): - print("new analysis fails unit tests") - return False - return True + passed_unit_test, errs = self.unit_test() + if passed_unit_test is False: + return False, errs + return True, [] class DfStats(object): @@ -172,13 +207,16 @@ class DfStats(object): DfStats exists to handle inteligent downampling and applying the ColAnalysis functions ''' - def __init__(self, df, col_analysis_objs): - self.df = self.get_operating_df(df, force_full_eval=False) + def __init__(self, df_stats_df, col_analysis_objs, operating_df_name=None): + self.df = self.get_operating_df(df_stats_df, force_full_eval=False) self.col_order = self.df.columns self.ap = AnalsysisPipeline(col_analysis_objs) - self.sdf, self.table_hints = self.ap.process_df(self.df) - + self.operating_df_name = operating_df_name + self.sdf, self.table_hints, errs = self.ap.process_df(self.df) + if errs: + output_full_reproduce(errs, self.sdf, operating_df_name) + def get_operating_df(self, df, force_full_eval): rows = len(df) cols = len(df.columns) @@ -193,9 +231,21 @@ def get_operating_df(self, df, force_full_eval): def presentation_sdf(self): if self.ap.summary_stats_display == "all": return self.sdf - return self.sdf.loc[self.ap.summary_stats_display] + return safe_summary_df(self.sdf, self.ap.summary_stats_display) def add_analysis(self, a_obj): - self.ap.add_analysis(a_obj) - self.sdf, self.table_hints = self.ap.process_df(self.df) - + passed_unit_tests, ut_errs = self.ap.add_analysis(a_obj) + self.sdf, self.table_hints, errs = self.ap.process_df(self.df) + if passed_unit_tests == False: + print("Unit tests failed") + if errs: + print("Errors on original dataframe") + + if ut_errs or errs: + output_reproduce_preamble() + if ut_errs: + ut_summary_df, _unused_table_hint_dict, ut_errs2 = produce_summary_df( + PERVERSE_DF, self.ap.ordered_a_objs) + output_full_reproduce(ut_errs, ut_summary_df, "PERVERSE_DF") + if errs: + output_full_reproduce(errs, self.sdf, self.operating_df_name) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 75f270fc1..9aafdc1fc 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -21,7 +21,7 @@ from .down_sample import sample from .analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) -from .analysis_management import DfStats +from .analysis_management import DfStats, get_df_name from .serialization_utils import df_to_obj, EMPTY_DF_OBJ @@ -104,6 +104,7 @@ def __init__(self, df, self.postProcessingF = postProcessingF self.processed_result = None self.transformed_df = None + self.df_name = get_df_name(df) self.setup_from_command_kls_list() self.dfConfig = self.get_df_config(df, sampled, reorderdColumns, showCommands) @@ -113,6 +114,7 @@ def __init__(self, df, warnings.filterwarnings('default') + def run_autoclean(self, autoType): if autoType: # this will trigger the setting of self.typed_df @@ -202,7 +204,7 @@ def get_working_df(self): def set_typed_df(self, new_df): self.typed_df = new_df # stats need to be rerun each time - self.stats = DfStats(self.typed_df, [TypingStats, DefaultSummaryStats, ColDisplayHints]) + self.stats = DfStats(self.typed_df, [TypingStats, DefaultSummaryStats, ColDisplayHints], self.df_name) self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) self.update_based_on_df_config(3) diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb new file mode 100644 index 000000000..1fb6923c9 --- /dev/null +++ b/example-notebooks/Full-tour.ipynb @@ -0,0 +1,608 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install buckaroo\n", + "try:\n", + " from google.colab import output\n", + " output.enable_custom_widget_manager()\n", + "except Exception as e:\n", + " print(e)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import buckaroo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Demonstrating Buckaroo on Citibike data.\n", + "This might take a little time to download\n", + "\n", + "*once the view loads click 0's and 1's on the top left to toggle different parts of the UI*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")\n", + "#df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Notice the monospaced numeric formatting in the following dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "num_df = pd.DataFrame({'a':[111_111, 77_777, 777_777, 1_000_000, 2_111_111, 1_235_999],\n", + " 'b':[111_111, 555_555, 0, 28_123, 482_388, 5_666]})\n", + "num_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Histograms\n", + "\n", + "Histograms are built into Buckaroo. They enable users to quickly identify distributions of data in columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#these are some utility functions for generating random distributions\n", + "#execute and ignore this cell\n", + "import numpy as np \n", + "def bimodal(mean_1, mean_2, N, sigma=5):\n", + " X1 = np.random.normal(mean_1, sigma, int(N/2))\n", + " X2 = np.random.normal(mean_2, sigma, int(N/2))\n", + " X = np.concatenate([X1, X2])\n", + " return X\n", + "\n", + "def rand_cat(named_p, na_per, N):\n", + " choices, p = [], []\n", + " named_total_per = sum(named_p.values()) + na_per\n", + " total_len = int(np.floor(named_total_per * N))\n", + " if named_total_per > 0:\n", + " for k, v in named_p.items():\n", + " choices.append(k)\n", + " p.append(v/named_total_per)\n", + " choices.append(pd.NA)\n", + " p.append(na_per/named_total_per) \n", + " return [np.random.choice(choices, p=p) for k in range(total_len)]\n", + " return []\n", + "\n", + "def random_categorical(named_p, unique_per, na_per, longtail_per, N):\n", + " choice_arr = rand_cat(named_p, na_per, N)\n", + " discrete_choice_len = len(choice_arr)\n", + "\n", + " longtail_count = int(np.floor(longtail_per * N))//2\n", + " extra_arr = []\n", + " for i in range(longtail_count):\n", + " extra_arr.append(\"long_%d\" % i)\n", + " extra_arr.append(\"long_%d\" % i)\n", + "\n", + " unique_len = N - (len(extra_arr) + discrete_choice_len)\n", + " for i in range(unique_len):\n", + " extra_arr.append(\"unique_%d\" % i)\n", + " all_arr = np.concatenate([choice_arr, extra_arr])\n", + " np.random.shuffle(all_arr)\n", + " return all_arr \n", + "N = 4000" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Common histogram shapes\n", + "The following shows the most common shapes you will see in histograms, allowing you to quickly identify patterns\n", + "\n", + "Notice the three columns on the right. Those are categorical histograms as opposed to numerical histograms" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pd.DataFrame({\n", + " 'normal': np.random.normal(25, .3, N),\n", + " 'exponential' : np.random.exponential(1.0, N) * 10 ,\n", + " 'increasing':[i for i in range(N)],\n", + " 'one': [1]*N,\n", + " 'dominant_categories': random_categorical({'foo': .6, 'bar': .25, 'baz':.15}, unique_per=0, na_per=0, longtail_per=0, N=N),\n", + " 'all_unique_cat': random_categorical({}, unique_per=1, na_per=0, longtail_per=0, N=N)})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Categorical histograms\n", + "Categorical histograms have special colors and patterns for `NA`/`NaN`, `longtail` (values that occur at least twice) and `unique`\n", + "Categorical histograms are always arranged from most frequent on the left to least frequent on the right.\n", + "\n", + "When a column is numerical, but has less than 5 distinct values it is displayed with a categorical histogram, because the numbers were probably flags" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pd.DataFrame({\n", + " 'all_NA' : [pd.NA] * N,\n", + " 'half_NA' : random_categorical({1: .5}, unique_per=0, na_per=.5, longtail_per=.0, N=N),\n", + " 'dominant_categories': random_categorical({'foo': .6, 'bar': .25, 'baz':.15}, unique_per=0, na_per=0, longtail_per=0, N=N),\n", + " 'longtail' : random_categorical({}, unique_per=0, na_per=.2, longtail_per=.8, N=N),\n", + " 'longtail_unique' : random_categorical({}, unique_per=0.5, na_per=.0, longtail_per=.5, N=N)})" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Notice the different distributions of the numeric histograms" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame({\n", + " 'bimodal' : bimodal(20,40, N),\n", + " 'exponential' : np.random.exponential(1.0, N) * 10 ,\n", + " 'geometric': np.random.geometric(.2, N) * 10,\n", + " 'log_normal': np.random.lognormal(25, .3, N),\n", + " 'normal': np.random.normal(25, .3, N),})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Auto typing\n", + "Click over to summary stats and notice the difference between the dtypes on these two tables\n", + "notice that the birth year for the first table includes `\\n`, autoTyping was turned off for this widget\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "BuckarooWidget = buckaroo.BuckarooWidget\n", + "w = BuckarooWidget(df, autoType=False, showCommands=False)\n", + "w" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Turning off autocleaning by column\n", + "This widget has been configured to have the low code UI on by default.\n", + "Observe that the cleaning operation for each column has been added,\n", + "and can be removed with the X" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "w = BuckarooWidget(df, showCommands=True)\n", + "w" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Adding a summary stat\n", + "Buckaroo is completely customizeable. In the next cells we will add `Variance` to an instance of the BuckarooWidget with the `Pluggable Analysis Framework`.\n", + "\n", + "## Why was the Pluggable Analysis Framework built?\n", + "The `Pluggable Analysis Framework` is engineered to allow summary_stats to be built up piecemeal and incrementally. Traditionally when writing bits of analysis code, the tendency is to have large brittle functions that do a lot at once. Adding extra stats either requires copying and pasting the existing function with one small addition, writing each stat independently and possibly recomputing existing stats, having a strictly ordered set of analysis functions, or some complex adhoc argument passing scheme. I have written adhoc versions in each of these patterns. Problems are manifest and the aparatus rarely survives even copy-pasting to the next notebook.\n", + "\n", + "## How does the Pluggable Analysis Framework work?\n", + "The `Pluggable Analysis Framework` is built around a DAG of `ColAnalysis` nodes that can depend on other summary stats, and provide one or more summary stats. Nodes cand be added to the dag with `add_analysis`. If a class with the same name is inserted into the DAG, the newly inserted node replaces the previous instantiation. This all facilitates interactive development of analysis functions. During execution errors are caught and execution proceeds. This is important because breaking the default dataframe mechanism is a show stopping problem for users\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "w = buckaroo.BuckarooWidget(df, showCommands=False)\n", + "w" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from buckaroo.pluggable_analysis_framework import (ColAnalysis)\n", + "class Variance(ColAnalysis):\n", + " provides_summary = [\"variance\"]\n", + " requires_summary = [\"mean\"]\n", + "\n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " mean = summary_ser.get('mean', False)\n", + " arr = ser.to_numpy()\n", + " \n", + " if mean is pd.NA or mean is np.nan or mean is False:\n", + " return dict(variance=\"NA\")\n", + " elif mean and pd.api.types.is_integer_dtype(ser):\n", + " return dict(variance=np.mean((arr - mean)**2))\n", + " elif mean and pd.api.types.is_float_dtype(ser):\n", + " return dict(variance=np.mean((arr - mean)**2))\n", + " return dict(variance=\"NA\")\n", + " summary_stats_display = [\n", + " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", + " 'empty_per', 'unique_per', 'nan_per', \n", + " 'is_numeric', 'is_integer', 'is_datetime',\n", + " 'mode', 'min', 'max', 'mean', \n", + " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", + " 'variance']\n", + "w.add_analysis(Variance)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "analysis is added interactively, toggle the summary stats view on the widget above and notice that `variance` has been added" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic Unit testing is built in\n", + "\n", + "Because there are so many corner cases with numerical code, every time a new summary stat is added, a variety of simple tests are run against it. This lets you discover bugs earlier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "small_df = df[:500][df.columns[:4]]\n", + "# we are going to create, but not display a BuckarooWidget here, we are looking at the error behavior\n", + "w = buckaroo.BuckarooWidget(small_df, showCommands=False)\n", + "\n", + "class Variance(ColAnalysis):\n", + " provides_summary = [\"variance\"]\n", + " requires_summary = [\"mean\"]\n", + " \n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " mean = summary_ser.get('mean', False)\n", + " arr = ser.to_numpy()\n", + " #toggle SIMULATED_BUG to easily see behavior with and without a bug\n", + " SIMULATED_BUG = True\n", + " if SIMULATED_BUG:\n", + " if mean in [pd.NA, np.nan, False]:\n", + " return dict(variance=\"NA\")\n", + " else:\n", + " if mean is pd.NA or mean is np.nan or mean is False:\n", + " return dict(variance=\"NA\")\n", + " if mean and pd.api.types.is_integer_dtype(ser):\n", + " return dict(variance=np.mean((arr - mean)**2))\n", + " elif mean and pd.api.types.is_float_dtype(ser):\n", + " return dict(variance=np.mean((arr - mean)**2))\n", + " return dict(variance=\"NA\")\n", + " \n", + " summary_stats_display = [\n", + " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", + " 'empty_per', 'unique_per', 'nan_per', \n", + " 'is_numeric', 'is_integer', 'is_datetime',\n", + " 'mode', 'min', 'max', 'mean', \n", + " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", + " 'variance']\n", + "\n", + "w.add_analysis(Variance)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reproducing errors in the notebook\n", + "Buckaroo printed reproduction instructions like\n", + "```\n", + "from buckaroo.analysis_management import PERVERSE_DF\n", + "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous\n", + "\n", + "```\n", + "\n", + "`PERVERSE_DF` is a DataFame with all kinds of edgecases that normally trip up numerical code. You can run the above two lines, and quickly start iterating on your `ColAnalysis` class to fix the error. Normally adhoc analysis code that iterates over a list of functions blows up in a stack trace referencing an anonymous function in the middle of a for loop called with opaque variables. Bucakroo gives you a single line that can reproduce the error, with easily inspectable variables" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Quiet mode\n", + "Sometimes you just want to get on with it. Buckaroo has a setting for that too, set `quiet=True` and unit test errors, and regular processing errors will be silenced. Not recommended, but if I didn't add it, users would write their own adhoc version." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "w = buckaroo.BuckarooWidget(small_df, showCommands=False)\n", + "#There are errors in the following functions, quiet = True will ignore them\n", + "\n", + "def int_digits(n):\n", + " if np.isnan(n):\n", + " return 1\n", + " if n == 0:\n", + " return 1\n", + " if np.sign(n) == -1:\n", + " return int(np.floor(np.log10(np.abs(n)))) + 2\n", + " return int(np.floor(np.log10(n)+1))\n", + "class MinDigits(ColAnalysis):\n", + " \n", + " requires_summary = [\"min\"]\n", + " provides_summary = [\"min_digits\"]\n", + " quiet = True\n", + " \n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype)\n", + " if is_numeric:\n", + " return {\n", + " 'min_digits':int_digits(summary_ser.loc['min'])}\n", + " else:\n", + " return {\n", + " 'min_digits':0}\n", + "w.add_analysis(MinDigits)\n", + "w" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Adding a Command to the Low Code UI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "w = buckaroo.BuckarooWidget(df[:500], showCommands=True, autoType=False) #turning autoType=False to reduce clutter in the operations\n", + "w" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.all_transforms import Command\n", + "from buckaroo.lispy import s\n", + "#Here we start adding commands to the Buckaroo Widget. Every call to add_command replaces a command with the same name\n", + "@w.add_command\n", + "class GroupBy2(Command):\n", + " command_default = [s(\"groupby2\"), s('df'), 'col', {}]\n", + " command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]]\n", + " @staticmethod \n", + " def transform(df, col, col_spec):\n", + " grps = df.groupby(col)\n", + " df_contents = {}\n", + " for k, v in col_spec.items():\n", + " if v == \"sum\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.sum())\n", + " elif v == \"mean\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.mean())\n", + " elif v == \"median\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.median())\n", + " elif v == \"count\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.count())\n", + " return pd.DataFrame(df_contents)\n", + "\n", + " @staticmethod \n", + " def transform_to_py(df, col, col_spec):\n", + " commands = [\n", + " \" grps = df.groupby('%s')\" % col,\n", + " \" df_contents = {}\"\n", + " ]\n", + " for k, v in col_spec.items():\n", + " if v == \"sum\":\n", + " commands.append(\" paddydf_contents['%s'] = grps['%s'].apply(lambda x: x.sum())\" % (k, k))\n", + " elif v == \"mean\":\n", + " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.mean())\" % (k, k))\n", + " elif v == \"median\":\n", + " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.median())\" % (k, k))\n", + " elif v == \"count\":\n", + " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.count())\" % (k, k))\n", + " commands.append(\" df = pd.DataFrame(df_contents)\")\n", + " return \"\\n\".join(commands)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that `groupby2` has been added to the commands" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Buckaroo also works on polars" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import polars as pl\n", + "pl.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "buckaroo.debug_packages()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Making a new default dataframe display function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.widget_utils import disable\n", + "from IPython.core.getipython import get_ipython\n", + "from IPython.display import display\n", + "import warnings\n", + "\n", + "disable()\n", + "def my_display_as_buckaroo(df):\n", + " w = BuckarooWidget(df, showCommands=False)\n", + " #the analysis we added throws warnings, let's muffle that when used as the default display\n", + " warnings.filterwarnings('ignore')\n", + " w.add_analysis(Skew)\n", + " warnings.filterwarnings('default')\n", + " return display(w)\n", + "\n", + "def my_enable():\n", + " \"\"\"\n", + " Automatically use buckaroo to display all DataFrames\n", + " instances in the notebook.\n", + "\n", + " \"\"\"\n", + " ip = get_ipython()\n", + " if ip is None:\n", + " print(\"must be running inside ipython to enable default display via enable()\")\n", + " return\n", + " ip_formatter = ip.display_formatter.ipython_display_formatter\n", + " ip_formatter.for_type(pd.DataFrame, my_display_as_buckaroo)\n", + "my_enable()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/example-notebooks/Histograms-demo.ipynb b/example-notebooks/Histograms-demo.ipynb index 078ebd906..cc99a01fd 100644 --- a/example-notebooks/Histograms-demo.ipynb +++ b/example-notebooks/Histograms-demo.ipynb @@ -3,37 +3,33 @@ { "cell_type": "code", "execution_count": null, - "id": "75a6af82-5029-4d16-abf1-f0aeb0489957", - "metadata": { - "tags": [] - }, + "id": "d99a7ecf-6cce-4b9a-b8be-8b0d1c206b67", + "metadata": {}, "outputs": [], "source": [ - "import numpy as np\n", - "import itertools\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import buckaroo\n", - "%matplotlib inline" + "%pip install buckaroo\n", + "try:\n", + " from google.colab import output\n", + " output.enable_custom_widget_manager()\n", + "except Exception as e:\n", + " print(e)" ] }, { "cell_type": "code", "execution_count": null, - "id": "e7e8c5b0-a8c4-4b18-95a3-4be3e4dd6cb6", + "id": "75a6af82-5029-4d16-abf1-f0aeb0489957", "metadata": { "tags": [] }, "outputs": [], "source": [ - "#regular histograms \n", - "N=400\n", - "mu, sigma = 40, 5\n", - "mu2, sigma2 = 60, 5\n", - "X1 = np.random.normal(mu, sigma, N)\n", - "X2 = np.random.normal(mu2, sigma2, N)\n", - "X = np.concatenate([X1, X2])\n", - "ab = plt.hist(X,bins=10)" + "import numpy as np\n", + "import itertools\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import buckaroo\n", + "%matplotlib inline" ] }, { @@ -50,22 +46,7 @@ " X2 = np.random.normal(mean_2, sigma2, int(N/2))\n", " X = np.concatenate([X1, X2])\n", " return X\n", - "ab = plt.hist(bimodal(20,40, 400),bins=10)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b1f7c1ac-26c1-4660-8a6f-936f13d95351", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "#lognormal histograms\n", - "mu, sigma = 3, .5 # mean and standard deviation\n", - "s = np.random.lognormal(mu, sigma, N)\n", - "ab = plt.hist(s,bins=10)" + "#ab = plt.hist(bimodal(20,40, 400),bins=10)" ] }, { @@ -111,18 +92,6 @@ " return all_arr " ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "51cc9b45-beeb-4f68-bcd5-d115bb91f1a2", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "N = 4000" - ] - }, { "cell_type": "code", "execution_count": null, @@ -132,6 +101,7 @@ }, "outputs": [], "source": [ + "N = 4000\n", "pd.DataFrame({\n", " 'all_NA' : [pd.NA] * N,\n", " 'half_NA' : random_categorical({1: .5}, unique_per=0, na_per=.5, longtail_per=.0, N=N),\n", diff --git a/package.json b/package.json index 3827a8c3c..4a21b93c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.3.25", + "version": "0.3.26", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index f0439fa6e..c16aac25a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.25" +version = "0.3.26" [project.license] file = "LICENSE.txt" diff --git a/tests/analysis_management_test.py b/tests/analysis_management_test.py index c91edd929..3bef12c03 100644 --- a/tests/analysis_management_test.py +++ b/tests/analysis_management_test.py @@ -5,10 +5,11 @@ ColAnalysis) from buckaroo.analysis_management import ( - AnalsysisPipeline, produce_summary_df, NonExistentSummaryRowException) + AnalsysisPipeline, produce_summary_df, NonExistentSummaryRowException, + DfStats) -from buckaroo.analysis import (TypingStats, DefaultSummaryStats) -from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen) +from buckaroo.analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) +from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen, word_only_df) class DumbTableHints(ColAnalysis): provides_summary = [ @@ -56,8 +57,8 @@ class Foo(ColAnalysis): @staticmethod def summary(sampled_ser, summary_ser, ser): return dict(foo=8) - assert ap.add_analysis(Foo) == True #verify no errors thrown - sdf, _unused = ap.process_df(df) + assert ap.add_analysis(Foo) == (True, []) #verify no errors thrown + sdf, _unused, _unused_errs = ap.process_df(df) self.assertEqual(sdf.loc['foo']['tripduration'], 8) def test_add_buggy_aobj(self): @@ -70,7 +71,9 @@ class Foo(ColAnalysis): def summary(sampled_ser, summary_ser, ser): 1/0 #throw an error return dict(foo=8) - assert ap.add_analysis(Foo) == False + unit_test_results, errs = ap.add_analysis(Foo) + + assert unit_test_results == False def test_replace_aobj(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) @@ -82,7 +85,7 @@ class Foo(ColAnalysis): def summary(sampled_ser, summary_ser, ser): return dict(foo=8) ap.add_analysis(Foo) - sdf, _unused = ap.process_df(df) + sdf, _unused, _unused_errs = ap.process_df(df) self.assertEqual(sdf.loc['foo']['tripduration'], 8) #18 facts returned about tripduration self.assertEqual(len(sdf['tripduration']), 18) @@ -95,7 +98,7 @@ class Foo(ColAnalysis): def summary(sampled_ser, summary_ser, ser): return dict(foo=9) ap.add_analysis(Foo) - sdf2, _unused = ap.process_df(df) + sdf2, _unused, _unused_errs = ap.process_df(df) self.assertEqual(sdf2.loc['foo']['tripduration'], 9) #still 18 facts returned about tripduration self.assertEqual(len(sdf2['tripduration']), 18) @@ -142,3 +145,36 @@ def bad_add(): self.assertRaises(NonExistentSummaryRowException, bad_add) + + +class SometimesProvides(ColAnalysis): + provides_summary = ['conditional_on_dtype'] + + summary_stats_display = ['conditional_on_dtype'] + + @staticmethod + def summary(sampled_ser, summary_ser, ser): + import pandas as pd + is_numeric = pd.api.types.is_numeric_dtype(ser) + if is_numeric: + return dict(conditional_on_dtype=True) + return {} + +class TestDfStats(unittest.TestCase): + def test_dfstats_sometimes_present(self): + """many ColAnalysis objects are written such that they only + provide stats for certain dtypes. This used to cause + instantiation failures. This test verifies that there are no + stack traces. The alternative would be to have ColAnalyis + objects always return every key, even if NA. That's a less + natural style to write analyis code. + + Possible future improvement is to run through PERVERSE_DF and + verify that each ColAnalyis provides its specified value as + non NA at least once + + """ + dfs = DfStats(word_only_df, [SometimesProvides]) + ab = dfs.presentation_sdf + + diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index 712cfdc07..cfd8f2160 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -2,12 +2,10 @@ from IPython.display import display from buckaroo.buckaroo_widget import BuckarooWidget from buckaroo.analysis_management import PERVERSE_DF - +from .fixtures import (word_only_df) simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) -#test against this too -word_only_df = pd.DataFrame({'letters': 'h o r s e'.split(' ')}) def test_basic_instantiation(): @@ -18,6 +16,9 @@ def test_perverse_instantiation(): w = BuckarooWidget(PERVERSE_DF) assert w.dfConfig['totalRows'] == 10 +def test_word_only_instantiation(): + w = BuckarooWidget(word_only_df) + def test_basic_display(): df = simple_df w = BuckarooWidget(df) @@ -75,12 +76,12 @@ def test_interpreter_errors(): def test_analysis_pipeline(): """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" w = BuckarooWidget(simple_df) - assert w.stats.ap.unit_test() == True + assert w.stats.ap.unit_test() == (True, []) def test_autotype_false(): """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" w = BuckarooWidget(simple_df, autoType=False) - assert w.stats.ap.unit_test() == True + assert w.stats.ap.unit_test() == (True, []) def test_post_processing(): def my_func(df): diff --git a/tests/fixtures.py b/tests/fixtures.py index 1a316b1bc..3d945de23 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -8,6 +8,8 @@ 'float_nan_ser' : pd.Series([3.5, np.nan, 4.8]) }) +word_only_df = pd.DataFrame({'letters': 'h o r s e'.split(' ')}) + df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') From 250c73c7a9cbbfe03c1ab240dfc5bb3ca3d3033e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 26 Oct 2023 13:17:29 -0400 Subject: [PATCH 158/250] Update README.md --- README.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/README.md b/README.md index e361c6bd7..a5e6f6030 100644 --- a/README.md +++ b/README.md @@ -4,19 +4,12 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell ## Try it today -* [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) (Walkthrough of Buckaroo functionality, including histograms, extending Summary Stats) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) +* [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) (Walkthrough of Buckaroo functionality (histograms, extending Summary Stats) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) ![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) -## Try it today - -* [Buckaroo full tour](https://ydata-profiling.ydata.ai/examples/master/meteorites/meteorites_report.html) (comprehensive set of meteorite landing - object properties and locations) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) - - - -https:// ## Installation If using JupyterLab, `buckaroo` requires JupyterLab version 3 or higher. From 3b29e525be7c312e784a87140791c9a3a97f6d9f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 26 Oct 2023 13:40:50 -0400 Subject: [PATCH 159/250] Feat/simplified formatters (#80) Release 0.3.28 improves formatting behavior * Fixes #70 `NA`'s in Strings https://github.com/paddymul/buckaroo/issues/70 * Fixes #53 booleans displayed as integers https://github.com/paddymul/buckaroo/issues/53 * Fixes #54 refactor table_hints https://github.com/paddymul/buckaroo/issues/54 --- buckaroo/_version.py | 4 +- buckaroo/analysis.py | 16 ++- buckaroo/analysis_management.py | 1 + buckaroo/serialization_utils.py | 2 +- js/components/StatusBar.tsx | 8 +- js/components/gridUtils.ts | 92 ++++++++------ js/components/staticData.ts | 104 +++++++++------- package.json | 2 +- pyproject.toml | 2 +- tests/analysis_management_test.py | 2 +- webpack-local-dev.config.js | 200 ++++++++++++++++++++++++++++++ 11 files changed, 336 insertions(+), 97 deletions(-) create mode 100644 webpack-local-dev.config.js diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 4de980db7..2c0dc394f 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ -# Copyright (c) Bloomberg. +# Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.3.26" +__version__ = "0.3.28" diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index f70780bf9..046a02ef5 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -207,13 +207,25 @@ def histogram(ser, nan_per): class ColDisplayHints(ColAnalysis): requires_summary = ['min', 'max'] # What summary stats does this analysis provide provides_summary = [ - 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram'] + 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram', 'type'] @staticmethod def summary(sampled_ser, summary_ser, ser): - is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype) + + is_numeric = pd.api.types.is_numeric_dtype(sampled_ser) is_bool = pd.api.types.is_bool_dtype(sampled_ser) + _type = "obj" + if is_bool: + _type = "boolean" + elif is_numeric: + if pd.api.types.is_float_dtype(sampled_ser): + _type = "float" + else: + _type = "integer" + elif pd.api.types.is_string_dtype(sampled_ser): + _type = "string" base_dict = dict( + type=_type, is_numeric=is_numeric, is_integer=pd.api.types.is_integer_dtype(sampled_ser), histogram=histogram(sampled_ser, summary_ser['nan_per'])) diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py index 9d82b99be..b9506efaf 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/analysis_management.py @@ -24,6 +24,7 @@ BASE_COL_HINT = { + 'type':'string', 'is_numeric': False, 'is_integer': None, 'min_digits':None, diff --git a/buckaroo/serialization_utils.py b/buckaroo/serialization_utils.py index a410e4089..e4daaaf61 100644 --- a/buckaroo/serialization_utils.py +++ b/buckaroo/serialization_utils.py @@ -57,7 +57,7 @@ def pd_py_serialize(dct): def dumb_table_sumarize(df): """used when table_hints aren't provided. Trests every column as a string""" - table_hints = {col:{'is_numeric':False} for col in df} + table_hints = {col:{'is_numeric':False, type:'obj'} for col in df} table_hints['index'] = {'is_numeric': False} return table_hints diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index 0baab31b9..de50226ef 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -3,7 +3,7 @@ import React, { useState, useRef } from 'react'; import _ from 'lodash'; import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component import { ColDef, GridOptions } from 'ag-grid-community'; -import { intFormatter } from './gridUtils'; +import { basicIntFormatter } from './gridUtils'; export type setColumFunc = (newCol: string) => void; export interface DfConfig { @@ -82,10 +82,10 @@ export function StatusBar({ const rowData = [ { - totalRows: intFormatter.format(totalRows), + totalRows: basicIntFormatter.format(totalRows), columns, - rowsShown: intFormatter.format(rowsShown), - sampleSize: intFormatter.format(sampleSize), + rowsShown: basicIntFormatter.format(rowsShown), + sampleSize: basicIntFormatter.format(sampleSize), sampled: sampled ? '1' : '0', summaryStats: summaryStats ? '1' : '0', // reorderdColumns: reorderdColumns ? "1" : "ό", diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index 95a391ac4..df69eac70 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -3,7 +3,7 @@ import { ValueFormatterFunc, ValueFormatterParams, } from 'ag-grid-community'; -import { DFWhole, DFColumn, ColumnHint } from './staticData'; +import { DFWhole, DFColumn, ColumnHint, ColumnIntegertHint, ColumnFloatHint } from './staticData'; import _ from 'lodash'; export const updateAtMatch = ( cols: ColDef[], @@ -27,39 +27,35 @@ export const updateAtMatch = ( inside of AG-Grid, and independently. */ -export const intFormatter = new Intl.NumberFormat('en-US', { + +export const basicIntFormatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 3, }); -const floatFormatter = new Intl.NumberFormat('en-US', { - minimumFractionDigits: 3, - maximumFractionDigits: 3, -}); +export const stringFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + return val; +}; + -export const anyFormatter = (params: ValueFormatterParams): string => { +export const booleanFormatter = (params: ValueFormatterParams): string => { const val = params.value; - try { - const num = Number(val); - if (val === null) { - return ''; - } else if (val === undefined) { - return ''; - } else if (Number.isFinite(num)) { - if (Number.isInteger(num)) { - const formatted = intFormatter.format(num); - return `${formatted} `; - } else { - return floatFormatter.format(num); - } - } - } catch (e: any) { - //console.log("formatting error", val, e); + if (val === true) { + return "True" + } else if (val === false) { + return "False" } - return val; + return "" }; -const getNumericFormatter = (totalWidth: number) => { + + +const getIntegerFormatter = (hint: ColumnIntegertHint) => { + + const commas = Math.floor(hint.max_digits / 3); + const totalWidth = commas + hint.max_digits; + const formatter = new Intl.NumberFormat('en-US'); const numericFormatter = (params: ValueFormatterParams): string => { const val = params.value; @@ -71,24 +67,38 @@ const getNumericFormatter = (totalWidth: number) => { return numericFormatter; }; -function getFormatter(hint: ColumnHint): ValueFormatterFunc { - if (hint === undefined || hint.is_numeric === false) { - return anyFormatter; - } else { - const commas = Math.floor(hint.max_digits / 3); +const getFloatFormatter = (hint: ColumnFloatHint) => { - if (hint.is_integer) { - const totalWidth = commas + hint.max_digits; - return getNumericFormatter(totalWidth); - } else { - return (params: ValueFormatterParams): string => { - if (params.value === null) { - return ''; - } - return floatFormatter.format(params.value); - }; + const floatFormatter = new Intl.NumberFormat('en-US', { + minimumFractionDigits: 3, + maximumFractionDigits: 3, + }); + return (params: ValueFormatterParams): string => { + if (params.value === null) { + return ''; } + return floatFormatter.format(params.value); + }; +} + +function getFormatter(hint: ColumnHint): ValueFormatterFunc { + if (hint === undefined) { + return stringFormatter; + } + if (hint.type === "integer") { + return getIntegerFormatter(hint); + } + else if (hint.type === "string") { + return stringFormatter; + + } else if (hint.type === "float") { + return getFloatFormatter(hint); + } else if (hint.type === "boolean") { + return booleanFormatter; + } else if (hint.type === "obj") { + return stringFormatter; } + return stringFormatter; } export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { @@ -101,7 +111,7 @@ export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { field: f.name, headerName: f.name, valueFormatter: getFormatter( - _.get(tdf.table_hints, f.name, { is_numeric: false }) + _.get(tdf.table_hints, f.name, { is_numeric: false, type:"obj" }) ), }; if (f.name === 'index') { diff --git a/js/components/staticData.ts b/js/components/staticData.ts index b19c7a3d5..bb407e3d1 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -28,19 +28,36 @@ export type DFDataRow = Record; export type DFData = DFDataRow[]; export interface ColumnObjHint { - is_numeric: false; + type: "obj" histogram?: any[]; } -export interface ColumnNumHint { - is_numeric: true; - is_integer: boolean; +export interface ColumnStringHint { + type: "string"; + histogram?: any[]; +} + +export interface ColumnBooleanHint { + type: "boolean"; + histogram?: any[]; +} + +export interface ColumnIntegertHint { + type: "integer" min_digits: number; max_digits: number; histogram: any[]; } -export type ColumnHint = ColumnObjHint | ColumnNumHint; +export interface ColumnFloatHint { + type: "float" + histogram: any[]; +} + + +export type ColumnHint = ColumnObjHint | ColumnIntegertHint | ColumnFloatHint | ColumnStringHint | ColumnBooleanHint; + + export interface DFWhole { schema: { fields: DFColumn[]; @@ -184,16 +201,16 @@ export const foo: DFWhole = { pandas_version: '1.4.0', }, table_hints: { - index: { is_numeric: false }, - tripduration: { is_numeric: false, histogram: histograms.num_histo }, - starttime: { is_numeric: false }, - stoptime: { is_numeric: false }, - 'start station id': { is_numeric: false }, - 'start station name': { is_numeric: false }, - 'start station latitude': { is_numeric: false }, - bikeid: { is_numeric: false }, - 'birth year': { is_numeric: false }, - gender: { is_numeric: false }, + index: { type:"obj" }, + tripduration: { histogram: histograms.num_histo, type:"obj"}, + starttime: { type:"obj" }, + stoptime: { type:"obj" }, + 'start station id': { type:"obj" }, + 'start station name': { type:"obj" }, + 'start station latitude': { type:"obj" }, + bikeid: { type:"obj" }, + 'birth year': { type:"obj" }, + gender: { type:"obj" }, }, data: [ { @@ -329,25 +346,23 @@ export const tableDf: DFWhole = { ], table_hints: { 'end station name': { - is_numeric: false, + histogram: histograms.categorical_histo_lt, - }, + type:"obj" }, + tripduration: { - is_numeric: true, - is_integer: true, + type:"integer", min_digits: 3, max_digits: 4, histogram: histograms.num_histo, }, 'start station name': { - is_numeric: false, + histogram: histograms.bool_histo, - }, + type:"string" }, floatCol: { - is_numeric: true, - is_integer: false, - min_digits: 1, - max_digits: 3, + type:"float", + histogram: [ { name: 521, cat_pop: 0.0103 }, { name: 358, cat_pop: 0.0096 }, @@ -362,21 +377,18 @@ export const tableDf: DFWhole = { ], }, nanNumeric: { - is_numeric: true, - is_integer: true, + type: "integer", min_digits: 1, max_digits: 3, histogram: histograms.num_histo, }, nanFloat: { - is_numeric: true, - is_integer: false, - min_digits: 1, - max_digits: 3, + type:"float", histogram: histograms.num_histo, }, nanObject: { - is_numeric: false, + + type:"obj" }, }, }; @@ -386,24 +398,28 @@ export const stringIndexDf: DFWhole ={ fields: [ {name: 'index', type:'integer'}, {name: 'a', type:'integer'}, - {name: 'b', type:'boolean'}], + {name: 'b', type:'boolean'}, + {name: 'strings', type:'boolean'}], primaryKey: ['index'], pandas_version: '1.4.0', }, - data: [{index: 0, a: 1, b: true}, - {index: 1, a: 2, b: false}], + data: [{index: 0, a: 1, b: true, strings:"a", }, + {index: 1, a: 2, b: false, strings:"", }, + {index: 2, a: 3, b: false, strings:" ", }], table_hints: { - a: {is_numeric: true, - is_integer: true, - min_digits: 1, - max_digits: 1, - histogram: [{name: 1, cat_pop: 50.0}, + a: {type:"integer", + min_digits: 1, + max_digits: 1, + + histogram: [{name: 1, cat_pop: 50.0}, {name: 2, cat_pop: 50.0}, {name: 'longtail', unique: 100.0}]}, - b: {is_numeric: true, - is_integer: false, + b: {type:"integer", min_digits: 1, max_digits: 1, histogram: [{name: true, cat_pop: 50.0}, - {name: false, cat_pop: 50.0}, - {name: 'longtail', unique: 100.0}]}}} + {name: false, cat_pop: 50.0}, + {name: 'longtail', unique: 100.0}]}, + strings: {type:"string", + histogram: []} + }} diff --git a/package.json b/package.json index 4a21b93c1..0f552f00b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.3.26", + "version": "0.3.28", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index c16aac25a..ea4d6ece9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.26" +version = "0.3.28" [project.license] file = "LICENSE.txt" diff --git a/tests/analysis_management_test.py b/tests/analysis_management_test.py index 3bef12c03..dd30dfbbc 100644 --- a/tests/analysis_management_test.py +++ b/tests/analysis_management_test.py @@ -40,7 +40,7 @@ def test_produce_summary_df_hints(self): assert 'histogram' in hint_obj.keys() else: expected_set = set( - ['is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram']) + ['is_numeric', 'is_integer', 'min_digits', 'max_digits', 'type', 'histogram']) assert expected_set == set(hint_obj.keys()) def test_pipeline_base(self): diff --git a/webpack-local-dev.config.js b/webpack-local-dev.config.js new file mode 100644 index 000000000..3b75717e7 --- /dev/null +++ b/webpack-local-dev.config.js @@ -0,0 +1,200 @@ +const path = require('path'); +const version = require('./package.json').version; +//import {TsconfigPathsPlugin} from 'tsconfig-paths-webpack-plugin'; +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); + +//import HtmlWebpackPlugin from 'html-webpack-plugin'; +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const luminoThemeImages = /^.*@lumino\/default-theme.*.png$/; + +const crypto = require('crypto'); + +// Workaround for loaders using "md4" by default, which is not supported in FIPS-compliant OpenSSL +const cryptoOrigCreateHash = crypto.createHash; +crypto.createHash = (algorithm) => + cryptoOrigCreateHash(algorithm == 'md4' ? 'sha256' : algorithm); + +const performance = { + maxAssetSize: 100_000_000, +}; + +// Custom webpack rules +const baseRules = [ + + { test: /\.js$/, loader: 'source-map-loader' }, + { test: /\.css$/, use: ['style-loader', 'css-loader'] }, + { + test: /\.scss$/, + use: [ + // We're in dev and want HMR, SCSS is handled in JS + // In production, we want our css as files + "style-loader", + "css-loader", + { + loader: "postcss-loader", + options: { + postcssOptions: { + plugins: [ + ["postcss-preset-env"], + ], + }, + }, + }, + "sass-loader" + ], + }, + { + test: luminoThemeImages, + issuer: /\.css$/, + use: { + loader: 'url-loader', + }, + }, + { + test: /\.(jpg|png|gif)$/, + exclude: luminoThemeImages, + use: ['file-loader'], + }, + { + test: /\.md$/, + use: ['html-loader', 'markdown-loader'] + }, + { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + issuer: /\.css$/, + use: { + loader: 'svg-url-loader', + options: { encoding: 'none', limit: 10000 }, + }, + }, +]; + + +const rules = [...baseRules, { test: /\.tsx?$/, loader: 'ts-loader' }]; +const demoRules = [...baseRules, + { + test: /\.tsx?$/, + loader: 'ts-loader', + options: { + transpileOnly: true, + configFile: 'examples/tsconfig.json' + } + }] + + +// Packages that shouldn't be bundled but loaded at runtime +const externals = ['@jupyter-widgets/base']; + +const resolve = { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: ['.webpack.js', '.web.js', '.ts', '.js', '.tsx'], + plugins: [new TsconfigPathsPlugin()], + fallback: { crypto: false }, +}; + +module.exports = [ +// the following section must be commented out for the nbextension to work +// I think it must be enabled for the dev mode of the react app to work + + { + entry: './examples/index-react18.tsx', + output: { + path: path.join(__dirname, '/examples/dist'), + filename: 'bundle.js' + }, + module: { + rules: demoRules, + }, + devtool: 'source-map', + externals, + resolve, + plugins: [new HtmlWebpackPlugin({ + //template: './examples/index.html' + template: './examples/index.html' + })], + performance + }, + + + /** + * Notebook extension + * + * This bundle only contains the part of the JavaScript that is run on load of + * the notebook. + */ + { + entry: './js/extension.ts', + output: { + filename: 'index.js', + path: path.resolve(__dirname, 'buckaroo', 'nbextension'), + libraryTarget: 'amd', + }, + module: { + rules: rules, + }, + devtool: 'source-map', + externals, + resolve, + // plugins: [new HtmlWebpackPlugin({ + // template: './examples/index.html' + // })] + performance + + + }, + + /** + * Embeddable buckaroo bundle + * + * This bundle is almost identical to the notebook extension bundle. The only + * difference is in the configuration of the webpack public path for the + * static assets. + * + * The target bundle is always `dist/index.js`, which is the path required by + * the custom widget embedder. + */ + { + entry: './js/index.ts', + output: { + filename: 'index.js', + path: path.resolve(__dirname, 'dist'), + libraryTarget: 'amd', + library: 'buckaroo', + publicPath: 'https://unpkg.com/buckaroo@' + version + '/dist/', + }, + devtool: 'source-map', + module: { + rules: rules, + }, + externals, + resolve, + devServer: { + port: 8030 + }, + performance + + }, + + /** + * Documentation widget bundle + * + * This bundle is used to embed widgets in the package documentation. + */ + { + entry: './js/index.ts', + output: { + filename: 'embed-bundle.js', + path: path.resolve(__dirname, 'docs', 'source', '_static'), + library: 'buckaroo', + libraryTarget: 'amd', + }, + module: { + rules: rules, + }, + devtool: 'source-map', + externals, + resolve, + performance + + }, +]; From 0c7aa07c4960fbd81907fc97427ef4922217910b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 30 Oct 2023 16:48:17 -0400 Subject: [PATCH 160/250] Feat/perf fix 87 (#88) Release 0.3.29 * fixes performance regression with a non-unique index on sampling. Performance is so bad that the dataframe will never display fixes #87 * fixes missing requirement for ColDisplayHints resulting in errors --- buckaroo/_version.py | 2 +- buckaroo/analysis.py | 2 +- buckaroo/down_sample.py | 4 +++- package.json | 2 +- pyproject.toml | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 2c0dc394f..3645d389a 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.3.28" +__version__ = "0.3.29" diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index 046a02ef5..10a244102 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -205,7 +205,7 @@ def histogram(ser, nan_per): return categorical_histogram(ser, val_counts, nan_per) class ColDisplayHints(ColAnalysis): - requires_summary = ['min', 'max'] # What summary stats does this analysis provide + requires_summary = ['min', 'max', 'nan_per'] provides_summary = [ 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram', 'type'] diff --git a/buckaroo/down_sample.py b/buckaroo/down_sample.py index b168f845c..a25bd2460 100644 --- a/buckaroo/down_sample.py +++ b/buckaroo/down_sample.py @@ -15,7 +15,9 @@ def sample(df, sample_size=500, include_outliers=True): if len(df) <= sample_size: return df sdf = df.sample(np.min([sample_size, len(df)])) - if include_outliers: + + #non_unique indexes are very slow + if include_outliers and sdf.index.is_unique: outlier_idxs = [] for col in df.columns: outlier_idxs.extend(get_outlier_idxs(df[col]) ) diff --git a/package.json b/package.json index 0f552f00b..b989ed3af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.3.28", + "version": "0.3.29", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index ea4d6ece9..2f09dc760 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.28" +version = "0.3.29" [project.license] file = "LICENSE.txt" From 304d0850a685914838e8f391124ebc620b73403d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 3 Nov 2023 08:19:16 -0400 Subject: [PATCH 161/250] Added more tables to related projecs --- docs/source/articles/related_projects.rst | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/source/articles/related_projects.rst b/docs/source/articles/related_projects.rst index 7016e07d2..7b61aba70 100644 --- a/docs/source/articles/related_projects.rst +++ b/docs/source/articles/related_projects.rst @@ -16,10 +16,10 @@ There are a couple of projects like Buckaroo that aim to provide a better table #. `QGrid `_. Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features -To be clear, I had the idea for building Buckaroo like this before I saw any of the other projects... But they are all open source and we can learn from each other. If Buckaroo doesn't quite do what you want, check out one of the others +To be clear, I had the idea for building Buckaroo like this before I saw any of the other projects... But they are all open source and we can learn from each other. If Buckaroo doesn't quite do what you want, check out one of the others. -Other exploratory datta analysis tools +Other exploratory data analysis tools -------------------------------------- These tools are aimed at doing more comprehensive stastical analysis of data @@ -27,10 +27,16 @@ These tools are aimed at doing more comprehensive stastical analysis of data #. `Dtale `_ #. `YData profiling `_ - + Other data tables ----------------- +#. `ITables `_ focusses on well styled static tables for Pandas/Jupyter +#. `Tables.jl `_ A terminal/text only table for julia. Wildly ambitious for pushing the limits on terminal UI. + +Other js data tables +-------------------- + JS Table widgets. These are the core interactive tables that modern table expereinces are built around. A lot of engineering goes into making a web browser handle large scrolling tables performantly #. `AG-Grid `_ The most popular high performance JS data table in use. Buckaroo is built on top of the open source version of AG-Grid. The closed source version offers additional features. From 0829c394a0d5b5bd7e58841c15f6437ab38ed181 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 3 Nov 2023 08:40:15 -0400 Subject: [PATCH 162/250] Corrected name/link of PrettyTables.jl --- docs/source/articles/related_projects.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/articles/related_projects.rst b/docs/source/articles/related_projects.rst index 7b61aba70..0edca259d 100644 --- a/docs/source/articles/related_projects.rst +++ b/docs/source/articles/related_projects.rst @@ -32,7 +32,7 @@ Other data tables ----------------- #. `ITables `_ focusses on well styled static tables for Pandas/Jupyter -#. `Tables.jl `_ A terminal/text only table for julia. Wildly ambitious for pushing the limits on terminal UI. +#. `PrettyTables.jl `_ A terminal/text only table for julia. Wildly ambitious for pushing the limits on terminal UI. Other js data tables -------------------- From af444b07f51c3421814c22d11e6ea93eed2593ee Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 6 Nov 2023 19:04:09 -0500 Subject: [PATCH 163/250] Feat/no autoclean default (#99) Release 0.4.0 * fixes #89 Multi Indexes don't display * fixes #90 Errors with columns that are numbers * fixes #91 Index names don't display * fixes #93 Turn off auto-cleaning by default --- buckaroo/_version.py | 2 +- buckaroo/buckaroo_widget.py | 12 ++++----- buckaroo/serialization_utils.py | 25 +++++++++--------- buckaroo/widget_utils.py | 44 ++++++++++++++++++++++--------- package.json | 2 +- pyproject.toml | 2 +- tests/auto_clean_test.py | 21 --------------- tests/basic_widget_test.py | 12 ++++++--- tests/serialization_utils_test.py | 2 +- 9 files changed, 64 insertions(+), 58 deletions(-) diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 3645d389a..8a5e1caa8 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.3.29" +__version__ = "0.4.0" diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 9aafdc1fc..853d2306b 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -64,7 +64,7 @@ class BuckarooWidget(DOMWidget): 'summaryStats': False, 'reorderdColumns': False, 'showCommands': True, - 'autoType': True, + 'auto_clean': True, }).tag(sync=True) @@ -92,8 +92,8 @@ def __init__(self, df, sampled=True, summaryStats=False, reorderdColumns=False, - showCommands=True, - autoType=True, + showCommands=False, + auto_clean=True, postProcessingF=None, ): @@ -110,13 +110,13 @@ def __init__(self, df, self.dfConfig = self.get_df_config(df, sampled, reorderdColumns, showCommands) #we need dfConfig setup first before we get the proper working_df for auto_cleaning self.raw_df = df - self.run_autoclean(autoType) + self.run_autoclean(auto_clean) warnings.filterwarnings('default') - def run_autoclean(self, autoType): - if autoType: + def run_autoclean(self, auto_clean): + if auto_clean: # this will trigger the setting of self.typed_df self.operations = get_auto_type_operations( self.raw_df, metadata_f=self.typing_metadata_f, diff --git a/buckaroo/serialization_utils.py b/buckaroo/serialization_utils.py index e4daaaf61..6e5e1f4f1 100644 --- a/buckaroo/serialization_utils.py +++ b/buckaroo/serialization_utils.py @@ -42,7 +42,6 @@ def pd_py_serialize(dct): """ This is used to output an exact string that is valid python code. """ - cleaned_dct = val_replace(dct, {pd.NA: UnquotedString("pd.NA"), np.nan: UnquotedString("np.nan")}) @@ -52,7 +51,7 @@ def pd_py_serialize(dct): EMPTY_DF_OBJ = {'schema': {'fields': [{'name': 'index', 'type': 'string'}], 'primaryKey': ['index'], 'pandas_version': '1.4.0'}, - 'data': []} + 'data': []} def dumb_table_sumarize(df): @@ -65,21 +64,23 @@ def dumb_table_sumarize(df): def df_to_obj(df, order = None, table_hints=None): if order is None: order = df.columns - - temp_index_name = False - if not df.index.name is None: - temp_index_name = df.index.name - df.index.name = None obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) - if temp_index_name: - df.index.name = temp_index_name - + + if isinstance(df.index, pd.MultiIndex): + old_index = df.index + temp_index = pd.Index(df.index.to_list(), tupleize_cols=False) + df.index = temp_index + obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) + df.index = old_index + else: + obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) + if table_hints is None: obj['table_hints'] = json.loads(pdumps(dumb_table_sumarize(df))) else: obj['table_hints'] = json.loads(pdumps(table_hints)) - fields=[{'name':'index'}] + fields=[{'name': df.index.name or "index" }] for c in order: - fields.append({'name':c}) + fields.append({'name':str(c)}) obj['schema'] = dict(fields=fields) return obj diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 8297f4770..00a39a50b 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -1,23 +1,19 @@ from .buckaroo_widget import BuckarooWidget import pandas as pd -def _display_as_buckaroo(df): - from IPython.display import display - return display(BuckarooWidget(df, showCommands=False)) - - -def _display_polars_as_buckaroo(polars_df): - from IPython.display import display - pandas_df = polars_df.to_pandas() - return display(BuckarooWidget(pandas_df, showCommands=False)) - - -def enable(): +def enable(sampled=True, + summaryStats=False, + reorderdColumns=False, + showCommands=False, + auto_clean=True, + postProcessingF=None): """ Automatically use buckaroo to display all DataFrames instances in the notebook. """ + + try: from IPython.core.getipython import get_ipython except ImportError: @@ -27,6 +23,30 @@ def enable(): if ip is None: print("must be running inside ipython to enable default display via enable()") return + + + def _display_as_buckaroo(df): + from IPython.display import display + return display(BuckarooWidget(df, + sampled=sampled, + summaryStats=summaryStats, + reorderdColumns=reorderdColumns, + showCommands=showCommands, + auto_clean=auto_clean, + postProcessingF=postProcessingF)) + + def _display_polars_as_buckaroo(polars_df): + from IPython.display import display + pandas_df = polars_df.to_pandas() + return display(BuckarooWidget(pandas_df, + sampled=sampled, + summaryStats=summaryStats, + reorderdColumns=reorderdColumns, + showCommands=showCommands, + auto_clean=auto_clean, + postProcessingF=postProcessingF)) + + ip_formatter = ip.display_formatter.ipython_display_formatter ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) diff --git a/package.json b/package.json index b989ed3af..6e6ee3b4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.3.29", + "version": "0.4.0", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 2f09dc760..2e8098cbc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.3.29" +version = "0.4.0" [project.license] file = "LICENSE.txt" diff --git a/tests/auto_clean_test.py b/tests/auto_clean_test.py index 8db2fbdef..ac00c3731 100644 --- a/tests/auto_clean_test.py +++ b/tests/auto_clean_test.py @@ -115,24 +115,3 @@ def test_coerce_series(): assert_series_equal( ac.coerce_series(pd.Series(['a', 2.0, 3.1, None, NA]), 'float'), pd.Series([nan, 2, 3.1, nan, nan], dtype='float')) - -def atest_autotype_df(): - assert_frame_equal( - ac.auto_type_df( - pd.DataFrame({ - 'int':pd.Series(['a', 2, 3, 4, None]), - 'bool':pd.Series(['a', False, True, None]), - 'int2':pd.Series(['a', 2.0, 3.0, None, NA]), - 'float':pd.Series(['a', 2.0, 3.1, None, NA]), - 'allNA':pd.Series([NA, NA, NA, None, NA]), - 'string_':pd.Series(['a', 'b', 'c', 'd', 'e']) - } - )), - pd.DataFrame({ - 'int' : pd.Series([NA, 2,3,4, NA], dtype='UInt8'), - 'bool': pd.Series([NA, False, True, NA], dtype='boolean'), - 'int2': pd.Series([NA, 2, 3, NA, NA], dtype='UInt8'), - 'float': pd.Series([nan, 2, 3.1, nan, nan], dtype='float'), - 'allNA':pd.Series([NA, NA, NA, None, NA]), - 'string_':pd.Series(['a', 'b', 'c', 'd', 'e']) - })) diff --git a/tests/basic_widget_test.py b/tests/basic_widget_test.py index cfd8f2160..7b322e625 100644 --- a/tests/basic_widget_test.py +++ b/tests/basic_widget_test.py @@ -78,10 +78,16 @@ def test_analysis_pipeline(): w = BuckarooWidget(simple_df) assert w.stats.ap.unit_test() == (True, []) -def test_autotype_false(): +def test_auto_clean_false(): """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" - w = BuckarooWidget(simple_df, autoType=False) + w = BuckarooWidget(simple_df, auto_clean=False) assert w.stats.ap.unit_test() == (True, []) + +def test_auto_clean_true(): + """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" + w = BuckarooWidget(simple_df, auto_clean=True) + assert w.stats.ap.unit_test() == (True, []) + def test_post_processing(): def my_func(df): @@ -90,7 +96,7 @@ def my_func(df): bw = BuckarooWidget(simple_df, postProcessingF=my_func) assert bw.processed_result == 6 - bw2 = BuckarooWidget(simple_df, autoType=False, postProcessingF=my_func) + bw2 = BuckarooWidget(simple_df, auto_clean=False, postProcessingF=my_func) assert bw2.processed_result == 6 diff --git a/tests/serialization_utils_test.py b/tests/serialization_utils_test.py index 64b637928..897d775f0 100644 --- a/tests/serialization_utils_test.py +++ b/tests/serialization_utils_test.py @@ -13,4 +13,4 @@ def test_df_to_obj(): values=[1, 2, 3])).set_index('names') serialized_df = df_to_obj(named_index_df) - assert serialized_df['data'][0]['index'] == 'one' + assert serialized_df['data'][0]['names'] == 'one' From 8d5343939102ab6990c43ad54bfa31dcc6a50c40 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 12:04:09 -0500 Subject: [PATCH 164/250] Update README.md Fixed colab link --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index a5e6f6030..8da157f46 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell ## Try it today -* [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) (Walkthrough of Buckaroo functionality (histograms, extending Summary Stats) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) - - +* [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) (Walkthrough of Buckaroo functionality (histograms, extending Summary Stats) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb) ![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) From bf32f4de2892fe676c4a887ab41521923087d3be Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 12:06:00 -0500 Subject: [PATCH 165/250] Chore/fix pytest (#113) Release 0.4.1 - Fix Continuous Integration. * Fixes: State of CI brain dump #108 * Fixes: Make existing pytest pass #110 * Fixes: Make yarn lint pass #112 * Fixes: Hatchling CI error #114 * Fixes: CI-build only typescript typing errors #115 --- .eslintignore | 3 +- .github/workflows/build.yml | 3 +- buckaroo/_version.py | 2 +- js/components/DFViewer.tsx | 16 ++--- js/components/DependentTabs.tsx | 21 +++--- js/components/gridUtils.ts | 40 ++++++----- js/components/staticData.ts | 117 ++++++++++++++++++-------------- package.json | 2 +- pyproject.toml | 4 +- 9 files changed, 112 insertions(+), 96 deletions(-) diff --git a/.eslintignore b/.eslintignore index e8a22210a..61f95dc71 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,4 +2,5 @@ node_modules dist coverage **/*.d.ts -tests \ No newline at end of file +tests +js/components/RechartTooltip.tsx \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e07553494..ac5e8b843 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + #os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-latest] python-version: ["3.8", "3.11"] steps: - name: Checkout diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 8a5e1caa8..9b4238bd5 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.4.0" +__version__ = "0.4.1" diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx index 9f688f399..36872581e 100644 --- a/js/components/DFViewer.tsx +++ b/js/components/DFViewer.tsx @@ -79,14 +79,15 @@ export function DFViewer( */ let counter = count; - let timer: NodeJS.Timeout; + //let timer: NodeJS.Timeout; + let timer: number; let colWidthHasBeenSet = false; let currentColWidth = -10; if (gridRef === undefined || gridRef.current === null) { currentColWidth = 200; } else { try { - const dc = gridRef!.current!.columnApi.getAllDisplayedColumns(); + const dc = gridRef?.current?.columnApi.getAllDisplayedColumns(); if (dc.length !== 0) { currentColWidth = dc[0].getActualWidth(); @@ -125,8 +126,7 @@ export function DFViewer( if (counter > 0 && colWidthHasBeenSet === false) { counter -= 1; // console.log("no gridRef or gridRef.current, setting delay", counter) - //@ts-ignore - timer = setTimeout(conditionallyAutosize, delay); + timer = window.setTimeout(conditionallyAutosize, delay); return; } else if (counter > 0 && currentColWidth === 200) { counter -= 1; @@ -134,14 +134,12 @@ export function DFViewer( // console.log( // "new colwidth not recognized yet", // counter, originalColWidth, gridRef.current!.columnApi!.columnModel!.displayedColumns[0].actualWidth) - //@ts-ignore - timer = setTimeout(conditionallyAutosize, delay); + timer = window.setTimeout(conditionallyAutosize, delay); return; } }; - //@ts-ignore - timer = setTimeout(conditionallyAutosize, delay); - return () => clearTimeout(timer); + timer = window.setTimeout(conditionallyAutosize, delay); + return () => window.clearTimeout(timer); }; makeCondtionalAutosize(50, 350); diff --git a/js/components/DependentTabs.tsx b/js/components/DependentTabs.tsx index 4cf248c70..592f7da1f 100644 --- a/js/components/DependentTabs.tsx +++ b/js/components/DependentTabs.tsx @@ -9,10 +9,15 @@ import { DFViewer } from './DFViewer'; import _ from 'lodash'; import { Operation } from './OperationUtils'; -//@ts-ignore -export function OperationDisplayer({ filledOperations, style }) { - const baseStyle = { margin: '0', textAlign: 'left' }; - const localStyle = { ...baseStyle, ...style }; +export function OperationDisplayer({ + filledOperations, + style, +}: { + filledOperations: Operation[]; + style: CSSProperties; +}): React.JSX.Element { + const baseStyle: CSSProperties = { margin: '0', textAlign: 'left' }; + const localStyle: CSSProperties = { ...baseStyle, ...style }; return (
    {JSON.stringify(filledOperations)}
    @@ -24,11 +29,11 @@ export function PythonDisplayer({ style, generatedPyCode, }: { - style: any; + style: CSSProperties; generatedPyCode: string; }) { - const baseStyle = { margin: '0', textAlign: 'left' }; - const localStyle = { ...baseStyle, ...style }; + const baseStyle: CSSProperties = { margin: '0', textAlign: 'left' }; + const localStyle: CSSProperties = { ...baseStyle, ...style }; return (
    {generatedPyCode}
    @@ -94,7 +99,7 @@ export function DependentTabs({ operationResult: OperationResult; }) { const [tab, _setTab] = useState('DataFrame'); - const style = { height: '45vh' }; + const style: CSSProperties = { height: '45vh' }; console.log('dependenttabs operationResult', operationResult); return (
    diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index df69eac70..e341bb752 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -3,7 +3,13 @@ import { ValueFormatterFunc, ValueFormatterParams, } from 'ag-grid-community'; -import { DFWhole, DFColumn, ColumnHint, ColumnIntegertHint, ColumnFloatHint } from './staticData'; +import { + DFWhole, + DFColumn, + ColumnHint, + ColumnIntegertHint, + ColumnFloatHint, +} from './staticData'; import _ from 'lodash'; export const updateAtMatch = ( cols: ColDef[], @@ -27,8 +33,7 @@ export const updateAtMatch = ( inside of AG-Grid, and independently. */ - -export const basicIntFormatter = new Intl.NumberFormat('en-US', { +export const basicIntFormatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 3, }); @@ -38,21 +43,17 @@ export const stringFormatter = (params: ValueFormatterParams): string => { return val; }; - export const booleanFormatter = (params: ValueFormatterParams): string => { const val = params.value; if (val === true) { - return "True" + return 'True'; } else if (val === false) { - return "False" + return 'False'; } - return "" + return ''; }; - - const getIntegerFormatter = (hint: ColumnIntegertHint) => { - const commas = Math.floor(hint.max_digits / 3); const totalWidth = commas + hint.max_digits; @@ -68,7 +69,6 @@ const getIntegerFormatter = (hint: ColumnIntegertHint) => { }; const getFloatFormatter = (hint: ColumnFloatHint) => { - const floatFormatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: 3, maximumFractionDigits: 3, @@ -79,23 +79,21 @@ const getFloatFormatter = (hint: ColumnFloatHint) => { } return floatFormatter.format(params.value); }; -} +}; function getFormatter(hint: ColumnHint): ValueFormatterFunc { if (hint === undefined) { return stringFormatter; } - if (hint.type === "integer") { + if (hint.type === 'integer') { return getIntegerFormatter(hint); - } - else if (hint.type === "string") { - return stringFormatter; - - } else if (hint.type === "float") { + } else if (hint.type === 'string') { + return stringFormatter; + } else if (hint.type === 'float') { return getFloatFormatter(hint); - } else if (hint.type === "boolean") { + } else if (hint.type === 'boolean') { return booleanFormatter; - } else if (hint.type === "obj") { + } else if (hint.type === 'obj') { return stringFormatter; } return stringFormatter; @@ -111,7 +109,7 @@ export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { field: f.name, headerName: f.name, valueFormatter: getFormatter( - _.get(tdf.table_hints, f.name, { is_numeric: false, type:"obj" }) + _.get(tdf.table_hints, f.name, { is_numeric: false, type: 'obj' }) ), }; if (f.name === 'index') { diff --git a/js/components/staticData.ts b/js/components/staticData.ts index bb407e3d1..8daf5b1d4 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -28,35 +28,38 @@ export type DFDataRow = Record; export type DFData = DFDataRow[]; export interface ColumnObjHint { - type: "obj" + type: 'obj'; histogram?: any[]; } export interface ColumnStringHint { - type: "string"; + type: 'string'; histogram?: any[]; } export interface ColumnBooleanHint { - type: "boolean"; + type: 'boolean'; histogram?: any[]; } export interface ColumnIntegertHint { - type: "integer" + type: 'integer'; min_digits: number; max_digits: number; histogram: any[]; } export interface ColumnFloatHint { - type: "float" + type: 'float'; histogram: any[]; } - -export type ColumnHint = ColumnObjHint | ColumnIntegertHint | ColumnFloatHint | ColumnStringHint | ColumnBooleanHint; - +export type ColumnHint = + | ColumnObjHint + | ColumnIntegertHint + | ColumnFloatHint + | ColumnStringHint + | ColumnBooleanHint; export interface DFWhole { schema: { @@ -201,16 +204,16 @@ export const foo: DFWhole = { pandas_version: '1.4.0', }, table_hints: { - index: { type:"obj" }, - tripduration: { histogram: histograms.num_histo, type:"obj"}, - starttime: { type:"obj" }, - stoptime: { type:"obj" }, - 'start station id': { type:"obj" }, - 'start station name': { type:"obj" }, - 'start station latitude': { type:"obj" }, - bikeid: { type:"obj" }, - 'birth year': { type:"obj" }, - gender: { type:"obj" }, + index: { type: 'obj' }, + tripduration: { histogram: histograms.num_histo, type: 'obj' }, + starttime: { type: 'obj' }, + stoptime: { type: 'obj' }, + 'start station id': { type: 'obj' }, + 'start station name': { type: 'obj' }, + 'start station latitude': { type: 'obj' }, + bikeid: { type: 'obj' }, + 'birth year': { type: 'obj' }, + gender: { type: 'obj' }, }, data: [ { @@ -346,23 +349,23 @@ export const tableDf: DFWhole = { ], table_hints: { 'end station name': { - histogram: histograms.categorical_histo_lt, - type:"obj" }, - + type: 'obj', + }, + tripduration: { - type:"integer", + type: 'integer', min_digits: 3, max_digits: 4, histogram: histograms.num_histo, }, 'start station name': { - histogram: histograms.bool_histo, - type:"string" }, + type: 'string', + }, floatCol: { - type:"float", - + type: 'float', + histogram: [ { name: 521, cat_pop: 0.0103 }, { name: 358, cat_pop: 0.0096 }, @@ -377,49 +380,59 @@ export const tableDf: DFWhole = { ], }, nanNumeric: { - type: "integer", + type: 'integer', min_digits: 1, max_digits: 3, histogram: histograms.num_histo, }, nanFloat: { - type:"float", + type: 'float', histogram: histograms.num_histo, }, nanObject: { - - type:"obj" + type: 'obj', }, }, }; -export const stringIndexDf: DFWhole ={ +export const stringIndexDf: DFWhole = { schema: { fields: [ - {name: 'index', type:'integer'}, - {name: 'a', type:'integer'}, - {name: 'b', type:'boolean'}, - {name: 'strings', type:'boolean'}], + { name: 'index', type: 'integer' }, + { name: 'a', type: 'integer' }, + { name: 'b', type: 'boolean' }, + { name: 'strings', type: 'boolean' }, + ], primaryKey: ['index'], pandas_version: '1.4.0', }, - data: [{index: 0, a: 1, b: true, strings:"a", }, - {index: 1, a: 2, b: false, strings:"", }, - {index: 2, a: 3, b: false, strings:" ", }], + data: [ + { index: 0, a: 1, b: true, strings: 'a' }, + { index: 1, a: 2, b: false, strings: '' }, + { index: 2, a: 3, b: false, strings: ' ' }, + ], table_hints: { - a: {type:"integer", + a: { + type: 'integer', min_digits: 1, max_digits: 1, - - histogram: [{name: 1, cat_pop: 50.0}, - {name: 2, cat_pop: 50.0}, - {name: 'longtail', unique: 100.0}]}, - b: {type:"integer", - min_digits: 1, - max_digits: 1, - histogram: [{name: true, cat_pop: 50.0}, - {name: false, cat_pop: 50.0}, - {name: 'longtail', unique: 100.0}]}, - strings: {type:"string", - histogram: []} - }} + + histogram: [ + { name: 1, cat_pop: 50.0 }, + { name: 2, cat_pop: 50.0 }, + { name: 'longtail', unique: 100.0 }, + ], + }, + b: { + type: 'integer', + min_digits: 1, + max_digits: 1, + histogram: [ + { name: true, cat_pop: 50.0 }, + { name: false, cat_pop: 50.0 }, + { name: 'longtail', unique: 100.0 }, + ], + }, + strings: { type: 'string', histogram: [] }, + }, +}; diff --git a/package.json b/package.json index 6e6ee3b4e..f664fd027 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.4.0", + "version": "0.4.1", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 2e8098cbc..332f54e1e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.0" +version = "0.4.1" [project.license] file = "LICENSE.txt" @@ -44,7 +44,7 @@ file = "LICENSE.txt" [project.optional-dependencies] test = [ "nbval>=0.9", - "pandas<=1.3.5", + "pandas<=2.0.0", "pytest-cov>=3", "pytest>=6", ] From 0f25f134a095ee29c8e7f8d258775a3b4f7cc90d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 13:43:56 -0500 Subject: [PATCH 166/250] Chore/fix pandas 1.0.0 (#118) Release 0.4.2 * make buckaroo actually default to auto_clean=False * Fixes Support pandas 1.x.x #111 auto_cleaning doesn't fail against versions of pandas before 2.0.0 * reduce minimum pandas to 1.3.5 * added issue template --- .github/ISSUE_TEMPLATE/bug_report.yml | 90 +++++++++++++++++++++++++++ buckaroo/auto_clean.py | 2 + buckaroo/cleaning_commands.py | 3 + buckaroo/widget_utils.py | 2 +- pyproject.toml | 4 +- tests/auto_clean_test.py | 2 + 6 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..7890fc765 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,90 @@ +name: '🐞 Bug report - Python' +description: Report an issue with Buckaroo. +labels: [bug, python] + +body: + - type: checkboxes + id: checks + attributes: + label: Checks + options: + - label: > + I have checked that this issue has not already been reported. + required: true + - label: > + I have confirmed this bug exists on the + [latest version](https://github.com/paddymul/buckaroo) of Polars. + required: true + + - type: dropdown + id: Notebook-system + attributes: + label: What type of jupyter notebook were you using (VSCode notebook, google colab, Jupyter Lab, Jupyter notebook). Select multiple if you can reproduce this in multiple environments. If other, please add to description. + multiple: true + options: + - VS Code + - Jupyter Lab + - Google Colab + - Jupyter Notebook + - Other + validations: + required: true + + - type: textarea + id: example + attributes: + label: Reproducible example + description: > + Please follow [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) on how to + provide a minimal, copy-pastable example. Include the (wrong) output if applicable. If this is a visual bug, provide a screenshot of the input dataframe and the top couple of lines of buckaroo output. + value: | + ```python + + ``` + validations: + required: true + + - type: textarea + id: logs + attributes: + label: Jupyter Log output + description: > + If the buckaroo widget completely didn't display, check the Jupyter Log Console. Also check the javascript console of the browser to see if any obvious JS errors occurred. This is optional + Paste the output of the logs here. + render: shell + + - type: textarea + id: problem + attributes: + label: Issue description + description: > + Provide any additional information you think might be relevant. + validations: + required: true + + - type: textarea + id: expected-behavior + attributes: + label: Expected behavior + description: > + Describe or show a code example of the expected behavior. + validations: + required: true + + - type: textarea + id: version + attributes: + label: Installed versions + description: > + Paste the output of ``buckaroo.debug_packages()`` + value: | +
    + + ``` + Replace this line with the output of pl.show_versions(). Leave the backticks in place. + ``` + +
    + validations: + required: true + diff --git a/buckaroo/auto_clean.py b/buckaroo/auto_clean.py index 498eca831..f8910d1c4 100644 --- a/buckaroo/auto_clean.py +++ b/buckaroo/auto_clean.py @@ -182,6 +182,8 @@ def coerce_series(ser, new_type): elif new_type == 'float': return pd.to_numeric(ser, errors='coerce').dropna().astype('float').reindex(ser.index) elif new_type == 'string': + if int(pd.__version__[0]) < 2: + return ser.fillna(value="").astype('string').reindex(ser.index) return ser.fillna(value="").astype('string').replace("", None).reindex(ser.index) else: raise Exception("Unkown type of %s" % new_type) diff --git a/buckaroo/cleaning_commands.py b/buckaroo/cleaning_commands.py index 5a1f68531..d47d3049f 100644 --- a/buckaroo/cleaning_commands.py +++ b/buckaroo/cleaning_commands.py @@ -80,6 +80,9 @@ class to_string(Command): @staticmethod def transform(df, col): ser = df[col] + if int(pd.__version__[0]) < 2: + df[col] = ser.fillna(value="").astype('string').reindex(ser.index) + return df df[col] = ser.fillna(value="").astype('string').replace("", None).reindex(ser.index) return df diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 00a39a50b..58f41c330 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -5,7 +5,7 @@ def enable(sampled=True, summaryStats=False, reorderdColumns=False, showCommands=False, - auto_clean=True, + auto_clean=False, postProcessingF=None): """ Automatically use buckaroo to display all DataFrames diff --git a/pyproject.toml b/pyproject.toml index 332f54e1e..a2d99183b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.1" +version = "0.4.2" [project.license] file = "LICENSE.txt" @@ -44,7 +44,7 @@ file = "LICENSE.txt" [project.optional-dependencies] test = [ "nbval>=0.9", - "pandas<=2.0.0", + "pandas<=1.3.5", "pytest-cov>=3", "pytest>=6", ] diff --git a/tests/auto_clean_test.py b/tests/auto_clean_test.py index ac00c3731..5c84c064c 100644 --- a/tests/auto_clean_test.py +++ b/tests/auto_clean_test.py @@ -50,6 +50,8 @@ def assign_values(d, new_values): def test_get_typing_metadata(): + if int(pd.__version__[0]) < 2: + return # assert WEIRD_INT == ac.get_typing_metadata(pd.Series([5, 2, 3.1, None, NA])) assert INT_META == ac.get_typing_metadata(pd.Series(['181', '182', '183', 'a'])) assert FLOAT_META == ac.get_typing_metadata(pd.Series(['181.1', '182.2', '183', 'a'])) From bbef7b30a9124745d4361e6a6d791f5c08b889ef Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 13:49:40 -0500 Subject: [PATCH 167/250] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..dd84ea782 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. From 2d6e5b0a910ca676beb26bc76cc9dd649a2210da Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 14:04:47 -0500 Subject: [PATCH 168/250] Feat/fix issue template (#120) * changed the bugreport template name * changed tab to spaces --- .github/ISSUE_TEMPLATE/{bug_report.yml => my-bug_report.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/ISSUE_TEMPLATE/{bug_report.yml => my-bug_report.yml} (99%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/my-bug_report.yml similarity index 99% rename from .github/ISSUE_TEMPLATE/bug_report.yml rename to .github/ISSUE_TEMPLATE/my-bug_report.yml index 7890fc765..488f67838 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/my-bug_report.yml @@ -26,7 +26,7 @@ body: - Jupyter Lab - Google Colab - Jupyter Notebook - - Other + - Other validations: required: true From 1b2f7071421187ba676ccb486bf4da37f29b136c Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 14:22:03 -0500 Subject: [PATCH 169/250] Chore/update bug template (#121) * only one bug report * removed refernce to polars --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ------------------- .../{my-bug_report.yml => bug_report.yml} | 2 +- 2 files changed, 1 insertion(+), 39 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md rename .github/ISSUE_TEMPLATE/{my-bug_report.yml => bug_report.yml} (99%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea782..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/my-bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml similarity index 99% rename from .github/ISSUE_TEMPLATE/my-bug_report.yml rename to .github/ISSUE_TEMPLATE/bug_report.yml index 488f67838..339f8b31d 100644 --- a/.github/ISSUE_TEMPLATE/my-bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -13,7 +13,7 @@ body: required: true - label: > I have confirmed this bug exists on the - [latest version](https://github.com/paddymul/buckaroo) of Polars. + [latest version](https://github.com/paddymul/buckaroo) of Buckaroo. required: true - type: dropdown From 59d9c915fdf2d7e428810b96b751137e9f353f88 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 14:44:14 -0500 Subject: [PATCH 170/250] Chore/update bug template2 (#123) --- .github/ISSUE_TEMPLATE/bug_report.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 339f8b31d..50e807753 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: '🐞 Bug report - Python' description: Report an issue with Buckaroo. -labels: [bug, python] +labels: [bug] body: - type: checkboxes @@ -26,7 +26,7 @@ body: - Jupyter Lab - Google Colab - Jupyter Notebook - - Other + - Other (please describe in Issue Description) validations: required: true @@ -36,7 +36,7 @@ body: label: Reproducible example description: > Please follow [this guide](https://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports) on how to - provide a minimal, copy-pastable example. Include the (wrong) output if applicable. If this is a visual bug, provide a screenshot of the input dataframe and the top couple of lines of buckaroo output. + provide a minimal, copy-pastable example. [Infinity displays as blank](https://github.com/paddymul/buckaroo/issues/122) is an excellent buckaroo example. Include the (wrong) output if applicable. value: | ```python @@ -44,21 +44,12 @@ body: validations: required: true - - type: textarea - id: logs - attributes: - label: Jupyter Log output - description: > - If the buckaroo widget completely didn't display, check the Jupyter Log Console. Also check the javascript console of the browser to see if any obvious JS errors occurred. This is optional - Paste the output of the logs here. - render: shell - - type: textarea id: problem attributes: label: Issue description description: > - Provide any additional information you think might be relevant. + Provide any additional information you think might be relevant. If this is a visual bug, provide a screenshot of the input dataframe and the top couple of lines of buckaroo output. validations: required: true @@ -88,3 +79,12 @@ body: validations: required: true + - type: textarea + id: logs + attributes: + label: Jupyter Log output + description: > + If the buckaroo widget completely didn't display, check the Jupyter Log Console. Also check the javascript console of the browser to see if any obvious JS errors occurred. This is optional + Paste the output of the logs here. + render: shell + From ed4d738a4b15e1cb32be81f93b6228cb33128a6f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 14:47:05 -0500 Subject: [PATCH 171/250] Update bug_report.yml --- .github/ISSUE_TEMPLATE/bug_report.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 50e807753..c099b1745 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -70,11 +70,9 @@ body: Paste the output of ``buckaroo.debug_packages()`` value: |
    - ``` - Replace this line with the output of pl.show_versions(). Leave the backticks in place. + Replace this line with the output of buckaroo.debug_packages(). Leave the backticks in place. ``` -
    validations: required: true From 8f122a700330f202f02291ae6f4c5bb05fa69bab Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 10 Nov 2023 17:37:54 -0500 Subject: [PATCH 172/250] npm run dev can now be used without tweaking webpack.config.js Fixes make npm run dev work without editting webpack.config.js #125 --- package.json | 2 +- webpack-local-dev.config.js | 22 ---------------------- webpack.config.js | 23 ----------------------- 3 files changed, 1 insertion(+), 46 deletions(-) diff --git a/package.json b/package.json index f664fd027..d840dfa3a 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "watch:lib": "tsc -w", "watch:nbextension": "webpack --watch", "watch:labextension": "jupyter labextension watch .", - "dev": "webpack-cli serve --mode=development --env development --open" + "dev": "webpack-cli serve --config webpack-local-dev.config.js --mode=development --env development --open" }, "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", diff --git a/webpack-local-dev.config.js b/webpack-local-dev.config.js index 3b75717e7..abec83f7b 100644 --- a/webpack-local-dev.config.js +++ b/webpack-local-dev.config.js @@ -175,26 +175,4 @@ module.exports = [ }, - /** - * Documentation widget bundle - * - * This bundle is used to embed widgets in the package documentation. - */ - { - entry: './js/index.ts', - output: { - filename: 'embed-bundle.js', - path: path.resolve(__dirname, 'docs', 'source', '_static'), - library: 'buckaroo', - libraryTarget: 'amd', - }, - module: { - rules: rules, - }, - devtool: 'source-map', - externals, - resolve, - performance - - }, ]; diff --git a/webpack.config.js b/webpack.config.js index 11e2acfe6..7563da307 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -93,29 +93,6 @@ const resolve = { }; module.exports = [ -// the following section must be commented out for the nbextension to work -// I think it must be enabled for the dev mode of the react app to work -/* - { - entry: './examples/index-react18.tsx', - output: { - path: path.join(__dirname, '/examples/dist'), - filename: 'bundle.js' - }, - module: { - rules: demoRules, - }, - devtool: 'source-map', - externals, - resolve, - plugins: [new HtmlWebpackPlugin({ - //template: './examples/index.html' - template: './examples/index.html' - })], - performance - }, - -*/ /** * Notebook extension * From af0c2963598f5f2b42d2aa53a13bd4f39ff5cfc0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 11 Nov 2023 15:48:39 -0500 Subject: [PATCH 173/250] warn executing in notebook < 7, added notebook_env to debug_packages (#130) fixes #129 --- buckaroo/__init__.py | 45 ++++++++++++++++++++++++++++++++++++++++++++ buckaroo/_version.py | 2 +- package.json | 2 +- pyproject.toml | 2 +- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index df0722a4c..cb999e526 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -46,8 +46,52 @@ def _jupyter_labextension_paths(): }] + +def determine_jupter_env(): + import psutil + parent_process = psutil.Process().parent().cmdline()[-1] + + if 'jupyter-lab' in parent_process: + return "jupyter-lab" + elif 'jupyter-notebook' in parent_process: + return "jupyter-notebook" + elif '__vsc_ipynb_file__' in globals(): + return "vscode" + else: + try: + from IPython.core import getipython + if 'google.colab' in str(getipython.get_ipython()): + return "google-colab" + except: + pass + return "unknown" + +def is_notebook_compatible(): + jupyter_env = determine_jupter_env() + if jupyter_env == "jupyter-notebook": + try: + import notebook + return notebook.version_info[0] >= 7 + except: + pass + return False + else: + return True + +def warn_on_incompatible(): + if not is_notebook_compatible(): + import notebook + print("Buckaroo is compatible with jupyter notebook > 7, or jupyterlab >3.6.0") + print("You seem to be executing this in jupyter notebook version %r" % str(notebook.__version__)) + print("You can upgrade to notebook 7 by running 'pip install --upgrade notebook'") + print("Or you can try running jupyter lab with 'jupyter lab'") + + + def debug_packages(): print("Selected Jupyter core packages...") + jupyter_env = determine_jupter_env() + print("executing in %s " % determine_jupter_env()) packages = [ "buckaroo", "jupyterlab", @@ -84,6 +128,7 @@ def debug_packages(): try: enable() + warn_on_incompatible() except: print("error enabling buckaroo as default display formatter for dataframes (ignore message during testing/builds") diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 9b4238bd5..4e9058387 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.4.1" +__version__ = "0.4.4" diff --git a/package.json b/package.json index d840dfa3a..23118db9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.4.1", + "version": "0.4.4", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index a2d99183b..20669c458 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.2" +version = "0.4.4" [project.license] file = "LICENSE.txt" From 1fbf4ab823bdae899742110a4891e9ad4e1644fc Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sun, 12 Nov 2023 11:40:01 -0500 Subject: [PATCH 174/250] Feat/playwright testing (#131) playwright and solara now do a full end to end integration test of buckaroo in jupyterlab, with screenshotting ability ! * Fixes Browser <> Jupyter lab Integration tests for buckaroo #116 * Bump to 0.4.5 --- .github/workflows/build.yml | 47 +- buckaroo/_version.py | 2 +- package.json | 2 +- pyproject.toml | 7 +- requirements-ui-test.txt | 465 ++++++++++++++++++ tbump.toml | 45 ++ tests/ui/jupyter_test.py | 44 ++ ...-jupyter_lab-chromium-darwin-reference.png | Bin 0 -> 15497 bytes ...karoo-solara-chromium-darwin-reference.png | Bin 0 -> 19376 bytes ...ckaroo-voila-chromium-darwin-reference.png | Bin 0 -> 16420 bytes tests/unit/__init__.py | 0 tests/{ => unit}/analysis_management_test.py | 0 tests/{ => unit}/analysis_test.py | 0 tests/{ => unit}/auto_clean_test.py | 0 tests/{ => unit}/basic_widget_test.py | 0 tests/{ => unit}/fixtures.py | 0 tests/{ => unit}/lispy_test.py | 0 .../pluggable_analysis_framework_test.py | 0 tests/{ => unit}/serialization_utils_test.py | 0 19 files changed, 605 insertions(+), 7 deletions(-) create mode 100644 requirements-ui-test.txt create mode 100644 tbump.toml create mode 100644 tests/ui/jupyter_test.py create mode 100644 tests/ui/snapshots/tests/ui/jupyter_test.py/test_widget_buckaroo-jupyter_lab-chromium-darwin-reference.png create mode 100644 tests/ui/snapshots/tests/ui/jupyter_test.py/test_widget_buckaroo-solara-chromium-darwin-reference.png create mode 100644 tests/ui/snapshots/tests/ui/jupyter_test.py/test_widget_buckaroo-voila-chromium-darwin-reference.png create mode 100644 tests/unit/__init__.py rename tests/{ => unit}/analysis_management_test.py (100%) rename tests/{ => unit}/analysis_test.py (100%) rename tests/{ => unit}/auto_clean_test.py (100%) rename tests/{ => unit}/basic_widget_test.py (100%) rename tests/{ => unit}/fixtures.py (100%) rename tests/{ => unit}/lispy_test.py (100%) rename tests/{ => unit}/pluggable_analysis_framework_test.py (100%) rename tests/{ => unit}/serialization_utils_test.py (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac5e8b843..87237543c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ jobs: matrix: #os: [ubuntu-latest, windows-latest, macos-latest] os: [ubuntu-latest] - python-version: ["3.8", "3.11"] + python-version: ["3.8"] steps: - name: Checkout uses: actions/checkout@v2 @@ -31,7 +31,7 @@ jobs: - name: Test the extension run: | python -m pip install --upgrade -v -e ".[test, examples, docs]" - python -m pytest + python -m pytest tests/unit yarn run test - name: Linting @@ -39,6 +39,19 @@ jobs: run: | yarn run lint:check + - name: Package + run: | + python -m pip install build + python -m build . + + - name: Upload builds + uses: actions/upload-artifact@v3 + with: + name: buckaroo-dist-${{ github.run_number }} + path: | + ./dist + ./js/*.tgz + - name: Check docs can be build + links if: ${{ matrix.os == 'ubuntu-latest' }} working-directory: docs @@ -47,3 +60,33 @@ jobs: pip install pytest-check-links make html python -m pytest --check-links + + ui-test: + needs: [build] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v3 + with: + name: buckaroo-dist-${{ github.run_number }} + + - name: Install Python + uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Setup buckaroo ui test + run: pip install `echo dist/*.whl`[ui-test] -r requirements-ui-test.txt + + - name: Install playwright browsers + run: playwright install chromium + + - name: Run ui-tests + run: SOLARA_TEST_RUNNERS=jupyter_lab pytest tests/ui/ --video=retain-on-failure + + - name: Upload Test artifacts + if: always() + uses: actions/upload-artifact@v2 + with: + name: buckaroo-test-results-${{ github.run_number }} + path: test-results diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 4e9058387..5be842b4c 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.4.4" +__version__ = "0.4.5" diff --git a/package.json b/package.json index 23118db9b..38eadaaf1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.4.4", + "version": "0.4.5", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 20669c458..8c2b49542 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.4" +version = "0.4.5" [project.license] file = "LICENSE.txt" @@ -59,7 +59,8 @@ docs = [ build = [ "twine", -"build" +"build", +"tbump" ] [project.urls] @@ -137,7 +138,7 @@ field = [ ] [tool.tbump.version] -current = "0.2.2" +current = "0.4.5" regex = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)((?Pa|b|rc|.dev)(?P\\d+))?" [tool.tbump.git] diff --git a/requirements-ui-test.txt b/requirements-ui-test.txt new file mode 100644 index 000000000..8f4b3d595 --- /dev/null +++ b/requirements-ui-test.txt @@ -0,0 +1,465 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --extra=ui-test --output-file=requirements-ui-test.txt setup.py +# +aiofiles==22.1.0 + # via ypy-websocket +aiosqlite==0.19.0 + # via ypy-websocket +anyio==3.7.0 + # via + # jupyter-server + # starlette + # watchgod +appnope==0.1.3 + # via + # ipykernel + # ipython +argon2-cffi==21.3.0 + # via + # jupyter-server + # nbclassic + # notebook +argon2-cffi-bindings==21.2.0 + # via argon2-cffi +arrow==1.2.3 + # via isoduration +asttokens==2.2.1 + # via stack-data +attrs==23.1.0 + # via jsonschema +babel==2.12.1 + # via jupyterlab-server +backcall==0.2.0 + # via ipython +beautifulsoup4==4.12.2 + # via nbconvert +bleach==6.0.0 + # via nbconvert +cachetools==5.3.1 + # via solara +certifi==2023.5.7 + # via requests +cffi==1.15.1 + # via argon2-cffi-bindings +charset-normalizer==3.1.0 + # via requests +click==8.1.3 + # via + # rich-click + # solara + # uvicorn +comm==0.1.3 + # via ipykernel +debugpy==1.6.7 + # via ipykernel +decorator==5.1.1 + # via ipython +defusedxml==0.7.1 + # via nbconvert +entrypoints==0.4 + # via jupyter-client +exceptiongroup==1.1.1 + # via + # anyio + # pytest +executing==1.2.0 + # via stack-data +fastjsonschema==2.17.1 + # via nbformat +filelock==3.12.2 + # via solara +fqdn==1.5.1 + # via jsonschema +greenlet==2.0.1 + # via playwright +h11==0.14.0 + # via uvicorn +humanize==4.6.0 + # via solara +idna==3.4 + # via + # anyio + # jsonschema + # requests +iniconfig==2.0.0 + # via pytest +ipykernel==6.23.2 + # via + # ipywidgets + # nbclassic + # notebook + # solara +ipython==8.12.2 + # via + # ipykernel + # ipywidgets + # jupyterlab +ipython-genutils==0.2.0 + # via + # nbclassic + # notebook +ipyvue==1.9.2 + # via + # ipyvuetify + # solara +ipyvuetify==1.8.10 + # via solara +ipywidgets==8.0.6 + # via + # ipyaggrid (setup.py) + # ipyvue + # reacton + # solara +isoduration==20.11.0 + # via jsonschema +jedi==0.18.2 + # via ipython +jinja2==3.1.2 + # via + # jupyter-server + # jupyterlab + # jupyterlab-server + # nbclassic + # nbconvert + # notebook + # solara +json5==0.9.14 + # via jupyterlab-server +jsonpointer==2.3 + # via jsonschema +jsonschema[format-nongpl]==4.17.3 + # via + # jupyter-events + # jupyterlab-server + # nbformat +jupyter-client==7.4.1 + # via + # ipykernel + # jupyter-server + # nbclassic + # nbclient + # notebook + # solara + # voila +jupyter-core==5.3.1 + # via + # ipykernel + # jupyter-client + # jupyter-server + # jupyterlab + # nbclassic + # nbclient + # nbconvert + # nbformat + # notebook + # voila +jupyter-events==0.6.3 + # via jupyter-server-fileid +jupyter-server==1.24.0 + # via + # ipyaggrid (setup.py) + # jupyter-server-fileid + # jupyterlab + # jupyterlab-server + # nbclassic + # notebook-shim + # solara + # voila +jupyter-server-fileid==0.9.0 + # via jupyter-server-ydoc +jupyter-server-ydoc==0.8.0 + # via jupyterlab +jupyter-ydoc==0.2.4 + # via + # jupyter-server-ydoc + # jupyterlab +jupyterlab==3.6.3 + # via + # ipyaggrid (setup.py) + # solara +jupyterlab-pygments==0.2.2 + # via nbconvert +jupyterlab-server==2.23.0 + # via + # jupyterlab + # voila +jupyterlab-widgets==3.0.7 + # via ipywidgets +markdown==3.4.3 + # via + # pymdown-extensions + # solara +markdown-it-py==3.0.0 + # via + # mdit-py-plugins + # rich + # solara +markupsafe==2.0.1 + # via + # jinja2 + # nbconvert + # solara +matplotlib-inline==0.1.6 + # via + # ipykernel + # ipython +mdit-py-plugins==0.4.0 + # via solara +mdurl==0.1.2 + # via markdown-it-py +mistune==2.0.5 + # via nbconvert +nbclassic==1.0.0 + # via + # jupyterlab + # notebook +nbclient==0.7.4 + # via + # nbconvert + # voila +nbconvert==7.5.0 + # via + # jupyter-server + # nbclassic + # notebook + # solara + # voila +nbformat==5.9.0 + # via + # jupyter-server + # nbclassic + # nbclient + # nbconvert + # notebook + # solara +nest-asyncio==1.5.6 + # via + # ipykernel + # jupyter-client + # nbclassic + # notebook +notebook-shim==0.2.3 + # via nbclassic +numpy==1.24.3 + # via + # pandas + # solara +packaging==23.1 + # via + # ipykernel + # jupyter-server + # jupyterlab + # jupyterlab-server + # nbconvert + # pytest +pandas==2.0.2 + # via ipyaggrid (setup.py) +pandocfilters==1.5.0 + # via nbconvert +parso==0.8.3 + # via jedi +pexpect==4.8.0 + # via ipython +pickleshare==0.7.5 + # via ipython +pillow==9.5.0 + # via solara +pixelmatch==0.3.0 + # via solara +platformdirs==3.5.3 + # via jupyter-core +playwright==1.32.1 + # via + # ipyaggrid (setup.py) + # pytest-playwright + # solara +pluggy==1.0.0 + # via pytest +prometheus-client==0.17.0 + # via + # jupyter-server + # nbclassic + # notebook +prompt-toolkit==3.0.38 + # via ipython +psutil==5.9.5 + # via ipykernel +ptyprocess==0.7.0 + # via + # pexpect + # terminado +pure-eval==0.2.2 + # via stack-data +pycparser==2.21 + # via cffi +pydantic==1.10.9 + # via solara +pyee==9.0.4 + # via playwright +pygments==2.15.1 + # via + # ipython + # nbconvert + # rich + # solara +pymdown-extensions==10.0.1 + # via solara +pyrsistent==0.19.3 + # via jsonschema +pytest==7.3.2 + # via + # pytest-base-url + # pytest-playwright + # solara +pytest-base-url==2.0.0 + # via pytest-playwright +pytest-playwright==0.3.3 + # via solara +python-dateutil==2.8.2 + # via + # arrow + # jupyter-client + # pandas +python-json-logger==2.0.7 + # via jupyter-events +python-slugify==8.0.1 + # via pytest-playwright +pytz==2023.3 + # via pandas +pyyaml==6.0.1 + # via + # jupyter-events + # pymdown-extensions +pyzmq==25.1.0 + # via + # ipykernel + # jupyter-client + # jupyter-server + # nbclassic + # notebook +reacton==1.7.1 + # via solara +requests==2.31.0 + # via + # jupyterlab-server + # pytest-base-url + # solara +rfc3339-validator==0.1.4 + # via + # jsonschema + # jupyter-events +rfc3986-validator==0.1.1 + # via + # jsonschema + # jupyter-events +rich==13.4.2 + # via rich-click +rich-click==1.6.1 + # via solara +send2trash==1.8.2 + # via + # jupyter-server + # nbclassic + # notebook +simplejson==3.19.1 + # via ipyaggrid (setup.py) +six==1.16.0 + # via + # asttokens + # bleach + # python-dateutil + # rfc3339-validator +sniffio==1.3.0 + # via anyio +solara[pytest]==1.16.3 + # via ipyaggrid (setup.py) +soupsieve==2.4.1 + # via beautifulsoup4 +stack-data==0.6.2 + # via ipython +starlette==0.28.0 + # via solara +terminado==0.17.1 + # via + # jupyter-server + # nbclassic + # notebook +text-unidecode==1.3 + # via python-slugify +tinycss2==1.2.1 + # via nbconvert +tomli==2.0.1 + # via + # jupyterlab + # pytest +tornado==6.3.2 + # via + # ipykernel + # jupyter-client + # jupyter-server + # jupyterlab + # nbclassic + # notebook + # terminado +traitlets==5.9.0 + # via + # comm + # ipykernel + # ipython + # ipywidgets + # jupyter-client + # jupyter-core + # jupyter-events + # jupyter-server + # matplotlib-inline + # nbclassic + # nbclient + # nbconvert + # nbformat + # notebook + # voila +typing-extensions==4.6.3 + # via + # pydantic + # pyee + # reacton +tzdata==2023.3 + # via pandas +uri-template==1.2.0 + # via jsonschema +urllib3==2.0.3 + # via requests +uvicorn==0.22.0 + # via solara +voila==0.4.0 + # via solara +watchdog==3.0.0 + # via solara +watchgod==0.8.2 + # via solara +wcwidth==0.2.6 + # via prompt-toolkit +webcolors==1.13 + # via jsonschema +webencodings==0.5.1 + # via + # bleach + # tinycss2 +websocket-client==1.5.3 + # via jupyter-server +websockets==11.0.3 + # via + # solara + # voila +widgetsnbextension==4.0.7 + # via ipywidgets +y-py==0.5.9 + # via + # jupyter-ydoc + # ypy-websocket +ypy-websocket==0.8.2 + # via jupyter-server-ydoc + diff --git a/tbump.toml b/tbump.toml new file mode 100644 index 000000000..674b4f423 --- /dev/null +++ b/tbump.toml @@ -0,0 +1,45 @@ +# Uncomment this if your project is hosted on GitHub: +# github_url = "https://github.com///" + +[version] +current = "0.4.5" + +# Example of a semver regexp. +# Make sure this matches current_version before +# using tbump +regex = ''' + (?P\d+) + \. + (?P\d+) + \. + (?P\d+) + ''' + +[git] +message_template = "Bump to {new_version}" +tag_template = "v{new_version}" + +# For each file to patch, add a [[file]] config +# section containing the path of the file, relative to the +# tbump.toml location. +[[file]] +src = "pyproject.toml" +[[file]] +src = "package.json" +[[file]] +src = "buckaroo/_version.py" + + +# You can specify a list of commands to +# run after the files have been patched +# and before the git commit is made + +# [[before_commit]] +# name = "check changelog" +# cmd = "grep -q {new_version} Changelog.rst" + +# Or run some commands after the git tag and the branch +# have been pushed: +# [[after_push]] +# name = "publish" +# cmd = "./publish.sh" diff --git a/tests/ui/jupyter_test.py b/tests/ui/jupyter_test.py new file mode 100644 index 000000000..d1e310863 --- /dev/null +++ b/tests/ui/jupyter_test.py @@ -0,0 +1,44 @@ +import playwright.sync_api +from IPython.display import display + + +''' +def test_widget_aggrid(ipywidgets_runner, page_session: playwright.sync_api.Page, assert_solara_snapshot): + def kernel_code(): + import ipyaggrid + cars = [ + {"carName": "Chevelle", "origin": "US", "make": "Chevrolet", "price": 30415}, + {"carName": "Skylark 320", "origin": "US", "make": "Buick", "price": 21042}, + {"carName": "PL411", "origin": "Asia", "make": "Datsun", "price": 27676}, + ] + column_defs = [{"field": c} for c in cars[0]] + + grid_options = { + "columnDefs": column_defs, + } + g = ipyaggrid.Grid(grid_data=cars, grid_options=grid_options) + + display(g) + ipywidgets_runner(kernel_code) + cell = page_session.locator(".ag-root-wrapper >> text=Chevrolet") + cell.click() + cell.wait_for() + assert_solara_snapshot(page_session.locator(".ag-root-wrapper").screenshot()) +''' +def test_widget_buckaroo(ipywidgets_runner, page_session: playwright.sync_api.Page, assert_solara_snapshot): + def kernel_code(): + import buckaroo + import pandas as pd + df = pd.DataFrame({"carName": ["Chevelle", "Skylark", "PL411"], + "origin": ["US", "US", "asia"], + "make": ["Chevrolet", "Buick", "Datsun"] + }) + bw = buckaroo.BuckarooWidget(df) + display(bw) + ipywidgets_runner(kernel_code) + cell = page_session.locator(".df-viewer >> text=Chevrolet") + cell.click() + cell.wait_for() + page_session.locator(".df-viewer").screenshot() + #assert_solara_snapshot(page_session.locator(".df-viewer").screenshot()) + diff --git a/tests/ui/snapshots/tests/ui/jupyter_test.py/test_widget_buckaroo-jupyter_lab-chromium-darwin-reference.png b/tests/ui/snapshots/tests/ui/jupyter_test.py/test_widget_buckaroo-jupyter_lab-chromium-darwin-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..742519f4ae5821683a5ad5d52741dc9869c06001 GIT binary patch literal 15497 zcmeHuXH-+&_ht|kL4{XEP^wDkO_APFDWSI{QlrwO_byEZUO_1VM2LVwXbBJ{gc7O+ zkzNDRd+#N*Q0B(}tTkU|X3fW$HNX3X+qn1KefHV=+536&#!z4LG6Nd}2n4ze(RySI z0-eOee*QSFG!y;H! zfd2K>2kTbJdEq_^7tWk{0Lo<$61pIuo+zfLYLt+j-J{SGyECSsWf0E%prtPCQK}5> z>+p!nlN7mV8wv0E4)^}iwl%!}+J^@Z6$Z}&?*ujlELha+>(6dqkfU+?l2l*_^<;xd zo;^8TLV_n93i ze8;w7{+RG&jl0ymI3BH(keQ~-S36#eH7B@CE*OIvo?g)1_#-DL*WA>knI>_dgOtbWJG2>Bq7`nk3fsJ_1b?rdWW3#t1Rg*@9p!&t-^AYs=s!_Upl zEhm>N0t)QfRSmM2Nb9S!vXF8-iptTU0Yy)8(r{H56bL9;5QtM#Qyf+d33JS1mRj88 zmCvDwe-c2a(BUpdV0?ngkCODJ&#P8=hPZOmMzc?_Z>E?k$4g-Rnf2Y18gp#w&t9-sH zFCQ0v%*e2lMoB##xgly%W5}z+oC>BI;=QPK0UHUcRQF1QI6Xg~KZ#)K9#Vlj0Z(I- zb18W7;sqGe(b2IqMu>%pm=!50lsk5;AfSX6ZzNb;T%7u>9F0pR^Lt~YC;}F`9XX%0 zGn##15mXmMu3nR=s^eW8_Ov0mY(9YEU{D=a(XRJ;?0q$6CQ!^{HR@r1J3HwVuUz_A z1PR6u7P(o;J8vEZ4%LJf|9Z<-$T5gliHW|nZ@_R}*btZcN>;x#fhx1;l;~`mKbrlh=gPk940j%$(>t83 zZf0mnSuP22Xnha$wm-#~_2xGZ45V(;h3B7%pyyHm20x;v){@AxiB4}GfLFbGxntDH zCGWBE={wHKq?b=`$15iaiGF#G;rX8goN1-U?P801Ydh^!SaG`e9}51lNV=lu%Oz5v zQLjTs&r9`KQW?bN@=Zl8dV2apzbWv!*_K?U;9Wz*63d``Utz1703%`8$zsBEQ&OiB zVX0}I9~)XrG_Ui@Wf3zkVs#$q`C#x6`w90`++EtSh&2;;8$$I!Ul(pnMzx>gQN=ZAiOWsBjIE53 zkr6KPj|=F>PgKK0_uWccQbcnW@7pi!q}>n7*K-c(R`C=Qk&%&^Wn?gp-u>M2UK9%} zIWpPw^lZsgiuR&A2Mo5ky&ii8XFr!CZmr}>tR_~ zOEY$9SL5z%^_{@_x?Lues`>V(`EWH_<$+j&^Wr=rlmxsJTKMeTJ2vH&xKJfUMM=l+ z0kbVBCLt=P58ycK*&~{X!UkSBt@|4BocURKora$uoRiwC7{tH`F?{+b`Xmf25s$}5 zUE<99I?eyviQqI@BiE9oPyrSU^Y{|ODx3$!!ks&60+DE;P9-eS*Se3cHfRwiY9VDa zCqfMibtqZ2ub!TV8`B21_(6`q%7B-VuV>&|Cr9R$0bdVyR{0_F0UMvroH;WyGlLdX z(I@pesw~>;zExCGG$r~7k_upY>M_jyW3?18q{3~~xHd{$@XnnF##0=8NS}!bwUD8F z9G~8e{3{RZ`y0L?cnAHxLU0!K-^NOu_qgPP*FM(ND3S`)Xy0)tnQya-^(5vr?Wot+ zF?6IF#HNZsd->k^ZqMn3+;{s377X5XaT=_t(oPjBlyV+W+G@J0^#%wS!ZyJ2y!-qM zU&vmq2n!G!tcs$@%gepW75x8<*M(H4*N+~SgpJ1n<^W=`V{?z)(w{;+xbV~=WXC?~ zSMwTWh`j7HNPKto>eZRa$(;lDttS5NpRkCyL?mH5?8;A z@tSKZq`GKdVQ>6mK?2uoXQ~0xXXdvNrSv8~wEUEVeo-olEli{B*G_bL=yIF88VBo(!$-QTDS(do%;P346oCMF`$Up6+t^%f#5 z2NcS%IP`H{Kq7h=mywY0&)CMD_6zioBZaVyuG`Lkc^zlE(pJgiEorO%1BlHDmRBgmcF9@QE=#)9!&B_TJYkagD|$Yn)CWcaRf5a z#2!C*QnS~IR6j8*)k5l@Y@fWL2Cs9eGq>6mLip~fHmAzq&_AzvjfI82M^E$XYaxGy zDHt6vFdNsMiAvcTBglH$D%ow^oWQ578_(FYofd#=o%2 zBFfCl%FoKmYE}%R#&4qUQbFh_k*OxWvQpM}ZOBT-ZA7b7QR?sn4ovfVF+|DL#@IsV zd40^*h4QoJ?S?yXsE z(-iN#0e@KLGw78fY@xyVVA%5nw9$9#u3CCUNE0KO`>r81zBKKA_VV-Ve|hfW>avZE z4XMUXm{a-1Bih3~of=9UWNDVko2?uD+&A3->0IHU)NQcFVwXSR*NFe&$bQ!ES@SaAGN z*;}Jlc`?J*%!z!Ai&s7|-JTOS1R#s#!SJS#QFdkB4cXty@)xx(GIGhI8P|P{ZEewY z3j=U*DW?Lv)>N!_#hTz6kFv7$>iFv4Va0JOkb8I1*zUX4fCVGuiZ_@UE?(^In&g?8 zpT~a9(G+y(Xs{JGp#YKDXL3s2H)!1|MGP84T_!IDCCidrn`3z6N@y#^lbXT){(He4 zlv})Gg5Me&)t^3ny63We%L#@PwC2`|L!nS2EUlb8YPx($HHu2UtA}LM@%fyE;b&h3 zlCrYItcgEg|JLdS;1%6yPb?yJBchao52fcdnN7|up7G)%sV6Qc!foGpbh`ufnTreCk{`EOt)=QyTr_njfpdR#@Z@1+=_CMvcf)4s4=qYMHu&7VbR(d>DB?>+}oWq8b6_-NA$FgY*<4JO%-JT>7U z(4IpIx{A)kU7zNbQgc?bdbC)REb$Vk;o9#5LU)`PjTSzej>Xf59+V(L;gtieiT&(M z0gADWuBp8aZ|X$Z2wHY_^MX`kJS?96om&v?nQQ;c9lnr8lgZjVGPK^wEJHcWOeyL` zK6b!OmIzj)DYb7Y_{3pWM(Ki75oH&(_b=PEu3*niD<_HGR?D?sp6WUb<>=GnWtd3> zi;jMIIC|bdx3tdZ^NaMIKz_3}`$m3n!JI;^@1}MokM_CD=XSAYh3_ooeRqE(GzSxz z|3?6fs*sSiAW(Lo2bFTm+K=AWIl-*OncGVWo#UN;k66Wt-7_N}Zd$H?IVtl{Q@RRm0guYn;EeNi?4?A#m?DRMf&0n|H~yTVq|GD1v^f zzBSv^h6`>P?p12u;!~>YA-Yn^ytc(^t+A!AFx9RrZzF|_?#2(*7@GjM*4P|JOgl(A z4JppHr9+Alg@W8nGH0%-8pp%LvEKOe05n*>A~dvM#fgwG((nISp`LMGziTCTnXEoP z=VUxDC#NtPT3u$pY%R68neuQcYFa9g4_6nE^H#(@3EXU- zYk9?}+i81I3t~(OwPC(;y_hHeq<@MqoGgmRrOOoL6$i%`?6ieNmCAE-pxKW*8SsJ1mdx zk=?)8ludT2zq2ADSaIs(73;yI#U+=?8k$?9Hm~V>q*xvJ4+4nJ-#cT$5O0`U&w{}N z^47)cgwUo?I(T&1LT}eEuTpaoV3XoOA{^OQI^ZFi-nAE3UVn+AH5)rS&~EXSP0qJO zLl5PQ82Aja@^$al66??hMm-cflRUN}_Xv&~?do}RoFa1<1$G>1iyR8vsQmR}$eJ$+ zvPn;mVLwb`%uq~q;Vzu@T%px+7PF=wh{O&gceg%7`Eet`qUP0l19!50=8o*tHO5U- z=Pug;t%hBEH$yeo=RutTtodN}7BCxB14ZbyXd|5%AEN$3jAmuvb%fuI zj^AYpfx30TR#n(b=4@btujsLjMfZw@77w!JZ116%v!3*REaoTKwP=t;-apJ4F99bt zqZceZh5EhASwc)L0*`CK5OzjH*RT!Tc@K{J-TbUSopzpZyl>}Q0M!DX?5g;}$o;L> zrQg+kg4td37lmHo)#;^Cei=jz%mxlDL*1A-sVaHiLWft+Fy?nrx_pk0Vq=i#vnah+ z^DBJ^8n?{} z;a;?E|E~-zHiqlg z3oW~kO3g)s+#3Q23sP<0Qob2^Ic)Y-eJKFvXw`kh>mZKmcp%j)H%H4(bt^+D%dZ)1 z_l%m-D>MoEPJ2a8*O|HiTahPs>URdZb%F|A66&1H^)2G8`X{#sW?iI~qe;=c5FVB_ z=!=(nMio<%PX}ol`Tt1zoVZ!V*X3d&OACW*pAC6V#Yl74qW|olg}iwR8IV`^5nXy8 z)izwL7cE{Gpsyl&Sl|~E|JTMwX_hV91_>qvkMf^kk)?tLEV$@k51L!=o>9%KtDK2M zvnN*6uU1}X=QpUhL^ZGF+*@m+4>=uZS0#yLeSJdabXB-~0~hIBj`{grDqSY8B2&=J zaJhUPJ}`IrIx8!#gO*=FSy|0ukJHGbWJTz`ik4jIzGFv=o)fGdBg8EJ$;LrkKupZ~ zW~~x+jWb1sibM8Rr&k(t}j< z_y&vsVH|MIvg4l_VXXC5p|_gX=YQmox4P_*=zt!S`gUv}-`VewWF;e{Ji9BC!I3qC#4gJh%x zbwXo>zAaIl9Ivm-QPjBgK>^SH`Ebih!S|#TENJp;cs!s|R$-Dn^{$tk6tL+5zHm`P-q@07im=Ke&8}-rX?BsC>Fg1 zthD$*U)ezz#xn8AyR@$jW751KNAP$XZdG&pk2c>2n<3Jpp`-Q3n;r)T0T_*gDGaRc z!xBson^-$k=vS>AUu`P;c&9jE(8YK%oMMnb+|&JVJZ}QOV>*-N`k*wp)fRc?XhaI< z&<-B{`I9edCoEdi@pRCGB${HPl;_&t^iF#LX8E!X;kzGq%puDfs`>a11X%FJ3O=`+ zOCiEci=?e8s6^^`2yIewA3ez6B2aBPJ9Hx6x7+u6+r>PeOfTN@X}z^~Nle~nswhY2 zAsbXu$j+sA$gp;ApUfT8Z5EjOEd)xRQtiL5(fcGN3%a6$qtu~RbjE};{IHp%wh+e zfTVJ`7AuB^8xHEWr|ss{B3Z^d1)-J7QJj=UuU_Q<5`@Q*yz&VaEjt-bh?Lq;K2eQ zyVhP3BxQ?&H4Y84^Qa4HDhHsP5b)?cpMvacxe!vVn-QUeCHupl0MQXobEK(cK2B(M zFV*2Zf8bHCLF9x;=?6W*lI_0P3lQV_0d1`Iw<5NlqMGu{E@+8B38kge>!6K4f60tF zu9~?8`EX4>f#~}828Whn9d9Zc+3)$r)un$dU3OiL4u~CS>YX3#iIge~p!J*z-bo1wEBNDiVek{!G2`^3&${0?#4y%X@8ov=2Rw5MpNfx_6VE zHGh`fA2aGOE}%TQE0Yw>@-`KPjm>mE`5c!a=ZPcnw0pxV^UA8={Xnk}+*!+NoaOiqXpYRRFJ-6ZqOV+r8V?UzjCVl#sqfh5M2MY&B zGvSM2-(P;!*%SU|Z_zqkP zsQPM8Pe0?YM{4r^n@dXbwDc{L;wtV2uA}}lpDFt|E+9db3Eg$(yWWv%qQI2dHJ)0+ zXO_u-7ZvwWF(2p_C`2 zo*C^FC&bV_Uyay~dHW`~fGwlg{yO9Df?oI?6QAa;AN^_H2D4q1-2lX9ms+fSmJgJ9 z=`3GE$Ui^@&czZz@8M59brz`nY#IN1!Ns$Nqymwcg)L6M{3#i+K%gW7P7#M+C?K z!DH6ePGd!ddAgZsn5cy;kps;G!$LcuB}GMMcp*ex4M2Y((Q^1OD!;R{*u;IDe=<;H z`B@Yt{k%2ra?tE-s&UQ?*chvSt5(<9Cw6Y}r-k0Q>6@uW$)L8!*9DD?>yP9ukjZi;Q|wK-t?!qI$j+yM zD)q=3F7Ds<_~s^5E9->p^qgyd<~3Gk)~ruz_hE|^ z-eFtmw7$7U38AYqrwzyCBfrET-NzqXfDoookFY8w|68K|OL5}_Gy(Z>0q_M+Pfwu9 zu&6sNV+{vhsqvOg6ms}!ph*Z`QY40`^3t?$7Z)$KIL-%Xg=aQ4&{CH`y%WEeKtAMw zq~G_?R9+x|Ek7kdN=izAZobLl)^*?I{$fghcOGeYX~#{os=8YE_HDIc{}n?#i~Ddz z#(fI>9NoOh zt)(q5UPw>>4+oOZL=l+s)x3>uxbQQErBgI^u;{}dS*!S%?*4}kq^Er!!LGHVRs^>I z1v63m#$S!tM+*W#alrK>hXxeS#iI+FpeZ)1*5~5lS{lx;I5tjm>Ky1}GRYt9E_WF$ zZArNOO3bpRKskgW2=qjg>L}LI7E`F^EPFR*kQxZYAw$&yv?YVvPmcZN6cn5{d+Y=m zbijp=zh=t^ZY9@oNn7GWPtmJ(i_)Wu)# z*db!PM0iF+uS>_#0TO*LM+2j~*aNKbrQJ{if+OqFL<^|d1vz4wVG90@;ABfq1-q&o zR=7QCe7+V%3&4Vw;dW?KCxVpBYhi~>7LU#fp)^`BQhkltkH?%QZH+@pDz^!XF_OTE zMQJ(>ZE+G`h-#KxtSXpg7wxbK@^WD)HN&Zr(r#aZJuRE}h!>t&9`Vd9+P z|6I)mi2T~|?N`hL-MPaQj8SbmTOW=ep8B&}@bc0?Z+vekP^Vj$njXA*1 z2k?3R1EFhB{te0D3itZ=ILpE%DAsAtz=Ri4?Y9n#XHw}&`$r_|=B>LY4i$kw|wpuf##Tx#m&S=N3w@{(?3Ro{&ZF#4b#%4?m z;A_9DgfRz`{zx$3ZBjpm1cmqi3^LpE-h{N@#>oPt} zu}Ro%^=5JoOZx2yqzGD>S9#4P54yZZp@unK0fJ!t=KB#G06Oq&b0?mDe&z8%319x1 z)3n6cj(k**Iwx*fa3}Jj^B*`uX-y(R;pfj^g^#NfG2PzCLp`h8a0hJY;R4xovHEdl z5fVKfO^RUz~~bIA_0^n0zBo%UJC6=Xgdj zOI5XeZsqzz2QeL_5G$j0=|~gLtCvSfW3b?+?s}=`zl2DFtl1?v#qF*pT9D)Q2>KqS zu&^*_k)fKHnAp}f8G7JlH@n)14haa*2c#MOxp<*ugBrIQw+vRQ{NXaYv^MgL*NkD* zrJFw6_GNV$vXE_7k-loqq2&ze;@R~uir9Hty0Aik7f2B@GaffMPy;juyS@OUXV;nx zYh<`?D~-B-p}&FpI;*XiwwlT3bPN%OG_09`{vG01HeH5avlXPe4coRfuV&L z&_7V`e-_CA+0E*akJx$Mm=)FnkoH-7$GT<`4*gxX5iPb7j*TrTNHBchl8_0pOun2c zWzYo%FznF62j?>6Lx#SkOgqlaErCzpa+Rj*VIB+Qvzdw%s1-X4{#MD+|7dWjeJ``7 zpmP6g$dVLKV#)aQA#h1ij>fPs;ZXMr^jPfh}@9L%awme_w6u~3}(hjhyX@1G*TD2=6Xlh)h)v%CuHPqnd zrmRb&^fcqSOh%*L0R&)vF-oSTY1kr`Mck-KKSOG!^;=NkQ(8z*UOS3BXCb;Wd?Mi; z#lR|5aEDi$H|;rjHkEA=t46#2r=s271mIqQgu*IrY-lJ3p)y<@S@oZ40=E|cA%oL? zkMPj$K%PSR_*d^#>%im7kf2Y1=@;g2suY?wBX`GT+=kG3?H1Zds_39oiQRG2{#uiK&B=;<-YUfi#hk1_Ywsf;fPPF}wlM8q5)vSb1ukyvQq=EXS zX94K)cOh`)wG#84f!n?}q%;u~*qqc%NRjjONpFz%L>q-mXD2J?wDlp7!Yp%$m+5uG zXa4yx;ntEWj1`9CT7aI0oYzbjhU9Gg!U1(UzdD->pu&adLKD(ytiq4P6a%ot7CZhd}o$HsiMK!h`iTIfi|;n$vc$HGJv9(`eY*LIhvgy z98j;r9zyimkKs{hL|QFj{%53Vk;s(@`tY(6pne$Pr2}#G<+X3s(XMcq2uakmWwL^Y2g_ah#-&_4HnF)9NO|% zWEU~<52x&lu5LRJC{wk+ z`W&Td|K5>td#vr7DgUB9pfyjWaBYU-ord$s(*mqoCP1{d&|&R>PY)pceFRl8_fWbF zzgJclBtR2y8~`@0AtzbXLb}-ct8RC9w>jRe*1Uey7*~H7!;mU4yU?@2O!1lk)slAf z{w};5n_%eOuIHkJW-;YSi zwJqrY)B<~9s4(0rcQWa_CIe{k8c>LoP+8>W=*GX&5FwZV?qM{O0!Bn}wj)agXI6iN z*Yyv~Jr8&D0be#)$ z?)QuFq3z@sg-;HG?7K+p-9kXdxK>?%2hn*+0;Mazy9cdR2#WLLRuP9BPP`Msm@CEu z?1XL8Ark%iEb4r_W$rfIT?;wXFPgtg78XcKMY%`|iYZ&O?`9bHs@*3oq&;BkDUUm; z3wqe;$B7dYSIOC9gCc=Az8YWGo9GQM3w=~@bU(;xcoHv!Qc>l@LxlY~Oj>cFer>dL zp!f@(cQb{!!}cQpU6f?VoCx4*;41)51#&eYQ_T%PJves}$gx{XW81GZAKy%no^4Hq zv&*={);kZK2G&NYW%i4ZYx4zLTRW!f@xhA=Uvn_SUlIW^8$fjcm>u_&N5g5!pm%m^ z>Q4Pz{|@(*5#{iv+~q%k5@~2B-Ysn;!&!Tnk8Tm4=t%bG`V#09d-sq&G^REr$ALl6 zefQ_QBVj7=+G)yfY|Y@+)Ieg@LXr%2`A?OwQx}EqU0Sso&~&}2bYBbEzpj+aGhYJa zZJ>9)*w1t5Ip|jP_vd{dzEUZ|c6&fBj6XwrhAMe+9j>zyi_&qf zLv6hRL>eTFT`b)g-9{w`MPU=!d_zX!>#R)-{T&Wwkk=?Zi?gFHa)=Syk~cG~qKa z_3%)ZGb>J4d|G2paNYZWq2tIgZN8emM{x%%(KU#7SoM|y+5=k1J3Ks6fi27gw?X6S zx|^bco?f%Jf2PcF(50sfF`($-iuLENIOX8-G|9Ya39#xQt=0=bJEL}U2z!`~ zKv2i&F73X!;1v$G4$Rr)^e=(v&*`Qy-$>Zkn|k-}1wczCaQCjN+f9kzwi1glmz5l$ z>st5EGu`+E;P^;p!Mufq=LZJ|PJ89WyJWy0yjmynfJj*Ave?6L>5}PQNe0=CVtAQT z`3@A|@We8JbqFpV3bB;K?+XCmas0&xrF`P{2JGmy2R9`IWCENAKX}3VW=w1n)U8CH z!I4a8IXiFogoWETLbss-6c`vp?Y#xzH`&vrXM=(HP~Bz`F|@U{MasQA30Z?oRh-X&_aw)INqe5J7*8!a7^LH;s98BR5LQOVw;$i ziW;%1!ZL^N{9tAqYTl(B(N$L{Y@ioT&A16wI~`9HJMGew_^NH@q0P}~Mfr*D)+GK4md-4Pu(2#fUu|V&<*nVVo}Dzj zrSMv%DX;k~kQG8q+RhT=3P!N7E0{eExf6PlkLPGn1frYrPOe8M^j>{LPJTzHO z*i4p{m<_3t9pwUr3X56mRB*xa?|J(QOIsr)0eeUlnQHMRF>_~q(xWrL0?||Z%V08g z@d>5e`%ntr{9=%o*V+reH*-$vPe3tMD87p{xtqcq|F% zv>MK8F#-xOv=z|t@C77uR@Hv1alSx5ps(2^KN;}Ud-v|i2QHan)~7>(-&%YrV!>a% z>H-XNji~%8HfhV2OakI7a+M!AC_M;T`g!mL95UNBm1DyC0+UUToA4DA^6r^nuLC;N=y#;aZ5weA|NB&v)pr6MOvaxiA)nlZ(OZR|y%TuQzt!~Ffco||&~FEU{)wV$rB!eI zO*~HlQujX>{$rB=7oFj&z5U7Y=o;051Afu)C>jh*;V+4P2sdab4j8-@R=alD$d_ zwujJ#x;AzNPx3#1|NQu?tBt$Leed37PV6n9MioV+T^lNl`V?!ko4l7$6<@RhlI-2r zv;ssLx$eyzvTk9nN<5h9XkXb6ITtawo4vlD9f0ZTie$7dJ-B+cS>RXTXMyA4@gT76 z2d8JXE8U}1V)>xjKi}UfvBsN3+T=L=_Rnokx9`kw|8x5Gk7q*voISkyThzaoVPy3Bauq~xV`F1L;uoIeGor6nDv9A}HrKD(Mfk)&bDXi0 zBN1B7MEcJuHs)n3w-1htSZuklO9u5$W{AKkhc&$Yd1!F~mEqBK{Kx@8lE7x}&Mz%3 zeJlCoNT<(@-mt}ayqJz?#Y*uS*2qOhMkqS{=(24+43>6Kg{|XvtLz;doa=3sqE_9c zGeOo1z3C|;97%D8ZH9Z0@zDdn9x|Cqt0Tg;`wa6+hkBiBF;QYL7z~U=qtRjXUg~y%Rb?fwj~J~dC${I#+s?OB6<)JfoBzYx z9&g2Bu>@4Y-YoXBjMvuIkVRK#XERlOD#j{p%byhLmEYTP<-Brz$PNPe#*3Ln#tBZ~ z%Lsi4Vv(z&(VjG z(g;})2vjA@(MtJjKoijf)N^6s-V9mF9TO7}=={lJLw1dpAPMZGixwrgOOr{pDBJ$(4IGfD7T-s-q>{R7LJB6r~)gyGcwOb-H8 z>DBAk{;wks|2_sD?uynn&(*wv{~U>}7QF#$YmvBcrr>3wtos6ru(|!?t48Fs6*+i% zsAi!LuBL2NY1{C%kWMu~a&)k{qBTfb{5iPelK#Dp0WAkNB8o`OZFAj>-yw~ z{TC9}sInUtrIh7r$FTA{;ivYlP@wsjFJI>T%7Coib<^Bi(hdi>GvDXZRD87oS*8#k zr^Lp_iX~n|Pt<#Ow09;npA)RaLf0z+p>J+%q!c-=kPoLLi*!#_+F(tJ4bnzqnGChh z!cI}Za$eXTiseY;V74ny(Ro4k6G&%OjIez{g`cYs- zZ^iTls=OCaa;XqAeTVwq5l_M9xt0Z0W@henWS|_-C4fCC&DZ7&DEPFj2H_S5GRt+2 zo-jauZvSjq66h{%*JiKa+K&_=M9e=@^4M#f4q8j9CmvJVV29>Fu=%jop@=(ijTDCU1sMx~tlB{g%OfC`$avej z@(zmNd1-~dOt9-R&Az|0I_)u56sP-Ipm;oB$(_tPBJdTT_xU*A*x}I=gl6Xx4s8)O zc}aqj;NC2iq=~j4&n4c-mY$cicHV3H8*hO%5nSj_xg&Jy;6ZBJp#h-0hP(sTBjUMV zagn~7SKPK1`@`}b7?Z4hS&Qa6z#$hNJ;7IQNc2G#0p^ajlD3Be*5a3;spUYU)Ha!!}Yi`r|tmWvo}`@2fRqjD?V8G z+*yRi^V~wc)GBEr1{UI1v>+f1<^kE?aez?@K74+W+CN`sTba0f`_|gj@$MWuWZ>Qe zS;Zd4abZ(DCJcl1R`oEc8(dPC1SD=yj+igklSL^r`FD^-PtJ;={D!_u*w;1c#GkWp zOL;ue?42c2?!4vdTswXazLuS-IrQM!Gfk3;mY{mX1LV0&m*yW>)f=4G8n2534CHs7 zL;Z!mGz&(CI?8f<^B}7C%{j*+msPb464{WO=#z;xBB{v@0>XEfxg{_)RTIbJI`vO+5D- zEEcPK`l3X9M?s9KBBa{fxemd8Hd&<+^<4x!{8c!w+oRq;k`rhBV463dk$WNNw6|}| za!I&y*Ige0rHHqV%1I)$Z%r0@iI*WO>C)R@Moi0r7+e2vz^n2>^WE{9CiFx7mr&ZU zjihy@6>&{#o)iX_9o|M_k(F$cH3OBSc!o$GwHyoZE(P3po-E@6VaC$4L2Lw$UF zY9?vNZ`{9?AfP;YHbH>2rTu+wj!>y5>(CM+H@>-jfzkZeU%yG)w>)s}dt;U4;{e%8 z(NlCkRP`p+-3GFc1LEA(Il#H-SXbGbVXa|i@r#4h_NaBqy8FV?uxj(_>WmS^PS_;Y zvwxyq!n&%06CRHSxS}5n74X}uT^0$#Iar|~)6i)N%d+>-wNbPD{1@gG!80?rBM*E2 zBW+*zAWaftx%ATHU#;NdF`B`K_VGsk7`oNb(NW&l_oqJ`PRLdZ5M)|opoA0Nu+iyO z#`X|5Gc}jxnbJ&OE$+*}EEn>Cl1Ux+j{JUln5yJi@3!%nW8FzAAz$M3oMnKwAKLPs zbni+Oq>dNjrlYn_(Z+Gsn4M)|u)yBN!yFI-Dipc*3>s2Z4;aw~W+!0#n_Me%AiO8N znD~v@N?3B}&(zYBZSXFX6?<(lUgNCzaOO&vmzk3ZZgl2u5Jq?g(IBEHuSxN zI#z3)*`=?q|FsVjNO<}zy3V;TFH_SwQ#VOa9BeS3o0oj<{Q2U+m{S>ed|u~kf%3!s z==Fp8brnWSp+%`FdIgOs)7jtrM=VaNhIj8;JAOhQ9jLn2FU1?Lsin0ZlBaTm0?q~& z`PHje&2#Fz1yMN%VaWq#E;F;U!dd<4kHvC39-9UE`sU#Mgh{*a{&bx5QeN2JB~lbz zLq7H$=_C@ZGh`ghBO(s9yq5s2f|76)FUvQb(C}MdU*_kbprmFGdc?&_JG^$ZL}zrT z54NwrzyApWAKvkg%hN4`l}0UwyXkqHY;W}ZCJvU9lLO4D$@Khe&{`ntRC{;w2id|- z6F>~*Bc&s7qbZ@KDlM;BDBz2Lp^UX~a6(^>dhgX963GG7zh`q%*~f@{b>miiQWAdY z*1pTX(|^M)^W(_V*JDeqZPYC&%r)a@;`$N4`Ejb9hvQ9v080G>s6u`oXN7+p`RB~& zuaEy;zWFCdg6-q?{=G+ECg|B6~e z&dtejN}i){Fxw^fhJF;d+hS}AOZe@NWlL+p9H(U$GjcIc9P{ua-cn8`EuEbEhfn;U zmJ|QSb;tkDH@biD9IR5T-0fS1DKwr@wF_(OY=M1|)q>60ENvA{KIqO4N#F>)hz}?7 z;Gx>aNUK%@l4W;<}^{nThs2JGBt85AT4)O@FU)1L%!5*sdg4V(xw z=mGK`@=4#|ijPBX$3c5!k=BxYaKiS8DLZ;{eIn%P)4ErJ4~EA@IS+LIovGxJd2X-g zs*O|1qoy63(Z}8XBc($tw2BGX-(6pGx3aGtP)b3L2ckC~4SvtE4K_IG?n-ZvZmHrt zenn|#1%E-lifJ@m0@@nA1!8VzVPSRdWQ&WO%WGd`Zgd!(oswAay2Paqvv=ft$wg_G z0mnRYO81p?9%xY2t8*V2_}Jk1NUS_IXwiqGOt&PEr1te@4H7~E-5?qra5qbtcG6S4 zsoY!6ZKN&W=g{UU-!DhG_~0iF&9pZB)C9H8mru8sUfnFo#k)f_5paA%-l(UAGHENsD*j$*fYV5I z_gnV;pJp>Ex_*S4b=32VMC ze7;*px|RpQbz5t-e~S1vop9Xkqk^+jt(ah`aL>(?=U3G%Qmuuo3g!1LH8Dx@jL-`> zr@UU??))94I}rJ0GJ%2bJ*xO)TwY?-)8&Bg4~_~TE6j&uW$x(q<~6r(a(}=R90_%d zALOu2`Yd&0Jh(T7WI-_CGa1>jS-3>1BzO3Xd>IV8o|T2R-QllP|MLiZb2Su`HI(7#x5U)gN$G(J9VnEr(c_YV>YLAHI_#}tdBlN03)}n8b_+>pJq% zhA3MZ>xaz_m=RLYS2 z6C9y3)<~zf2ILIA+ob0M{$%hjbhNzeMDHvupFYW>&l|sp886uys#Xt@Fqf--LLI7k z2E<wByY7tdQ)7Bo4hC>}PwLKfX^|Jqd>v^-D$k6iuM367DJe}J+(8kJLL z4!lzBT=O)$nZlv|21u5=-D$7555Tnhvm0IChaxSM<(h6Afm`PgV zdZ&QOF1dB!%l^UFyeCX-8>ng*2HWYYNkA5DL{60Z$33qZuMC5CV?DN5jo}mcOAL7! z?xBoqjw&D8Fax80z&$u!^$VT_A2~3GlD#HEzqdq9`&r)Gap{orYsl2nOw?6rEG3K499z;g}2Rel3G#10l^+5R;@%TD0Y!v z6`3`MliA;xt~BYnUweGt@;Wv{q}-}{ipV6LJ?5>dY4MnzOC*!BMSb zs`#UEU?giQ;I3AT$=LKY@%2!UOKLwsEQ?UkA6pQ(B4@G}iKuZFAB2rrv|H;V4URHU zCL3JzoJT-w#;m{K7j<6#Lg9cQU=Z~n=t#3>k$CUX^4(Es>P`37v7Jf`SDqJAY9eU6 z1yFm%ke$<&Q(H+Q@nSL>?>iTs&#%);Udj?Zr^oQVsLq1K`V*4MGPfbqd9q-EriV$| z-Vo@Z<#DT=@6T*&=0?2}f9NvZ%WK2fFFdyVZqvh2b-ml~!n>+Da-YF}FhoAO&;xS4 zAP-^u=&3~(Ww%X(Yu!)w^b@KO12F%(b@kjYfZOwgy>6;#Y4Y!W3_ds*r;XvYE!+pF zAkjM$ElVFndWe&EVjgvqy9|TuhFiIOT`t7v*R!E_OHu(B44%yMNGz-?3FlNQy zk18E>btG;fh;oO>PQTIh>ogPkbX})0#y1m)9#EkP{&AB7bxOYi!`@+4-Y0AjOH+Ze z+Mp=A^1nQ+rAl;_dOiO394x<0G#zdLb$$Ng*Fu?0Oo-2Tq%ZnBVqUd#vQpNaQ613C zirwlScS}3DndVfc{~jxae152@h;}t5tr|oWI9)hk*uM_SRmJE!Z=rVI7*j`z{`&s? zES>P`$gnhV-9cQ&ZF=nN4JzHQ){~H{&@+}-=arXRey+m*sJ~lJVrmZ+u2|&_6ET&5 zPe&Z8u>CPhd_Pq=1&Ap`5`|^O-C-=Y9ZJyEKtNugH>p15#}mnGRQkHl7*2)9;9N)aZsKEBoDorm+EnWU5X`pyA&3#<2 zQ@U0RgT=0csvJwN5lS}NkN48V?+kzK*%Dl0A6zK5Ym1zu`L?-Ez=NX_d@G)8t%L{U zU=tC$8*W+Ek!w1yk1zD)RDep8GEDB}X58a7zWD84P?oVNURwtwWs4Ewtt9fTH7X$I;H zj#d_Z%+?kdTTufKH}V?}Yvyu%H%&#?2vYFK?Ez-Y1B!oTz;}A=1GKW#<|Z(vMpplz6l{TH6Y=Uw#7TdoOBKdfGnJOvF)*?=UlBXsCLvl;ALZd@GF}0$2x8+%4@nXh$(*k7pw%$?}v`CU@_eUQAz}H<*<53P^-9H2yR6%eLU>?yzJ^bsngz=1BhYqGAK;K zoB&(RqiXw9owaEnywhC%xcYhG4z)6za9BAg3MTKY7ulYFC2Geu8a-Mcig?~Y)5t8@ za1cP0{iPK@f|)T|P79l*5TUGemIw<0js-z0e7zc8Xm~0B7iB%Ag zf~CXuOR^*(v!-9wL_|A6G!k>H`{dAp+KW_&!9t*>eaxNSvZBseteOUwgiNucQFuYC zVeE_7c2Usal}+wCvP3*8?bt|Fw0Pjo=VC=)_T8u(=IdkVhX!1R#;F7j5Kb*)NB`K4=paj{_d1%@^k zXj!7h-qt7useUyTJ^njoFj8-O_gz3DYlaI1G|%lAiMi%YSC0azopz2^FeSG$*jw|~ zv2b2z>YOQtHM}1QM7OB#EoaUogilWo_CfNSTI<)h@7=pcW*uxj=+U%o+I?Ms`J0VC zaPYQD`(txxsQYaZ<`O%8Zg!2Dg(MY=PVcCw* z)cUGC*V{K{#jUl5AEW2LU3azS+;}CmRvq`0`?lMs`>q+BFMy-y*#C3)=%d!=*3NxD z8KHmsVAwS0UqJxAM*kd8NvHFrZa9+2r81=`@3%gydQd-hDiUeyxl#3DIZDhJY> zrfrQO1P~p=qMT346?TQCd13Ne1}0*y)VpIA`4OS#rOodG5B8>9i>>Xu{d*>T_QXLk zIbgSi^o2F(Ikzkmw%er6fB!t^okglOa8DTvvE>$)A0EC0Dx{O`U-@8>v{j@LrIa#a z*=z~6sSK~1IR;GmCl^4aW`37}c<+nPt4Jx-TbWDJHXpirk2RvLeNoxymtTJ2fU-I# z&L3bzOOv7S@1KaZcGetBTI2?GN)1wBZj571NB}?;*c>zMyPWY(fq+>L58HWHxwyb`x`_=7AJ2n=%-2dG7Qn zOGVWsE#IFdj(eK3%bt?gu;o32H|9=GMYV=RvV7tWmB2W~spN&)*518)ol_4* z2&xzF{dM$a*al z!C4zW*_tmW@q2qAt{D%*03;r$Z)Du}y3LS9D${F)y=jt^yjoX_ij`C?oRu`&K{?A9 z=(0na3?SPbe{G=b%L_!@7kz8DJ0~OS_LJcL!NJxM5iJsyAxFhL_t0ZZF`U*3hyrwH_} z<&b&^b1vco(65Q@rROt=u(_o}VX$pWD84On4uOJd;!o#kmnyYibE>tq+$YE#Kh~XJ z9%BV$i zLms^CO}|muV^Lb}i)Ud4mrUTls!Ucpmh#Fvpw#O<+$ZMOMZk7gZ;N#m@^D)uBgbCQ zXJPR%pgcIW2|4R34|ZIUoz~%ph^$PagebWA+{MyQBi3b*ocUd*Mu@yYbcu`w<@vMT z4269u6BRxj>ii%kQhWf#%7Pgny{zJ`PST3rO7^fn6!`g$qHLT^A|QzZ|Jw7z9DsLt$Y}7Nt%rp`oFqC$EL?#8RjPG?k3S z_%HPqOQcD9uKpG0UM1{mf?(D=r*e=YV1>(Wu?_+D3czyEuU;ddtpRkl*h;*Hmm$6T zJP;0tf6+}V0*F44rm$13tg*>Vt>7wy^y~Tgc@h5jzPkeUO#+zV9Nn_DmDEu-PSiiR z-gDD#u%z!>@rk1b$S9lE_G&5Nq5BDIbK9%27Rbt#w0;OM3$A3dKMs?9l&kCtIm`_9 zvm*!8EZ=RfzA^RioeBZ%=_})5cC0DX?Yxs_?Z2NIEwm##MFKc_CTlK9!mOZCTS(15 z17kn*wt8;Z{tf_kE-WsVqz`IgJd`e*F=G+{M2wC}T=IcmU3sYo=L)AyTNq|YTcli_9k|X{uCIu6Sr^pgFUIhC4bNIEoy(rI zHaEX;9engx6J4*8bfUHZvsHQfF>prJUG8$+3EoiR0|vJNt<)Iye4zJdsY-jDDddmLWAoc3yiYlUi>!y zH9r;1zW#yv!@WaXgqmYj55d}(wIR?=URLPMy-vt94LiI8(Zt)%iAs&jDvPVE?N z7;TI$cWgH}-uPaeRjl9Jhl zY>)P4rQX?<6}O8q`Ah~+nc0ZTtE41iC*5;lWv(!Ei?0k|f(Xd(IdbR$BJQLEItSS7 zY5Bhg=8}~b(<=bnT&kX;ba)e9)0-i==$V@6bIcf1_3=r&Dg zL?P+T8=%v*y`b7O;q6~Nxjj2yJkhw+7!}2CnoI?z0)Y=G zUeYA2zFL@Smv1`vaSTPCI)$%V7%kssCnr?UzHQ8@2OaJ?WaO!C>@sCe@L$mu-T=Lb zL=|SM1>vz0B0WtSe>F0gM+{vh2!Glx#Y4}{D~FK z$Z^m~zxjA{NkEPo@Nc5c_2X8pp?TX!dk$)hyA=K`;I}JtmvSkq$A55*udM!LnmUCA zfhWR$yyWmtU&Wjss%pjMIQ-6)T0?y47j!Hn`O>A8RSpxB%gKMLUG~(g7(RFqkQj50 zTbchW(&_&U{wC{+8oo*HcL@N%YR)kQNk4XYJT``kjyqfD^eKWKS(*g!DzhEV$Ugv( zf9Y%uI}((FEWmI$B(k2aZGWAXh#=(0os-USEckxtCXkRfTQk4sC)u?wV^ASF@1g zAmAepFjd3a;F5ZiH&5nh!VSA*X#qplU)%r2{8)wCfN6fz8hR=Mw&Eak! zd`Q$)bH9s>wkTsC85NcR&R+?-rLqdiNWo7#qu=CK+So=)W0L+| zw$w4-_cJ;#;5%OP2+&QZ<5g8v>~aJ^l|$L=nlbAm8TiXb_?M#BGxU*dZ?U&i7rno} z+ZysPuYB9KOyBk<2E&_}*0m%DT8*s*8@*vNNtVP(8y+g11g0{h-FHUe5XdTXq^8tD zmXk%wZ3z+_W>#(QXKBFp$|)dLQHBP5bd)kuAKI4}#vttmx~=;V&~|!E?Mv@v+YW4# zKs#@zNF=4O)kcj(C690S0TPm7hAb?-wAA$#3rO#AWBy9oERYb7e5|baYipXV5+__s zT35ME@PMcZScdAsHTAY4nLq#ReK!J&dBkBHp@|h{@k>y@idy){@B2=JGVM1<%f?eD z+9JEOXh-;cDd|U$MK&uzlq6EuHcKUb+mp>_iHUf7*iw6A^Kpg5Ukf9DLrwbzHL@yr z<4+$7mRsxgk2XY$i-LU>G3B;EH|BAQZeXYm^37W}x36{1>inT*$kA#u=hnl!kcBU6 z!tKcba#82f^=JKMMdSX<5>>*27pd#r@nMZ!s&E8VxOJkU`DFY3Xl&bP+gaE8u#mrg z^$+nJnVv(PyDSn!FX@M}2XV9`10#-Kq->=l%L>0aM?zVId{S-Q($!@X5dX;DL zfTVy4oVvW}o{1Gyif9a4ohq)JY;b<~BILfJ+tl4bO?nZPh%W6e3qTf)NoRV_FUuL| z8@+jS!T-q1c};|M^n`#anXLmO$>|$n(fn0f9^pI*E& zjkp+z&}f?uKbR8ro(iykQFZjMNuIpnwi~X5w%hl*E`X%SB|v~2{%jmhAO6Y@hDVLq zNqc0BQ3Yca7VmN-(CuGiIkO8iR;XXAayUH8q;=t2pP9s>C)YY0T2Vk!+DgRWT@L+s zFRo)8n(VKEgbMG)^8q}#s}oJ0*f!SV0-zx7>+m7+&2>>a5_8rp=-pC4u7I||A6ESJ z_gz6y)YKDSWex$}JTS1XZSTOd-gnZ<5hNsfgYro3PE5(ka28E_MpHW%pqXDQMe2NW z&I_{4*NjpZinKxKLEi)`TiZydD<<(ps+qw0$z?%FkkMu9ECb}pI|r+!=XdQVH@&$9 z@p-sFo9XeXwNQ>D;c85kI=iRDCM$5rxIt?Zl~%HK@E|q)j*))5q7eTz(tPhbi%++~ z3UC={a}mIXJj%`8bInc}Xr%-5&NM5&dX}+Qn8abYUKKTzR8|HU@lg{E?uCV9fZug_ zT=Sf5U84k~?ETElLppWH7z0qX0n(dk2C%Tr%4i_NYM{N}T-t#E6FG316{GL_KNF$E zLru|E?{s<^!1_j`Ir6uFf(vLBTh4cwLgb|Ko(C{cT^2m$0jVefWydrTN-yEJrlxNI zy&OQdQ5SO8ccMAQd+Yb!GrK<|ts7o*=2{S?X_9ujYX0-dS!lF}C1!1J(8sj5$`q*Ke|#4`Z&mTvW#6g0 z+@~*(Zp?`T5n&gZaQ-rHi2xz>^HYG|i?XaP@M^edN;-M+q-6q?u&}r$1|;qfwCz1@ zZEgP0y>2cbQl$2~ShROtyk0P8cn~?O1Beq4>+h{g$dfLCWEN9^9j--w}s; z9Flx|iEbTl>%85+!X6nYbX5!|$v8A$63@u05>z0rCKDbHB`2Pu-v#P}@!~j<8=A0T z;;ZNY@%}@pbIaoBj;rj|%l`1{9uO{8lN8#k04&7Q?MHDhmpu;U8EdeNh_8`9qG0ew zYaR@qe_S!sV>IMkCbbhbb6ZU&T6K-cXLd_g>pFBs{7{2E`~6myGKBmS3_i_ZEnIk zUh#tEf&v3yALoIS(Nln~K-j`uvUDc`K^4oOpWV_5LdEi0~wK0Ffr!X%B|~ zWE3Tv)%>mXFPZac#q*D{r-EqX3#(^1(*v|gvD(mF|NdoHVoJF~V(Uk>Uz4Alev)** zh$QU#6Fj~$QfoMz?}*UAo&M(uF3MBP_CMRexc+aux&G(G`k%4?m)pMnd*lChSKNQa z^I!4&V`%?1uKx{q_mqtdb`?%v;1=vcEUjV3)~L>5onYNs)$x~L-6tnrow2;&sB`n> zd!Fb2xotVheg65ud!DO%^U-@V#|>VVh3XfWWyk(@uE2=*tU_GeqpJ$3Ujl>S(%7}A z2vvwuD4-6e9KNQ;4yV%k*a+6G+rNQ0YjgeOKbu&O{`u3dzQ6MPr>8x4 z_a{^S>GMB+s_^~)eEP}zJ%05kQu^PAxw!r-Fs}b93DeoxkxwuZ4bN(;DQUZ@|{~m8VhPqWtQG`2?=giWI3?^D}>~HP9 zhV*73)8_VYP?5&+VIJ&Hz?03e z|C9he*!8;l6z7!wc~N_g8#c9T)^b|K|#&_ zeU#pGnpf*p%64jwY%yyaCJs9+wTNs9BTS~IZS^3cZoU(YNZ<~?_R~X#3{iK&)iS4) zb6%&4v_e7UC=oDxZ|g-xMWt)?TZF@7GTRDE?t9pXWci7LTcKgmk0yvmyTh8k1j?I4 z?v2l>+K7{&>pyB!r55{#=f|CpLAXfGoe_J+!TKmANP%C-=|c^Y5|V96cycS-Sls5z z5@m-`ZVoi$N=cLwR3;hMIxW4ss<^wg?5mh%BA?ek>=QgJbTV;{7N|Mk-=vSY`Nc`z zq_tv1XgX@l1LiPj$nO0%Ky9`kc(~_t~$DYR%ExRAFqV1LQl&;i_2))fIS7cwFv6W0o^R{$3 zPO?1rz>P{OH91@(p8XjEO&%>#)1)%`12%Vps+?E87Xw>WS84Wrz`OZ={R>Cy8+6gm zDn_A3;W<|5wElpl5lW!1D)|#DYH`bEfakKlgKTYWq$tfq+z!w~FZKSldfG{AtC5Q* z<+U$32Q#P}uIN=K=IZ!1cl%0b@cy1!bR~(Dt%eY$nJmQ&T9uo-YDA|IDtvRBX4U%^ z$*gxvWp8U9&q{}b#y5@;iu7@tKAaE$xZ2% z@w+5-jesS5)_T|)q(>zpoLZ`#d9Wp9pv}%-N}~7{h4rnAT;$P4_y*+~F?sNrM!~+C zFoFTS75{FE-B|=xX6FeOMXi#076z635bNQQ@?ljrzaRP{-Zo=1sW^l*<+KH%Z{8S` zLp2lvGgHV-3vJ}pdu3l3XI+>}n zNoFIxfO35W@qJ7-WbtBZTIHx|lqx-({4U~fFf)0#-?w$6am|Cu-b2riBTVTt!QzD& zK+r@BcE73E9J(q;a?SQY)&^R&0;-#OL5BH56qm}&c>Nwf?E{fzDu@% zm>Xp5HKA5vtv>j?=%J{^T6dQb%7zq{65`*o;)^8?dJX^mF{m^^Gn}^kZ6$co!N$%M z5M%Fzt=L@jT)=i1^NVZkst?Q<(TGf_wR6Y%8tXtHq#vuFQ7Cz>?2X{zdebnU*|82o zus@ZAz>%gmUVpN}<*3Oj5d@=@j zh0})NM>(nRQ{0npnLZf+c>-AJfrW>@vfPY*yh-Wg-G;2(aH2*8FA1>aK=~d&xKeFT zQCwWDje3rcZROa;=E%NRdTY*->zJT)R;%;LSh@A<4V4wXMZga45BR*+9Ga83jRU#6 zcj7=0PtB=f)_*ITS6v{0(UAv?(7LIEuyb$ zFagW*+WdH}M>6XA{%ClnBlTYGNfkAg4V~z#wKU^}651mizu-BSv}4!n))u20CUe>szSagdlU#mZoLvb< zhmn$0YWKC7);(Qp#c_l(olpA>^_iYIiLFmHW!;kxQ?_Z9Rby<<_b!>|gg5U0SR29S z{>WcmNwsp&PP@#ef-fT3bZ2eZ`||O9k*hqorSx6z|rm z7YuNneSXf;^x2awsox*$`Zal@2?kiAApw<`rxtu}HH>+Cf@b0};tqJp3?EDeB_yIH zv?C=4Z7qMHN)bo793=zhxXVG;eg*mjZM58?xS94=J@(o9!@3MhFyf{rp&q7>B@YJ5 z4-D)O&gMmiAaPB3(FDTkx_w{0WX6clNqK(Y-!w#Fsj}MXRA*l>{YO&KbcA~i+X%&t zM~7~Wn<{lhtQ{$z{$bItz-rqb?78FX17)u=e6?ol#k2A~WG~v;VG~@Kvmf3Gs$@C)`}t8l@yTiR^?}W;MxER?UtB44Mk#BRG&Pt; zs0Wgs(y9!#3$)Uzm5M6g%f5I0t#g@yRK#K0JQY#gyd7hSIh=KIr-`$#(!1C#YKw8Z zK!z1=0k=-|jZ$QXSwdQ9tf7_MYV)R&J}~m%+mbCUzY`CLx}11Y%NWFEipnnryOylcW+VO;p!U zNMl>GiW{*P897yv;&lIg2x6y5juh{>UPdsPU^*!`GZ_#`im%9=r`l}XQ(_J}%jumI zpKQbwy}8{f$dB4iW-U)jQ8=5K_iP)9)v`@b#7Sq#Y>8>yIIT0P)RWx97TXaG4hF4L zT46HCg=5vS?&*_>Skus|N!lL~+`)e`5+4lzB$xhwT229`b literal 0 HcmV?d00001 diff --git a/tests/ui/snapshots/tests/ui/jupyter_test.py/test_widget_buckaroo-voila-chromium-darwin-reference.png b/tests/ui/snapshots/tests/ui/jupyter_test.py/test_widget_buckaroo-voila-chromium-darwin-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..3df3dbe26043103998a9dec56eb42c261543b548 GIT binary patch literal 16420 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 C&uh&9 literal 0 HcmV?d00001 diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/analysis_management_test.py b/tests/unit/analysis_management_test.py similarity index 100% rename from tests/analysis_management_test.py rename to tests/unit/analysis_management_test.py diff --git a/tests/analysis_test.py b/tests/unit/analysis_test.py similarity index 100% rename from tests/analysis_test.py rename to tests/unit/analysis_test.py diff --git a/tests/auto_clean_test.py b/tests/unit/auto_clean_test.py similarity index 100% rename from tests/auto_clean_test.py rename to tests/unit/auto_clean_test.py diff --git a/tests/basic_widget_test.py b/tests/unit/basic_widget_test.py similarity index 100% rename from tests/basic_widget_test.py rename to tests/unit/basic_widget_test.py diff --git a/tests/fixtures.py b/tests/unit/fixtures.py similarity index 100% rename from tests/fixtures.py rename to tests/unit/fixtures.py diff --git a/tests/lispy_test.py b/tests/unit/lispy_test.py similarity index 100% rename from tests/lispy_test.py rename to tests/unit/lispy_test.py diff --git a/tests/pluggable_analysis_framework_test.py b/tests/unit/pluggable_analysis_framework_test.py similarity index 100% rename from tests/pluggable_analysis_framework_test.py rename to tests/unit/pluggable_analysis_framework_test.py diff --git a/tests/serialization_utils_test.py b/tests/unit/serialization_utils_test.py similarity index 100% rename from tests/serialization_utils_test.py rename to tests/unit/serialization_utils_test.py From f05241bb112ecfa71d480efcebf60877e9670b74 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 13 Nov 2023 09:24:20 -0500 Subject: [PATCH 175/250] adding feature_request, and disabling blank issues (#134) --- .github/ISSUE_TEMPLATE/config.yml | 1 + .../ISSUE_TEMPLATE/enhancement_request.yml | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/enhancement_request.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..7c3c16708 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.yml b/.github/ISSUE_TEMPLATE/enhancement_request.yml new file mode 100644 index 000000000..7808d00ab --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement_request.yml @@ -0,0 +1,58 @@ +name: 'Enhancement Request' +description: Report an issue with Buckaroo. +labels: [bug] + +body: + - type: checkboxes + id: checks + attributes: + label: Checks + options: + - label: > + I have checked that this issue has not already been reported. + required: true + + - type: dropdown + id: Subsystem + attributes: + label: How would you categorize this request. You can select multiple if not sure + multiple: true + options: + - Display (is this related to visual display of a value) + - Documentation + - Summary stats + - Developer ergonomics (defaults, error messages) + - Auto Cleaning + - Performance + - Developer Experience/CI (feature to make it easier to devlop on Buckaroo) + - Low Code UI + - Other (please describe in Issue Description) + validations: + required: true + + - type: textarea + id: problem + attributes: + label: Enhancement Description + description: > + How would you like Buckaroo to function? Write a description of what you want buckaroo to do. + validations: + required: true + + - type: textarea + id: pseudo-code-implementation + attributes: + label: Pseudo Code Implementation + description: > + If applicable, write simple python code that shows an input dataframe, the code to transform it to the output dataframe you are looking for, and the output dataframe. + validations: + required: false + + - type: textarea + id: prior art + attributes: + label: Prior Art + description: > + Link to other tools that function in the way you want. Describe how that tool solves this problem. Videos are welcome too + validations: + required: true From 45125740211d82f9ed2597d082da75b812408235 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 13 Nov 2023 09:26:42 -0500 Subject: [PATCH 176/250] Update issue templates --- .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..bbcbbe7d6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From c57f3d8fae1a739115e35b910eeb708392109930 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 13 Nov 2023 09:29:28 -0500 Subject: [PATCH 177/250] trying to get github to use my feature request template (#135) --- .github/ISSUE_TEMPLATE/feature_request.md | 20 ------------------- ...cement_request.yml => feature_request.yml} | 0 2 files changed, 20 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md rename .github/ISSUE_TEMPLATE/{enhancement_request.yml => feature_request.yml} (100%) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d6..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/enhancement_request.yml rename to .github/ISSUE_TEMPLATE/feature_request.yml From 4beae86dff2844f964da130e8b96d617dcded52f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 13 Nov 2023 09:34:26 -0500 Subject: [PATCH 178/250] fixing yml syntax error (#136) --- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 7808d00ab..b6495383b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -49,7 +49,7 @@ body: required: false - type: textarea - id: prior art + id: prior-art attributes: label: Prior Art description: > From ee6fbbdfe270826502fbc9ea701e3e5dcb607e30 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 13 Nov 2023 09:37:59 -0500 Subject: [PATCH 179/250] Update feature_request.yml (#137) --- .github/ISSUE_TEMPLATE/feature_request.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index b6495383b..5d0029ec4 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,6 +1,6 @@ name: 'Enhancement Request' -description: Report an issue with Buckaroo. -labels: [bug] +description: Request an enhancement to Buckaroo. +labels: [enhancement] body: - type: checkboxes @@ -9,7 +9,7 @@ body: label: Checks options: - label: > - I have checked that this issue has not already been reported. + I have checked that this enhancement has not already been requested required: true - type: dropdown From 193d0d99e66961942f25fd8687a403ec4198d01b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 13 Nov 2023 11:59:50 -0500 Subject: [PATCH 180/250] Update README.md (#138) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8da157f46..037b6b915 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell ## Try it today -* [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/chore/colab-play/example-notebooks/Full-tour.ipynb) (Walkthrough of Buckaroo functionality (histograms, extending Summary Stats) [![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb) +* Buckaroo Full Tour [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb)[![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb) ![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) From 3e5534cc9153adff82e17ced33164301d899360d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 13 Nov 2023 15:15:18 -0500 Subject: [PATCH 181/250] Feat/readme cleanup (#139) --- README.md | 228 ++++++++++-------------------------------------------- 1 file changed, 40 insertions(+), 188 deletions(-) diff --git a/README.md b/README.md index 037b6b915..af1609a98 100644 --- a/README.md +++ b/README.md @@ -1,222 +1,77 @@ # Buckaroo - The Data Table for Jupyter -We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaro makes all of that better by providing a visual UI for common cleaning operations AND emitting python code that performs the transformation. Specifically, the Buckaroo is a tool built to interactively explore, clean, and transform pandas dataframes. +Buckaroo is a modern data table for Jupyter that expedites the most common exploratory data analysis tasks. The most basic data analysis task - looking at the raw data, is cumbersome with the existing pandas tooling. Buckaroo starts with a modern performant data table that displays up to 10k rows, is sortable, has value formatting, and scrolls. On top of the core table experience extra features like summary stats, histograms, smart sampling, auto-cleaning, and a low code UI are added. All of the functionality has sensible defaults that can be overridden to customize the experience for your workflow. ## Try it today -* Buckaroo Full Tour [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb)[![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb) +* [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb)[![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb) Notebook ![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) -## Installation +## Quick start -If using JupyterLab, `buckaroo` requires JupyterLab version 3 or higher. +run `pip install buckaroo` +in a notebook execute the following to see Buckaroo -You can install `buckaroo` using `pip` - -Using `pip`: +``` +import pandas as pd +import buckaroo +pd.DataFrame({'a':[1, 2, 10, 30, 50, 60, 50], 'b': ['foo', 'foo', 'bar', pd.NA, pd.NA, pd.NA, pd. NA]}) -```bash -pip install buckaroo ``` -## Documentation +When you run `import buckaroo` in a Jupyter notebook, Buckaroo becomes the default display method for Pandas and Polars DataFrames -To get started with using Buckaroo, check out the full documentation: -https://buckaroo-data.readthedocs.io/en/latest/ +## Compatibility +Buckaroo works in the following notebook environments -# Using Buckaroo +- `jupyter lab` (version >=3.6.0) +- `jupyter notebook` (version >=7.0) +- `VS Code notebooks` (with extra install) +- `Google colab` (with special initiation code) -in a jupyter lab notebook just add the following to a cell +Buckaroo works with the following DataFrame libraries +- `pandas` (version >=1.3.5) +- `polars` optional -```python -from buckaroo.buckaroo_widget import BuckarooWidget -BuckarooWidget(df=df) #df being the dataframe you want to explore -``` -and you will see the UI for Buckaroo +# Features -## Using commands +## High performance table +The core data grid of buckaroo is based on [AG-Grid](https://www.ag-grid.com/). This loads 1000s of cells in less than a second, with highly customizable display, formatting and scrolling. You no longer have to use `df.head()` to poke at portions of your data. -At the core Buckaroo commands operate on columns. You must first click on a cell (not a header) in the top pane to select a column. +## Fixed width formatting by default -Next you must click on a command like `dropcol`, `fillna`, or `groupby` to create a new command +By default numeric columns are formatted to use a fixed width font and commas are added. This allows quick visual confirmation of magnitudes in a column. -After creating a new command, you will see that command in the commands list, now you must edit the details of a command. Select the command by clicking on the bottom cell. +## Histograms -At this point you can either delete the command by clicking the `X` button or change command parameters. +[Histograms](https://buckaroo-data.readthedocs.io/en/latest/articles/histograms.html) for every column give you a very quick overview of the distribution of values, including uniques and N/A. -## Writing your own commands +## Summary stats +The summary stats view can be toggled by clicking on the `0` below the `Σ` icon. Summary stats are similar to `df.describe` and extensible. -Builtin commands are found in [all_transforms.py](buckaroo/all_transforms.py) +## Inteligent sampling -### Simple example -Here is a simple example command -```python -class DropCol(Command): - command_default = [s('dropcol'), s('df'), "col"] - command_pattern = [None] +Buckaroo will display entire DataFrames up to 10k rows. Displaying more than that would run into performance problems that would make display too slow. When a DataFrame has more than 10k rows, Buckaroo samples a random set of 10k rows, and also adds in the rwos with the 5 most extreme values for each column. - @staticmethod - def transform(df, col): - df.drop(col, axis=1, inplace=True) - return df +## Sorting - @staticmethod - def transform_to_py(df, col): - return " df.drop('%s', axis=1, inplace=True)" % col -``` -`command_default` is the base configuration of the command when first added, `s('dropcol')` is a special notation for the function name. `s('df')` is a symbol notation for the dataframe argument (see LISP section for details). `"col"` is a placeholder for the selected column. +All of the data visible in the table (rows shown), is sortable by clicking on a column name, further clicks change sort direction then disable sort for that column. Because extreme values are included with sample rows, you can see outlier values too. -since `dropcol` does not take any extra arguments, `command_pattern` is `[None]` -```python - def transform(df, col): - df.drop(col, axis=1, inplace=True) - return df -``` -This `transform` is the function that manipulates the dataframe. For `dropcol` we take two arguments, the dataframe, and the column name. +## Extensibility at the core -```python - def transform_to_py(df, col): - return " df.drop('%s', axis=1, inplace=True)" % col -``` -`transform_to_py` emits equivalent python code for this transform. Code is indented 4 spaces for use in a function. - -### Complex example -```python -class GroupBy(Transform): - command_default = [s("groupby"), s('df'), 'col', {}] - command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]] - @staticmethod - def transform(df, col, col_spec): - grps = df.groupby(col) - df_contents = {} - for k, v in col_spec.items(): - if v == "sum": - df_contents[k] = grps[k].apply(lambda x: x.sum()) - elif v == "mean": - df_contents[k] = grps[k].apply(lambda x: x.mean()) - elif v == "median": - df_contents[k] = grps[k].apply(lambda x: x.median()) - elif v == "count": - df_contents[k] = grps[k].apply(lambda x: x.count()) - return pd.DataFrame(df_contents) -``` -The `GroupBy` command is complex. it takes a 3rd argument of `col_spec`. `col_spec` is an argument of type `colEnum`. A `colEnum` argument tells the UI to display a table with all column names, and a drop down box of enum options. - -In this case each column can have an operation of either `sum`, `mean`, `median`, or `count` applied to it. - -Note also the leading `3` in the `command_pattern`. That is telling the UI that these are the specs for the 3rd element of the command. Eventually commands will be able to have multiple configured arguments. - -### Argument types -Arguments can currently be configured as - -* `integer` - allowing an integer input -* `enum` - allowing a strict set of options, returned as a string to the transform -* `colEnum` - allowing a strict set of options per column, returned as a dictionary keyed on column with values of enum options - - -## Order of Operations for data cleaning -The ideal order of operations is as follows - -* Column level fixes - * drop (remove this column) - * fillna (fill NaN/None with a value) - * safe int (convert a colum to integers where possible, and nan everywhere else) - * OneHotEncoding ( create multiple boolean columns from the possible values of this column ) - * MakeCategorical ( change the values of string to a Categorical Data type) - * Quantize -* DataFrame transformations -these transforms largely keep the shape of the data the same - - * Resample - * ManyColdDecoding (the opposite of OneHotEncoding, take multiple boolean columns and transform into a single categorical - * Index shift (add a column with the value from previous row's column) -* Dataframe transformations 2 -These result in a single new dataframe with a vastly different shape - * Stack/Unstack columns - * GroupBy (with UI for sellect group by function for each column) -* DataFrame transformations 2 -These transforms emit multiple DataFrames - * Relational extract (extract one or more columns into a second dataframe that can be joined back to a foreign key column) - * Split on column (emit separate dataframes for each value of a categorical, no shape editting) -* DataFrame combination - * concat (concatenate multiple dataframes, with UI affordances to assure a similar shape) - * join (join two dataframes on a key, with UI affordances) - -Buckaroo can only work on a single input dataframe shape at a time. Any newly created columns are visible on output, but not available for manipulation in the same Buckaroo Cell. - - -# Components -* a rich table widget that is embeddable into applications and in the jupyter notebook. -* A UI for selecting and trying transforms interactively -* An output table widget showing the transformed dataframe - -# Related projects -Builtin commands are found in [all_transforms.py](buckaroo/all_transforms.py) - -There are a couple of projects like Buckaroo that aim to provide a better table widget and pandas editing experience. - -1. [Mito](https://github.com/mito-ds/monorepo) Open source table/code editing widget for Jupyter. More aimed at easing transition to pandas from excel users. -1. [Bamboolib](https://github.com/tkrabel/bamboolib) An originally open source tool aimed at building a similar experience, more aimed as a low-code tool for beginners. The parent company 8080labs was acquired by Databricks. -1. [Microsoft DataWrangler](https://github.com/microsoft/vscode-data-wrangler) Open source, provides a very similar experience inside of VSCode's notebook experience. Only works inside of VSCode. -1. [QGrid](https://github.com/quantopian/qgrid) Open source, unmaintained. A slick table widget built by Quantopian, no code gen or data manipulation features -1. [IpyDatagrid](https://github.com/bloomberg/ipydatagrid) Open source. Bloomberg's Jupyter table widget. I used the ipydatagrid repo structure as the basis for buckaroo (js build setup only) -1. [IPyAgGrid](https://github.com/widgetti/ipyaggrid) Open source. Wraps [AG Grid](https://www.ag-grid.com/) in a jupyter widget. Buckaroo also uses AG Grid. - -# What works now, what's coming - -## Exists now - * React frontend app - * Displays a datatframe - * Simple UI for column level functions - * Shows generated python code - * Shows transformed data frame - * Buckaroo server - * Serves up dataframes for use by frontend - * responds to buckaroo commands - * shows generated python code - * Developer User experience - * define Buckaroo commands in python only - * Buckaroo Intepreter - * Based on Peter Norvig's lispy.py, a simple syntax that is easy for the frontend to generate (no parens, just JSON arrays) - * Buckaroo core (actual transforms supported) - * dropcol - * fillna - * one hot - * safe int - * GroupBy - -## Next major features - * Jupyter Notebook widget - * embed the same UI from the frontend into a jupyter notebook shell - * No need to fire up a separate server, commands sent via ipywidgets.comms - * Add a "send generated python to next cell" function - * React frontend app - * Styling - * Server only, some UI for DataFrame selection - * Pre filtering concept (only operate on first 1000 rows, some sample of all rows) - * DataFrame joining UI - * Summary statistics tab for incoming dataframe - * Multi index columns - * DateTimeIndex support - * Buckaroo core - * MakeCategorical - * Quantize - * Resample - * ManyColdDecoding - * IndexShift - * Computed - * Stack/Unstack - * RelationalExtract - * Split - * concat - * join - +Buckaroo summary stats are built on the [Pluggable Analysis Framework](https://buckaroo-data.readthedocs.io/en/latest/articles/pluggable.html) that allows individual summary stats to be overridden, and new summary stats to be built in terms of existing summary stats. Care is taken to prevent errors in summary stats from preventing display of a dataframe. + +## Lowcode UI (beta) + +Buckaroo has a simple low code UI with python code gen. This view can be toggled by clicking on the `0` below the ` λ ` icon. +## Auto cleaning (beta) +Buckaroo can [automatically clean](https://buckaroo-data.readthedocs.io/en/latest/articles/auto_clean.html) dataframes to remove common data errors (a single string in a column of ints, recognizing date times...). This feature is in beta. You can access it by invoking buckaroo as `BuckarooWidget(df, auto_clean=True)` ## Development installation @@ -263,6 +118,3 @@ Have you had a good experience with this project? Why not share some love and co We welcome issue reports [here](../../issues); be sure to choose the proper issue template for your issue, so that we can be sure you're providing the necessary information. -Before sending a [Pull Request](../../pulls), please make sure you read our - - From 8f69bb904a97bcd922ace97426079736083bf3f1 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 16 Nov 2023 13:15:40 -0500 Subject: [PATCH 182/250] Roadmap to 0.7 * Roadmap to 0.7 added to docs. * TBump now works on docs --- docs/source/articles/roadmap.rst | 132 +++++++++++++++++++++++++++++++ tbump.toml | 3 + 2 files changed, 135 insertions(+) create mode 100644 docs/source/articles/roadmap.rst diff --git a/docs/source/articles/roadmap.rst b/docs/source/articles/roadmap.rst new file mode 100644 index 000000000..bae2ccf00 --- /dev/null +++ b/docs/source/articles/roadmap.rst @@ -0,0 +1,132 @@ +.. _using: + +======= +Roadmap +======= + +Buckaroo is maturing and I decided to write a roadmap + + +Priorities +========== + +Buckaroo is still for the most part, pre-users. It is maturing though, and feedback gathered can map some reasonable principles + +* Function as a reliable replacement for the default display of dataframes + + * Exceptions in the basic display of a dataframe are a P1 error. + * Dataframes that don't display are a P1 error. + * Taking more than a second to display a dataframe with less than 1M values is a P2 error + +* Buckaroo should do the least surprising thing. + + * autocleaning should be turned off by default. + +* Bug/feature request priorities + + * This is the roadmap and I'll stick with it. + * If a user has a feature/bug request, and that is preventing them from using Buckaroo, that gets priority. + + +Release Plans +============= + + +0.4 Series +---------- + + +#. Documentation + + * Readme refresh + * How to create a formatter + * Pluggable analysis framework refresh + * Customizing autocleaning + * Customizing enable/instantiation + * Order of operations Dataflow doc +#. Promotion +#. Devops improvements (CI, testing, end to end testing, packaging) + + * CI passing - Done + * CI testing - Done + * End to End testing - Done + * CI version Bump - needed + * Ruff python linter - needed +#. Jupyter notebook compatability + + * Google colab - Done + * VSCode - Done + * Warning message on notebook < 7 - Done + * Notebook 6.0 compatability ??? +#. Code cleanup + + * Typescript passes linter - Done + * snake_case camelCase normalization + * better naming + * sub module organization +#. Python Repr bugs + + * List + * Tuple + * Nested list and tuple across python types (int, float, boolean) + * Dictionary? +#. Formatters + + * DateTime formatter + * Float formatter with specificity +#. Frontend + + * Autoclean toggle + + +0.5 series +---------- +I'm a bit fuzzy on this one, it's either going to be a backend port to polars or filtering. I'll write it as filtering for now + +#. Filtering + + * any field text search + * Should work with codegen + * Per column exact filtering +#. Additional sampling techniques + + * Chunks (50 contiguous rows) + * Outliers - extent percentile for each colum all in a single view + * Straight random sample +#. UI cycling + + * Everything that is now binary (summary stats on or off), is actually a single choice of multiple possible choices. Allow multiple clicks to cycle through different options. + * Enable cycling for summary_stats and sample method +#. Low code UI + + * Add Commands for filtering + +0.6 series +---------- +Polars backend + +All of the same tests should pass. + +#. Lowcode UI Commands in polars + + * Gives auto cleaning and filtering at much higher performance. Nice way to dip my feet into polars. + * Testing that verifies ``eval(_to_py) == transform(df)`` and ``pl.transform(df) == pd.transform(df)`` + * pandas and polars equivalence is key to code gen continuing to be useful +#. Serialization in polars + + * 2x speed bump + * straight forward +#. Pluggable analysis framework - for polars + + * Same pluggable analysis framework, now lazy + * Summary stats run on whole dataframe - up to 1Gig + +0.7 series +---------- + +#. serialization speedup + + * integrate parquest_wasm in the frontend + * parquet serialization on the backend + * maintain json serialization + diff --git a/tbump.toml b/tbump.toml index 674b4f423..b498b8ce1 100644 --- a/tbump.toml +++ b/tbump.toml @@ -28,6 +28,9 @@ src = "pyproject.toml" src = "package.json" [[file]] src = "buckaroo/_version.py" +[[file]] +src = "docs/soruce/conf.py" + # You can specify a list of commands to From 410744fa5d67f77c97edd1eb04d43e5b5ad2bdef Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 16 Nov 2023 13:17:55 -0500 Subject: [PATCH 183/250] really simple perf regression test (#128) * really simple perf regression test * fixes #127 Basic Performance regression test --- tests/perf_regression.py | 47 +++++++++++++++++++++++++++++++++++ tests/perf_regression_test.py | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 tests/perf_regression.py create mode 100644 tests/perf_regression_test.py diff --git a/tests/perf_regression.py b/tests/perf_regression.py new file mode 100644 index 000000000..884f1a516 --- /dev/null +++ b/tests/perf_regression.py @@ -0,0 +1,47 @@ +import pandas as pd +import numpy as np +import buckaroo +import time + +def float_df(N,K): + return pd.DataFrame( + {chr(i+97): np.random.random_sample(N) for i in range(K)}) + +# %timeit float_df(100_000,20) 9ms on my laptop + +def bw_do_stuff(df, **kwargs): + bw = buckaroo.BuckarooWidget(df, **kwargs) +#%timeit bw_do_stuff(float_df(100_000, 20)) 500 ms on my laptop + + +# the slow part is serialization to json, not summary stats +# %timeit bw_do_stuff2(float_df(10_000, 5)) 140 ms on my laptop +# %timeit bw_do_stuff2(float_df(100_000, 5)) 150ms on my laptop + + +def test_basic_instantiation(): + t_start = time.time() + float_df(100_000, 20) + t_end = time.time() + + np_time = t_end - t_start + assert np_time < 10 + + bw_start = time.time() + bw_do_stuff(float_df(10_000,5)) + bw_end = time.time() + bw_time_1 = bw_end - bw_start + + assert bw_time_1 < np_time * 50 + + + bw_start2 = time.time() + bw_do_stuff(float_df(100_000,5)) + bw_end2 = time.time() + bw_time_2 = bw_end2 - bw_start2 + + assert bw_time_2 < np_time * 50 + + + + diff --git a/tests/perf_regression_test.py b/tests/perf_regression_test.py new file mode 100644 index 000000000..884f1a516 --- /dev/null +++ b/tests/perf_regression_test.py @@ -0,0 +1,47 @@ +import pandas as pd +import numpy as np +import buckaroo +import time + +def float_df(N,K): + return pd.DataFrame( + {chr(i+97): np.random.random_sample(N) for i in range(K)}) + +# %timeit float_df(100_000,20) 9ms on my laptop + +def bw_do_stuff(df, **kwargs): + bw = buckaroo.BuckarooWidget(df, **kwargs) +#%timeit bw_do_stuff(float_df(100_000, 20)) 500 ms on my laptop + + +# the slow part is serialization to json, not summary stats +# %timeit bw_do_stuff2(float_df(10_000, 5)) 140 ms on my laptop +# %timeit bw_do_stuff2(float_df(100_000, 5)) 150ms on my laptop + + +def test_basic_instantiation(): + t_start = time.time() + float_df(100_000, 20) + t_end = time.time() + + np_time = t_end - t_start + assert np_time < 10 + + bw_start = time.time() + bw_do_stuff(float_df(10_000,5)) + bw_end = time.time() + bw_time_1 = bw_end - bw_start + + assert bw_time_1 < np_time * 50 + + + bw_start2 = time.time() + bw_do_stuff(float_df(100_000,5)) + bw_end2 = time.time() + bw_time_2 = bw_end2 - bw_start2 + + assert bw_time_2 < np_time * 50 + + + + From 2a6f7da5f8465bf5691ee3e9d2cf2b77161f33e1 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 16 Nov 2023 13:21:04 -0500 Subject: [PATCH 184/250] Fix/docs version bump (#150) --- docs/source/conf.py | 2 +- tbump.toml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index d1d6f388d..1722156bc 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.3.23' +release = '0.4.5' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/tbump.toml b/tbump.toml index b498b8ce1..2af143faf 100644 --- a/tbump.toml +++ b/tbump.toml @@ -29,8 +29,7 @@ src = "package.json" [[file]] src = "buckaroo/_version.py" [[file]] -src = "docs/soruce/conf.py" - +src = "docs/source/conf.py" # You can specify a list of commands to From c626c1b5fe965c3a452ad93ddc69b40d3283f30d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 16 Nov 2023 13:40:37 -0500 Subject: [PATCH 185/250] Feat/more formatters (#146) * adding objFormmater with recursive dictDisplayer for lists and dictionaries Fixes #133 Dict List not displayed * Fixes #95 lists sets and tuples don't display properly * tested and fixed a bug in the DefaultSummaryStats that was causing an error further along * more robust default display, with debug added fixes #145 Add debug mode * Fixes #55 Better Datetime formatting * Fixes #147 None displays in datetime columns * Fixes #144 Buckaroo silently fails when displaying MultiIndex dataframes * Fixes #102 Empty Dataframes don't display * Fixes #151 When buckaroo throws an exception on rendering, no DataFrame is displayed, there should be a fallback --- buckaroo/analysis.py | 20 +++++--- buckaroo/analysis_management.py | 23 +++++---- buckaroo/buckaroo_widget.py | 14 ++++-- buckaroo/widget_utils.py | 51 +++++++++++++------- js/components/gridUtils.ts | 84 ++++++++++++++++++++++++++++++++- js/components/staticData.ts | 68 ++++++++++++++++++++++++-- tests/unit/analysis_test.py | 35 ++++++++++++-- 7 files changed, 249 insertions(+), 46 deletions(-) diff --git a/buckaroo/analysis.py b/buckaroo/analysis.py index 10a244102..73d1e1677 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/analysis.py @@ -75,7 +75,10 @@ def summary(sampled_ser, summary_ser, ser): distinct_count= len(val_counts) nan_count = l - len(ser.dropna()) unique_count = len(val_counts[val_counts==1]) - empty_count = val_counts.get('', 0) + try: + empty_count = val_counts.get('', 0) + except: + empty_count = 0 is_numeric = pd.api.types.is_numeric_dtype(ser) is_object = pd.api.types.is_object_dtype @@ -163,8 +166,11 @@ def categorical_dict(ser, val_counts, top_n_positions=7): #if len(val_counts) > 5 and top_percentage < .05: rest_vals = val_counts.iloc[top:] - histogram = top_vals.to_dict() - + try: + histogram = top_vals.to_dict() + except TypeError: + top_vals.index = top_vals.index.map(str) + histogram = top_vals.to_dict() full_long_tail = rest_vals.sum() unique_count = sum(val_counts == 1) @@ -207,14 +213,14 @@ def histogram(ser, nan_per): class ColDisplayHints(ColAnalysis): requires_summary = ['min', 'max', 'nan_per'] provides_summary = [ - 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram', 'type'] + 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram', 'type', 'formatter'] @staticmethod def summary(sampled_ser, summary_ser, ser): - is_numeric = pd.api.types.is_numeric_dtype(sampled_ser) is_bool = pd.api.types.is_bool_dtype(sampled_ser) _type = "obj" + extras = {} if is_bool: _type = "boolean" elif is_numeric: @@ -222,6 +228,8 @@ def summary(sampled_ser, summary_ser, ser): _type = "float" else: _type = "integer" + elif pd.api.types.is_datetime64_any_dtype(ser): + extras = {'type':'datetime', 'formatter': 'default'} elif pd.api.types.is_string_dtype(sampled_ser): _type = "string" base_dict = dict( @@ -229,7 +237,7 @@ def summary(sampled_ser, summary_ser, ser): is_numeric=is_numeric, is_integer=pd.api.types.is_integer_dtype(sampled_ser), histogram=histogram(sampled_ser, summary_ser['nan_per'])) - + base_dict.update(extras) if is_numeric and not is_bool: base_dict.update({ 'min_digits':int_digits(summary_ser.loc['min']), diff --git a/buckaroo/analysis_management.py b/buckaroo/analysis_management.py index b9506efaf..2295f5496 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/analysis_management.py @@ -29,6 +29,7 @@ 'is_integer': None, 'min_digits':None, 'max_digits':None, + 'formatter':None, 'histogram': []} @@ -90,7 +91,7 @@ def output_full_reproduce(errs, summary_df, df_name): -def produce_summary_df(df, ordered_objs, df_name='test_df'): +def produce_summary_df(df, ordered_objs, df_name='test_df', debug=False): """ takes a dataframe and a list of analyses that have been ordered by a graph sort, then it produces a summary dataframe @@ -111,7 +112,8 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): for a_kls in ordered_objs: try: if a_kls.quiet or a_kls.quiet_warnings: - warnings.filterwarnings('ignore') + if debug == False: + warnings.filterwarnings('ignore') summary_res = a_kls.summary(ser, summary_ser, ser) warnings.filterwarnings('default') else: @@ -121,6 +123,8 @@ def produce_summary_df(df, ordered_objs, df_name='test_df'): except Exception as e: if not a_kls.quiet: errs[ser_name] = e, a_kls + if debug: + traceback.print_exc() continue summary_col_dict[ser_name] = summary_ser @@ -184,8 +188,8 @@ def unit_test(self): pass - def process_df(self, input_df): - output_df, table_hint_dict, errs = produce_summary_df(input_df, self.ordered_a_objs) + def process_df(self, input_df, debug=False): + output_df, table_hint_dict, errs = produce_summary_df(input_df, self.ordered_a_objs, debug=debug) return output_df, table_hint_dict, errs def add_analysis(self, new_aobj): @@ -208,13 +212,14 @@ class DfStats(object): DfStats exists to handle inteligent downampling and applying the ColAnalysis functions ''' - def __init__(self, df_stats_df, col_analysis_objs, operating_df_name=None): + def __init__(self, df_stats_df, col_analysis_objs, operating_df_name=None, debug=False): self.df = self.get_operating_df(df_stats_df, force_full_eval=False) self.col_order = self.df.columns self.ap = AnalsysisPipeline(col_analysis_objs) self.operating_df_name = operating_df_name + self.debug = debug - self.sdf, self.table_hints, errs = self.ap.process_df(self.df) + self.sdf, self.table_hints, errs = self.ap.process_df(self.df, self.debug) if errs: output_full_reproduce(errs, self.sdf, operating_df_name) @@ -236,7 +241,8 @@ def presentation_sdf(self): def add_analysis(self, a_obj): passed_unit_tests, ut_errs = self.ap.add_analysis(a_obj) - self.sdf, self.table_hints, errs = self.ap.process_df(self.df) + #if you're adding analysis interactively, of course you want debug info... I think + self.sdf, self.table_hints, errs = self.ap.process_df(self.df, debug=True) if passed_unit_tests == False: print("Unit tests failed") if errs: @@ -245,8 +251,9 @@ def add_analysis(self, a_obj): if ut_errs or errs: output_reproduce_preamble() if ut_errs: + # setting debug=False here because we're already printing reproduce instructions, let the users produce their own stacktrace.. I think ut_summary_df, _unused_table_hint_dict, ut_errs2 = produce_summary_df( - PERVERSE_DF, self.ap.ordered_a_objs) + PERVERSE_DF, self.ap.ordered_a_objs, debug=False) output_full_reproduce(ut_errs, ut_summary_df, "PERVERSE_DF") if errs: output_full_reproduce(errs, self.sdf, self.operating_df_name) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 853d2306b..79fc5c017 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -95,15 +95,18 @@ def __init__(self, df, showCommands=False, auto_clean=True, postProcessingF=None, + debug=False ): super().__init__() - warnings.filterwarnings('ignore') + if not debug: + warnings.filterwarnings('ignore') #moving setup_from_command_kls_list early in the init because #it's relatively benign and not tied to other linked updates self.postProcessingF = postProcessingF self.processed_result = None self.transformed_df = None + self.debug = debug self.df_name = get_df_name(df) self.setup_from_command_kls_list() @@ -111,7 +114,6 @@ def __init__(self, df, #we need dfConfig setup first before we get the proper working_df for auto_cleaning self.raw_df = df self.run_autoclean(auto_clean) - warnings.filterwarnings('default') @@ -172,7 +174,7 @@ def handle_operations(self, change): self.run_post_processing() except Exception as e: results['transformed_df'] = EMPTY_DF_OBJ - print(e) + traceback.print_exc() results['transform_error'] = str(e) self.operation_results = results @@ -204,11 +206,13 @@ def get_working_df(self): def set_typed_df(self, new_df): self.typed_df = new_df # stats need to be rerun each time - self.stats = DfStats(self.typed_df, [TypingStats, DefaultSummaryStats, ColDisplayHints], self.df_name) + self.stats = DfStats( + self.typed_df, + [TypingStats, DefaultSummaryStats, ColDisplayHints], + self.df_name, debug=self.debug) self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) self.update_based_on_df_config(3) - def generate_code(self, operations): if len(operations) == 0: return 'no operations' diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 58f41c330..66f816a45 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -1,3 +1,4 @@ +import traceback from .buckaroo_widget import BuckarooWidget import pandas as pd @@ -6,7 +7,9 @@ def enable(sampled=True, reorderdColumns=False, showCommands=False, auto_clean=False, - postProcessingF=None): + postProcessingF=None, + debug=False + ): """ Automatically use buckaroo to display all DataFrames instances in the notebook. @@ -24,27 +27,41 @@ def enable(sampled=True, print("must be running inside ipython to enable default display via enable()") return - def _display_as_buckaroo(df): from IPython.display import display - return display(BuckarooWidget(df, - sampled=sampled, - summaryStats=summaryStats, - reorderdColumns=reorderdColumns, - showCommands=showCommands, - auto_clean=auto_clean, - postProcessingF=postProcessingF)) + try: + bw = BuckarooWidget(df, + sampled=sampled, + summaryStats=summaryStats, + reorderdColumns=reorderdColumns, + showCommands=showCommands, + auto_clean=auto_clean, + postProcessingF=postProcessingF) + return display(bw) + except: + if debug: + traceback.print_exc() + return + # returning NotImplementedError causes IPython to find the + # next registered formatter for the type + raise NotImplementedError def _display_polars_as_buckaroo(polars_df): from IPython.display import display - pandas_df = polars_df.to_pandas() - return display(BuckarooWidget(pandas_df, - sampled=sampled, - summaryStats=summaryStats, - reorderdColumns=reorderdColumns, - showCommands=showCommands, - auto_clean=auto_clean, - postProcessingF=postProcessingF)) + try: + pandas_df = polars_df.to_pandas() + return display(BuckarooWidget(pandas_df, + sampled=sampled, + summaryStats=summaryStats, + reorderdColumns=reorderdColumns, + showCommands=showCommands, + auto_clean=auto_clean, + postProcessingF=postProcessingF)) + except: + if debug: + traceback.print_exc() + return + raise NotImplementedError ip_formatter = ip.display_formatter.ipython_display_formatter diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts index e341bb752..7281888eb 100644 --- a/js/components/gridUtils.ts +++ b/js/components/gridUtils.ts @@ -9,6 +9,7 @@ import { ColumnHint, ColumnIntegertHint, ColumnFloatHint, + ColumnDatetimeHint, } from './staticData'; import _ from 'lodash'; export const updateAtMatch = ( @@ -43,8 +44,80 @@ export const stringFormatter = (params: ValueFormatterParams): string => { return val; }; -export const booleanFormatter = (params: ValueFormatterParams): string => { +const dictDisplayer = (val: Record): string => { + const objBody = _.map( + val, + (value, key) => `'${key}': ${objDisplayer(value)}` + ).join(','); + return `{ ${objBody} }`; +}; + +export const isValidDate = (possibleDate: any): boolean => { + if (_.isDate(possibleDate) && isFinite(possibleDate.getTime())) { + return true; + } + return false; +}; + +const DEFAULT_DATE_FORMAT: Intl.DateTimeFormatOptions = { + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false, +}; + +export const dateDisplayerDefault = (d: Date): string => { + const fullStr = d.toLocaleDateString('en-CA', DEFAULT_DATE_FORMAT); + const [dateStr, timeStr] = fullStr.split(','); + //const retVal = `${dateStr} ${timeStr.padStart(12)}`; + const retVal = `${dateStr} ${timeStr}`; + return retVal; +}; + +export const getDatetimeFormatter = (colHint: ColumnDatetimeHint) => { + return (params: ValueFormatterParams): string => { + // console.log("params", params) + const val = params.value; + if (val === null || val === undefined) { + return ''; + } + const d = new Date(val); + if (!isValidDate(d)) { + return ''; + } + if (colHint.formatter === 'default') { + return dateDisplayerDefault(d); + } else if (colHint.formatter === 'toLocaleString') { + return d.toLocaleDateString(colHint.locale, colHint.args); + } + throw new Error('unreachable code in getDatetimeFormatter'); + }; +}; + +const objDisplayer = (val: any | any[]): string => { + if (val === undefined || val === null) { + return 'None'; + } else if (_.isArray(val)) { + return `[ ${val.map(objDisplayer).join(', ')}]`; + } else if (_.isBoolean(val)) { + return boolDisplayer(val); + } else if (_.isObject(val)) { + return dictDisplayer(val); + } else { + return val.toString(); + } + return val; +}; + +const objFormatter = (params: ValueFormatterParams): string => { const val = params.value; + return objDisplayer(val); +}; + +export const boolDisplayer = (val: boolean) => { if (val === true) { return 'True'; } else if (val === false) { @@ -53,6 +126,11 @@ export const booleanFormatter = (params: ValueFormatterParams): string => { return ''; }; +export const booleanFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + return boolDisplayer(val); +}; + const getIntegerFormatter = (hint: ColumnIntegertHint) => { const commas = Math.floor(hint.max_digits / 3); const totalWidth = commas + hint.max_digits; @@ -89,12 +167,14 @@ function getFormatter(hint: ColumnHint): ValueFormatterFunc { return getIntegerFormatter(hint); } else if (hint.type === 'string') { return stringFormatter; + } else if (hint.type === 'datetime') { + return getDatetimeFormatter(hint); } else if (hint.type === 'float') { return getFloatFormatter(hint); } else if (hint.type === 'boolean') { return booleanFormatter; } else if (hint.type === 'obj') { - return stringFormatter; + return objFormatter; } return stringFormatter; } diff --git a/js/components/staticData.ts b/js/components/staticData.ts index 8daf5b1d4..5afd04d87 100644 --- a/js/components/staticData.ts +++ b/js/components/staticData.ts @@ -23,7 +23,10 @@ export interface DFColumn { name: string; type: string; } -export type DFDataRow = Record; +export type DFDataRow = Record< + string, + string | number | boolean | any[] | Record | null +>; export type DFData = DFDataRow[]; @@ -32,6 +35,23 @@ export interface ColumnObjHint { histogram?: any[]; } +export interface ColumnDatetimeDefaultHint { + type: 'datetime'; + formatter: 'default'; + histogram?: any[]; +} + +export interface ColumnDatetimeFormatHint { + type: 'datetime'; + formatter: 'toLocaleString'; + locale: 'en-US' | 'en-GB' | 'en-CA' | 'fr-FR' | 'es-ES' | 'de-DE' | 'ja-JP'; + args: Intl.DateTimeFormatOptions; + histogram?: any[]; +} +export type ColumnDatetimeHint = + | ColumnDatetimeDefaultHint + | ColumnDatetimeFormatHint; + export interface ColumnStringHint { type: 'string'; histogram?: any[]; @@ -57,6 +77,7 @@ export interface ColumnFloatHint { export type ColumnHint = | ColumnObjHint | ColumnIntegertHint + | ColumnDatetimeHint | ColumnFloatHint | ColumnStringHint | ColumnBooleanHint; @@ -399,17 +420,48 @@ export const stringIndexDf: DFWhole = { schema: { fields: [ { name: 'index', type: 'integer' }, + { name: 'datetime_col', type: 'datetime' }, + { name: 'datetime_col2', type: 'datetime' }, { name: 'a', type: 'integer' }, { name: 'b', type: 'boolean' }, + { name: 'list_col', type: 'obj' }, { name: 'strings', type: 'boolean' }, + { name: 'dict_col', type: 'obj' }, ], primaryKey: ['index'], pandas_version: '1.4.0', }, data: [ - { index: 0, a: 1, b: true, strings: 'a' }, - { index: 1, a: 2, b: false, strings: '' }, - { index: 2, a: 3, b: false, strings: ' ' }, + { + index: 0, + a: 1, + b: true, + strings: 'a', + list_col: ['a', 'b'], + dict_col: { a: 10, b: 20 }, + datetime_col: '2001-01-01T00:00:00.000', + datetime_col2: '2001-01-01T00:00:00.000', + }, + { + index: 1, + a: 2, + b: false, + strings: '', + list_col: [1, 2], + dict_col: { b: 20, c: 30 }, + datetime_col: '2001-05-03T00:01:00.000', + datetime_col2: '2001-05-03T00:01:00.000', + }, + { + index: 2, + a: 3, + b: false, + strings: ' ', + list_col: [true, false], + dict_col: { a: 'foo' }, + datetime_col: '2001-05-03T15:44:55.000', + datetime_col2: '2001-05-03T15:44:55.000', + }, ], table_hints: { a: { @@ -434,5 +486,13 @@ export const stringIndexDf: DFWhole = { ], }, strings: { type: 'string', histogram: [] }, + datetime_col: { type: 'datetime', formatter: 'default', histogram: [] }, + datetime_col2: { + type: 'datetime', + formatter: 'toLocaleString', + args: { year: 'numeric', month: 'numeric', day: 'numeric' }, + locale: 'en-CA', + histogram: [], + }, }, }; diff --git a/tests/unit/analysis_test.py b/tests/unit/analysis_test.py index c92959c9a..027cd00b2 100644 --- a/tests/unit/analysis_test.py +++ b/tests/unit/analysis_test.py @@ -1,6 +1,7 @@ +from datetime import datetime as dtdt import numpy as np import pandas as pd -from buckaroo.analysis import TypingStats, DefaultSummaryStats +from buckaroo.analysis import TypingStats, DefaultSummaryStats, ColDisplayHints text_ser = pd.Series(["foo", "bar", "baz"]) @@ -8,23 +9,49 @@ "2014-01-01 00:00:06", "2014-01-01 00:00:38", "2014-01-01 00:03:59"]) +datetime_ser = pd.Series([dtdt(2000, 1, 1), dtdt(2001, 1, 1), pd.NaT]) all_nan_ser = pd.Series([np.nan, np.nan]) int_ser = pd.Series([10, 30, -10, 33]) fp_ser = pd.Series([33.2, 83.2, -1.0, 0]) nan_text_ser = pd.Series([np.nan, np.nan, 'y', 'y']) nan_mixed_type_ser = pd.Series([np.nan, np.nan, 'y', 'y', 8.0]) +unhashable_ser = pd.Series([['a'], ['b']]) + all_sers = [ text_ser, datelike_ser, all_nan_ser, - int_ser, fp_ser, nan_text_ser, nan_mixed_type_ser] + int_ser, fp_ser, nan_text_ser, nan_mixed_type_ser, unhashable_ser] def test_text_ser(): DefaultSummaryStats.summary(nan_text_ser, nan_text_ser, nan_text_ser) DefaultSummaryStats.summary(nan_mixed_type_ser, nan_mixed_type_ser, nan_mixed_type_ser) +def test_unhashable(): + result = DefaultSummaryStats.summary(unhashable_ser, pd.Series({}), unhashable_ser) + #print(result) + + assert {'length': 2, 'nan_count': 0, 'distinct_count': 2, 'distinct_per': 1.0, 'empty_count': 0, 'empty_per': 0.0, 'unique_per': 1.0, 'nan_per': 0.0, 'mode': ['a'], 'min': np.nan, 'max': np.nan} == result + +def test_unhashable3(): + ser = pd.Series([{'a':1, 'b':2}, {'b':10, 'c': 5}]) + DefaultSummaryStats.summary(ser, pd.Series({ }), ser) # 'nan_per' + def test_default_summary_stats(): for ser in all_sers: - DefaultSummaryStats.summary(ser, ser, ser) - + print(DefaultSummaryStats.summary(ser, ser, ser)) + +def test_datetime_hints(): + result = ColDisplayHints.summary( + datetime_ser, {'nan_per':0}, datetime_ser) + assert {'type': 'datetime', + 'formatter': 'default', + 'is_integer': False, + 'is_numeric': False, + 'histogram': [{'cat_pop': 33.0, + 'name': pd.Timestamp('2000-01-01 00:00:00')}, + {'cat_pop': 33.0, + 'name': pd.Timestamp('2001-01-01 00:00:00')}, + {'name': 'longtail', 'unique': 67.0}], + } == result From 1b4a899970fa63818938c9baa07801539f164212 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 16 Nov 2023 13:58:24 -0500 Subject: [PATCH 186/250] Release 0.4.6 --- buckaroo/_version.py | 2 +- docs/source/conf.py | 2 +- package.json | 2 +- pyproject.toml | 4 ++-- tbump.toml | 2 +- tests/unit/analysis_management_test.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 5be842b4c..53d33bb07 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.4.5" +__version__ = "0.4.6" diff --git a/docs/source/conf.py b/docs/source/conf.py index 1722156bc..7d195adbe 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.4.5' +release = '0.4.6' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/package.json b/package.json index 38eadaaf1..01cbba265 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.4.5", + "version": "0.4.6", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 8c2b49542..aec4d5693 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.5" +version = "0.4.6" [project.license] file = "LICENSE.txt" @@ -138,7 +138,7 @@ field = [ ] [tool.tbump.version] -current = "0.4.5" +current = "0.4.6" regex = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)((?Pa|b|rc|.dev)(?P\\d+))?" [tool.tbump.git] diff --git a/tbump.toml b/tbump.toml index 2af143faf..fffb4a89e 100644 --- a/tbump.toml +++ b/tbump.toml @@ -2,7 +2,7 @@ # github_url = "https://github.com///" [version] -current = "0.4.5" +current = "0.4.6" # Example of a semver regexp. # Make sure this matches current_version before diff --git a/tests/unit/analysis_management_test.py b/tests/unit/analysis_management_test.py index dd30dfbbc..b1e4b9d0f 100644 --- a/tests/unit/analysis_management_test.py +++ b/tests/unit/analysis_management_test.py @@ -40,7 +40,7 @@ def test_produce_summary_df_hints(self): assert 'histogram' in hint_obj.keys() else: expected_set = set( - ['is_numeric', 'is_integer', 'min_digits', 'max_digits', 'type', 'histogram']) + ['is_numeric', 'is_integer', 'min_digits', 'max_digits', 'type', 'formatter', 'histogram']) assert expected_set == set(hint_obj.keys()) def test_pipeline_base(self): From a3c259e9a594f6b1be4679470388a7ef4e56796c Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 16 Nov 2023 14:02:58 -0500 Subject: [PATCH 187/250] added example notebook with the suite of itables testcases to check for visual display of a variety of dataframes fixes #100 (#153) check for visual display of a variety of dataframes fixes #100 --- example-notebooks/Itables-testcases.ipynb | 347 ++++++++++++++++++++++ 1 file changed, 347 insertions(+) create mode 100644 example-notebooks/Itables-testcases.ipynb diff --git a/example-notebooks/Itables-testcases.ipynb b/example-notebooks/Itables-testcases.ipynb new file mode 100644 index 000000000..8e4b01884 --- /dev/null +++ b/example-notebooks/Itables-testcases.ipynb @@ -0,0 +1,347 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "b45fa7dc-e098-40ee-adf4-c3a4c6a5545c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import buckaroo\n", + "from itables.sample_dfs import get_dict_of_test_dfs\n", + "dict_of_test_dfs = get_dict_of_test_dfs()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ddb9152-702f-4bcb-86c6-0de2a138bb89", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"empty\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "053d0453-5615-4f7b-a519-bb67912b28da", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"no_rows\"] # results in ColDisplayHints Error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7969cc05-1ebe-4b72-beb5-7ea35174bfaa", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"no_rows_one_column\"] # results in ColDisplayHints Error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b6cae85-33b9-425b-af7d-299c448a6ea1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"no_columns\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d777553-3aeb-4467-99ef-b1a96cbaee8d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"no_columns_one_row\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e9f4664-9139-4fbd-974d-f16efe53b608", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"bool\"] #Col Display hints error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1ac46685-7288-467b-afad-a4d7699a998a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"nullable_boolean\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0748b5cf-1166-4208-94e6-b64b7859e356", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"int\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a4fafb72-1011-4048-a4b4-4c16b7924e02", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"nullable_int\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f8b40fbd-1b9a-4c3f-8d72-3fc0b7855dc6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"float\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdaa4682-e2d6-4d89-9b46-eb7313855903", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"str\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdc821e1-e3f9-4846-ad06-74a887a6ee84", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"time\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4bf7e0f-3c80-4fbe-b59f-aa49febc3a38", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"object\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "857e6532-c352-49f1-a2f2-fd0125144207", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"ordered_categories\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5479ba8-9f55-48e6-9a6c-fe9ee246c91a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"ordered_categories_in_multiindex\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23be7ceb-de1a-44e8-91e0-2cc894399854", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"multiindex\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92856cdc-a024-4232-b849-15bab83c16e1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"countries\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d7d9912-2a13-4153-af4c-1239a929bc7e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"capital\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70329ae8-99a5-4b9c-9128-9c3fc2b6362b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"complex_index\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "998748f6-a664-4cf6-9388-ab9ab742e069", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"int_float_str\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "622a3fc5-ca35-4c5c-b48f-b2749ecaac87", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"wide\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "929ab710-d645-4376-99ac-dfcc43a247c6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"long_column_names\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "204d1b91-b58b-45d8-8b73-ff212b962abb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"duplicated_columns\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5b35a2b-34c4-455c-9653-eb10b0249344", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"named_column_index\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37b655c1-4937-4ba1-898f-3e225d71a178", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dict_of_test_dfs[\"big_integers\"]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From b9662a6f2e3125ad5dc7e86f2bd19803417b64a6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 17 Nov 2023 17:57:21 -0500 Subject: [PATCH 188/250] Feat/python submodules (#154) * moved lisp related modules into submodule jlisp * moved plugabble_analysis_framework into a submodule * moved old flask files into their own subdirectory * moved old flask files into their own subdirectory * moved auto_clean into its own submodule * moved default customizations of buckaroo into their own submodule * trying to rename in typescript * normalized df naming * removed unneeded properties from dcef widget * fixed codegen to represent the new locations * updated full tour * fixes #105 Clean up Python code * Bump to 0.4.7 --- buckaroo/_version.py | 2 +- buckaroo/{ => auto_clean}/auto_clean.py | 0 .../{ => auto_clean}/cleaning_commands.py | 4 +- buckaroo/buckaroo_widget.py | 25 +- .../{ => customizations}/all_transforms.py | 6 +- buckaroo/{ => customizations}/analysis.py | 2 +- buckaroo/{ => customizations}/down_sample.py | 0 .../{ => customizations}/order_columns.py | 0 buckaroo/df_methods.py | 442 ------------------ buckaroo/{ => flask_legacy}/dcf_transform.py | 0 buckaroo/{ => flask_legacy}/index.html | 0 buckaroo/{ => flask_legacy}/views.py | 2 +- buckaroo/jlisp/__init__.py | 0 buckaroo/{ => jlisp}/configure_utils.py | 0 buckaroo/{ => jlisp}/lisp_utils.py | 0 buckaroo/{ => jlisp}/lispy.py | 0 .../analysis_management.py | 7 +- .../pluggable_analysis_framework.py | 0 docs/source/conf.py | 2 +- example-notebooks/Full-tour.ipynb | 189 +++++--- js/comp1.tsx | 5 - js/components/DCFCell.tsx | 21 +- js/dcefwidget.ts | 21 - package.json | 2 +- pyproject.toml | 4 +- tbump.toml | 2 +- tests/unit/analysis_management_test.py | 6 +- tests/unit/analysis_test.py | 2 +- tests/unit/auto_clean_test.py | 2 +- tests/unit/basic_widget_test.py | 2 +- tests/unit/fixtures.py | 2 +- tests/unit/lispy_test.py | 2 +- .../unit/pluggable_analysis_framework_test.py | 6 +- 33 files changed, 164 insertions(+), 594 deletions(-) rename buckaroo/{ => auto_clean}/auto_clean.py (100%) rename buckaroo/{ => auto_clean}/cleaning_commands.py (97%) rename buckaroo/{ => customizations}/all_transforms.py (96%) rename buckaroo/{ => customizations}/analysis.py (98%) rename buckaroo/{ => customizations}/down_sample.py (100%) rename buckaroo/{ => customizations}/order_columns.py (100%) delete mode 100644 buckaroo/df_methods.py rename buckaroo/{ => flask_legacy}/dcf_transform.py (100%) rename buckaroo/{ => flask_legacy}/index.html (100%) rename buckaroo/{ => flask_legacy}/views.py (95%) create mode 100644 buckaroo/jlisp/__init__.py rename buckaroo/{ => jlisp}/configure_utils.py (100%) rename buckaroo/{ => jlisp}/lisp_utils.py (100%) rename buckaroo/{ => jlisp}/lispy.py (100%) rename buckaroo/{ => pluggable_analysis_framework}/analysis_management.py (98%) rename buckaroo/{ => pluggable_analysis_framework}/pluggable_analysis_framework.py (100%) delete mode 100644 js/comp1.tsx diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 53d33bb07..d52d05439 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.4.6" +__version__ = "0.4.7" diff --git a/buckaroo/auto_clean.py b/buckaroo/auto_clean/auto_clean.py similarity index 100% rename from buckaroo/auto_clean.py rename to buckaroo/auto_clean/auto_clean.py diff --git a/buckaroo/cleaning_commands.py b/buckaroo/auto_clean/cleaning_commands.py similarity index 97% rename from buckaroo/cleaning_commands.py rename to buckaroo/auto_clean/cleaning_commands.py index d47d3049f..244831ce3 100644 --- a/buckaroo/cleaning_commands.py +++ b/buckaroo/auto_clean/cleaning_commands.py @@ -1,5 +1,5 @@ -from .lispy import s -from .configure_utils import configure_buckaroo +from ..jlisp.lispy import s +from ..jlisp.configure_utils import configure_buckaroo from .auto_clean import smart_to_int, get_auto_type_operations import pandas as pd import numpy as np diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 79fc5c017..5bc6e51e1 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -14,14 +14,14 @@ from traitlets import Unicode, List, Dict, observe from ._frontend import module_name, module_version -from .all_transforms import configure_buckaroo, DefaultCommandKlsList -from .lisp_utils import (lists_match, split_operations) +from .customizations.all_transforms import configure_buckaroo, DefaultCommandKlsList +from .jlisp.lisp_utils import (lists_match, split_operations) -from .auto_clean import get_auto_type_operations, get_typing_metadata, recommend_type -from .down_sample import sample +from .auto_clean.auto_clean import get_auto_type_operations, get_typing_metadata, recommend_type +from .customizations.down_sample import sample -from .analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) -from .analysis_management import DfStats, get_df_name +from .customizations.analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) +from .pluggable_analysis_framework.analysis_management import DfStats, get_df_name from .serialization_utils import df_to_obj, EMPTY_DF_OBJ @@ -43,12 +43,13 @@ class BuckarooWidget(DOMWidget): operations = List().tag(sync=True) machine_gen_operations = List().tag(sync=True) command_classes = DefaultCommandKlsList + analysis_classes = [TypingStats, DefaultSummaryStats, ColDisplayHints] typing_metadata_f = staticmethod(get_typing_metadata) typing_recommend_f = staticmethod(recommend_type) - origDf = Dict({}).tag(sync=True) - summaryDf = Dict({}).tag(sync=True) + df_json = Dict({}).tag(sync=True) + summary_df_json = Dict({}).tag(sync=True) operation_results = Dict( {'transformed_df': EMPTY_DF_OBJ, 'generated_py_code':'# instantiation, unused'} @@ -144,9 +145,9 @@ def update_based_on_df_config(self, change): #ideally this won't require a reserialization. All #possible col_orders shoudl be serialized once, and the #frontend should just toggle from them - self.origDf = df_to_obj(self.typed_df, self.stats.col_order, table_hints=self.stats.table_hints) + self.df_json = df_to_obj(self.typed_df, self.stats.col_order, table_hints=self.stats.table_hints) else: - self.origDf = df_to_obj(self.typed_df, self.typed_df.columns, table_hints=self.stats.table_hints) + self.df_json = df_to_obj(self.typed_df, self.typed_df.columns, table_hints=self.stats.table_hints) @observe('operations') def handle_operations(self, change): @@ -210,7 +211,7 @@ def set_typed_df(self, new_df): self.typed_df, [TypingStats, DefaultSummaryStats, ColDisplayHints], self.df_name, debug=self.debug) - self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) + self.summary_df_json = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) self.update_based_on_df_config(3) def generate_code(self, operations): @@ -241,6 +242,6 @@ def add_command(self, incomingCommandKls): def add_analysis(self, analysis_obj): self.stats.add_analysis(analysis_obj) - self.summaryDf = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) + self.summary_df_json = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) #just trigger redisplay self.update_based_on_df_config(3) diff --git a/buckaroo/all_transforms.py b/buckaroo/customizations/all_transforms.py similarity index 96% rename from buckaroo/all_transforms.py rename to buckaroo/customizations/all_transforms.py index 9b4613c54..2fd83a97d 100644 --- a/buckaroo/all_transforms.py +++ b/buckaroo/customizations/all_transforms.py @@ -1,9 +1,9 @@ import pandas as pd import numpy as np -from .lispy import s -from .configure_utils import configure_buckaroo -from .cleaning_commands import (to_bool, to_datetime, to_int, to_float, to_string) +from ..jlisp.lispy import s +from ..jlisp.configure_utils import configure_buckaroo +from ..auto_clean.cleaning_commands import (to_bool, to_datetime, to_int, to_float, to_string) class Command(object): pass diff --git a/buckaroo/analysis.py b/buckaroo/customizations/analysis.py similarity index 98% rename from buckaroo/analysis.py rename to buckaroo/customizations/analysis.py index 73d1e1677..a6abef40b 100644 --- a/buckaroo/analysis.py +++ b/buckaroo/customizations/analysis.py @@ -2,7 +2,7 @@ import pandas as pd from pandas.io.json import dumps as pdumps import numpy as np -from buckaroo.pluggable_analysis_framework import ColAnalysis +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis import warnings def probable_datetime(ser): diff --git a/buckaroo/down_sample.py b/buckaroo/customizations/down_sample.py similarity index 100% rename from buckaroo/down_sample.py rename to buckaroo/customizations/down_sample.py diff --git a/buckaroo/order_columns.py b/buckaroo/customizations/order_columns.py similarity index 100% rename from buckaroo/order_columns.py rename to buckaroo/customizations/order_columns.py diff --git a/buckaroo/df_methods.py b/buckaroo/df_methods.py deleted file mode 100644 index 51a42d3e3..000000000 --- a/buckaroo/df_methods.py +++ /dev/null @@ -1,442 +0,0 @@ - - - -['T', - '_AXIS_LEN', - '_AXIS_ORDERS', - '_AXIS_TO_AXIS_NUMBER', - '_HANDLED_TYPES', - '__abs__', - '__add__', - '__and__', - '__annotations__', - '__array__', - '__array_priority__', - '__array_ufunc__', - '__array_wrap__', - '__bool__', - '__class__', - '__contains__', - '__copy__', - '__dataframe__', - '__deepcopy__', - '__delattr__', - '__delitem__', - '__dict__', - '__dir__', - '__divmod__', - '__doc__', - '__eq__', - '__finalize__', - '__floordiv__', - '__format__', - '__ge__', - '__getattr__', - '__getattribute__', - '__getitem__', - '__getstate__', - '__gt__', - '__hash__', - '__iadd__', - '__iand__', - '__ifloordiv__', - '__imod__', - '__imul__', - '__init__', - '__init_subclass__', - '__invert__', - '__ior__', - '__ipow__', - '__isub__', - '__iter__', - '__itruediv__', - '__ixor__', - '__le__', - '__len__', - '__lt__', - '__matmul__', - '__mod__', - '__module__', - '__mul__', - '__ne__', - '__neg__', - '__new__', - '__nonzero__', - '__or__', - '__pos__', - '__pow__', - '__radd__', - '__rand__', - '__rdivmod__', - '__reduce__', - '__reduce_ex__', - '__repr__', - '__rfloordiv__', - '__rmatmul__', - '__rmod__', - '__rmul__', - '__ror__', - '__round__', - '__rpow__', - '__rsub__', - '__rtruediv__', - '__rxor__', - '__setattr__', - '__setitem__', - '__setstate__', - '__sizeof__', - '__str__', - '__sub__', - '__subclasshook__', - '__truediv__', - '__weakref__', - '__xor__', - '_accessors', - '_accum_func', - '_add_numeric_operations', - '_agg_by_level', - '_agg_examples_doc', - '_agg_summary_and_see_also_doc', - '_align_frame', - '_align_series', - '_append', - '_arith_method', - '_as_manager', - '_attrs', - '_box_col_values', - '_can_fast_transpose', - '_check_inplace_and_allows_duplicate_labels', - '_check_inplace_setting', - '_check_is_chained_assignment_possible', - '_check_label_or_level_ambiguity', - '_check_setitem_copy', - '_clear_item_cache', - '_clip_with_one_bound', - '_clip_with_scalar', - '_cmp_method', - '_combine_frame', - '_consolidate', - '_consolidate_inplace', - '_construct_axes_dict', - '_construct_axes_from_arguments', - '_construct_result', - '_constructor', - '_constructor_sliced', - '_convert', - '_count_level', - '_data', - '_dir_additions', - '_dir_deletions', - '_dispatch_frame_op', - '_drop_axis', - '_drop_labels_or_levels', - '_ensure_valid_index', - '_find_valid_index', - '_flags', - '_from_arrays', - '_get_agg_axis', - '_get_axis', - '_get_axis_name', - '_get_axis_number', - '_get_axis_resolvers', - '_get_block_manager_axis', - '_get_bool_data', - '_get_cleaned_column_resolvers', - '_get_column_array', - '_get_index_resolvers', - '_get_item_cache', - '_get_label_or_level_values', - '_get_numeric_data', - '_get_value', - '_getitem_bool_array', - '_getitem_multilevel', - '_gotitem', - '_hidden_attrs', - '_indexed_same', - '_info_axis', - '_info_axis_name', - '_info_axis_number', - '_info_repr', - '_init_mgr', - '_inplace_method', - '_internal_names', - '_internal_names_set', - '_is_copy', - '_is_homogeneous_type', - '_is_label_or_level_reference', - '_is_label_reference', - '_is_level_reference', - '_is_mixed_type', - '_is_view', - '_iset_item', - '_iset_item_mgr', - '_iset_not_inplace', - '_item_cache', - '_iter_column_arrays', - '_ixs', - '_join_compat', - '_logical_func', - '_logical_method', - '_maybe_cache_changed', - '_maybe_update_cacher', - '_metadata', - '_mgr', - '_min_count_stat_function', - '_needs_reindex_multi', - '_protect_consolidate', - '_reduce', - '_reduce_axis1', - '_reindex_axes', - '_reindex_columns', - '_reindex_index', - '_reindex_multi', - '_reindex_with_indexers', - '_rename', - '_replace_columnwise', - '_repr_data_resource_', - '_repr_fits_horizontal_', - '_repr_fits_vertical_', - '_repr_html_', - '_repr_latex_', - '_reset_cache', - '_reset_cacher', - '_sanitize_column', - '_series', - '_set_axis', - '_set_axis_name', - '_set_axis_nocheck', - '_set_is_copy', - '_set_item', - '_set_item_frame_value', - '_set_item_mgr', - '_set_value', - '_setitem_array', - '_setitem_frame', - '_setitem_slice', - '_slice', - '_stat_axis', - '_stat_axis_name', - '_stat_axis_number', - '_stat_function', - '_stat_function_ddof', - '_take', - '_take_with_is_copy', - '_to_dict_of_blocks', - '_typ', - '_update_inplace', - '_validate_dtype', - '_values', - '_where', - 'abs', - 'add', - 'add_prefix', - 'add_suffix', - 'agg', - 'aggregate', - 'align', - 'all', - 'any', - 'append', - 'apply', - 'applymap', - 'asfreq', - 'asof', - 'assign', - 'astype', - 'at', - 'at_time', - 'attrs', - 'axes', - 'backfill', - 'between_time', - 'bfill', - 'bool', - 'boxplot', - 'clip', - 'columns', - 'combine', - 'combine_first', - 'compare', - 'convert_dtypes', - 'copy', - 'corr', - 'corrwith', - 'count', - 'cov', - 'cummax', - 'cummin', - 'cumprod', - 'cumsum', - 'describe', - 'diff', - 'div', - 'divide', - 'dot', - 'drop', - 'drop_duplicates', - 'droplevel', - 'dropna', - 'dtypes', - 'duplicated', - 'empty', - 'eq', - 'equals', - 'eval', - 'ewm', - 'expanding', - 'explode', - 'ffill', - 'fillna', - 'filter', - 'first', - 'first_valid_index', - 'flags', - 'floordiv', - 'from_dict', - 'from_records', - 'ge', - 'get', - 'groupby', - 'gt', - 'head', - 'hist', - 'iat', - 'idxmax', - 'idxmin', - 'iloc', - 'index', - 'infer_objects', - 'info', - 'insert', - 'interpolate', - 'isetitem', - 'isin', - 'isna', - 'isnull', - 'items', - 'iteritems', - 'iterrows', - 'itertuples', - 'join', - 'keys', - 'kurt', - 'kurtosis', - 'last', - 'last_valid_index', - 'le', - 'loc', - 'lookup', - 'lt', - 'mad', - 'mask', - 'max', - 'mean', - 'median', - 'melt', - 'memory_usage', - 'merge', - 'min', - 'mod', - 'mode', - 'mul', - 'multiply', - 'ndim', - 'ne', - 'nlargest', - 'notna', - 'notnull', - 'nsmallest', - 'nunique', - 'pad', - 'pct_change', - 'pipe', - 'pivot', - 'pivot_table', - 'plot', - 'pop', - 'pow', - 'prod', - 'product', - 'quantile', - 'query', - 'radd', - 'rank', - 'rdiv', - 'reindex', - 'reindex_like', - 'rename', - 'rename_axis', - 'reorder_levels', - 'replace', - 'resample', - 'reset_index', - 'rfloordiv', - 'rmod', - 'rmul', - 'rolling', - 'round', - 'rpow', - 'rsub', - 'rtruediv', - 'sample', - 'select_dtypes', - 'sem', - 'set_axis', - 'set_flags', - 'set_index', - 'shape', - 'shift', - 'size', - 'skew', - 'slice_shift', - 'sort_index', - 'sort_values', - 'squeeze', - 'stack', - 'std', - 'sub', - 'subtract', - 'sum', - 'swapaxes', - 'swaplevel', - 'tail', - 'take', - 'transform', - 'transpose', - 'truncate', - 'unstack', - 'update', - 'where', - 'xs'] - - # 'style', - # 'value_counts', - # 'values', - # 'var', - # 'tz_convert', - # 'tz_localize', - # 'truediv', - - # 'to_clipboard', - # 'to_csv', - # 'to_dict', - # 'to_excel', - # 'to_feather', - # 'to_gbq', - # 'to_hdf', - # 'to_html', - # 'to_json', - # 'to_latex', - # 'to_markdown', - # 'to_numpy', - # 'to_orc', - # 'to_parquet', - # 'to_period', - # 'to_pickle', - # 'to_records', - # 'to_sql', - # 'to_stata', - # 'to_string', - # 'to_timestamp', - # 'to_xarray', - # 'to_xml', diff --git a/buckaroo/dcf_transform.py b/buckaroo/flask_legacy/dcf_transform.py similarity index 100% rename from buckaroo/dcf_transform.py rename to buckaroo/flask_legacy/dcf_transform.py diff --git a/buckaroo/index.html b/buckaroo/flask_legacy/index.html similarity index 100% rename from buckaroo/index.html rename to buckaroo/flask_legacy/index.html diff --git a/buckaroo/views.py b/buckaroo/flask_legacy/views.py similarity index 95% rename from buckaroo/views.py rename to buckaroo/flask_legacy/views.py index 00f96323b..e16bdfb58 100644 --- a/buckaroo/views.py +++ b/buckaroo/flask_legacy/views.py @@ -8,7 +8,7 @@ import json #from .dcf_transform import dcf_transform, s, dcf_to_py as dcf_to_py_core from .lispy import s -from .all_transforms import dcf_transform, dcf_to_py_core, command_patterns, command_defaults +from ..customizations.all_transforms import dcf_transform, dcf_to_py_core, command_patterns, command_defaults #from lispy import s dcf_views = Blueprint('dcf', __name__, url_prefix='/dcf') diff --git a/buckaroo/jlisp/__init__.py b/buckaroo/jlisp/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/buckaroo/configure_utils.py b/buckaroo/jlisp/configure_utils.py similarity index 100% rename from buckaroo/configure_utils.py rename to buckaroo/jlisp/configure_utils.py diff --git a/buckaroo/lisp_utils.py b/buckaroo/jlisp/lisp_utils.py similarity index 100% rename from buckaroo/lisp_utils.py rename to buckaroo/jlisp/lisp_utils.py diff --git a/buckaroo/lispy.py b/buckaroo/jlisp/lispy.py similarity index 100% rename from buckaroo/lispy.py rename to buckaroo/jlisp/lispy.py diff --git a/buckaroo/analysis_management.py b/buckaroo/pluggable_analysis_framework/analysis_management.py similarity index 98% rename from buckaroo/analysis_management.py rename to buckaroo/pluggable_analysis_framework/analysis_management.py index 2295f5496..2ee23d7e4 100644 --- a/buckaroo/analysis_management.py +++ b/buckaroo/pluggable_analysis_framework/analysis_management.py @@ -1,9 +1,10 @@ import sys import traceback +import warnings import numpy as np import pandas as pd -from buckaroo.pluggable_analysis_framework import ( +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( ColAnalysis, order_analysis, check_solvable, NotProvidedException) from buckaroo.serialization_utils import pd_py_serialize, pick, d_update @@ -74,7 +75,7 @@ def reproduce_summary(ser_name, kls, summary_df, err, operating_df_name): def output_reproduce_preamble(): print("#Reproduction code") print("#" + "-" * 80) - print("from buckaroo.analysis_management import PERVERSE_DF") + print("from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF") def output_full_reproduce(errs, summary_df, df_name): if len(errs) == 0: @@ -89,8 +90,6 @@ def output_full_reproduce(errs, summary_df, df_name): traceback.print_exc() - - def produce_summary_df(df, ordered_objs, df_name='test_df', debug=False): """ takes a dataframe and a list of analyses that have been ordered by a graph sort, diff --git a/buckaroo/pluggable_analysis_framework.py b/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py similarity index 100% rename from buckaroo/pluggable_analysis_framework.py rename to buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py diff --git a/docs/source/conf.py b/docs/source/conf.py index 7d195adbe..ba4fe338b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.4.6' +release = '0.4.7' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb index 1fb6923c9..97a9fa8f4 100644 --- a/example-notebooks/Full-tour.ipynb +++ b/example-notebooks/Full-tour.ipynb @@ -3,9 +3,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "%pip install buckaroo\n", @@ -23,29 +21,28 @@ "outputs": [], "source": [ "import numpy as np\n", - "import pandas as pd\n", - "import buckaroo" + "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Demonstrating Buckaroo on Citibike data.\n", - "This might take a little time to download\n", - "\n", - "*once the view loads click 0's and 1's on the top left to toggle different parts of the UI*" + "## A simple DataFrame in Pandas" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")\n", - "#df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", - "df" + "num_df = pd.DataFrame(\n", + " {'a':[111_111, 77_777, 777_777, 1_000_000, 2_111_111, 1_235_999],\n", + " 'b':[111_111, 555_555, 0, 28_123, 482_388, 5_666]})\n", + "num_df" ] }, { @@ -55,26 +52,29 @@ "tags": [] }, "outputs": [], - "source": [] + "source": [ + "import buckaroo\n", + "num_df" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Notice the monospaced numeric formatting in the following dataframe" + "# Demonstrating Buckaroo on Citibike data.\n", + "This might take a little time to download\n", + "\n", + "*once the view loads click 0's and 1's on the top left to toggle different parts of the UI*" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "num_df = pd.DataFrame({'a':[111_111, 77_777, 777_777, 1_000_000, 2_111_111, 1_235_999],\n", - " 'b':[111_111, 555_555, 0, 28_123, 482_388, 5_666]})\n", - "num_df" + "df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", + "df" ] }, { @@ -131,7 +131,10 @@ " extra_arr.append(\"unique_%d\" % i)\n", " all_arr = np.concatenate([choice_arr, extra_arr])\n", " np.random.shuffle(all_arr)\n", - " return all_arr \n", + " try:\n", + " return pd.Series(all_arr, dtype='UInt64')\n", + " except:\n", + " return pd.Series(all_arr, dtype=pd.StringDtype()) \n", "N = 4000" ] }, @@ -153,6 +156,7 @@ }, "outputs": [], "source": [ + "import buckaroo\n", "pd.DataFrame({\n", " 'normal': np.random.normal(25, .3, N),\n", " 'exponential' : np.random.exponential(1.0, N) * 10 ,\n", @@ -182,9 +186,9 @@ "outputs": [], "source": [ "pd.DataFrame({\n", - " 'all_NA' : [pd.NA] * N,\n", - " 'half_NA' : random_categorical({1: .5}, unique_per=0, na_per=.5, longtail_per=.0, N=N),\n", - " 'dominant_categories': random_categorical({'foo': .6, 'bar': .25, 'baz':.15}, unique_per=0, na_per=0, longtail_per=0, N=N),\n", + " 'all_NA' : pd.Series([pd.NA] * N, dtype='UInt8'),\n", + " 'half_NA' : random_categorical({1: .55}, unique_per=0, na_per=.45, longtail_per=.0, N=N),\n", + " 'dominant_categories': random_categorical({'foo': .45, 'bar': .2, 'baz':.15}, unique_per=.2, na_per=0, longtail_per=0, N=N),\n", " 'longtail' : random_categorical({}, unique_per=0, na_per=.2, longtail_per=.8, N=N),\n", " 'longtail_unique' : random_categorical({}, unique_per=0.5, na_per=.0, longtail_per=.5, N=N)})" ] @@ -212,50 +216,6 @@ " 'normal': np.random.normal(25, .3, N),})" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Auto typing\n", - "Click over to summary stats and notice the difference between the dtypes on these two tables\n", - "notice that the birth year for the first table includes `\\n`, autoTyping was turned off for this widget\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "BuckarooWidget = buckaroo.BuckarooWidget\n", - "w = BuckarooWidget(df, autoType=False, showCommands=False)\n", - "w" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Turning off autocleaning by column\n", - "This widget has been configured to have the low code UI on by default.\n", - "Observe that the cleaning operation for each column has been added,\n", - "and can be removed with the X" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "w = BuckarooWidget(df, showCommands=True)\n", - "w" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -291,7 +251,7 @@ }, "outputs": [], "source": [ - "from buckaroo.pluggable_analysis_framework import (ColAnalysis)\n", + "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis)\n", "class Variance(ColAnalysis):\n", " provides_summary = [\"variance\"]\n", " requires_summary = [\"mean\"]\n", @@ -342,7 +302,7 @@ "source": [ "small_df = df[:500][df.columns[:4]]\n", "# we are going to create, but not display a BuckarooWidget here, we are looking at the error behavior\n", - "w = buckaroo.BuckarooWidget(small_df, showCommands=False)\n", + "w = buckaroo.BuckarooWidget(small_df, showCommands=False, debug=True)\n", "\n", "class Variance(ColAnalysis):\n", " provides_summary = [\"variance\"]\n", @@ -377,6 +337,18 @@ "w.add_analysis(Variance)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", + "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -384,7 +356,7 @@ "## Reproducing errors in the notebook\n", "Buckaroo printed reproduction instructions like\n", "```\n", - "from buckaroo.analysis_management import PERVERSE_DF\n", + "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous\n", "\n", "```\n", @@ -392,6 +364,18 @@ "`PERVERSE_DF` is a DataFame with all kinds of edgecases that normally trip up numerical code. You can run the above two lines, and quickly start iterating on your `ColAnalysis` class to fix the error. Normally adhoc analysis code that iterates over a list of functions blows up in a stack trace referencing an anonymous function in the middle of a for loop called with opaque variables. Bucakroo gives you a single line that can reproduce the error, with easily inspectable variables" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", + "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -453,7 +437,7 @@ }, "outputs": [], "source": [ - "w = buckaroo.BuckarooWidget(df[:500], showCommands=True, autoType=False) #turning autoType=False to reduce clutter in the operations\n", + "w = buckaroo.BuckarooWidget(df[:500], showCommands=True, auto_clean=False) #turning autoType=False to reduce clutter in the operations\n", "w" ] }, @@ -463,16 +447,17 @@ "metadata": {}, "outputs": [], "source": [ - "from buckaroo.all_transforms import Command\n", - "from buckaroo.lispy import s\n", + "from buckaroo.customizations.all_transforms import Command\n", + "from buckaroo.jlisp.lispy import s\n", "#Here we start adding commands to the Buckaroo Widget. Every call to add_command replaces a command with the same name\n", "@w.add_command\n", - "class GroupBy2(Command):\n", - " command_default = [s(\"groupby2\"), s('df'), 'col', {}]\n", + "class GroupBy3(Command):\n", + " command_default = [s(\"groupby3\"), s('df'), 'col', {}]\n", " command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]]\n", " @staticmethod \n", " def transform(df, col, col_spec):\n", " grps = df.groupby(col)\n", + " \n", " df_contents = {}\n", " for k, v in col_spec.items():\n", " if v == \"sum\":\n", @@ -541,6 +526,49 @@ "buckaroo.debug_packages()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Auto cleaning\n", + "Here we will instaniate buckaroo with `auto_clean=True` Click over to summary stats and notice the difference between the dtypes on these two tables\n", + "notice that the birth year for the first table includes `\\n`, autoTyping was turned off for this widget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "w = buckaroo.BuckarooWidget(df, auto_clean=True, showCommands=True)\n", + "w" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Turning off autocleaning by column\n", + "This widget has been configured to have the low code UI on by default.\n", + "Observe that the cleaning operation for each column has been added,\n", + "and can be removed with the X" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "w = buckaroo.BuckarooWidget(df, auto_clean=True, showCommands=True)\n", + "w" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -601,6 +629,13 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } } }, "nbformat": 4, diff --git a/js/comp1.tsx b/js/comp1.tsx deleted file mode 100644 index 88e230dfc..000000000 --- a/js/comp1.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import React from 'react'; -export function comp1() { - console.log('comp1'); - return

    comp1

    ; -} diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 90809a585..d5b18f6f5 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -19,27 +19,30 @@ export type CommandConfigSetterT = ( TODO:add height settings to dfConfig rather than hardcoded. */ export function WidgetDCFCell({ - origDf, + df_json: json_serialized_df, operations, on_operations, operation_results, commandConfig, dfConfig, on_dfConfig, - summaryDf, + summary_df_json: summaryDf, }: { - origDf: DFWhole; + df_json: DFWhole; operations: Operation[]; on_operations: (ops: Operation[]) => void; operation_results: OperationResult; commandConfig: CommandConfigT; dfConfig: DfConfig; on_dfConfig: unknown; - summaryDf: DFWhole; + summary_df_json: DFWhole; }) { const [activeCol, setActiveCol] = useState('stoptime'); const widgetConfig: WidgetConfig = { showCommands: dfConfig.showCommands }; - const localDfConfig = { ...dfConfig, rowsShown: origDf.data.length || 0 }; + const localDfConfig = { + ...dfConfig, + rowsShown: json_serialized_df.data.length || 0, + }; return (
    {widgetConfig.showCommands ? ( (bakedOperations); return ( ); } diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index 65f4ccf36..f8bb0e368 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -20,8 +20,6 @@ import { MODULE_NAME, MODULE_VERSION } from './version'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; import '../js/style/dcf-npm.css'; -import { Operation } from './components/OperationUtils'; -import { CommandConfigT } from './components/CommandUtils'; export class DCEFWidgetModel extends DOMWidgetModel { defaults(): Backbone.ObjectHash { @@ -33,11 +31,6 @@ export class DCEFWidgetModel extends DOMWidgetModel { _view_name: DCEFWidgetModel.view_name, _view_module: DCEFWidgetModel.view_module, _view_module_version: DCEFWidgetModel.view_module_version, - //add typing from OperationUtils - commandConfig: {} as CommandConfigT, - operations: [] as Operation[], - operation_results: {}, // {transformed_df:DFWhole, generated_py_code:string} - dfConfig: {}, // provided on df ingest }; } @@ -79,20 +72,6 @@ export class DCEFWidgetView extends DOMWidgetView { }; console.log('widget el', this.el); - /* - const el = this.el; - _.delay(() => { - //only get the active notebook - const notebookEl = document.querySelector(':not(.lm-mod-hidden) > .jp-NotebookPanel-notebook') as any - const elTop = el.getBoundingClientRect()['y']; - const notebookTop = notebookEl.getBoundingClientRect()['y']; - const scrollOffset = notebookTop - elTop + 50; - - console.log("elTop", elTop, "notebookTop", notebookTop, "scrollOffset", scrollOffset); - //console.log("scrollOffset", scrollOffset); - notebookEl.scroll(0, -1*scrollOffset); - }, 300) - */ const root = ReactDOMClient.createRoot(this.el); const componentEl = React.createElement(Component, {}); root.render(componentEl); diff --git a/package.json b/package.json index 01cbba265..a8e37c3ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.4.6", + "version": "0.4.7", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index aec4d5693..2e930b0f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.6" +version = "0.4.7" [project.license] file = "LICENSE.txt" @@ -138,7 +138,7 @@ field = [ ] [tool.tbump.version] -current = "0.4.6" +current = "0.4.7" regex = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)((?Pa|b|rc|.dev)(?P\\d+))?" [tool.tbump.git] diff --git a/tbump.toml b/tbump.toml index fffb4a89e..f16ba7c2c 100644 --- a/tbump.toml +++ b/tbump.toml @@ -2,7 +2,7 @@ # github_url = "https://github.com///" [version] -current = "0.4.6" +current = "0.4.7" # Example of a semver regexp. # Make sure this matches current_version before diff --git a/tests/unit/analysis_management_test.py b/tests/unit/analysis_management_test.py index b1e4b9d0f..d04c76797 100644 --- a/tests/unit/analysis_management_test.py +++ b/tests/unit/analysis_management_test.py @@ -1,14 +1,14 @@ import unittest import pytest -from buckaroo.pluggable_analysis_framework import ( +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( ColAnalysis) -from buckaroo.analysis_management import ( +from buckaroo.pluggable_analysis_framework.analysis_management import ( AnalsysisPipeline, produce_summary_df, NonExistentSummaryRowException, DfStats) -from buckaroo.analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) +from buckaroo.customizations.analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen, word_only_df) class DumbTableHints(ColAnalysis): diff --git a/tests/unit/analysis_test.py b/tests/unit/analysis_test.py index 027cd00b2..2e4f2d601 100644 --- a/tests/unit/analysis_test.py +++ b/tests/unit/analysis_test.py @@ -1,7 +1,7 @@ from datetime import datetime as dtdt import numpy as np import pandas as pd -from buckaroo.analysis import TypingStats, DefaultSummaryStats, ColDisplayHints +from buckaroo.customizations.analysis import TypingStats, DefaultSummaryStats, ColDisplayHints text_ser = pd.Series(["foo", "bar", "baz"]) diff --git a/tests/unit/auto_clean_test.py b/tests/unit/auto_clean_test.py index 5c84c064c..4db29d1f9 100644 --- a/tests/unit/auto_clean_test.py +++ b/tests/unit/auto_clean_test.py @@ -2,7 +2,7 @@ import pytest import pandas as pd -from buckaroo import auto_clean as ac +from buckaroo.auto_clean import auto_clean as ac from pandas import NA as NA from numpy import nan from pandas.testing import assert_series_equal, assert_frame_equal diff --git a/tests/unit/basic_widget_test.py b/tests/unit/basic_widget_test.py index 7b322e625..7705ddfd1 100644 --- a/tests/unit/basic_widget_test.py +++ b/tests/unit/basic_widget_test.py @@ -1,7 +1,7 @@ import pandas as pd from IPython.display import display from buckaroo.buckaroo_widget import BuckarooWidget -from buckaroo.analysis_management import PERVERSE_DF +from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF from .fixtures import (word_only_df) simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) diff --git a/tests/unit/fixtures.py b/tests/unit/fixtures.py index 3d945de23..5ccb16b80 100644 --- a/tests/unit/fixtures.py +++ b/tests/unit/fixtures.py @@ -1,6 +1,6 @@ import numpy as np import pandas as pd -from buckaroo.pluggable_analysis_framework import (ColAnalysis) +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) test_df = pd.DataFrame({ 'normal_int_series' : pd.Series([1,2,3,4]), diff --git a/tests/unit/lispy_test.py b/tests/unit/lispy_test.py index 08db504cf..c385dcc3e 100644 --- a/tests/unit/lispy_test.py +++ b/tests/unit/lispy_test.py @@ -1,6 +1,6 @@ import unittest import pytest -from buckaroo.lisp_utils import split_operations, lists_match +from buckaroo.jlisp.lisp_utils import split_operations, lists_match def test_split_operations(): diff --git a/tests/unit/pluggable_analysis_framework_test.py b/tests/unit/pluggable_analysis_framework_test.py index 68fa63f7d..0bcfb67a7 100644 --- a/tests/unit/pluggable_analysis_framework_test.py +++ b/tests/unit/pluggable_analysis_framework_test.py @@ -3,13 +3,13 @@ import pandas as pd import numpy as np import graphlib -from buckaroo.pluggable_analysis_framework import ( +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( ColAnalysis, order_analysis, check_solvable, NotProvidedException) -from buckaroo.analysis_management import ( +from buckaroo.pluggable_analysis_framework.analysis_management import ( AnalsysisPipeline, produce_summary_df) -from buckaroo.analysis import (TypingStats, DefaultSummaryStats) +from buckaroo.customizations.analysis import (TypingStats, DefaultSummaryStats) from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen, DependsNoProvides) From 813625b3eba9445bb62358487cb89d941abd6044 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 18 Nov 2023 08:51:35 -0500 Subject: [PATCH 189/250] fixed links in docs (#162) * fixed links in docs * fixed path in Full-tour.ipynb --- docs/source/contributing.rst | 2 +- docs/source/using.rst | 2 +- example-notebooks/Full-tour.ipynb | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst index c3a637c41..508509ef3 100644 --- a/docs/source/contributing.rst +++ b/docs/source/contributing.rst @@ -39,7 +39,7 @@ The easiest way to develop and contribute to Buckaroo is to add ``Commands``. W When you use the ``add_command`` decorator, the command is instantly added to the UI of the corresponding widget. Subsequent re-evalutations of the same cell, will replace a ``Command`` in the widget with the same name. This allows you to iteratively develop commands. -Once you have developed a ``Command`` you can either continue to use it internally as with the ``add_command`` decorator or you can open a PR and add it to the builtin commands for Buckaroo `all_transforms.py `_. +Once you have developed a ``Command`` you can either continue to use it internally as with the ``add_command`` decorator or you can open a PR and add it to the builtin commands for Buckaroo `all_transforms.py `_. The upside of just using the @add_command decorator is that you don't have to setup a development environment. diff --git a/docs/source/using.rst b/docs/source/using.rst index 5e6c34d85..66d5de5bf 100644 --- a/docs/source/using.rst +++ b/docs/source/using.rst @@ -37,7 +37,7 @@ Writing your own commands ========================= -Builtin commands are found in `all_transforms.py `_ +Builtin commands are found in `all_transforms.py `_ .. code-block:: python diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb index 97a9fa8f4..e42f53f5f 100644 --- a/example-notebooks/Full-tour.ipynb +++ b/example-notebooks/Full-tour.ipynb @@ -73,7 +73,8 @@ "metadata": {}, "outputs": [], "source": [ - "df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", + "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")", + "#df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", "df" ] }, From e6311204811863f502ce733c615526b529d708f6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 18 Nov 2023 09:02:41 -0500 Subject: [PATCH 190/250] Feat/bump2version (#161) * adding bump2version, removed tbump --- .bumpversion.cfg | 9 +++++++++ pyproject.toml | 26 -------------------------- tbump.toml | 47 ----------------------------------------------- 3 files changed, 9 insertions(+), 73 deletions(-) create mode 100644 .bumpversion.cfg delete mode 100644 tbump.toml diff --git a/.bumpversion.cfg b/.bumpversion.cfg new file mode 100644 index 000000000..a4b8502d5 --- /dev/null +++ b/.bumpversion.cfg @@ -0,0 +1,9 @@ +[bumpversion] +current_version = 0.4.7 +commit = True +tag = True + +[bumpversion:file:pyproject.toml] +[bumpversion:file:package.json] +[bumpversion:file:buckaroo/_version.py] +[bumpversion:file:docs/source/conf.py] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 2e930b0f6..3f84db32e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,7 +60,6 @@ docs = [ build = [ "twine", "build", -"tbump" ] [project.urls] @@ -130,28 +129,3 @@ max-line-length = "80" [tool.black] line-length = 80 exclude = "/(\n \\.eggs\n | \\.git\n | \\.hg\n | \\.mypy_cache\n | \\.tox\n | \\.venv\n | _build\n | buck-out\n | build\n | dist\n)/\n" - -[tool.tbump] -field = [ - { name = "channel", default = "" }, - { name = "release", default = "" }, -] - -[tool.tbump.version] -current = "0.4.7" -regex = "(?P\\d+)\\.(?P\\d+)\\.(?P\\d+)((?Pa|b|rc|.dev)(?P\\d+))?" - -[tool.tbump.git] -message_template = "Bump to {new_version}" -tag_template = "v{new_version}" - -[[tool.tbump.file]] -src = "pyproject.toml" -version_template = "version = \"{major}.{minor}.{patch}{channel}{release}\"" - -[[tool.tbump.file]] -src = "buckaroo/_version.py" - -[[tool.tbump.file]] -src = "package.json" -version_template = "\"version\": \"{major}.{minor}.{patch}{channel}{release}\"" diff --git a/tbump.toml b/tbump.toml deleted file mode 100644 index f16ba7c2c..000000000 --- a/tbump.toml +++ /dev/null @@ -1,47 +0,0 @@ -# Uncomment this if your project is hosted on GitHub: -# github_url = "https://github.com///" - -[version] -current = "0.4.7" - -# Example of a semver regexp. -# Make sure this matches current_version before -# using tbump -regex = ''' - (?P\d+) - \. - (?P\d+) - \. - (?P\d+) - ''' - -[git] -message_template = "Bump to {new_version}" -tag_template = "v{new_version}" - -# For each file to patch, add a [[file]] config -# section containing the path of the file, relative to the -# tbump.toml location. -[[file]] -src = "pyproject.toml" -[[file]] -src = "package.json" -[[file]] -src = "buckaroo/_version.py" -[[file]] -src = "docs/source/conf.py" - - -# You can specify a list of commands to -# run after the files have been patched -# and before the git commit is made - -# [[before_commit]] -# name = "check changelog" -# cmd = "grep -q {new_version} Changelog.rst" - -# Or run some commands after the git tag and the branch -# have been pushed: -# [[after_push]] -# name = "publish" -# cmd = "./publish.sh" From 2e6a6b083b2322a97814c58fe062d83947467c9d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 18 Nov 2023 11:14:40 -0500 Subject: [PATCH 191/250] Feat/ruff (#163) Fixes #164 Add ruff checking --- .github/workflows/build.yml | 2 + buckaroo/__init__.py | 2 +- buckaroo/auto_clean/auto_clean.py | 4 +- buckaroo/auto_clean/cleaning_commands.py | 3 +- buckaroo/buckaroo_widget.py | 2 +- buckaroo/customizations/analysis.py | 10 +- buckaroo/customizations/order_columns.py | 1 - buckaroo/flask_legacy/dcf_transform.py | 185 ------------------ buckaroo/flask_legacy/index.html | 83 -------- buckaroo/flask_legacy/views.py | 83 -------- .../analysis_management.py | 14 +- .../pluggable_analysis_framework.py | 5 +- pyproject.toml | 91 ++++++++- tests/perf_regression.py | 47 ----- tests/unit/analysis_management_test.py | 18 +- tests/unit/analysis_test.py | 2 +- tests/unit/auto_clean_test.py | 4 +- tests/unit/basic_widget_test.py | 6 +- tests/unit/fixtures.py | 26 --- tests/unit/lispy_test.py | 2 - tests/{ => unit}/perf_regression_test.py | 3 +- .../unit/pluggable_analysis_framework_test.py | 8 +- 22 files changed, 116 insertions(+), 485 deletions(-) delete mode 100644 buckaroo/flask_legacy/dcf_transform.py delete mode 100644 buckaroo/flask_legacy/index.html delete mode 100644 buckaroo/flask_legacy/views.py delete mode 100644 tests/perf_regression.py rename tests/{ => unit}/perf_regression_test.py (94%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 87237543c..8a88d0e60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,6 +38,8 @@ jobs: if: ${{ matrix.os == 'ubuntu-latest' }} run: | yarn run lint:check + pip install ruff + ruff check . - name: Package run: | diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index cb999e526..4ea97a887 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -91,7 +91,7 @@ def warn_on_incompatible(): def debug_packages(): print("Selected Jupyter core packages...") jupyter_env = determine_jupter_env() - print("executing in %s " % determine_jupter_env()) + print("executing in %s " % jupyter_env) packages = [ "buckaroo", "jupyterlab", diff --git a/buckaroo/auto_clean/auto_clean.py b/buckaroo/auto_clean/auto_clean.py index f8910d1c4..408511960 100644 --- a/buckaroo/auto_clean/auto_clean.py +++ b/buckaroo/auto_clean/auto_clean.py @@ -1,8 +1,6 @@ -import sys import math import warnings -from datetime import timedelta from collections import defaultdict import pandas as pd @@ -96,7 +94,7 @@ def get_object_typing_metadata(ser): return ret_dict def get_typing_metadata(ser): - td = type_dict = default_type_dict.copy() + td = default_type_dict.copy() #type_dict dt = ser.dtype if not pd.api.types.is_object_dtype(dt): td['exact_type'] = str(dt) diff --git a/buckaroo/auto_clean/cleaning_commands.py b/buckaroo/auto_clean/cleaning_commands.py index 244831ce3..ca52489f0 100644 --- a/buckaroo/auto_clean/cleaning_commands.py +++ b/buckaroo/auto_clean/cleaning_commands.py @@ -2,7 +2,6 @@ from ..jlisp.configure_utils import configure_buckaroo from .auto_clean import smart_to_int, get_auto_type_operations import pandas as pd -import numpy as np class Command(object): pass @@ -47,7 +46,7 @@ def transform(df, col): ser = df[col] try: df[col] = smart_to_int(ser) - except Exception as e: + except Exception: #just let pandas figure it out, we recommended the wrong type df[col] = pd.to_numeric(ser, errors='coerce') diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 5bc6e51e1..259f639a9 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -187,7 +187,7 @@ def run_post_processing(self): else: working_df = self.transformed_df self.processed_result = self.postProcessingF(working_df) - except Exception as e: + except Exception: traceback.print_exc() @observe('machine_gen_operations') diff --git a/buckaroo/customizations/analysis.py b/buckaroo/customizations/analysis.py index a6abef40b..868c2aef2 100644 --- a/buckaroo/customizations/analysis.py +++ b/buckaroo/customizations/analysis.py @@ -1,6 +1,4 @@ -from functools import reduce import pandas as pd -from pandas.io.json import dumps as pdumps import numpy as np from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis import warnings @@ -20,7 +18,7 @@ def probable_datetime(ser): return False return True - except Exception as e: + except Exception: warnings.filterwarnings('default') return False @@ -81,7 +79,6 @@ def summary(sampled_ser, summary_ser, ser): empty_count = 0 is_numeric = pd.api.types.is_numeric_dtype(ser) - is_object = pd.api.types.is_object_dtype is_bool = pd.api.types.is_bool_dtype(ser) base_d = dict( @@ -151,11 +148,6 @@ def numeric_histogram(arr, nan_per): ret_histo.append(nan_observation) return ret_histo - -def histo_format(v, l): - scaled = v/l - - def categorical_dict(ser, val_counts, top_n_positions=7): l = len(ser) top = min(len(val_counts), top_n_positions) diff --git a/buckaroo/customizations/order_columns.py b/buckaroo/customizations/order_columns.py index f54383460..b75e88447 100644 --- a/buckaroo/customizations/order_columns.py +++ b/buckaroo/customizations/order_columns.py @@ -1,4 +1,3 @@ -from functools import reduce import pandas as pd import numpy as np diff --git a/buckaroo/flask_legacy/dcf_transform.py b/buckaroo/flask_legacy/dcf_transform.py deleted file mode 100644 index 8076b94d0..000000000 --- a/buckaroo/flask_legacy/dcf_transform.py +++ /dev/null @@ -1,185 +0,0 @@ -import pandas as pd -import numpy as np -from .lispy import make_interpreter, s -import json - -def dropcol(df, col): - df.drop(col, axis=1, inplace=True) - return df - -def fillna(df, col, val): - df.fillna({col:val}, inplace=True) - return df - - -sample_df = pd.DataFrame({'a':[2,None], 'b':['3', 'a'], 'c':[5, None]}) - -def test_dropcol(): - dropped_df = dropcol(sample_df.copy(), 'b') - assert dropped_df is not sample_df - #I want to make sure we haven't modified df - assert len(dropped_df.columns) != len(sample_df.columns) - assert 'b' not in dropped_df.columns - - -def test_fillna(): - filled_df = fillna(sample_df.copy(), 'a', 13) - - assert filled_df is not sample_df - assert np.isnan(sample_df.iloc[1]['a']) - assert np.isnan(sample_df.iloc[1]['c']) - assert np.isnan(filled_df.iloc[1]['c']) - assert filled_df.iloc[1]['a'] == 13 - - -_eval, raw_parse = make_interpreter({'dropcol':dropcol, 'fillna':fillna}) -def dcf_transform(instructions, df): - df_copy = df.copy() - return _eval(instructions, {'df':df_copy}) - -def test_interpret_fillna(): - # I would like to have symbol:df be implicit, I can do that later - filled_df = dcf_transform( - [s('fillna'), s('df'), 'a', 13], sample_df) - assert filled_df is not sample_df - assert np.isnan(sample_df.iloc[1]['a']) - assert np.isnan(sample_df.iloc[1]['c']) - assert np.isnan(filled_df.iloc[1]['c']) - assert filled_df.iloc[1]['a'] == 13 - - -def test_interpret_dropcol(): - # I would like to have symbol:df be implicit, I can do that later - dropped_df = dcf_transform( - [s('dropcol'), s('df'), 'b'], sample_df) - assert dropped_df is not sample_df - #I want to make sure we haven't modified df - assert len(dropped_df.columns) != len(sample_df.columns) - assert 'b' not in dropped_df.columns - -def test_interpret_multiple_dropcol(): - # I would like to have symbol:df be implicit, I can do that later - dropped_df = dcf_transform([ - s('begin'), - [s('dropcol'), s('df'), 'b'], - [s('dropcol'), s('df'), 'c']], - sample_df) - - - # [ - # {"symbol":"begin"},[[{"symbol":"dropcol"},{"symbol":"df"},"tripduration"]]] - assert dropped_df is not sample_df - #I want to make sure we haven't modified df - assert len(dropped_df.columns) != len(sample_df.columns) - assert 'b' not in dropped_df.columns - assert 'c' not in dropped_df.columns - - -print(json.dumps([s('dropcol'), s('df'), 'b'])) - - -def dropcol_py(df, col): - return " df.drop('%s', axis=1, inplace=True)" % col - -def fillna_py(df, col, val): - return " df.fillna({'%s':%r}, inplace=True)" % (col, val) - - -_convert_to_python, _convert_to_py_lisp = make_interpreter({'dropcol':dropcol_py, 'fillna':fillna_py}) - -def dcf_to_py(instructions): - #I would prefer to implement this with a macro named something - #like 'clean' that is implemented for the _convert_to_python - #interpreter to return a string code block, and for the real DCF - #interpreter as 'begin'... that way the exact same instructions - #could be sent to either interpreter. For now, this will do - individual_instructions = [x for x in map(lambda x:_convert_to_python(x, {'df':5}), instructions)] - code_block = '\n'.join(individual_instructions) - - return "def clean(df):\n" + code_block - -expected_py_output = """def clean(df): - df.drop('b', axis=1, inplace=True) - df.drop('c', axis=1, inplace=True)""" - -def test_to_py(): - assert dcf_to_py([[s('dropcol'), s('df'), 'b'], - [s('dropcol'), s('df'), 'c']]) == expected_py_output - assert dcf_to_py( - [ - [{'symbol': 'dropcol'}, {'symbol': 'df'}, 'starttime'], - [{'symbol': 'dropcol'}, {'symbol': 'df'}, 'stoptime']])== "asdf" - - - -def fillna(df, col, val): - df.fillna({col:val}, inplace=True) - return df - -def fillna_py(df, col, val): - return " df.fillna({'%s':%r}, inplace=True)" % (col, val) - - -class Arguments(object): - - df = "df" - column_name = "column_name" - of_type = "of_type" - -class TransformType(object): - - column = "column" - multi_column = "multi_column" - shape_change = "shape_change" - -class Transform(object): - - t_type = TransformType.column - transform = fillna - transform_to_py = fillna_py - - argument_types = [Arguments.df, Arguments.column_name, Arguments.of_type] - argument_names = ["df", "col", "val"] - command_template = [s('fillna'), s('df'), "col", "val"] - - -class FillNA(Transform): - t_type = TransformType.column - - @staticmethod - def transform(df, col, val): - df.fillna({col:val}, inplace=True) - return df - - @staticmethod - def transform_to_py(df, col, val): - return " df.fillna({'%s':%r}, inplace=True)" % (col, val) - - arguments = [Arguments.df, Arguments.column_name, Arguments.of_type] - argument_names = ["df", "col", "val"] - command_template = [s('fillna'), s('df'), "col", "val"] - - -class OneHot(Transform): - t_type = TransformType.column - - @staticmethod - def transform(df, col, val): - one_hot = pd.get_dummies(df[col]) - df = df.drop(col, axis=1, inplace=True) - #how to make this inplace? - return df.join(one_hot) - - - @staticmethod - def transform_to_py(df, col, val): - commands = [ - " one_hot = pd.get_dummies(df['%s'])" % (col), - " df.drop('%s', inplace=True)" % (col), - " df = df.join(one_hot)"] - return "\n".join(commands) - - arguments = [Arguments.df, Arguments.column_name, Arguments.of_type] - - - diff --git a/buckaroo/flask_legacy/index.html b/buckaroo/flask_legacy/index.html deleted file mode 100644 index 90041ef54..000000000 --- a/buckaroo/flask_legacy/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - - dcf - - - -

    dcf

    -
    -noarch    - - - - - - - - -
    PackageLatest VersionDocDevLicensenoarch Summary
    -
    Updated: 2023-03-21 17:59:44 +0000 - Files: 0
    - - \ No newline at end of file diff --git a/buckaroo/flask_legacy/views.py b/buckaroo/flask_legacy/views.py deleted file mode 100644 index e16bdfb58..000000000 --- a/buckaroo/flask_legacy/views.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -import os -import pandas as pd -from flask import Blueprint, jsonify, request -from flask_login import login_required, current_user -from flask_cors import cross_origin -from ..extensions import db -import json -#from .dcf_transform import dcf_transform, s, dcf_to_py as dcf_to_py_core -from .lispy import s -from ..customizations.all_transforms import dcf_transform, dcf_to_py_core, command_patterns, command_defaults -#from lispy import s -dcf_views = Blueprint('dcf', __name__, url_prefix='/dcf') - - -#make an @serve_df decorator that deals with query params and converting the df - -DEFAULT_CSV_PATH = './sample_data/2014-01-citibike-tripdata.csv' -#DEFAULT_CSV_PATH = './sample_data/problem.csv' -csv_path = os.getenv('DCF_CSV', DEFAULT_CSV_PATH) - -@dcf_views.route('/df/', methods=['GET']) -@cross_origin() -def read_df(id): - - df = pd.read_csv(csv_path) - slice_start = int(request.args.get('slice_start', 0)) - slice_end = request.args.get('slice_end', False) - if slice_end is not False: - df = df[slice_start:int(slice_end)] - return json.loads(df.to_json(orient='table', indent=2)) - - -@dcf_views.route('/transform_df/', methods=['GET']) -@cross_origin() -def transform_df(id): - df = pd.read_csv(csv_path) - instructions = json.loads(request.args.get('instructions', None)) - - #slice before or after??? probably after, otherwise run a dcf command - df = dcf_transform(instructions, df) - - slice_start = int(request.args.get('slice_start', 0)) - slice_end = request.args.get('slice_end', False) - - if slice_end is not False: - df = df.iloc[slice_start:int(slice_end)] - return json.loads(df.to_json(orient='table', indent=2)) - - -@dcf_views.route('/dcf_to_py/', methods=['GET']) -@cross_origin() -def dcf_to_py(id): - instructions = json.loads(request.args.get('instructions', None)) - #return dcf_to_py(instructions) - try: - py_string = dcf_to_py_core(instructions) - return dict(py=py_string) - except Exception as e: - print("e", e) - return "error" - - - -@dcf_views.route('/command-config', methods=['GET']) -@cross_origin() -def command_config(): - sym = s - - commandPatterns = { - "dropcol":[None], - "fillna":[[3, 'fillVal', 'type', 'integer']], - "groupby":[[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'count']]] - } - commandDefaults = { - "dropcol": [sym("dropcol"), sym("df"), "col"], - "fillna": [sym("fillna"), sym("df"), "col", 8], - "groupby": [sym("resample"), sym('df'), 'col', {}] - } - #return dict(commandPatterns=commandPatterns, commandDefaults=commandDefaults) - return dict(commandPatterns=command_patterns, commandDefaults=command_defaults) - - diff --git a/buckaroo/pluggable_analysis_framework/analysis_management.py b/buckaroo/pluggable_analysis_framework/analysis_management.py index 2ee23d7e4..8d706239f 100644 --- a/buckaroo/pluggable_analysis_framework/analysis_management.py +++ b/buckaroo/pluggable_analysis_framework/analysis_management.py @@ -5,7 +5,7 @@ import numpy as np import pandas as pd from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( - ColAnalysis, order_analysis, check_solvable, NotProvidedException) + order_analysis, check_solvable) from buckaroo.serialization_utils import pd_py_serialize, pick, d_update FAST_SUMMARY_WHEN_GREATER = 1_000_000 @@ -85,7 +85,7 @@ def output_full_reproduce(errs, summary_df, df_name): for ser_name, err_kls in errs.items(): err, kls = err_kls reproduce_summary(ser_name, kls, summary_df, err, df_name) - except Exception as e: + except Exception: #this is tricky stuff that shouldn't error, I want these stack traces to escape being caught traceback.print_exc() @@ -104,19 +104,17 @@ def produce_summary_df(df, ordered_objs, df_name='test_df', debug=False): ser = df[ser_name] #FIXME: actually sample the series. waiting until I have time #to proeprly benchmark - sampled_ser = ser summary_ser = pd.Series({}, dtype='object') - table_hint_dict = {} for a_kls in ordered_objs: try: if a_kls.quiet or a_kls.quiet_warnings: - if debug == False: + if debug is False: warnings.filterwarnings('ignore') - summary_res = a_kls.summary(ser, summary_ser, ser) + summary_res = a_kls.summary(sampled_ser, summary_ser, ser) warnings.filterwarnings('default') else: - summary_res = a_kls.summary(ser, summary_ser, ser) + summary_res = a_kls.summary(sampled_ser, summary_ser, ser) for k,v in summary_res.items(): summary_ser.loc[k] = v except Exception as e: @@ -242,7 +240,7 @@ def add_analysis(self, a_obj): passed_unit_tests, ut_errs = self.ap.add_analysis(a_obj) #if you're adding analysis interactively, of course you want debug info... I think self.sdf, self.table_hints, errs = self.ap.process_df(self.df, debug=True) - if passed_unit_tests == False: + if passed_unit_tests is False: print("Unit tests failed") if errs: print("Errors on original dataframe") diff --git a/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py b/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py index b57944e76..ec3f01f7c 100644 --- a/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py +++ b/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py @@ -1,7 +1,4 @@ import graphlib -import unittest -import pandas as pd -import numpy as np from collections import OrderedDict class ColAnalysis(object): @@ -54,7 +51,7 @@ def remove_duplicates(lst): return list(OrderedDict.fromkeys(lst)) def clean_list(full_class_list): - only_kls_lst = [kls for kls in full_class_list if not kls == None] + only_kls_lst = [kls for kls in full_class_list if kls is not None] #note I also want someway to detect that classes don't alternate # ['a', 'a', 'b', 'c', 'c'] # fine # ['a', 'a', 'b', 'a', 'c'] # something went wrong with the graph algo diff --git a/pyproject.toml b/pyproject.toml index 3f84db32e..f5927a76d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,12 +120,89 @@ known_first_party = [ ] line_length = 80 -[tool.pylint.messages_control] -disable = "C0330, C0326" -[tool.pylint.format] -max-line-length = "80" +[tool.ruff] +# Exclude a variety of commonly ignored directories. +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".git-rewrite", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".pytype", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "venv", +] + +# Same as Black. +line-length = 88 +indent-width = 4 + +# Assume Python 3.8 +target-version = "py38" + +[tool.ruff.lint] +# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. +# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or +# McCabe complexity (`C901`) by default. +select = ["E4", "E7", "E9", "F"] +ignore = [] + +# Allow fix for all enabled rules (when `--fix`) is provided. +fixable = ["F401"] +unfixable = [] + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[tool.ruff.per-file-ignores] +# lispy.py is a vendored and slightly modified bit of code from Peter Norvig +# Anyone trying to understand it is recommended to read Peter Norvig's writings +# don't want to add extaneous diffs +"buckaroo/jlisp/lispy.py" = [ + "E401", "F601", + "E701", "E702", "E703", "E712"] + +#__init__.py and widget utils does some bare excepts because it absolutely cannot error +#and give a non displayable dataframe +"buckaroo/__init__.py" = ["E722", + "F401", #it's an __init__.py, it needs to import unused imports +] + +"buckaroo/widget_utils.py" = ["E722"] +"buckaroo/customizations/order_columns.py" = ["ALL"] + +#used for safe_int +"buckaroo/customizations/all_transforms.py" = ["E722"] #bare except + +"buckaroo/customizations/analysis.py" = [ + "E741", #ambiguous variable name + "E722"] #bare except + + + +[tool.ruff.format] +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false -[tool.black] -line-length = 80 -exclude = "/(\n \\.eggs\n | \\.git\n | \\.hg\n | \\.mypy_cache\n | \\.tox\n | \\.venv\n | _build\n | buck-out\n | build\n | dist\n)/\n" +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" \ No newline at end of file diff --git a/tests/perf_regression.py b/tests/perf_regression.py deleted file mode 100644 index 884f1a516..000000000 --- a/tests/perf_regression.py +++ /dev/null @@ -1,47 +0,0 @@ -import pandas as pd -import numpy as np -import buckaroo -import time - -def float_df(N,K): - return pd.DataFrame( - {chr(i+97): np.random.random_sample(N) for i in range(K)}) - -# %timeit float_df(100_000,20) 9ms on my laptop - -def bw_do_stuff(df, **kwargs): - bw = buckaroo.BuckarooWidget(df, **kwargs) -#%timeit bw_do_stuff(float_df(100_000, 20)) 500 ms on my laptop - - -# the slow part is serialization to json, not summary stats -# %timeit bw_do_stuff2(float_df(10_000, 5)) 140 ms on my laptop -# %timeit bw_do_stuff2(float_df(100_000, 5)) 150ms on my laptop - - -def test_basic_instantiation(): - t_start = time.time() - float_df(100_000, 20) - t_end = time.time() - - np_time = t_end - t_start - assert np_time < 10 - - bw_start = time.time() - bw_do_stuff(float_df(10_000,5)) - bw_end = time.time() - bw_time_1 = bw_end - bw_start - - assert bw_time_1 < np_time * 50 - - - bw_start2 = time.time() - bw_do_stuff(float_df(100_000,5)) - bw_end2 = time.time() - bw_time_2 = bw_end2 - bw_start2 - - assert bw_time_2 < np_time * 50 - - - - diff --git a/tests/unit/analysis_management_test.py b/tests/unit/analysis_management_test.py index d04c76797..b2ed38766 100644 --- a/tests/unit/analysis_management_test.py +++ b/tests/unit/analysis_management_test.py @@ -1,5 +1,4 @@ import unittest -import pytest from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( ColAnalysis) @@ -8,8 +7,8 @@ AnalsysisPipeline, produce_summary_df, NonExistentSummaryRowException, DfStats) -from buckaroo.customizations.analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) -from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen, word_only_df) +from buckaroo.customizations.analysis import (TypingStats, DefaultSummaryStats) +from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, word_only_df) class DumbTableHints(ColAnalysis): provides_summary = [ @@ -36,7 +35,7 @@ def test_produce_summary_df_hints(self): for col, hint_obj in hints.items(): #hacky replication of typescript types, just basically testing that hints are constructed properly - if hint_obj['is_numeric'] == False: + if hint_obj['is_numeric'] is False: assert 'histogram' in hint_obj.keys() else: expected_set = set( @@ -73,7 +72,7 @@ def summary(sampled_ser, summary_ser, ser): return dict(foo=8) unit_test_results, errs = ap.add_analysis(Foo) - assert unit_test_results == False + assert unit_test_results is False def test_replace_aobj(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) @@ -133,7 +132,7 @@ def bad_add(): self.assertRaises(NonExistentSummaryRowException, bad_add) - def test_invalid_summary_stats_display_throws(self): + def test_invalid_summary_stats_display_throws2(self): ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): provides_summary = ['foo'] @@ -174,7 +173,10 @@ def test_dfstats_sometimes_present(self): non NA at least once """ - dfs = DfStats(word_only_df, [SometimesProvides]) - ab = dfs.presentation_sdf + #dfs = DfStats(word_only_df, [SometimesProvides]) + #ab = dfs.presentation_sdf + + #triggers a getter? + DfStats(word_only_df, [SometimesProvides]).presentation_sdf diff --git a/tests/unit/analysis_test.py b/tests/unit/analysis_test.py index 2e4f2d601..f1d9c6c0a 100644 --- a/tests/unit/analysis_test.py +++ b/tests/unit/analysis_test.py @@ -1,7 +1,7 @@ from datetime import datetime as dtdt import numpy as np import pandas as pd -from buckaroo.customizations.analysis import TypingStats, DefaultSummaryStats, ColDisplayHints +from buckaroo.customizations.analysis import DefaultSummaryStats, ColDisplayHints text_ser = pd.Series(["foo", "bar", "baz"]) diff --git a/tests/unit/auto_clean_test.py b/tests/unit/auto_clean_test.py index 4db29d1f9..cfbcd6269 100644 --- a/tests/unit/auto_clean_test.py +++ b/tests/unit/auto_clean_test.py @@ -1,11 +1,9 @@ -import unittest -import pytest import pandas as pd from buckaroo.auto_clean import auto_clean as ac from pandas import NA as NA from numpy import nan -from pandas.testing import assert_series_equal, assert_frame_equal +from pandas.testing import assert_series_equal DATETIME_META = {'datetime': 0.75, 'datetime_error': 0.25, 'int': 0.25, 'int_error': 0.75, 'float': 0.25, 'float_error': 0.75, 'bool': 0, 'bool_error':1} diff --git a/tests/unit/basic_widget_test.py b/tests/unit/basic_widget_test.py index 7705ddfd1..1f876dc2a 100644 --- a/tests/unit/basic_widget_test.py +++ b/tests/unit/basic_widget_test.py @@ -17,7 +17,7 @@ def test_perverse_instantiation(): assert w.dfConfig['totalRows'] == 10 def test_word_only_instantiation(): - w = BuckarooWidget(word_only_df) + BuckarooWidget(word_only_df) def test_basic_display(): df = simple_df @@ -38,7 +38,7 @@ def test_interpreter(): w.operations = temp_ops tdf = w.operation_results['transformed_df'] - assert w.operation_results['transform_error'] == False + assert w.operation_results['transform_error'] is False field_names = [ f['name'] for f in tdf['schema']['fields'] ] assert 'str_col' not in field_names assert w.operation_results['generated_py_code'] == """def clean(df): @@ -60,7 +60,7 @@ def atest_symbol_meta(): w.operations = [[{"symbol":"dropcol", "meta":{}},{"symbol":"df"},"starttime"]] tdf = w.operation_results['transformed_df'] - assert w.operation_results['transform_error'] == False + assert w.operation_results['transform_error'] is False field_names = [ f['name'] for f in tdf['schema']['fields'] ] assert 'starttime' not in field_names diff --git a/tests/unit/fixtures.py b/tests/unit/fixtures.py index 5ccb16b80..c3c87a031 100644 --- a/tests/unit/fixtures.py +++ b/tests/unit/fixtures.py @@ -12,32 +12,6 @@ df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') - -class DistinctCount(ColAnalysis): - requires_raw = True - provides_summary = ["distinct_count"] - @staticmethod - def summary(sampled_ser, summary_ser, raw_ser): - val_counts = raw_ser.value_counts() - distinct_count= len(val_counts) - return {'distinct_count': distinct_count} - -class Len(ColAnalysis): - provides_summary = ["len"] - requires_raw = True - @staticmethod - def summary(sampled_ser, summary_ser, raw_ser): - return {'len': len(raw_ser)} - - -class DistinctPer(ColAnalysis): - provides_summary = ["distinct_per"] - requires_summary = ["len", "distinct_count"] - - @staticmethod - def summary(sampled_ser, summary_ser, raw_ser): - return {'distinct_per': summary_ser.loc['distinct_count'] / summary_ser.loc['len']} - class DistinctCount(ColAnalysis): requires_raw = True provides_summary = ["distinct_count"] diff --git a/tests/unit/lispy_test.py b/tests/unit/lispy_test.py index c385dcc3e..16711d468 100644 --- a/tests/unit/lispy_test.py +++ b/tests/unit/lispy_test.py @@ -1,5 +1,3 @@ -import unittest -import pytest from buckaroo.jlisp.lisp_utils import split_operations, lists_match def test_split_operations(): diff --git a/tests/perf_regression_test.py b/tests/unit/perf_regression_test.py similarity index 94% rename from tests/perf_regression_test.py rename to tests/unit/perf_regression_test.py index 884f1a516..755b4ff68 100644 --- a/tests/perf_regression_test.py +++ b/tests/unit/perf_regression_test.py @@ -10,7 +10,8 @@ def float_df(N,K): # %timeit float_df(100_000,20) 9ms on my laptop def bw_do_stuff(df, **kwargs): - bw = buckaroo.BuckarooWidget(df, **kwargs) + buckaroo.buckaroo_widget.BuckarooWidget(df, **kwargs) + #%timeit bw_do_stuff(float_df(100_000, 20)) 500 ms on my laptop diff --git a/tests/unit/pluggable_analysis_framework_test.py b/tests/unit/pluggable_analysis_framework_test.py index 0bcfb67a7..0e49bc8a2 100644 --- a/tests/unit/pluggable_analysis_framework_test.py +++ b/tests/unit/pluggable_analysis_framework_test.py @@ -1,17 +1,11 @@ import unittest -import pytest -import pandas as pd -import numpy as np import graphlib from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( ColAnalysis, order_analysis, check_solvable, NotProvidedException) -from buckaroo.pluggable_analysis_framework.analysis_management import ( - AnalsysisPipeline, produce_summary_df) -from buckaroo.customizations.analysis import (TypingStats, DefaultSummaryStats) -from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, DCLen, DependsNoProvides) +from .fixtures import (DistinctCount, Len, DistinctPer, DCLen, DependsNoProvides) class NoRoute(ColAnalysis): provides_summary = ['not_used'] From 8303ca7fd497c8fed4adfdddd90cc68ed6fdd811 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 18 Nov 2023 15:11:57 -0500 Subject: [PATCH 192/250] Comprehensive command testing (#165) Fixes #160 Add full cycle eval testing for lowcode commands Fixes #166 Test each lowcode UI command --- buckaroo/customizations/all_transforms.py | 2 +- pyproject.toml | 2 + tests/unit/commands/command_tests.py | 70 +++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 tests/unit/commands/command_tests.py diff --git a/buckaroo/customizations/all_transforms.py b/buckaroo/customizations/all_transforms.py index 2fd83a97d..a41f38d5e 100644 --- a/buckaroo/customizations/all_transforms.py +++ b/buckaroo/customizations/all_transforms.py @@ -50,7 +50,7 @@ def transform(df, col): def transform_to_py(df, col): commands = [ " one_hot = pd.get_dummies(df['%s'])" % (col), - " df.drop('%s', inplace=True)" % (col), + " df.drop('%s', axis=1, inplace=True)" % (col), " df = df.join(one_hot)"] return "\n".join(commands) diff --git a/pyproject.toml b/pyproject.toml index f5927a76d..b43710d4d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -192,6 +192,8 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" "E741", #ambiguous variable name "E722"] #bare except +#bare except used in a convience method for developer ergonomics +"tests/unit/commands/command_tests.py" = ["E722"] #bare except [tool.ruff.format] diff --git a/tests/unit/commands/command_tests.py b/tests/unit/commands/command_tests.py new file mode 100644 index 000000000..986f28bf5 --- /dev/null +++ b/tests/unit/commands/command_tests.py @@ -0,0 +1,70 @@ +import pandas as pd +import numpy as np + +from buckaroo.jlisp.lispy import s +from buckaroo.jlisp.configure_utils import configure_buckaroo +from buckaroo.customizations.all_transforms import ( + DropCol, FillNA, OneHot, GroupBy, reindex ) + + +def result_from_exec(code_str, df_input): + CODE_PREAMBLE = "import pandas as pd\nimport numpy as np\n" + RETRIEVE_RESULT_STR = '\n__ret_closure[0] = clean(__test_df)' + outer_scope_result = [0] + full_code_str = CODE_PREAMBLE + code_str + RETRIEVE_RESULT_STR + try: + exec(full_code_str, {'__test_df':df_input, '__ret_closure':outer_scope_result}) + except: + print("Failure calling exec with following code string") + print(full_code_str) + #print(full_code_str) + return outer_scope_result[0] + +def assert_to_py_same_transform_df(command_kls, operations, test_df): + _a, _b, transform_df, transform_to_py = configure_buckaroo([command_kls]) + tdf_ops = [{'symbol': 'begin'}] + tdf_ops.extend(operations) + tdf = transform_df(tdf_ops, test_df.copy()) + py_code_string = transform_to_py(operations) + + edf = result_from_exec(py_code_string, test_df.copy()) + pd.testing.assert_frame_equal(tdf, edf) + return tdf +same = assert_to_py_same_transform_df + +def test_fillna(): + base_df = pd.DataFrame({ + 'a':[1,2,3,4,5], 'b': [pd.NA, 2, 2, 2, pd.NA]}) + + output_df = same(FillNA, [[s('fillna'), s('df'), "b", 100]], base_df) + assert output_df.iloc[0]['b'] == 100 + +def test_dropcol(): + base_df = pd.DataFrame({ + 'a':np.random.randint(1, 10, 5), 'b':np.random.randint(1, 10, 5), + 'c':np.random.randint(1, 10, 5)}) + + same(DropCol, [[s('dropcol'), s('df'), "a"]], base_df) + +def test_onehot(): + base_df = pd.DataFrame({ + 'a':['cc', 'cc', 'dd', 'ee', 'ff'], 'b': [pd.NA, 2, 2, 2, pd.NA]}) + + output_df = same(OneHot, [[s('onehot'), s('df'), "a"]], base_df) + assert output_df.columns.to_list() == ['b', 'cc', 'dd', 'ee', 'ff'] + +def test_groupby(): + base_df = pd.DataFrame({ + 'a':['cc', 'cc', 'cc', 'ee', 'ff'], 'b': [pd.NA, 2, 2, 2, pd.NA]}) + + output_df = same(GroupBy, [[s('groupby'), s('df'), "a", {'b':'count'}]], base_df) + expected_output = pd.DataFrame({'b': {'cc': 2, 'ee': 1, 'ff': 0}}, + index=pd.Index(['cc', 'ee', 'ff'], dtype='object', name='a')) + pd.testing.assert_frame_equal(output_df, expected_output) + +def test_reindex(): + base_df = pd.DataFrame({ + 'a':['ca', 'cb', 'cd', 'ee', 'ff'], 'b': [pd.NA, 2, 2, 2, pd.NA]}) + + output_df = same(reindex, [[s('reindex'), s('df'), "a"]], base_df) + assert output_df.index.to_list() == ['ca', 'cb', 'cd', 'ee', 'ff'] From b09bd30fef57ea049e07118870c27ba1f5a22349 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 18 Nov 2023 16:19:36 -0500 Subject: [PATCH 193/250] first cleaning commands test (#168) Fixes #167 Test each cleaning command --- buckaroo/auto_clean/cleaning_commands.py | 2 +- tests/unit/basic_widget_test.py | 4 +- tests/unit/commands/__init__.py | 0 tests/unit/commands/cleaning_command_test.py | 58 ++++++++++++++++++++ tests/unit/commands/command_tests.py | 1 + 5 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 tests/unit/commands/__init__.py create mode 100644 tests/unit/commands/cleaning_command_test.py diff --git a/buckaroo/auto_clean/cleaning_commands.py b/buckaroo/auto_clean/cleaning_commands.py index ca52489f0..1daa0f4df 100644 --- a/buckaroo/auto_clean/cleaning_commands.py +++ b/buckaroo/auto_clean/cleaning_commands.py @@ -54,7 +54,7 @@ def transform(df, col): @staticmethod def transform_to_py(df, col): - return " df['%s'] = smart_int(df['%s'])" % (col, col) + return " df['%s'] = smart_to_int(df['%s'])" % (col, col) class to_float(Command): #argument_names = ["df", "col"] diff --git a/tests/unit/basic_widget_test.py b/tests/unit/basic_widget_test.py index 1f876dc2a..fb55b4596 100644 --- a/tests/unit/basic_widget_test.py +++ b/tests/unit/basic_widget_test.py @@ -29,7 +29,7 @@ def test_interpreter(): w = BuckarooWidget(simple_df) assert w.operation_results['generated_py_code'] == '''def clean(df): - df['int_col'] = smart_int(df['int_col']) + df['int_col'] = smart_to_int(df['int_col']) df['str_col'] = df['str_col'].fillna(value='').astype('string').replace('', None) return df''' @@ -42,7 +42,7 @@ def test_interpreter(): field_names = [ f['name'] for f in tdf['schema']['fields'] ] assert 'str_col' not in field_names assert w.operation_results['generated_py_code'] == """def clean(df): - df['int_col'] = smart_int(df['int_col']) + df['int_col'] = smart_to_int(df['int_col']) df['str_col'] = df['str_col'].fillna(value='').astype('string').replace('', None) df.drop('str_col', axis=1, inplace=True) return df""" diff --git a/tests/unit/commands/__init__.py b/tests/unit/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/commands/cleaning_command_test.py b/tests/unit/commands/cleaning_command_test.py new file mode 100644 index 000000000..03ed63c57 --- /dev/null +++ b/tests/unit/commands/cleaning_command_test.py @@ -0,0 +1,58 @@ +import pandas as pd +import numpy as np + +from buckaroo.jlisp.lispy import s +from .command_tests import assert_to_py_same_transform_df +from buckaroo.auto_clean.cleaning_commands import ( + to_bool, to_datetime, to_int, to_float, + to_string) + +same = assert_to_py_same_transform_df + +def test_to_bool(): + base_df = pd.DataFrame({ + 'mixed_bool':[True, False, 0, 1, pd.NA], 'b': [pd.NA] * 5}) + + output_df = same(to_bool, [[s('to_bool'), s('df'), "mixed_bool"]], base_df) + assert isinstance(output_df['mixed_bool'].dtype , pd.core.arrays.boolean.BooleanDtype) + assert output_df['mixed_bool'].to_list() == [True, False, False, True, pd.NA] + +def test_to_datetime(): + base_df = pd.DataFrame({ + 'mixed_dates':['2021-02-03', '2022-05-07', 'asdf', pd.NA], 'b': [pd.NA] * 4}) + + output_df = same(to_datetime, [[s('to_datetime'), s('df'), "mixed_dates"]], base_df) + assert pd.api.types.is_datetime64_any_dtype(output_df['mixed_dates']) + assert output_df['mixed_dates'].to_list() == [ + pd.Timestamp('2021-02-03'), pd.Timestamp('2022-05-07'), pd.NaT, pd.NaT] + +def test_to_int(): + base_df = pd.DataFrame({ + 'mixed_ints':['3', '4', '3.', 'asdf', pd.NA], 'b': [pd.NA] * 5}) + + output_df = same(to_int, [[s('to_int'), s('df'), "mixed_ints"]], base_df) + pd.testing.assert_series_equal( + output_df['mixed_ints'], + pd.Series([3,4,3, pd.NA, pd.NA], dtype='UInt8', name='mixed_ints')) + +def test_to_float(): + base_df = pd.DataFrame({ + 'mixed_floats':['3', '4', '7.1', 'asdf', np.nan], 'b': [pd.NA] * 5}) + + output_df = same(to_float, [[s('to_float'), s('df'), "mixed_floats"]], base_df) + pd.testing.assert_series_equal( + output_df['mixed_floats'], + pd.Series([3, 4, 7.1, np.nan, np.nan], dtype='float64', name='mixed_floats')) + +def _test_to_string(): + """ + skipping for now. works on my machine against pandas 2.1.1 fails in CI against pandas 1.3.5 + """ + base_df = pd.DataFrame({ + 'mixed_strings':['a', 'b', pd.NA], 'b': [pd.NA] * 3}) + + output_df = same(to_string, [[s('to_string'), s('df'), "mixed_strings"]], base_df) + pd.testing.assert_series_equal( + output_df['mixed_strings'], + pd.Series(['a', 'b', pd.NA], dtype='string', name='mixed_strings')) + diff --git a/tests/unit/commands/command_tests.py b/tests/unit/commands/command_tests.py index 986f28bf5..f7fbffa6a 100644 --- a/tests/unit/commands/command_tests.py +++ b/tests/unit/commands/command_tests.py @@ -9,6 +9,7 @@ def result_from_exec(code_str, df_input): CODE_PREAMBLE = "import pandas as pd\nimport numpy as np\n" + CODE_PREAMBLE += "from buckaroo.auto_clean.auto_clean import smart_to_int\n" RETRIEVE_RESULT_STR = '\n__ret_closure[0] = clean(__test_df)' outer_scope_result = [0] full_code_str = CODE_PREAMBLE + code_str + RETRIEVE_RESULT_STR From 4b7bb47820b21a0cc58da78826c6ab6149c93a42 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 18 Nov 2023 16:45:55 -0500 Subject: [PATCH 194/250] =?UTF-8?q?Bump=20version:=200.4.7=20=E2=86=92=200?= =?UTF-8?q?.4.8=20(#169)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a bunch of testing and a couple of bug fixes --- .bumpversion.cfg | 7 +++++-- buckaroo/_version.py | 2 +- docs/source/conf.py | 2 +- package.json | 2 +- pyproject.toml | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index a4b8502d5..18087329e 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,9 +1,12 @@ [bumpversion] -current_version = 0.4.7 +current_version = 0.4.8 commit = True tag = True [bumpversion:file:pyproject.toml] + [bumpversion:file:package.json] + [bumpversion:file:buckaroo/_version.py] -[bumpversion:file:docs/source/conf.py] \ No newline at end of file + +[bumpversion:file:docs/source/conf.py] diff --git a/buckaroo/_version.py b/buckaroo/_version.py index d52d05439..3720e2160 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.4.7" +__version__ = "0.4.8" diff --git a/docs/source/conf.py b/docs/source/conf.py index ba4fe338b..934481518 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.4.7' +release = '0.4.8' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/package.json b/package.json index a8e37c3ce..3b7e4275f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.4.7", + "version": "0.4.8", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index b43710d4d..e6185190c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.7" +version = "0.4.8" [project.license] file = "LICENSE.txt" From d06bfe10acb9fe9ad943069e9bb7655bea8b8af0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 22 Nov 2023 11:23:17 -0500 Subject: [PATCH 195/250] Commands in polars (#170) * basic JLisp commands in polars with tests * Fixes #158 --- buckaroo/customizations/polars_commands.py | 90 +++++++++++++++++++++ buckaroo/jlisp/configure_utils.py | 7 +- pyproject.toml | 1 + tests/unit/commands/polars_command_tests.py | 85 +++++++++++++++++++ 4 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 buckaroo/customizations/polars_commands.py create mode 100644 tests/unit/commands/polars_command_tests.py diff --git a/buckaroo/customizations/polars_commands.py b/buckaroo/customizations/polars_commands.py new file mode 100644 index 000000000..300786630 --- /dev/null +++ b/buckaroo/customizations/polars_commands.py @@ -0,0 +1,90 @@ +import polars as pl +#import numpy as np + +from ..jlisp.lispy import s +#from ..jlisp.configure_utils import configure_buckaroo +#from ..auto_clean.cleaning_commands import (to_bool, to_datetime, to_int, to_float, to_string) + +class Command(object): + pass + +class FillNA(Command): + #argument_names = ["df", "col", "fill_val"] + command_default = [s('fillna'), s('df'), "col", 8] + command_pattern = [[3, 'fillVal', 'type', 'integer']] + + @staticmethod + def transform(df, col, val): + return df.with_columns(pl.col(col).fill_null(val)) + return df + + @staticmethod + def transform_to_py(df, col, val): + return " df = df.with_columns(pl.col('%s').fill_null(%r))" % (col, val) + +class DropCol(Command): + #argument_names = ["df", "col"] + command_default = [s('dropcol'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + return df.drop(col) + return df + + @staticmethod + def transform_to_py(df, col): + return " df.drop_in_place('%s')" % col + + +class GroupBy(Command): + command_default = [s("groupby"), s('df'), 'col', {}] + command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]] + @staticmethod + def transform(df, col, col_spec): + agg_clauses = [] + for k, v in col_spec.items(): + if v == "sum": + agg_clauses.append(pl.col(k).sum().alias("%s(sum)" % k)) + elif v == "mean": + agg_clauses.append(pl.col(k).mean().alias("%s(mean)" % k)) + elif v == "median": + agg_clauses.append(pl.col(k).median.alias("%s(median)" % k)) + elif v == "count": + agg_clauses.append(pl.col(k).drop_nulls().count().alias("%s(count)" % k)) + + q = ( + df + .lazy() + .group_by(by=col) + .agg(*agg_clauses) + .sort(col, descending=True) + ) + return q.collect() + + + + @staticmethod + def transform_to_py(df, col, col_spec): + agg_clauses = [] + for k, v in col_spec.items(): + if v == "sum": + agg_clauses.append(" pl.col('%s').sum().alias('%s(sum)')" % (k, k)) + elif v == "mean": + agg_clauses.append(" pl.col('%s').mean().alias('%s(mean)')" % (k, k)) + elif v == "median": + agg_clauses.append(" pl.col('%s').median().alias('%s(median)')" % (k, k)) + elif v == "count": + agg_clauses.append(" pl.col('%s').drop_nulls().count().alias('%s(count)')" % (k, k)) + full_agg_text = ",\n".join(agg_clauses) + command_template = """ + q = ( + df + .lazy() + .group_by(by='%s') + .agg(%s) + .sort('%s', descending=True) + ) + df = q.collect() + """ + return command_template % (col, full_agg_text, col) diff --git a/buckaroo/jlisp/configure_utils.py b/buckaroo/jlisp/configure_utils.py index b47f9498b..4a9490d08 100644 --- a/buckaroo/jlisp/configure_utils.py +++ b/buckaroo/jlisp/configure_utils.py @@ -1,3 +1,4 @@ +import pandas as pd from .lispy import make_interpreter def configure_buckaroo(transforms): command_defaults = {} @@ -14,8 +15,12 @@ def configure_buckaroo(transforms): to_py_lisp_primitives[transform_name] = T.transform_to_py buckaroo_eval, raw_parse = make_interpreter(transform_lisp_primitives) + def buckaroo_transform(instructions, df): - df_copy = df.copy() + if isinstance(df, pd.DataFrame): + df_copy = df.copy() + else: # hack we know it's polars here... just getting something working for now + df_copy = df.clone() ret_val = buckaroo_eval(instructions, {'df':df_copy}) return ret_val diff --git a/pyproject.toml b/pyproject.toml index e6185190c..476f5572e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -194,6 +194,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" #bare except used in a convience method for developer ergonomics "tests/unit/commands/command_tests.py" = ["E722"] #bare except +"tests/unit/commands/polars_command_tests.py" = ["E722"] #bare except [tool.ruff.format] diff --git a/tests/unit/commands/polars_command_tests.py b/tests/unit/commands/polars_command_tests.py new file mode 100644 index 000000000..81b9602a7 --- /dev/null +++ b/tests/unit/commands/polars_command_tests.py @@ -0,0 +1,85 @@ +from collections import OrderedDict +import polars as pl +import numpy as np + +from buckaroo.jlisp.lispy import s +from polars.testing import assert_frame_equal +from buckaroo.jlisp.configure_utils import configure_buckaroo +from buckaroo.customizations.polars_commands import ( + DropCol, FillNA, GroupBy #, OneHot, GroupBy, reindex +) + + +def result_from_exec(code_str, df_input): + CODE_PREAMBLE = "import polars as pl\nimport numpy as np\n" + CODE_PREAMBLE += "from buckaroo.auto_clean.auto_clean import smart_to_int\n" + RETRIEVE_RESULT_STR = '\n__ret_closure[0] = clean(__test_df)' + outer_scope_result = [0] + full_code_str = CODE_PREAMBLE + code_str + RETRIEVE_RESULT_STR + try: + exec(full_code_str, {'__test_df':df_input, '__ret_closure':outer_scope_result}) + except: + print("Failure calling exec with following code string") + print(full_code_str) + print(full_code_str) + return outer_scope_result[0] + +def assert_to_py_same_transform_df(command_kls, operations, test_df): + _a, _b, transform_df, transform_to_py = configure_buckaroo([command_kls]) + tdf_ops = [{'symbol': 'begin'}] + tdf_ops.extend(operations) + tdf = transform_df(tdf_ops, test_df.clone()) + py_code_string = transform_to_py(operations) + + edf = result_from_exec(py_code_string, test_df.clone()) + assert_frame_equal(tdf, edf) + return tdf +same = assert_to_py_same_transform_df + +def test_fillna(): + base_df = pl.DataFrame({ + 'a':[1,2,3,4,5], 'b': [None, 2, 2, 2, None]}) + + output_df = same(FillNA, [[s('fillna'), s('df'), "b", 100]], base_df) + assert output_df[0, 'b'] == 100 + +def test_dropcol(): + base_df = pl.DataFrame({ + 'a':np.random.randint(1, 10, 5), 'b':np.random.randint(1, 10, 5), + 'c':np.random.randint(1, 10, 5)}) + + same(DropCol, [[s('dropcol'), s('df'), "a"]], base_df) + +def test_groupby(): + base_df = pl.DataFrame({ + 'a':['cc', 'cc', 'cc', 'ee', 'ff'], 'b': [None, 2, 2, 2, None], + 'c': [10, 20, 30, 40, 50]}) + + output_df = same(GroupBy, [[s('groupby'), s('df'), "a", {'b':'count', 'c': 'sum'}]], base_df) + expected = pl.DataFrame( + {'a': ["ff", "ee", "cc"], + 'b(count)': [ 0, 1, 2], + 'c(sum)': [ 50, 40, 60]}, + schema=OrderedDict([('a', pl.Utf8), ('b(count)', pl.UInt32), ('c(sum)', pl.Int64)]) + ) + assert_frame_equal(output_df, expected) + + +''' + + +def test_onehot(): + base_df = pd.DataFrame({ + 'a':['cc', 'cc', 'dd', 'ee', 'ff'], 'b': [pd.NA, 2, 2, 2, pd.NA]}) + + output_df = same(OneHot, [[s('onehot'), s('df'), "a"]], base_df) + assert output_df.columns.to_list() == ['b', 'cc', 'dd', 'ee', 'ff'] + + +def test_reindex(): + base_df = pd.DataFrame({ + 'a':['ca', 'cb', 'cd', 'ee', 'ff'], 'b': [pd.NA, 2, 2, 2, pd.NA]}) + + output_df = same(reindex, [[s('reindex'), s('df'), "a"]], base_df) + assert output_df.index.to_list() == ['ca', 'cb', 'cd', 'ee', 'ff'] +''' From 57fa815e8a79826cc2c9b52b7b05d96867325c00 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 25 Nov 2023 10:25:31 -0500 Subject: [PATCH 196/250] fixed config to allow normal importing of fonts (#179) Fixes #178 Support loading font libraries --- .gitignore | 3 ++- webpack-local-dev.config.js | 42 ++++++++++++++++++------------------- webpack.config.js | 2 +- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 58444a9a2..781209f0f 100644 --- a/.gitignore +++ b/.gitignore @@ -160,4 +160,5 @@ buckaroo/nbextension/* buckaroo/labextension/* docs/*.js docs/*.js.map -docs/*js* \ No newline at end of file +docs/*js* +docs/source/_static/*woff* \ No newline at end of file diff --git a/webpack-local-dev.config.js b/webpack-local-dev.config.js index abec83f7b..e87e68cd2 100644 --- a/webpack-local-dev.config.js +++ b/webpack-local-dev.config.js @@ -23,26 +23,26 @@ const baseRules = [ { test: /\.js$/, loader: 'source-map-loader' }, { test: /\.css$/, use: ['style-loader', 'css-loader'] }, - { - test: /\.scss$/, - use: [ - // We're in dev and want HMR, SCSS is handled in JS - // In production, we want our css as files - "style-loader", - "css-loader", - { - loader: "postcss-loader", - options: { - postcssOptions: { - plugins: [ - ["postcss-preset-env"], - ], - }, - }, - }, - "sass-loader" - ], - }, + { + test: /\.scss$/, + use: [ + // We're in dev and want HMR, SCSS is handled in JS + // In production, we want our css as files + "style-loader", + "css-loader", + { + loader: "postcss-loader", + options: { + postcssOptions: { + plugins: [ + ["postcss-preset-env"], + ], + }, + }, + }, + "sass-loader" + ], + }, { test: luminoThemeImages, issuer: /\.css$/, @@ -51,7 +51,7 @@ const baseRules = [ }, }, { - test: /\.(jpg|png|gif)$/, + test: /\.(jpg|png|gif|woff|woff2)$/, exclude: luminoThemeImages, use: ['file-loader'], }, diff --git a/webpack.config.js b/webpack.config.js index 7563da307..d55587cd6 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -51,7 +51,7 @@ const baseRules = [ }, }, { - test: /\.(jpg|png|gif)$/, + test: /\.(jpg|png|gif|woff|woff2)$/, exclude: luminoThemeImages, use: ['file-loader'], }, From 93783f87ac0939f28ac302f9a28a8d777e9a5ea6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sun, 26 Nov 2023 10:38:45 -0500 Subject: [PATCH 197/250] trying some hypothesis tests (#181) Fixes #94 Investigate hypothesis testing library --- pyproject.toml | 1 + tests/unit/hypothesis_buckaroo.py | 44 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 tests/unit/hypothesis_buckaroo.py diff --git a/pyproject.toml b/pyproject.toml index 476f5572e..c2edced4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ test = [ "pandas<=1.3.5", "pytest-cov>=3", "pytest>=6", + "hypothesis>=6.88.1" ] jupyterlab = ["jupyterlab>=3.6.0"] diff --git a/tests/unit/hypothesis_buckaroo.py b/tests/unit/hypothesis_buckaroo.py new file mode 100644 index 000000000..693322a7b --- /dev/null +++ b/tests/unit/hypothesis_buckaroo.py @@ -0,0 +1,44 @@ +import hypothesis + +import buckaroo +from hypothesis import strategies as st +from hypothesis.extra.pandas import data_frames, column + + +@hypothesis.settings(deadline=10_000) +@hypothesis.given( + # TODO: write strategy to support n-Columns + df=st.one_of(data_frames(columns=[column(elements=st.integers())]), + data_frames(columns=[column(elements=st.floats())]), + data_frames(columns=[column(elements=st.text())]), + data_frames(columns=[column(elements= + st.dictionaries(st.text(), st.integers()))]), + data_frames(columns=[column(elements= + st.lists(st.text()))])), + sampled=st.booleans(), + summaryStats=st.booleans(), + reorderdColumns=st.booleans(), + showCommands=st.booleans(), + postProcessingF=st.none(), +) +def test_fuzz_BuckarooWidget( + df, + sampled, + summaryStats, + reorderdColumns, + showCommands, + postProcessingF, +): + + #debug=True will cause an analysis error to throw an error, + #auto_clean is tempermental and not turned on by default + buckaroo.BuckarooWidget( + df=df, + sampled=sampled, + summaryStats=summaryStats, + reorderdColumns=reorderdColumns, + showCommands=showCommands, + auto_clean=False, + postProcessingF=postProcessingF, + debug=True + ) From 97d4d91d54b9b7ed2a6a3041bffbc2da7953b179 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sun, 26 Nov 2023 14:34:39 -0500 Subject: [PATCH 198/250] updated youtube link in docs to latest video (#183) --- docs/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index adec41348..fa86774d3 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,7 +12,7 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell .. raw:: html - + .. toctree:: From 4af173b09829750315158e010e57551584fff755 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sun, 26 Nov 2023 14:50:07 -0500 Subject: [PATCH 199/250] Chore/docs update youtube link2 (#184) * updated youtube link in docs to latest video try2 --- docs/source/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index fa86774d3..e9bf16b1f 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,7 +12,8 @@ We all know how awkward it is to clean data in jupyter notebooks. Multiple cell .. raw:: html - + + .. toctree:: From 87cc9fb70dcc64b30e3fc6aa1cabcfb6f19e0a6a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sun, 26 Nov 2023 15:01:09 -0500 Subject: [PATCH 200/250] Update README.md (#185) --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index af1609a98..9d2fc5570 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,13 @@ Buckaroo is a modern data table for Jupyter that expedites the most common exploratory data analysis tasks. The most basic data analysis task - looking at the raw data, is cumbersome with the existing pandas tooling. Buckaroo starts with a modern performant data table that displays up to 10k rows, is sortable, has value formatting, and scrolls. On top of the core table experience extra features like summary stats, histograms, smart sampling, auto-cleaning, and a low code UI are added. All of the functionality has sensible defaults that can be overridden to customize the experience for your workflow. +Polars-Buckaroo + + ## Try it today * [Buckaroo full tour](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb)[![Open In Colab](https://camo.githubusercontent.com/52feade06f2fecbf006889a904d221e6a730c194/68747470733a2f2f636f6c61622e72657365617263682e676f6f676c652e636f6d2f6173736574732f636f6c61622d62616467652e737667)](https://colab.research.google.com/github/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb) Notebook -![Buckaroo Screenshot](https://raw.githubusercontent.com/paddymul/buckaroo-assets/main/quick-buckaroo.gif) - ## Quick start run `pip install buckaroo` From 86df365278ac6933f7266c0b055a2ff90b072e9a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 22 Dec 2023 14:45:52 -0500 Subject: [PATCH 201/250] Feat/polars analysis (#182) 0.5.0 Release * Significant refactor of the pluggable analysis framework to accomodate polars * First class polars backend * extensive tests added --- README.md | 2 +- buckaroo/_version.py | 2 +- buckaroo/buckaroo_widget.py | 23 +- buckaroo/customizations/analysis.py | 226 ++++------ buckaroo/customizations/analysis_utils.py | 14 + buckaroo/customizations/down_sample.py | 16 +- buckaroo/customizations/histogram.py | 137 ++++++ buckaroo/customizations/polars_analysis.py | 232 ++++++++++ .../analysis_management.py | 174 +++----- .../pluggable_analysis_framework.py | 42 +- .../polars_analysis_management.py | 117 ++++++ .../polars_utils.py | 19 + .../safe_summary_df.py | 102 +++++ .../pluggable_analysis_framework/utils.py | 83 ++++ buckaroo/polars_buckaroo.py | 16 + buckaroo/serialization_utils.py | 51 ++- buckaroo/widget_utils.py | 5 +- docs/source/articles/related_projects.rst | 1 + docs/source/conf.py | 2 +- example-notebooks/Customizing-Buckaroo.ipynb | 397 ++++++++++++++++++ example-notebooks/Full-tour.ipynb | 334 +-------------- full_build.sh | 2 +- package.json | 2 +- pyproject.toml | 9 +- tests/unit/analysis_management_test.py | 185 ++++++-- tests/unit/analysis_test.py | 120 +++++- tests/unit/basic_widget_test.py | 7 +- tests/unit/fixtures.py | 30 +- tests/unit/polars_analysis_management_test.py | 168 ++++++++ tests/unit/polars_basic_widget_test.py | 16 + tests/unit/safe_summary_test.py | 12 + tests/unit/serialization_pydantic_tests.py | 219 ++++++++++ tests/unit/serialization_utils_test.py | 22 +- 33 files changed, 2093 insertions(+), 694 deletions(-) create mode 100644 buckaroo/customizations/analysis_utils.py create mode 100644 buckaroo/customizations/histogram.py create mode 100644 buckaroo/customizations/polars_analysis.py create mode 100644 buckaroo/pluggable_analysis_framework/polars_analysis_management.py create mode 100644 buckaroo/pluggable_analysis_framework/polars_utils.py create mode 100644 buckaroo/pluggable_analysis_framework/safe_summary_df.py create mode 100644 buckaroo/pluggable_analysis_framework/utils.py create mode 100644 buckaroo/polars_buckaroo.py create mode 100644 example-notebooks/Customizing-Buckaroo.ipynb create mode 100644 tests/unit/polars_analysis_management_test.py create mode 100644 tests/unit/polars_basic_widget_test.py create mode 100644 tests/unit/safe_summary_test.py create mode 100644 tests/unit/serialization_pydantic_tests.py diff --git a/README.md b/README.md index 9d2fc5570..7c4c2d093 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ git clone https://github.com/paddymul/buckaroo.git cd buckaroo #we need to build against 3.6.5, jupyterlab 4.0 has different JS typing that conflicts # the installable still works in JL4 -pip install build twine pytest sphinx-build jupyterlab==3.6.5 +pip install build twine pytest sphinx polars mypy jupyterlab==3.6.5 pandas-stubs pip install -ve . ``` diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 3720e2160..72f2b47fa 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.4.8" +__version__ = "0.5.0" diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 259f639a9..d981e457a 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -20,14 +20,14 @@ from .auto_clean.auto_clean import get_auto_type_operations, get_typing_metadata, recommend_type from .customizations.down_sample import sample -from .customizations.analysis import (TypingStats, DefaultSummaryStats, ColDisplayHints) -from .pluggable_analysis_framework.analysis_management import DfStats, get_df_name +from .customizations.analysis import (TypingStats, ComputedDefaultSummaryStats, DefaultSummaryStats, ColDisplayHints) +from .customizations.histogram import (Histogram) +from .pluggable_analysis_framework.analysis_management import DfStats +from .pluggable_analysis_framework.utils import get_df_name from .serialization_utils import df_to_obj, EMPTY_DF_OBJ - - FAST_SUMMARY_WHEN_GREATER = 1_000_000 class BuckarooWidget(DOMWidget): """TODO: Add docstring here @@ -43,7 +43,11 @@ class BuckarooWidget(DOMWidget): operations = List().tag(sync=True) machine_gen_operations = List().tag(sync=True) command_classes = DefaultCommandKlsList - analysis_classes = [TypingStats, DefaultSummaryStats, ColDisplayHints] + analysis_classes = [TypingStats, DefaultSummaryStats, + Histogram, + ComputedDefaultSummaryStats, + ColDisplayHints] + DFStatsClass = DfStats typing_metadata_f = staticmethod(get_typing_metadata) typing_recommend_f = staticmethod(recommend_type) @@ -65,7 +69,7 @@ class BuckarooWidget(DOMWidget): 'summaryStats': False, 'reorderdColumns': False, 'showCommands': True, - 'auto_clean': True, + 'auto_clean': False, }).tag(sync=True) @@ -94,7 +98,7 @@ def __init__(self, df, summaryStats=False, reorderdColumns=False, showCommands=False, - auto_clean=True, + auto_clean=False, postProcessingF=None, debug=False ): @@ -207,9 +211,9 @@ def get_working_df(self): def set_typed_df(self, new_df): self.typed_df = new_df # stats need to be rerun each time - self.stats = DfStats( + self.stats = self.DFStatsClass( self.typed_df, - [TypingStats, DefaultSummaryStats, ColDisplayHints], + self.analysis_classes, self.df_name, debug=self.debug) self.summary_df_json = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) self.update_based_on_df_config(3) @@ -245,3 +249,4 @@ def add_analysis(self, analysis_obj): self.summary_df_json = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) #just trigger redisplay self.update_based_on_df_config(3) + diff --git a/buckaroo/customizations/analysis.py b/buckaroo/customizations/analysis.py index 868c2aef2..9f8bb1e10 100644 --- a/buckaroo/customizations/analysis.py +++ b/buckaroo/customizations/analysis.py @@ -1,5 +1,6 @@ import pandas as pd import numpy as np +from buckaroo.customizations.analysis_utils import int_digits from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis import warnings @@ -42,54 +43,55 @@ def get_mode(ser): class TypingStats(ColAnalysis): provides_summary = [ - 'dtype', 'is_numeric', 'is_integer', 'is_datetime',] + 'dtype', 'is_numeric', 'is_integer', 'is_datetime', 'is_bool', 'is_float', '_type'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def series_summary(sampled_ser, ser): return dict( dtype=ser.dtype, is_numeric=pd.api.types.is_numeric_dtype(ser), is_integer=pd.api.types.is_integer_dtype(ser), is_datetime=probable_datetime(ser), - memory_usage=ser.memory_usage() - ) + is_bool=pd.api.types.is_bool_dtype(ser), + is_float=pd.api.types.is_float_dtype(ser), + is_string=pd.api.types.is_string_dtype(ser), + memory_usage=ser.memory_usage()) + + @staticmethod + def computed_summary(summary_dict): + _type = "obj" + if summary_dict['is_bool']: + _type = "boolean" + elif summary_dict['is_numeric']: + if summary_dict['is_float']: + _type = "float" + else: + _type = "integer" + #elif pd.api.types.is_datetime64_any_dtype(ser): + elif summary_dict['is_datetime']: + _type = 'datetime' + elif summary_dict['is_string']: + _type = "string" + return dict(_type=_type) class DefaultSummaryStats(ColAnalysis): provides_summary = [ - 'length', 'min', 'max', 'mean', 'nan_count', 'distinct_count', - 'distinct_per', 'empty_count', 'empty_per', 'unique_per', 'nan_per', - 'mode'] + 'length', 'min', 'max', 'mean', 'nan_count', + 'value_counts', 'mode'] - summary_stats_display = [ - 'dtype', - 'length', 'nan_count', 'distinct_count', 'empty_count', - 'empty_per', 'unique_per', 'nan_per', 'is_numeric', 'is_integer', - 'is_datetime', 'mode', 'min', 'max','mean'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def series_summary(sampled_ser, ser): l = len(ser) - val_counts = ser.value_counts() - distinct_count= len(val_counts) + value_counts = ser.value_counts() nan_count = l - len(ser.dropna()) - unique_count = len(val_counts[val_counts==1]) - try: - empty_count = val_counts.get('', 0) - except: - empty_count = 0 - is_numeric = pd.api.types.is_numeric_dtype(ser) is_bool = pd.api.types.is_bool_dtype(ser) base_d = dict( length=l, nan_count=nan_count, - distinct_count=distinct_count, - distinct_per=distinct_count/l, - empty_count=empty_count, - empty_per=empty_count/l, - unique_per=unique_count/l, - nan_per=nan_count/l, + value_counts=value_counts, mode=get_mode(ser), min=np.nan, max=np.nan) @@ -100,140 +102,54 @@ def summary(sampled_ser, summary_ser, ser): 'max': ser.dropna().max()}) return base_d -def int_digits(n): - if pd.isna(n): - return 1 - if np.isnan(n): - return 1 - if n == 0: - return 1 - if np.sign(n) == -1: - return int(np.floor(np.log10(np.abs(n)))) + 2 - return int(np.floor(np.log10(n)+1)) - - - -def numeric_histogram_labels(endpoints): - left = endpoints[0] - labels = [] - for edge in endpoints[1:]: - labels.append("{:.0f}-{:.0f}".format(left, edge)) - left = edge - return labels -#histogram_labels(endpoints) - -def numeric_histogram(arr, nan_per): - ret_histo = [] - nan_observation = {'name':'NA', 'NA':np.round(nan_per*100, 0)} - if nan_per == 1.0: - return [nan_observation] - - vals = arr.dropna() - low_tail, high_tail = np.quantile(vals, 0.01), np.quantile(vals, 0.99) - low_pass = arr>low_tail - high_pass = arr < high_tail - meat = vals[low_pass & high_pass] - populations, endpoints =np.histogram(meat, 10) - - labels = numeric_histogram_labels(endpoints) - normalized_pop = populations / populations.sum() - low_label = "%r - %r" % (vals.min(), low_tail) - high_label = "%r - %r" % (high_tail, vals.max()) - ret_histo.append({'name': low_label, 'tail':1}) - for label, pop in zip(labels, normalized_pop): - ret_histo.append({'name': label, 'population':np.round(pop * 100, 0)}) - high_label = "%r - %r" % (high_tail, vals.max()) - ret_histo.append({'name': high_label, 'tail':1}) - if nan_per > 0.0: - ret_histo.append(nan_observation) - return ret_histo - -def categorical_dict(ser, val_counts, top_n_positions=7): - l = len(ser) - top = min(len(val_counts), top_n_positions) - - - top_vals = val_counts.iloc[:top] - #top_percentage = top_vals.sum() / l - #if len(val_counts) > 5 and top_percentage < .05: - - rest_vals = val_counts.iloc[top:] - try: - histogram = top_vals.to_dict() - except TypeError: - top_vals.index = top_vals.index.map(str) - histogram = top_vals.to_dict() - - full_long_tail = rest_vals.sum() - unique_count = sum(val_counts == 1) - long_tail = full_long_tail - unique_count - if unique_count > 0: - histogram['unique'] = np.round( (unique_count/l)* 100, 0) - if long_tail > 0: - histogram['longtail'] = np.round((long_tail/l) * 100,0) - return histogram - -def categorical_histogram(ser, val_counts, nan_per, top_n_positions=7): - nan_observation = {'name':'NA', 'NA':np.round(nan_per*100, 0)} - cd = categorical_dict(ser, val_counts, top_n_positions) - - l = len(ser) - histogram = [] - longtail_obs = {'name': 'longtail'} - for k,v in cd.items(): - if k in ["longtail", "unique"]: - longtail_obs[k] = v - continue - histogram.append({'name':k, 'cat_pop': np.round((v/l)*100,0) }) - if len(longtail_obs) > 1: - histogram.append(longtail_obs) - if nan_per > 0.0: - histogram.append(nan_observation) - return histogram - - -def histogram(ser, nan_per): - is_numeric = pd.api.types.is_numeric_dtype(ser.dtype) - val_counts = ser.value_counts() - if is_numeric and len(val_counts)>5: - temp_histo = numeric_histogram(ser, nan_per) - if len(temp_histo) > 5: - #if we had basically a categorical variable encoded into an integer.. don't return it - return temp_histo - return categorical_histogram(ser, val_counts, nan_per) +class ComputedDefaultSummaryStats(ColAnalysis): + + summary_stats_display = [ + 'dtype', + 'length', 'nan_count', 'distinct_count', 'empty_count', + 'empty_per', 'unique_per', 'is_numeric', 'is_integer', + 'is_datetime', 'mode', 'min', 'max','mean'] + + requires_summary = ['length', 'nan_count', + 'value_counts'] + provides_summary = ['distinct_per', 'empty_per', 'unique_per', 'nan_per', + 'unique_count', 'empty_count', 'distinct_count'] + + @staticmethod + def computed_summary(summary_dict): + l = summary_dict['length'] + value_counts = summary_dict['value_counts'] + try: + empty_count = value_counts.get('', 0) + except: + empty_count = 0 + distinct_count=len(value_counts) + unique_count = len(value_counts[value_counts==1]) + + return dict( + unique_count=unique_count, + empty_count=empty_count, + distinct_count=distinct_count, + distinct_per=distinct_count/l, + empty_per=empty_count/l, + unique_per=unique_count/l, + nan_per=summary_dict['nan_count']/l) + class ColDisplayHints(ColAnalysis): - requires_summary = ['min', 'max', 'nan_per'] + requires_summary = ['min', 'max', '_type'] provides_summary = [ - 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram', 'type', 'formatter'] + 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'type', 'formatter'] @staticmethod - def summary(sampled_ser, summary_ser, ser): - is_numeric = pd.api.types.is_numeric_dtype(sampled_ser) - is_bool = pd.api.types.is_bool_dtype(sampled_ser) - _type = "obj" - extras = {} - if is_bool: - _type = "boolean" - elif is_numeric: - if pd.api.types.is_float_dtype(sampled_ser): - _type = "float" - else: - _type = "integer" - elif pd.api.types.is_datetime64_any_dtype(ser): - extras = {'type':'datetime', 'formatter': 'default'} - elif pd.api.types.is_string_dtype(sampled_ser): - _type = "string" - base_dict = dict( - type=_type, - is_numeric=is_numeric, - is_integer=pd.api.types.is_integer_dtype(sampled_ser), - histogram=histogram(sampled_ser, summary_ser['nan_per'])) - base_dict.update(extras) - if is_numeric and not is_bool: + def computed_summary(summary_dict): + base_dict = {'type':summary_dict['_type']} + if summary_dict['is_datetime']: + base_dict['formatter'] = 'default' + if summary_dict['is_numeric'] and not summary_dict['is_bool']: base_dict.update({ - 'min_digits':int_digits(summary_ser.loc['min']), - 'max_digits':int_digits(summary_ser.loc['max']), + 'min_digits':int_digits(summary_dict['min']), + 'max_digits':int_digits(summary_dict['max']), }) return base_dict diff --git a/buckaroo/customizations/analysis_utils.py b/buckaroo/customizations/analysis_utils.py new file mode 100644 index 000000000..446b5b27c --- /dev/null +++ b/buckaroo/customizations/analysis_utils.py @@ -0,0 +1,14 @@ +import numpy as np +import pandas as pd + + +def int_digits(n): + if pd.isna(n): + return 1 + if np.isnan(n): + return 1 + if n == 0: + return 1 + if np.sign(n) == -1: + return int(np.floor(np.log10(np.abs(n)))) + 2 + return int(np.floor(np.log10(n)+1)) \ No newline at end of file diff --git a/buckaroo/customizations/down_sample.py b/buckaroo/customizations/down_sample.py index a25bd2460..e5db9084a 100644 --- a/buckaroo/customizations/down_sample.py +++ b/buckaroo/customizations/down_sample.py @@ -11,11 +11,23 @@ def get_outlier_idxs(ser): return outlier_idxs -def sample(df, sample_size=500, include_outliers=True): +def polars_sample(df, sample_size=500, include_outliers=False): + return df.sample(min(len(df), sample_size)) + +def sample(df, sample_size=500, include_outliers=False): + include_outliers = False if len(df) <= sample_size: return df - sdf = df.sample(np.min([sample_size, len(df)])) + try: + import polars + if isinstance(df, polars.DataFrame): + return polars_sample(df, sample_size, include_outliers) + except ImportError: + pass + sdf = df.sample(np.min([sample_size, len(df)])) + if True: + return sdf #non_unique indexes are very slow if include_outliers and sdf.index.is_unique: outlier_idxs = [] diff --git a/buckaroo/customizations/histogram.py b/buckaroo/customizations/histogram.py new file mode 100644 index 000000000..d67e22a83 --- /dev/null +++ b/buckaroo/customizations/histogram.py @@ -0,0 +1,137 @@ +import pandas as pd +import numpy as np +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis + +import numpy.typing as npt +from typing_extensions import TypedDict +from typing import List, Tuple, Any + + +def numeric_histogram_labels(endpoints): + left = endpoints[0] + labels = [] + for edge in endpoints[1:]: + labels.append("{:.0f}-{:.0f}".format(left, edge)) + left = edge + return labels + +def categorical_dict(len_, val_counts, top_n_positions=7): + top = min(len(val_counts), top_n_positions) + top_vals = val_counts.iloc[:top] + + rest_vals = val_counts.iloc[top:] + try: + histogram = top_vals.to_dict() + except TypeError: + top_vals.index = top_vals.index.map(str) + histogram = top_vals.to_dict() + + full_long_tail = rest_vals.sum() + unique_count = sum(val_counts == 1) + long_tail = full_long_tail - unique_count + if unique_count > 0: + histogram['unique'] = np.round( (unique_count/len_)* 100, 0) + if long_tail > 0: + histogram['longtail'] = np.round((long_tail/len_) * 100,0) + return histogram + + +def categorical_histogram(length:int, val_counts, nan_per:float, top_n_positions=7): + nan_observation = {'name':'NA', 'NA':np.round(nan_per*100, 0)} + cd = categorical_dict(length, val_counts, top_n_positions) + + histogram = [] + longtail_obs = {'name': 'longtail'} + for k,v in cd.items(): + if k in ["longtail", "unique"]: + longtail_obs[k] = v + continue + histogram.append({'name':k, 'cat_pop': np.round((v/length)*100,0) }) + if len(longtail_obs) > 1: + histogram.append(longtail_obs) + if nan_per > 0.0: + histogram.append(nan_observation) + return histogram + +histogram_args = TypedDict('histogram_args', { + 'meat_histogram': Tuple[npt.NDArray[np.intp], npt.NDArray[Any]], + 'low_tail': float, 'high_tail':float}) + +class Histogram_Args(TypedDict): + meat_histogram: Tuple[List[int], List[float]] + normalized_populations:List[float] + low_tail: float + high_tail: float + +def numeric_histogram(histogram_args: Histogram_Args , min_, max_, nan_per): + + low_tail, high_tail = histogram_args['low_tail'], histogram_args['high_tail'] + ret_histo = [] + nan_observation = {'name':'NA', 'NA':np.round(nan_per*100, 0)} + if nan_per == 1.0: + return [nan_observation] + + populations, endpoints = histogram_args['meat_histogram'] + + labels = numeric_histogram_labels(endpoints) + #normalized_pop = populations / populations.sum() + normalized_pop = histogram_args['normalized_populations'] + low_label = "%r - %r" % (min_, low_tail) + + ret_histo.append({'name': low_label, 'tail':1}) + for label, pop in zip(labels, normalized_pop): + ret_histo.append({'name': label, 'population':np.round(pop * 100, 0)}) + high_label = "%r - %r" % (high_tail, max_) + ret_histo.append({'name': high_label, 'tail':1}) + if nan_per > 0.0: + ret_histo.append(nan_observation) + return ret_histo + + +class Histogram(ColAnalysis): + + @staticmethod + def series_summary(sampled_ser, ser): + if not pd.api.types.is_numeric_dtype(ser): + return dict(histogram_args={}) + if pd.api.types.is_bool_dtype(ser): + return dict(histogram_args={}) + vals = ser.dropna() + if len(vals) == 0: + return dict(histogram_args={}) + low_tail = np.quantile(vals, 0.01) + high_tail = np.quantile(vals, 0.99) + low_pass = ser > low_tail + high_pass = ser < high_tail + meat = vals[low_pass & high_pass] + + if len(meat) == 0: + return dict(histogram_args={}) + + meat_histogram=np.histogram(meat, 10) + populations, _ = meat_histogram + return dict( + histogram_args=dict( + meat_histogram=meat_histogram, + normalized_populations=(populations/populations.sum()).tolist(), + low_tail=low_tail, + high_tail=high_tail)) + + requires_summary = ['value_counts', 'nan_per', 'is_numeric', 'length', + 'min', 'max',] + provides_summary = ['histogram', 'histogram_args'] + + @staticmethod + def computed_summary(summary_dict): + is_numeric = summary_dict['is_numeric'] + value_counts = summary_dict['value_counts'] + nan_per = summary_dict['nan_per'] + if is_numeric and len(value_counts) > 5: + histogram_args = summary_dict['histogram_args'] + min_, max_ = summary_dict['min'], summary_dict['max'] + temp_histo = numeric_histogram(histogram_args, min_, max_, nan_per) + if len(temp_histo) > 5: + #if we had basically a categorical variable encoded into an integer.. don't return it + return {'histogram': temp_histo} + length = summary_dict['length'] + return {'histogram':categorical_histogram(length, value_counts, nan_per)} diff --git a/buckaroo/customizations/polars_analysis.py b/buckaroo/customizations/polars_analysis.py new file mode 100644 index 000000000..66767ccbe --- /dev/null +++ b/buckaroo/customizations/polars_analysis.py @@ -0,0 +1,232 @@ +import polars as pl +import numpy as np +from polars import functions as F +from polars import datatypes as pdt +from buckaroo.customizations.analysis_utils import int_digits + +from buckaroo.pluggable_analysis_framework.polars_analysis_management import PolarsAnalysis +from buckaroo.pluggable_analysis_framework.polars_utils import NUMERIC_POLARS_DTYPES +from buckaroo.pluggable_analysis_framework.utils import json_postfix +from buckaroo.customizations.histogram import numeric_histogram +from typing import Dict + +def get_mode(ser): + mode_raw = ser.mode() + if len(mode_raw) == 0: + return np.nan + else: + return mode_raw.values[0] + +""" +to best take advantage of the DAG and pluggable_analysis_framework, structure your code as follows +a single ColAnalysis can return multiple facts, but those facts shouldn't be interdepedent +That way individual facts can be overridden via the DAG machinery, and other facts that depend on them will +get the proper value + +Overtime codebases will probably trend towards many classes with single facts, but it doesn't have to be that way. Code what comes naturally to you + + +""" + + + + +class ComputedDefaultSummaryStats(PolarsAnalysis): + summary_stats_display = [ + 'dtype', + 'length', 'nan_count', 'distinct_count', 'empty_count', + 'empty_per', 'unique_per', 'is_numeric', + 'mode', 'min', 'max','mean'] + + requires_summary = ['length', 'nan_count', + 'unique_count', 'empty_count', 'distinct_count'] + provides_summary = ['distinct_per', 'empty_per', 'unique_per', 'nan_per'] + + + @staticmethod + def computed_summary(summary_dict): + len_ = summary_dict['length'] + + return dict( + distinct_per=summary_dict['distinct_count']/len_, + empty_per=summary_dict.get('empty_count',0)/len_, + unique_per=summary_dict['unique_count']/len_, + nan_per=summary_dict['nan_count']/len_) + + +class VCAnalysis(PolarsAnalysis): + provides_summary = ['value_counts'] + select_clauses = [ + pl.all().exclude("counts").value_counts(sort=True) + .implode().name.map(json_postfix('value_counts')), + pl.selectors.matches("^counts$") + .alias("not_counts") + .value_counts(sort=True) + .implode() + .alias("counts").name.map(json_postfix('value_counts'))] + + +class BasicAnalysis(PolarsAnalysis): + provides_summary = ['length', 'nan_count', 'min', 'max', 'min', + 'mode', 'mean','unique_count', 'empty_count', + 'distinct_count'] + select_clauses = [ + F.all().len().name.map(json_postfix('length')), + F.all().null_count().name.map(json_postfix('nan_count')), + F.all().min().name.map(json_postfix('min')), + F.all().max().name.map(json_postfix('max')), + F.all().mean().name.map(json_postfix('mean')), + F.col(pl.Utf8).str.count_matches("^$").sum().name.map(json_postfix('empty_count')), + F.all().approx_n_unique().name.map(json_postfix('distinct_count')), + (F.all().len() - F.all().is_duplicated().sum()).name.map(json_postfix('unique_count')), + ] + + @staticmethod + def computed_summary(summary_dict): + temp_df = pl.DataFrame({'vc': summary_dict['value_counts'].explode()}).unnest('vc') + regular_col_vc_df = temp_df.select(pl.all().exclude('counts').alias('key'), pl.col('counts')) + return dict(mode=regular_col_vc_df[0]['key'][0]) + + +class PlTyping(PolarsAnalysis): + column_ops = {'dtype': ("all", lambda col_series: col_series.dtype)} + provides_summary = ['dtype', '_type', 'is_numeric'] + + + @staticmethod + def computed_summary(summary_dict): + dt = summary_dict['dtype'] + + res = {'is_numeric': False} + + if dt in pdt.INTEGER_DTYPES: + t = 'integer' + elif dt in pdt.DATETIME_DTYPES: + t = 'datetime' + elif dt in pdt.FLOAT_DTYPES: + t = 'float' + elif dt == pdt.Utf8: + t = 'string' + elif dt == pdt.Boolean: + t = 'boolean' + else: + t = 'unknown' + if t in ('integer', 'float'): + res['is_numeric'] = True + res['_type'] = t + return res + +def normalize_polars_histogram_ser(ser): + df = pl.DataFrame({'named_col':ser}) + + C = pl.col('named_col') + small_q, large_q = C.quantile(.01).alias('small'), C.quantile(.99).alias('large') + smallest, largest = df.select(small_q, large_q).to_numpy()[0] + + meat_df = df.lazy().filter( + (small_q < C) & (C < large_q) + ).select(C).collect()['named_col'] + if len(meat_df) == 0: + return { 'low_tail': smallest, 'high_tail':largest, + 'meat_histogram': [[],[]], 'normalized_populations': []} + raw_hist = meat_df.hist(bin_count=10, include_breakpoint=True) + hist_df = raw_hist.select(pl.col("break_point"), pl.selectors.ends_with("count").alias("count")) + edges = hist_df['break_point'].to_list() + edges[0], edges[-1] = smallest, largest + counts = hist_df['count'][1:] + norm_counts = counts/counts.sum() + return { 'low_tail': smallest, 'high_tail':largest, + 'meat_histogram': (counts.to_list(), edges), + 'normalized_populations': norm_counts.to_list()} + + +def categorical_dict_from_vc(vc_ser, top_n_positions=7) -> Dict[str, int]: + temp_df = pl.DataFrame({'vc': vc_ser.explode()}).unnest('vc') + regular_col_vc_df = temp_df.select(pl.all().exclude('count').alias('key'), pl.col('count')) + length = regular_col_vc_df['count'].sum() + normalized_counts = regular_col_vc_df['count'] / length + nml_df = pl.DataFrame({'key':regular_col_vc_df['key'], 'normalized_count':normalized_counts}) + + #filter out small categories + significant_categories_df = nml_df.filter(pl.col('normalized_count') > .05) + relevant_length = min(len(significant_categories_df), top_n_positions) + cat_df = significant_categories_df[:relevant_length] + + #everything that isn't a named category. relevant_length still applies + full_long_tail = regular_col_vc_df['count'][relevant_length:].sum() + unique_count = regular_col_vc_df['count'].eq(1).cum_sum()[-1] + + actual_long_tail = full_long_tail - unique_count + + categorical_histogram = dict(zip(cat_df['key'].to_list(), cat_df['normalized_count'].to_list())) + categorical_histogram['longtail'] = actual_long_tail/length + categorical_histogram['unique'] = unique_count/length + return categorical_histogram + + +def categorical_histogram_from_cd(cd, nan_per): + histogram = [] + longtail_obs = {'name': 'longtail'} + unique_obs = {'name': 'unique'} + for k,v in cd.items(): + if k == "longtail": + longtail_obs['longtail'] = np.round((v)*100,0) + continue + elif k == "unique": + unique_obs['unique'] = np.round((v)*100,0) + continue + histogram.append({'name':k, 'cat_pop': np.round((v)*100,0) }) + if longtail_obs['longtail'] > 0: + histogram.append(longtail_obs) + if unique_obs['unique'] > 0: + histogram.append(unique_obs) + nan_observation = {'name':'NA', 'NA':np.round(nan_per*100, 0)} + if nan_per > 0.0: + histogram.append(nan_observation) + return histogram + +class HistogramAnalysis(PolarsAnalysis): + + column_ops = { + 'histogram_args': (NUMERIC_POLARS_DTYPES, normalize_polars_histogram_ser)} + + requires_summary = ['min', 'max', 'value_counts', 'length', 'unique_count', 'is_numeric', 'nan_per'] + provides_summary = ['categorical_histogram', 'histogram'] + + @staticmethod + def computed_summary(summary_dict): + vc = summary_dict['value_counts'] + cd = categorical_dict_from_vc(vc) + is_numeric = summary_dict['is_numeric'] + nan_per = summary_dict['nan_per'] + if is_numeric and len(vc.explode()) > 5: + #histogram_args = summary_dict['histogram_args'] + histogram_args = summary_dict['histogram_args'] + min_, max_, nan_per = summary_dict['min'], summary_dict['max'], summary_dict['nan_per'] + temp_histo = numeric_histogram(histogram_args, min_, max_, nan_per) + if len(temp_histo) > 5: + #if we had basically a categorical variable encoded into an integer.. don't return it + return {'histogram': temp_histo} + return {'categorical_histogram': cd, 'histogram' : categorical_histogram_from_cd(cd, nan_per)} + +class PlColDisplayHints(PolarsAnalysis): + requires_summary = ['min', 'max', '_type', 'is_numeric'] + provides_summary = [ + 'min_digits', 'max_digits', 'type', 'formatter'] + + @staticmethod + def computed_summary(summary_dict): + base_dict = {'type':summary_dict['_type']} + if summary_dict['_type'] == 'datetime': + base_dict['formatter'] = 'default' + if summary_dict['is_numeric']: + base_dict.update({ + 'min_digits':int_digits(summary_dict['min']), + 'max_digits':int_digits(summary_dict['max']), + }) + return base_dict + +PL_Analysis_Klasses = [VCAnalysis, BasicAnalysis, PlTyping, PlColDisplayHints, + HistogramAnalysis, + ComputedDefaultSummaryStats] + diff --git a/buckaroo/pluggable_analysis_framework/analysis_management.py b/buckaroo/pluggable_analysis_framework/analysis_management.py index 8d706239f..5d36da975 100644 --- a/buckaroo/pluggable_analysis_framework/analysis_management.py +++ b/buckaroo/pluggable_analysis_framework/analysis_management.py @@ -1,146 +1,108 @@ -import sys +from collections import defaultdict import traceback import warnings import numpy as np -import pandas as pd +from buckaroo.pluggable_analysis_framework.safe_summary_df import output_full_reproduce, output_reproduce_preamble, safe_summary_df + +from buckaroo.pluggable_analysis_framework.utils import BASE_COL_HINT, FAST_SUMMARY_WHEN_GREATER, PERVERSE_DF, NonExistentSummaryRowException from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( order_analysis, check_solvable) -from buckaroo.serialization_utils import pd_py_serialize, pick, d_update - -FAST_SUMMARY_WHEN_GREATER = 1_000_000 - -PERVERSE_DF = pd.DataFrame({ - 'all_nan': [np.nan] * 10, - 'all_false': [False] * 10, - 'all_True': [True] * 10, - 'mixed_bool': np.concatenate([[True]*5, [False]*5]), - 'mixed_float': np.concatenate([[0.5, np.nan, None], [6]*7]), - 'float': [0.5]*10, - 'int': [8] *10, - 'negative': [-1]*10, - 'UInt32': pd.Series([5]*10, dtype='UInt32'), - 'UInt8None':pd.Series([None] * 10, dtype='UInt8') - }) - - -BASE_COL_HINT = { - 'type':'string', - 'is_numeric': False, - 'is_integer': None, - 'min_digits':None, - 'max_digits':None, - 'formatter':None, - 'histogram': []} - - - -def get_df_name(df, level=0): - """ looks up the call stack until it finds the variable with this name""" - if level == 0: - _globals = globals() - elif level < 60: - try: - call_frame = sys._getframe(level) - _globals = call_frame.f_globals - except ValueError: - return None #we went to far up the stacktrace to a non-existent frame - else: - return None - - name_possibs = [x for x in _globals.keys() if _globals[x] is df] - if name_possibs: - return name_possibs[0] - else: - #+2 because the function is recursive, and we need to skip over this frame - return get_df_name(df, level + 2) - -def safe_summary_df(base_summary_df, index_list): - #there are instances where not all indexes of the summary_df will - #be available, because there was no valid data to produce those - #indexes. This fixes them and explicitly. Empty rows will have NaN - return pd.DataFrame(base_summary_df, index_list) - -def reproduce_summary(ser_name, kls, summary_df, err, operating_df_name): - ssdf = safe_summary_df(summary_df, kls.requires_summary) - summary_ser = ssdf[ser_name] - minimal_summary_dict = pick(summary_ser, kls.requires_summary) - sum_ser_repr = "pd.Series(%s)" % pd_py_serialize(minimal_summary_dict) +from buckaroo.serialization_utils import pick, d_update - f = "{kls}.summary({df_name}['{ser_name}'], {summary_ser_repr}, {df_name}['{ser_name}']) # {err_msg}" - print(f.format( - kls=kls.cname(), df_name=operating_df_name, ser_name=ser_name, - summary_ser_repr=sum_ser_repr, err_msg=err)) +def produce_series_df(df, ordered_objs, df_name='test_df', debug=False): + """ just executes the series methods -def output_reproduce_preamble(): - print("#Reproduction code") - print("#" + "-" * 80) - print("from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF") - -def output_full_reproduce(errs, summary_df, df_name): - if len(errs) == 0: - raise Exception("output_full_reproduce called with 0 len errs") - - try: - for ser_name, err_kls in errs.items(): - err, kls = err_kls - reproduce_summary(ser_name, kls, summary_df, err, df_name) - except Exception: - #this is tricky stuff that shouldn't error, I want these stack traces to escape being caught - traceback.print_exc() + """ + errs = {} + series_stats = defaultdict(lambda: {}) + for ser_name in df.columns: + ser = df[ser_name] + #FIXME: actually sample the series. waiting until I have time + #to proeprly benchmark + sampled_ser = ser + for a_kls in ordered_objs: + try: + if a_kls.quiet or a_kls.quiet_warnings: + if debug is False: + warnings.filterwarnings('ignore') + + col_stat_dict = a_kls.series_summary(sampled_ser, ser) + warnings.filterwarnings('default') + else: + col_stat_dict = a_kls.series_summary(sampled_ser, ser) + series_stats[ser_name].update(col_stat_dict) + except Exception as e: + if not a_kls.quiet: + errs[(ser_name, "series_summary")] = e, a_kls + if debug: + traceback.print_exc() + continue + return series_stats, errs -def produce_summary_df(df, ordered_objs, df_name='test_df', debug=False): +def produce_summary_df(df, series_stats, ordered_objs, df_name='test_df', debug=False): """ takes a dataframe and a list of analyses that have been ordered by a graph sort, then it produces a summary dataframe """ errs = {} summary_col_dict = {} - table_hint_col_dict = {} - #figure out how to add in "index"... but just for table_hints for ser_name in df.columns: - ser = df[ser_name] - #FIXME: actually sample the series. waiting until I have time - #to proeprly benchmark - sampled_ser = ser - summary_ser = pd.Series({}, dtype='object') + base_summary_dict = series_stats[ser_name] for a_kls in ordered_objs: try: if a_kls.quiet or a_kls.quiet_warnings: if debug is False: warnings.filterwarnings('ignore') - summary_res = a_kls.summary(sampled_ser, summary_ser, ser) + summary_res = a_kls.computed_summary(base_summary_dict) warnings.filterwarnings('default') else: - summary_res = a_kls.summary(sampled_ser, summary_ser, ser) + summary_res = a_kls.computed_summary(base_summary_dict) for k,v in summary_res.items(): - summary_ser.loc[k] = v + base_summary_dict.update(summary_res) except Exception as e: if not a_kls.quiet: - errs[ser_name] = e, a_kls + errs[(ser_name, "computed_summary")] = e, a_kls if debug: traceback.print_exc() continue - summary_col_dict[ser_name] = summary_ser + summary_col_dict[ser_name] = base_summary_dict + return summary_col_dict, errs + +def full_produce_summary_df(df, ordered_objs, df_name='test_df', debug=False): + if len(df) == 0: + return {}, {}, {} + series_stat_dict, series_errs = produce_series_df(df, ordered_objs, df_name, debug) + summary_df, summary_errs = produce_summary_df( + df, series_stat_dict, ordered_objs, df_name, debug) + series_errs.update(summary_errs) + table_hint_col_dict = {} + for ser_name in df.columns: table_hint_col_dict[ser_name] = pick( - d_update(BASE_COL_HINT, summary_ser.to_dict()), + d_update(BASE_COL_HINT, summary_df[ser_name]), BASE_COL_HINT.keys()) - summary_df = pd.DataFrame(summary_col_dict) - table_hints = table_hint_col_dict - return summary_df, table_hints, errs -class NonExistentSummaryRowException(Exception): - pass + return summary_df, table_hint_col_dict, series_errs -class AnalsysisPipeline(object): +#TODO Figure out how to do proper typing with AnalysisPipeline and the polars subclasses +# We want a TypeVar for DFType and AT. But the main function, process_df whild still return 3 dicts +#DFT = TypeVar("DFT") #DF Type +#AT = TypeVar("AT") #Analysis Type +class AnalysisPipeline(object): """ manage the ordering of a set of col_analysis objects allow for computing summary_stats (and other oberservation sets) based on col_analysis objects allow col_anlysis objects to be added """ + + #this is only a list to prevent it from being interpretted as an instance method + #full_produce_func: List[Callable[[DFT, List[AT], str, bool], Any]] = + + full_produce_func = [full_produce_summary_df] + def __init__(self, analysis_objects, unit_test_objs=True): self.summary_stats_display = "all" self.unit_test_objs = unit_test_objs @@ -176,7 +138,7 @@ def unit_test(self): """ try: - output_df, table_hint_dict, errs = produce_summary_df(PERVERSE_DF, self.ordered_a_objs) + output_df, table_hint_dict, errs = self.full_produce_func[0](PERVERSE_DF, self.ordered_a_objs) if len(errs) == 0: return True, [] else: @@ -186,7 +148,7 @@ def unit_test(self): def process_df(self, input_df, debug=False): - output_df, table_hint_dict, errs = produce_summary_df(input_df, self.ordered_a_objs, debug=debug) + output_df, table_hint_dict, errs = self.full_produce_func[0](input_df, self.ordered_a_objs, debug=debug) return output_df, table_hint_dict, errs def add_analysis(self, new_aobj): @@ -209,10 +171,12 @@ class DfStats(object): DfStats exists to handle inteligent downampling and applying the ColAnalysis functions ''' + ap_class = AnalysisPipeline + def __init__(self, df_stats_df, col_analysis_objs, operating_df_name=None, debug=False): self.df = self.get_operating_df(df_stats_df, force_full_eval=False) self.col_order = self.df.columns - self.ap = AnalsysisPipeline(col_analysis_objs) + self.ap = self.ap_class(col_analysis_objs) self.operating_df_name = operating_df_name self.debug = debug diff --git a/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py b/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py index ec3f01f7c..03a64a206 100644 --- a/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py +++ b/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py @@ -1,28 +1,41 @@ import graphlib from collections import OrderedDict +from typing import List, Union class ColAnalysis(object): """ Col Analysis runs on a single column + + this is the pandas based implementation """ requires_raw = False - requires_summary = [] # What summary stats does this analysis provide - provides_summary = [] # mean/max/histogram - summary_stats_display = None + requires_summary:List[str] = [] # What summary stats does this analysis provide + provides_summary:List[str] = [] # mean/max/histogram + + provides_series_stats:List[str] = [] # what does this provide at a series level + + + @classmethod + def full_provides(cls): + a = cls.provides_series_stats.copy() + a.extend(cls.provides_summary) + return a + + summary_stats_display:Union[List[str], None] = None quiet = False quiet_warnings = False @staticmethod - def summary(sampled_ser, summary_ser, ser): + def series_summary(sampled_ser, ser): return {} @staticmethod - def column_order(sampled_ser, summary_ser): - pass + def computed_summary(summary_dict): + return {} @staticmethod - def table_hints(sampled_ser, summary_ser, existing_table_hints): - return {} + def column_order(sampled_ser, summary_ser): + pass @classmethod def cname(kls): @@ -39,7 +52,9 @@ def check_solvable(a_objs): provides = [] required = [] for ao in a_objs: - provides.extend(ao.provides_summary) + rest = ao.full_provides() + provides.extend(rest) + required.extend(ao.requires_summary) all_provides = set(provides) all_required = set(required) @@ -66,12 +81,13 @@ def order_analysis(a_objs): graph = {} key_class_objs = {} for ao in a_objs: - if len(ao.provides_summary) == 0: + fp = ao.full_provides() + if len(fp) == 0: temp_provided = "__no_provided_keys__" else: - temp_provided = ao.provides_summary[0] + temp_provided = fp[0] first_mid_key = mid_key = ao.__name__ + "###" + temp_provided - for k in ao.provides_summary[1:]: + for k in ao.full_provides()[1:]: #print("k", k) next_mid_key = ao.__name__ + "###" + k graph[mid_key] = set([next_mid_key]) @@ -79,7 +95,7 @@ def order_analysis(a_objs): mid_key = next_mid_key graph[mid_key] = set(ao.requires_summary) key_class_objs[mid_key] = ao - for j in ao.provides_summary: + for j in ao.full_provides(): #print("j", j) graph[j] = set([first_mid_key]) ts = graphlib.TopologicalSorter(graph) diff --git a/buckaroo/pluggable_analysis_framework/polars_analysis_management.py b/buckaroo/pluggable_analysis_framework/polars_analysis_management.py new file mode 100644 index 000000000..87bb0b671 --- /dev/null +++ b/buckaroo/pluggable_analysis_framework/polars_analysis_management.py @@ -0,0 +1,117 @@ +import traceback + +import polars as pl + +from buckaroo.pluggable_analysis_framework.polars_utils import split_to_dicts + + +from .pluggable_analysis_framework import ColAnalysis +from .analysis_management import (produce_summary_df, AnalysisPipeline, DfStats) +from .utils import (BASE_COL_HINT) +from buckaroo.serialization_utils import pick, d_update +from buckaroo.pluggable_analysis_framework.safe_summary_df import safe_summary_df +from typing import Mapping, Any, Callable, Tuple, List, MutableMapping + + + +class PolarsAnalysis(ColAnalysis): + select_clauses:List[pl.Expr] = [] + column_ops: Mapping[str, Tuple[List[pl.PolarsDataType], Callable[[pl.Series], Any]]] = {} + +def normalize_polars_histogram(ph:pl.DataFrame, ser:pl.Series): + edges = ph['break_point'].to_list() + edges[0], edges[-1] = ser.min(), ser.max() + #col_series.hist(bin_count=10) + col_only_df = ph.select(pl.col("^.*_count$")) + counts = col_only_df[col_only_df.columns[0]].to_list() + #counts = ph['_count'].to_list() + return counts[1:], edges + + +def produce_series_df(df:pl.DataFrame, + unordered_objs:List[PolarsAnalysis], + df_name:str='test_df', debug:bool=False): + """ just executes the series methods + + """ + errs: MutableMapping[str, str] = {} + all_clauses = [] + for obj in unordered_objs: + all_clauses.extend(obj.select_clauses) + try: + result_df = df.lazy().select(all_clauses).collect() + except Exception: + if debug: + df.write_parquet('error.parq') + traceback.print_exc() + return dict([[k, {}] for k in df.columns]), {} + summary_dict = split_to_dicts(result_df) + + for pa in unordered_objs: + for measure_name, action_tuple in pa.column_ops.items(): + col_selector, func = action_tuple + if col_selector == "all": + sub_df = df.select(pl.all()) + else: + sub_df = df.select(pl.col(col_selector)) + for col in sub_df.columns: + summary_dict[col][measure_name] = func(df[col]) + pass + return summary_dict, errs + +def extract_table_hint(summary_dict, columns): + table_hint_col_dict = {} + for ser_name in columns: + table_hint_col_dict[ser_name] = pick( + d_update(BASE_COL_HINT, summary_dict[ser_name]), + BASE_COL_HINT.keys()) + return table_hint_col_dict + +def full_produce_summary_df( + df:pl.DataFrame, ordered_objs:List[PolarsAnalysis], + df_name:str='test_df', debug:bool=False): + series_stat_dict, series_errs = produce_series_df(df, ordered_objs, df_name, debug) + summary_dict, summary_errs = produce_summary_df( + df, series_stat_dict, ordered_objs, df_name, debug) + series_errs.update(summary_errs) + table_hint_col_dict = extract_table_hint(summary_dict, df.columns) + return summary_dict, table_hint_col_dict, series_errs + + + +class PolarsAnalysisPipeline(AnalysisPipeline): + """ + manage the ordering of a set of col_analysis objects + allow for computing summary_stats (and other oberservation sets) based on col_analysis objects + allow col_anlysis objects to be added + """ + full_produce_func = [full_produce_summary_df] + + def add_analysis(self, new_aobj): + new_cname = new_aobj.cname() + new_aobj_set = [] + for aobj in self.ordered_a_objs: + if aobj.cname() == new_cname: + continue + new_aobj_set.append(aobj) + new_aobj_set.append(new_aobj) + self.verify_analysis_objects(new_aobj_set) + + # passed_unit_test, errs = self.unit_test() + # if passed_unit_test is False: + # return False, errs + return True, [] + + +class PlDfStats(DfStats): + ''' + DfStats exists to handle inteligent downampling and applying the ColAnalysis functions + ''' + ap_class = PolarsAnalysisPipeline + + @property + def presentation_sdf(self): + import pandas as pd + if self.ap.summary_stats_display == "all": + return pd.DataFrame(self.sdf) + return safe_summary_df(self.sdf, self.ap.summary_stats_display) diff --git a/buckaroo/pluggable_analysis_framework/polars_utils.py b/buckaroo/pluggable_analysis_framework/polars_utils.py new file mode 100644 index 000000000..519107641 --- /dev/null +++ b/buckaroo/pluggable_analysis_framework/polars_utils.py @@ -0,0 +1,19 @@ +import polars as pl + +import json +from collections import defaultdict +from typing import Any, Mapping, MutableMapping, List + + +def split_to_dicts(stat_df:pl.DataFrame) -> Mapping[str, MutableMapping[str, Any]]: + summary: MutableMapping[str, MutableMapping[str, Any]] = defaultdict(lambda : {}) + for col in stat_df.columns: + orig_col, measure = json.loads(col) + summary[orig_col][measure] = stat_df[col][0] + return summary + + +NUMERIC_POLARS_DTYPES:List[pl.PolarsDataType] = [ + pl.Int8, pl.Int16, pl.Int32, pl.Int64, + pl.UInt8, pl.UInt16, pl.UInt32, pl.UInt64, + pl.Float32, pl.Float64] \ No newline at end of file diff --git a/buckaroo/pluggable_analysis_framework/safe_summary_df.py b/buckaroo/pluggable_analysis_framework/safe_summary_df.py new file mode 100644 index 000000000..574c357c1 --- /dev/null +++ b/buckaroo/pluggable_analysis_framework/safe_summary_df.py @@ -0,0 +1,102 @@ +import pandas as pd +import numpy as np +import sys +import traceback +from buckaroo.serialization_utils import pick + + +class UnquotedString(str): + pass + +def val_replace(dct, replacements): + ret_dict = {} + for k, v in dct.items(): + if isinstance(v, pd.Series): + ret_dict[k] = UnquotedString('pd.Series()') + #hack, but trying to get away from conditional imports + elif repr(v.__class__) == "": + ret_dict[k] = UnquotedString('pl.Series()') + elif v in replacements: + ret_dict[k] = replacements[v] + else: + ret_dict[k] = v + return ret_dict + + +def dict_repr(dct): + ret_str = "{" + for k, v in dct.items(): + ret_str += "'%s': " % k + if type(v) == UnquotedString: + ret_str += "%s, " % v + else: + ret_str += "%r, " % v + ret_str += "}" + return ret_str + + +def pd_py_serialize(dct): + """ + This is used to output an exact string that is valid python code. + """ + cleaned_dct = val_replace(dct, + {pd.NA: UnquotedString("pd.NA"), + np.nan: UnquotedString("np.nan")}) + return dict_repr(cleaned_dct) + +def get_df_name(df, level=0): + """ looks up the call stack until it finds the variable with this name""" + if level == 0: + _globals = globals() + elif level < 60: + try: + call_frame = sys._getframe(level) + _globals = call_frame.f_globals + except ValueError: + return None #we went to far up the stacktrace to a non-existent frame + else: + return None + + name_possibs = [x for x in _globals.keys() if _globals[x] is df] + if name_possibs: + return name_possibs[0] + else: + #+2 because the function is recursive, and we need to skip over this frame + return get_df_name(df, level + 2) + +def safe_summary_df(base_summary_df, index_list): + #there are instances where not all indexes of the summary_df will + #be available, because there was no valid data to produce those + #indexes. This fixes them and explicitly. Empty rows will have NaN + return pd.DataFrame(base_summary_df, index_list) + +def reproduce_summary(ser_name_qualifier, kls, summary_df, err, operating_df_name): + #print("ser_name_qualifier", ser_name_qualifier) + #ser_name, method_name = ser_name_qualifier.split(':') + ser_name, method_name = ser_name_qualifier + ssdf = safe_summary_df(summary_df, kls.requires_summary) + summary_ser = ssdf[ser_name] + minimal_summary_dict = pick(summary_ser, kls.requires_summary) + sum_ser_repr = "pd.Series(%s)" % pd_py_serialize(minimal_summary_dict) + + f = "{kls}.summary({df_name}['{ser_name}'], {summary_ser_repr}, {df_name}['{ser_name}']) # {err_msg}" + print(f.format( + kls=kls.cname(), df_name=operating_df_name, ser_name=ser_name, + summary_ser_repr=sum_ser_repr, err_msg=err)) + +def output_reproduce_preamble(): + print("#Reproduction code") + print("#" + "-" * 80) + print("from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF") + +def output_full_reproduce(errs, summary_df, df_name): + if len(errs) == 0: + raise Exception("output_full_reproduce called with 0 len errs") + + try: + for ser_name, err_kls in errs.items(): + err, kls = err_kls + reproduce_summary(ser_name, kls, summary_df, err, df_name) + except Exception: + #this is tricky stuff that shouldn't error, I want these stack traces to escape being caught + traceback.print_exc() diff --git a/buckaroo/pluggable_analysis_framework/utils.py b/buckaroo/pluggable_analysis_framework/utils.py new file mode 100644 index 000000000..38a414e3a --- /dev/null +++ b/buckaroo/pluggable_analysis_framework/utils.py @@ -0,0 +1,83 @@ +import json +import sys +import pandas as pd +import numpy as np + +BASE_COL_HINT = { + 'type':'string', + 'is_numeric': False, + 'is_integer': None, + 'min_digits':None, + 'max_digits':None, + 'formatter':None, + 'histogram': []} + +FAST_SUMMARY_WHEN_GREATER = 1_000_000 + +PERVERSE_DF = pd.DataFrame({ + 'all_nan': [np.nan] * 10, + 'all_false': [False] * 10, + 'all_True': [True] * 10, + 'mixed_bool': np.concatenate([[True]*5, [False]*5]), + 'mixed_float': np.concatenate([[0.5, np.nan, None], [6]*7]), + 'float': [0.5]*10, + 'int': [8] *10, + 'negative': [-1]*10, + 'UInt32': pd.Series([5]*10, dtype='UInt32'), + 'UInt8None':pd.Series([None] * 10, dtype='UInt8') + }) + + +class NonExistentSummaryRowException(Exception): + pass + +def get_df_name(df, level=0): + """ looks up the call stack until it finds the variable with this name""" + if level == 0: + _globals = globals() + elif level < 60: + try: + call_frame = sys._getframe(level) + _globals = call_frame.f_globals + except ValueError: + return None #we went to far up the stacktrace to a non-existent frame + else: + return None + + name_possibs = [x for x in _globals.keys() if _globals[x] is df] + if name_possibs: + return name_possibs[0] + else: + #+2 because the function is recursive, and we need to skip over this frame + return get_df_name(df, level + 2) + + +def safe_isnan(v): + try: + return np.isnan(v) + except Exception: + return False + +def replace_in_dict(input_dict, replace_tuples): + ret_dict = {} + for k,v in input_dict.items(): + if isinstance(v, dict): + ret_dict[k] = replace_in_dict(v, replace_tuples) + elif safe_isnan(v): + ret_dict[k] = None + else: + for old, new in replace_tuples: + if v is old: + ret_dict[k] = new + break + elif v == old: + ret_dict[k] = new + break + ret_dict[k] = v + return ret_dict + + +def json_postfix(postfix): + return lambda nm: json.dumps([nm, postfix]) + + diff --git a/buckaroo/polars_buckaroo.py b/buckaroo/polars_buckaroo.py new file mode 100644 index 000000000..091c012b8 --- /dev/null +++ b/buckaroo/polars_buckaroo.py @@ -0,0 +1,16 @@ +from buckaroo.buckaroo_widget import BuckarooWidget +from .customizations.polars_analysis import PL_Analysis_Klasses +from .pluggable_analysis_framework.polars_analysis_management import ( + PlDfStats) + +from buckaroo.customizations.polars_commands import ( + DropCol, FillNA, GroupBy #, OneHot, GroupBy, reindex +) + + +class PolarsBuckarooWidget(BuckarooWidget): + """TODO: Add docstring here + """ + command_classes = [DropCol, FillNA, GroupBy] + analysis_classes = PL_Analysis_Klasses + DFStatsClass = PlDfStats diff --git a/buckaroo/serialization_utils.py b/buckaroo/serialization_utils.py index 6e5e1f4f1..fb74d9602 100644 --- a/buckaroo/serialization_utils.py +++ b/buckaroo/serialization_utils.py @@ -1,7 +1,7 @@ import json -import numpy as np import pandas as pd from pandas.io.json import dumps as pdumps +from typing import Union def d_update(d1, d2): ret_dict = d1.copy() @@ -18,7 +18,9 @@ def pick(dct, keys): def val_replace(dct, replacements): ret_dict = {} for k, v in dct.items(): - if v in replacements: + if isinstance(v, pd.Series): + ret_dict[k] = UnquotedString('pd.Series()') + elif v in replacements: ret_dict[k] = replacements[v] else: ret_dict[k] = v @@ -38,14 +40,6 @@ def dict_repr(dct): ret_str += "}" return ret_str -def pd_py_serialize(dct): - """ - This is used to output an exact string that is valid python code. - """ - cleaned_dct = val_replace(dct, - {pd.NA: UnquotedString("pd.NA"), - np.nan: UnquotedString("np.nan")}) - return dict_repr(cleaned_dct) EMPTY_DF_OBJ = {'schema': {'fields': [{'name': 'index', 'type': 'string'}], @@ -56,12 +50,32 @@ def pd_py_serialize(dct): def dumb_table_sumarize(df): """used when table_hints aren't provided. Trests every column as a string""" - table_hints = {col:{'is_numeric':False, type:'obj'} for col in df} - table_hints['index'] = {'is_numeric': False} + table_hints = {col:{'is_numeric':False, 'type':'obj', 'histogram':[]} for col in df} + table_hints['index'] = {'is_numeric': False, 'type':'obj', 'histogram':[] } return table_hints -def df_to_obj(df, order = None, table_hints=None): +#def force_to_pandas(df_pd_or_pl:Union[pd.DataFrame, pl.DataFrame]) -> pd.DataFrame: +def force_to_pandas(df_pd_or_pl) -> pd.DataFrame: + if isinstance(df_pd_or_pl, pd.DataFrame): + return df_pd_or_pl + + + import polars as pl + #hack for now so everything else flows through + + if isinstance(df_pd_or_pl, pl.DataFrame): + return df_pd_or_pl.to_pandas() + else: + raise Exception("unexpected type for dataframe, got %r" % (type(df_pd_or_pl))) + + +#def df_to_obj(unknown_df:Union[pd.DataFrame, pl.DataFrame], order = None, table_hints=None): +def df_to_obj(unknown_df:Union[pd.DataFrame], order = None, table_hints=None): + df = force_to_pandas(unknown_df) + return pd_to_obj(df, order=order, table_hints=table_hints) + +def pd_to_obj(df:pd.DataFrame , order = None, table_hints=None): if order is None: order = df.columns obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) @@ -79,8 +93,13 @@ def df_to_obj(df, order = None, table_hints=None): obj['table_hints'] = json.loads(pdumps(dumb_table_sumarize(df))) else: obj['table_hints'] = json.loads(pdumps(table_hints)) - fields=[{'name': df.index.name or "index" }] + + index_name = df.index.name or "index" + fields=[{'name': index_name, 'type':'unused' }] for c in order: - fields.append({'name':str(c)}) - obj['schema'] = dict(fields=fields) + fields.append({'name':str(c), 'type':'unused'}) + obj['schema'] = dict(fields=fields, primaryKey=[index_name], pandas_version='1.4.0') return obj + + + diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 66f816a45..71a95e1e8 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -48,9 +48,10 @@ def _display_as_buckaroo(df): def _display_polars_as_buckaroo(polars_df): from IPython.display import display + from buckaroo.polars_buckaroo import PolarsBuckarooWidget + try: - pandas_df = polars_df.to_pandas() - return display(BuckarooWidget(pandas_df, + return display(PolarsBuckarooWidget(polars_df, sampled=sampled, summaryStats=summaryStats, reorderdColumns=reorderdColumns, diff --git a/docs/source/articles/related_projects.rst b/docs/source/articles/related_projects.rst index 0edca259d..d501a001b 100644 --- a/docs/source/articles/related_projects.rst +++ b/docs/source/articles/related_projects.rst @@ -41,6 +41,7 @@ JS Table widgets. These are the core interactive tables that modern table exper #. `AG-Grid `_ The most popular high performance JS data table in use. Buckaroo is built on top of the open source version of AG-Grid. The closed source version offers additional features. #. `Finos Perspective table `_ The highest performance JS Table that I have seen. Works via a complete rendering engine that writes pixels to a canvas. Open source. +#. `Glide Data grid `_ Relatively new. Claims to be doing canvas rendering. Looks impressive and fast, less features than AG-Grid. Developed as a side project from a VC funded pre-revenue company, longterm future isn't certain. Why list potential competitors diff --git a/docs/source/conf.py b/docs/source/conf.py index 934481518..feb90e74e 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.4.8' +release = '0.5.0' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/example-notebooks/Customizing-Buckaroo.ipynb b/example-notebooks/Customizing-Buckaroo.ipynb new file mode 100644 index 000000000..c1eb1800f --- /dev/null +++ b/example-notebooks/Customizing-Buckaroo.ipynb @@ -0,0 +1,397 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "375845a4-837a-4a32-a84a-ddb0d546878b", + "metadata": { + "tags": [] + }, + "source": [ + "# Customizing Buckaroo\n", + "Buckaroo consists of\n", + "* The BuckarooWidget which coordinates updates to the frontend, management of analysis, the lowcode UI, and auto_cleaning functionality.\n", + "* The frontend JS Table - handles display of dataframes, configured through interfaces.\n", + "* The pluggable analysis framework which orders execution of customized analysis objects, and handles catching errors along with error reporting.\n", + "* User supplied analyis objects, these operate on the dataframes to build the summary stats table, and configure the frontend display\n" + ] + }, + { + "cell_type": "markdown", + "id": "859de2ef-e86b-49f0-8f43-6c22d9c3ac69", + "metadata": {}, + "source": [ + "## Adding a Command to the Low Code UI" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "08d439a4-3b7b-4e0f-9e52-78523c9d9ce2", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import buckaroo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cdf47372-c70d-43db-85cb-db6af86ce7d4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")\n", + "w = buckaroo.BuckarooWidget(df[:500], showCommands=True, auto_clean=False) #turning autoType=False to reduce clutter in the operations\n", + "w" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5855f6b9-f42b-423b-ae00-09e20188e77f", + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.customizations.all_transforms import Command\n", + "from buckaroo.jlisp.lispy import s\n", + "#Here we start adding commands to the Buckaroo Widget. Every call to add_command replaces a command with the same name\n", + "@w.add_command\n", + "class GroupBy3(Command):\n", + " command_default = [s(\"groupby3\"), s('df'), 'col', {}]\n", + " command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]]\n", + " @staticmethod \n", + " def transform(df, col, col_spec):\n", + " grps = df.groupby(col)\n", + " \n", + " df_contents = {}\n", + " for k, v in col_spec.items():\n", + " if v == \"sum\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.sum())\n", + " elif v == \"mean\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.mean())\n", + " elif v == \"median\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.median())\n", + " elif v == \"count\":\n", + " df_contents[k] = grps[k].apply(lambda x: x.count())\n", + " return pd.DataFrame(df_contents)\n", + "\n", + " @staticmethod \n", + " def transform_to_py(df, col, col_spec):\n", + " commands = [\n", + " \" grps = df.groupby('%s')\" % col,\n", + " \" df_contents = {}\"\n", + " ]\n", + " for k, v in col_spec.items():\n", + " if v == \"sum\":\n", + " commands.append(\" paddydf_contents['%s'] = grps['%s'].apply(lambda x: x.sum())\" % (k, k))\n", + " elif v == \"mean\":\n", + " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.mean())\" % (k, k))\n", + " elif v == \"median\":\n", + " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.median())\" % (k, k))\n", + " elif v == \"count\":\n", + " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.count())\" % (k, k))\n", + " commands.append(\" df = pd.DataFrame(df_contents)\")\n", + " return \"\\n\".join(commands)\n" + ] + }, + { + "cell_type": "markdown", + "id": "72fe04f0-84d4-4e7a-9fef-e61d098da745", + "metadata": {}, + "source": [ + "Note that `groupby2` has been added to the commands" + ] + }, + { + "cell_type": "markdown", + "id": "441e9e82-34ec-4359-9000-dff97f537e12", + "metadata": {}, + "source": [ + "**These docs need updating for 0.5** Take a look at the [customizations](https://github.com/paddymul/buckaroo/tree/main/buckaroo/customizations) directory in the codebase and file some bugs asking for your suggested improvement. I expect to add a lot more xamples around the 0.6 series" + ] + }, + { + "cell_type": "markdown", + "id": "a1ec3e18-1649-49d2-8e3b-8e93236d93e1", + "metadata": {}, + "source": [ + "# Adding a summary stat\n", + "Buckaroo is completely customizeable. In the next cells we will add `Variance` to an instance of the BuckarooWidget with the `Pluggable Analysis Framework`.\n", + "\n", + "## Why was the Pluggable Analysis Framework built?\n", + "The `Pluggable Analysis Framework` is engineered to allow summary_stats to be built up piecemeal and incrementally. Traditionally when writing bits of analysis code, the tendency is to have large brittle functions that do a lot at once. Adding extra stats either requires copying and pasting the existing function with one small addition, writing each stat independently and possibly recomputing existing stats, having a strictly ordered set of analysis functions, or some complex adhoc argument passing scheme. I have written adhoc versions in each of these patterns. Problems are manifest and the aparatus rarely survives even copy-pasting to the next notebook.\n", + "\n", + "## How does the Pluggable Analysis Framework work?\n", + "The `Pluggable Analysis Framework` is built around a DAG of `ColAnalysis` nodes that can depend on other summary stats, and provide one or more summary stats. Nodes cand be added to the dag with `add_analysis`. If a class with the same name is inserted into the DAG, the newly inserted node replaces the previous instantiation. This all facilitates interactive development of analysis functions. During execution errors are caught and execution proceeds. This is important because breaking the default dataframe mechanism is a show stopping problem for users" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63fab4e4-5dbb-4b34-ae7c-b4b065d0ed26", + "metadata": {}, + "outputs": [], + "source": [ + "w = buckaroo.BuckarooWidget(df, showCommands=False)\n", + "w" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67d6d3da-cc93-4566-b542-74c8cd5758b9", + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis)\n", + "class Variance(ColAnalysis):\n", + " provides_summary = [\"variance\"]\n", + " #a bit hacky, the newly added analyis needs to be the last in the dependency chain\n", + " requires_summary = [\"histogram\"]\n", + "\n", + " @staticmethod\n", + " def series_summary(sampled_ser, ser):\n", + " if pd.api.types.is_numeric_dtype(ser):\n", + " return dict(variance=ser.var())\n", + " return dict(variance=\"NA\")\n", + "\n", + " \n", + " summary_stats_display = [\n", + " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", + " 'empty_per', 'unique_per', 'nan_per', \n", + " 'is_numeric', 'is_integer', 'is_datetime',\n", + " 'mode', 'min', #'max', \n", + " 'mean', \n", + " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", + " 'variance']\n", + "w.add_analysis(Variance)" + ] + }, + { + "cell_type": "markdown", + "id": "9b4451f7-8b2c-4ee5-8beb-930bcf628af4", + "metadata": {}, + "source": [ + "analysis is added interactively, toggle the summary stats view on the widget above and notice that `variance` has been added" + ] + }, + { + "cell_type": "markdown", + "id": "ffdd52ed-443c-4ec3-9063-b067e779cbc4", + "metadata": {}, + "source": [ + "## Basic Unit testing is built in\n", + "\n", + "Because there are so many corner cases with numerical code, every time a new summary stat is added, a variety of simple tests are run against it. This lets you discover bugs earlier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f3c58fc-b742-4251-9778-e1a33bf4f500", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "small_df = df[:500][df.columns[:4]]\n", + "# we are going to create, but not display a BuckarooWidget here, we are looking at the error behavior\n", + "w = buckaroo.BuckarooWidget(small_df, showCommands=False, debug=True)\n", + "\n", + "class Variance(ColAnalysis):\n", + " provides_summary = [\"variance\"]\n", + " requires_summary = [\"mean\"]\n", + " \n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " mean = summary_ser.get('mean', False)\n", + " arr = ser.to_numpy()\n", + " #toggle SIMULATED_BUG to easily see behavior with and without a bug\n", + " SIMULATED_BUG = True\n", + " if SIMULATED_BUG:\n", + " if mean in [pd.NA, np.nan, False]:\n", + " return dict(variance=\"NA\")\n", + " else:\n", + " if mean is pd.NA or mean is np.nan or mean is False:\n", + " return dict(variance=\"NA\")\n", + " if mean and pd.api.types.is_integer_dtype(ser):\n", + " return dict(variance=np.mean((arr - mean)**2))\n", + " elif mean and pd.api.types.is_float_dtype(ser):\n", + " return dict(variance=np.mean((arr - mean)**2))\n", + " return dict(variance=\"NA\")\n", + " \n", + " summary_stats_display = [\n", + " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", + " 'empty_per', 'unique_per', 'nan_per', \n", + " 'is_numeric', 'is_integer', 'is_datetime',\n", + " 'mode', 'min', 'max', 'mean', \n", + " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", + " 'variance']\n", + "\n", + "w.add_analysis(Variance)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8faf375-9aa5-4904-a228-08592cb8ad66", + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", + "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous" + ] + }, + { + "cell_type": "markdown", + "id": "d28c3fb7-62bf-48db-ae68-f32a01116628", + "metadata": {}, + "source": [ + "## Reproducing errors in the notebook\n", + "Buckaroo printed reproduction instructions like\n", + "```\n", + "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", + "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous\n", + "\n", + "```\n", + "\n", + "`PERVERSE_DF` is a DataFame with all kinds of edgecases that normally trip up numerical code. You can run the above two lines, and quickly start iterating on your `ColAnalysis` class to fix the error. Normally adhoc analysis code that iterates over a list of functions blows up in a stack trace referencing an anonymous function in the middle of a for loop called with opaque variables. Bucakroo gives you a single line that can reproduce the error, with easily inspectable variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d41b448c-6533-4a1e-a216-cb18da7e20ca", + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", + "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous" + ] + }, + { + "cell_type": "markdown", + "id": "e2e8eb43-79ed-4652-90d0-32f5dd4cb74e", + "metadata": {}, + "source": [ + "## Quiet mode\n", + "Sometimes you just want to get on with it. Buckaroo has a setting for that too, set `quiet=True` and unit test errors, and regular processing errors will be silenced. Not recommended, but if I didn't add it, users would write their own adhoc version." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6163569-9fd7-4692-9f95-e9fadb6615c1", + "metadata": {}, + "outputs": [], + "source": [ + "w = buckaroo.BuckarooWidget(small_df, showCommands=False)\n", + "#There are errors in the following functions, quiet = True will ignore them\n", + "\n", + "def int_digits(n):\n", + " if np.isnan(n):\n", + " return 1\n", + " if n == 0:\n", + " return 1\n", + " if np.sign(n) == -1:\n", + " return int(np.floor(np.log10(np.abs(n)))) + 2\n", + " return int(np.floor(np.log10(n)+1))\n", + "class MinDigits(ColAnalysis):\n", + " \n", + " requires_summary = [\"min\"]\n", + " provides_summary = [\"min_digits\"]\n", + " quiet = True\n", + " \n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype)\n", + " if is_numeric:\n", + " return {\n", + " 'min_digits':int_digits(summary_ser.loc['min'])}\n", + " else:\n", + " return {\n", + " 'min_digits':0}\n", + "w.add_analysis(MinDigits)\n", + "w" + ] + }, + { + "cell_type": "markdown", + "id": "cf664880-3a8e-451d-8ff1-fb657de0a76a", + "metadata": { + "tags": [] + }, + "source": [ + "# Making a new default dataframe display function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44f4d9da-5b06-4d6f-b319-e435e3d62944", + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.widget_utils import disable\n", + "from IPython.core.getipython import get_ipython\n", + "from IPython.display import display\n", + "import warnings\n", + "\n", + "disable()\n", + "def my_display_as_buckaroo(df):\n", + " w = BuckarooWidget(df, showCommands=False)\n", + " #the analysis we added throws warnings, let's muffle that when used as the default display\n", + " warnings.filterwarnings('ignore')\n", + " w.add_analysis(Skew)\n", + " warnings.filterwarnings('default')\n", + " return display(w)\n", + "\n", + "def my_enable():\n", + " \"\"\"\n", + " Automatically use buckaroo to display all DataFrames\n", + " instances in the notebook.\n", + "\n", + " \"\"\"\n", + " ip = get_ipython()\n", + " if ip is None:\n", + " print(\"must be running inside ipython to enable default display via enable()\")\n", + " return\n", + " ip_formatter = ip.display_formatter.ipython_display_formatter\n", + " ip_formatter.for_type(pd.DataFrame, my_display_as_buckaroo)\n", + "my_enable()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.18" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb index e42f53f5f..17294e6f7 100644 --- a/example-notebooks/Full-tour.ipynb +++ b/example-notebooks/Full-tour.ipynb @@ -17,7 +17,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "import numpy as np\n", @@ -70,10 +72,12 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")", + "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")\n", "#df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", "df" ] @@ -217,286 +221,6 @@ " 'normal': np.random.normal(25, .3, N),})" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Adding a summary stat\n", - "Buckaroo is completely customizeable. In the next cells we will add `Variance` to an instance of the BuckarooWidget with the `Pluggable Analysis Framework`.\n", - "\n", - "## Why was the Pluggable Analysis Framework built?\n", - "The `Pluggable Analysis Framework` is engineered to allow summary_stats to be built up piecemeal and incrementally. Traditionally when writing bits of analysis code, the tendency is to have large brittle functions that do a lot at once. Adding extra stats either requires copying and pasting the existing function with one small addition, writing each stat independently and possibly recomputing existing stats, having a strictly ordered set of analysis functions, or some complex adhoc argument passing scheme. I have written adhoc versions in each of these patterns. Problems are manifest and the aparatus rarely survives even copy-pasting to the next notebook.\n", - "\n", - "## How does the Pluggable Analysis Framework work?\n", - "The `Pluggable Analysis Framework` is built around a DAG of `ColAnalysis` nodes that can depend on other summary stats, and provide one or more summary stats. Nodes cand be added to the dag with `add_analysis`. If a class with the same name is inserted into the DAG, the newly inserted node replaces the previous instantiation. This all facilitates interactive development of analysis functions. During execution errors are caught and execution proceeds. This is important because breaking the default dataframe mechanism is a show stopping problem for users\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "w = buckaroo.BuckarooWidget(df, showCommands=False)\n", - "w" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis)\n", - "class Variance(ColAnalysis):\n", - " provides_summary = [\"variance\"]\n", - " requires_summary = [\"mean\"]\n", - "\n", - " @staticmethod\n", - " def summary(sampled_ser, summary_ser, ser):\n", - " mean = summary_ser.get('mean', False)\n", - " arr = ser.to_numpy()\n", - " \n", - " if mean is pd.NA or mean is np.nan or mean is False:\n", - " return dict(variance=\"NA\")\n", - " elif mean and pd.api.types.is_integer_dtype(ser):\n", - " return dict(variance=np.mean((arr - mean)**2))\n", - " elif mean and pd.api.types.is_float_dtype(ser):\n", - " return dict(variance=np.mean((arr - mean)**2))\n", - " return dict(variance=\"NA\")\n", - " summary_stats_display = [\n", - " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", - " 'empty_per', 'unique_per', 'nan_per', \n", - " 'is_numeric', 'is_integer', 'is_datetime',\n", - " 'mode', 'min', 'max', 'mean', \n", - " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", - " 'variance']\n", - "w.add_analysis(Variance)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "analysis is added interactively, toggle the summary stats view on the widget above and notice that `variance` has been added" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Basic Unit testing is built in\n", - "\n", - "Because there are so many corner cases with numerical code, every time a new summary stat is added, a variety of simple tests are run against it. This lets you discover bugs earlier." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "small_df = df[:500][df.columns[:4]]\n", - "# we are going to create, but not display a BuckarooWidget here, we are looking at the error behavior\n", - "w = buckaroo.BuckarooWidget(small_df, showCommands=False, debug=True)\n", - "\n", - "class Variance(ColAnalysis):\n", - " provides_summary = [\"variance\"]\n", - " requires_summary = [\"mean\"]\n", - " \n", - " @staticmethod\n", - " def summary(sampled_ser, summary_ser, ser):\n", - " mean = summary_ser.get('mean', False)\n", - " arr = ser.to_numpy()\n", - " #toggle SIMULATED_BUG to easily see behavior with and without a bug\n", - " SIMULATED_BUG = True\n", - " if SIMULATED_BUG:\n", - " if mean in [pd.NA, np.nan, False]:\n", - " return dict(variance=\"NA\")\n", - " else:\n", - " if mean is pd.NA or mean is np.nan or mean is False:\n", - " return dict(variance=\"NA\")\n", - " if mean and pd.api.types.is_integer_dtype(ser):\n", - " return dict(variance=np.mean((arr - mean)**2))\n", - " elif mean and pd.api.types.is_float_dtype(ser):\n", - " return dict(variance=np.mean((arr - mean)**2))\n", - " return dict(variance=\"NA\")\n", - " \n", - " summary_stats_display = [\n", - " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", - " 'empty_per', 'unique_per', 'nan_per', \n", - " 'is_numeric', 'is_integer', 'is_datetime',\n", - " 'mode', 'min', 'max', 'mean', \n", - " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", - " 'variance']\n", - "\n", - "w.add_analysis(Variance)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", - "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reproducing errors in the notebook\n", - "Buckaroo printed reproduction instructions like\n", - "```\n", - "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", - "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous\n", - "\n", - "```\n", - "\n", - "`PERVERSE_DF` is a DataFame with all kinds of edgecases that normally trip up numerical code. You can run the above two lines, and quickly start iterating on your `ColAnalysis` class to fix the error. Normally adhoc analysis code that iterates over a list of functions blows up in a stack trace referencing an anonymous function in the middle of a for loop called with opaque variables. Bucakroo gives you a single line that can reproduce the error, with easily inspectable variables" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF\n", - "Variance.summary(PERVERSE_DF['all_nan'], pd.Series({'mean': np.nan, }), PERVERSE_DF['all_nan']) # boolean value of NA is ambiguous" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Quiet mode\n", - "Sometimes you just want to get on with it. Buckaroo has a setting for that too, set `quiet=True` and unit test errors, and regular processing errors will be silenced. Not recommended, but if I didn't add it, users would write their own adhoc version." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "w = buckaroo.BuckarooWidget(small_df, showCommands=False)\n", - "#There are errors in the following functions, quiet = True will ignore them\n", - "\n", - "def int_digits(n):\n", - " if np.isnan(n):\n", - " return 1\n", - " if n == 0:\n", - " return 1\n", - " if np.sign(n) == -1:\n", - " return int(np.floor(np.log10(np.abs(n)))) + 2\n", - " return int(np.floor(np.log10(n)+1))\n", - "class MinDigits(ColAnalysis):\n", - " \n", - " requires_summary = [\"min\"]\n", - " provides_summary = [\"min_digits\"]\n", - " quiet = True\n", - " \n", - " @staticmethod\n", - " def summary(sampled_ser, summary_ser, ser):\n", - " is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype)\n", - " if is_numeric:\n", - " return {\n", - " 'min_digits':int_digits(summary_ser.loc['min'])}\n", - " else:\n", - " return {\n", - " 'min_digits':0}\n", - "w.add_analysis(MinDigits)\n", - "w" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Adding a Command to the Low Code UI" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "w = buckaroo.BuckarooWidget(df[:500], showCommands=True, auto_clean=False) #turning autoType=False to reduce clutter in the operations\n", - "w" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from buckaroo.customizations.all_transforms import Command\n", - "from buckaroo.jlisp.lispy import s\n", - "#Here we start adding commands to the Buckaroo Widget. Every call to add_command replaces a command with the same name\n", - "@w.add_command\n", - "class GroupBy3(Command):\n", - " command_default = [s(\"groupby3\"), s('df'), 'col', {}]\n", - " command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]]\n", - " @staticmethod \n", - " def transform(df, col, col_spec):\n", - " grps = df.groupby(col)\n", - " \n", - " df_contents = {}\n", - " for k, v in col_spec.items():\n", - " if v == \"sum\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.sum())\n", - " elif v == \"mean\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.mean())\n", - " elif v == \"median\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.median())\n", - " elif v == \"count\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.count())\n", - " return pd.DataFrame(df_contents)\n", - "\n", - " @staticmethod \n", - " def transform_to_py(df, col, col_spec):\n", - " commands = [\n", - " \" grps = df.groupby('%s')\" % col,\n", - " \" df_contents = {}\"\n", - " ]\n", - " for k, v in col_spec.items():\n", - " if v == \"sum\":\n", - " commands.append(\" paddydf_contents['%s'] = grps['%s'].apply(lambda x: x.sum())\" % (k, k))\n", - " elif v == \"mean\":\n", - " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.mean())\" % (k, k))\n", - " elif v == \"median\":\n", - " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.median())\" % (k, k))\n", - " elif v == \"count\":\n", - " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.count())\" % (k, k))\n", - " commands.append(\" df = pd.DataFrame(df_contents)\")\n", - " return \"\\n\".join(commands)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that `groupby2` has been added to the commands" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -569,48 +293,6 @@ "w = buckaroo.BuckarooWidget(df, auto_clean=True, showCommands=True)\n", "w" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Making a new default dataframe display function" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from buckaroo.widget_utils import disable\n", - "from IPython.core.getipython import get_ipython\n", - "from IPython.display import display\n", - "import warnings\n", - "\n", - "disable()\n", - "def my_display_as_buckaroo(df):\n", - " w = BuckarooWidget(df, showCommands=False)\n", - " #the analysis we added throws warnings, let's muffle that when used as the default display\n", - " warnings.filterwarnings('ignore')\n", - " w.add_analysis(Skew)\n", - " warnings.filterwarnings('default')\n", - " return display(w)\n", - "\n", - "def my_enable():\n", - " \"\"\"\n", - " Automatically use buckaroo to display all DataFrames\n", - " instances in the notebook.\n", - "\n", - " \"\"\"\n", - " ip = get_ipython()\n", - " if ip is None:\n", - " print(\"must be running inside ipython to enable default display via enable()\")\n", - " return\n", - " ip_formatter = ip.display_formatter.ipython_display_formatter\n", - " ip_formatter.for_type(pd.DataFrame, my_display_as_buckaroo)\n", - "my_enable()" - ] } ], "metadata": { @@ -629,7 +311,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.8.18" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/full_build.sh b/full_build.sh index 91e33f393..6ef79ea59 100755 --- a/full_build.sh +++ b/full_build.sh @@ -6,5 +6,5 @@ python -m build . rm -f dist/index.js dist/index.js.LICENSE.txt twine check dist/* python -m twine upload --repository testpypi dist/* -python -m twine upload --repository pypi dist/* +#python -m twine upload --repository pypi dist/* #npm publish diff --git a/package.json b/package.json index 3b7e4275f..20d5bed59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.4.8", + "version": "0.5.0", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index c2edced4e..43405016c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.4.8" +version = "0.5.0" [project.license] file = "LICENSE.txt" @@ -44,10 +44,13 @@ file = "LICENSE.txt" [project.optional-dependencies] test = [ "nbval>=0.9", - "pandas<=1.3.5", + "pandas>=1.3.5", "pytest-cov>=3", "pytest>=6", - "hypothesis>=6.88.1" + "hypothesis>=6.88.1", + "polars>=0.19.4", + "pydantic>=2.5.2", + "pyarrow" ] jupyterlab = ["jupyterlab>=3.6.0"] diff --git a/tests/unit/analysis_management_test.py b/tests/unit/analysis_management_test.py index b2ed38766..f80309866 100644 --- a/tests/unit/analysis_management_test.py +++ b/tests/unit/analysis_management_test.py @@ -4,33 +4,100 @@ ColAnalysis) from buckaroo.pluggable_analysis_framework.analysis_management import ( - AnalsysisPipeline, produce_summary_df, NonExistentSummaryRowException, - DfStats) + AnalysisPipeline, NonExistentSummaryRowException, DfStats, + #produce_summary_df, #test this too + + full_produce_summary_df, produce_series_df) + +from buckaroo.pluggable_analysis_framework.safe_summary_df import (output_full_reproduce) + from buckaroo.customizations.analysis import (TypingStats, DefaultSummaryStats) -from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, word_only_df) +from .fixtures import (test_df, df, DistinctCount, Len, DistinctPer, word_only_df, + empty_df, empty_df_with_columns) class DumbTableHints(ColAnalysis): provides_summary = [ 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def computed_summary(summary_dict): return {'is_numeric':True, 'is_integer':False, 'min_digits':3, 'max_digits':10, 'histogram': []} +class AlwaysErr(ColAnalysis): + provides_summary = ['foo'] + + @staticmethod + def computed_summary(summary_dict): + 1/0 class TestAnalysisPipeline(unittest.TestCase): - def test_produce_summary_df(self): - produce_summary_df(test_df, [DistinctCount, Len, DistinctPer], 'test_df') + def test_produce_series_df(self): + """just make sure this doesn't fail""" + + sdf, errs = produce_series_df( + test_df, [Len], 'test_df', debug=True) + ld = {'len':4} + assert sdf == {'normal_int_series': ld, 'empty_na_ser': ld, 'float_nan_ser': ld} + + sdf2, errs = produce_series_df( + test_df, [DistinctCount], 'test_df', debug=True) + assert sdf2 == {'normal_int_series': {'distinct_count': 4}, + 'empty_na_ser': {'distinct_count':0}, 'float_nan_ser': {'distinct_count':2}} + + sdf3, errs = produce_series_df( + test_df, [DistinctCount, DistinctPer], 'test_df', debug=True) + assert sdf3 == {'normal_int_series': {'distinct_count': 4}, + 'empty_na_ser': {'distinct_count':0}, 'float_nan_ser': {'distinct_count':2}} + + def test_full_produce_summary_df(self): + """just make sure this doesn't fail""" + sdf, th, errs = full_produce_summary_df( + test_df, [DistinctCount, Len, DistinctPer], 'test_df', debug=True) + assert errs == {} + + def test_full_produce_summary_df_empy(self): + """just make sure this doesn't fail""" + + sdf, th, errs = full_produce_summary_df( + empty_df, [DistinctCount, Len, DistinctPer], 'test_df', debug=True) + assert errs == {} + + def test_full_produce_summary_df_empy2(self): + """just make sure this doesn't fail""" + + sdf, th, errs = full_produce_summary_df( + empty_df_with_columns, [DistinctCount, Len, DistinctPer], 'test_df', debug=True) + assert errs == {} + + def test_full_produce_summary_df_errs(self): + """just make sure this doesn't fail""" + single_col_df = test_df[['empty_na_ser']] + sdf, th, errs = full_produce_summary_df( + single_col_df, [AlwaysErr], 'test_df', debug=False) + + err_key = list(errs.keys())[0] + err_val = list(errs.values())[0] + assert err_key == ('empty_na_ser', 'computed_summary') + assert err_val[1] == AlwaysErr + #can't compare instances of Exception classes + # assert errs == { + # ('empty_na_ser', 'computed_summary'): (ZeroDivisionError('division by zero'), AlwaysErr)} + + def test_output_full_reproduce(self): + errs = { + ('empty_na_ser', 'computed_summary'): (ZeroDivisionError('division by zero'), AlwaysErr)} + output_full_reproduce(errs, {'bar':8}, 'testing_df') + def test_produce_summary_df_hints(self): #this test should be ported over to the full basic_widget test with actaul verificaiton of values - summary_df, hints, errs = produce_summary_df( + summary_df, hints, errs = full_produce_summary_df( test_df, [DumbTableHints], 'test_df') for col, hint_obj in hints.items(): @@ -43,31 +110,31 @@ def test_produce_summary_df_hints(self): assert expected_set == set(hint_obj.keys()) def test_pipeline_base(self): - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) #just verify that there are no errors ap.process_df(df) def test_add_aobj(self): - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): provides_summary = ['foo'] requires_summary = ['length'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def computed_summary(summary): return dict(foo=8) assert ap.add_analysis(Foo) == (True, []) #verify no errors thrown sdf, _unused, _unused_errs = ap.process_df(df) - self.assertEqual(sdf.loc['foo']['tripduration'], 8) + self.assertEqual(sdf['tripduration']['foo'], 8) def test_add_buggy_aobj(self): - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): provides_summary = ['foo'] requires_summary = ['length'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def computed_summary(summary_dict): 1/0 #throw an error return dict(foo=8) unit_test_results, errs = ap.add_analysis(Foo) @@ -75,43 +142,103 @@ def summary(sampled_ser, summary_ser, ser): assert unit_test_results is False def test_replace_aobj(self): - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): provides_summary = ['foo'] requires_summary = ['length'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def computed_summary(bar): return dict(foo=8) ap.add_analysis(Foo) sdf, _unused, _unused_errs = ap.process_df(df) - self.assertEqual(sdf.loc['foo']['tripduration'], 8) + self.assertEqual(sdf['tripduration']['foo'], 8) #18 facts returned about tripduration - self.assertEqual(len(sdf['tripduration']), 18) + #FIXME + #self.assertEqual(len(sdf['tripduration']), 18) #Create an updated Foo that returns 9 class Foo(ColAnalysis): provides_summary = ['foo'] requires_summary = ['length'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def computed_summary(bar): return dict(foo=9) ap.add_analysis(Foo) sdf2, _unused, _unused_errs = ap.process_df(df) - self.assertEqual(sdf2.loc['foo']['tripduration'], 9) + self.assertEqual(sdf2['tripduration']['foo'], 9) #still 18 facts returned about tripduration - self.assertEqual(len(sdf2['tripduration']), 18) + #self.assertEqual(len(sdf2['tripduration']), 18) #Create an updated Foo that returns 9 def test_summary_stats_display(self): - ap = AnalsysisPipeline([TypingStats]) - self.assertEqual(ap.summary_stats_display, "all") - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) - print(ap.summary_stats_display) - self.assertTrue("dtype" in ap.summary_stats_display) + class AlwaysFoo(ColAnalysis): + provides_summary = ['foo'] + summary_stats_display = ['foo'] + + @staticmethod + def computed_summary(summary_dict): + return dict(foo=3) + + class AlwaysBar(ColAnalysis): + provides_summary = ['bar'] + summary_stats_display = ['bar'] + + @staticmethod + def computed_summary(summary_dict): + return dict(bar=3) + + ap = AnalysisPipeline([AlwaysFoo]) + self.assertEqual(ap.summary_stats_display, ["foo"]) + ap.add_analysis(AlwaysBar) + assert ap.summary_stats_display == ["bar"] + + ap2 = AnalysisPipeline([AlwaysFoo, AlwaysBar]) + assert ap2.ordered_a_objs == [AlwaysFoo, AlwaysBar] + assert ap2.summary_stats_display == ["bar"] + + def test_summary_stats_display2(self): + """ + defines vagaries of dependent analysis and sumary stats + """ + class AlwaysFoo(ColAnalysis): + provides_summary = ['foo'] + summary_stats_display = ['foo'] + + @staticmethod + def computed_summary(summary_dict): + return dict(foo=3) + class DependsFoo(ColAnalysis): + provides_summary = ['xoq'] + requires_summary = ['foo'] + summary_stats_display = ['xoq'] + + @staticmethod + def computed_summary(summary_dict): + return dict(xoq=3) + + + class AlwaysBar(ColAnalysis): + provides_summary = ['bar'] + summary_stats_display = ['bar'] + + @staticmethod + def computed_summary(summary_dict): + return dict(bar=3) + + ap2 = AnalysisPipeline([AlwaysFoo, AlwaysBar]) + self.assertEqual(ap2.summary_stats_display, ["bar"]) + ap2.add_analysis(DependsFoo) + self.assertEqual(ap2.summary_stats_display, ["xoq"]) + + ap = AnalysisPipeline([DependsFoo, AlwaysFoo]) + self.assertEqual(ap.summary_stats_display, ["xoq"]) + ap2.add_analysis(AlwaysBar) + #Always Bar doesn't depend on anything so it doesn't replace xoq in summary_stats_display + assert ap.summary_stats_display == ["xoq"] def test_add_summary_stats_display(self): - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): provides_summary = ['foo'] requires_summary = ['length'] @@ -121,7 +248,7 @@ class Foo(ColAnalysis): self.assertEquals(ap.summary_stats_display, ['foo']) def test_invalid_summary_stats_display_throws(self): - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): provides_summary = ['foo'] requires_summary = ['length'] @@ -133,7 +260,7 @@ def bad_add(): self.assertRaises(NonExistentSummaryRowException, bad_add) def test_invalid_summary_stats_display_throws2(self): - ap = AnalsysisPipeline([TypingStats, DefaultSummaryStats]) + ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): provides_summary = ['foo'] requires_summary = ['length'] @@ -152,7 +279,7 @@ class SometimesProvides(ColAnalysis): summary_stats_display = ['conditional_on_dtype'] @staticmethod - def summary(sampled_ser, summary_ser, ser): + def series_summary(ser, ser2): import pandas as pd is_numeric = pd.api.types.is_numeric_dtype(ser) if is_numeric: diff --git a/tests/unit/analysis_test.py b/tests/unit/analysis_test.py index f1d9c6c0a..fa92c8d2b 100644 --- a/tests/unit/analysis_test.py +++ b/tests/unit/analysis_test.py @@ -2,13 +2,22 @@ import numpy as np import pandas as pd from buckaroo.customizations.analysis import DefaultSummaryStats, ColDisplayHints +from buckaroo.customizations.histogram import Histogram +from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF +def without(dct, *keys): + cleaned_result = dct.copy() + for k in keys: + cleaned_result = {i:cleaned_result[i] for i in cleaned_result if i!= k } + return cleaned_result text_ser = pd.Series(["foo", "bar", "baz"]) datelike_ser = pd.Series([ "2014-01-01 00:00:06", "2014-01-01 00:00:38", - "2014-01-01 00:03:59"]) + "2014-01-01 00:03:59" + +]) datetime_ser = pd.Series([dtdt(2000, 1, 1), dtdt(2001, 1, 1), pd.NaT]) all_nan_ser = pd.Series([np.nan, np.nan]) int_ser = pd.Series([10, 30, -10, 33]) @@ -18,6 +27,10 @@ nan_mixed_type_ser = pd.Series([np.nan, np.nan, 'y', 'y', 8.0]) unhashable_ser = pd.Series([['a'], ['b']]) +fifty_int_ser = pd.Series([ + 5, 1, 6, 8, 3, 5, 9, 2, 4, 2, 4, 4, 9, 3, 5, 1, 4, 2, 2, 9, 2, 5, + 3, 8, 3, 9, 4, 2, 5, 6, 2, 3, 8, 1, 1, 4, 5, 9, 6, 5, 6, 7, 6, 1, + 7, 5, 8, 7, 3, 1]) all_sers = [ @@ -25,33 +38,118 @@ int_ser, fp_ser, nan_text_ser, nan_mixed_type_ser, unhashable_ser] def test_text_ser(): - DefaultSummaryStats.summary(nan_text_ser, nan_text_ser, nan_text_ser) - DefaultSummaryStats.summary(nan_mixed_type_ser, nan_mixed_type_ser, nan_mixed_type_ser) + DefaultSummaryStats.series_summary(nan_text_ser, nan_text_ser) + DefaultSummaryStats.series_summary(nan_mixed_type_ser, nan_mixed_type_ser) def test_unhashable(): - result = DefaultSummaryStats.summary(unhashable_ser, pd.Series({}), unhashable_ser) + result = DefaultSummaryStats.series_summary(unhashable_ser, unhashable_ser) #print(result) - - assert {'length': 2, 'nan_count': 0, 'distinct_count': 2, 'distinct_per': 1.0, 'empty_count': 0, 'empty_per': 0.0, 'unique_per': 1.0, 'nan_per': 0.0, 'mode': ['a'], 'min': np.nan, 'max': np.nan} == result + cleaned_result = {i:result[i] for i in result if i!='value_counts'} + assert {'length': 2, 'nan_count': 0, + 'mode': ['a'], 'min': np.nan, 'max': np.nan} == cleaned_result def test_unhashable3(): ser = pd.Series([{'a':1, 'b':2}, {'b':10, 'c': 5}]) - DefaultSummaryStats.summary(ser, pd.Series({ }), ser) # 'nan_per' + DefaultSummaryStats.series_summary(ser, ser) # 'nan_per' def test_default_summary_stats(): for ser in all_sers: - print(DefaultSummaryStats.summary(ser, ser, ser)) + print(DefaultSummaryStats.series_summary(ser, ser)) -def test_datetime_hints(): +def xtest_datetime_hints(): result = ColDisplayHints.summary( datetime_ser, {'nan_per':0}, datetime_ser) assert {'type': 'datetime', 'formatter': 'default', 'is_integer': False, 'is_numeric': False, + } == result + +def test_datetime_histogram(): + series_result = Histogram.series_summary( + datetime_ser, datetime_ser) + assert series_result == {'histogram_args':{}} + + summary_result = Histogram.computed_summary( + dict(histogram_args={}, + length=3, + value_counts=pd.Series( + [1,1], + index=pd.DatetimeIndex([ + dtdt(2000, 1, 1), + dtdt(2001, 1, 1)])), + + min=dtdt(2000, 1, 1), + max=dtdt(2001, 1, 1), + is_numeric=False, + nan_per=.33 + )) + + assert { 'histogram': [{'cat_pop': 33.0, 'name': pd.Timestamp('2000-01-01 00:00:00')}, {'cat_pop': 33.0, 'name': pd.Timestamp('2001-01-01 00:00:00')}, - {'name': 'longtail', 'unique': 67.0}], - } == result + {'name': 'longtail', 'unique': 67.0}, + {'NA': 33.0, 'name': 'NA'} + ], + } == summary_result + +def test_numeric_histogram(): + assert {'a':[1,2,3]} == {'a':[1,2,3]} + series_result = Histogram.series_summary( + fifty_int_ser, fifty_int_ser) + + actual_histogram_args = series_result['histogram_args'] + + rest_ha = without(actual_histogram_args, 'meat_histogram', 'normalized_populations') + assert rest_ha == {'high_tail': 9.0, 'low_tail': 1.0} + + + expected_meat_histogram = [[7, 6, 0, 6, 0, 8, 5, 0, 3, 4], + [2. , 2.6, 3.2, 3.8, 4.4, 5. , 5.6, 6.2, 6.8, 7.3999999999999995, 8. ]] + meat_histogram = [x.tolist() for x in actual_histogram_args['meat_histogram']] + assert meat_histogram == expected_meat_histogram + Histogram.computed_summary( + {'histogram_args': actual_histogram_args, + 'value_counts': fifty_int_ser.value_counts(), + 'length':50, + 'min': 1, + 'max': 9, + 'is_numeric':True, + 'nan_per':0}) + +def test_perverse_on_histogram(): + + series_result = Histogram.series_summary( + PERVERSE_DF['all_false'], PERVERSE_DF['all_false']) + assert series_result == {'histogram_args':{}} + Histogram.computed_summary( + dict(histogram_args={}, + length=10, + value_counts=pd.Series( + [10], + index=[False]), + min=False, + max=False, + is_numeric=True, + nan_per=0 + )) + +def test_perverse_on_histogram2(): + + series_result = Histogram.series_summary( + PERVERSE_DF['UInt8None'], PERVERSE_DF['UInt8None']) + assert series_result == {'histogram_args':{}} + Histogram.computed_summary( + dict(histogram_args={}, + length=10, + value_counts=pd.Series( + [10], + index=[False]), + min=False, + max=False, + is_numeric=True, + nan_per=0 + )) + diff --git a/tests/unit/basic_widget_test.py b/tests/unit/basic_widget_test.py index fb55b4596..d4f29d011 100644 --- a/tests/unit/basic_widget_test.py +++ b/tests/unit/basic_widget_test.py @@ -24,10 +24,15 @@ def test_basic_display(): w = BuckarooWidget(df) display(w) +def test_debug_true(): + df = simple_df + w = BuckarooWidget(df, debug=True) + display(w) + def test_interpreter(): #df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') - w = BuckarooWidget(simple_df) + w = BuckarooWidget(simple_df, auto_clean=True) assert w.operation_results['generated_py_code'] == '''def clean(df): df['int_col'] = smart_to_int(df['int_col']) df['str_col'] = df['str_col'].fillna(value='').astype('string').replace('', None) diff --git a/tests/unit/fixtures.py b/tests/unit/fixtures.py index c3c87a031..b562d6983 100644 --- a/tests/unit/fixtures.py +++ b/tests/unit/fixtures.py @@ -12,38 +12,48 @@ df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') +empty_df = pd.DataFrame({}) +empty_df_with_columns = pd.DataFrame({}, columns=[0]) + + + class DistinctCount(ColAnalysis): requires_raw = True - provides_summary = ["distinct_count"] + provides_series_stats = ["distinct_count"] + @staticmethod - def summary(sampled_ser, summary_ser, raw_ser): + def series_summary(sampled_ser, raw_ser): val_counts = raw_ser.value_counts() distinct_count= len(val_counts) return {'distinct_count': distinct_count} class Len(ColAnalysis): - provides_summary = ["len"] + provides_series_stats = ["len"] requires_raw = True + @staticmethod - def summary(sampled_ser, summary_ser, raw_ser): - return {'len': len(raw_ser)} + def series_summary(sampled_ser, ser): + return {'len': len(ser)} class DCLen(ColAnalysis): - provides_summary = ["len", "distinct_count"] + provides_series_stats = ["len", "distinct_count"] requires_raw = True + @staticmethod - def summary(sampled_ser, summary_ser, raw_ser): + def series_summary(sampled_ser, raw_ser): val_counts = raw_ser.value_counts() distinct_count= len(val_counts) - return {'len':len(raw_ser), 'distinct_count':distinct_count} + return {'distinct_count': distinct_count} + class DistinctPer(ColAnalysis): provides_summary = ["distinct_per"] requires_summary = ["len", "distinct_count"] @staticmethod - def summary(sampled_ser, summary_ser, raw_ser): - return {'distinct_per': summary_ser.loc['distinct_count'] / summary_ser.loc['len']} + def computed_summary(summary_dict): + print("summary_dict", summary_dict) + return {'distinct_per': summary_dict['distinct_count'] / summary_dict['len']} class DependsNoProvides(ColAnalysis): requires_summary = ["len"] diff --git a/tests/unit/polars_analysis_management_test.py b/tests/unit/polars_analysis_management_test.py new file mode 100644 index 000000000..bdb8ad3aa --- /dev/null +++ b/tests/unit/polars_analysis_management_test.py @@ -0,0 +1,168 @@ +from unittest import TestCase + +import polars as pl +import numpy as np +from polars import functions as F +from buckaroo.customizations.polars_analysis import ( + VCAnalysis, PlTyping, BasicAnalysis, HistogramAnalysis, + ComputedDefaultSummaryStats) + +from buckaroo.pluggable_analysis_framework.utils import (json_postfix, replace_in_dict) + +from buckaroo.pluggable_analysis_framework.polars_analysis_management import ( + full_produce_summary_df, + produce_series_df, PolarsAnalysis, extract_table_hint) + +test_df = pl.DataFrame({ + 'normal_int_series' : pl.Series([1,2,3,4]), + #'empty_na_ser' : pl.Series([pl.Null] * 4, dtype="Int64"), + 'float_nan_ser' : pl.Series([3.5, np.nan, 4.8, 2.2]) + }) + +word_only_df = pl.DataFrame({'letters': 'h o r s e'.split(' ')}) + +df = pl.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + +empty_df = pl.DataFrame({}) +#empty_df_with_columns = pl.DataFrame({}, columns=[0]) + + + +class SelectOnlyAnalysis(PolarsAnalysis): + + select_clauses = [ + F.all().null_count().name.map(json_postfix('null_count')), + F.all().mean().name.map(json_postfix('mean')), + F.all().quantile(.99).name.map(json_postfix('quin99'))] + + +def test_produce_series_df(): + """just make sure this doesn't fail""" + + sdf, errs = produce_series_df( + test_df, [SelectOnlyAnalysis], 'test_df', debug=True) + expected = { + 'float_nan_ser': {'mean': None, 'null_count': 0, 'quin99': None}, + 'normal_int_series': {'mean': 2.5, 'null_count': 0, 'quin99': 4.0}} + dsdf = replace_in_dict(sdf, [(np.nan, None)]) + assert dsdf == expected + +class MaxAnalysis(PolarsAnalysis): + select_clauses = [F.all().max().name.map(json_postfix('max'))] + +def test_produce_series_combine_df(): + """just make sure this doesn't fail""" + + sdf, errs = produce_series_df( + test_df, [SelectOnlyAnalysis, MaxAnalysis], 'test_df', debug=True) + expected = { + 'float_nan_ser': {'mean': None, 'null_count': 0, 'quin99': None, 'max': 4.8}, + 'normal_int_series': {'mean': 2.5, 'null_count': 0, 'quin99': 4.0, 'max': 4.0}, + } + dsdf = replace_in_dict(sdf, [(np.nan, None)]) + assert dsdf == expected + +def test_produce_series_column_ops(): + mixed_df = pl.DataFrame( + {'string_col': ["foo", "bar", "baz"] + [""]*2, + 'int_col':[1,2,3,30, 100], + 'float_col':[1.1, 1.1, 3, 3, 5]}) + + summary_df, _unused = produce_series_df(mixed_df, [HistogramAnalysis]) + assert summary_df["string_col"] == {} + + assert summary_df["int_col"]["histogram_args"]["meat_histogram"] == ( + [2, 0, 0, 0, 0, 0, 0, 0, 0, 1], + [1.0, 4.0, 7.0, 10.0, 13.0, 16.0, 19.0, 22.0, 25.0, 28.0, 100.0],) + + +HA_CLASSES = [VCAnalysis, PlTyping, BasicAnalysis, ComputedDefaultSummaryStats, HistogramAnalysis] +def test_histogram_analysis(): + cats = [chr(x) for x in range(97, 102)] * 2 + cats += [chr(x) for x in range(103,113)] + cats += ['foo']*30 + ['bar'] * 50 + + df = pl.DataFrame({'categories': cats, 'numerical_categories': [3]*30 + [7] * 70}) + summary_df, _unused, errs = full_produce_summary_df(df, HA_CLASSES, debug=True) + assert summary_df["categories"]["categorical_histogram"] == {'bar': 0.5, 'foo': 0.3, 'longtail': 0.1, 'unique': 0.1} + assert summary_df["numerical_categories"]["categorical_histogram"] == {3:.3, 7:.7, 'longtail': 0.0, 'unique': 0.0} + +def test_numeric_histograms(): + #np.random.standard_normal(50) + #note the negative numbers + float_arr = np.array( + [ 0.15866514, 1.17068755, -0.33565104, 0.65639612, -1.82228383, + -0.31636192, 1.15528901, 0.51853447, -2.46400234, -0.43549045, + 0.00352285, 0.81172013, -0.72803939, -1.00862492, -0.22710132, + -0.3175636 , 0.75857194, -1.78286566, -1.34886293, 0.13987727, + 0.38449789, -1.40855498, 1.87998263, 0.67376218, 0.35140324, + 0.57988045, -0.88552517, -1.89412544, -0.93349705, -0.79151579, + -1.43998107, 0.44633053, 0.46607586, -0.28883213, -0.16766607, + 1.49832905, 0.56894383, 0.66272376, 0.89071271, -2.03593151, + -0.52559652, -1.87226564, -0.55629666, -0.56985112, 0.06456509, + -0.44142502, -2.09803033, 0.51801718, -1.56189092, -1.17083831]) + #make them all positive numbers + float_arr2 = float_arr + 2.46400234 + + #np.round(np.random.standard_normal(50) * 100).astype('int16') + int_arr = np.array( + [-272, 107, -85, 5, -6, 19, 38, -102, -84, 79, 106, + 59, -132, 81, -122, -62, -34, 80, 14, 19, -20, -155, + 1, -9, 82, 37, 114, 76, -90, -2, 63, 169, -239, + -225, 71, 55, 174, 30, -69, 99, 62, -116, 51, -45, + 57, 64, 8, -20, -130, -83]) + int_arr2 = int_arr + 272 + df = pl.DataFrame({ + 'float_col': float_arr, + 'float_col2': float_arr2, + 'int_col': int_arr, + 'int_col2': int_arr2 + }) + + summary_df, _unused, errs = full_produce_summary_df(df, HA_CLASSES, debug=True) + print(summary_df['int_col']['histogram']) + + expected_float_histogram = [ + {'name': '-2.46400234 - -2.46400234', 'tail': 1}, + {'name': '-2--3', 'population': 0.0}, {'name': '-3--3', 'population': 0.0}, + {'name': '-3--2', 'population': 4.0}, {'name': '-2--1', 'population': 17.0}, + {'name': '-1--0', 'population': 19.0}, {'name': '-0-0', 'population': 25.0}, + {'name': '0-1', 'population': 29.0}, {'name': '1-2', 'population': 6.0}, + {'name': '2-2', 'population': 0.0}, {'name': '2-2', 'population': 0.0}, + {'name': '1.87998263 - 1.87998263', 'tail': 1}] + assert summary_df['float_col']['histogram'] == expected_float_histogram + + expected_int_histogram = [ + {'name': '-272 - -272.0', 'tail': 1}, + {'name': '-272--199', 'population': 4.0}, {'name': '-199--158', 'population': 0.0}, + {'name': '-158--117', 'population': 8.0}, {'name': '-117--76', 'population': 12.0}, + {'name': '-76--35', 'population': 6.0}, {'name': '-35-6', 'population': 17.0}, + {'name': '6-47', 'population': 15.0}, {'name': '47-88', 'population': 27.0}, + {'name': '88-129', 'population': 8.0}, {'name': '129-174', 'population': 2.0}, + {'name': '174.0 - 174', 'tail': 1}] + assert summary_df['int_col']['histogram'] == expected_int_histogram + + + +def test_extract_table_hint(): + + summary_dict = {'a': {'null_count': 0, + 'mean': 35.0, + 'max': 100, + 'min': 2, + 'is_numeric': True, + '_type': 'integer', + 'type': 'integer'} + } + + + expected = { + 'a': { + 'type':'integer', + 'is_numeric': True, + 'is_integer': None, + 'min_digits':None, + 'max_digits':None, + 'formatter':None, + 'histogram': []}} + TestCase().assertDictEqual(expected, extract_table_hint(summary_dict, ['a'])) diff --git a/tests/unit/polars_basic_widget_test.py b/tests/unit/polars_basic_widget_test.py new file mode 100644 index 000000000..8b34d0de9 --- /dev/null +++ b/tests/unit/polars_basic_widget_test.py @@ -0,0 +1,16 @@ +import polars as pl + +from buckaroo import polars_buckaroo + +def test_basic_instantiation(): + polars_buckaroo.PolarsBuckarooWidget( + pl.DataFrame({'a':[1,2,3]}), auto_clean=False) + +def test_sdf_hints(): + pbw = polars_buckaroo.PolarsBuckarooWidget( + pl.DataFrame({'a':[1,2,3]}), auto_clean=False, debug=True) + assert pbw.stats.sdf['a']['type'] == 'integer' + +''' +FIXME:test a large dataframe that forces sampling +''' diff --git a/tests/unit/safe_summary_test.py b/tests/unit/safe_summary_test.py new file mode 100644 index 000000000..b54cc4ad3 --- /dev/null +++ b/tests/unit/safe_summary_test.py @@ -0,0 +1,12 @@ +import pandas as pd +import numpy as np +import polars as pl + + +from buckaroo.pluggable_analysis_framework.safe_summary_df import pd_py_serialize + +def test_py_serialize(): + assert pd_py_serialize({'a': pd.NA, 'b': np.nan}) == "{'a': pd.NA, 'b': np.nan, }" + assert pd_py_serialize({'a': None, 'b': "string", 'c': 4, 'd': 10.3 }) ==\ + "{'a': None, 'b': 'string', 'c': 4, 'd': 10.3, }" + assert pd_py_serialize({'a': pl.Series([1,2])}) == "{'a': pl.Series(), }" diff --git a/tests/unit/serialization_pydantic_tests.py b/tests/unit/serialization_pydantic_tests.py new file mode 100644 index 000000000..9673f26ba --- /dev/null +++ b/tests/unit/serialization_pydantic_tests.py @@ -0,0 +1,219 @@ +import time +import json +import pytest +from pydantic import ValidationError +import pandas as pd +import numpy as np +from buckaroo.serialization_utils import df_to_obj +import pydantic + +# import typing +# if typing.TYPE_CHECKING: +# from . import AnyComponent + + +from typing import Optional, List, Literal, Union, Dict + + + +# class BaseFormField(pydantic.BaseModel, ABC, defer_build=True): +# name: str +# title: str | list[str] +# required: bool = False +# error: str | None = None +# locked: bool = False +# description: str | None = None +# class_name: _class_name.ClassName = None + + +class HistogramModel(pydantic.BaseModel): + name: str + population: float + +HT = Optional[List[HistogramModel]] + + +# export interface ColumnStringHint { +# type: 'string'; +# histogram?: any[]; +# } + +class ColumnStringHint(pydantic.BaseModel): + type: Literal["string"] + histogram: HT + +class ColumnObjHint(pydantic.BaseModel): + type: Literal["obj"] + histogram: HT + +# export interface ColumnBooleanHint { +# type: 'boolean'; +# histogram?: any[]; +# } + +class ColumnBooleanHint(pydantic.BaseModel): + type: Literal["boolean"] + histogram: HT + +# export interface ColumnIntegertHint { +# type: 'integer'; +# min_digits: number; +# max_digits: number; +# histogram: any[]; +# } + +class ColumnIntegerHint(pydantic.BaseModel): + type: Literal["integer"] + min_digits:int + max_digits:int + histogram: HT + +class DFColumn(pydantic.BaseModel): + name: str + type: str #should be a union + +ColumnHint = Union[ColumnStringHint, ColumnObjHint, ColumnBooleanHint, ColumnIntegerHint] + +class DFSchema(pydantic.BaseModel): + fields: List[DFColumn] + primaryKey: list[str] #; //['index'] + pandas_version: str #; //'1.4.0', + + +# export type DFDataRow = Record< +# string, +# string | number | boolean | any[] | Record | null +# >; + +# export type DFData = DFDataRow[]; + +DFData = List[Dict[str, Union[str, int, float, None]]] + + + +class DFWhole(pydantic.BaseModel): + schema__ :DFSchema = pydantic.Field(alias='schema') + table_hints: Dict[str, ColumnHint] + data: DFData + +# class DfViewer(pydantic.BaseModel): +# type: 'DFViewer' +# df: DFWhole + +# #Ilike the serialization_alias... but luckily I avoid the need +# #because I don't have any snake cased fields + + +def test_column_hints(): + ColumnStringHint(type="string", histogram=[]) + ColumnStringHint(type="string", histogram=[{'name':'foo', 'population':3500}]) + with pytest.raises(ValidationError) as exc_info: + errant_histogram_entry = {'name':'foo', 'no_population':3500} + ColumnStringHint(type="string", histogram=[errant_histogram_entry]) + assert exc_info.value.errors(include_url=False) == [ + {'type': 'missing', 'loc': ('histogram', 0, 'population'), + 'msg': 'Field required','input': errant_histogram_entry}] + + ColumnBooleanHint(type="boolean", histogram=[]) + +def test_column_hint_extra(): + """verify that we can pass in extra unexpected keys""" + ColumnStringHint(type="string", histogram=[], foo=8) + +def test_dfwhole(): + temp = {'schema': {'fields':[{'name':'foo', 'type':'integer'}], + 'primaryKey':['foo'], 'pandas_version':'1.4.0'}, + 'table_hints': {'foo':{'type':'string', 'histogram':[]}, + 'bar':{'type':'integer', 'min_digits':2, 'max_digits':4, 'histogram':[]}, + 'baz':{'type':'obj', 'histogram':[]}, + }, + 'data': [{'foo': 'hello', 'bar':8}, + {'foo': 'world', 'bar':10}]} + DFWhole(**temp) + +def test_df_to_obj_pydantic(): + named_index_df = pd.DataFrame( + dict(foo=['one', 'two', 'three'], + bar=[1, 2, 3])) + + serialized_df = df_to_obj(named_index_df) + print(json.dumps(serialized_df, indent=4)) + DFWhole(**serialized_df) + +def bimodal(mean_1, mean_2, N, sigma=5): + X1 = np.random.normal(mean_1, sigma, int(N/2)) + X2 = np.random.normal(mean_2, sigma, int(N/2)) + X = np.concatenate([X1, X2]) + return X + +def rand_cat(named_p, na_per, N): + choices, p = [], [] + named_total_per = sum(named_p.values()) + na_per + total_len = int(np.floor(named_total_per * N)) + if named_total_per > 0: + for k, v in named_p.items(): + choices.append(k) + p.append(v/named_total_per) + choices.append(pd.NA) + p.append(na_per/named_total_per) + return [np.random.choice(choices, p=p) for k in range(total_len)] + return [] + +def random_categorical(named_p, unique_per, na_per, longtail_per, N): + choice_arr = rand_cat(named_p, na_per, N) + discrete_choice_len = len(choice_arr) + + longtail_count = int(np.floor(longtail_per * N))//2 + extra_arr = [] + for i in range(longtail_count): + extra_arr.append("long_%d" % i) + extra_arr.append("long_%d" % i) + + unique_len = N - (len(extra_arr) + discrete_choice_len) + for i in range(unique_len): + extra_arr.append("unique_%d" % i) + all_arr = np.concatenate([choice_arr, extra_arr]) + np.random.shuffle(all_arr) + try: + return pd.Series(all_arr, dtype='UInt64') + except Exception: # this is test fixture code + return pd.Series(all_arr, dtype=pd.StringDtype()) + + +def _test_df_to_obj_timing(): + N = 100_000 + df = pd.DataFrame({ + 'normal': np.random.normal(25, .3, N), + 'exponential' : np.random.exponential(1.0, N) * 10 , + 'increasing':[i for i in range(N)], + 'one': [1]*N, + 'dominant_categories': random_categorical({'foo': .6, 'bar': .25, 'baz':.15}, unique_per=0, na_per=0, longtail_per=0, N=N), + 'all_unique_cat': random_categorical({}, unique_per=1, na_per=0, longtail_per=0, N=N), + 'all_NA' : pd.Series([pd.NA] * N, dtype='UInt8'), + 'half_NA' : random_categorical({1: .55}, unique_per=0, na_per=.45, longtail_per=.0, N=N), + 'longtail' : random_categorical({}, unique_per=0, na_per=.2, longtail_per=.8, N=N), + 'longtail_unique' : random_categorical({}, unique_per=0.5, na_per=.0, longtail_per=.5, N=N)}) + + + start_serialize = time.time() + serialized_df = df_to_obj(df) + end_serialize = time.time() + DFWhole(**serialized_df) + end_pydantic = time.time() + + json.dumps(serialized_df) + end_json_time = time.time() + + serialize_time = end_serialize - start_serialize + pydantic_time = end_pydantic - end_serialize + json_time = end_json_time - end_pydantic + + print("serialize_time ", serialize_time) + print("pydantic_time ", pydantic_time) + print("json_time ", json_time) + + #pydantic time was about 1/5th of serialization time + #json.dumps time was around 2/5ths of serialization time + + #the following line triggers an error which will force printing + #1/0 diff --git a/tests/unit/serialization_utils_test.py b/tests/unit/serialization_utils_test.py index 897d775f0..e3b331951 100644 --- a/tests/unit/serialization_utils_test.py +++ b/tests/unit/serialization_utils_test.py @@ -1,12 +1,8 @@ +import pytest +from pydantic import BaseModel, ValidationError import pandas as pd -import numpy as np -from buckaroo.serialization_utils import pd_py_serialize, df_to_obj +from buckaroo.serialization_utils import df_to_obj -def test_py_serialize(): - assert pd_py_serialize({'a': pd.NA, 'b': np.nan}) == "{'a': pd.NA, 'b': np.nan, }" - assert pd_py_serialize({'a': None, 'b': "string", 'c': 4, 'd': 10.3 }) ==\ - "{'a': None, 'b': 'string', 'c': 4, 'd': 10.3, }" - def test_df_to_obj(): named_index_df = pd.DataFrame( dict(names=['one', 'two', 'three'], @@ -14,3 +10,15 @@ def test_df_to_obj(): serialized_df = df_to_obj(named_index_df) assert serialized_df['data'][0]['names'] == 'one' + +def test_int_overflow_validation(): + value=float('nan') + class Model(BaseModel): + a: int + Model(a=3) + with pytest.raises(ValidationError) as exc_info: + Model(a=value) + assert exc_info.value.errors(include_url=False) == [ + {'type': 'finite_number', 'loc': ('a',), 'msg': 'Input should be a finite number', + 'input': value + }] From d674b7c26f98e7e363db50676b57055e2010dd54 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 22 Dec 2023 15:41:49 -0500 Subject: [PATCH 202/250] Chore/cleanup release 0.5.1 (#200) * bump to 0.5.1 --- buckaroo/_version.py | 2 +- buckaroo/customizations/polars_analysis.py | 8 ++++---- example-notebooks/Full-tour.ipynb | 12 +++++++++++- pyproject.toml | 5 +++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 72f2b47fa..51b24f16f 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.5.0" +__version__ = "0.5.1" diff --git a/buckaroo/customizations/polars_analysis.py b/buckaroo/customizations/polars_analysis.py index 66767ccbe..ecf44a1d6 100644 --- a/buckaroo/customizations/polars_analysis.py +++ b/buckaroo/customizations/polars_analysis.py @@ -57,13 +57,13 @@ def computed_summary(summary_dict): class VCAnalysis(PolarsAnalysis): provides_summary = ['value_counts'] select_clauses = [ - pl.all().exclude("counts").value_counts(sort=True) + pl.all().exclude("count").value_counts(sort=True) .implode().name.map(json_postfix('value_counts')), - pl.selectors.matches("^counts$") + pl.selectors.matches("^count$") .alias("not_counts") .value_counts(sort=True) .implode() - .alias("counts").name.map(json_postfix('value_counts'))] + .alias("count").name.map(json_postfix('value_counts'))] class BasicAnalysis(PolarsAnalysis): @@ -84,7 +84,7 @@ class BasicAnalysis(PolarsAnalysis): @staticmethod def computed_summary(summary_dict): temp_df = pl.DataFrame({'vc': summary_dict['value_counts'].explode()}).unnest('vc') - regular_col_vc_df = temp_df.select(pl.all().exclude('counts').alias('key'), pl.col('counts')) + regular_col_vc_df = temp_df.select(pl.all().exclude('count').alias('key'), pl.col('count')) return dict(mode=regular_col_vc_df[0]['key'][0]) diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb index 17294e6f7..7eec65e9f 100644 --- a/example-notebooks/Full-tour.ipynb +++ b/example-notebooks/Full-tour.ipynb @@ -228,6 +228,15 @@ "# Buckaroo also works on polars" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install --upgrade polars" + ] + }, { "cell_type": "code", "execution_count": null, @@ -237,7 +246,8 @@ "outputs": [], "source": [ "import polars as pl\n", - "pl.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')" + "df.to_csv('cb_trips.csv')\n", + "pl.read_csv('cb_trips.csv')" ] }, { diff --git a/pyproject.toml b/pyproject.toml index 43405016c..288d0360f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,12 +36,13 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.5.0" +version = "0.5.1" [project.license] file = "LICENSE.txt" [project.optional-dependencies] + test = [ "nbval>=0.9", "pandas>=1.3.5", @@ -52,7 +53,7 @@ test = [ "pydantic>=2.5.2", "pyarrow" ] - +polars = ["polars>=0.20.2"] jupyterlab = ["jupyterlab>=3.6.0"] notebook = ["notebook>=7.0.0"] From 3bc63ada52c4430a8133c6c688c0b975ef110e4f Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 8 Feb 2024 10:54:35 -0500 Subject: [PATCH 203/250] unit test fixes (#214) --- buckaroo/_version.py | 2 +- buckaroo/customizations/histogram.py | 23 ++++++++----------- docs/source/conf.py | 2 +- package.json | 2 +- pyproject.toml | 2 +- tests/unit/polars_analysis_management_test.py | 14 +++++++++-- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 51b24f16f..0d96d056f 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.5.1" +__version__ = "0.5.2" diff --git a/buckaroo/customizations/histogram.py b/buckaroo/customizations/histogram.py index d67e22a83..79aa6b1e5 100644 --- a/buckaroo/customizations/histogram.py +++ b/buckaroo/customizations/histogram.py @@ -2,10 +2,6 @@ import numpy as np from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis -import numpy.typing as npt -from typing_extensions import TypedDict -from typing import List, Tuple, Any - def numeric_histogram_labels(endpoints): left = endpoints[0] @@ -53,17 +49,18 @@ def categorical_histogram(length:int, val_counts, nan_per:float, top_n_positions histogram.append(nan_observation) return histogram -histogram_args = TypedDict('histogram_args', { - 'meat_histogram': Tuple[npt.NDArray[np.intp], npt.NDArray[Any]], - 'low_tail': float, 'high_tail':float}) +# histogram_args = TypedDict('histogram_args', { +# 'meat_histogram': Tuple[npt.NDArray[np.intp], npt.NDArray[Any]], +# 'low_tail': float, 'high_tail':float}) -class Histogram_Args(TypedDict): - meat_histogram: Tuple[List[int], List[float]] - normalized_populations:List[float] - low_tail: float - high_tail: float +# class Histogram_Args(TypedDict): +# meat_histogram: Tuple[List[int], List[float]] +# normalized_populations:List[float] +# low_tail: float +# high_tail: float -def numeric_histogram(histogram_args: Histogram_Args , min_, max_, nan_per): +#def numeric_histogram(histogram_args: Histogram_Args , min_, max_, nan_per): +def numeric_histogram(histogram_args, min_, max_, nan_per): low_tail, high_tail = histogram_args['low_tail'], histogram_args['high_tail'] ret_histo = [] diff --git a/docs/source/conf.py b/docs/source/conf.py index feb90e74e..704c07ea1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.5.0' +release = '0.5.2' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/package.json b/package.json index 20d5bed59..5d39baeb7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.5.0", + "version": "0.5.2", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 288d0360f..6f02e11ab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.5.1" +version = "0.5.2" [project.license] file = "LICENSE.txt" diff --git a/tests/unit/polars_analysis_management_test.py b/tests/unit/polars_analysis_management_test.py index bdb8ad3aa..592e21297 100644 --- a/tests/unit/polars_analysis_management_test.py +++ b/tests/unit/polars_analysis_management_test.py @@ -84,8 +84,18 @@ def test_histogram_analysis(): df = pl.DataFrame({'categories': cats, 'numerical_categories': [3]*30 + [7] * 70}) summary_df, _unused, errs = full_produce_summary_df(df, HA_CLASSES, debug=True) - assert summary_df["categories"]["categorical_histogram"] == {'bar': 0.5, 'foo': 0.3, 'longtail': 0.1, 'unique': 0.1} - assert summary_df["numerical_categories"]["categorical_histogram"] == {3:.3, 7:.7, 'longtail': 0.0, 'unique': 0.0} + + actual_cats = summary_df["categories"]["categorical_histogram"] + expected_cats = {'bar': 0.5, 'foo': 0.3, 'longtail': 0.1, 'unique': 0.1} + assert actual_cats == expected_cats + + + actual_numcats = summary_df["numerical_categories"]["categorical_histogram"] + + rounded_actual_numcats = dict([(k, np.round(v,2)) for k,v in actual_numcats.items()]) + expected_categorical_histogram = {3:.3, 7:.7, 'longtail': 0.0, 'unique': 0.0} + assert rounded_actual_numcats == expected_categorical_histogram + def test_numeric_histograms(): #np.random.standard_normal(50) From 114f9498477cf53b5aeabef7895ee4bdcdd9b40d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 9 Feb 2024 13:39:43 -0500 Subject: [PATCH 204/250] Feat/dfviewer config (#201) Release 0.6.1 New cleaner types and config for the frontend components. More Displayers (formatters, and cell renderers) Pinned_row config Cycling of config options (summary_stats, auto_clean...) post processing Fixes: [HTML Linkification](https://github.com/paddymul/buckaroo/issues/194) [add frozen_row config](https://github.com/paddymul/buckaroo/issues/176) [add column level summary stats](https://github.com/paddymul/buckaroo/issues/188) [ Timestamps don't align properly because of the Z character #148 ](https://github.com/paddymul/buckaroo/issues/148) [ valid python formatter #141 ](https://github.com/paddymul/buckaroo/issues/141) [ https://github.com/paddymul/buckaroo/issues/106 ](https://github.com/paddymul/buckaroo/issues/106) [ Add column level tooltip or affordance about autocleaning #79 ](https://github.com/paddymul/buckaroo/issues/79) [ Add correlations view #68 ](https://github.com/paddymul/buckaroo/issues/68) [ Add Red/Black conditional formatting #58 ]( https://github.com/paddymul/buckaroo/issues/58) [ Add colormap conditioning #59 ](https://github.com/paddymul/buckaroo/issues/59) [ Allow UI cycling through option sets #49 ](https://github.com/paddymul/buckaroo/issues/49) [ Multiple DataFrame placeholder #22 ](https://github.com/paddymul/buckaroo/issues/22) [ Support filters #3 ](https://github.com/paddymul/buckaroo/issues/3) [ Verify that series actually provide the rows they say they will #142 ](https://github.com/paddymul/buckaroo/issues/142) --- .eslintignore | 3 +- .github/workflows/build.yml | 18 +- .readthedocs.yaml | 4 +- buckaroo/_version.py | 2 +- buckaroo/buckaroo_widget.py | 291 ++--- buckaroo/customizations/analysis.py | 59 +- buckaroo/customizations/histogram.py | 7 +- buckaroo/customizations/polars_analysis.py | 114 +- buckaroo/customizations/styling.py | 53 + buckaroo/dataflow.py | 584 ++++++++++ .../analysis_management.py | 106 +- .../pluggable_analysis_framework.py | 33 +- .../polars_analysis_management.py | 55 +- buckaroo/polars_buckaroo.py | 34 +- buckaroo/serialization_utils.py | 68 +- buckaroo/trait_utils.py | 50 + buckaroo/widget_utils.py | 17 +- .../_static/embed-bundle.js.LICENSE.txt | 4 +- docs/source/articles/data_flow.rst | 208 ++++ docs/source/articles/dataflow.dot | 145 +++ docs/source/articles/dev-notes.rst | 12 + docs/source/articles/glossary.dot | 57 + docs/source/conf.py | 9 +- example-notebooks/Exception-Traits-demo.ipynb | 216 ++++ example-notebooks/Extending.ipynb | 440 ++++++++ example-notebooks/Full-tour.ipynb | 45 +- example-notebooks/Histograms-demo.ipynb | 15 +- ...ynb => Pluggable-Analysis-Framework.ipynb} | 145 +-- example-notebooks/styling-gallery.ipynb | 632 +++++++++++ example-notebooks/styling-howto.ipynb | 545 +++++++++ example-notebooks/testcases-fast.ipynb | 245 ++-- examples/App.tsx | 5 +- examples/ex/CommandViewerEx.tsx | 2 +- examples/ex/DFViewerEx.tsx | 10 +- examples/ex/DFViewerEx_large.tsx | 266 +++++ examples/ex/DFViewerEx_real_summary.tsx | 20 + examples/ex/DFViewerEx_string_index.tsx | 1005 ++++++++++++++++- examples/ex/HistogramEx.tsx | 27 +- full_build.sh | 2 +- js/baked_data/colorMap.ts | 83 ++ js/{components => baked_data}/staticData.ts | 448 ++++---- js/components/ColumnsEditor.tsx | 15 +- js/components/DCFCell.tsx | 142 ++- js/components/DFViewer.tsx | 164 --- js/components/DFViewerParts/DFViewer.tsx | 136 +++ js/components/DFViewerParts/DFWhole.ts | 166 +++ js/components/DFViewerParts/Displayer.ts | 208 ++++ .../HistogramCell.tsx} | 45 +- .../DFViewerParts/SeriesSummaryTooltip.tsx | 20 + js/components/DFViewerParts/gridUtils.ts | 322 ++++++ js/components/DependentTabs.tsx | 10 +- js/components/Operations.tsx | 4 +- js/components/StatusBar.tsx | 285 +++-- js/components/WidgetTypes.tsx | 38 + js/components/gridUtils.ts | 201 ---- js/components/utils.ts | 33 +- js/dcefwidget.ts | 2 - js/{components => vendor}/RechartExtra.ts | 0 js/{components => vendor}/RechartTooltip.tsx | 0 package.json | 18 +- pyproject.toml | 5 +- tests/ts/gridUtils.test.ts | 69 ++ tests/unit/analysis_management_test.py | 173 +-- tests/unit/analysis_test.py | 38 +- tests/unit/basic_widget_test.py | 37 +- tests/unit/dataflow/__init__.py | 0 .../dataflow/customizable_dataflow_test.py | 198 ++++ tests/unit/dataflow/dataflow_polars_test.py | 216 ++++ tests/unit/dataflow/dataflow_test.py | 209 ++++ tests/unit/experimental_pydantic.py | 236 ++++ tests/unit/fixtures.py | 6 +- tests/unit/histogram_test.py | 67 ++ tests/unit/perf_regression_test.py | 11 +- .../unit/pluggable_analysis_framework_test.py | 16 +- tests/unit/polars_analysis_management_test.py | 89 +- tests/unit/polars_analysis_tests.py | 59 + tests/unit/polars_basic_widget_test.py | 218 +++- tests/unit/serialization_pydantic_tests.py | 299 +++-- tests/unit/serialization_utils_test.py | 26 +- tsconfig.json | 2 +- yarn.lock | 17 +- 81 files changed, 7983 insertions(+), 1901 deletions(-) create mode 100644 buckaroo/customizations/styling.py create mode 100644 buckaroo/dataflow.py create mode 100644 buckaroo/trait_utils.py create mode 100644 docs/source/articles/data_flow.rst create mode 100644 docs/source/articles/dataflow.dot create mode 100644 docs/source/articles/dev-notes.rst create mode 100644 docs/source/articles/glossary.dot create mode 100644 example-notebooks/Exception-Traits-demo.ipynb create mode 100644 example-notebooks/Extending.ipynb rename example-notebooks/{Customizing-Buckaroo.ipynb => Pluggable-Analysis-Framework.ipynb} (67%) create mode 100644 example-notebooks/styling-gallery.ipynb create mode 100644 example-notebooks/styling-howto.ipynb create mode 100644 examples/ex/DFViewerEx_large.tsx create mode 100644 examples/ex/DFViewerEx_real_summary.tsx create mode 100644 js/baked_data/colorMap.ts rename js/{components => baked_data}/staticData.ts (50%) delete mode 100644 js/components/DFViewer.tsx create mode 100644 js/components/DFViewerParts/DFViewer.tsx create mode 100644 js/components/DFViewerParts/DFWhole.ts create mode 100644 js/components/DFViewerParts/Displayer.ts rename js/components/{CustomHeader.tsx => DFViewerParts/HistogramCell.tsx} (83%) create mode 100644 js/components/DFViewerParts/SeriesSummaryTooltip.tsx create mode 100644 js/components/DFViewerParts/gridUtils.ts create mode 100644 js/components/WidgetTypes.tsx delete mode 100644 js/components/gridUtils.ts rename js/{components => vendor}/RechartExtra.ts (100%) rename js/{components => vendor}/RechartTooltip.tsx (100%) create mode 100644 tests/ts/gridUtils.test.ts create mode 100644 tests/unit/dataflow/__init__.py create mode 100644 tests/unit/dataflow/customizable_dataflow_test.py create mode 100644 tests/unit/dataflow/dataflow_polars_test.py create mode 100644 tests/unit/dataflow/dataflow_test.py create mode 100644 tests/unit/experimental_pydantic.py create mode 100644 tests/unit/histogram_test.py create mode 100644 tests/unit/polars_analysis_tests.py diff --git a/.eslintignore b/.eslintignore index 61f95dc71..ec65eed30 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,4 +3,5 @@ dist coverage **/*.d.ts tests -js/components/RechartTooltip.tsx \ No newline at end of file +js/vendor/RechartTooltip.tsx +js/baked_data/colorMap.ts \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a88d0e60..a74f4a8ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,16 @@ jobs: run: | python -m pip install -U codecov npm install -g codecov + + - name: Check docs can be build + links + if: ${{ matrix.os == 'ubuntu-latest' }} + working-directory: docs + run: | + sudo apt install -y pandoc graphviz + pip install sphinx==7.1.2 pytest-check-links graphviz==0.20.1 + make html + python -m pytest --check-links + - name: Test the extension run: | python -m pip install --upgrade -v -e ".[test, examples, docs]" @@ -54,14 +64,6 @@ jobs: ./dist ./js/*.tgz - - name: Check docs can be build + links - if: ${{ matrix.os == 'ubuntu-latest' }} - working-directory: docs - run: | - sudo apt install -y pandoc - pip install pytest-check-links - make html - python -m pytest --check-links ui-test: needs: [build] diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 10c1b017f..8287f2413 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -3,4 +3,6 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.11" \ No newline at end of file + python: "3.11" + apt_packages: + - graphviz diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 0d96d056f..8f6b3fa07 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.5.2" +__version__ = "0.6.1" diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index d981e457a..ee7884977 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -7,246 +7,111 @@ """ TODO: Add module docstring """ -import warnings -import traceback from ipywidgets import DOMWidget from traitlets import Unicode, List, Dict, observe from ._frontend import module_name, module_version -from .customizations.all_transforms import configure_buckaroo, DefaultCommandKlsList -from .jlisp.lisp_utils import (lists_match, split_operations) +from .customizations.all_transforms import DefaultCommandKlsList -from .auto_clean.auto_clean import get_auto_type_operations, get_typing_metadata, recommend_type -from .customizations.down_sample import sample -from .customizations.analysis import (TypingStats, ComputedDefaultSummaryStats, DefaultSummaryStats, ColDisplayHints) +from .customizations.analysis import (TypingStats, ComputedDefaultSummaryStats, DefaultSummaryStats) from .customizations.histogram import (Histogram) +from .customizations.styling import (DefaultSummaryStatsStyling, DefaultMainStyling) from .pluggable_analysis_framework.analysis_management import DfStats -from .pluggable_analysis_framework.utils import get_df_name +from .pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis -from .serialization_utils import df_to_obj, EMPTY_DF_OBJ +from .serialization_utils import EMPTY_DF_WHOLE +from .dataflow import CustomizableDataflow, StylingAnalysis, exception_protect -FAST_SUMMARY_WHEN_GREATER = 1_000_000 -class BuckarooWidget(DOMWidget): - """TODO: Add docstring here +class BuckarooWidget(CustomizableDataflow, DOMWidget): + """Extends CustomizableDataFlow and DOMWIdget + + Replaces generic options in CustomizableDataFlow with Pandas implementations + Also adds buckaroo_state object and communication to simpler CustomizableDataFlow implementations + """ + + #### DOMWidget Boilerplate _model_name = Unicode('DCEFWidgetModel').tag(sync=True) _model_module = Unicode(module_name).tag(sync=True) _model_module_version = Unicode(module_version).tag(sync=True) _view_name = Unicode('DCEFWidgetView').tag(sync=True) _view_module = Unicode(module_name).tag(sync=True) _view_module_version = Unicode(module_version).tag(sync=True) + #END DOMWidget Boilerplate - commandConfig = Dict({}).tag(sync=True) operations = List().tag(sync=True) - machine_gen_operations = List().tag(sync=True) - command_classes = DefaultCommandKlsList - analysis_classes = [TypingStats, DefaultSummaryStats, - Histogram, - ComputedDefaultSummaryStats, - ColDisplayHints] - DFStatsClass = DfStats - - typing_metadata_f = staticmethod(get_typing_metadata) - typing_recommend_f = staticmethod(recommend_type) - - df_json = Dict({}).tag(sync=True) - summary_df_json = Dict({}).tag(sync=True) - operation_results = Dict( - {'transformed_df': EMPTY_DF_OBJ, 'generated_py_code':'# instantiation, unused'} + {'transformed_df': EMPTY_DF_WHOLE, 'generated_py_code':'# instantiation, unused'} ).tag(sync=True) - dfConfig = Dict( - { - 'totalRows': 1234569, - 'columns': 30, - 'rowsShown': 0, - 'sampleSize': 10_000, - 'sampled':False, - 'summaryStats': False, - 'reorderdColumns': False, - 'showCommands': True, - 'auto_clean': False, + df_meta = Dict({ + 'columns': 5, + 'rows_shown': 20, + 'total_rows': 877}).tag(sync=True) + + + buckaroo_state = Dict({ + 'auto_clean': 'conservative', + 'post_processing': '', + 'sampled': False, + 'show_commands': False, + 'df_display': 'main', + 'search_string': '', }).tag(sync=True) - def should_sample(self, df, sampled, reorderdColumns): - rows = len(df) - cols = len(df.columns) - item_count = rows * cols - fast_mode = sampled or reorderdColumns - if item_count > FAST_SUMMARY_WHEN_GREATER: - fast_mode = True - if fast_mode: - return True - return False - - def get_df_config(self, df, sampled, reorderdColumns, showCommands): - tempDfc = self.dfConfig.copy() - tempDfc.update(dict( - totalRows=len(df), - columns=len(df.columns), - showCommands=showCommands)) - tempDfc['sampled'] = self.should_sample(df, sampled, reorderdColumns) - return tempDfc - - def __init__(self, df, - sampled=True, - summaryStats=False, - reorderdColumns=False, - showCommands=False, - auto_clean=False, - postProcessingF=None, - debug=False - ): - - super().__init__() - if not debug: - warnings.filterwarnings('ignore') - #moving setup_from_command_kls_list early in the init because - #it's relatively benign and not tied to other linked updates - self.postProcessingF = postProcessingF - self.processed_result = None - self.transformed_df = None - self.debug = debug - self.df_name = get_df_name(df) - - self.setup_from_command_kls_list() - self.dfConfig = self.get_df_config(df, sampled, reorderdColumns, showCommands) - #we need dfConfig setup first before we get the proper working_df for auto_cleaning - self.raw_df = df - self.run_autoclean(auto_clean) - warnings.filterwarnings('default') - - - def run_autoclean(self, auto_clean): - if auto_clean: - # this will trigger the setting of self.typed_df - self.operations = get_auto_type_operations( - self.raw_df, metadata_f=self.typing_metadata_f, - recommend_f=self.typing_recommend_f) - else: - self.set_typed_df(self.get_working_df()) - #need to run this for the no autoclean case - self.run_post_processing() - - def set_metadata_f(self, new_f): - self.typing_metadata_f = staticmethod(new_f) - self.run_autoclean() - - def set_recommend_f(self, new_f): - self.typing_recommend_f = staticmethod(new_f) - self.run_autoclean() - - @observe('dfConfig') - def update_based_on_df_config(self, change): - #otherwise this is a call before typed_df has been completely setup - if hasattr(self, 'typed_df'): - if self.dfConfig['reorderdColumns']: - #ideally this won't require a reserialization. All - #possible col_orders shoudl be serialized once, and the - #frontend should just toggle from them - self.df_json = df_to_obj(self.typed_df, self.stats.col_order, table_hints=self.stats.table_hints) - else: - self.df_json = df_to_obj(self.typed_df, self.typed_df.columns, table_hints=self.stats.table_hints) - - @observe('operations') - def handle_operations(self, change): - if lists_match(change['old'], change['new']): - return - new_ops = change['new'] - split_ops = split_operations(new_ops) - self.machine_gen_operations = split_ops[0] - - user_gen_ops = split_ops[1] - - #if either the user_gen part or the machine_gen part changes, - #we still have to recompute the generated code and - #resulting_df because the input df will be different - - results = {} - try: - self.transformed_df = self.interpret_ops(user_gen_ops, self.typed_df) - #note we call gneerate_py_code based on the full - #self.operations, this makes sure that machine_gen - #cleaning code shows up too - results['generated_py_code'] = self.generate_code(new_ops) - results['transformed_df'] = df_to_obj(self.transformed_df) - results['transform_error'] = False - self.run_post_processing() - except Exception as e: - results['transformed_df'] = EMPTY_DF_OBJ - traceback.print_exc() - results['transform_error'] = str(e) - self.operation_results = results - - def run_post_processing(self): - if self.postProcessingF: - try: - if self.transformed_df is None: - working_df = self.get_working_df() - else: - working_df = self.transformed_df - self.processed_result = self.postProcessingF(working_df) - except Exception: - traceback.print_exc() - - @observe('machine_gen_operations') - def interpret_machine_gen_ops(self, change, force=False): - if (not force) and lists_match(change['old'], change['new']): - return # nothing changed, do no computations - new_ops = change['new'] - self.set_typed_df(self.interpret_ops(new_ops, self.get_working_df())) - - def get_working_df(self): - #this won't listen to sampled changes proeprly - if self.dfConfig['sampled']: - return sample(self.raw_df, self.dfConfig['sampleSize']) - else: - return self.raw_df + @observe('buckaroo_state') + @exception_protect('buckaroo_state-protector') + def _buckaroo_state(self, change): + #how to control ordering of column_config??? + # dfviewer_config = self._get_dfviewer_config(self.merged_sd, self.style_method) + # self.widget_args_tuple = [self.processed_df, self.merged_sd, dfviewer_config] + old, new = change['old'], change['new'] + if not old['post_processing'] == new['post_processing']: + self.post_processing_method = new['post_processing'] + + - def set_typed_df(self, new_df): - self.typed_df = new_df - # stats need to be rerun each time - self.stats = self.DFStatsClass( - self.typed_df, - self.analysis_classes, - self.df_name, debug=self.debug) - self.summary_df_json = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) - self.update_based_on_df_config(3) + #widget config. Change these via inheritance to alter core behaviors of buckaroo + command_klasses = DefaultCommandKlsList + analysis_klasses = [TypingStats, DefaultSummaryStats, + Histogram, + ComputedDefaultSummaryStats, + StylingAnalysis, + DefaultSummaryStats, + DefaultSummaryStatsStyling, DefaultMainStyling] - def generate_code(self, operations): - if len(operations) == 0: - return 'no operations' - return self.buckaroo_to_py_core(operations) - - def interpret_ops(self, new_ops, df): - operations = [{'symbol': 'begin'}] - operations.extend(new_ops) - if len(operations) == 1: - return df - return self.buckaroo_transform(operations , df) - - def setup_from_command_kls_list(self): - #used to initially setup the interpreter, and when a command - #is added interactively - command_defaults, command_patterns, self.buckaroo_transform, self.buckaroo_to_py_core = configure_buckaroo( - self.command_classes) - self.commandConfig = dict(argspecs=command_patterns, defaultArgs=command_defaults) - - - def add_command(self, incomingCommandKls): - without_incoming = [x for x in self.command_classes if not x.__name__ == incomingCommandKls.__name__] - without_incoming.append(incomingCommandKls) - self.command_classes = without_incoming - self.setup_from_command_kls_list() - - def add_analysis(self, analysis_obj): - self.stats.add_analysis(analysis_obj) - self.summary_df_json = df_to_obj(self.stats.presentation_sdf, self.stats.col_order) - #just trigger redisplay - self.update_based_on_df_config(3) + DFStatsClass = DfStats + + + def add_analysis(self, analysis_klass): + """ + same as get_summary_sd, call whatever to set summary_sd and trigger further comps + """ + + stats = self.DFStatsClass( + self.processed_df, + self.analysis_klasses, + self.df_name, debug=self.debug) + stats.add_analysis(analysis_klass) + self.analysis_klasses = stats.ap.ordered_a_objs + self.setup_options_from_analysis() + self.summary_sd = stats.sdf + + def add_processing(self, df_processing_func): + proc_func_name = df_processing_func.__name__ + class DecoratedProcessing(ColAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + new_df = df_processing_func(df) + return [new_df, {}] + post_processing_method = proc_func_name + self.add_analysis(DecoratedProcessing) + temp_buckaroo_state = self.buckaroo_state.copy() + temp_buckaroo_state['post_processing'] = proc_func_name + self.buckaroo_state = temp_buckaroo_state diff --git a/buckaroo/customizations/analysis.py b/buckaroo/customizations/analysis.py index 9f8bb1e10..20c7d1316 100644 --- a/buckaroo/customizations/analysis.py +++ b/buckaroo/customizations/analysis.py @@ -1,6 +1,5 @@ import pandas as pd import numpy as np -from buckaroo.customizations.analysis_utils import int_digits from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis import warnings @@ -24,11 +23,15 @@ def probable_datetime(ser): return False def get_mode(ser): - mode_raw = ser.mode() - if len(mode_raw) == 0: + try: + mode_raw = ser.mode() + if len(mode_raw) == 0: + return np.nan + else: + return mode_raw.values[0] + except Exception: return np.nan - else: - return mode_raw.values[0] + """ to best take advantage of the DAG and pluggable_analysis_framework, structure your code as follows @@ -42,13 +45,15 @@ def get_mode(ser): """ class TypingStats(ColAnalysis): - provides_summary = [ - 'dtype', 'is_numeric', 'is_integer', 'is_datetime', 'is_bool', 'is_float', '_type'] + + provides_defaults = { + 'dtype':'asdf', 'is_numeric':False, 'is_integer':False, + 'is_datetime':False, 'is_bool':False, 'is_float':False, '_type':'asdf'} @staticmethod def series_summary(sampled_ser, ser): return dict( - dtype=ser.dtype, + dtype=str(ser.dtype), is_numeric=pd.api.types.is_numeric_dtype(ser), is_integer=pd.api.types.is_integer_dtype(ser), is_datetime=probable_datetime(ser), @@ -75,11 +80,9 @@ def computed_summary(summary_dict): return dict(_type=_type) class DefaultSummaryStats(ColAnalysis): - provides_summary = [ - 'length', 'min', 'max', 'mean', 'nan_count', - 'value_counts', 'mode'] - - + provides_defaults = { + 'length':0, 'min':0, 'max':0, 'mean':0, 'nan_count':0, + 'value_counts':0, 'mode':0} @staticmethod def series_summary(sampled_ser, ser): l = len(ser) @@ -104,16 +107,14 @@ def series_summary(sampled_ser, ser): class ComputedDefaultSummaryStats(ColAnalysis): - summary_stats_display = [ - 'dtype', - 'length', 'nan_count', 'distinct_count', 'empty_count', - 'empty_per', 'unique_per', 'is_numeric', 'is_integer', - 'is_datetime', 'mode', 'min', 'max','mean'] requires_summary = ['length', 'nan_count', 'value_counts'] - provides_summary = ['distinct_per', 'empty_per', 'unique_per', 'nan_per', - 'unique_count', 'empty_count', 'distinct_count'] + + provides_defaults = { + 'distinct_per':0, 'empty_per':0, 'unique_per':0, 'nan_per':0, + 'unique_count':0, 'empty_count':0, 'distinct_count':0} + @staticmethod def computed_summary(summary_dict): @@ -135,21 +136,3 @@ def computed_summary(summary_dict): unique_per=unique_count/l, nan_per=summary_dict['nan_count']/l) - -class ColDisplayHints(ColAnalysis): - requires_summary = ['min', 'max', '_type'] - provides_summary = [ - 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'type', 'formatter'] - - @staticmethod - def computed_summary(summary_dict): - base_dict = {'type':summary_dict['_type']} - if summary_dict['is_datetime']: - base_dict['formatter'] = 'default' - if summary_dict['is_numeric'] and not summary_dict['is_bool']: - base_dict.update({ - 'min_digits':int_digits(summary_dict['min']), - 'max_digits':int_digits(summary_dict['max']), - }) - return base_dict - diff --git a/buckaroo/customizations/histogram.py b/buckaroo/customizations/histogram.py index 79aa6b1e5..26248e037 100644 --- a/buckaroo/customizations/histogram.py +++ b/buckaroo/customizations/histogram.py @@ -86,7 +86,9 @@ def numeric_histogram(histogram_args, min_, max_, nan_per): class Histogram(ColAnalysis): - + provides_defaults = dict( + histogram= [[],[]], histogram_args=[], histogram_bins=[]) + @staticmethod def series_summary(sampled_ser, ser): if not pd.api.types.is_numeric_dtype(ser): @@ -108,6 +110,7 @@ def series_summary(sampled_ser, ser): meat_histogram=np.histogram(meat, 10) populations, _ = meat_histogram return dict( + histogram_bins = meat_histogram[1], histogram_args=dict( meat_histogram=meat_histogram, normalized_populations=(populations/populations.sum()).tolist(), @@ -116,7 +119,7 @@ def series_summary(sampled_ser, ser): requires_summary = ['value_counts', 'nan_per', 'is_numeric', 'length', 'min', 'max',] - provides_summary = ['histogram', 'histogram_args'] + @staticmethod def computed_summary(summary_dict): diff --git a/buckaroo/customizations/polars_analysis.py b/buckaroo/customizations/polars_analysis.py index ecf44a1d6..c3e62a057 100644 --- a/buckaroo/customizations/polars_analysis.py +++ b/buckaroo/customizations/polars_analysis.py @@ -1,8 +1,8 @@ import polars as pl import numpy as np +import polars.selectors as cs from polars import functions as F from polars import datatypes as pdt -from buckaroo.customizations.analysis_utils import int_digits from buckaroo.pluggable_analysis_framework.polars_analysis_management import PolarsAnalysis from buckaroo.pluggable_analysis_framework.polars_utils import NUMERIC_POLARS_DTYPES @@ -32,21 +32,15 @@ def get_mode(ser): class ComputedDefaultSummaryStats(PolarsAnalysis): - summary_stats_display = [ - 'dtype', - 'length', 'nan_count', 'distinct_count', 'empty_count', - 'empty_per', 'unique_per', 'is_numeric', - 'mode', 'min', 'max','mean'] - requires_summary = ['length', 'nan_count', 'unique_count', 'empty_count', 'distinct_count'] - provides_summary = ['distinct_per', 'empty_per', 'unique_per', 'nan_per'] + provides_defaults = dict( + distinct_per=0, empty_per=0, unique_per=0, nan_per=0) @staticmethod def computed_summary(summary_dict): len_ = summary_dict['length'] - return dict( distinct_per=summary_dict['distinct_count']/len_, empty_per=summary_dict.get('empty_count',0)/len_, @@ -54,50 +48,70 @@ def computed_summary(summary_dict): nan_per=summary_dict['nan_count']/len_) + +PROBABLY_STRUCTS = (~cs.numeric() & ~cs.string() & ~cs.temporal() & + ~cs.boolean()) +NOT_STRUCTS = (~PROBABLY_STRUCTS) + class VCAnalysis(PolarsAnalysis): - provides_summary = ['value_counts'] + + + provides_defaults = dict( + value_counts=pl.Series( + "", + [{'a': 'error', 'count': 1}], dtype=pl.Struct({'a': pl.String, 'count': pl.UInt32}))) + select_clauses = [ - pl.all().exclude("count").value_counts(sort=True) + NOT_STRUCTS.exclude("count").value_counts(sort=True) .implode().name.map(json_postfix('value_counts')), - pl.selectors.matches("^count$") + (NOT_STRUCTS & pl.selectors.matches("^count$")) .alias("not_counts") .value_counts(sort=True) .implode() .alias("count").name.map(json_postfix('value_counts'))] +DUMMY_VALUE_COUNTS = pl.Series( + [{'a': 3, 'count': 1}, {'a': 4, 'count': 1}, {'a': 5, 'count': 1}]) class BasicAnalysis(PolarsAnalysis): - provides_summary = ['length', 'nan_count', 'min', 'max', 'min', - 'mode', 'mean','unique_count', 'empty_count', - 'distinct_count'] + + + provides_defaults = dict(length=0, nan_count=0, min=0, max=0, mode=0, + mean=0, unique_count=0, empty_count=0, distinct_count=0) + + requires_summary = ['value_counts'] select_clauses = [ F.all().len().name.map(json_postfix('length')), F.all().null_count().name.map(json_postfix('nan_count')), - F.all().min().name.map(json_postfix('min')), - F.all().max().name.map(json_postfix('max')), - F.all().mean().name.map(json_postfix('mean')), + NOT_STRUCTS.min().name.map(json_postfix('min')), + NOT_STRUCTS.max().name.map(json_postfix('max')), + NOT_STRUCTS.mean().name.map(json_postfix('mean')), F.col(pl.Utf8).str.count_matches("^$").sum().name.map(json_postfix('empty_count')), - F.all().approx_n_unique().name.map(json_postfix('distinct_count')), - (F.all().len() - F.all().is_duplicated().sum()).name.map(json_postfix('unique_count')), - ] + (NOT_STRUCTS.len() - NOT_STRUCTS.is_duplicated().sum()).name.map(json_postfix('unique_count')) + ] @staticmethod def computed_summary(summary_dict): - temp_df = pl.DataFrame({'vc': summary_dict['value_counts'].explode()}).unnest('vc') - regular_col_vc_df = temp_df.select(pl.all().exclude('count').alias('key'), pl.col('count')) - return dict(mode=regular_col_vc_df[0]['key'][0]) + + if 'value_counts' in summary_dict: + temp_df = pl.DataFrame({'vc': summary_dict['value_counts'].explode()}).unnest('vc') + regular_col_vc_df = temp_df.select(pl.all().exclude('count').alias('key'), pl.col('count')) + return dict(mode=regular_col_vc_df[0]['key'][0], distinct_count=len(temp_df)) + else: + + return dict(mode=None, value_counts=DUMMY_VALUE_COUNTS, distinct_count=0, + mean=0, unique_count=0) class PlTyping(PolarsAnalysis): column_ops = {'dtype': ("all", lambda col_series: col_series.dtype)} - provides_summary = ['dtype', '_type', 'is_numeric'] - + provides_defaults = dict(dtype='unknown', _type='unknown', is_numeric=False, is_integer=False) @staticmethod def computed_summary(summary_dict): dt = summary_dict['dtype'] - res = {'is_numeric': False} + res = {'is_numeric': False, 'is_integer': False} if dt in pdt.INTEGER_DTYPES: t = 'integer' @@ -105,6 +119,9 @@ def computed_summary(summary_dict): t = 'datetime' elif dt in pdt.FLOAT_DTYPES: t = 'float' + elif dt in pl.datatypes.TEMPORAL_DTYPES: + #feels like a hack + t = 'temporal' elif dt == pdt.Utf8: t = 'string' elif dt == pdt.Boolean: @@ -113,6 +130,8 @@ def computed_summary(summary_dict): t = 'unknown' if t in ('integer', 'float'): res['is_numeric'] = True + if t == 'integer': + res['is_integer'] = True res['_type'] = t return res @@ -191,42 +210,31 @@ class HistogramAnalysis(PolarsAnalysis): 'histogram_args': (NUMERIC_POLARS_DTYPES, normalize_polars_histogram_ser)} requires_summary = ['min', 'max', 'value_counts', 'length', 'unique_count', 'is_numeric', 'nan_per'] - provides_summary = ['categorical_histogram', 'histogram'] + provides_summary = ['categorical_histogram', 'histogram', 'histogram_bins'] + provides_defaults = dict(categorical_histogram=[], histogram=[], histogram_bins=[]) @staticmethod def computed_summary(summary_dict): + if len(summary_dict.keys()) == 0: + return {} + vc = summary_dict['value_counts'] cd = categorical_dict_from_vc(vc) - is_numeric = summary_dict['is_numeric'] + is_numeric = summary_dict.get('is_numeric', False) nan_per = summary_dict['nan_per'] if is_numeric and len(vc.explode()) > 5: - #histogram_args = summary_dict['histogram_args'] histogram_args = summary_dict['histogram_args'] min_, max_, nan_per = summary_dict['min'], summary_dict['max'], summary_dict['nan_per'] temp_histo = numeric_histogram(histogram_args, min_, max_, nan_per) if len(temp_histo) > 5: #if we had basically a categorical variable encoded into an integer.. don't return it - return {'histogram': temp_histo} - return {'categorical_histogram': cd, 'histogram' : categorical_histogram_from_cd(cd, nan_per)} - -class PlColDisplayHints(PolarsAnalysis): - requires_summary = ['min', 'max', '_type', 'is_numeric'] - provides_summary = [ - 'min_digits', 'max_digits', 'type', 'formatter'] - - @staticmethod - def computed_summary(summary_dict): - base_dict = {'type':summary_dict['_type']} - if summary_dict['_type'] == 'datetime': - base_dict['formatter'] = 'default' - if summary_dict['is_numeric']: - base_dict.update({ - 'min_digits':int_digits(summary_dict['min']), - 'max_digits':int_digits(summary_dict['max']), - }) - return base_dict - -PL_Analysis_Klasses = [VCAnalysis, BasicAnalysis, PlTyping, PlColDisplayHints, - HistogramAnalysis, - ComputedDefaultSummaryStats] + return {'histogram': temp_histo, + 'histogram_bins': summary_dict['histogram_args']['meat_histogram'][1] + } + return {'categorical_histogram': cd, 'histogram' : categorical_histogram_from_cd(cd, nan_per), + 'histogram_bins': ['faked'] + } + +PL_Analysis_Klasses = [VCAnalysis, BasicAnalysis, PlTyping, + HistogramAnalysis, ComputedDefaultSummaryStats] diff --git a/buckaroo/customizations/styling.py b/buckaroo/customizations/styling.py new file mode 100644 index 000000000..f7506ca28 --- /dev/null +++ b/buckaroo/customizations/styling.py @@ -0,0 +1,53 @@ +from buckaroo.dataflow import StylingAnalysis +from typing import Any + +def obj_(pkey): + return {'primary_key_val': pkey, 'displayer_args': { 'displayer': 'obj' } } + +def float_(pkey, digits=3): + return {'primary_key_val': pkey, + 'displayer_args': { + 'displayer': 'float', 'min_fraction_digits':digits, 'max_fraction_digits':digits}} + + +class DefaultMainStyling(StylingAnalysis): + requires_summary = ["histogram", "is_numeric", "dtype", "_type"] + pinned_rows = [ + obj_('dtype'), + {'primary_key_val': 'histogram', 'displayer_args': {'displayer': 'histogram'}}] + + @classmethod + def style_column(kls, col:str, column_metadata: Any) -> Any: + #print(col, list(sd.keys())) + if len(column_metadata.keys()) == 0: + #I'm still having problems with index and polars + return {'col_name':col, 'displayer_args': {'displayer': 'obj'}} + + digits = 3 + t = column_metadata['_type'] + if t == 'integer': + disp = {'displayer': 'float', 'min_fraction_digits':0, 'max_fraction_digits':0} + elif t == 'float': + disp = {'displayer': 'float', 'min_fraction_digits':digits, 'max_fraction_digits':digits} + elif t == 'temporal': + disp = {'displayer': 'datetimeLocaleString','locale': 'en-US', 'args': {}} + elif t == 'string': + disp = {'displayer': 'string', 'max_length': 35} + else: + disp = {'displayer': 'obj'} + return {'col_name':col, 'displayer_args': disp } + + +class DefaultSummaryStatsStyling(StylingAnalysis): + pinned_rows = [ + obj_('dtype'), + float_('min'), + float_('mean'), + float_('max'), + float_('unique_count', 0), + float_('distinct_count', 0), + float_('empty_count', 0)] + + df_display_name = "summary" + data_key = "empty" + summary_stats_key= 'all_stats' diff --git a/buckaroo/dataflow.py b/buckaroo/dataflow.py new file mode 100644 index 000000000..b64433f98 --- /dev/null +++ b/buckaroo/dataflow.py @@ -0,0 +1,584 @@ +import six +import sys +import warnings +import pandas as pd +from traitlets import Unicode, Any, observe, HasTraits, Dict +from .serialization_utils import pd_to_obj +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) +from buckaroo.pluggable_analysis_framework.analysis_management import DfStats +from .customizations.all_transforms import configure_buckaroo, DefaultCommandKlsList + +SENTINEL_DF_1 = pd.DataFrame({'foo' :[10, 20], 'bar' : ["asdf", "iii"]}) +SENTINEL_DF_2 = pd.DataFrame({'col1' :[55, 55], 'col2': ["pppp", "333"]}) +SENTINEL_DF_3 = pd.DataFrame({'pp' :[99, 33], 'ee': [ 6, 9]}) +SENTINEL_DF_4 = pd.DataFrame({'vvv' :[12, 49], 'oo': [ 'ccc', 'www']}) + + + + +def merge_ops(existing_ops, cleaning_ops): + """ strip cleaning_ops from existing_ops, reinsert cleaning_ops at the beginning """ + a = existing_ops.copy() + a.extend(cleaning_ops) + return a + +def merge_column(base, new): + """ + merge individual column dictionaries, with special handling for column_config_override + """ + ret = base.copy() + ret.update(new) + + base_override = base.get('column_config_override', {}).copy() + new_override = new.get('column_config_override', {}).copy() + base_override.update(new_override) + + if len(base_override) > 0: + ret['column_config_override'] = base_override + return ret + +def merge_sds(*sds): + """merge sds with later args taking precedence + + sub-merging of "overide_config"?? + """ + base_sd = {} + for sd in sds: + for column in sd.keys(): + base_sd[column] = merge_column(base_sd.get(column, {}), sd[column]) + return base_sd + +SENTINEL_COLUMN_CONFIG_1 = "ASDF" +SENTINEL_COLUMN_CONFIG_2 = "FOO-BAR" + + + + +def style_columns(style_method:str, sd): + if style_method == "foo": + return SENTINEL_COLUMN_CONFIG_2 + else: + ret_col_config = [] + for col in sd.keys(): + ret_col_config.append( + {'col_name':col, 'displayer_args': {'displayer': 'obj'}}) + return { + 'pinned_rows': [ + # {'primary_key_val': 'dtype', 'displayer_args': {'displayer': 'obj'}} + ], + 'column_config': ret_col_config} + +def merge_column_config(styled_column_config, overide_column_configs): + existing_column_config = styled_column_config.copy() + ret_column_config = [] + for row in existing_column_config: + col = row['col_name'] + if col in overide_column_configs: + row.update(overide_column_configs[col]) + if row.get('merge_rule', 'blank') == 'hidden': + continue + ret_column_config.append(row) + return ret_column_config + + +def exception_protect(protect_name=None): + def wrapped_decorator(func): + def wrapped(self, *args, **kwargs): + try: + func(self, *args, **kwargs) + except Exception: + #sometimes useful for debugging tricky call order stuff + # if protect_name: + # print("protect handler", protect_name, self.exception) + if self.exception is None: + self.exception = sys.exc_info() + raise + return wrapped + return wrapped_decorator + +class DataFlow(HasTraits): + """This class is meant to only represent the dataflow through + buckaroo with no accomodation for widget particulars + + It generally has stub methods for implementations that enable basic testing of the 'data flow' . + It is meant to be extended by Customizable DataFlow that can specify multiple different options + + CustomizableDataflow is meant to be extended by BuckarooWidget whcih connects frontend values to the following properties + + sample_method + cleaning_method + existing_operations + style_method ... became df_display_args + + all of this results in values for df_dict being updated + + """ + def __init__(self, raw_df): + self.exception = None + super().__init__() + self.summary_sd = {} + self.existing_operations = [] + + try: + self.raw_df = raw_df + except Exception: + six.reraise(self.exception[0], self.exception[1], self.exception[2]) + + raw_df = Any('') + sample_method = Unicode('default') + sampled_df = Any('') + + cleaning_method = Unicode('') + cleaning_operations = Any() + + existing_operations = Any([]) + merged_operations = Any() + + cleaned = Any().tag(default=None) + + lowcode_operations = Any() + + post_processing_method = Unicode('').tag(default='') + processed_result = Any().tag(default=None) + + analysis_klasses = None + summary_sd = Any() + + merged_sd = Any() + + style_method = Unicode('simple') + column_config = Any() + + column_config_overrides = {} + + merged_column_config = Any() + + widget_args_tuple = Any() + + + + def _compute_sampled_df(self, raw_df, sample_method): + if sample_method == "first": + return raw_df[:1] + return raw_df + + + @observe('raw_df', 'sample_method') + @exception_protect('sampled_df-protector') + def _sampled_df(self, change): + self.sampled_df = self._compute_sampled_df(self.raw_df, self.sample_method) + + def _run_df_interpreter(self, df, ops): + if len(ops) == 1: + return SENTINEL_DF_1 + if len(ops) == 2: + return SENTINEL_DF_2 + return df + + def _run_code_generator(self, ops): + if len(ops) == 1: + return "codegen 1" + if len(ops) == 2: + return "codegen 2" + return "" + + def _run_cleaning(self, df, cleaning_method): + cleaning_ops = [] + if cleaning_method == "one op": + cleaning_ops = [""] + if cleaning_method == "two op": + cleaning_ops = ["", ""] + cleaning_sd = {} + return cleaning_ops, cleaning_sd + + @observe('sampled_df', 'cleaning_method', 'existing_operations') + @exception_protect('operation_result-protector') + def _operation_result(self, change): + if self.sampled_df is None: + return + cleaning_operations, cleaning_sd = self._run_cleaning(self.sampled_df, self.cleaning_method) + merged_operations = merge_ops(self.existing_operations, cleaning_operations) + cleaned_df = self._run_df_interpreter(self.sampled_df, merged_operations) + generated_code = self._run_code_generator(merged_operations) + self.cleaned = [cleaned_df, cleaning_sd, generated_code, merged_operations] + + @property + def cleaned_df(self): + if self.cleaned is not None: + return self.cleaned[0] + + @property + def cleaned_sd(self): + if self.cleaned is not None: + return self.cleaned[1] + return {} + + @property + def generated_code(self): + if self.cleaned is not None: + return self.cleaned[2] + + @property + def merged_operations(self): + if self.cleaned is not None: + return self.cleaned[3] + + def _compute_processed_result(self, cleaned_df, post_processing_method): + return [cleaned_df, {}] + + @observe('cleaned', 'post_processing_method') + @exception_protect('processed_result-protector') + def _processed_result(self, change): + #for now this is a no-op because I don't have a post_processing_function or mechanism + self.processed_result = self._compute_processed_result(self.cleaned_df, self.post_processing_method) + + @property + def processed_df(self): + if self.processed_result is not None: + return self.processed_result[0] + return None + + @property + def processed_sd(self): + if self.processed_result is not None: + return self.processed_result[1] + return {} + + def _get_summary_sd(self, df): + analysis_klasses = self.analysis_klasses + if analysis_klasses == "foo": + return {'some-col': {'foo':8}} + if analysis_klasses == "bar": + return {'other-col': {'bar':10}} + index_name = df.index.name or "index" + ret_summary = {index_name: {}} + for col in df.columns: + ret_summary[col] = {} + return ret_summary + + @observe('processed_result', 'analysis_klasses') + @exception_protect('summary_sd-protector') + def _summary_sd(self, change): + result_summary_sd = self._get_summary_sd(self.processed_df) + self.summary_sd = result_summary_sd + + @observe('summary_sd') + @exception_protect('merged_sd-protector') + def _merged_sd(self, change): + #slightly inconsitent that processed_sd gets priority over + #summary_sd, given that processed_df is computed first. My + #thinking was that processed_sd has greater total knowledge + #and should supersede summary_sd. + self.merged_sd = merge_sds(self.cleaned_sd, self.summary_sd, self.processed_sd) + + def _get_dfviewer_config(self, sd, style_method): + dfviewer_config = style_columns(style_method, sd) + base_column_config = dfviewer_config['column_config'] + dfviewer_config['column_config'] = merge_column_config( + base_column_config, self.column_config_overrides) + return dfviewer_config + + @observe('merged_sd', 'style_method') + @exception_protect('widget_config-protector') + def _widget_config(self, change): + #how to control ordering of column_config??? + # dfviewer_config = self._get_dfviewer_config(self.merged_sd, self.style_method) + # self.widget_args_tuple = [self.processed_df, self.merged_sd, dfviewer_config] + self.widget_args_tuple = (id(self.processed_df), self.processed_df, self.merged_sd) + + + + + + +class UnknownStyleMethod(Exception): + def __init__(self, style_method, available_methods, analysis_klasses): + self.style_method = style_method + self.available_methods = available_methods + self.msg =\ + "style_method of '{self.style_method}' not found in '{available_methods}', all analysis_klasses is []'" + + +class StylingAnalysis(ColAnalysis): + provides_defaults = {} + pinned_rows = [] + + #the type should be + #def style_column(col:str, column_metadata: SingleColumnMetadata) -> ColumnConfig: + @classmethod + def style_column(kls, col, column_metadata): + return {'col_name':str(col), 'displayer_args': {'displayer': 'obj'}} + + #what is the key for this in the df_display_args_dictionary + df_display_name = "main" + data_key = "main" + summary_stats_key= 'all_stats' + + @classmethod + def style_columns(kls, sd): + ret_col_config = [] + + #this is necessary for polars to add an index column, which is + #required so that summary_stats makes sense + if 'index' not in sd: + ret_col_config.append({'col_name': 'index', 'displayer_args': {'displayer': 'obj'}}) + + for col in sd.keys(): + col_meta = sd[col] + base_style = kls.style_column(col, col_meta) + if 'column_config_override' in col_meta: + base_style.update(col_meta['column_config_override']) + ret_col_config.append(base_style) + + return { + 'pinned_rows': kls.pinned_rows, + 'column_config': ret_col_config} + + +def filter_analysis(klasses, attr): + ret_klses = {} + for k in klasses: + attr_val = getattr(k, attr, None) + if attr_val is not None: + ret_klses[attr_val] = k + return ret_klses + +class PostProcessingException(Exception): + pass + +EMPTY_DFVIEWER_CONFIG = { + 'pinned_rows': [], + 'column_config': []} +EMPTY_DF_DISPLAY_ARG = {'data_key': 'empty', 'df_viewer_config': EMPTY_DFVIEWER_CONFIG, + 'summary_stats_key': 'empty'} + +class Sampling: + + max_columns = 250 + pre_limit = 100_000 + serialize_limit = 10_000 + + @classmethod + def pre_stats_sample(kls, df): + if len(df.columns) > kls.max_columns: + print("Removing excess columns, found %d columns" % len(df.columns)) + df = df[df.columns[:kls.max_columns]] + if kls.pre_limit and len(df) > kls.pre_limit: + return df.sample(kls.pre_limit) + return df + + + @classmethod + def serialize_sample(kls, df): + if kls.serialize_limit and len(df) > kls.serialize_limit: + return df.sample(kls.serialize_limit) + return df + +class CustomizableDataflow(DataFlow): + """ + This allows targetd extension and customization of DataFlow + """ + analysis_klasses = [StylingAnalysis] + command_klasses = DefaultCommandKlsList + commandConfig = Dict({}).tag(sync=True) + DFStatsClass = DfStats + sampling_klass = Sampling + df_display_klasses = {} + + def __init__(self, df, debug=False, column_config_overrides=None, pinned_rows=None): + if column_config_overrides is None: + column_config_overrides = {} + self.column_config_overrides = column_config_overrides + self.pinned_rows = pinned_rows + if not debug: + warnings.filterwarnings('ignore') + + self.debug = debug + #self.df_name = get_df_name(df) + self.df_name = "placeholder" + self.df_display_args = {} + self.setup_options_from_analysis() + super().__init__(self.sampling_klass.pre_stats_sample(df)) + + self._setup_from_command_kls_list() + self.populate_df_meta() + #self.raw_df = df + warnings.filterwarnings('default') + + + + def populate_df_meta(self): + self.df_meta = { + 'columns': len(self.raw_df.columns), + # I need to recompute this when sampling changes + 'rows_shown': len(self.sampled_df), + 'total_rows': len(self.raw_df)} + + buckaroo_options = Dict({ + 'sampled': ['random'], + 'auto_clean': ['aggressive', 'conservative'], + 'post_processing': [], + 'df_display': ['main', 'summary'], + 'show_commands': ['on'], + 'summary_stats': ['all'], + }).tag(sync=True) + + def setup_options_from_analysis(self): + self.df_display_klasses = filter_analysis(self.analysis_klasses, "df_display_name") + #add a check to verify that there aren't multiple classes offering the same df_display_name + + empty_df_display_args = {} + for k, kls in self.df_display_klasses.items(): + empty_df_display_args[kls.df_display_name] = EMPTY_DF_DISPLAY_ARG + + + self.DFStatsClass.verify_analysis_objects(self.analysis_klasses) + + self.post_processing_klasses = filter_analysis(self.analysis_klasses, "post_processing_method") + + new_buckaroo_options = self.buckaroo_options.copy() + new_buckaroo_options['df_display'] = list(self.df_display_klasses.keys()) + post_processing_methods = [''] + post_processing_methods.extend(list(self.post_processing_klasses.keys())) + new_buckaroo_options['post_processing'] = post_processing_methods + #important that we open up the possibilities first before we add them as options in the UI + self.df_display_args = empty_df_display_args + self.buckaroo_options = new_buckaroo_options + + df_display_args = Any({'main':EMPTY_DF_DISPLAY_ARG}).tag(sync=True) + #empty needs to always be present, it enables startup + df_data_dict = Any({'empty':[]}).tag(sync=True) + + + ### start code interpreter block + def _setup_from_command_kls_list(self): + #used to initially setup the interpreter, and when a command + #is added interactively + c_klasses = self.command_klasses + c_defaults, c_patterns, df_interpreter, gencode_interpreter = configure_buckaroo(c_klasses) + self.df_interpreter, self.gencode_interpreter = df_interpreter, gencode_interpreter + self.commandConfig = dict(argspecs=c_patterns, defaultArgs=c_defaults) + + def add_command(self, incomingCommandKls): + without_incoming = [x for x in self.command_classes if not x.__name__ == incomingCommandKls.__name__] + without_incoming.append(incomingCommandKls) + self.command_klasses = without_incoming + self.setup_from_command_kls_list() + + def _run_df_interpreter(self, df, operations): + full_ops = [{'symbol': 'begin'}] + full_ops.extend(operations) + if len(full_ops) == 1: + return df + return self.buckaroo_transform(full_ops , df) + + def run_code_generator(self, operations): + if len(operations) == 0: + return 'no operations' + return self.gencode_interpreter(operations) + ### end code interpeter block + + def _compute_processed_result(self, cleaned_df, post_processing_method): + if post_processing_method == '': + return [cleaned_df, {}] + else: + post_analysis = self.post_processing_klasses[post_processing_method] + try: + ret_df, sd = post_analysis.post_process_df(cleaned_df) + return (ret_df, sd) + except Exception as e: + return (self._build_error_dataframe(e), {}) + + def _build_error_dataframe(self, e): + return pd.DataFrame({'err': [str(e)]}) + + + ### start summary stats block + + def _get_summary_sd(self, processed_df): + stats = self.DFStatsClass( + processed_df, + self.analysis_klasses, + self.df_name, debug=self.debug) + sdf = stats.sdf + if stats.errs: + if self.debug: + raise Exception("Error executing analysis") + else: + return {} + else: + return sdf + + + # ### end summary stats block + + def _sd_to_jsondf(self, sd): + """exists so this can be overriden for polars """ + temp_sd = sd.copy() + #FIXME add actual test around weird index behavior + if 'index' in temp_sd: + del temp_sd['index'] + return self._df_to_obj(pd.DataFrame(temp_sd)) + + def _df_to_obj(self, df:pd.DataFrame): + return pd_to_obj(self.sampling_klass.serialize_sample(df)) + + + #final processing block + @observe('widget_args_tuple') + def _handle_widget_change(self, change): + """ + put together df_dict for consumption by the frontend + """ + _unused, processed_df, merged_sd = self.widget_args_tuple + if processed_df is None: + return + + # df_data_dict is still hardcoded for now + # eventually processed_df will be able to add or alter values of df_data_dict + # correlation would be added, filtered would probably be altered + + # to expedite processing maybe future provided dfs from + # postprcoessing could default to empty until that is + # selected, optionally + + self.df_data_dict = {'main': self._df_to_obj(processed_df), + 'all_stats': self._sd_to_jsondf(merged_sd), + 'empty': []} + + temp_display_args = {} + for display_name, A_Klass in self.df_display_klasses.items(): + df_viewer_config = A_Klass.style_columns(merged_sd) + base_column_config = df_viewer_config['column_config'] + df_viewer_config['column_config'] = merge_column_config( + base_column_config, self.column_config_overrides) + disp_arg = {'data_key': A_Klass.data_key, + #'df_viewer_config': json.loads(json.dumps(df_viewer_config)), + 'df_viewer_config': df_viewer_config, + 'summary_stats_key': A_Klass.summary_stats_key} + temp_display_args[display_name] = disp_arg + + if self.pinned_rows: + temp_display_args['main']['df_viewer_config']['pinned_rows'] = self.pinned_rows + self.df_display_args = temp_display_args + +""" +Instantiation +df_data_dict starts with only 'empty' +first populate df_display_args, make all data point to 'empty', make all df_viewer_configs EMPTY_DFVIEWER_CONFIG + +then populate buckaroo_options['df_display'] from gathered classes + +Next add 'all_stats' to 'df_data_dict' +add 'main' to 'df_data_dict' + + +all of the above steps might trigger redisplays, but they will be cheap because df_viewer_config will be empty, pointing at empty data + +finally iterate through all 'df_display' analysis_klasses and update df_display_args + + + + + +""" diff --git a/buckaroo/pluggable_analysis_framework/analysis_management.py b/buckaroo/pluggable_analysis_framework/analysis_management.py index 5d36da975..1fbbb638f 100644 --- a/buckaroo/pluggable_analysis_framework/analysis_management.py +++ b/buckaroo/pluggable_analysis_framework/analysis_management.py @@ -3,12 +3,11 @@ import warnings import numpy as np -from buckaroo.pluggable_analysis_framework.safe_summary_df import output_full_reproduce, output_reproduce_preamble, safe_summary_df +from buckaroo.pluggable_analysis_framework.safe_summary_df import output_full_reproduce, output_reproduce_preamble -from buckaroo.pluggable_analysis_framework.utils import BASE_COL_HINT, FAST_SUMMARY_WHEN_GREATER, PERVERSE_DF, NonExistentSummaryRowException +from buckaroo.pluggable_analysis_framework.utils import FAST_SUMMARY_WHEN_GREATER, PERVERSE_DF from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( order_analysis, check_solvable) -from buckaroo.serialization_utils import pick, d_update def produce_series_df(df, ordered_objs, df_name='test_df', debug=False): """ just executes the series methods @@ -16,21 +15,33 @@ def produce_series_df(df, ordered_objs, df_name='test_df', debug=False): """ errs = {} series_stats = defaultdict(lambda: {}) - for ser_name in df.columns: - ser = df[ser_name] + + cols = [] + if hasattr(df, "index"): + #hack around polars not having indexes" + cols.append("index") + cols.extend(df.columns) + for possib_ser_name in cols: + if possib_ser_name == "index": + ser_name = df.index.name or "index" + ser = df.index.to_series() + else: + ser_name = possib_ser_name + ser = df[ser_name] #FIXME: actually sample the series. waiting until I have time #to proeprly benchmark sampled_ser = ser for a_kls in ordered_objs: + col_stat_dict = a_kls.provides_defaults.copy() try: if a_kls.quiet or a_kls.quiet_warnings: if debug is False: warnings.filterwarnings('ignore') - col_stat_dict = a_kls.series_summary(sampled_ser, ser) + col_stat_dict.update(a_kls.series_summary(sampled_ser, ser)) warnings.filterwarnings('default') else: - col_stat_dict = a_kls.series_summary(sampled_ser, ser) + col_stat_dict.update(a_kls.series_summary(sampled_ser, ser)) series_stats[ser_name].update(col_stat_dict) except Exception as e: @@ -41,6 +52,8 @@ def produce_series_df(df, ordered_objs, df_name='test_df', debug=False): continue return series_stats, errs + + def produce_summary_df(df, series_stats, ordered_objs, df_name='test_df', debug=False): """ takes a dataframe and a list of analyses that have been ordered by a graph sort, @@ -48,9 +61,20 @@ def produce_summary_df(df, series_stats, ordered_objs, df_name='test_df', debug= """ errs = {} summary_col_dict = {} + cols = [] + if hasattr(df, "index"): + #hack around polars not having indexes" + cols.append("index") + cols.extend(df.columns) + for possib_ser_name in cols: + if possib_ser_name == "index": + ser_name = df.index.name or "index" + else: + ser_name = possib_ser_name #figure out how to add in "index"... but just for table_hints - for ser_name in df.columns: - base_summary_dict = series_stats[ser_name] + #for ser_name in df.columns: + #base_summary_dict = series_stats[ser_name] + base_summary_dict = series_stats.get(ser_name, {}) for a_kls in ordered_objs: try: if a_kls.quiet or a_kls.quiet_warnings: @@ -71,21 +95,6 @@ def produce_summary_df(df, series_stats, ordered_objs, df_name='test_df', debug= summary_col_dict[ser_name] = base_summary_dict return summary_col_dict, errs -def full_produce_summary_df(df, ordered_objs, df_name='test_df', debug=False): - if len(df) == 0: - return {}, {}, {} - - series_stat_dict, series_errs = produce_series_df(df, ordered_objs, df_name, debug) - summary_df, summary_errs = produce_summary_df( - df, series_stat_dict, ordered_objs, df_name, debug) - series_errs.update(summary_errs) - table_hint_col_dict = {} - for ser_name in df.columns: - table_hint_col_dict[ser_name] = pick( - d_update(BASE_COL_HINT, summary_df[ser_name]), - BASE_COL_HINT.keys()) - - return summary_df, table_hint_col_dict, series_errs #TODO Figure out how to do proper typing with AnalysisPipeline and the polars subclasses # We want a TypeVar for DFType and AT. But the main function, process_df whild still return 3 dicts @@ -101,9 +110,22 @@ class AnalysisPipeline(object): #this is only a list to prevent it from being interpretted as an instance method #full_produce_func: List[Callable[[DFT, List[AT], str, bool], Any]] = - full_produce_func = [full_produce_summary_df] + @staticmethod + def full_produce_summary_df(df, ordered_objs, df_name='test_df', debug=False): + if len(df) == 0: + return {}, {} + + series_stat_dict, series_errs = produce_series_df(df, ordered_objs, df_name, debug) + summary_df, summary_errs = produce_summary_df( + df, series_stat_dict, ordered_objs, df_name, debug) + series_errs.update(summary_errs) + return summary_df, series_errs + + style_method = None def __init__(self, analysis_objects, unit_test_objs=True): + + #self.produce_func = self.full_produce_func[0] self.summary_stats_display = "all" self.unit_test_objs = unit_test_objs self.verify_analysis_objects(analysis_objects) @@ -111,18 +133,10 @@ def __init__(self, analysis_objects, unit_test_objs=True): def process_summary_facts_set(self): all_provided = [] for a_obj in self.ordered_a_objs: - all_provided.extend(a_obj.provides_summary) - if a_obj.summary_stats_display: - self.summary_stats_display = a_obj.summary_stats_display + all_provided.extend(list(a_obj.provides_defaults.keys())) self.provided_summary_facts_set = set(all_provided) - #all is a special value that will dipslay every row - if self.summary_stats_display and not self.summary_stats_display == "all": - #verify that we have a way of computing all of the facts we are displaying - if not self.provided_summary_facts_set.issuperset(set(self.summary_stats_display)): - missing = set(self.summary_stats_display) - set(self.provided_summary_facts_set) - raise NonExistentSummaryRowException(missing) def verify_analysis_objects(self, analysis_objects): self.ordered_a_objs = order_analysis(analysis_objects) @@ -138,7 +152,7 @@ def unit_test(self): """ try: - output_df, table_hint_dict, errs = self.full_produce_func[0](PERVERSE_DF, self.ordered_a_objs) + output_df, errs = self.full_produce_summary_df(PERVERSE_DF, self.ordered_a_objs) if len(errs) == 0: return True, [] else: @@ -148,8 +162,8 @@ def unit_test(self): def process_df(self, input_df, debug=False): - output_df, table_hint_dict, errs = self.full_produce_func[0](input_df, self.ordered_a_objs, debug=debug) - return output_df, table_hint_dict, errs + output_df, errs = self.full_produce_summary_df(input_df, self.ordered_a_objs, debug=debug) + return output_df, errs def add_analysis(self, new_aobj): new_cname = new_aobj.cname() @@ -173,6 +187,10 @@ class DfStats(object): ap_class = AnalysisPipeline + @classmethod + def verify_analysis_objects(kls, col_analysis_objs): + kls.ap_class(col_analysis_objs) + def __init__(self, df_stats_df, col_analysis_objs, operating_df_name=None, debug=False): self.df = self.get_operating_df(df_stats_df, force_full_eval=False) self.col_order = self.df.columns @@ -180,9 +198,9 @@ def __init__(self, df_stats_df, col_analysis_objs, operating_df_name=None, debug self.operating_df_name = operating_df_name self.debug = debug - self.sdf, self.table_hints, errs = self.ap.process_df(self.df, self.debug) - if errs: - output_full_reproduce(errs, self.sdf, operating_df_name) + self.sdf, self.errs = self.ap.process_df(self.df, self.debug) + if self.errs: + output_full_reproduce(self.errs, self.sdf, operating_df_name) def get_operating_df(self, df, force_full_eval): rows = len(df) @@ -196,14 +214,12 @@ def get_operating_df(self, df, force_full_eval): @property def presentation_sdf(self): - if self.ap.summary_stats_display == "all": - return self.sdf - return safe_summary_df(self.sdf, self.ap.summary_stats_display) + raise Exception("deprecated") def add_analysis(self, a_obj): passed_unit_tests, ut_errs = self.ap.add_analysis(a_obj) #if you're adding analysis interactively, of course you want debug info... I think - self.sdf, self.table_hints, errs = self.ap.process_df(self.df, debug=True) + self.sdf, errs = self.ap.process_df(self.df, debug=True) if passed_unit_tests is False: print("Unit tests failed") if errs: @@ -213,7 +229,7 @@ def add_analysis(self, a_obj): output_reproduce_preamble() if ut_errs: # setting debug=False here because we're already printing reproduce instructions, let the users produce their own stacktrace.. I think - ut_summary_df, _unused_table_hint_dict, ut_errs2 = produce_summary_df( + ut_summary_df, ut_errs2 = produce_summary_df( PERVERSE_DF, self.ap.ordered_a_objs, debug=False) output_full_reproduce(ut_errs, ut_summary_df, "PERVERSE_DF") if errs: diff --git a/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py b/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py index 03a64a206..d793321bb 100644 --- a/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py +++ b/buckaroo/pluggable_analysis_framework/pluggable_analysis_framework.py @@ -1,8 +1,8 @@ import graphlib from collections import OrderedDict -from typing import List, Union +from typing import List, Union, Any, Mapping, Tuple, Callable -class ColAnalysis(object): +class ColAnalysis: """ Col Analysis runs on a single column @@ -10,15 +10,24 @@ class ColAnalysis(object): """ requires_raw = False requires_summary:List[str] = [] # What summary stats does this analysis provide - provides_summary:List[str] = [] # mean/max/histogram provides_series_stats:List[str] = [] # what does this provide at a series level + provides_defaults:Mapping[str, any] = {} @classmethod - def full_provides(cls): - a = cls.provides_series_stats.copy() - a.extend(cls.provides_summary) + @property + def provides_summary(kls): + return list(kls.provides_defaults.keys()) + + + @classmethod + def full_provides(kls): + if not isinstance(kls.provides_defaults, dict): + raise Exception("no provides Defaults for %r" %kls) + a = kls.provides_series_stats.copy() + #I can't figure out why the property won't work here + a.extend(list(kls.provides_defaults.keys())) return a summary_stats_display:Union[List[str], None] = None @@ -37,10 +46,17 @@ def computed_summary(summary_dict): def column_order(sampled_ser, summary_ser): pass + @staticmethod + def column_config(summary_dict): # -> ColumnConfig partial without col_name + pass + @classmethod def cname(kls): - #print(dir(kls)) return kls.__qualname__ + + select_clauses:List[Any] = [] + column_ops: Mapping[str, Tuple[List[Any], Callable[[Any], Any]]] = {} + class NotProvidedException(Exception): pass @@ -88,7 +104,6 @@ def order_analysis(a_objs): temp_provided = fp[0] first_mid_key = mid_key = ao.__name__ + "###" + temp_provided for k in ao.full_provides()[1:]: - #print("k", k) next_mid_key = ao.__name__ + "###" + k graph[mid_key] = set([next_mid_key]) key_class_objs[mid_key] = ao @@ -96,10 +111,8 @@ def order_analysis(a_objs): graph[mid_key] = set(ao.requires_summary) key_class_objs[mid_key] = ao for j in ao.full_provides(): - #print("j", j) graph[j] = set([first_mid_key]) ts = graphlib.TopologicalSorter(graph) seq = tuple(ts.static_order()) - #print("seq", seq) full_class_list = [key_class_objs.get(k, None) for k in seq] return clean_list(full_class_list) diff --git a/buckaroo/pluggable_analysis_framework/polars_analysis_management.py b/buckaroo/pluggable_analysis_framework/polars_analysis_management.py index 87bb0b671..bc471ce1e 100644 --- a/buckaroo/pluggable_analysis_framework/polars_analysis_management.py +++ b/buckaroo/pluggable_analysis_framework/polars_analysis_management.py @@ -7,8 +7,6 @@ from .pluggable_analysis_framework import ColAnalysis from .analysis_management import (produce_summary_df, AnalysisPipeline, DfStats) -from .utils import (BASE_COL_HINT) -from buckaroo.serialization_utils import pick, d_update from buckaroo.pluggable_analysis_framework.safe_summary_df import safe_summary_df from typing import Mapping, Any, Callable, Tuple, List, MutableMapping @@ -18,17 +16,9 @@ class PolarsAnalysis(ColAnalysis): select_clauses:List[pl.Expr] = [] column_ops: Mapping[str, Tuple[List[pl.PolarsDataType], Callable[[pl.Series], Any]]] = {} -def normalize_polars_histogram(ph:pl.DataFrame, ser:pl.Series): - edges = ph['break_point'].to_list() - edges[0], edges[-1] = ser.min(), ser.max() - #col_series.hist(bin_count=10) - col_only_df = ph.select(pl.col("^.*_count$")) - counts = col_only_df[col_only_df.columns[0]].to_list() - #counts = ph['_count'].to_list() - return counts[1:], edges -def produce_series_df(df:pl.DataFrame, +def polars_produce_series_df(df:pl.DataFrame, unordered_objs:List[PolarsAnalysis], df_name:str='test_df', debug:bool=False): """ just executes the series methods @@ -45,7 +35,16 @@ def produce_series_df(df:pl.DataFrame, df.write_parquet('error.parq') traceback.print_exc() return dict([[k, {}] for k in df.columns]), {} - summary_dict = split_to_dicts(result_df) + + summary_dict = {} + for col in df.columns: + summary_dict[col] = {} + for a_klass in unordered_objs: + summary_dict[col].update(a_klass.provides_defaults) + first_run_dict = split_to_dicts(result_df) + + for col, measures in first_run_dict.items(): + summary_dict[col].update(measures) for pa in unordered_objs: for measure_name, action_tuple in pa.column_ops.items(): @@ -59,25 +58,6 @@ def produce_series_df(df:pl.DataFrame, pass return summary_dict, errs -def extract_table_hint(summary_dict, columns): - table_hint_col_dict = {} - for ser_name in columns: - table_hint_col_dict[ser_name] = pick( - d_update(BASE_COL_HINT, summary_dict[ser_name]), - BASE_COL_HINT.keys()) - return table_hint_col_dict - -def full_produce_summary_df( - df:pl.DataFrame, ordered_objs:List[PolarsAnalysis], - df_name:str='test_df', debug:bool=False): - series_stat_dict, series_errs = produce_series_df(df, ordered_objs, df_name, debug) - summary_dict, summary_errs = produce_summary_df( - df, series_stat_dict, ordered_objs, df_name, debug) - series_errs.update(summary_errs) - table_hint_col_dict = extract_table_hint(summary_dict, df.columns) - return summary_dict, table_hint_col_dict, series_errs - - class PolarsAnalysisPipeline(AnalysisPipeline): """ @@ -85,7 +65,18 @@ class PolarsAnalysisPipeline(AnalysisPipeline): allow for computing summary_stats (and other oberservation sets) based on col_analysis objects allow col_anlysis objects to be added """ - full_produce_func = [full_produce_summary_df] + + @staticmethod + def full_produce_summary_df( + df:pl.DataFrame, ordered_objs:List[PolarsAnalysis], + df_name:str='test_df', debug:bool=False): + series_stat_dict, series_errs = polars_produce_series_df(df, ordered_objs, df_name, debug) + summary_dict, summary_errs = produce_summary_df( + df, series_stat_dict, ordered_objs, df_name, debug) + series_errs.update(summary_errs) + return summary_dict, series_errs + + def add_analysis(self, new_aobj): new_cname = new_aobj.cname() diff --git a/buckaroo/polars_buckaroo.py b/buckaroo/polars_buckaroo.py index 091c012b8..37707df54 100644 --- a/buckaroo/polars_buckaroo.py +++ b/buckaroo/polars_buckaroo.py @@ -1,16 +1,46 @@ +import polars as pl from buckaroo.buckaroo_widget import BuckarooWidget from .customizations.polars_analysis import PL_Analysis_Klasses from .pluggable_analysis_framework.polars_analysis_management import ( PlDfStats) - +from .serialization_utils import pd_to_obj from buckaroo.customizations.polars_commands import ( DropCol, FillNA, GroupBy #, OneHot, GroupBy, reindex ) +from .customizations.styling import DefaultSummaryStatsStyling, DefaultMainStyling +from .dataflow import Sampling + +class PLSampling(Sampling): + pre_limit = False + +local_analysis_klasses = PL_Analysis_Klasses.copy() +local_analysis_klasses.extend( + [DefaultSummaryStatsStyling, DefaultMainStyling]) class PolarsBuckarooWidget(BuckarooWidget): """TODO: Add docstring here """ command_classes = [DropCol, FillNA, GroupBy] - analysis_classes = PL_Analysis_Klasses + analysis_klasses = local_analysis_klasses DFStatsClass = PlDfStats + sampling_klass = PLSampling + + def _sd_to_jsondf(self, sd): + """exists so this can be overriden for polars """ + import pandas as pd + temp_sd = sd.copy() + + #FIXME add actual test around weird index behavior + # if 'index' in temp_sd: + # del temp_sd['index'] + return pd_to_obj(pd.DataFrame(temp_sd)) + + def _build_error_dataframe(self, e): + return pl.DataFrame({'err': [str(e)]}) + + def _df_to_obj(self, df): + # I want to this, but then row numbers are lost + #return pd_to_obj(self.sampling_klass.serialize_sample(df).to_pandas()) + return pd_to_obj(self.sampling_klass.serialize_sample(df.to_pandas())) + diff --git a/buckaroo/serialization_utils.py b/buckaroo/serialization_utils.py index fb74d9602..c35bda01c 100644 --- a/buckaroo/serialization_utils.py +++ b/buckaroo/serialization_utils.py @@ -1,7 +1,13 @@ import json import pandas as pd -from pandas.io.json import dumps as pdumps -from typing import Union +from typing import Union, Any + + +EMPTY_DF_WHOLE = { + 'pinned_rows':[], + 'column_config': [], + 'data': [] +} def d_update(d1, d2): ret_dict = d1.copy() @@ -41,25 +47,10 @@ def dict_repr(dct): return ret_str - -EMPTY_DF_OBJ = {'schema': {'fields': [{'name': 'index', 'type': 'string'}], - 'primaryKey': ['index'], - 'pandas_version': '1.4.0'}, - 'data': []} - - -def dumb_table_sumarize(df): - """used when table_hints aren't provided. Trests every column as a string""" - table_hints = {col:{'is_numeric':False, 'type':'obj', 'histogram':[]} for col in df} - table_hints['index'] = {'is_numeric': False, 'type':'obj', 'histogram':[] } - return table_hints - - #def force_to_pandas(df_pd_or_pl:Union[pd.DataFrame, pl.DataFrame]) -> pd.DataFrame: def force_to_pandas(df_pd_or_pl) -> pd.DataFrame: if isinstance(df_pd_or_pl, pd.DataFrame): return df_pd_or_pl - import polars as pl #hack for now so everything else flows through @@ -69,18 +60,32 @@ def force_to_pandas(df_pd_or_pl) -> pd.DataFrame: else: raise Exception("unexpected type for dataframe, got %r" % (type(df_pd_or_pl))) - -#def df_to_obj(unknown_df:Union[pd.DataFrame, pl.DataFrame], order = None, table_hints=None): -def df_to_obj(unknown_df:Union[pd.DataFrame], order = None, table_hints=None): +#def generate_column_config(df:pd.DataFrame, summary_dict) -> List[ColumnConfig]: +def generate_column_config(df:pd.DataFrame, summary_dict): + ret_conf = [] + index_name = df.index.name or "index" + ret_conf.append({'col_name':index_name, 'displayer_args' : { 'displayer':'obj'}}) + for col in df.columns: + ret_conf.append({'col_name': col, 'displayer_args' : { 'displayer':'obj'} }) + return ret_conf + + +#def df_to_obj(unknown_df:Union[pd.DataFrame, Any], summary_dict:Any) -> DFWhole: +def df_to_obj(unknown_df:Union[pd.DataFrame, Any], summary_dict:Any): df = force_to_pandas(unknown_df) - return pd_to_obj(df, order=order, table_hints=table_hints) + data = pd_to_obj(df) + #dfviewer_config:DFViewerConfig = { + dfviewer_config = { + 'pinned_rows' : [], + 'column_config' : generate_column_config(df, summary_dict) + } + return {'data':data, 'dfviewer_config': dfviewer_config} -def pd_to_obj(df:pd.DataFrame , order = None, table_hints=None): - if order is None: - order = df.columns + +def pd_to_obj(df:pd.DataFrame): obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) - if isinstance(df.index, pd.MultiIndex): + if isinstance(df.index, pd.MultiIndex): old_index = df.index temp_index = pd.Index(df.index.to_list(), tupleize_cols=False) df.index = temp_index @@ -88,18 +93,7 @@ def pd_to_obj(df:pd.DataFrame , order = None, table_hints=None): df.index = old_index else: obj = json.loads(df.to_json(orient='table', indent=2, default_handler=str)) - - if table_hints is None: - obj['table_hints'] = json.loads(pdumps(dumb_table_sumarize(df))) - else: - obj['table_hints'] = json.loads(pdumps(table_hints)) - - index_name = df.index.name or "index" - fields=[{'name': index_name, 'type':'unused' }] - for c in order: - fields.append({'name':str(c), 'type':'unused'}) - obj['schema'] = dict(fields=fields, primaryKey=[index_name], pandas_version='1.4.0') - return obj + return obj['data'] diff --git a/buckaroo/trait_utils.py b/buckaroo/trait_utils.py new file mode 100644 index 000000000..2f1f10696 --- /dev/null +++ b/buckaroo/trait_utils.py @@ -0,0 +1,50 @@ +import typing as t +from traitlets import Sentinel, EventHandler, All, ObserveHandler, HasTraits, Int, Unicode + +def my_observe(*names: t.Union[Sentinel, str], type: str = "change") -> "ObserveHandler": + """A decorator which can be used to observe Traits on a class. + + The handler passed to the decorator will be called with one ``change`` + dict argument. The change dictionary at least holds a 'type' key and a + 'name' key, corresponding respectively to the type of notification and the + name of the attribute that triggered the notification. + + Other keys may be passed depending on the value of 'type'. In the case + where type is 'change', we also have the following keys: + * ``owner`` : the HasTraits instance + * ``old`` : the old value of the modified trait attribute + * ``new`` : the new value of the modified trait attribute + * ``name`` : the name of the modified trait attribute. + + Parameters + ---------- + *names + The str names of the Traits to observe on the object. + type : str, kwarg-only + The type of event to observe (e.g. 'change') + """ + if not names: + raise TypeError("Please specify at least one trait name to observe.") + for name in names: + if name is not All and not isinstance(name, str): + raise TypeError("trait names to observe must be strings or All, not %r" % name) + return MyObserveHandler(names, type=type) + +class MyObserveHandler(EventHandler): + def __init__(self, names, type): + self.trait_names = names + self.type = type + + def instance_init(self, inst): + print("instance init called", inst) + + inst.observe(self, self.trait_names, type=self.type) + +class Foo(HasTraits): + bar = Int() + baz = Unicode() + + @my_observe("bar") + def _observe_bar(self, change): + print(change["old"]) + print(change["new"]) diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 71a95e1e8..8cc556eb3 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -31,12 +31,7 @@ def _display_as_buckaroo(df): from IPython.display import display try: bw = BuckarooWidget(df, - sampled=sampled, - summaryStats=summaryStats, - reorderdColumns=reorderdColumns, - showCommands=showCommands, - auto_clean=auto_clean, - postProcessingF=postProcessingF) + debug=debug) return display(bw) except: if debug: @@ -51,24 +46,16 @@ def _display_polars_as_buckaroo(polars_df): from buckaroo.polars_buckaroo import PolarsBuckarooWidget try: - return display(PolarsBuckarooWidget(polars_df, - sampled=sampled, - summaryStats=summaryStats, - reorderdColumns=reorderdColumns, - showCommands=showCommands, - auto_clean=auto_clean, - postProcessingF=postProcessingF)) + return display(PolarsBuckarooWidget(polars_df)) except: if debug: traceback.print_exc() return raise NotImplementedError - ip_formatter = ip.display_formatter.ipython_display_formatter ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) - try: import polars as pl ip_formatter.for_type(pl.DataFrame, _display_polars_as_buckaroo) diff --git a/docs/source/_static/embed-bundle.js.LICENSE.txt b/docs/source/_static/embed-bundle.js.LICENSE.txt index 6ef8448c4..d2b319a4f 100644 --- a/docs/source/_static/embed-bundle.js.LICENSE.txt +++ b/docs/source/_static/embed-bundle.js.LICENSE.txt @@ -147,14 +147,14 @@ /*! decimal.js-light v2.5.1 https://github.com/MikeMcl/decimal.js-light/LICENCE */ /** - * @ag-grid-community/all-modules - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue * @version v29.3.5 + * @ag-grid-community/all-modules - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue * @version v31.0.3 * @link https://www.ag-grid.com/ * @license MIT */ /** * @ag-grid-community/core - Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue - * @version v29.3.5 + * @version v31.0.3 * @link https://www.ag-grid.com/ * @license MIT */ diff --git a/docs/source/articles/data_flow.rst b/docs/source/articles/data_flow.rst new file mode 100644 index 000000000..44895fd74 --- /dev/null +++ b/docs/source/articles/data_flow.rst @@ -0,0 +1,208 @@ +.. _data_flow: + +Data Flow through Buckaroo +=========================== + + +Buckaroo is extensible. The architecture of Buckaroo is crafted to allow specific points of composable extensibility in an opinionated manner. It was designed this way based on experience from writing many adhoc analysis pipelines. Previous "simpler" attempts at extensibility ran into bugs that couldn't be cleanly accomodated. The following will be addressed below: + +Buckaroo aims to allow highly opionated configurations to be toggled by users. With buckaroo, you can add a cleaning_method of "interpret int as milliseconds from unix epoch", and it will look at a column of ints, and decide that values map to datetimes in the past year (as opposed to centered around 1970) and we should treat this column as a datetime. That is a highly opinionated view of your data, the cost for that highly opinonated view is less when multiple opinions can be quickly cycled through. + +This approach is different than most tools which aim to be a generic tool that is customizable with bespoke configuration. It would be a bad thing if a generic table tool displayed integers as dates because it assumes that those integers are milliseconds from the unix epoch. Normally this would require custom code to be written and called based on manual inspection of the data. + +This document describes the multiple ways of extending bucakroo to add your own toggable opinons. + + + + + + +#. understand the dataflow through Buckaroo +#. quick start to extending buckaroo +#. description of extension points + + +Customization points of Buckaroo +-------------------------------- + + +#. Sample_method + Used to specify conditions for downsampling dataframe and method of sampling. Example alternatives include sampling in chunks, only showing first and last row, random sampling, and limiting number of columns. Returns sampled df +#. Cleaning_method + recieves sampled_dataframe Used to control how dataframes are cleaned before summary stats are run. Examples include special parsing rules for unique date formats, removing strings from primarily numeric columns. Returns cleaned_df and cleaned_summary_dict +#. Post_processing_method + recieves entire cleaned dataframe. Used to perform multi-column operations, like adding a running_diff column, or combining a latitude and longitude column into a single lat/long column. returns processed_df and processed_summary_dict +#. Analysis_klasses + recieves individual columns from processed_df. Individual column level analysis klasses used to fill out summary_stats. examples include mean, median, min, max, and complex results like histograms. Each class returns a summary_dict about a single column +#. style-method + recieves col_name, col_summary_dict, default_config. Takes a column_summary_dict and returns the column_config for that column. Examples include formatting a datetime as time only if the min/max are within a single day, conditionally turning on tooltips and color_maps based on other info in summary_dict + + + +.. raw:: html + + + + +.. role:: dataflow-result +.. role:: dataflow-arg +.. role:: class-state +.. role:: ui-variable +.. role:: tuple-param +.. role:: tuple-result + + +Full Flow +--------- + +Starting with ``raw_df`` data flows through buckaroo as follows. If one of the values on the right side of equals changes, all steps below that are executed + +The final result of `widget` is what is displayed to the user. + + + ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +|Destination |args | ++==============================================+=============================================================================================================================+ +|:dataflow-result:`sampled_df` |:class-state:`raw_df`, :ui-variable:`sample_method` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +|:dataflow-result:`cleaned` |:dataflow-arg:`sampled_df`, :ui-variable:`sample_method`, :ui-variable:`cleaning_method`, :ui-variable:`lowcode_ops` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +| |:tuple-result:`cleaned_df`, :tuple-result:`cleaned_sd`, :tuple-result:`generated_code` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +|:dataflow-result:`processed` |:dataflow-arg:`cleaned_df`, :ui-variable:`post_processing_method` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +| |:tuple-result:`processed_df`, :tuple-result:`processed_sd` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +|:dataflow-result:`summary_sd` |:dataflow-arg:`processed_df`, :class-state:`analysis_klasses` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +|:dataflow-result:`merged_sd` |:tuple-param:`cleaned_sd`, :dataflow-arg:`summary_sd`, :tuple-param:`processed_sd` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ +|:dataflow-result:`widget` |:tuple-param:`processed_df`, :dataflow-arg:`merged_sd`, :ui-variable:`style_method`, :tuple-param:`generated_code` | ++----------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+ + +.. graphviz:: dataflow.dot + + + +Glossary +........ + +#. :dataflow-result:`dataflow-result` are the result of a step. updates to this variable trigger steps that watch the variable as a dataflow arg +#. :dataflow-arg:`dataflow-arg` a dataflow-result used as a function argument. updates to this cause the current step to execute +#. :ui-variable:`UI-Variable` are specified in the UI, and can be changed interactively. updates to this cause the current step to execute +#. :class-state:`class-state` are defined at class instantiation time, these can be customized, but not interactively +#. :tuple-result:`named-tuple-result` Some results return as a tuple, the tuple is what is watched, the sub parts of the tuple can be referenced later +#. :tuple-param:`tuple-param` read this from the a named-tuple-result. do not watch this vriable (setting this named-tuple-result will not trigger this step) + + +.. graphviz:: glossary.dot + + +Quick Start to extending Buckaroo +--------------------------------- + +In this exercise we are going add a custom coloring method to Buckaroo. We will take an OHLCV dataframecolor and Volume based on the change from the previous day. + +First we need to craft the column config that will enable this conditonal coloring. + +We want to use `ColorFromColumn`, we want the config for the volume column to look like + +.. code-block:: python + + volume_config_override = { + 'color_map_config' : { + 'color_rule': 'color_from_column', + 'col_name': 'Volume_colors'}} + + +Using this in Buckaroo will look like this + +.. code-block:: python + + df = get_ohlcv("IBM") + df['Volume_colors'] = 'red' + BuckarooWidget(df, override_column_config={'Volume': volume_config_override}) + +This is a nice start. But now our analysis depends on remembering and typing specific config lines each time we want this display. + + +Buckaroo provides built in ways of handling this. + +First we want to use a `post_processing_function` to add the `volume_colors` column all of the time. And to make it condtional on change. we need to use `post_processing_function` because we specifically need to operate on the whole dataframe, not just a single column. + + +.. code-block:: python + + def volume_post(df): + if 'Volume' not in df.columns: + return [df, {}] + df['Volume_colors'] = 'red' # replace with actual red/green based on diff + extra_summary_dict = { + 'Volume' : { + 'column_config_override': { + 'color_map_config' : + {'color_rule': 'color_from_column', + 'col_name': 'Volume_colors'}}}, + 'Volume_colors' : { + 'column_config_override': { + 'displayer': 'hidden'}}} + return [df, extra_summary_dict] + + class OHLVCBuckarooWidget(BuckarooWidget): + post_processing_function=volume_post + OHLVCBuckarooWidget(get_ohlcv("IBM")) + + +Now when you instantiate `OHLVCBuckarooWidget` there will be a UI toggable function of `volume_post` so you can turn on and turn off this feature interactively. `OHLVCBuckarooWidget` has your own opinions baked in, that the user can turn on or off. + +What if we want to switch between red/green colors map and a color map based on size of diff to previous day? In this case we want to add two "style_methods" which are togglable in the UI. style_method takes a summary_dict and returns the column config. + + +.. code-block:: python + + def volume_post(df): + if 'Volume' not in df.columns: + return [df, {}] + df['Volume_colors'] = 'red' # replace with actual red/green based on diff + df['Volume_diff'] = df['Volume'].diff() + extra_summary_dict = { + 'Volume_colors' : { 'column_config_override': { 'displayer': 'hidden'}}, + 'Volume_diff' : { 'column_config_override': { 'displayer': 'hidden'}}} + return [df, extra_summary_dict] + + def volume_style_red_green(col_name, col_summary_dict, default_config): + if col_name == 'Volume': + return {'override': { + 'color_map_config' : {'color_rule': 'color_from_column', 'col_name': 'Volume_colors'}}} + return {} + + def volume_style_color_map(col_name, col_summary_dict, default_config): + if col_name == 'Volume': + return {'override': { + 'color_map_config' : {'color_rule': 'color_map', 'map_name': 'BLUE_TO_YELLOW', + 'val_column': 'Volume_diff'}}} + return {} + + class OHLVCBuckarooWidget(BuckarooWidget): + post_processing_function=volume_post + style_methods=[volume_style_red_green, volume_style_color_map] + OHLVCBuckarooWidget(get_ohlcv("IBM")) + + +With this implementation, the frontend can cycle through three style_methods `volume_style_red_green`, `volume_style_color_map` and `default` + + + + + + + diff --git a/docs/source/articles/dataflow.dot b/docs/source/articles/dataflow.dot new file mode 100644 index 000000000..7608928a2 --- /dev/null +++ b/docs/source/articles/dataflow.dot @@ -0,0 +1,145 @@ +digraph g { + compound=true; + newrank=true; + node [style=filled; ]; + +//define nodes or cluster then links to the next level +//level raw_df +raw_df [color="green"; shape="house" height=1.2] +sample_method [color="orange"]; + +{ + rank = same; + // Here you enforce the desired order with "invisible" edges and arrowheads + edge[ style=invis]; + raw_df -> sample_method; + rankdir = LR; +} + + raw_df -> sampled_df [weight=20]; + sample_method -> sampled_df; + +//sampled_df level +sampled_df [color="lightblue"; shape="house" height=1.2]; +cleaning_method [color="orange"]; +lowcode_ops [color="orange" ]; + +{ + rank = same; + edge[ style=invis]; + sampled_df -> cleaning_method -> lowcode_ops; + rankdir = LR; +} + cleaning_method -> cleaned_df [lhead=cluster_cleaned] + lowcode_ops -> cleaned_sd [lhead=cluster_cleaned] + +//cluster cleaned level + +subgraph cluster_cleaned { + label="cleaned"; + fillcolor="red"; + style=filled; + + cleaned_df [shape="house" height=1.2; ]; + cleaned_sd [shape="invtrapezium" height=1 width=.5 group="sd"]; + { + rank = same; + edge[ style=invis]; + cleaned_df -> cleaned_sd -> generated_code ; + rankdir = LR; + } +} + +//forces post_processing_method onto a separate line +cleaned_df -> post_processing_method[style=invis]; +post_processing_method [color="orange"]; + + +{ + rank = same; + edge[ style=invis]; + //foo -> post_processing_method; + //foo[style=invis] + rankdir = LR; +} + + sampled_df -> cleaned_df [lhead=cluster_cleaned; color="blueviolet"; + penwidth = 5; weight=60] + + post_processing_method -> processed_sd[headport="e" tailport="w" + lhead=cluster_processed]; + +//cluster_processed level +subgraph cluster_processed { + label="processed"; + fillcolor="red"; + style=filled; + processed_df [shape="house" height=1.2 group="summary"]; + processed_sd [shape="invtrapezium" height=1 width=.5 group="sd"]; + { + rank = same; + edge[ style=invis]; + processed_df -> processed_sd; + rankdir = LR; + } +} + + cleaned_df -> processed_df[ + lhead=cluster_processed; color="blueviolet"; weight=100; penwidth = 5; ]; + + + processed_df -> summary_sd [ color="blueviolet"; penwidth = 5; weight=6; + tailport="sw" weight=50] ; + + { + rank=same; + analysis_klasses [color="orange" group="summary"]; + summary_sd; + summary_sd -> analysis_klasses [style=invis;] + } + analysis_klasses -> summary_sd ; + + +summary_sd [color="lightblue" shape="invtrapezium" height=1 width=.5 group="summary"]; +//analysis_klasses [color="green"]; + + summary_sd -> merged_sd [color="blueviolet"; penwidth = 5; headport="nw" weight=60]; + processed_sd -> merged_sd [style="dashed" headport="ne" weight=40 penwidth=2.5]; + + cleaned_sd -> merged_sd [style="dashed" tailport="s" headport="e" weight=10 penwidth=2.5]; + +merged_sd [color="lightblue"; shape="invtrapezium" height=1 width=.5 group="sd"] +style_method [color="orange"]; + {rank=same; + node [style="invis"] + edge [style="invis" headport="s" tailport="s"] + merged_sd -> style_method; + + } + style_method -> widget ; + + processed_df -> widget [style="dashed" weight=2.8 tailport="w" penwidth=2.5]; + merged_sd -> widget [color="blueviolet"; penwidth = 5; ]; + + //merged_sd -> style_method[style=invis]; //forces style_method onto a separate rank + generated_code -> widget [style="dashed" penwidth=2.5; tailport="s" headport="e" samehead="right"]; + generated_code [shape="component"; ]; + + +widget [color="lightblue"]; + + + +// sampled_df -> widget [ style="dotted" penwidth=3 color="red" constraint=false ] +// cleaned_df -> widget [ style="dotted" penwidth=3 color="red" constraint=false ltail=cluster_cleaned ] +// processed_df -> widget [ style="dotted" penwidth=3 color="red" constraint=false ltail=cluster_processed ] +// summary_sd -> widget [ style="dotted" penwidth=3 color="red" constraint=false ] +// merged_sd -> widget [ style="dotted" penwidth=3 color="red" constraint=false ] + + + + +} + + + diff --git a/docs/source/articles/dev-notes.rst b/docs/source/articles/dev-notes.rst new file mode 100644 index 000000000..471fd96ee --- /dev/null +++ b/docs/source/articles/dev-notes.rst @@ -0,0 +1,12 @@ + + +The version of the js module in package.json must be greater than the pyproject.toml version. + +Otherwise you will see "Widget model not found errors" + + +use +``` +time npm run build:labextension:dev +``` +when developing, it enables source-maps and is much faster diff --git a/docs/source/articles/glossary.dot b/docs/source/articles/glossary.dot new file mode 100644 index 000000000..a04c1433e --- /dev/null +++ b/docs/source/articles/glossary.dot @@ -0,0 +1,57 @@ +digraph g { + compound=true; + ratio = fill; + k=.8 + node [style=filled]; + +subgraph cluster_variables { + label="Variable types"; + instance_var [color="green";] + dataflow_variable [color="lightblue"] + ui_variable [color="orange"]; + } + instance_var -> dataframe [fconstraint=false style="invis" weight=10] + + +subgraph cluster_types { + label="Types"; + dataframe [shape="house" height=1 width=.5]; + summary_dict [shape="invtrapezium" height=1 width=.5]; +} + +summary_dict -> foo [fconstraint=false style="invis"] + +subgraph cluster_blah { + label="Named Tuple"; + fillcolor="red"; + style=filled; + foo + bar + baz + } + + foo -> c [ style="invis"] + + +subgraph cluster_edges { + landscape=true + packmode=10 + label="Edges"; + c -> d [penwidth = 5; color="blueviolet"; + label=" data-flow changes trigger recomputation" ]; + + e -> f [ constraint=false + label=" changes to ui-variables trigger recomputation too" ] + + a -> b [ style="dashed" penwidth=2.5 weight=10 + label=" read-only,\n does not trigger recompute"]; + + function -> widget [ + style="dotted" penwidth=3 color="red" + label="error-flow \n data-flow steps skipped" ] + e [color="orange"]; + c [color="lightblue"] + } + +} + diff --git a/docs/source/conf.py b/docs/source/conf.py index 704c07ea1..4b60d3606 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.5.2' +release = '0.6.1' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration @@ -26,3 +26,10 @@ html_theme = 'alabaster' html_static_path = ['_static'] + + +extensions = [ + # … + 'sphinx.ext.graphviz', +] +graphviz_output_format = 'svg' diff --git a/example-notebooks/Exception-Traits-demo.ipynb b/example-notebooks/Exception-Traits-demo.ipynb new file mode 100644 index 000000000..d8d621c1d --- /dev/null +++ b/example-notebooks/Exception-Traits-demo.ipynb @@ -0,0 +1,216 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "54685928-3f8c-430e-b270-09e51949997f", + "metadata": {}, + "source": [ + "# Demo of the trait exception rewriting\n", + "\n", + "Traitlets results in very long stacktraces. Look at the difference between these two stack traces.\n", + "\n", + "Watch this space, These stacktraces still aren't great, but they are much better" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3ba20b97-144d-459a-8217-f9e1793acbc7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import sys\n", + "from traitlets import Unicode, Any, observe, HasTraits, Dict\n", + "import six" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "091125db-b117-4b92-b1d4-231c54a8b1ea", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "division by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 28\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcompute_second\u001b[39m(\u001b[38;5;28mself\u001b[39m, val):\n\u001b[1;32m 26\u001b[0m \u001b[38;5;241m1\u001b[39m\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m0\u001b[39m\n\u001b[0;32m---> 28\u001b[0m ErrorSecond(\u001b[38;5;241m5\u001b[39m)\n", + "Cell \u001b[0;32mIn[2], line 8\u001b[0m, in \u001b[0;36mDumbBase.__init__\u001b[0;34m(self, val)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, val):\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m()\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfirst_trait \u001b[38;5;241m=\u001b[39m val\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:729\u001b[0m, in \u001b[0;36mTraitType.__set__\u001b[0;34m(self, obj, value)\u001b[0m\n\u001b[1;32m 727\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TraitError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m trait is read-only.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m 728\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 729\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset(obj, value)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:718\u001b[0m, in \u001b[0;36mTraitType.set\u001b[0;34m(self, obj, value)\u001b[0m\n\u001b[1;32m 714\u001b[0m silent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 715\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m silent \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 716\u001b[0m \u001b[38;5;66;03m# we explicitly compare silent to True just in case the equality\u001b[39;00m\n\u001b[1;32m 717\u001b[0m \u001b[38;5;66;03m# comparison above returns something other than True/False\u001b[39;00m\n\u001b[0;32m--> 718\u001b[0m obj\u001b[38;5;241m.\u001b[39m_notify_trait(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname, old_value, new_value)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:1503\u001b[0m, in \u001b[0;36mHasTraits._notify_trait\u001b[0;34m(self, name, old_value, new_value)\u001b[0m\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_notify_trait\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, old_value, new_value):\n\u001b[1;32m 1501\u001b[0m \u001b[38;5;66;03m# print(\"name\", name, \"old_value\", old_value)\u001b[39;00m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# try:\u001b[39;00m\n\u001b[0;32m-> 1503\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnotify_change(\n\u001b[1;32m 1504\u001b[0m Bunch(\n\u001b[1;32m 1505\u001b[0m name\u001b[38;5;241m=\u001b[39mname,\n\u001b[1;32m 1506\u001b[0m old\u001b[38;5;241m=\u001b[39mold_value,\n\u001b[1;32m 1507\u001b[0m new\u001b[38;5;241m=\u001b[39mnew_value,\n\u001b[1;32m 1508\u001b[0m owner\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 1509\u001b[0m \u001b[38;5;28mtype\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mchange\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 1510\u001b[0m )\n\u001b[1;32m 1511\u001b[0m )\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:1519\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[0;34m(self, change)\u001b[0m\n\u001b[1;32m 1517\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[1;32m 1518\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[0;32m-> 1519\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_notify_observers(change)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:1566\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[0;34m(self, event)\u001b[0m\n\u001b[1;32m 1563\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1564\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m-> 1566\u001b[0m c(event)\n", + "Cell \u001b[0;32mIn[2], line 15\u001b[0m, in \u001b[0;36mDumbBase.handle_first\u001b[0;34m(self, change)\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[38;5;129m@observe\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfirst_trait\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mhandle_first\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m---> 15\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msecond_trait \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompute_first(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfirst_trait)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:729\u001b[0m, in \u001b[0;36mTraitType.__set__\u001b[0;34m(self, obj, value)\u001b[0m\n\u001b[1;32m 727\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TraitError(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mThe \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m trait is read-only.\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname)\n\u001b[1;32m 728\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 729\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset(obj, value)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:718\u001b[0m, in \u001b[0;36mTraitType.set\u001b[0;34m(self, obj, value)\u001b[0m\n\u001b[1;32m 714\u001b[0m silent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 715\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m silent \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 716\u001b[0m \u001b[38;5;66;03m# we explicitly compare silent to True just in case the equality\u001b[39;00m\n\u001b[1;32m 717\u001b[0m \u001b[38;5;66;03m# comparison above returns something other than True/False\u001b[39;00m\n\u001b[0;32m--> 718\u001b[0m obj\u001b[38;5;241m.\u001b[39m_notify_trait(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mname, old_value, new_value)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:1503\u001b[0m, in \u001b[0;36mHasTraits._notify_trait\u001b[0;34m(self, name, old_value, new_value)\u001b[0m\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_notify_trait\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, old_value, new_value):\n\u001b[1;32m 1501\u001b[0m \u001b[38;5;66;03m# print(\"name\", name, \"old_value\", old_value)\u001b[39;00m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# try:\u001b[39;00m\n\u001b[0;32m-> 1503\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnotify_change(\n\u001b[1;32m 1504\u001b[0m Bunch(\n\u001b[1;32m 1505\u001b[0m name\u001b[38;5;241m=\u001b[39mname,\n\u001b[1;32m 1506\u001b[0m old\u001b[38;5;241m=\u001b[39mold_value,\n\u001b[1;32m 1507\u001b[0m new\u001b[38;5;241m=\u001b[39mnew_value,\n\u001b[1;32m 1508\u001b[0m owner\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 1509\u001b[0m \u001b[38;5;28mtype\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mchange\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 1510\u001b[0m )\n\u001b[1;32m 1511\u001b[0m )\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:1519\u001b[0m, in \u001b[0;36mHasTraits.notify_change\u001b[0;34m(self, change)\u001b[0m\n\u001b[1;32m 1517\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnotify_change\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[1;32m 1518\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Notify observers of a change event\"\"\"\u001b[39;00m\n\u001b[0;32m-> 1519\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_notify_observers(change)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/traitlets/traitlets.py:1566\u001b[0m, in \u001b[0;36mHasTraits._notify_observers\u001b[0;34m(self, event)\u001b[0m\n\u001b[1;32m 1563\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(c, EventHandler) \u001b[38;5;129;01mand\u001b[39;00m c\u001b[38;5;241m.\u001b[39mname \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1564\u001b[0m c \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, c\u001b[38;5;241m.\u001b[39mname)\n\u001b[0;32m-> 1566\u001b[0m c(event)\n", + "Cell \u001b[0;32mIn[2], line 22\u001b[0m, in \u001b[0;36mDumbBase.handle_second\u001b[0;34m(self, change)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[38;5;129m@observe\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msecond_trait\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 21\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mhandle_second\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[0;32m---> 22\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mthird_trait \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompute_second(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msecond_trait)\n", + "Cell \u001b[0;32mIn[2], line 26\u001b[0m, in \u001b[0;36mErrorSecond.compute_second\u001b[0;34m(self, val)\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcompute_second\u001b[39m(\u001b[38;5;28mself\u001b[39m, val):\n\u001b[0;32m---> 26\u001b[0m \u001b[38;5;241m1\u001b[39m\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m0\u001b[39m\n", + "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" + ] + } + ], + "source": [ + "class DumbBase(HasTraits):\n", + " first_trait = Any()\n", + " second_trait = Any()\n", + " third_trait = Any()\n", + "\n", + " def __init__(self, val):\n", + " super().__init__()\n", + " self.first_trait = val\n", + " \n", + " def compute_first(self, val):\n", + " return val\n", + " \n", + " @observe('first_trait')\n", + " def handle_first(self, change):\n", + " self.second_trait = self.compute_first(self.first_trait)\n", + "\n", + " def compute_second(self, val):\n", + " return val\n", + " \n", + " @observe('second_trait')\n", + " def handle_second(self, change):\n", + " self.third_trait = self.compute_second(self.second_trait)\n", + "\n", + "class ErrorSecond(DumbBase):\n", + " def compute_second(self, val):\n", + " 1/0\n", + " \n", + "ErrorSecond(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "1876620c-eb2c-4bdc-8a90-761c51a9a77b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "self.exception (, ZeroDivisionError('division by zero'), )\n" + ] + }, + { + "ename": "ZeroDivisionError", + "evalue": "division by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[4], line 50\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcompute_second\u001b[39m(\u001b[38;5;28mself\u001b[39m, val):\n\u001b[1;32m 49\u001b[0m \u001b[38;5;241m1\u001b[39m\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m0\u001b[39m\n\u001b[0;32m---> 50\u001b[0m ab \u001b[38;5;241m=\u001b[39m ErrorSecondSmart(\u001b[38;5;241m5\u001b[39m)\n\u001b[1;32m 51\u001b[0m ab\n", + "Cell \u001b[0;32mIn[4], line 25\u001b[0m, in \u001b[0;36mSmartBase.__init__\u001b[0;34m(self, val)\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mself.exception\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexception)\n\u001b[1;32m 24\u001b[0m exc, exc1, tb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexception\n\u001b[0;32m---> 25\u001b[0m six\u001b[38;5;241m.\u001b[39mreraise(exc, exc1, tb)\n", + "File \u001b[0;32m~/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/six.py:718\u001b[0m, in \u001b[0;36mreraise\u001b[0;34m(tp, value, tb)\u001b[0m\n\u001b[1;32m 716\u001b[0m value \u001b[38;5;241m=\u001b[39m tp()\n\u001b[1;32m 717\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m value\u001b[38;5;241m.\u001b[39m__traceback__ \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m tb:\n\u001b[0;32m--> 718\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m value\u001b[38;5;241m.\u001b[39mwith_traceback(tb)\n\u001b[1;32m 719\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m value\n\u001b[1;32m 720\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n", + "Cell \u001b[0;32mIn[4], line 42\u001b[0m, in \u001b[0;36mSmartBase.handle_second\u001b[0;34m(self, change)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[38;5;129m@observe\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msecond_trait\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 39\u001b[0m \u001b[38;5;129m@exception_protect\u001b[39m\n\u001b[1;32m 40\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mhandle_second\u001b[39m(\u001b[38;5;28mself\u001b[39m, change):\n\u001b[1;32m 41\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 42\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mthird_trait \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompute_second(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msecond_trait)\n\u001b[1;32m 43\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 44\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexception \u001b[38;5;241m=\u001b[39m sys\u001b[38;5;241m.\u001b[39mexc_info()\n", + "Cell \u001b[0;32mIn[4], line 49\u001b[0m, in \u001b[0;36mErrorSecondSmart.compute_second\u001b[0;34m(self, val)\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcompute_second\u001b[39m(\u001b[38;5;28mself\u001b[39m, val):\n\u001b[0;32m---> 49\u001b[0m \u001b[38;5;241m1\u001b[39m\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m0\u001b[39m\n", + "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" + ] + } + ], + "source": [ + "def exception_protect(func):\n", + " def wrapped(self, *args, **kwargs):\n", + " try:\n", + " func(self, *args, **kwargs)\n", + " except Exception as e:\n", + " if self.exception is None:\n", + " self.exception = sys.exc_info()\n", + " raise\n", + " return wrapped\n", + "\n", + "class SmartBase(HasTraits):\n", + " first_trait = Any()\n", + " second_trait = Any()\n", + " third_trait = Any()\n", + "\n", + " def __init__(self, val):\n", + " super().__init__()\n", + " self.exception = None\n", + " try:\n", + " self.first_trait = val\n", + " except Exception as e:\n", + " # print(\"e\", sys.exc_info())\n", + " print(\"self.exception\", self.exception)\n", + " exc, exc1, tb = self.exception\n", + " six.reraise(exc, exc1, tb)\n", + " \n", + " def compute_first(self, val):\n", + " return val\n", + " \n", + " @observe('first_trait')\n", + " @exception_protect\n", + " def handle_first(self, change):\n", + " self.second_trait = self.compute_first(self.first_trait)\n", + "\n", + " def compute_second(self, val):\n", + " return val\n", + " \n", + " @observe('second_trait')\n", + " @exception_protect\n", + " def handle_second(self, change):\n", + " try:\n", + " self.third_trait = self.compute_second(self.second_trait)\n", + " except Exception as e:\n", + " self.exception = sys.exc_info()\n", + " raise\n", + "\n", + "class ErrorSecondSmart(SmartBase):\n", + " def compute_second(self, val):\n", + " 1/0\n", + "ab = ErrorSecondSmart(5)\n", + "ab" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48b4e65c-8ac9-487b-9e9e-7cb5e9dd4fb1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/example-notebooks/Extending.ipynb b/example-notebooks/Extending.ipynb new file mode 100644 index 000000000..e3d0da71c --- /dev/null +++ b/example-notebooks/Extending.ipynb @@ -0,0 +1,440 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4d39f5cc-7791-4e90-8108-60752647487c", + "metadata": {}, + "source": [ + "# Extending Buckaroo\n", + "Buckaroo is built for exploratory data analysis on unknown data. Data in the wild is incredibly varied and so are the ways of visualizing it. Most table tools are built around allowing a single bespoke customization, with middle of the road defaults. Buckaroo takes a different approach. Buckaroo lets you build many highly specific configurations and then toggle between them quickly. This makes it easier to build each configuration because you don't have to solve for every possibility.\n", + "\n", + "This document walks you through how to add your own analysis to Buckaroo and allow users to toggle it\n", + "\n", + "The extension points are\n", + "* [PluggableAnalysisFramework](https://buckaroo-data.readthedocs.io/en/latest/articles/pluggable.html) Used to add summary stats and column metadata for use by other steps\n", + "* [Styling](./styling-howto.ipynb) control the visual display of the table\n", + "* PostProcessing used to transform an entire dataframe\n", + "* AutoCleaning Automate transformations for dropping nulls, removing outliers and other pre-processing steps, cleans the dataframe and generates python code. Not yet supported in 0.6\n", + "\n", + "Each extension point is composable, and can be interactively mixed and matched" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "73f3516e-2273-495a-b3b9-f68593b0018b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from buckaroo.dataflow import StylingAnalysis\n", + "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis\n", + "import polars as pl\n", + "from polars import functions as F\n", + "from buckaroo.polars_buckaroo import PolarsBuckarooWidget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45a03efb-ec32-4cda-b443-99425e80a458", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ROWS = 200\n", + "typed_df = pl.DataFrame({'int_col':np.random.randint(1,50, ROWS), 'float_col': np.random.randint(1,30, ROWS)/.7,\n", + " 'timestamp':[\"2020-01-01 01:00Z\", \"2020-01-01 02:00Z\", \"2020-02-28 02:00Z\", \"2020-03-15 02:00Z\", None] * 40,\n", + " \"str_col\": [\"foobar\", \"Realllllly long string\", \"\", None, \"normal\"]* 40})\n", + "typed_df = typed_df.with_columns(timestamp=pl.col('timestamp').str.to_datetime() )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8086b3b9-f97e-4b4c-9c0a-85566be060a3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pbw = PolarsBuckarooWidget(typed_df)\n", + "pbw" + ] + }, + { + "cell_type": "markdown", + "id": "85054e95-edc2-4842-994d-3f6131660a8e", + "metadata": {}, + "source": [ + "# Using the Pluggable Analysis Framework\n", + "\n", + "The PAF allows users to add summary analysis that runs for every dataframe, and exposes created measures to subsequent steps.\n", + "There are implementations for pandas and polars. Individual analysis classes cna depend on other calsess that provide measures, the framwork ensures that they are excecuted in the correct order.\n", + "\n", + "These measures form the column metadata used by styling, and the summary information used for pinned rows.\n", + "\n", + "You can read more here\n", + "\n", + "* https://github.com/paddymul/buckaroo/blob/main/tests/unit/polars_analysis_management_test.py\n", + "* https://github.com/paddymul/buckaroo/blob/main/buckaroo/customizations/polars_analysis.py\n", + "\n", + "The following cell adds a 99th quintile measure and displays it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37f0be6a-e94d-4650-b11d-cf3418ff0944", + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.pluggable_analysis_framework.utils import (json_postfix)\n", + "import polars.selectors as cs\n", + "class Quin99Analysis(StylingAnalysis):\n", + " select_clauses = [\n", + " cs.numeric().quantile(.99).name.map(json_postfix('quin99'))]\n", + " pinned_rows = [{'primary_key_val': 'quin99', 'displayer_args': {'displayer': 'obj' }}]\n", + " df_display_name = 'quin99'\n", + " data_key = \"empty\" # the non pinned rows will pull from the empty dataframe\n", + "\n", + "sbw = PolarsBuckarooWidget(typed_df)\n", + "sbw.add_analysis(Quin99Analysis)\n", + "sbw" + ] + }, + { + "cell_type": "markdown", + "id": "05ecd1e4-1bde-48ce-ac51-bf53f7bb91c4", + "metadata": {}, + "source": [ + "# Adding a styling analysis\n", + "The `StylingAnalysis` class is used to control the display of a column based on the column metadata. \n", + "\n", + "\n", + "Overriding the `config_from_column_metadata(col:str, sd:SingleColumnMetadata) -> ColumnConfig` computes the config for a single column given that column's metadata.\n", + "\n", + "This lets you customize based on metadata collected about a column. This works with the [PluggableAnalysisFramework](https://buckaroo-data.readthedocs.io/en/latest/articles/pluggable.html), you can specify required fields that are necessary. Adding requirements like this guarantees that errors are spotted early.\n", + "\n", + "The same StylingAnalysis class can generally work for both Polars and Pandas because it only receives a dictionary with simple python values.\n", + "\n", + "The following cell defines two StylingAnalysis, one that shows great detail `everything` the other shows shortened versions `Abrev`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c03b5bc4-0025-4b55-9e7c-cc1a69508688", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "class EverythingStyling(StylingAnalysis):\n", + " \"\"\"\n", + " This styling shows as much detail as possible\n", + " \"\"\"\n", + " df_display_name = \"Everything\"\n", + " requires_summary = [\"histogram\", \"is_numeric\", \"dtype\", \"_type\"]\n", + " pinned_rows = [{'primary_key_val': 'dtype', 'displayer_args': {'displayer': 'obj' }}]\n", + "\n", + " #Styling analysis handles column iteration for us.\n", + " @classmethod\n", + " def style_column(kls, col:str, column_metadata):\n", + " digits = 10\n", + " t = column_metadata['_type']\n", + " if column_metadata['is_integer']:\n", + " disp = {'displayer': 'float', 'min_fraction_digits':0, 'max_fraction_digits':0}\n", + " elif column_metadata['is_numeric']:\n", + " disp = {'displayer': 'float', 'min_fraction_digits':digits, 'max_fraction_digits':digits} \n", + " elif t == 'temporal':\n", + " disp = {'displayer': 'datetimeLocaleString','locale': 'en-US', 'args': {}}\n", + " elif t == 'string':\n", + " disp = {'displayer': 'string', 'max_length': 100}\n", + " else:\n", + " disp = {'displayer': 'obj'}\n", + " return {'col_name':col, 'displayer_args': disp }\n", + "\n", + "class AbrevStyling(StylingAnalysis):\n", + " \"\"\"This styling shows shortened versions of columns \"\"\"\n", + " requires_summary = [\"histogram\", \"is_numeric\", \"dtype\", \"_type\"]\n", + " df_display_name = \"Abrev\"\n", + " pinned_rows = []\n", + "\n", + " @classmethod\n", + " def style_column(kls, col:str, column_metadata):\n", + " digits = 3\n", + " t = column_metadata['_type']\n", + " if column_metadata['is_integer']:\n", + " disp = {'displayer': 'float', 'min_fraction_digits':0, 'max_fraction_digits':0}\n", + " elif column_metadata['is_numeric']:\n", + " disp = {'displayer': 'float', 'min_fraction_digits':digits, 'max_fraction_digits':digits}\n", + " elif column_metadata['dtype'] == pl.Datetime:\n", + " disp = {'displayer': 'datetimeLocaleString','locale': 'en-US', 'args': {}}\n", + " elif column_metadata['dtype'] == pl.String:\n", + " disp = {'displayer': 'string', 'max_length':10}\n", + " else:\n", + " disp = {'displayer': 'obj'}\n", + " return {'col_name':col, 'displayer_args': disp }\n", + "\n", + "sbw = PolarsBuckarooWidget(typed_df)\n", + "sbw.add_analysis(EverythingStyling)\n", + "sbw.add_analysis(AbrevStyling)\n", + "sbw" + ] + }, + { + "cell_type": "markdown", + "id": "a3116fa5-174e-4c67-98d7-dd33dc9b2275", + "metadata": {}, + "source": [ + "Let's look at pinned_rows, they can be modified by setting `pinned_rows` on Buckaroo Instaniation" + ] + }, + { + "cell_type": "markdown", + "id": "be8c2eb7-a791-46f8-b3b4-62f596799b21", + "metadata": {}, + "source": [ + "# lets add a post processing method" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ca85511-9a03-4477-aaf3-586947d8db02", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from polars import functions as F\n", + "from buckaroo.pluggable_analysis_framework.polars_analysis_management import PolarsAnalysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49243e53-e52c-45d8-bcd7-ca98d05ced5a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#typed_df.select(F.all(), pl.col('float_col').lt(5).replace(True, \"foo\").replace(False, None).alias('errored_float'))[:3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2088225-051e-4cd7-b353-03df60124cc2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bw = PolarsBuckarooWidget(typed_df)\n", + "@bw.add_processing\n", + "def transpose(df):\n", + " return df.transpose()\n", + "bw" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bdd2826-1716-4b88-b54d-74241f42549d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "class ValueCountPostProcessing(PolarsAnalysis):\n", + " @classmethod\n", + " def post_process_df(kls, df):\n", + " result_df = df.select(\n", + " F.all().value_counts().implode().list.gather(pl.arange(0, 10), null_on_oob=True).explode().struct.rename_fields(['val', 'unused_count']).struct.field('val').prefix('val_'),\n", + " F.all().value_counts().implode().list.gather(pl.arange(0, 10), null_on_oob=True).explode().struct.field('count').prefix('count_'))\n", + " return [result_df, {}]\n", + " post_processing_method = \"value_counts\"\n", + "\n", + "class ShowErrorsPostProcessing(PolarsAnalysis):\n", + " @classmethod\n", + " def post_process_df(kls, df):\n", + " result_df = df.select(\n", + " F.all(),\n", + " pl.col('float_col').lt(20).replace(True, \"some error\").replace(False, None).alias('errored_float'))\n", + " extra_column_config = {\n", + " 'float_col': {'column_config_override': {\n", + " 'color_map_config': {\n", + " 'color_rule': 'color_not_null',\n", + " 'conditional_color': 'red',\n", + " 'exist_column': 'errored_float'},\n", + " 'tooltip_config': { 'tooltip_type':'simple', 'val_column': 'errored_float'}}},\n", + " 'errored_float': {'column_config_override': {'merge_rule': 'hidden'}}}\n", + " return (result_df, extra_column_config)\n", + " post_processing_method = \"show_errors\"\n", + "\n", + "# In this case we are going to extend PolarsBuckarooWidget so we can take this combination with us\n", + "base_a_klasses = PolarsBuckarooWidget.analysis_klasses.copy()\n", + "base_a_klasses.extend([ValueCountPostProcessing, \n", + " ShowErrorsPostProcessing])\n", + "class VCBuckarooWidget(PolarsBuckarooWidget):\n", + " analysis_klasses = base_a_klasses\n", + "vcb = VCBuckarooWidget(typed_df, debug=False)\n", + "vcb" + ] + }, + { + "cell_type": "markdown", + "id": "8f2a47ec-0067-4e10-ac6d-d45c46ed6171", + "metadata": {}, + "source": [ + "## Where to use PostProcessing\n", + "Post processing functions are no argument transformations. I can't think of a lot of generic whole dataframe operations.\n", + "\n", + "`ValueCount` and `Transpose` are generic. `ShowErrors` depends on two specific columns.\n", + "\n", + "I expect Post processing to be very useful for small custom apps built on top of Buckaroo. When you know the columns and you want a strict set of transforms, PostProcessing is a great fit.\n", + "\n", + "\n", + "\n", + "Post processing is also useful when combined with a preprocessing function to compare DataFrames\n", + "\n", + "Here is some pseudo code\n", + "```python\n", + "class ComparePost(ColAnalysis):\n", + "\n", + " @classmethod\n", + " def post_process_df(kls, df):\n", + " df1,df2 = split_columns(\"|\")\n", + " compare_df = run_compare(df1, df2)\n", + " return [compare_df, {}]\n", + " post_processing_method = 'compare'\n", + " \n", + "class CompareWidget(BuckarooWidget):\n", + " analysis_klasses = [ComparePost]\n", + " \n", + "def compare(df1, df2):\n", + " joined = pd.concat([prefix_columns(df1, 'df1|'), prefix_columns(df2, 'df21|')])\n", + " return CompareWidget(joined)\n", + "\n", + "#run this by the following command\n", + "compare(sales_march_2022_df, sales_march_2023_df)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "1a9e4db3-82ca-4478-ab87-0e29cccdf108", + "metadata": {}, + "source": [ + "# Putting it all together\n", + "\n", + "You can compose (combine) the PluggableAnalysisFramework, PostProcessing and Styling into a single widget. And you can manipulate PostProcessing separately from Styling." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8ccbb77-5cc1-4501-bb84-45480d1213ad", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from buckaroo.customizations.polars_analysis import (\n", + " VCAnalysis, BasicAnalysis, PlTyping,\n", + " HistogramAnalysis, ComputedDefaultSummaryStats)\n", + "from buckaroo.customizations.styling import DefaultSummaryStatsStyling, DefaultMainStyling\n", + "\n", + "class KitchenSinkWidget(PolarsBuckarooWidget):\n", + " #let's be explicit here and show all of the built in analysis klasses\n", + " analysis_klasses = [\n", + " # The default analysis methods for Polars\n", + " VCAnalysis, BasicAnalysis, PlTyping,\n", + " HistogramAnalysis, ComputedDefaultSummaryStats,\n", + " # default buckaroo styling\n", + " DefaultSummaryStatsStyling, DefaultMainStyling,\n", + " \n", + " # our Quin99 analysis\n", + " Quin99Analysis, # adds a styling method\n", + " #our PostProcessing classes\n", + " ValueCountPostProcessing, ShowErrorsPostProcessing,\n", + " #our styling methods\n", + " EverythingStyling, AbrevStyling]\n", + "ksw = KitchenSinkWidget(typed_df)\n", + "ksw" + ] + }, + { + "cell_type": "markdown", + "id": "c83014fe-7a61-415d-862d-b7b055b2835e", + "metadata": {}, + "source": [ + "# Why aren't there click handlers?\n", + "\n", + "Buckaroo doesn't allow arbitrary click handlers and this is by design. When you allow arbitrary click handlers, you then have to manage state. If you have noticed, every method of extending buckaroo is a pure function. Managing application state is difficult and the primary source of errors when building GUIs.\n", + "\n", + "Buckaroo is designed purely around displaying DataFrames along with the most common operations that are performed on DataFrames. If you want more traditional app experiences, right now you can use IPYWidgets and integrate buckaroo into it. Soon I will be releasing the DFViewer (core component that shows the table) for Streamlit and Solara." + ] + }, + { + "cell_type": "markdown", + "id": "e19b6de0-5684-4f0e-b821-dd3ba1198e72", + "metadata": {}, + "source": [ + "# What about autocleaning and the low code UI\n", + "\n", + "Auto cleaning and the low code UI work together for more fine grained editting of data. The low code UI presents a gui that works on columns and allows functions with arguments. \n", + "\n", + "Auto cleaning works to suggest operations that are then loaded into the low code ui. Then these operations can be editted or removed.\n", + "Auto cleaning options can be cycled through to generate different cleanings.\n", + "\n", + "## Why did this release remove auto cleaning and the low code UI?\n", + "\n", + "Although auto cleaning and the low code UI is my favorite feature of Buckaroo, and the first part I built, it hasn't seemed to have gained traction with users. Buckaroo for that matter hasn't gained a lot of traction. For the time being I have decided to put more effort into refining and promoting the parts of Buckaroo that people do understand. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db2eb990-b6b0-47aa-b7ca-2fe40b9dcebe", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb index 7eec65e9f..40194ba0d 100644 --- a/example-notebooks/Full-tour.ipynb +++ b/example-notebooks/Full-tour.ipynb @@ -260,49 +260,6 @@ "source": [ "buckaroo.debug_packages()" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Auto cleaning\n", - "Here we will instaniate buckaroo with `auto_clean=True` Click over to summary stats and notice the difference between the dtypes on these two tables\n", - "notice that the birth year for the first table includes `\\n`, autoTyping was turned off for this widget" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "w = buckaroo.BuckarooWidget(df, auto_clean=True, showCommands=True)\n", - "w" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Turning off autocleaning by column\n", - "This widget has been configured to have the low code UI on by default.\n", - "Observe that the cleaning operation for each column has been added,\n", - "and can be removed with the X" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "w = buckaroo.BuckarooWidget(df, auto_clean=True, showCommands=True)\n", - "w" - ] } ], "metadata": { @@ -321,7 +278,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.18" + "version": "3.11.7" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/example-notebooks/Histograms-demo.ipynb b/example-notebooks/Histograms-demo.ipynb index cc99a01fd..6f47a24f2 100644 --- a/example-notebooks/Histograms-demo.ipynb +++ b/example-notebooks/Histograms-demo.ipynb @@ -27,9 +27,7 @@ "import numpy as np\n", "import itertools\n", "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import buckaroo\n", - "%matplotlib inline" + "import buckaroo" ] }, { @@ -41,7 +39,7 @@ }, "outputs": [], "source": [ - "def bimodal(mean_1, mean_2, N, sigma=5):\n", + "def bimodal(mean_1, mean_2, N, sigma=5, sigma2=5):\n", " X1 = np.random.normal(mean_1, sigma, int(N/2))\n", " X2 = np.random.normal(mean_2, sigma2, int(N/2))\n", " X = np.concatenate([X1, X2])\n", @@ -203,7 +201,14 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } } }, "nbformat": 4, diff --git a/example-notebooks/Customizing-Buckaroo.ipynb b/example-notebooks/Pluggable-Analysis-Framework.ipynb similarity index 67% rename from example-notebooks/Customizing-Buckaroo.ipynb rename to example-notebooks/Pluggable-Analysis-Framework.ipynb index c1eb1800f..5e0fb1dd3 100644 --- a/example-notebooks/Customizing-Buckaroo.ipynb +++ b/example-notebooks/Pluggable-Analysis-Framework.ipynb @@ -15,95 +15,22 @@ "* User supplied analyis objects, these operate on the dataframes to build the summary stats table, and configure the frontend display\n" ] }, - { - "cell_type": "markdown", - "id": "859de2ef-e86b-49f0-8f43-6c22d9c3ac69", - "metadata": {}, - "source": [ - "## Adding a Command to the Low Code UI" - ] - }, { "cell_type": "code", "execution_count": null, - "id": "08d439a4-3b7b-4e0f-9e52-78523c9d9ce2", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import buckaroo" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cdf47372-c70d-43db-85cb-db6af86ce7d4", + "id": "9b04f052-6973-4d29-b637-1d350d86798f", "metadata": { "tags": [] }, "outputs": [], "source": [ - "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")\n", - "w = buckaroo.BuckarooWidget(df[:500], showCommands=True, auto_clean=False) #turning autoType=False to reduce clutter in the operations\n", - "w" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5855f6b9-f42b-423b-ae00-09e20188e77f", - "metadata": {}, - "outputs": [], - "source": [ - "from buckaroo.customizations.all_transforms import Command\n", - "from buckaroo.jlisp.lispy import s\n", - "#Here we start adding commands to the Buckaroo Widget. Every call to add_command replaces a command with the same name\n", - "@w.add_command\n", - "class GroupBy3(Command):\n", - " command_default = [s(\"groupby3\"), s('df'), 'col', {}]\n", - " command_pattern = [[3, 'colMap', 'colEnum', ['null', 'sum', 'mean', 'median', 'count']]]\n", - " @staticmethod \n", - " def transform(df, col, col_spec):\n", - " grps = df.groupby(col)\n", - " \n", - " df_contents = {}\n", - " for k, v in col_spec.items():\n", - " if v == \"sum\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.sum())\n", - " elif v == \"mean\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.mean())\n", - " elif v == \"median\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.median())\n", - " elif v == \"count\":\n", - " df_contents[k] = grps[k].apply(lambda x: x.count())\n", - " return pd.DataFrame(df_contents)\n", + "import numpy as np\n", + "import pandas as pd\n", + "from buckaroo.buckaroo_widget import BuckarooWidget\n", "\n", - " @staticmethod \n", - " def transform_to_py(df, col, col_spec):\n", - " commands = [\n", - " \" grps = df.groupby('%s')\" % col,\n", - " \" df_contents = {}\"\n", - " ]\n", - " for k, v in col_spec.items():\n", - " if v == \"sum\":\n", - " commands.append(\" paddydf_contents['%s'] = grps['%s'].apply(lambda x: x.sum())\" % (k, k))\n", - " elif v == \"mean\":\n", - " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.mean())\" % (k, k))\n", - " elif v == \"median\":\n", - " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.median())\" % (k, k))\n", - " elif v == \"count\":\n", - " commands.append(\" df_contents['%s'] = grps['%s'].apply(lambda x: x.count())\" % (k, k))\n", - " commands.append(\" df = pd.DataFrame(df_contents)\")\n", - " return \"\\n\".join(commands)\n" - ] - }, - { - "cell_type": "markdown", - "id": "72fe04f0-84d4-4e7a-9fef-e61d098da745", - "metadata": {}, - "source": [ - "Note that `groupby2` has been added to the commands" + "#df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")\n", + "df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", + "#df[:500]" ] }, { @@ -126,7 +53,7 @@ "The `Pluggable Analysis Framework` is engineered to allow summary_stats to be built up piecemeal and incrementally. Traditionally when writing bits of analysis code, the tendency is to have large brittle functions that do a lot at once. Adding extra stats either requires copying and pasting the existing function with one small addition, writing each stat independently and possibly recomputing existing stats, having a strictly ordered set of analysis functions, or some complex adhoc argument passing scheme. I have written adhoc versions in each of these patterns. Problems are manifest and the aparatus rarely survives even copy-pasting to the next notebook.\n", "\n", "## How does the Pluggable Analysis Framework work?\n", - "The `Pluggable Analysis Framework` is built around a DAG of `ColAnalysis` nodes that can depend on other summary stats, and provide one or more summary stats. Nodes cand be added to the dag with `add_analysis`. If a class with the same name is inserted into the DAG, the newly inserted node replaces the previous instantiation. This all facilitates interactive development of analysis functions. During execution errors are caught and execution proceeds. This is important because breaking the default dataframe mechanism is a show stopping problem for users" + "The `Pluggable Analysis Framework` is built around a [DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph) of `ColAnalysis` nodes that can depend (`requires_summary`) on other summary stats which `provides_summary` the right values, and provide one or more summary stats. Nodes cand be added to the dag with `add_analysis`. If a class with the same name is inserted into the DAG, the newly inserted node replaces the previous instantiation. This all facilitates interactive development of analysis functions. During execution errors are caught and execution proceeds. This is important because breaking the default dataframe mechanism is a show stopping problem for users" ] }, { @@ -136,7 +63,7 @@ "metadata": {}, "outputs": [], "source": [ - "w = buckaroo.BuckarooWidget(df, showCommands=False)\n", + "w = BuckarooWidget(df[:500])\n", "w" ] }, @@ -148,7 +75,14 @@ "outputs": [], "source": [ "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis)\n", - "class Variance(ColAnalysis):\n", + "from buckaroo.dataflow import StylingAnalysis\n", + "\n", + "class Variance(StylingAnalysis):\n", + " #note we also override pinned rows so you can see this new stat, this is mainly used for development. \n", + " # Normally you would want to extend \"ColAnalysis\" to just provide the stat\n", + " pinned_rows = [\n", + " {'primary_key_val': 'variance', 'displayer_args': {'displayer': 'obj' }}]\n", + "\n", " provides_summary = [\"variance\"]\n", " #a bit hacky, the newly added analyis needs to be the last in the dependency chain\n", " requires_summary = [\"histogram\"]\n", @@ -159,26 +93,9 @@ " return dict(variance=ser.var())\n", " return dict(variance=\"NA\")\n", "\n", - " \n", - " summary_stats_display = [\n", - " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", - " 'empty_per', 'unique_per', 'nan_per', \n", - " 'is_numeric', 'is_integer', 'is_datetime',\n", - " 'mode', 'min', #'max', \n", - " 'mean', \n", - " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", - " 'variance']\n", "w.add_analysis(Variance)" ] }, - { - "cell_type": "markdown", - "id": "9b4451f7-8b2c-4ee5-8beb-930bcf628af4", - "metadata": {}, - "source": [ - "analysis is added interactively, toggle the summary stats view on the widget above and notice that `variance` has been added" - ] - }, { "cell_type": "markdown", "id": "ffdd52ed-443c-4ec3-9063-b067e779cbc4", @@ -198,9 +115,11 @@ }, "outputs": [], "source": [ + "#broken as 0f 0.6\n", + "\n", "small_df = df[:500][df.columns[:4]]\n", "# we are going to create, but not display a BuckarooWidget here, we are looking at the error behavior\n", - "w = buckaroo.BuckarooWidget(small_df, showCommands=False, debug=True)\n", + "w = BuckarooWidget(small_df, debug=True)\n", "\n", "class Variance(ColAnalysis):\n", " provides_summary = [\"variance\"]\n", @@ -211,7 +130,7 @@ " mean = summary_ser.get('mean', False)\n", " arr = ser.to_numpy()\n", " #toggle SIMULATED_BUG to easily see behavior with and without a bug\n", - " SIMULATED_BUG = True\n", + " SIMULATED_BUG = False\n", " if SIMULATED_BUG:\n", " if mean in [pd.NA, np.nan, False]:\n", " return dict(variance=\"NA\")\n", @@ -223,14 +142,6 @@ " elif mean and pd.api.types.is_float_dtype(ser):\n", " return dict(variance=np.mean((arr - mean)**2))\n", " return dict(variance=\"NA\")\n", - " \n", - " summary_stats_display = [\n", - " 'dtype', 'length', 'nan_count', 'distinct_count', 'empty_count',\n", - " 'empty_per', 'unique_per', 'nan_per', \n", - " 'is_numeric', 'is_integer', 'is_datetime',\n", - " 'mode', 'min', 'max', 'mean', \n", - " # we must add variance to the list of summary_stats_display, otherwise our new stat won't be displayed\n", - " 'variance']\n", "\n", "w.add_analysis(Variance)" ] @@ -329,6 +240,18 @@ "# Making a new default dataframe display function" ] }, + { + "cell_type": "markdown", + "id": "5f184bb2-3a1e-4a74-9c5b-388742ac6b67", + "metadata": { + "tags": [] + }, + "source": [ + "## Adding a Command to the Low Code UI\n", + "Previous versions of Buckaroo included a customizable low code UI. This is temporarily deprecated as of 0.6\n", + "Look at https://github.com/paddymul/buckaroo/blob/86df365278ac6933f7266c0b055a2ff90b072e9a/example-notebooks/Customizing-Buckaroo.ipynb for more info and install buckaroo at 0.4.6 or 0.5.1" + ] + }, { "cell_type": "code", "execution_count": null, @@ -382,7 +305,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.18" + "version": "3.11.7" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/example-notebooks/styling-gallery.ipynb b/example-notebooks/styling-gallery.ipynb new file mode 100644 index 000000000..36a6d3560 --- /dev/null +++ b/example-notebooks/styling-gallery.ipynb @@ -0,0 +1,632 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "99218d54-79db-4c3c-8ca5-373e3c1ed677", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from buckaroo.dataflow import StylingAnalysis\n", + "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis\n", + "import polars as pl\n", + "from buckaroo.polars_buckaroo import PolarsBuckarooWidget\n", + "from buckaroo.customizations.polars_analysis import PlTyping\n", + "N=500" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "840e09f3-8153-4800-a383-636556af4f32", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# This works with polars or pandas, these variables let us quickly swap between the two\n", + "DataFrame = pl.DataFrame\n", + "BUCKAROOWidget = PolarsBuckarooWidget\n", + "NA = pl.Null" + ] + }, + { + "cell_type": "markdown", + "id": "cf49c5fd-b617-4495-b018-1fadbc90cb4c", + "metadata": {}, + "source": [ + "This notebook generally follows the order of [DFWhole.ts](https://github.com/paddymul/buckaroo/blob/feat/dfviewer-config/js/components/DFViewerParts/DFWhole.ts)\n", + "\n", + "Starting with the simple Displayers\n", + "```js\n", + "export interface ObjDisplayerA {\n", + " displayer: 'obj';}\n", + "\n", + "export interface BooleanDisplayerA {\n", + " displayer: 'boolean';}\n", + "\n", + "export interface StringDisplayerA {\n", + " displayer: 'string';\n", + " max_length?: number;} \n", + " \n", + "export interface FloatDisplayerA {\n", + " displayer: 'float';\n", + " min_fraction_digits: number;\n", + " max_fraction_digits: number;}\n", + "\n", + "export interface DatetimeDefaultDisplayerA {\n", + " displayer: 'datetimeDefault';}\n", + "export interface IntegerDisplayerA {\n", + " displayer: 'integer';\n", + " min_digits: number;\n", + " max_digits: number;}\n", + "\n", + "export interface DatetimeLocaleDisplayerA {\n", + " displayer: 'datetimeLocaleString';\n", + " locale: 'en-US' | 'en-GB' | 'en-CA' | 'fr-FR' | 'es-ES' | 'de-DE' | 'ja-JP';\n", + " // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat\n", + " args: Intl.DateTimeFormatOptions;}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4697fa58-9609-412f-b2d0-48a63fed0c99", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#simpler Buckaroo that really shows the styling\n", + "def obj_(pkey):\n", + " return {'primary_key_val': pkey, 'displayer_args': { 'displayer': 'obj' } }\n", + "\n", + "class GalleryStyling(StylingAnalysis):\n", + " requires_summary = ['dtype']\n", + " pinned_rows = [obj_('dtype')]\n", + "class GalleryBuckaroo(PolarsBuckarooWidget):\n", + " analysis_klasses = [GalleryStyling, PlTyping]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e84d497-539f-4c62-810f-1cef72f417d2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "obj_df = pl.DataFrame({\n", + " 'bools':[True, True, False, False, True, None],\n", + " 'ints': [ 5, 20, 30, -10, 7772, None],\n", + " 'timestamp':[\"2020-01-01 01:00Z\", \"2020-01-01 02:00Z\", \"2020-02-28 02:00Z\", \"2020-03-15 02:00Z\", None, None],\n", + " 'dicts': [ {'a':10, 'b':20, 'c':'some string'}, None, None, None, None, None], #polars\n", + " 'nested_dicts': [{'level_1': {'a':10, 'b':20, 'c':'some string'}}, None, None, None, None, None],\n", + " 'lists': [['a','b'], [1,2], None, None, None, None],\n", + " 'lists-string': [['a','b'], ['foo', 'bar'], None, None, None, None],\n", + " 'lists-int': [[10, 20], [100, 500], [8], None, None, None]}\n", + ")\n", + "GalleryBuckaroo(obj_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "540dcd65-248d-43a3-b8c3-2db3159d3f8d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "obj_df = pl.DataFrame({\n", + " 'bools':[True, True, False, False, True, None],\n", + " 'ints': [ 5, 20, 30, -10, 7772, None],\n", + " 'dicts': [ {'a':10, 'b':20, 'c':'some string'}, None, None, None, None, None], #polars\n", + " 'nested_dicts': [{'level_1': {'a':10, 'b':20, 'c':'some string'}}, None, None, None, None, None],\n", + " #'nested_dicts2': pl.Series([{'level_1': {'a':10, 'b':20, 'c':'some string'}}, None, None, None, None, None], dtype=pl.Object)}\n", + " }\n", + ")\n", + "GalleryBuckaroo(obj_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c49dd11-9727-4ac1-829c-bed1a155629b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bool_df = pl.DataFrame({'bools':[True, True, False, False, True, None]})\n", + "bool_df = bool_df.select(\n", + " pl.col('bools').alias('bools_obj_displayer'), \n", + " pl.col('bools').alias('bools_boolean_displayer'))\n", + "#fix #'bools_bool_checkbox_displayer': {'displayer_args': {'displayer': 'boolean_checkbox'}\n", + "PolarsBuckarooWidget(\n", + " bool_df, \n", + "# column_config_overrides={\n", + "# 'bools_obj_displayer': {'displayer_args': {'displayer': 'obj'}}, \n", + "# 'bools_boolean_displayer': {'displayer_args': {'displayer': 'boolean'}}}\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18e5adba-49b8-453a-86f7-ce438c61113a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "string_df = pl.DataFrame({'strings':[\"asdf\", \"qwerty\", \"really long string, much much longer\", None, \"A\"]})\n", + "string_df = string_df.select(\n", + " pl.col('strings').alias('strings_obj_displayer'), \n", + " pl.col('strings').alias('strings_string_displayer'),\n", + " pl.col('strings').alias('strings_string_displayer_max_len'))\n", + "PolarsBuckarooWidget(\n", + " string_df, \n", + " column_config_overrides={\n", + " 'strings_obj_displayer': {'displayer_args': {'displayer': 'obj'}}, \n", + " 'strings_string_displayer': {'displayer_args': {'displayer': 'string'}},\n", + " 'strings_string_displayer_max_len': {'displayer_args': {'displayer': 'string', 'max_length':15}}\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8cefca2-6db8-4599-b46a-40e7cc45caef", + "metadata": {}, + "outputs": [], + "source": [ + "float_df = pl.DataFrame({\n", + " 'float': [5, -8, 13.23, -8.01, -999.345245234, None]})\n", + "\n", + "def float_(min_digits, max_digits):\n", + " return {'displayer_args': { 'displayer': 'float', 'min_fraction_digits':min_digits, 'max_fraction_digits': max_digits}}\n", + "float_df = float_df.select(\n", + " pl.col('float').alias('float_obj_displayer'), \n", + " pl.col('float').alias('float_float_displayer_1__3'),\n", + " pl.col('float').alias('float_float_displayer_0__3'),\n", + " pl.col('float').alias('float_float_displayer_3__3'),\n", + " pl.col('float').alias('float_float_displayer_3_13'))\n", + "PolarsBuckarooWidget(\n", + " float_df,\n", + " column_config_overrides={\n", + " 'float_obj_displayer': {'displayer_args': {'displayer': 'obj'}}, \n", + " 'float_float_displayer_1__3' : float_(1,3),\n", + " 'float_float_displayer_0__3' : float_(0,3),\n", + " 'float_float_displayer_3__3' : float_(3,3),\n", + " 'float_float_displayer_3_13' : float_(3,13)})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa1410bf-8540-4daf-8080-ae7d52e70546", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from polars import functions as F\n", + "\n", + "datetime_df = pl.DataFrame({'timestamp':[\"2020-01-01 01:00Z\", \"2020-01-01 02:00Z\", \"2020-02-28 02:00Z\", \"2020-03-15 02:00Z\", None]})\n", + "datetime_df = datetime_df.select(\n", + " pl.col('timestamp').alias('timestamp_obj_displayer'),\n", + " pl.col('timestamp').alias('timestamp_datetime_default_displayer'),\n", + " pl.col('timestamp').alias('timestamp_datetime_locale_en-US'),\n", + " pl.col('timestamp').alias('timestamp_datetime_locale_en-US-Long'),\n", + " pl.col('timestamp').alias('timestamp_datetime_locale_en-GB'))\n", + "datetime_df = datetime_df.select(F.all().str.to_datetime())\n", + "def locale(locale, args={}):\n", + " return {'displayer_args': {'displayer': 'datetimeLocaleString',\n", + " 'locale':locale,\n", + " 'args':args}}\n", + "PolarsBuckarooWidget(datetime_df,\n", + " column_config_overrides={\n", + " 'timestamp_obj_displayer': {'displayer_args': {'displayer': 'obj'}}, \n", + " 'timestamp_datetime_default_displayer' : {'displayer_args': { 'displayer': 'datetimeDefault'}},\n", + " 'timestamp_datetime_locale_en-US' :locale('en-US'),\n", + " 'timestamp_datetime_locale_en-US-Long': locale('en-US', { 'weekday': 'long'}),\n", + " 'timestamp_datetime_locale_en-GB' : locale('en-GB')})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c943c155-1266-45b3-a790-c98a89e75cf8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "link_df = DataFrame({'raw': ['https://github.com/paddymul/buckaroo', 'https://github.com/pola-rs/polars'],\n", + " 'linkify' : ['https://github.com/paddymul/buckaroo', 'https://github.com/pola-rs/polars']})\n", + "BUCKAROOWidget(link_df,\n", + " column_config_overrides={'linkify': {'displayer_args': { 'displayer': 'linkify'}}})\n", + "#fixme no underline or blue highlighting of links... but they are links" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "06a67f09-191a-40d1-8cf3-2ef240290516", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "histo_df = pd.DataFrame({\n", + " 'names': ['index', 'all_NA', 'half_NA', 'longtail', 'longtail_unique'],\n", + " 'histogram_props': ['histogram',\n", + " [{'name': 'NA', 'NA': 100.0}],\n", + " [{'name': 1, 'cat_pop': 44.0}, {'name': 'NA', 'NA': 56.0}],\n", + " [{'name': 'long_97', 'cat_pop': 0.0},\n", + " {'name': 'long_139', 'cat_pop': 0.0},\n", + " {'name': 'long_12', 'cat_pop': 0.0},\n", + " {'name': 'long_134', 'cat_pop': 0.0},\n", + " {'name': 'long_21', 'cat_pop': 0.0},\n", + " {'name': 'long_44', 'cat_pop': 0.0},\n", + " {'name': 'long_58', 'cat_pop': 0.0},\n", + " {'name': 'longtail', 'longtail': 77.0},\n", + " {'name': 'NA', 'NA': 20.0}],\n", + " [{'name': 'long_113', 'cat_pop': 0.0},\n", + " {'name': 'long_116', 'cat_pop': 0.0},\n", + " {'name': 'long_33', 'cat_pop': 0.0},\n", + " {'name': 'long_72', 'cat_pop': 0.0},\n", + " {'name': 'long_122', 'cat_pop': 0.0},\n", + " {'name': 'long_6', 'cat_pop': 0.0},\n", + " {'name': 'long_83', 'cat_pop': 0.0},\n", + " {'name': 'longtail', 'unique': 50.0, 'longtail': 47.0}]]})\n", + "from buckaroo.customizations.analysis import TypingStats\n", + "from buckaroo.buckaroo_widget import BuckarooWidget\n", + "class PdGalleryBuckaroo(BuckarooWidget):\n", + " analysis_klasses = [GalleryStyling, TypingStats]\n", + "PdGalleryBuckaroo(histo_df,\n", + " column_config_overrides={\n", + " 'histogram_props': {'displayer_args': {'displayer': 'histogram'}}})\n", + "#Fixme, this doesn't work with polars right now, probably related to the object dtype problem" + ] + }, + { + "cell_type": "markdown", + "id": "c8d2accd-4732-43ff-b92a-d827b330b538", + "metadata": {}, + "source": [ + "# Tooltips" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "344ce005-1c0d-4ee6-8ef3-95c2cde977ac", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ROWS = 200\n", + "typed_df = pl.DataFrame({'int_col':np.random.randint(1,50, ROWS), 'float_col': np.random.randint(1,30, ROWS)/.7,\n", + " \"str_col\": [\"foobar\"]* ROWS})\n", + "PolarsBuckarooWidget(\n", + " typed_df, \n", + " column_config_overrides={\n", + " 'str_col':\n", + " {'tooltip_config': { 'tooltip_type':'simple', 'val_column': 'int_col'}}})" + ] + }, + { + "cell_type": "markdown", + "id": "f7a91713-b95d-4546-a5ad-0be964f4b2df", + "metadata": {}, + "source": [ + "# Color_map_config\n", + "```ts\n", + "//ColorMapRules\n", + "export interface ColorMapRules {\n", + " color_rule: 'color_map';\n", + " map_name: 'BLUE_TO_YELLOW' | 'DIVERGING_RED_WHITE_BLUE';\n", + " //optional, the column to base the ranges on. the proper histogram_bins must still be sent in for that column\n", + " val_column?: string;\n", + "}\n", + "\n", + "//if exist_column is not null, set cell style to condtional_color... used for highlighting changed values or errored_rows\n", + "export interface ColorWhenNotNullRules {\n", + " color_rule: 'color_not_null';\n", + " conditional_color: string | 'red';\n", + " exist_column: string;\n", + "}\n", + "\n", + "export interface ColorFromColumn {\n", + " color_rule: 'color_from_column';\n", + " col_name: string;\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3dbf1c45-7725-4cd7-8008-da3085f55667", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "PolarsBuckarooWidget(\n", + " typed_df, \n", + " column_config_overrides={\n", + " 'float_col': {'color_map_config': {\n", + " 'color_rule': 'color_map',\n", + " 'map_name': 'BLUE_TO_YELLOW',\n", + " }}})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a43ecbfb-ae8d-428f-9cb5-29eb53afa076", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "error_df = pl.DataFrame({\n", + " 'a': [10, 20, 30],\n", + " 'err_messages': [None, \"a must be less than 19, it is 20\", \"a must be less than 19, it is 30\"]})\n", + "\n", + "PolarsBuckarooWidget(\n", + " error_df, \n", + " column_config_overrides={\n", + " 'a': {'color_map_config': {\n", + " 'color_rule': 'color_not_null',\n", + " 'conditional_color': 'red',\n", + " 'exist_column': 'err_messages'}}})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bc7cef8-1f93-4415-a420-c9aa44fd583e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "color_df = pl.DataFrame({\n", + " 'a': [10, 20, 30],\n", + " 'a_colors': ['red', '#d3a', 'green']})\n", + "\n", + "PolarsBuckarooWidget(\n", + " color_df, \n", + " column_config_overrides={\n", + " 'a': { 'color_map_config': {\n", + " 'color_rule': 'color_from_column',\n", + " 'col_name': 'a_colors'}}})" + ] + }, + { + "cell_type": "markdown", + "id": "1768186c-14fc-49fa-8e03-e8f454411d5b", + "metadata": {}, + "source": [ + "Extra col def type\n", + "\n", + "`ag_grid_specs`\n", + "only to be used for very specific hacking. You can set any primitive property, but can't set function props\n", + "https://github.com/ag-grid/ag-grid/blob/3cce76f1f2fd7142126f659fdc1dc3f0b7bc6191/grid-community-modules/core/src/ts/entities/colDef.ts#L4\n", + "\n", + "latest\n", + "https://github.com/ag-grid/ag-grid/blob/latest/grid-community-modules/core/src/ts/entities/colDef.ts" + ] + }, + { + "cell_type": "markdown", + "id": "2ebaa204-9a32-47d0-9d87-14d9755a738b", + "metadata": {}, + "source": [ + "# Utility Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fd31184-6197-4d13-a319-aaefee224745", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#utility code for generating histogram data structures\n", + "from buckaroo.buckaroo_widget import BuckarooWidget\n", + "\n", + "NA = pd.NA\n", + "def rand_cat(named_p, na_per, N):\n", + " choices, p = [], []\n", + " named_total_per = sum(named_p.values()) + na_per\n", + " total_len = int(np.floor(named_total_per * N))\n", + " if named_total_per > 0:\n", + " for k, v in named_p.items():\n", + " choices.append(k)\n", + " p.append(v/named_total_per)\n", + "\n", + " choices.append(NA)\n", + " p.append(na_per/named_total_per) \n", + " return [np.random.choice(choices, p=p) for k in range(total_len)]\n", + " else:\n", + " return []\n", + "\n", + "def random_categorical(named_p, unique_per, na_per, longtail_per, N):\n", + " choice_arr = rand_cat(named_p, na_per, N)\n", + " discrete_choice_len = len(choice_arr)\n", + "\n", + " longtail_count = int(np.floor(longtail_per * N))//2\n", + " extra_arr = []\n", + " for i in range(longtail_count):\n", + " extra_arr.append(\"long_%d\" % i)\n", + " extra_arr.append(\"long_%d\" % i)\n", + "\n", + " unique_len = N - (len(extra_arr) + discrete_choice_len)\n", + " #print(\"discrete_choice_len\", discrete_choice_len, \"longtail_count\", longtail_count, \"unique_len\", unique_len)\n", + " for i in range(unique_len):\n", + " extra_arr.append(\"unique_%d\" % i)\n", + " all_arr = np.concatenate([choice_arr, extra_arr])\n", + " np.random.shuffle(all_arr)\n", + " return all_arr \n", + "cat_histo_df = pd.DataFrame({\n", + " 'all_NA' : [NA] * N,\n", + " 'half_NA' : random_categorical({1: .5}, unique_per=0, na_per=.5, longtail_per=.0, N=N),\n", + " 'longtail' : random_categorical({}, unique_per=0, na_per=.2, longtail_per=.8, N=N),\n", + " 'longtail_unique' : random_categorical({}, unique_per=0.5, na_per=.0, longtail_per=.5, N=N),\n", + "})\n", + "bw = BuckarooWidget(\n", + " cat_histo_df, \n", + " pinned_rows=[\n", + " { 'primary_key_val': 'dtype', 'displayer_args': { 'displayer': 'obj' } },\n", + " { 'primary_key_val': 'histogram', 'displayer_args': { 'displayer': 'histogram' }}, \n", + " ])\n", + "histogram_vals = [x for x in bw.df_data_dict['all_stats'] if x['index'] == 'histogram'][0]\n", + "def format_histo(bw):\n", + " histogram_vals = [x for x in bw.df_data_dict['all_stats'] if x['index'] == 'histogram'][0]\n", + " return dict(\n", + " names = list(histogram_vals.keys()),\n", + " histogram_props = list(histogram_vals.values()))\n", + "format_histo(bw)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9eee93ff-49c2-41ca-b402-5378afa04ab8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from buckaroo.customizations.analysis import TypingStats\n", + "from buckaroo.buckaroo_widget import BuckarooWidget\n", + "class PdGalleryBuckaroo(BuckarooWidget):\n", + " analysis_klasses = [GalleryStyling, TypingStats]\n", + "\n", + "class PdGalleryBuckaroo(BuckarooWidget):\n", + " analysis_klasses = [GalleryStyling, TypingStats]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df395ef4-2f33-49d5-a380-6cead5926566", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pd_histo = pd.DataFrame(format_histo(bw))\n", + "col_dict = dict(pd_histo.to_numpy().tolist()[1:])\n", + "pl_histo = pl.DataFrame(dict([(k, [v]) for k,v in col_dict.items()]))\n", + "PolarsBuckarooWidget(pl_histo)\n", + "GalleryBuckaroo(pl_histo,\n", + " column_config_overrides={\n", + " 'histogram_props': {'displayer_args': {'displayer': 'histogram'}}})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8a8b8b12-d094-4dcc-9152-1b00e77fb182", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pl_gb = GalleryBuckaroo(pl.DataFrame(format_histo(bw)))\n", + "pd_gb = PdGalleryBuckaroo(pd.DataFrame(format_histo(bw)))\n", + "pd_gb.df_data_dict['main']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "440fb9fe-96b5-49c2-a341-41583b8fc0c6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pl_gb.df_data_dict['main']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a10fe4bf-4522-41b5-b634-736cf5280cf5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from buckaroo.customizations.analysis import TypingStats\n", + "from buckaroo.buckaroo_widget import BuckarooWidget\n", + "class PdGalleryBuckaroo(BuckarooWidget):\n", + " analysis_klasses = [GalleryStyling, TypingStats]\n", + "PdGalleryBuckaroo(pd.DataFrame(format_histo(bw)),\n", + " column_config_overrides={\n", + " 'histogram_props': {'displayer_args': {'displayer': 'histogram'}}})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57adf339-87aa-4e34-a2ab-ad02846a871c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e80393b-fa65-4c1b-89df-7345c4206b60", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/example-notebooks/styling-howto.ipynb b/example-notebooks/styling-howto.ipynb new file mode 100644 index 000000000..7d0171ed5 --- /dev/null +++ b/example-notebooks/styling-howto.ipynb @@ -0,0 +1,545 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f7fd6f90-3a45-4090-a0aa-bf0e03aab56b", + "metadata": { + "tags": [] + }, + "source": [ + "# How to style Buckaroo tables\n", + "Buckaroo had a major refactoring of the styling system and callbacks with the 0.6 release.\n", + "\n", + "This notebook walks through\n", + "* Styling columns via the `displayer`\n", + "* How to override columns\n", + "* Tooltips\n", + "* Cell Coloring\n", + "* Column hiding\n", + "* pinned_rows\n", + "* How to add automatic styling methods that are available via the UI to cycle through" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "73f3516e-2273-495a-b3b9-f68593b0018b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from buckaroo.dataflow import StylingAnalysis\n", + "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis\n", + "import polars as pl\n", + "from buckaroo.polars_buckaroo import PolarsBuckarooWidget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45a03efb-ec32-4cda-b443-99425e80a458", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ROWS = 200\n", + "typed_df = pl.DataFrame({'int_col':np.random.randint(1,50, ROWS), 'float_col': np.random.randint(1,30, ROWS)/.7,\n", + " \"str_col\": [\"foobar\"]* ROWS})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8086b3b9-f97e-4b4c-9c0a-85566be060a3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "PolarsBuckarooWidget(typed_df)" + ] + }, + { + "cell_type": "markdown", + "id": "04bae28c-68e4-43d1-b323-1ac503efa18a", + "metadata": {}, + "source": [ + "## `displayer`\n", + "Changing the `displayer` is the most common way to customize the styling of a column, in the next example, we override the column_config for `float_col`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c6d50c3-004b-4850-8404-bef00a990e55", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bw2 = PolarsBuckarooWidget(\n", + " typed_df, \n", + " debug=False,\n", + " column_config_overrides={\n", + " 'float_col':\n", + " {'displayer_args': { 'displayer': 'float', 'min_fraction_digits':0, 'max_fraction_digits':3}}})\n", + "bw2" + ] + }, + { + "cell_type": "markdown", + "id": "de8b7829-c898-4fec-93b0-09c3f7552146", + "metadata": {}, + "source": [ + "Now we are going to force `float_col` to be displayed with a 'float' displayer\n", + "notice how the decimal point aligns as opposed to above where 10 is floored without a decimal portion\n", + "\n", + "Currently the types are best viewed in their typescript definition [DFWhole.ts](https://github.com/paddymul/buckaroo/blob/feat/dfviewer-config/js/components/DFViewerParts/DFWhole.ts)\n", + "\n", + "There are Displayers of\n", + "\n", + "`ObjDisplayer`, `BooleanDisplayer`, `StringDisplayer`, `FloatDisplayer`, \n", + "`DatetimeDefaultDisplayer`, `DatetimeLocaleDisplayer`, `IntegerDisplayer`,\n", + "\n", + "`HistogramDisplayer`, and `LinkifyDisplayer`,\n", + "\n", + "There are planned displayers of [HumanAbbreviationDisplayer](https://github.com/paddymul/buckaroo/issues/83), [LineChartDisplayer](https://github.com/paddymul/buckaroo/issues/210), [GoogleMapsLinkDisplayer](https://github.com/paddymul/buckaroo/issues/211) , [InlineMapDisplayer](https://github.com/paddymul/buckaroo/issues/212)\n", + "\n", + "\n", + "There is experimental work building mirrored PyDantic types, and work to integrate this typechecking into Buckaroo. There are also plans for a gallery of examples of the different options." + ] + }, + { + "cell_type": "markdown", + "id": "8999d568-ddbe-40c8-a7cb-fa7fe0c47c9c", + "metadata": {}, + "source": [ + "# `tooltip_config`\n", + "\n", + "There are tooltip_configs of simple summary_series available\n", + "\n", + "Tooltips are helpful for adding extra context to cells. Particularly for noting errors or values changed via auto-cleaning\n", + "\n", + "Notice that `column_config_overrides` is merged with the existing column config from Buckaroo, every column still has a displayer" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "abc0e795-4ab9-4a5d-b09d-3b926e82afee", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bw3 = PolarsBuckarooWidget(\n", + " typed_df, \n", + " column_config_overrides={\n", + " 'str_col':\n", + " {'tooltip_config': { 'tooltip_type':'simple', 'val_column': 'int_col'}}})\n", + "bw3" + ] + }, + { + "cell_type": "markdown", + "id": "c5e17dd6-f658-48d1-b40c-a4ac354ea5d5", + "metadata": {}, + "source": [ + "# color_map_config\n", + "\n", + "Color_map_config controls coloring of columns. \n", + "* `color_map` uses the bins from histogram to show a values place in the distribution. wit the `val_column` parameter, you can color one column based on another.\n", + "* `color_when_not_null` hilights a cell when another row is not null. This is meant for error highlighting, the other column can be hidden\n", + "* `color_from_column` bases the color of a cell based on the RGB value written to another column. It is the most generic coloring option" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a75b18b-c61d-45d7-b0e1-295ad869a17c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bw3 = PolarsBuckarooWidget(\n", + " typed_df, \n", + " column_config_overrides={\n", + " 'float_col': {'color_map_config': {\n", + " 'color_rule': 'color_map',\n", + " 'map_name': 'BLUE_TO_YELLOW',\n", + " }}})\n", + "bw3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a2a125c-75c7-42ae-a87f-6a47bd41068c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bw3 = PolarsBuckarooWidget(\n", + " typed_df, \n", + " column_config_overrides={\n", + " 'int_col': {'color_map_config': {\n", + " 'color_rule': 'color_map',\n", + " 'map_name': 'DIVERGING_RED_WHITE_BLUE',\n", + " 'val_column': 'float_col'\n", + " }}})\n", + "bw3" + ] + }, + { + "cell_type": "markdown", + "id": "0ca07426-086c-4041-bf08-07c7447c8eb5", + "metadata": {}, + "source": [ + "# Hiding a column\n", + "\n", + "You can hide a column with `merge_rule:'hidden'`. This removes that column from the column_config array.\n", + "\n", + "Column hiding can be used to keep data in a dataframe (sent to the table widget) for use as a tooltip, or color, but preventing display which would distract the user\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "924c506c-123c-43ed-80f8-e239014f7e75", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bw_ = PolarsBuckarooWidget(\n", + " typed_df, \n", + " column_config_overrides={\n", + " 'int_col': {'merge_rule': 'hidden'}})\n", + "bw_" + ] + }, + { + "cell_type": "markdown", + "id": "621d5306-ba11-487b-bb5b-3841c412bf3a", + "metadata": {}, + "source": [ + "# Pinned rows\n", + "Pinned rows are visible in each view. They read data from the summary data that is assembled from the [PluggableAnalysisFramework](https://buckaroo-data.readthedocs.io/en/latest/articles/pluggable.html).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42da3b2a-a3bf-4c89-be15-0227fc9b916a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bw = PolarsBuckarooWidget(\n", + " typed_df, \n", + " pinned_rows=[\n", + " {'primary_key_val': 'dtype', 'displayer_args': {'displayer': 'obj' } },\n", + " {'primary_key_val': 'histogram', 'displayer_args': {'displayer': 'histogram' }}, \n", + " ])\n", + "bw" + ] + }, + { + "cell_type": "markdown", + "id": "05ecd1e4-1bde-48ce-ac51-bf53f7bb91c4", + "metadata": {}, + "source": [ + "# Packaging and reusing styling configurations with the `StylingAnalysis` class\n", + "Up to this point we have been hardcoding config overrides. You can package sets of styling configuration with the `StylingAnalysis` class. These configs can then be toggled in the UI.\n", + "\n", + "If you just want to return a fixed `DFViewerConfig` override the `style_columns` method. Most likely though, you will want to overide the singular `style_column` method that gets `SingleColumnMetadata` and returns a `ColumnConfig`. \n", + "The `StylingAnalysis` class is used to control the display of a column based on the column metadata. \n", + "\n", + "return {'col_name':str(col), 'displayer_args': {'displayer': 'obj'}}\n", + "\n", + "\n", + "This lets you customize based on metadata collected about a column. This works with the [PluggableAnalysisFramework](https://buckaroo-data.readthedocs.io/en/latest/articles/pluggable.html), you can specify required fields that are necessary. Adding requirements like this garuntees that errors are spotted early.\n", + "\n", + "StylingAnalysis works for both Polars and Pandas because it only receives a dictionary with simple python values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c03b5bc4-0025-4b55-9e7c-cc1a69508688", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "class SimpleStylingAnalysis(StylingAnalysis):\n", + " pinned_rows = [{'primary_key_val': 'dtype', 'displayer_args': {'displayer': 'obj'}}]\n", + "\n", + " #typing is still be worked out\n", + " #def style_column(col:str, column_metadata: SingleColumnMetadata) -> ColumnConfig:\n", + " @classmethod\n", + " def style_column(kls, col, column_metadata):\n", + " return {'col_name':str(col), 'displayer_args': {'displayer': 'obj'}}\n", + "\n", + " \n", + " #what is the key for this in the df_display_args_dictionary\n", + " df_display_name = \"MyStyles\"\n", + "def obj_(pkey):\n", + " return {'primary_key_val': pkey, 'displayer_args': { 'displayer': 'obj' } }\n", + "def float_(pkey, digits=3):\n", + " return {'primary_key_val': pkey, \n", + " 'displayer_args': { 'displayer': 'float', 'min_fraction_digits':digits, 'max_fraction_digits':digits}}" + ] + }, + { + "cell_type": "markdown", + "id": "a60bf7a8-4d5d-4089-8157-dafbd5a689ef", + "metadata": {}, + "source": [ + "## Toggling between styles\n", + "In the following example, you can cycle between the two configs by clicking on \"main\". Eventually I will add a Select (dropdown) box for this. I personally prefer click to cycle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8b25177-de65-4f5f-838f-152e1b621f5c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#The following analysis only\n", + "class SummaryStatsAnalysis(StylingAnalysis):\n", + " requires_summary = ['dtype', 'min', 'mode', 'mean', 'max', 'unique_count', 'distinct_count', 'empty_count']\n", + " pinned_rows = [obj_('dtype'), float_('min'), \n", + " #float_('mode'), float_('mean'), \n", + " float_('max'), float_('unique_count', 0),\n", + " float_('distinct_count', 0), float_('empty_count', 0)]\n", + " df_display_name = \"summary\"\n", + " data_key = \"empty\"\n", + " summary_stats_key= 'all_stats'\n", + "\n", + "sbw = PolarsBuckarooWidget(typed_df, debug=True)\n", + "sbw.add_analysis(SummaryStatsAnalysis)\n", + "\n", + "sbw" + ] + }, + { + "cell_type": "markdown", + "id": "1b0b5aa9-e820-49bd-a242-d8cf68441191", + "metadata": {}, + "source": [ + "## overriding styling from post_processing\n", + "\n", + "`PostProcessing` returns a tuple of Dataframe, extra column metadata.\n", + "\n", + "The default base styling class which all examples here extend, handles the key of `column_config_override` speically.\n", + "\n", + "This lets you build a specialized dataframe along with specific styling rules. Auto_cleaning and regular polars/pandas analysis can use the same facility. It is not recommended for regular analysis.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df64d5b2-e408-48ff-978f-8790c46dff21", + "metadata": {}, + "outputs": [], + "source": [ + "class ColumnConfigOverride(ColAnalysis):\n", + " @classmethod\n", + " def post_process_df(kls, df):\n", + " return [df, {\n", + " 'int_col':{\n", + " 'column_config_override': {'color_map_config': {\n", + " 'color_rule': 'color_map',\n", + " 'map_name': 'BLUE_TO_YELLOW',\n", + " }}}}]\n", + " post_processing_method = \"override\"\n", + "bw = PolarsBuckarooWidget(typed_df)\n", + "bw.add_analysis(ColumnConfigOverride)\n", + "bw " + ] + }, + { + "cell_type": "markdown", + "id": "a2618a7e-b8d9-44ca-b598-07428e654668", + "metadata": {}, + "source": [ + "# Buckaroo internals related to styling\n", + "this can help debug what is going on with styling" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "323a5a9d-933b-4bad-856d-17162a22913a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#you can view the main display_args with the following statement, this lets you check what is actually being sent to the frontend\n", + "sbw.df_display_args['main']['df_viewer_config']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8ee357c-ba69-49b1-a8a9-bc31cb8cde47", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# it's annoying to type out all of those pinned rows, lets make some convienence functions\n", + "def obj_(pkey):\n", + " return {'primary_key_val': pkey, 'displayer_args': { 'displayer': 'obj' } }\n", + "\n", + "def float_(pkey, digits=3):\n", + " return {'primary_key_val': pkey, \n", + " 'displayer_args': { 'displayer': 'float', 'min_fraction_digits':digits, 'max_fraction_digits':digits}}\n", + "\n", + "class SummaryStatsAnalysis1(SimpleStylingAnalysis):\n", + " pinned_rows = [\n", + " { 'primary_key_val': 'dtype', 'displayer_args': { 'displayer': 'obj' } },\n", + " { 'primary_key_val': 'histogram', 'displayer_args': { 'displayer': 'histogram' }}, \n", + " ]\n", + " df_display_name = \"summary1\"\n", + " data_key = \"empty\"\n", + " summary_stats_key= 'all_stats'\n", + "class SummaryStatsAnalysis(SimpleStylingAnalysis):\n", + " pinned_rows = [\n", + " obj_('dtype'),\n", + " float_('min'),\n", + " float_('mean'),\n", + " float_('max'),\n", + " ]\n", + " df_display_name = \"summary\"\n", + " data_key = \"empty\"\n", + " summary_stats_key= 'all_stats'\n", + "base_a_klasses = PolarsBuckarooWidget.analysis_klasses.copy()\n", + "base_a_klasses.extend([SummaryStatsAnalysis1, SummaryStatsAnalysis])\n", + "class SummaryBuckarooWidget(PolarsBuckarooWidget):\n", + " analysis_klasses = base_a_klasses\n", + "sbw = SummaryBuckarooWidget(typed_df)\n", + "#also lets do some hacking so that we start with the summary stats view\n", + "bstate = sbw.buckaroo_state.copy()\n", + "bstate['df_display'] = 'summary1'\n", + "sbw.buckaroo_state= bstate\n", + "sbw" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29aa8f47-7cd9-43c5-99e5-84ffeb39e188", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "class SummaryStatsAnalysis(SimpleStylingAnalysis):\n", + " pinned_rows = [\n", + " obj_('dtype'),\n", + " float_('min'),\n", + " #float_('median'),\n", + " float_('mean'),\n", + " float_('max'),\n", + " float_('unique_count', 0),\n", + " float_('distinct_count', 0),\n", + " float_('empty_count', 0)\n", + " ]\n", + " df_display_name = \"summary\"\n", + " data_key = \"empty\"\n", + " summary_stats_key= 'all_stats'\n", + "base_a_klasses = PolarsBuckarooWidget.analysis_klasses.copy()\n", + "base_a_klasses.append(SummaryStatsAnalysis)\n", + "class SummaryBuckarooWidget(PolarsBuckarooWidget):\n", + " analysis_klasses = base_a_klasses\n", + "sbw = SummaryBuckarooWidget(typed_df)\n", + "#also lets do some hacking so that we start with the summary stats view\n", + "bstate = sbw.buckaroo_state.copy()\n", + "bstate['df_display'] = 'summary'\n", + "sbw.buckaroo_state= bstate\n", + "sbw" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "216936c9-8863-47af-bbcd-68eab766e91d", + "metadata": {}, + "outputs": [], + "source": [ + "class AdaptiveStyling(StylingAnalysis):\n", + " requires_summary = [\"histogram\", \"is_numeric\", \"dtype\", \"is_integer\"]\n", + " pinned_rows = [\n", + " obj_('dtype'),\n", + " {'primary_key_val': 'histogram', 'displayer_args': { 'displayer': 'histogram' }}]\n", + "\n", + " @classmethod\n", + " def style_columns(kls, col, sd):\n", + " digits = 3\n", + " if sd['is_integer']:\n", + " disp = {'displayer': 'float', 'min_fraction_digits':0, 'max_fraction_digits':0}\n", + " elif sd['is_numeric']:\n", + " disp = {'displayer': 'float', 'min_fraction_digits':digits, 'max_fraction_digits':digits}\n", + " else:\n", + " disp = {'displayer': 'obj'}\n", + " return {'col_name':col, 'displayer_args': disp }\n", + "base_a_klasses = PolarsBuckarooWidget.analysis_klasses.copy()\n", + "base_a_klasses.extend([AdaptiveStyling, ValueCountPostProcessing])\n", + "class ABuckarooWidget(PolarsBuckarooWidget):\n", + " analysis_klasses = base_a_klasses\n", + "acb = ABuckarooWidget(typed_df)\n", + "acb" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91a3d9a8-cbed-496e-95d1-39068bc1c99d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/example-notebooks/testcases-fast.ipynb b/example-notebooks/testcases-fast.ipynb index 8c6ee8ddd..6af16ec89 100644 --- a/example-notebooks/testcases-fast.ipynb +++ b/example-notebooks/testcases-fast.ipynb @@ -2,42 +2,106 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "51091834-6d31-4e0e-b13c-a7be0a02ddb4", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n", - "Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.\n" - ] - } - ], + "outputs": [], "source": [ "import pandas as pd\n", + "import polars as pl\n", "import numpy as np\n", "import json\n", - "from buckaroo.buckaroo_widget import BuckarooWidget, disable, enable\n", - "import matplotlib" + "from buckaroo.buckaroo_widget import BuckarooWidget as PandasBuckarooWidget\n", + "from buckaroo.polars_buckaroo import PolarsBuckarooWidget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "040f826c-8bfe-4c03-bd8b-c65986d2ac2f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", + "pl_df = pl.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "54790361-302e-4266-bc5e-47273997b8d2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%timeit PandasBuckarooWidget(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1da53d4a-1fc8-4705-acb5-d2b38d505c03", + "metadata": {}, + "outputs": [], + "source": [ + "%timeit PolarsBuckarooWidget(pl_df)" + ] + }, + { + "cell_type": "markdown", + "id": "4bc0a224-fcf7-4835-8efa-1714ef9f08b4", + "metadata": {}, + "source": [ + "# At first glance the performance is close\n", + "that looks like the performance is fairly close between polars and pandas\n", + "\n", + "I think I'm missing something" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91062062-940e-4448-8c71-46f060b9dac3", + "metadata": {}, + "outputs": [], + "source": [ + "from buckaroo.dataflow import Sampling\n", + "class FullSampling(Sampling):\n", + " pre_limit = False\n", + "class FullPandasBuckarooWidget(PandasBuckarooWidget):\n", + " sampling_klass=FullSampling\n", + "%timeit FullPandasBuckarooWidget(df)\n", + "bw = FullPandasBuckarooWidget(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb36ce16-9f52-4bf3-a119-e1c490c3622f", + "metadata": {}, + "outputs": [], + "source": [ + "bw = FullPandasBuckarooWidget(df)\n", + "len(bw.processed_df)\n" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, + "id": "ad7249a2-6960-4505-9ae5-b0173f251463", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, "id": "30063897-1b67-4507-a3b8-0d98ab0f4b9f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3962 566 7\n", - "39.5 ms ± 674 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "df = pd.read_parquet('banklist.parquet')\n", "print(len(df) * len(df.columns), len(df), len(df.columns))\n", @@ -46,19 +110,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "dd8b3a75-a615-402d-9c6c-fc57c2759fe4", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "83070 6390 13\n", - "54 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "df2 = pd.read_csv('death-by-suicide-hispanic.csv')\n", "print(len(df2) * len(df2.columns), len(df2), len(df2.columns))\n", @@ -67,19 +122,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "5e338ccf-5a61-457d-addd-bdfd8510aa86", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "168014 12001 14\n", - "62.5 ms ± 857 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "df10 = pd.read_csv('Machine_readable_file_bd_employ.csv')\n", "print(len(df10) * len(df10.columns), len(df10), len(df10.columns))\n", @@ -88,19 +134,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "dd5b1809-5d8d-4c26-b263-165592918b2a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "436005 48445 9\n", - "93 ms ± 209 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "df9 = pd.read_csv('scorecard.csv')\n", "print(len(df9) * len(df9.columns), len(df9), len(df9.columns))\n", @@ -109,19 +146,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "5159536e-bad0-46cd-ba99-77c17f42dacd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "147044529 5070501 29\n", - "104 ms ± 581 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "df6 = pd.read_parquet('1993-flights.gzip.parquet')\n", "print(len(df6) * len(df6.columns), len(df6), len(df6.columns))\n", @@ -130,19 +158,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "c223dcb4-a354-4f3a-b492-e6ae33c99188", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2000000 200000 10\n", - "124 ms ± 719 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "df8 = pd.read_csv('train_extended.csv')\n", "print(len(df8) * len(df8.columns), len(df8), len(df8.columns))\n", @@ -151,27 +170,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "c1c73c91-0343-417a-a45f-ef5f8c39e884", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/th/jfr8ccjx09g2j_18ty_t3xnh0000gn/T/ipykernel_11944/805401924.py:1: DtypeWarning: Columns (2) have mixed types. Specify dtype option on import or set low_memory=False.\n", - " df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2912624 43472 67\n", - "622 ms ± 9.39 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], + "outputs": [], "source": [ "df4 = pd.read_csv('WPP2022_Demographic_Indicators_Medium.csv')\n", "print(len(df4) * len(df4.columns), len(df4), len(df4.columns))\n", @@ -180,19 +182,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "97851149-49b4-41e2-a14f-ee9fbfcf7848", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4506000 300400 15\n", - "249 ms ± 7.34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], + "outputs": [], "source": [ "df5 = pd.read_parquet('2014-01-citibike-trip-data.parquet')\n", "print(len(df5) * len(df5.columns), len(df5), len(df5.columns))\n", @@ -201,19 +194,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "1bb274bb-27b0-4bb4-b296-7c246ced9ce5", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "22020075 1048575 21\n", - "395 ms ± 5.73 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], + "outputs": [], "source": [ "df3 = pd.read_parquet('Covid-data.gzip.parquet')\n", "print(len(df3) * len(df3.columns), len(df3), len(df3.columns))\n", @@ -222,18 +206,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "12553bd6-be53-4001-be9a-dfc939981d38", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.09 s ± 18.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" - ] - } - ], + "outputs": [], "source": [ "%timeit bw = BuckarooWidget(df6)" ] @@ -265,7 +241,14 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.3" + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } } }, "nbformat": 4, diff --git a/examples/App.tsx b/examples/App.tsx index 7a5a6c270..847cec4e5 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -17,6 +17,9 @@ const examples = { CommandViewerEx: {title: 'CommandViewer', file: 'CommandViewerEx'}, DFViewerEx: {title: 'DFViewer', file: 'DFViewerEx'}, DFViewerEx_string_index: {title: 'DFViewer string index', file: 'DFViewerEx_string_index'}, + DFViewerEx_large: {title: 'DFViewer large', file: 'DFViewerEx_large'}, + DFViewerEx_real_summary: {title: 'DFViewer summary', file: 'DFViewerEx_real_summary'}, + StatusBarEx: {title: 'StatusBar', file: 'StatusBarEx'}, HistogramEx: {title: 'Histogram', file: 'HistogramEx'} }; @@ -30,7 +33,7 @@ for (const ex of Object.keys(examples)) { } const LeftMenuItem = (props): JSX.Element => ( -

    paddy

    +

    {props.title} diff --git a/examples/ex/CommandViewerEx.tsx b/examples/ex/CommandViewerEx.tsx index e1b90bc72..bcb5675cc 100644 --- a/examples/ex/CommandViewerEx.tsx +++ b/examples/ex/CommandViewerEx.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { OperationViewer, } from '../../js/components/Operations'; -import {bakedOperations, bakedCommandConfig } from '../../js/components/staticData'; +import {bakedOperations, bakedCommandConfig } from '../../js/baked_data/staticData'; export default function Simple() { diff --git a/examples/ex/DFViewerEx.tsx b/examples/ex/DFViewerEx.tsx index c7185ab8a..586dbf444 100644 --- a/examples/ex/DFViewerEx.tsx +++ b/examples/ex/DFViewerEx.tsx @@ -1,9 +1,3 @@ -import {DFViewer} from '../../js/components/DFViewer'; -import {tableDf } from '../../js/components/staticData'; -import React, { useState} from 'react'; +import { DFViewerEx} from '../../js/components/DFViewerParts/DFViewer'; - -export default function Simple() { - const [activeCol, setActiveCol] = useState('tripduration'); - return ; -} +export default DFViewerEx; diff --git a/examples/ex/DFViewerEx_large.tsx b/examples/ex/DFViewerEx_large.tsx new file mode 100644 index 000000000..f1790a9b0 --- /dev/null +++ b/examples/ex/DFViewerEx_large.tsx @@ -0,0 +1,266 @@ +import {DFViewer} from '../../js/components/DFViewerParts/DFViewer'; +import _ from 'lodash'; + +//import { stringIndexDf } from '../../js/baked_data/staticData'; +import React, { useState} from 'react'; +import { DFData, DFViewerConfig } from '../../js/components/DFViewerParts/DFWhole'; + +const data = [ + { + "index": 0, + "a": 5, + "b": 2.8571428571 + }, + { + "index": 1, + "a": 28, + "b": 12.8571428571 + }, + +] + +const summary_stats_data =[ + { + "index": "dtype", + "a": "int64", + "b": "float64" + }, + { + "index": "is_numeric", + "a": true, + "b": true + }, + { + "index": "_type", + "a": "integer", + "b": "float" + }, + { + "index": "histogram", + "a": [ + { + "name": "1 - 1.0", + "tail": 1 + }, + { + "name": "2-7", + "population": 16 + }, + { + "name": "7-11", + "population": 11 + }, + { + "name": "11-16", + "population": 6 + }, + { + "name": "16-20", + "population": 11 + }, + { + "name": "20-25", + "population": 5 + }, + { + "name": "25-30", + "population": 14 + }, + { + "name": "30-34", + "population": 9 + }, + { + "name": "34-39", + "population": 9 + }, + { + "name": "39-43", + "population": 11 + }, + { + "name": "43-48", + "population": 10 + }, + { + "name": "49.0 - 49", + "tail": 1 + } + ], + "b": [ + { + "name": "1.4285714285714286 - 1.4285714285714286", + "tail": 1 + }, + { + "name": "3-7", + "population": 12 + }, + { + "name": "7-10", + "population": 16 + }, + { + "name": "10-14", + "population": 9 + }, + { + "name": "14-18", + "population": 9 + }, + { + "name": "18-21", + "population": 9 + }, + { + "name": "21-25", + "population": 12 + }, + { + "name": "25-29", + "population": 14 + }, + { + "name": "29-33", + "population": 6 + }, + { + "name": "33-36", + "population": 7 + }, + { + "name": "36-40", + "population": 6 + }, + { + "name": "41.42857142857143 - 41.42857142857143", + "tail": 1 + } + ] + } + ]; + + function genInt(len, min, max) { + const a = new Array(len); + return _.map(a, a => _.random(min, max)) + } + + function genString(items:number, minLen:number, maxLen:number) : string[] { + + const a = new Array(items); + const randStrings = _.map(a, () => { + const strLen = _.random(minLen, maxLen); + const b = new Array(strLen) + const randLenStr = _.map(b, () => { return String.fromCharCode(_.random(65, 90)) }).join('') + return randLenStr + }) + return randStrings + } + +const dictOfListsToListOfDicts = (a: Record) : Record[] => { + const firstKey = _.keys(a)[0]; + const data : Record[] = _.map(a[firstKey], (_val, idx):Record => { + const pairs: [string, any][] = _.map(a, (arr, key) => { + return [key, arr[idx]] + }) + const row:Record = _.fromPairs(pairs); + return row; + }) + return data +} + + export default function DFViewerExString() { + const [activeCol, setActiveCol] = useState('tripduration'); + const samples= 1_000; + const data = dictOfListsToListOfDicts({ + 'a':genInt(samples, 2, 30), + 'b':genInt(samples, 10, 8), + 'c':genString(samples, 3, 10), + 'd':genInt(samples, 100, 999), + 'e':genInt(samples, -30_000, 55_123_123), + 'f':genString(samples, 3, 70), + 'g':genInt(samples, -3, 55), + }) + const current: {'df':DFData, 'df_viewer_config':DFViewerConfig, 'summary_stats_data':DFData} = { + "df": data, + "df_viewer_config": { + "pinned_rows": [ + { + "primary_key_val": "dtype", + "displayer_args": { + "displayer": "obj" + } + }, + { + "primary_key_val": "histogram", + "displayer_args": { + "displayer": "histogram" + } + } + ], + "column_config": [ + { + "col_name": "index", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "a", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "b", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "c", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "d", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "e", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "f", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "g", + "displayer_args": { + "displayer": "obj" + } + }, + + + ] + }, + "summary_stats_data": summary_stats_data + } + +// const working = {'df':data, 'df_viewer_config': dfvConfig, 'summary_stats_data':summary_stats_data}; + + + + return ; + } + diff --git a/examples/ex/DFViewerEx_real_summary.tsx b/examples/ex/DFViewerEx_real_summary.tsx new file mode 100644 index 000000000..32692abd0 --- /dev/null +++ b/examples/ex/DFViewerEx_real_summary.tsx @@ -0,0 +1,20 @@ +import {DFViewer} from '../../js/components/DFViewerParts/DFViewer'; +//import { stringIndexDf } from '../../js/baked_data/staticData'; +import React, { useState} from 'react'; +//import { DFData, DFViewerConfig } from '../../js/components/DFViewerParts/DFWhole'; +import { realSummaryConfig, realSummaryTableData } from '../../js/baked_data/staticData'; + + + export default function DFViewerExString() { + const [activeCol, setActiveCol] = useState('tripduration'); + + const current = { + 'df':realSummaryTableData, 'df_viewer_config': realSummaryConfig, + 'summary_stats_data':realSummaryTableData }; + + return ; + } + diff --git a/examples/ex/DFViewerEx_string_index.tsx b/examples/ex/DFViewerEx_string_index.tsx index 323577054..e14cecf5b 100644 --- a/examples/ex/DFViewerEx_string_index.tsx +++ b/examples/ex/DFViewerEx_string_index.tsx @@ -1,9 +1,1006 @@ -import {DFViewer} from '../../js/components/DFViewer'; -import { stringIndexDf } from '../../js/components/staticData'; +import {DFViewer} from '../../js/components/DFViewerParts/DFViewer'; +//import { stringIndexDf } from '../../js/baked_data/staticData'; import React, { useState} from 'react'; +import { DFData, DFViewerConfig } from '../../js/components/DFViewerParts/DFWhole'; +const data = [ + { + "index": 0, + "a": 5, + "b": 2.8571428571 + }, + { + "index": 1, + "a": 28, + "b": 12.8571428571 + }, + { + "index": 2, + "a": 47, + "b": 2.8571428571 + }, + { + "index": 3, + "a": 4, + "b": 32.8571428571 + }, + { + "index": 4, + "a": 29, + "b": 30 + }, + { + "index": 5, + "a": 26, + "b": 38.5714285714 + }, + { + "index": 6, + "a": 29, + "b": 12.8571428571 + }, + { + "index": 7, + "a": 49, + "b": 18.5714285714 + }, + { + "index": 8, + "a": 22, + "b": 4.2857142857 + }, + { + "index": 9, + "a": 32, + "b": 35.7142857143 + }, + { + "index": 10, + "a": 19, + "b": 8.5714285714 + }, + { + "index": 11, + "a": 32, + "b": 27.1428571429 + }, + { + "index": 12, + "a": 44, + "b": 24.2857142857 + } +] -export default function Simple() { +const summary_stats_data =[ + { + "index": "dtype", + "a": "int64", + "b": "float64" + }, + { + "index": "is_numeric", + "a": true, + "b": true + }, + { + "index": "is_integer", + "a": true, + "b": false + }, + { + "index": "is_datetime", + "a": false, + "b": false + }, + { + "index": "is_bool", + "a": false, + "b": false + }, + { + "index": "is_float", + "a": false, + "b": true + }, + { + "index": "is_string", + "a": false, + "b": false + }, + { + "index": "memory_usage", + "a": 1732, + "b": 1732 + }, + { + "index": "length", + "a": 200, + "b": 200 + }, + { + "index": "nan_count", + "a": 0, + "b": 0 + }, + { + "index": "value_counts", + "a": [ + 7, + 7, + 7, + 7, + 7, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1 + ], + "b": [ + 12, + 11, + 10, + 10, + 10, + 10, + 9, + 9, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 6, + 6, + 5, + 5, + 5, + 4, + 4, + 3, + 3, + 3, + 3 + ] + }, + { + "index": "mode", + "a": 2, + "b": 7.1428571429 + }, + { + "index": "min", + "a": 1, + "b": 1.4285714286 + }, + { + "index": "max", + "a": 49, + "b": 41.4285714286 + }, + { + "index": "mean", + "a": 24.275, + "b": 19.4571428571 + }, + { + "index": "histogram_args", + "a": { + "meat_histogram": [ + [ + 29, + 20, + 11, + 20, + 10, + 26, + 16, + 17, + 20, + 18 + ], + [ + 2, + 6.6, + 11.2, + 15.8, + 20.4, + 25, + 29.6, + 34.2, + 38.8, + 43.4, + 48 + ] + ], + "normalized_populations": [ + 0.1550802139, + 0.1069518717, + 0.0588235294, + 0.1069518717, + 0.0534759358, + 0.1390374332, + 0.0855614973, + 0.0909090909, + 0.1069518717, + 0.0962566845 + ], + "low_tail": 1, + "high_tail": 49 + }, + "b": { + "meat_histogram": [ + [ + 22, + 30, + 17, + 17, + 16, + 22, + 26, + 11, + 13, + 12 + ], + [ + 2.8571428571, + 6.5714285714, + 10.2857142857, + 14, + 17.7142857143, + 21.4285714286, + 25.1428571429, + 28.8571428571, + 32.5714285714, + 36.2857142857, + 40 + ] + ], + "normalized_populations": [ + 0.1182795699, + 0.1612903226, + 0.0913978495, + 0.0913978495, + 0.0860215054, + 0.1182795699, + 0.1397849462, + 0.0591397849, + 0.0698924731, + 0.064516129 + ], + "low_tail": 1.4285714286, + "high_tail": 41.4285714286 + } + }, + { + "index": "_type", + "a": "integer", + "b": "float" + }, + { + "index": "type", + "a": "integer", + "b": "float" + }, + { + "index": "min_digits", + "a": 1, + "b": 1 + }, + { + "index": "max_digits", + "a": 2, + "b": 2 + }, + { + "index": "unique_count", + "a": 3, + "b": 0 + }, + { + "index": "empty_count", + "a": 0, + "b": 0 + }, + { + "index": "distinct_count", + "a": 49, + "b": 29 + }, + { + "index": "distinct_per", + "a": 0.245, + "b": 0.145 + }, + { + "index": "empty_per", + "a": 0, + "b": 0 + }, + { + "index": "unique_per", + "a": 0.015, + "b": 0 + }, + { + "index": "nan_per", + "a": 0, + "b": 0 + }, + { + "index": "histogram", + "a": [ + { + "name": "1 - 1.0", + "tail": 1 + }, + { + "name": "2-7", + "population": 16 + }, + { + "name": "7-11", + "population": 11 + }, + { + "name": "11-16", + "population": 6 + }, + { + "name": "16-20", + "population": 11 + }, + { + "name": "20-25", + "population": 5 + }, + { + "name": "25-30", + "population": 14 + }, + { + "name": "30-34", + "population": 9 + }, + { + "name": "34-39", + "population": 9 + }, + { + "name": "39-43", + "population": 11 + }, + { + "name": "43-48", + "population": 10 + }, + { + "name": "49.0 - 49", + "tail": 1 + } + ], + "b": [ + { + "name": "1.4285714285714286 - 1.4285714285714286", + "tail": 1 + }, + { + "name": "3-7", + "population": 12 + }, + { + "name": "7-10", + "population": 16 + }, + { + "name": "10-14", + "population": 9 + }, + { + "name": "14-18", + "population": 9 + }, + { + "name": "18-21", + "population": 9 + }, + { + "name": "21-25", + "population": 12 + }, + { + "name": "25-29", + "population": 14 + }, + { + "name": "29-33", + "population": 6 + }, + { + "name": "33-36", + "population": 7 + }, + { + "name": "36-40", + "population": 6 + }, + { + "name": "41.42857142857143 - 41.42857142857143", + "tail": 1 + } + ] + } + ]; + + export default function DFViewerExString() { const [activeCol, setActiveCol] = useState('tripduration'); - return ; + + const dfvConfig:DFViewerConfig = { + "pinned_rows": [ + { + "primary_key_val": "dtype", + "displayer_args": { + "displayer": "obj" + } + }, + { + "primary_key_val": "histogram", + "displayer_args": { + "displayer": "histogram" + } + } + ], + "column_config": [ + { + "col_name": "index", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "a", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "b", + "displayer_args": { + "displayer": "obj" + } + } + ] } + + // { + // "pinned_rows": [ + // { + // "primary_key_val": "dtype", + // "displayer_args": { + // "displayer": "obj" + // } + // }, + // { + // "primary_key_val": "histogram", + // "displayer_args": { + // "displayer": "histogram" + // } + // } + // ], + // "column_config": [ + // { + // "col_name": "index", + // "displayer_args": { + // "displayer": "obj" + // } + // }, + // { + // "col_name": "a", + // "displayer_args": { + // "displayer": "obj" + // } + // }, + // { + // "col_name": "b", + // "displayer_args": { + // "displayer": "obj" + // } + // } + // ] + // } + const current: {'df':DFData, 'df_viewer_config':DFViewerConfig, 'summary_stats_data':DFData} = { + "df": [], + "df_viewer_config": { + "pinned_rows": [ + { + "primary_key_val": "dtype", + "displayer_args": { + "displayer": "obj" + } + }, + { + "primary_key_val": "histogram", + "displayer_args": { + "displayer": "histogram" + } + } + ], + "column_config": [ + { + "col_name": "index", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "a", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "b", + "displayer_args": { + "displayer": "obj" + } + } + ] + }, + "summary_stats_data": [ + { + "index": "dtype", + "a": "int64", + "b": "float64" + }, + { + "index": "is_numeric", + "a": true, + "b": true + }, + { + "index": "is_integer", + "a": true, + "b": false + }, + { + "index": "is_datetime", + "a": false, + "b": false + }, + { + "index": "is_bool", + "a": false, + "b": false + }, + { + "index": "is_float", + "a": false, + "b": true + }, + { + "index": "is_string", + "a": false, + "b": false + }, + { + "index": "memory_usage", + "a": 1732, + "b": 1732 + }, + { + "index": "length", + "a": 200, + "b": 200 + }, + { + "index": "nan_count", + "a": 0, + "b": 0 + }, + { + "index": "value_counts", + "a": [ + 12, + 9, + 8, + 7, + 7, + 7, + 7, + 7, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1 + ], + "b": [ + 11, + 11, + 11, + 9, + 9, + 9, + 9, + 8, + 8, + 8, + 8, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 6, + 6, + 5, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 2 + ] + }, + { + "index": "mode", + "a": 6, + "b": 1.4285714286 + }, + { + "index": "min", + "a": 1, + "b": 1.4285714286 + }, + { + "index": "max", + "a": 49, + "b": 41.4285714286 + }, + { + "index": "mean", + "a": 23.375, + "b": 21.5285714286 + }, + { + "index": "histogram_args", + "a": { + "meat_histogram": [ + [ + 33, + 18, + 13, + 22, + 11, + 18, + 20, + 15, + 17, + 23 + ], + [ + 2, + 6.6, + 11.2, + 15.8, + 20.4, + 25, + 29.6, + 34.2, + 38.8, + 43.4, + 48 + ] + ], + "normalized_populations": [ + 0.1736842105, + 0.0947368421, + 0.0684210526, + 0.1157894737, + 0.0578947368, + 0.0947368421, + 0.1052631579, + 0.0789473684, + 0.0894736842, + 0.1210526316 + ], + "low_tail": 1, + "high_tail": 48.01 + }, + "b": { + "meat_histogram": [ + [ + 13, + 23, + 12, + 23, + 15, + 22, + 23, + 10, + 21, + 16 + ], + [ + 2.8571428571, + 6.5714285714, + 10.2857142857, + 14, + 17.7142857143, + 21.4285714286, + 25.1428571429, + 28.8571428571, + 32.5714285714, + 36.2857142857, + 40 + ] + ], + "normalized_populations": [ + 0.0730337079, + 0.1292134831, + 0.0674157303, + 0.1292134831, + 0.0842696629, + 0.1235955056, + 0.1292134831, + 0.0561797753, + 0.1179775281, + 0.0898876404 + ], + "low_tail": 1.4285714286, + "high_tail": 41.4285714286 + } + }, + { + "index": "_type", + "a": "integer", + "b": "float" + }, + { + "index": "type", + "a": "integer", + "b": "float" + }, + { + "index": "min_digits", + "a": 1, + "b": 1 + }, + { + "index": "max_digits", + "a": 2, + "b": 2 + }, + { + "index": "unique_count", + "a": 5, + "b": 0 + }, + { + "index": "empty_count", + "a": 0, + "b": 0 + }, + { + "index": "distinct_count", + "a": 49, + "b": 29 + }, + { + "index": "distinct_per", + "a": 0.245, + "b": 0.145 + }, + { + "index": "empty_per", + "a": 0, + "b": 0 + }, + { + "index": "unique_per", + "a": 0.025, + "b": 0 + }, + { + "index": "nan_per", + "a": 0, + "b": 0 + }, + { + "index": "histogram", + "a": [ + { + "name": "1 - 1.0", + "tail": 1 + }, + { + "name": "2-7", + "population": 17 + }, + { + "name": "7-11", + "population": 9 + }, + { + "name": "11-16", + "population": 7 + }, + { + "name": "16-20", + "population": 12 + }, + { + "name": "20-25", + "population": 6 + }, + { + "name": "25-30", + "population": 9 + }, + { + "name": "30-34", + "population": 11 + }, + { + "name": "34-39", + "population": 8 + }, + { + "name": "39-43", + "population": 9 + }, + { + "name": "43-48", + "population": 12 + }, + { + "name": "48.00999999999999 - 49", + "tail": 1 + } + ], + "b": [ + { + "name": "1.4285714285714286 - 1.4285714285714286", + "tail": 1 + }, + { + "name": "3-7", + "population": 7 + }, + { + "name": "7-10", + "population": 13 + }, + { + "name": "10-14", + "population": 7 + }, + { + "name": "14-18", + "population": 13 + }, + { + "name": "18-21", + "population": 8 + }, + { + "name": "21-25", + "population": 12 + }, + { + "name": "25-29", + "population": 13 + }, + { + "name": "29-33", + "population": 6 + }, + { + "name": "33-36", + "population": 12 + }, + { + "name": "36-40", + "population": 9 + }, + { + "name": "41.42857142857143 - 41.42857142857143", + "tail": 1 + } + ] + } + ] + } + + const working = {'df':data, 'df_viewer_config': dfvConfig, 'summary_stats_data':summary_stats_data}; + + return ; + } + diff --git a/examples/ex/HistogramEx.tsx b/examples/ex/HistogramEx.tsx index b65c747a2..76d094739 100644 --- a/examples/ex/HistogramEx.tsx +++ b/examples/ex/HistogramEx.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { HistogramCell} from '../../js/components/CustomHeader'; -import {histograms } from '../../js/components/staticData'; +import {histograms } from '../../js/baked_data/staticData'; +import { HistogramCell } from '../../js/components/DFViewerParts/HistogramCell'; @@ -10,56 +10,57 @@ export default function Simple() { categorical_histo_lt, all_unique, unique_na, unique_continuous, unique_continuous_scaled, unique_continuous_scaled_50, start_station_categorical} = histograms; + return
    Numeric - +
    Boolean with NA - +
    NA Only - +
    Simple Categorical - +
    Categorical unique NA - +
    Categorical_longtail - +
    Categorical All unique - +
    Categorical Unique with NA - +
    Numeric all Unique - +
    start station categorical - +
    Numeric 50% unique - +
    diff --git a/full_build.sh b/full_build.sh index 6ef79ea59..3f666b7c0 100755 --- a/full_build.sh +++ b/full_build.sh @@ -5,6 +5,6 @@ rm -rf dist python -m build . rm -f dist/index.js dist/index.js.LICENSE.txt twine check dist/* -python -m twine upload --repository testpypi dist/* +#python -m twine upload --repository testpypi dist/* #python -m twine upload --repository pypi dist/* #npm publish diff --git a/js/baked_data/colorMap.ts b/js/baked_data/colorMap.ts new file mode 100644 index 000000000..42ec1fd49 --- /dev/null +++ b/js/baked_data/colorMap.ts @@ -0,0 +1,83 @@ +//diverging +// +// Reversed from the colorcet default because that had Blue to the left +// colorcet.CET_D9[::-1] + +export const DIVERGING_RED_WHITE_BLUE = [ + '#e65036', '#e65138', '#e75339', '#e7553a', '#e8563c', '#e8583d', '#e9593f', + '#e95b40', '#e95c41', '#ea5e43', '#ea5f44', '#eb6046', '#eb6247', '#ec6349', + '#ec654a', '#ec664b', '#ed684d', '#ed694e', '#ee6a50', '#ee6c51', '#ee6d52', + '#ef6f54', '#ef7055', '#ef7157', '#f07358', '#f0745a', '#f1765b', '#f1775d', + '#f1785e', '#f27a5f', '#f27b61', '#f27c62', '#f37e64', '#f37f65', '#f38067', + '#f48268', '#f4836a', '#f4846b', '#f5866c', '#f5876e', '#f5886f', '#f58a71', + '#f68b72', '#f68c74', '#f68d75', '#f78f77', '#f79078', '#f7917a', '#f7937b', + '#f8947d', '#f8957e', '#f89780', '#f89881', '#f99983', '#f99a84', '#f99c86', + '#f99d87', '#f99e89', '#faa08a', '#faa18c', '#faa28d', '#faa38f', '#faa590', + '#fba692', '#fba793', '#fba995', '#fbaa96', '#fbab98', '#fbac99', '#fcae9b', + '#fcaf9c', '#fcb09e', '#fcb19f', '#fcb3a1', '#fcb4a2', '#fcb5a4', '#fcb7a5', + '#fdb8a7', '#fdb9a8', '#fdbaaa', '#fdbcac', '#fdbdad', '#fdbeaf', '#fdbfb0', + '#fdc1b2', '#fdc2b3', '#fdc3b5', '#fdc4b6', '#fdc6b8', '#fdc7ba', '#fdc8bb', + '#fdcabd', '#fdcbbe', '#fdccc0', '#fdcdc1', '#fdcfc3', '#fdd0c5', '#fdd1c6', + '#fdd2c8', '#fdd4c9', '#fdd5cb', '#fdd6cc', '#fdd7ce', '#fdd9d0', '#fddad1', + '#fddbd3', '#fddcd4', '#fdded6', '#fcdfd8', '#fce0d9', '#fce1db', '#fce3dc', + '#fce4de', '#fce5e0', '#fce7e1', '#fce8e3', '#fbe9e5', '#fbeae6', '#fbece8', + '#fbede9', '#fbeeeb', '#faefed', '#faf1ee', '#faf2f0', '#faf3f2', '#f9f4f3', + '#f9f5f5', '#f8f6f6', '#f7f6f7', '#f6f6f8', '#f5f5f9', '#f4f4f9', '#f3f3f9', + '#f1f2f9', '#f0f1f9', '#eff0f9', '#eeeffa', '#edeefa', '#ecedfa', '#eaecfa', + '#e9ebfa', '#e8eafa', '#e7e9fa', '#e6e8fa', '#e5e7fa', '#e3e6fa', '#e2e5fa', + '#e1e4fa', '#e0e3fa', '#dfe2fb', '#dde1fb', '#dce0fb', '#dbdffb', '#dadefb', + '#d9ddfb', '#d7dcfb', '#d6dbfb', '#d5dafb', '#d4d9fb', '#d3d8fb', '#d1d7fb', + '#d0d6fb', '#cfd5fb', '#ced4fb', '#cdd3fc', '#cbd2fc', '#cad1fc', '#c9d0fc', + '#c8cffc', '#c6cefc', '#c5cdfc', '#c4ccfc', '#c3cbfc', '#c1cafc', '#c0c9fc', + '#bfc8fc', '#bdc7fc', '#bcc7fc', '#bbc6fc', '#bac5fc', '#b8c4fc', '#b7c3fc', + '#b6c2fc', '#b4c1fd', '#b3c0fd', '#b2bffd', '#b0befd', '#afbdfd', '#aebcfd', + '#acbbfd', '#abbafd', '#aab9fd', '#a8b8fd', '#a7b7fd', '#a5b6fd', '#a4b5fd', + '#a3b4fd', '#a1b3fd', '#a0b2fd', '#9eb2fd', '#9db1fd', '#9bb0fd', '#9aaffd', + '#99aefd', '#97adfd', '#96acfd', '#94abfd', '#93aafd', '#91a9fd', '#90a8fd', + '#8ea7fd', '#8ca6fd', '#8ba5fe', '#89a4fe', '#88a4fe', '#86a3fe', '#84a2fe', + '#83a1fe', '#81a0fe', '#809ffe', '#7e9efe', '#7c9dfe', '#7a9cfe', '#799bfe', + '#779afe', '#759afe', '#7399fe', '#7198fe', '#7097fe', '#6e96fe', '#6c95fe', + '#6a94fe', '#6893fe', '#6692fe', '#6491fe', '#6291fe', '#5f90fe', '#5d8ffe', + '#5b8efe', '#598dfe', '#568cfe', '#548bfe', '#518afe', '#4f8afe', '#4c89fe', + '#4988fe', '#4787fe', '#4486fe', '#4085fe', '#3d84fe', '#3a83fe', '#3683fe', + '#3282fe', '#2e81fe', '#2980fe', '#247ffe',]; + +//colorcet.CET_CBD2 +export const BLUE_TO_YELLOW = [ + '#0488fc', '#1089fb', '#1789fb', '#1d89fa', '#228afa', '#268af9', '#2a8af9', + '#2e8af8', '#318bf7', '#348bf7', '#378bf6', '#3a8cf6', '#3c8cf5', '#3f8cf5', + '#418df4', '#438df4', '#458df3', '#488df2', '#4a8ef2', '#4c8ef1', '#4d8ef1', + '#4f8ff0', '#518ff0', '#538fef', '#5490ee', '#5690ee', '#5890ed', '#5991ed', + '#5b91ec', '#5c91ec', '#5e92eb', '#5f92ea', '#6192ea', '#6292e9', '#6393e9', + '#6593e8', '#6693e8', '#6794e7', '#6994e6', '#6a94e6', '#6b95e5', '#6c95e5', + '#6e95e4', '#6f96e4', '#7096e3', '#7196e3', '#7297e2', '#7397e1', '#7497e1', + '#7698e0', '#7798e0', '#7898df', '#7999df', '#7a99de', '#7b99dd', '#7c9add', + '#7d9adc', '#7e9adc', '#7f9bdb', '#809bdb', '#819bda', '#829cd9', '#839cd9', + '#849cd8', '#849dd8', '#859dd7', '#869dd7', '#879ed6', '#889ed5', '#899ed5', + '#8a9fd4', '#8b9fd4', '#8c9fd3', '#8ca0d3', '#8da0d2', '#8ea0d1', '#8fa1d1', + '#90a1d0', '#91a1d0', '#91a2cf', '#92a2ce', '#93a2ce', '#94a3cd', '#95a3cd', + '#95a3cc', '#96a4cc', '#97a4cb', '#98a4ca', '#98a5ca', '#99a5c9', '#9aa5c9', + '#9ba6c8', '#9ba6c8', '#9ca6c7', '#9da7c6', '#9ea7c6', '#9ea7c5', '#9fa8c5', + '#a0a8c4', '#a0a9c3', '#a1a9c3', '#a2a9c2', '#a2aac2', '#a3aac1', '#a4aac1', + '#a4abc0', '#a5abbf', '#a6abbf', '#a6acbe', '#a7acbe', '#a8acbd', '#a8adbc', + '#a9adbc', '#aaadbb', '#aaaebb', '#abaeba', '#acafb9', '#acafb9', '#adafb8', + '#adb0b8', '#aeb0b7', '#afb0b7', '#afb1b6', '#b0b1b5', '#b1b1b5', '#b1b2b4', + '#b2b2b4', '#b2b2b3', '#b3b3b2', '#b4b3b2', '#b4b3b1', '#b5b4b1', '#b6b4b0', + '#b7b4af', '#b7b5af', '#b8b5ae', '#b9b5ad', '#bab6ad', '#bab6ac', '#bbb6ac', + '#bcb7ab', '#bcb7aa', '#bdb7aa', '#beb8a9', '#beb8a8', '#bfb8a8', '#c0b9a7', + '#c0b9a7', '#c1b9a6', '#c2baa5', '#c2baa5', '#c3baa4', '#c4bba3', '#c4bba3', + '#c5bba2', '#c6bca2', '#c6bca1', '#c7bca0', '#c8bca0', '#c8bd9f', '#c9bd9e', + '#cabd9e', '#cabe9d', '#cbbe9c', '#ccbe9c', '#ccbf9b', '#cdbf9b', '#cdbf9a', + '#cec099', '#cfc099', '#cfc098', '#d0c197', '#d1c197', '#d1c196', '#d2c295', + '#d2c295', '#d3c294', '#d4c393', '#d4c393', '#d5c392', '#d5c491', '#d6c491', + '#d7c490', '#d7c58f', '#d8c58f', '#d8c58e', '#d9c68d', '#dac68d', '#dac68c', + '#dbc78b', '#dbc78b', '#dcc78a', '#dcc889', '#ddc889', '#dec888', '#dec987', + '#dfc987', '#dfc986', '#e0ca85', '#e0ca85', '#e1ca84', '#e2cb83', '#e2cb83', + '#e3cc82', '#e3cc81', '#e4cc80', '#e4cd80', '#e5cd7f', '#e6cd7e', '#e6ce7e', + '#e7ce7d', '#e7ce7c', '#e8cf7b', '#e8cf7b', '#e9cf7a', '#e9d079', '#ead078', + '#ead078', '#ebd177', '#ecd176', '#ecd176', '#edd275', '#edd274', '#eed273', + '#eed373', '#efd372', '#efd371', '#f0d470', '#f0d46f', '#f1d46f', '#f1d56e', + '#f2d56d', '#f2d56c', '#f3d66c', '#f3d66b', '#f4d66a', '#f5d769', '#f5d768', + '#f6d868', '#f6d867', '#f7d866', '#f7d965', '#f8d964', '#f8d963', '#f9da63', + '#f9da62', '#fada61', '#fadb60', '#fbdb5f', '#fbdb5e', '#fcdc5d', '#fcdc5d', + '#fddc5c', '#fddd5b', '#fedd5a', '#fedd59',]; diff --git a/js/components/staticData.ts b/js/baked_data/staticData.ts similarity index 50% rename from js/components/staticData.ts rename to js/baked_data/staticData.ts index 5afd04d87..9ec63da87 100644 --- a/js/components/staticData.ts +++ b/js/baked_data/staticData.ts @@ -1,6 +1,15 @@ -import { OperationDefaultArgs, Operation } from './OperationUtils'; -import { sym } from './utils'; -import { symDf, CommandConfigT, bakedArgSpecs } from './CommandUtils'; +import { OperationDefaultArgs, Operation } from '../components/OperationUtils'; +import { sym } from '../components/utils'; +import { + symDf, + CommandConfigT, + bakedArgSpecs, +} from '../components/CommandUtils'; +import { + DFData, + DFViewerConfig, + DFWhole, +} from '../components/DFViewerParts/DFWhole'; export const bakedOperationDefaults: OperationDefaultArgs = { dropcol: [sym('dropcol'), symDf, 'col'], @@ -19,87 +28,6 @@ export const bakedOperations: Operation[] = [ [sym('resample'), symDf, 'month', 'monthly', {}], ]; -export interface DFColumn { - name: string; - type: string; -} -export type DFDataRow = Record< - string, - string | number | boolean | any[] | Record | null ->; - -export type DFData = DFDataRow[]; - -export interface ColumnObjHint { - type: 'obj'; - histogram?: any[]; -} - -export interface ColumnDatetimeDefaultHint { - type: 'datetime'; - formatter: 'default'; - histogram?: any[]; -} - -export interface ColumnDatetimeFormatHint { - type: 'datetime'; - formatter: 'toLocaleString'; - locale: 'en-US' | 'en-GB' | 'en-CA' | 'fr-FR' | 'es-ES' | 'de-DE' | 'ja-JP'; - args: Intl.DateTimeFormatOptions; - histogram?: any[]; -} -export type ColumnDatetimeHint = - | ColumnDatetimeDefaultHint - | ColumnDatetimeFormatHint; - -export interface ColumnStringHint { - type: 'string'; - histogram?: any[]; -} - -export interface ColumnBooleanHint { - type: 'boolean'; - histogram?: any[]; -} - -export interface ColumnIntegertHint { - type: 'integer'; - min_digits: number; - max_digits: number; - histogram: any[]; -} - -export interface ColumnFloatHint { - type: 'float'; - histogram: any[]; -} - -export type ColumnHint = - | ColumnObjHint - | ColumnIntegertHint - | ColumnDatetimeHint - | ColumnFloatHint - | ColumnStringHint - | ColumnBooleanHint; - -export interface DFWhole { - schema: { - fields: DFColumn[]; - primaryKey: string[]; //['index'] - pandas_version: string; //'1.4.0', - }; - table_hints: Record; - data: DFData; -} - -export const EmptyDf: DFWhole = { - schema: { fields: [], primaryKey: [], pandas_version: '' }, - table_hints: {}, - data: [], -}; - -//print(sdf.to_json(orient='table', indent=2)) - export const histograms = { num_histo: [ { name: '-406 - -332', population: 1 }, @@ -207,26 +135,29 @@ export const histograms = { //export const tableDf2:DFWhole = { export const foo: DFWhole = { - schema: { - fields: [ - { name: 'index', type: 'integer' }, - { name: 'tripduration', type: 'integer' }, - { name: 'starttime', type: 'string' }, - { name: 'stoptime', type: 'string' }, - { name: 'start station id', type: 'integer' }, - { name: 'start station name', type: 'string' }, - { name: 'start station latitude', type: 'number' }, - { name: 'bikeid', type: 'integer' }, - { name: 'birth year', type: 'string' }, - { name: 'gender', type: 'integer' }, + dfviewer_config: { + column_config: [ + { col_name: 'index', displayer_args: { displayer: 'obj' } }, + + { col_name: 'tripduration', displayer_args: { displayer: 'obj' } }, + { col_name: 'starttime', displayer_args: { displayer: 'obj' } }, + { col_name: 'stoptime', displayer_args: { displayer: 'obj' } }, + { col_name: 'start station id', displayer_args: { displayer: 'obj' } }, + { col_name: 'start station name', displayer_args: { displayer: 'obj' } }, + { + col_name: 'start station lattitude', + displayer_args: { displayer: 'obj' }, + }, + { col_name: 'bikeid', displayer_args: { displayer: 'obj' } }, + { col_name: 'birth year', displayer_args: { displayer: 'obj' } }, + { col_name: 'gender', displayer_args: { displayer: 'obj' } }, ], - - primaryKey: ['index'], - pandas_version: '1.4.0', + pinned_rows: [], }, - table_hints: { - index: { type: 'obj' }, - tripduration: { histogram: histograms.num_histo, type: 'obj' }, + + // index: { type: 'obj' }, + // tripduration: { histogram: histograms.num_histo, type: 'obj' }, + /* starttime: { type: 'obj' }, stoptime: { type: 'obj' }, 'start station id': { type: 'obj' }, @@ -235,7 +166,7 @@ export const foo: DFWhole = { bikeid: { type: 'obj' }, 'birth year': { type: 'obj' }, gender: { type: 'obj' }, - }, + */ data: [ { index: 0, @@ -299,21 +230,77 @@ export const foo: DFWhole = { }, ], }; +export const stringIndexDf = foo; export const tableDf: DFWhole = { - schema: { - fields: [ - { name: 'index', type: 'integer' }, - { name: 'nanNumeric', type: 'int' }, - { name: 'nanObject', type: 'int' }, - { name: 'nanFloat', type: 'float' }, - { name: 'end station name', type: 'string' }, - { name: 'tripduration', type: 'integer' }, - { name: 'start station name', type: 'string' }, - { name: 'floatCol', type: 'float' }, + dfviewer_config: { + column_config: [ + { + col_name: 'index', + displayer_args: { displayer: 'integer', min_digits: 3, max_digits: 5 }, + }, + { + col_name: 'link_column', + displayer_args: { displayer: 'linkify' }, + }, + { + col_name: 'nanObject', + displayer_args: { displayer: 'integer', min_digits: 3, max_digits: 5 }, + color_map_config: { + color_rule: 'color_map', + //map_name: 'DIVERGING_RED_WHITE_BLUE', + map_name: 'BLUE_TO_YELLOW', + val_column: 'tripduration', + }, + }, + { + col_name: 'nanFloat', + displayer_args: { + displayer: 'float', + min_fraction_digits: 2, + max_fraction_digits: 8, + }, + tooltip_config: { tooltip_type: 'summary_series' }, + }, + { col_name: 'end station name', displayer_args: { displayer: 'obj' } }, + { + col_name: 'tripduration', + displayer_args: { displayer: 'integer', min_digits: 1, max_digits: 5 }, + color_map_config: { + color_rule: 'color_map', + map_name: 'BLUE_TO_YELLOW', + }, + }, + { + col_name: 'start station name', + displayer_args: { displayer: 'obj' }, + color_map_config: { + color_rule: 'color_not_null', + conditional_color: 'red', + exist_column: 'nanFloat', + }, + }, + { + col_name: 'floatCol', + displayer_args: { + displayer: 'float', + min_fraction_digits: 1, + max_fraction_digits: 3, + }, + }, + { + col_name: 'nanNumeric', + displayer_args: { displayer: 'integer', min_digits: 3, max_digits: 5 }, + tooltip_config: { + tooltip_type: 'simple', + val_column: 'start station name', + }, + }, + ], + pinned_rows: [ + { primary_key_val: 'dtype', displayer_args: { displayer: 'obj' } }, + // { primary_key_val: 'histogram', displayer_args: { displayer: 'histogram' }, }, ], - primaryKey: ['index'], - pandas_version: '1.4.0', }, data: [ { @@ -325,6 +312,7 @@ export const tableDf: DFWhole = { nanNumeric: null, nanObject: null, nanFloat: null, + link_column: 'https://buckaroo.dev', }, { index: 1, @@ -335,6 +323,7 @@ export const tableDf: DFWhole = { nanNumeric: null, nanObject: null, nanFloat: null, + link_column: 'https://pola.rs/', }, { index: 2, @@ -344,7 +333,7 @@ export const tableDf: DFWhole = { floatCol: '9.999', nanNumeric: null, nanObject: null, - nanFloat: null, + nanFloat: 10, }, { index: 3, @@ -365,134 +354,133 @@ export const tableDf: DFWhole = { floatCol: '10.99', nanNumeric: null, nanObject: null, - nanFloat: null, + nanFloat: 3, }, ], - table_hints: { - 'end station name': { - histogram: histograms.categorical_histo_lt, - type: 'obj', - }, - - tripduration: { - type: 'integer', - min_digits: 3, - max_digits: 4, - histogram: histograms.num_histo, - }, - 'start station name': { - histogram: histograms.bool_histo, - type: 'string', - }, - floatCol: { - type: 'float', +}; - histogram: [ - { name: 521, cat_pop: 0.0103 }, - { name: 358, cat_pop: 0.0096 }, - { name: 519, cat_pop: 0.009 }, - { name: 497, cat_pop: 0.0087 }, - { name: 293, cat_pop: 0.0082 }, - { name: 285, cat_pop: 0.0081 }, - { name: 435, cat_pop: 0.008 }, - { name: 'unique', cat_pop: 0.0001 }, - { name: 'long_tail', cat_pop: 0.938 }, - { name: 'NA', cat_pop: 0.0 }, - ], - }, - nanNumeric: { - type: 'integer', - min_digits: 1, - max_digits: 3, - histogram: histograms.num_histo, - }, - nanFloat: { - type: 'float', - histogram: histograms.num_histo, - }, - nanObject: { - type: 'obj', +export const dfviewer_config_no_pinned: DFViewerConfig = { + column_config: tableDf.dfviewer_config.column_config, + pinned_rows: [ + { primary_key_val: 'dtype', displayer_args: { displayer: 'obj' } }, + { + primary_key_val: 'histogram', + displayer_args: { displayer: 'histogram' }, }, - }, + ], }; - -export const stringIndexDf: DFWhole = { - schema: { - fields: [ - { name: 'index', type: 'integer' }, - { name: 'datetime_col', type: 'datetime' }, - { name: 'datetime_col2', type: 'datetime' }, - { name: 'a', type: 'integer' }, - { name: 'b', type: 'boolean' }, - { name: 'list_col', type: 'obj' }, - { name: 'strings', type: 'boolean' }, - { name: 'dict_col', type: 'obj' }, +const tripDurationBins = [0, 300, 500, 1000, 1500]; + +export const summaryDfForTableDf: DFData = [ + { + index: 'histogram', + 'end station name': histograms.categorical_histo_lt, + tripduration: histograms.num_histo, + 'start station name': histograms.bool_histo, + nanNumeric: histograms.num_histo, + nanFloat: histograms.num_histo, + nanObject: histograms.num_histo, + floatCol: [ + { name: 521, cat_pop: 0.0103 }, + { name: 358, cat_pop: 0.0096 }, + { name: 519, cat_pop: 0.009 }, + { name: 497, cat_pop: 0.0087 }, + { name: 293, cat_pop: 0.0082 }, + { name: 285, cat_pop: 0.0081 }, + { name: 435, cat_pop: 0.008 }, + { name: 'unique', cat_pop: 0.0001 }, + { name: 'long_tail', cat_pop: 0.938 }, + { name: 'NA', cat_pop: 0.0 }, ], - primaryKey: ['index'], - pandas_version: '1.4.0', }, - data: [ + { + index: 'histogram_bins', + tripduration: tripDurationBins, + nanObject: tripDurationBins, + }, + { + index: 'dtype', + 'end station name': 'String6666', + tripduration: 'object', + 'start station name': 'object', + nanNumeric: 'float64', + nanFloat: 'flot64', + nanObject: 'object', + floatCol: 'float', + }, +]; + +export const realSummaryTableData: DFData = [ + { index: 'dtype', int_col: 'int64', float_col: 'float64', str_col: 'object' }, + { index: 'min', int_col: 1, float_col: 1.4285714286 }, + { index: 'max', int_col: 49, float_col: 41.4285714286, str_col: null }, + { index: 'mean', int_col: 24.75, float_col: 22.4714285714 }, + { index: 'unique_count', int_col: 4, float_col: 0, str_col: 0 }, + { index: 'empty_count', int_col: 0, float_col: 0, str_col: 0 }, + { index: 'distinct_count', int_col: 49, float_col: 29, str_col: 1 }, +]; + +export const realSummaryConfig: DFViewerConfig = { + pinned_rows: [ + { primary_key_val: 'dtype', displayer_args: { displayer: 'obj' } }, { - index: 0, - a: 1, - b: true, - strings: 'a', - list_col: ['a', 'b'], - dict_col: { a: 10, b: 20 }, - datetime_col: '2001-01-01T00:00:00.000', - datetime_col2: '2001-01-01T00:00:00.000', + primary_key_val: 'min', + displayer_args: { + displayer: 'float', + min_fraction_digits: 3, + max_fraction_digits: 3, + }, }, { - index: 1, - a: 2, - b: false, - strings: '', - list_col: [1, 2], - dict_col: { b: 20, c: 30 }, - datetime_col: '2001-05-03T00:01:00.000', - datetime_col2: '2001-05-03T00:01:00.000', + primary_key_val: 'mean', + displayer_args: { + displayer: 'float', + min_fraction_digits: 3, + max_fraction_digits: 3, + }, }, { - index: 2, - a: 3, - b: false, - strings: ' ', - list_col: [true, false], - dict_col: { a: 'foo' }, - datetime_col: '2001-05-03T15:44:55.000', - datetime_col2: '2001-05-03T15:44:55.000', + primary_key_val: 'max', + displayer_args: { + displayer: 'float', + min_fraction_digits: 3, + max_fraction_digits: 3, + }, }, - ], - table_hints: { - a: { - type: 'integer', - min_digits: 1, - max_digits: 1, - - histogram: [ - { name: 1, cat_pop: 50.0 }, - { name: 2, cat_pop: 50.0 }, - { name: 'longtail', unique: 100.0 }, - ], + { + primary_key_val: 'unique_count', + displayer_args: { + displayer: 'float', + min_fraction_digits: 0, + max_fraction_digits: 0, + }, }, - b: { - type: 'integer', - min_digits: 1, - max_digits: 1, - histogram: [ - { name: true, cat_pop: 50.0 }, - { name: false, cat_pop: 50.0 }, - { name: 'longtail', unique: 100.0 }, - ], + { + primary_key_val: 'distinct_count', + displayer_args: { + displayer: 'float', + min_fraction_digits: 0, + max_fraction_digits: 0, + }, }, - strings: { type: 'string', histogram: [] }, - datetime_col: { type: 'datetime', formatter: 'default', histogram: [] }, - datetime_col2: { - type: 'datetime', - formatter: 'toLocaleString', - args: { year: 'numeric', month: 'numeric', day: 'numeric' }, - locale: 'en-CA', - histogram: [], + { + primary_key_val: 'empty_count', + displayer_args: { + displayer: 'float', + min_fraction_digits: 0, + max_fraction_digits: 0, + }, }, - }, + ], + column_config: [ + // {'col_name': 'index', 'displayer_args': {'displayer': 'string'}}, + { + col_name: 'index', + displayer_args: { displayer: 'string' }, + ag_grid_specs: { minWidth: 150, pinned: 'left' }, + }, + { col_name: 'int_col', displayer_args: { displayer: 'obj' } }, + { col_name: 'float_col', displayer_args: { displayer: 'obj' } }, + { col_name: 'str_col', displayer_args: { displayer: 'obj' } }, + ], }; diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx index 0b77e6590..63fbd9c0a 100644 --- a/js/components/ColumnsEditor.tsx +++ b/js/components/ColumnsEditor.tsx @@ -1,11 +1,12 @@ import React, { useState } from 'react'; -import { DFWhole, EmptyDf, bakedOperations } from './staticData'; +import { bakedOperations } from '../baked_data/staticData'; +import { DFViewerConfig, EmptyDf } from './DFViewerParts/DFWhole'; import { OperationViewer } from './Operations'; import { Operation } from './OperationUtils'; import { CommandConfigT } from './CommandUtils'; //import {bakedCommandConfig} from './bakedOperationDefaults'; import { DependentTabs, OperationResult } from './DependentTabs'; -import { tableDf, bakedCommandConfig } from './staticData'; +import { tableDf, bakedCommandConfig } from '../baked_data/staticData'; export type OperationSetter = (ops: Operation[]) => void; export interface WidgetConfig { @@ -13,7 +14,7 @@ export interface WidgetConfig { } export function ColumnsEditor({ - df, + df_viewer_config, activeColumn, operations, setOperations, @@ -21,7 +22,7 @@ export function ColumnsEditor({ commandConfig, widgetConfig, }: { - df: DFWhole; + df_viewer_config: DFViewerConfig; activeColumn: string; operations: Operation[]; setOperations: OperationSetter; @@ -29,7 +30,9 @@ export function ColumnsEditor({ commandConfig: CommandConfigT; widgetConfig: WidgetConfig; }) { - const allColumns = df.schema.fields.map((field) => field.name); + const allColumns = df_viewer_config.column_config.map( + (field) => field.col_name + ); return (
    {widgetConfig.showCommands ? ( @@ -63,7 +66,7 @@ export function ColumnsEditorEx() { }; return ( ; + df_meta: DFMeta; + df_data_dict: Record; + df_display_args: Record; operations: Operation[]; on_operations: (ops: Operation[]) => void; operation_results: OperationResult; commandConfig: CommandConfigT; - dfConfig: DfConfig; - on_dfConfig: unknown; - summary_df_json: DFWhole; + buckaroo_state: BuckarooState; + on_buckaroo_state: React.Dispatch>; + buckaroo_options: BuckarooOptions; }) { const [activeCol, setActiveCol] = useState('stoptime'); - const widgetConfig: WidgetConfig = { showCommands: dfConfig.showCommands }; - const localDfConfig = { - ...dfConfig, - rowsShown: json_serialized_df.data.length || 0, + const widgetConfig: WidgetConfig = { + showCommands: buckaroo_state.show_commands ? true : false, }; + + const cDisp = df_display_args[buckaroo_state.df_display]; + if (cDisp === undefined) { + // console.log("cDisp undefined", buckaroo_state.df_display, buckaroo_options.df_display) + } else { + // console.log("cDisp", cDisp); + } + const dfData = df_data_dict[cDisp.data_key]; + //console.log("dfData", dfData); + const summaryStatsData = df_data_dict[cDisp.summary_stats_key]; + return (
    - +
    {widgetConfig.showCommands ? ( ({ - totalRows: 1309, - columns: 30, - rowsShown: 500, - sampleSize: 10_000, - sampled: true, - summaryStats: false, - showCommands: true, - //reorderdColumns: false, + const dfm: DFMeta = { + columns: 5, + rows_shown: 20, + total_rows: 877, + }; + + const [bState, setBState] = useState({ + auto_clean: '', + sampled: false, + show_commands: false, + df_display: 'main', + post_processing: '', + search_string: '', }); + + const bOptions: BuckarooOptions = { + auto_clean: ['', 'aggressive', 'conservative'], + df_display: ['main', 'realSummary', 'no_pinned'], + sampled: ['random'], + post_processing: ['', 'foo', 'bar'], + show_commands: ['on'], + // 'summary_stats' : ['full', 'all', 'typing_stats'] + }; + const [operations, setOperations] = useState(bakedOperations); + + const bakedDfDisplay: Record = { + main: { + data_key: 'main', + df_viewer_config: tableDf.dfviewer_config, + summary_stats_key: 'all', + }, + realSummary: { + data_key: 'empty', + df_viewer_config: realSummaryConfig, + summary_stats_key: 'real_summary', + }, + + no_pinned: { + data_key: 'main', + df_viewer_config: dfviewer_config_no_pinned, + summary_stats_key: 'all', + }, + }; + + const df_data_dict = { + main: tableDf.data, + all: summaryDfForTableDf, + real_summary: realSummaryTableData, + empty: [{ index: 'distinct_count' }], + }; return ( ); } diff --git a/js/components/DFViewer.tsx b/js/components/DFViewer.tsx deleted file mode 100644 index 36872581e..000000000 --- a/js/components/DFViewer.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import React, { useRef, CSSProperties } from 'react'; -import _ from 'lodash'; -import { DFWhole, EmptyDf } from './staticData'; - -import { updateAtMatch, dfToAgrid } from './gridUtils'; -import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component -import { GridOptions } from 'ag-grid-community'; - -import { HistogramCell } from './CustomHeader'; - -export type setColumFunc = (newCol: string) => void; - -export function DFViewer( - { - df, - style, - activeCol, - setActiveCol, - }: { - df: DFWhole; - style?: CSSProperties; - activeCol?: string; - setActiveCol?: setColumFunc; - } = { - df: EmptyDf, - style: { height: '300px' }, - setActiveCol: () => null, - } -) { - const [agColsPure, agData] = dfToAgrid(df); - // console.log('dfviewer agData', agData); - - const styledColumns = updateAtMatch( - _.clone(agColsPure), - activeCol || '___never', - { - cellStyle: { background: 'var(--ag-range-selection-background-color-3)' }, - }, - { cellStyle: {} } - ); - - const gridOptions: GridOptions = { - rowSelection: 'single', - onRowClicked: (event) => console.log('A row was clicked'), - defaultColDef: { - sortable: true, - type: 'rightAligned', - cellRendererSelector: (params) => { - if (params.node.rowPinned) { - return { - component: HistogramCell, - params: { - style: { fontStyle: 'italic' }, - }, - }; - } else { - // rows that are not pinned don't use any cell renderer - return undefined; - } - }, - }, - - onCellClicked: (event) => { - const colName = event.column.getColId(); - if (setActiveCol === undefined || colName === undefined) { - return; - } else { - setActiveCol(colName); - } - }, - }; - const gridRef = useRef>(null); - - const makeCondtionalAutosize = (count: number, delay: number) => { - /* - this code is buggy and I'm not confident in it. I'm very - surprised that automatically autosizing AG-grid requires custom - functions to be written vs just a flag. - */ - - let counter = count; - //let timer: NodeJS.Timeout; - let timer: number; - let colWidthHasBeenSet = false; - let currentColWidth = -10; - if (gridRef === undefined || gridRef.current === null) { - currentColWidth = 200; - } else { - try { - const dc = gridRef?.current?.columnApi.getAllDisplayedColumns(); - - if (dc.length !== 0) { - currentColWidth = dc[0].getActualWidth(); - } else { - currentColWidth = 200; - } - } catch (e) { - console.log('88, gridref not defined yet', e); - } - } - - const conditionallyAutosize = () => { - if (gridRef !== undefined) { - if (gridRef.current !== undefined && gridRef.current !== null) { - if (gridRef.current.columnApi !== undefined) { - gridRef.current.columnApi.autoSizeAllColumns(); - const dc = gridRef.current.columnApi.getAllDisplayedColumns(); - // console.log("bodyWidth", cm.bodyWidth) - // console.log("cm", cm) - - if (dc.length !== 0) { - const aw = dc[0].getActualWidth(); // this eventually changes after the resize - //console.log("dc", aw); - if (colWidthHasBeenSet === false) { - currentColWidth = aw; - colWidthHasBeenSet = true; - } else { - currentColWidth = aw; - } - } - gridRef.current.forceUpdate(); - } - } - } - // console.log("counter", counter, "colWidthHasBeenSet", colWidthHasBeenSet, originalColWidth, currentColWidth); - if (counter > 0 && colWidthHasBeenSet === false) { - counter -= 1; - // console.log("no gridRef or gridRef.current, setting delay", counter) - timer = window.setTimeout(conditionallyAutosize, delay); - return; - } else if (counter > 0 && currentColWidth === 200) { - counter -= 1; - - // console.log( - // "new colwidth not recognized yet", - // counter, originalColWidth, gridRef.current!.columnApi!.columnModel!.displayedColumns[0].actualWidth) - timer = window.setTimeout(conditionallyAutosize, delay); - return; - } - }; - timer = window.setTimeout(conditionallyAutosize, delay); - return () => window.clearTimeout(timer); - }; - - makeCondtionalAutosize(50, 350); - const pinnedTopRowData = [df.table_hints]; - - return ( -
    -
    - -
    -
    - ); -} diff --git a/js/components/DFViewerParts/DFViewer.tsx b/js/components/DFViewerParts/DFViewer.tsx new file mode 100644 index 000000000..e297986dd --- /dev/null +++ b/js/components/DFViewerParts/DFViewer.tsx @@ -0,0 +1,136 @@ +import React, { useRef, CSSProperties, useState } from 'react'; +import _ from 'lodash'; +import { DFData, DFViewerConfig, EmptyDf } from './DFWhole'; + +import { dfToAgrid, extractPinnedRows } from './gridUtils'; +import { replaceAtMatch } from '../utils'; +import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component +import { + GridOptions, + SizeColumnsToContentStrategy, + SizeColumnsToFitProvidedWidthStrategy, +} from 'ag-grid-community'; +import { summaryDfForTableDf, tableDf } from '../../baked_data/staticData'; + +import { getCellRendererSelector } from './gridUtils'; + +export type setColumFunc = (newCol: string) => void; + +export function DFViewer( + { + df, + df_viewer_config, + summary_stats_data, + style, + activeCol, + setActiveCol, + }: { + df: DFData; + df_viewer_config: DFViewerConfig; + summary_stats_data?: DFData; + style?: CSSProperties; + activeCol?: string; + setActiveCol?: setColumFunc; + } = { + df: EmptyDf.data, + df_viewer_config: EmptyDf.dfviewer_config, + summary_stats_data: [], + style: { height: '300px' }, + setActiveCol: () => null, + } +) { + //console.log("dfviewer df_viewer_config", df_viewer_config); + // console.log("summary_stats_data", summary_stats_data); + // console.log("full_object", {'df':df, 'df_viewer_config':df_viewer_config, 'summary_stats_data': summary_stats_data}) + const [agColsPure, agData] = dfToAgrid( + df, + df_viewer_config, + summary_stats_data || [] + ); + //agColsPure[0].minWidth=150; + + const styledColumns = replaceAtMatch( + _.clone(agColsPure), + activeCol || '___never', + { + cellStyle: { background: 'var(--ag-range-selection-background-color-3)' }, + } + ); + + const defaultColDef = { + sortable: true, + type: 'rightAligned', + cellRendererSelector: getCellRendererSelector(df_viewer_config.pinned_rows), + }; + + const gridOptions: GridOptions = { + rowSelection: 'single', + onRowClicked: (event) => console.log('A row was clicked'), + tooltipShowDelay: 0, + + // defaultColDef needs to be specifically passed in as a prop to the component, not defined here, + // otherwise updates aren't reactive + + onCellClicked: (event) => { + const colName = event.column.getColId(); + if (setActiveCol === undefined || colName === undefined) { + return; + } else { + setActiveCol(colName); + } + }, + }; + const gridRef = useRef>(null); + const pinned_rows = df_viewer_config.pinned_rows; + const topRowData = summary_stats_data + ? extractPinnedRows(summary_stats_data, pinned_rows ? pinned_rows : []) + : []; + + const getAutoSize = (): + | SizeColumnsToFitProvidedWidthStrategy + | SizeColumnsToContentStrategy => { + console.log('getAutoSize'); + + if (styledColumns.length < 1) { + return { + type: 'fitProvidedWidth', + width: 1000, + }; + } + return { + type: 'fitCellContents', + }; + }; + + return ( +
    +
    + +
    +
    + ); +} + +export function DFViewerEx() { + const [activeCol, setActiveCol] = useState('tripduration'); + return ( + + ); +} diff --git a/js/components/DFViewerParts/DFWhole.ts b/js/components/DFViewerParts/DFWhole.ts new file mode 100644 index 000000000..53d79b5b4 --- /dev/null +++ b/js/components/DFViewerParts/DFWhole.ts @@ -0,0 +1,166 @@ +// I'm not sure about adding underlying types too + +import { ColDef } from 'ag-grid-community'; +import _ from 'lodash'; + +type AGGrid_ColDef = ColDef; + +export interface ObjDisplayerA { + displayer: 'obj'; +} +export interface BooleanDisplayerA { + displayer: 'boolean'; +} +export interface StringDisplayerA { + displayer: 'string'; + max_length?: number; +} +export interface FloatDisplayerA { + displayer: 'float'; + min_fraction_digits: number; + max_fraction_digits: number; +} + +export interface DatetimeDefaultDisplayerA { + displayer: 'datetimeDefault'; +} +export interface IntegerDisplayerA { + displayer: 'integer'; + min_digits: number; + max_digits: number; +} + +export interface DatetimeLocaleDisplayerA { + displayer: 'datetimeLocaleString'; + locale: 'en-US' | 'en-GB' | 'en-CA' | 'fr-FR' | 'es-ES' | 'de-DE' | 'ja-JP'; + args: Intl.DateTimeFormatOptions; +} + +// Used DisplayerA instead of FormatterArgs, Displayer makes sense from the python side +// python doesn't care that histogram requires a cellRenderer and Integer only changes the formatter +export type FormatterArgs = + | ObjDisplayerA + | BooleanDisplayerA + | StringDisplayerA + | FloatDisplayerA + | DatetimeDefaultDisplayerA + | DatetimeLocaleDisplayerA + | IntegerDisplayerA; + +export interface HistogramDisplayerA { + displayer: 'histogram'; +} + +export interface LinkifyDisplayerA { + displayer: 'linkify'; +} +export interface BooleanCheckboxDisplayerA { + displayer: 'boolean_checkbox'; +} + +export type CellRendererArgs = + | HistogramDisplayerA + | LinkifyDisplayerA + | BooleanCheckboxDisplayerA; +export type DisplayerArgs = FormatterArgs | CellRendererArgs; + +export const cellRendererDisplayers = ['histogram', 'linkify']; + +//ColorMapRules +export interface ColorMapRules { + color_rule: 'color_map'; + map_name: 'BLUE_TO_YELLOW' | 'DIVERGING_RED_WHITE_BLUE'; + //optional, the column to base the ranges on. the proper histogram_bins must still be sent in for that column + val_column?: string; +} + +//if exist_column is not null, set cell style to condtional_color... used for highlighting changed values or errored_rows +export interface ColorWhenNotNullRules { + color_rule: 'color_not_null'; + conditional_color: string | 'red'; + exist_column: string; +} + +export interface ColorFromColumn { + color_rule: 'color_from_column'; + col_name: string; +} + +export type ColorMappingConfig = + | ColorMapRules + | ColorWhenNotNullRules + | ColorFromColumn; + +//TooltipRules +export interface SimpleTooltip { + tooltip_type: 'simple'; + val_column: string; +} + +export interface SummarySeriesTooltip { + tooltip_type: 'summary_series'; +} + +export type TooltipConfig = SimpleTooltip | SummarySeriesTooltip; //more to be added + +export type ColumnConfig = { + col_name: string; + displayer_args: DisplayerArgs; + color_map_config?: ColorMappingConfig; + tooltip_config?: TooltipConfig; + ag_grid_specs?: AGGrid_ColDef; +}; + +export type PinnedRowConfig = { + primary_key_val: string; + displayer_args: DisplayerArgs; + //used to render index column values with string not the specified displayer, otherwise the column will be listed as NaN or blank + //by default the "index" column is always rendered with "obj" + default_renderer_columns?: string[]; +}; + +export interface DFViewerConfig { + pinned_rows: PinnedRowConfig[]; + column_config: ColumnConfig[]; +} + +export type DFDataRow = Record< + string, + string | number | boolean | any[] | Record | null +>; + +export type DFData = DFDataRow[]; + +/* +When I want to start tagging metadata onto DFData +export interface DFData { + rows: DFDataRow[]; + //data_meta expansion point for typing info about the data as needed by non-display stuff + // typing, sorting, null handling I'm not sure about it +}; +*/ + +export interface DFWhole { + dfviewer_config: DFViewerConfig; + data: DFData; +} + +export const EmptyDf: DFWhole = { + dfviewer_config: { + pinned_rows: [], + column_config: [], + }, + data: [], +}; + +//actually SDFT is summary stats transposed to be useful +// SDFT[col][stat_name] +// SDFT really only needs histogramBins and histogramLogBins and...? at this point +//type SDFT = any; + +export interface SDFMeasure { + histogram_bins: number[]; + histogram_log_bins: number[]; +} + +export type SDFT = Record; diff --git a/js/components/DFViewerParts/Displayer.ts b/js/components/DFViewerParts/Displayer.ts new file mode 100644 index 000000000..b4cfa582f --- /dev/null +++ b/js/components/DFViewerParts/Displayer.ts @@ -0,0 +1,208 @@ +import { ValueFormatterFunc, ValueFormatterParams } from 'ag-grid-community'; +import { + DisplayerArgs, + cellRendererDisplayers, + FloatDisplayerA, + IntegerDisplayerA, + DatetimeLocaleDisplayerA, + StringDisplayerA, +} from './DFWhole'; +import _ from 'lodash'; +import { HistogramCell, LinkCellRenderer } from './HistogramCell'; +import { CellRendererArgs, FormatterArgs } from './DFWhole'; + +/* + this code should all be unit tested and in examples. Examples will + show potential developers how this behaves. Examples should be made + inside of AG-Grid, and independently. + */ + +export const basicIntFormatter = new Intl.NumberFormat('en-US', { + minimumFractionDigits: 0, + maximumFractionDigits: 3, +}); + +export const getStringFormatter = (args: StringDisplayerA) => { + const stringFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + if (val && args.max_length) { + return val.slice(0, args.max_length); + } + return val; + }; + return stringFormatter; +}; + +const dictDisplayer = (val: Record): string => { + const objBody = _.map( + val, + (value, key) => `'${key}': ${objDisplayer(value)}` + ).join(','); + return `{ ${objBody} }`; +}; + +export const isValidDate = (possibleDate: any): boolean => { + if (_.isDate(possibleDate) && isFinite(possibleDate.getTime())) { + return true; + } + return false; +}; +const DEFAULT_DATE_FORMAT: Intl.DateTimeFormatOptions = { + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false, +}; + +export const dateDisplayerDefault = (d: Date): string => { + const fullStr = d.toLocaleDateString('en-CA', DEFAULT_DATE_FORMAT); + const [dateStr, timeStr] = fullStr.split(','); + const retVal = `${dateStr} ${timeStr}`; + return retVal; +}; +const objDisplayer = (val: any | any[]): string => { + if (val === undefined || val === null) { + return 'None'; + } else if (_.isArray(val)) { + return `[ ${val.map(objDisplayer).join(', ')}]`; + } else if (_.isBoolean(val)) { + return boolDisplayer(val); + } else if (_.isObject(val)) { + return dictDisplayer(val); + } else { + return val.toString(); + } + return val; +}; + +export const objFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + return objDisplayer(val); +}; + +export const boolDisplayer = (val: boolean) => { + if (val === true) { + return 'True'; + } else if (val === false) { + return 'False'; + } + return ''; +}; + +export const booleanFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + return boolDisplayer(val); +}; +const getIntegerFormatter = (hint: IntegerDisplayerA) => { + const commas = Math.floor(hint.max_digits / 3); + const totalWidth = commas + hint.max_digits; + + const formatter = new Intl.NumberFormat('en-US'); + const numericFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + if (val === null) { + return ''; + } + return formatter.format(params.value).padStart(totalWidth, ' '); + }; + return numericFormatter; +}; +export const getFloatFormatter = (hint: FloatDisplayerA) => { + const floatFormatter = new Intl.NumberFormat('en-US', { + minimumFractionDigits: hint.min_fraction_digits, + maximumFractionDigits: hint.max_fraction_digits, + }); + return (params: ValueFormatterParams): string => { + if (params.value === null) { + return ''; + } + const res: string = floatFormatter.format(params.value); + if (!_.includes(res, '.')) { + const padLength = res.length + hint.max_fraction_digits + 1; + return res.padEnd(padLength); + } else { + const fracPart = res.split('.')[1]; + const padLength = hint.max_fraction_digits - fracPart.length + res.length; + return res.padEnd(padLength); + } + }; +}; + +export const getDatetimeFormatter = (colHint: DatetimeLocaleDisplayerA) => { + return (params: ValueFormatterParams): string => { + const val = params.value; + if (val === null || val === undefined) { + return ''; + } + const d = new Date(val); + if (!isValidDate(d)) { + return ''; + } + return d.toLocaleDateString(colHint.locale, colHint.args); + }; +}; + +export const defaultDatetimeFormatter = ( + params: ValueFormatterParams +): string => { + const val = params.value; + if (val === null || val === undefined) { + return ''; + } + const d = new Date(val); + if (!isValidDate(d)) { + return ''; + } + return dateDisplayerDefault(d); +}; + +export function getFormatter( + fArgs: FormatterArgs +): ValueFormatterFunc { + switch (fArgs.displayer) { + case 'integer': + return getIntegerFormatter(fArgs); + case 'string': + return getStringFormatter(fArgs); + case 'datetimeDefault': + return defaultDatetimeFormatter; + case 'datetimeLocaleString': + return getDatetimeFormatter(fArgs); + case 'float': + return getFloatFormatter(fArgs); + case 'boolean': + return booleanFormatter; + case 'obj': + return objFormatter; + default: + return getStringFormatter({ displayer: 'string' }); + } +} + +/* +{ + cellRenderer: 'agCheckboxCellRenderer', + cellRendererParams: { disabled: true} + } + */ +export function getCellRenderer(crArgs: CellRendererArgs) { + switch (crArgs.displayer) { + case 'histogram': + return HistogramCell; + case 'linkify': + return LinkCellRenderer; + case 'boolean_checkbox': + return 'agCheckboxCellRenderer'; + } +} + +export function getFormatterFromArgs(dispArgs: DisplayerArgs) { + if (_.includes(cellRendererDisplayers, dispArgs.displayer)) { + return undefined; + } + const fArgs = dispArgs as FormatterArgs; + return getFormatter(fArgs); +} diff --git a/js/components/CustomHeader.tsx b/js/components/DFViewerParts/HistogramCell.tsx similarity index 83% rename from js/components/CustomHeader.tsx rename to js/components/DFViewerParts/HistogramCell.tsx index 54799718f..e46e20cfe 100644 --- a/js/components/CustomHeader.tsx +++ b/js/components/DFViewerParts/HistogramCell.tsx @@ -1,6 +1,7 @@ import _ from 'lodash'; import React from 'react'; import { createPortal } from 'react-dom'; + import { BarChart, Bar, @@ -8,8 +9,10 @@ import { //Legend, //Cell, XAxis, YAxis, CartesianGrid, , ResponsiveContainer, } from 'recharts'; -import { Tooltip } from './RechartTooltip'; -import { isNumOrStr, ValueType } from './RechartExtra'; +import { Tooltip } from '../../vendor/RechartTooltip'; + +import { isNumOrStr, ValueType } from '../../vendor/RechartExtra'; +import { ValueFormatterFunc } from 'ag-grid-community'; function defaultFormatter(value: TValue) { return _.isArray(value) && isNumOrStr(value[0]) && isNumOrStr(value[1]) @@ -52,7 +55,7 @@ export const makeData = (histogram: number[]) => { return accum; }; -const formatter = (value: any, name: any, props: any) => { +export const formatter = (value: any, name: any, props: any) => { if (props.payload.name === 'longtail') { return [value, name]; } else { @@ -126,15 +129,45 @@ export const ToolTipAdapter = (args: any) => { return null; }; -//export const HistogramCell = ({histogram}: {histogram:any}) => { +export const getTextCellRenderer = (formatter: ValueFormatterFunc) => { + const TextCellRenderer = (props: any) => { + return {formatter(props)}; + }; + return TextCellRenderer; +}; + +export const LinkCellRenderer = (props: any) => { + return {props.value}; +}; + export const HistogramCell = (props: any) => { + //debugger; if (props === undefined || props.value === undefined) { return ; } - const histogram = props.value.histogram; + const histogram = props.value; + //for key "index", the value is "histogram" + // this causes ReChart to blow up, so we check to see if it's an array + if (histogram === undefined || !_.isArray(histogram)) { + return ; + } + const dumbClickHandler = (rechartsArgs: any, _unused_react: any) => { + // I can't find the type for rechartsArgs + // these are probably the keys we care about + // activeTooltipIndex + // activeLabel + console.log('dumbClickHandler', rechartsArgs); + }; + return (
    - + { + return ( +
    +

    series_summary

    + +
    + ); + }; + return retFunc; +} diff --git a/js/components/DFViewerParts/gridUtils.ts b/js/components/DFViewerParts/gridUtils.ts new file mode 100644 index 000000000..6fb2083da --- /dev/null +++ b/js/components/DFViewerParts/gridUtils.ts @@ -0,0 +1,322 @@ +import { + CellClassParams, + CellRendererSelectorResult, + ColDef, + ICellRendererParams, +} from 'ag-grid-community'; +import { + BLUE_TO_YELLOW, + DIVERGING_RED_WHITE_BLUE, +} from '../../baked_data/colorMap'; + +import { + DFWhole, + DisplayerArgs, + cellRendererDisplayers, + ColumnConfig, + ColorMappingConfig, + ColorMapRules, + TooltipConfig, + ColorWhenNotNullRules, + DFViewerConfig, +} from './DFWhole'; +import _, { zipObject } from 'lodash'; +import { getTextCellRenderer } from './HistogramCell'; + +import { DFData, SDFMeasure, SDFT } from './DFWhole'; + +import { CellRendererArgs, FormatterArgs, PinnedRowConfig } from './DFWhole'; +import { getBakedDFViewer } from './SeriesSummaryTooltip'; +import { + getFormatterFromArgs, + getCellRenderer, + objFormatter, + getFormatter, +} from './Displayer'; + +// for now colDef stuff with less than 3 implementantions should stay in this file +// as implementations grow large or with many implmentations, they should move to separate files +// like displayer + +export function addToColDef( + dispArgs: DisplayerArgs, + summary_stats_column: SDFMeasure +) { + const formatter = getFormatterFromArgs(dispArgs); + if (formatter !== undefined) { + const colDefExtras: ColDef = { valueFormatter: formatter }; + return colDefExtras; + } + + if (_.includes(cellRendererDisplayers, dispArgs.displayer)) { + const crArgs: CellRendererArgs = dispArgs as CellRendererArgs; + return { + cellRenderer: getCellRenderer(crArgs), + }; + } + return undefined; +} + +export function getHistoIndex(val: number, histogram_edges: number[]): number { + /* +np.histogram([1, 2, 3, 4, 10, 20, 30, 40, 300, 300, 400, 500], bins=5) +( [ 8, 0, 2, 1, 1], +[ 1. , 100.8, 200.6, 300.4, 400.2, 500. ]) +The bottom matters for us, those are the endge + +this means that 8 values are between 1 and 100.8 and 2 values are between 200.6 and 300.4 + */ + if (histogram_edges.length === 0) { + return 0; + } + for (let i = 0; i < histogram_edges.length; i++) { + if (val <= histogram_edges[i]) { + return i; + } + } + return histogram_edges.length; +} + +export function colorMap(cmr: ColorMapRules, histogram_edges: number[]) { + // https://colorcet.com/gallery.html#isoluminant + // https://github.com/holoviz/colorcet/tree/main/assets/CET + // https://github.com/bokeh/bokeh/blob/ed285b11ab196e72336b47bf12f44e1bef5abed3/src/bokeh/models/mappers.py#L304 + const maps: Record = { + BLUE_TO_YELLOW: BLUE_TO_YELLOW, + DIVERGING_RED_WHITE_BLUE: DIVERGING_RED_WHITE_BLUE, + }; + const cmap = maps[cmr.map_name]; + + function numberToColor(val: number) { + const histoIndex = getHistoIndex(val, histogram_edges); + const scaledIndex = Math.round( + (histoIndex / histogram_edges.length) * cmap.length + ); + return cmap[scaledIndex]; + } + + function cellStyle(params: CellClassParams) { + const val = cmr.val_column ? params.data[cmr.val_column] : params.value; + const color = numberToColor(val); + return { + backgroundColor: color, + }; + } + + const retProps = { + cellStyle: cellStyle, + }; + return retProps; +} + +export function colorNotNull(cmr: ColorWhenNotNullRules) { + function cellStyle(params: CellClassParams) { + if (params.data === undefined) { + return { backgroundColor: 'inherit' }; + } + const val = params.data[cmr.exist_column]; + const valPresent = val && val !== null; + const isPinned = params.node.rowPinned; + const color = valPresent && !isPinned ? cmr.conditional_color : 'inherit'; + return { + backgroundColor: color, + }; + } + + const retProps = { + cellStyle: cellStyle, + }; + return retProps; +} + +export function getStyler( + cmr: ColorMappingConfig, + col_name: string, + histogram_stats: SDFT +) { + switch (cmr.color_rule) { + case 'color_map': { + //block necessary because you cant define varaibles in case blocks + const statsCol = cmr.val_column || col_name; + const summary_stats_cell = histogram_stats[statsCol]; + + if ( + summary_stats_cell && + summary_stats_cell.histogram_bins !== undefined + ) { + return colorMap(cmr, summary_stats_cell.histogram_bins); + } else { + console.log('histogram bins not found for color_map'); + return {}; + } + } + case 'color_not_null': + return colorNotNull(cmr); + } +} + +export function extractPinnedRows(sdf: DFData, prc: PinnedRowConfig[]) { + return _.map(_.map(prc, 'primary_key_val'), (x) => _.find(sdf, { index: x })); +} + +export function getTooltip( + ttc: TooltipConfig, + single_series_summary_df: DFWhole +): Partial { + switch (ttc.tooltip_type) { + case 'simple': + return { tooltipField: ttc.val_column }; + + case 'summary_series': + return { + tooltipComponent: getBakedDFViewer(single_series_summary_df), + tooltipField: 'index', + tooltipComponentParams: {}, + }; + } +} + +export function extractSingleSeriesSummary( + full_summary_stats_df: DFData, + col_name: string +): DFWhole { + return { + dfviewer_config: { + column_config: [ + { col_name: 'index', displayer_args: { displayer: 'obj' } }, + { col_name: col_name, displayer_args: { displayer: 'obj' } }, + ], + pinned_rows: [], + }, + data: _.filter( + _.map(full_summary_stats_df, (row) => _.pick(row, ['index', col_name])), + { index: 'dtype' } + ), + }; +} + +export function dfToAgrid( + tdf: DFData, + dfviewer_config: DFViewerConfig, + full_summary_stats_df: DFData +): [ColDef[], unknown[]] { + //more convienient df format for some formatters + const hdf = extractSDFT(full_summary_stats_df || []); + + const retColumns: ColDef[] = dfviewer_config.column_config.map( + (f: ColumnConfig) => { + const single_series_summary_df = extractSingleSeriesSummary( + full_summary_stats_df, + f.col_name + ); + + const color_map_config = f.color_map_config + ? getStyler(f.color_map_config, f.col_name, hdf) + : {}; + + const tooltip_config = f.tooltip_config + ? getTooltip(f.tooltip_config, single_series_summary_df) + : {}; + const colDef: ColDef = { + field: f.col_name, + headerName: f.col_name, + cellDataType: false, + cellStyle: {}, // necessary for colormapped columns to have a default + ...addToColDef(f.displayer_args, hdf[f.col_name]), + ...color_map_config, + ...tooltip_config, + ...f.ag_grid_specs, + }; + return colDef; + } + ); + return [retColumns, tdf]; +} + +// this is very similar to the colDef parts of dfToAgrid +export function getCellRendererSelector(pinned_rows: PinnedRowConfig[]) { + const anyRenderer: CellRendererSelectorResult = { + component: getTextCellRenderer(objFormatter), + }; + return ( + params: ICellRendererParams + ): CellRendererSelectorResult | undefined => { + if (params.node.rowPinned) { + const pk = _.get(params.node.data, 'index'); + if (pk === undefined) { + return anyRenderer; // default renderer + } + const maybePrc: PinnedRowConfig | undefined = _.find(pinned_rows, { + primary_key_val: pk, + }); + if (maybePrc === undefined) { + return anyRenderer; + } + const prc: PinnedRowConfig = maybePrc; + console.log('params', params); + const currentCol = params.column?.getColId(); + if ( + (prc.default_renderer_columns === undefined && + currentCol === 'index') || + _.includes(prc.default_renderer_columns, currentCol) + ) { + return anyRenderer; + } + const possibCellRenderer = getCellRenderer( + prc.displayer_args as CellRendererArgs + ); + + if (possibCellRenderer === undefined) { + const formattedRenderer: CellRendererSelectorResult = { + component: getTextCellRenderer( + getFormatter(prc.displayer_args as FormatterArgs) + ), + }; + return formattedRenderer; + } + return { component: possibCellRenderer }; + } else { + return undefined; // rows that are not pinned don't use a row level cell renderer + } + }; +} + +export function extractSDFT(summaryStatsDf: DFData): SDFT { + const maybeHistogramBins = + _.find(summaryStatsDf, { index: 'histogram_bins' }) || {}; + const maybeHistogramLogBins = + _.find(summaryStatsDf, { index: 'histogram_log_bins' }) || {}; + const allColumns: string[] = _.without( + _.union(_.keys(maybeHistogramBins), _.keys(maybeHistogramLogBins)), + 'index' + ); + const vals: SDFMeasure[] = _.map(allColumns, (colName) => { + return { + histogram_bins: _.get(maybeHistogramBins, colName, []) as number[], + histogram_log_bins: _.get(maybeHistogramLogBins, colName, []) as number[], + }; + }); + return zipObject(allColumns, vals) as SDFT; +} + +/* +I would love for extractSDF to be more elegant like the following function. I just can't quite get it to work +time to move on + +export function extractSDFT2(summaryStatsDf:DFData) : SDFT { + const rows = ['histogram_bins', 'histogram_log_bins'] + + const extracted = _.map(rows, (pk) => { + return _.find(summaryStatsDf, {'index': pk}) || {} + }) + const dupKeys: string[][] = _.map(extracted, _.keys); + const allColumns: string[] = _.without(_.union(...dupKeys), 'index'); + const vals:SDFMeasure[] = _.map(allColumns, (colName) => { + const pairs = _.map(_.zip(rows, extracted), (rname, row) => { + return [rname, (_.get(row, colName, []) as number[])]; + }) + return _.fromPairs(pairs) as SDFMeasure; + }); + return zipObject(allColumns, vals) as SDFT; +} +*/ diff --git a/js/components/DependentTabs.tsx b/js/components/DependentTabs.tsx index 592f7da1f..865342b57 100644 --- a/js/components/DependentTabs.tsx +++ b/js/components/DependentTabs.tsx @@ -4,8 +4,7 @@ import React, { Dispatch, SetStateAction, } from 'react'; -import { DFWhole, EmptyDf } from './staticData'; -import { DFViewer } from './DFViewer'; +import { DFWhole, EmptyDf } from './DFViewerParts/DFWhole'; import _ from 'lodash'; import { Operation } from './OperationUtils'; @@ -48,11 +47,7 @@ export function TransformViewer({ style: CSSProperties; transformedDf: DFWhole; }) { - return ( -
    - -
    - ); + return
    "transformed view"
    ; } export type OperationResult = { transformed_df: DFWhole; @@ -100,7 +95,6 @@ export function DependentTabs({ }) { const [tab, _setTab] = useState('DataFrame'); const style: CSSProperties = { height: '45vh' }; - console.log('dependenttabs operationResult', operationResult); return (
      diff --git a/js/components/Operations.tsx b/js/components/Operations.tsx index 245a1fbab..a64dfb22e 100644 --- a/js/components/Operations.tsx +++ b/js/components/Operations.tsx @@ -12,10 +12,10 @@ import { bakedCommandConfig } from './bakedOperationDefaults'; import { OperationDetail } from './OperationDetail'; import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component import { ColDef, GridOptions } from 'ag-grid-community'; -import { updateAtMatch } from './gridUtils'; +import { updateAtMatch } from './utils'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; -import { bakedOperations } from './staticData'; +import { bakedOperations } from '../baked_data/staticData'; const getColumns = (passedOperations: Operation[]): ColDef[] => _.map(Array.from(passedOperations.entries()), ([index, element]) => { diff --git a/js/components/StatusBar.tsx b/js/components/StatusBar.tsx index de50226ef..1ce68f86c 100644 --- a/js/components/StatusBar.tsx +++ b/js/components/StatusBar.tsx @@ -3,115 +3,180 @@ import React, { useState, useRef } from 'react'; import _ from 'lodash'; import { AgGridReact } from 'ag-grid-react'; // the AG Grid React Component import { ColDef, GridOptions } from 'ag-grid-community'; -import { basicIntFormatter } from './gridUtils'; +import { basicIntFormatter } from './DFViewerParts/Displayer'; +import { DFMeta } from './WidgetTypes'; +import { BuckarooOptions } from './WidgetTypes'; +import { BuckarooState, BKeys } from './WidgetTypes'; export type setColumFunc = (newCol: string) => void; -export interface DfConfig { - totalRows: number; - columns: number; - rowsShown: number; - sampleSize: number; - sampled: boolean; - summaryStats: boolean; - showCommands: boolean; - //reorderedColumns is currently disabled as a function, but it will be added back soon - //reorderdColumns: boolean; -} +const getSearchForm = (initialVal: string, setSearchVal: any) => { + return function MyForm() { + function handleSubmit(e: any) { + // Prevent the browser from reloading the page + e.preventDefault(); + // Read the form data + const form = e.target; + const formData = new FormData(form); -const columnDefs: ColDef[] = [ - { - field: 'summaryStats', - headerName: 'Σ', //note the greek symbols instead of icons which require buildchain work - headerTooltip: 'Summary Stats', - width: 30, - }, - // { field: 'reorderdColumns', - // headerName: "Θ", - // headerTooltip:"Reorder Columns", - // width:30 - // }, - { - field: 'showCommands', - headerName: 'λ', - headerTooltip: 'Show Commands', - width: 30, - }, - - { field: 'sampled', headerName: 'Ξ', headerTooltip: 'Sampled', width: 30 }, - { - field: 'help', - headerName: '?', - headerTooltip: 'Help', - width: 30, - cellRenderer: function (params: any) { - return ( - - ? - - ); - }, - }, + const entries = Array.from(formData.entries()); - { field: 'totalRows', width: 100 }, - { field: 'columns', width: 100 }, - { field: 'rowsShown', width: 120 }, - { field: 'sampleSize', width: 120 }, -]; + const formDict = _.fromPairs(entries) as Record; + + console.log('formDict', formDict); + setSearchVal(formDict['search']); + } + + return ( +
      + +
      + ); + }; +}; + +const helpCell = function (params: any) { + return ( + + ? + + ); +}; export function StatusBar({ - config, - setConfig, + dfMeta, + buckarooState, + setBuckarooState, + buckarooOptions, }: { - config: any; - setConfig: any; + dfMeta: DFMeta; + buckarooState: BuckarooState; + setBuckarooState: React.Dispatch>; + buckarooOptions: BuckarooOptions; }) { - const { - totalRows, - columns, - rowsShown, - sampleSize, - sampled, - summaryStats, - showCommands, - //reorderdColumns - } = config; + console.log('initial buckarooState', buckarooState); + // const optionCycles = _.fromPairs( + // // _.map(buckarooOptions, (v: any, k) => [k, ( k==='df_display' ? v : _.concat([false], v) ) ]) + // _.map(buckarooOptions, (v: any, k) => [k, ( k==='post_processing' ? v : _.concat([false], v) ) ]) - const rowData = [ - { - totalRows: basicIntFormatter.format(totalRows), - columns, - rowsShown: basicIntFormatter.format(rowsShown), - sampleSize: basicIntFormatter.format(sampleSize), - sampled: sampled ? '1' : '0', - summaryStats: summaryStats ? '1' : '0', - // reorderdColumns: reorderdColumns ? "1" : "ό", - showCommands: showCommands ? '1' : '0', - }, - ]; + // ) as Record; + const optionCycles = buckarooOptions; + const idxs = _.fromPairs( + _.map(_.keys(optionCycles), (k) => [ + k, + _.indexOf(optionCycles[k as BKeys], buckarooState[k as BKeys]), + ]) + ); + + const nextIndex = (curIdx: number, arr: any[]) => { + if (curIdx === arr.length - 1) { + return 0; + } + return curIdx + 1; + }; + const newBuckarooState = (k: BKeys) => { + const arr = optionCycles[k]; + const curIdx = idxs[k]; + const nextIdx = nextIndex(curIdx, arr); + const newVal = arr[nextIdx]; + const newState = _.clone(buckarooState); + newState[k] = newVal; + return newState; + }; const updateDict = (event: any) => { const colName = event.column.getColId(); - if (colName === 'summaryStats') { - setConfig({ ...config, summaryStats: !config.summaryStats }); - } else if (colName === 'sampled') { - setConfig({ ...config, sampled: !config.sampled }); - } else if (colName === 'showCommands') { - setConfig({ ...config, showCommands: !config.showCommands }); + if (colName === 'search') { + return; + } + if (_.includes(_.keys(buckarooState), colName)) { + const nbstate = newBuckarooState(colName as BKeys); + setBuckarooState(nbstate); } - // } else if (colName === 'reorderdColumns') { - // setConfig({ ...config, reorderdColumns: !config.reorderdColumns }); }; + const showSearch = false; + const localSetSearchString = (search_query: string) => { + setBuckarooState({ ...buckarooState, search_string: search_query }); + }; + + const columnDefs: ColDef[] = [ + { + field: 'search', + width: 200, + cellRenderer: getSearchForm( + buckarooState.search_string, + localSetSearchString + ), + hide: !showSearch, + }, + + { + field: 'df_display', + headerName: 'Σ', //note the greek symbols instead of icons which require buildchain work + headerTooltip: 'Summary Stats', + width: 120, + }, + /* + { + field: 'auto_clean', + //headerName: 'Σ', //note the greek symbols instead of icons which require buildchain work + headerName: 'auto cleaning', + headerTooltip: 'Auto Cleaning config', + width: 120, + }, + */ + { + field: 'post_processing', + // headerName: "Θ", + headerName: 'post processing', + headerTooltip: 'post process method', + width: 100, + }, + { + field: 'show_commands', + headerName: 'λ', + headerTooltip: 'Show Commands', + width: 30, + }, + + { field: 'sampled', headerName: 'Ξ', headerTooltip: 'Sampled', width: 30 }, + { + field: 'help', + headerName: '?', + headerTooltip: 'Help', + width: 30, + cellRenderer: helpCell, + }, + { field: 'total_rows', width: 100 }, + { field: 'rows_shown', headerName: 'displayed', width: 85 }, + { field: 'columns', width: 75 }, + ]; + + const rowData = [ + { + total_rows: basicIntFormatter.format(dfMeta.total_rows), + columns: dfMeta.columns, + rows_shown: basicIntFormatter.format(dfMeta.rows_shown), + sampled: buckarooState.sampled || '0', + auto_clean: buckarooState.auto_clean || '0', + df_display: buckarooState.df_display, + post_processing: buckarooState.post_processing, + show_commands: buckarooState.show_commands || '0', + }, + ]; + const gridOptions: GridOptions = { - rowSelection: 'single', + suppressRowClickSelection: true, }; const gridRef = useRef>(null); const defaultColDef = { - type: 'left-aligned', + // type: 'left-aligned', cellStyle: { textAlign: 'left' }, }; return ( @@ -129,18 +194,36 @@ export function StatusBar({
    ); } - export function StatusBarEx() { - const [sampleConfig, setConfig] = useState({ - totalRows: 1309, - columns: 30, - rowsShown: 500, - sampleSize: 10_000, - sampled: true, - summaryStats: false, - showCommands: true, - //reorderdColumns: true, + const dfm: DFMeta = { + columns: 5, + rows_shown: 20, + total_rows: 8_777_444, + }; + + const [bState, setBState] = useState({ + auto_clean: 'conservative', + sampled: false, + df_display: 'main', + post_processing: 'asdf', + show_commands: false, + search_string: '', }); - return ; + const bOptions: BuckarooOptions = { + auto_clean: ['aggressive', 'conservative'], + post_processing: ['', 'asdf'], + sampled: ['random'], + show_commands: ['on'], + df_display: ['main'], + }; + + return ( + + ); } diff --git a/js/components/WidgetTypes.tsx b/js/components/WidgetTypes.tsx new file mode 100644 index 000000000..0de348093 --- /dev/null +++ b/js/components/WidgetTypes.tsx @@ -0,0 +1,38 @@ +export interface DFMeta { + // static, + total_rows: number; + columns: number; + rows_shown: number; +} +export interface BuckarooOptions { + sampled: string[]; + auto_clean: string[]; + post_processing: string[]; + df_display: string[]; // keys into Into df_display_args + show_commands: string[]; +} +export interface BuckarooState { + sampled: string | false; + auto_clean: string | false; + search_string: string; + post_processing: string | false; + df_display: string; //at least one dataframe must always be displayed + show_commands: string | false; +} + +export type BKeys = keyof BuckarooOptions; + +// df_dict: Record; +// df_meta: DFMeta; +/* + + df_dict: Record; + df_meta: DFMeta; + operations: Operation[]; + on_operations: (ops: Operation[]) => void; + operation_results: OperationResult; + commandConfig: CommandConfigT; + buckaroo_state: BuckarooState; + on_buckaroo_state: React.Dispatch>; + buckaroo_options: BuckarooOptions; +*/ diff --git a/js/components/gridUtils.ts b/js/components/gridUtils.ts deleted file mode 100644 index 7281888eb..000000000 --- a/js/components/gridUtils.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { - ColDef, - ValueFormatterFunc, - ValueFormatterParams, -} from 'ag-grid-community'; -import { - DFWhole, - DFColumn, - ColumnHint, - ColumnIntegertHint, - ColumnFloatHint, - ColumnDatetimeHint, -} from './staticData'; -import _ from 'lodash'; -export const updateAtMatch = ( - cols: ColDef[], - key: string, - subst: Partial, - negative: Partial -) => { - const retColumns = cols.map((x) => { - if (x.field === key) { - return { ...x, ...subst }; - } else { - return { ...x, ...negative }; - } - }); - return retColumns; -}; - -/* - this code should all be unit tested and in examples. Examples will - show potential developers how this behaves. Examples should be made - inside of AG-Grid, and independently. - */ - -export const basicIntFormatter = new Intl.NumberFormat('en-US', { - minimumFractionDigits: 0, - maximumFractionDigits: 3, -}); - -export const stringFormatter = (params: ValueFormatterParams): string => { - const val = params.value; - return val; -}; - -const dictDisplayer = (val: Record): string => { - const objBody = _.map( - val, - (value, key) => `'${key}': ${objDisplayer(value)}` - ).join(','); - return `{ ${objBody} }`; -}; - -export const isValidDate = (possibleDate: any): boolean => { - if (_.isDate(possibleDate) && isFinite(possibleDate.getTime())) { - return true; - } - return false; -}; - -const DEFAULT_DATE_FORMAT: Intl.DateTimeFormatOptions = { - year: 'numeric', - month: 'numeric', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', - hour12: false, -}; - -export const dateDisplayerDefault = (d: Date): string => { - const fullStr = d.toLocaleDateString('en-CA', DEFAULT_DATE_FORMAT); - const [dateStr, timeStr] = fullStr.split(','); - //const retVal = `${dateStr} ${timeStr.padStart(12)}`; - const retVal = `${dateStr} ${timeStr}`; - return retVal; -}; - -export const getDatetimeFormatter = (colHint: ColumnDatetimeHint) => { - return (params: ValueFormatterParams): string => { - // console.log("params", params) - const val = params.value; - if (val === null || val === undefined) { - return ''; - } - const d = new Date(val); - if (!isValidDate(d)) { - return ''; - } - if (colHint.formatter === 'default') { - return dateDisplayerDefault(d); - } else if (colHint.formatter === 'toLocaleString') { - return d.toLocaleDateString(colHint.locale, colHint.args); - } - throw new Error('unreachable code in getDatetimeFormatter'); - }; -}; - -const objDisplayer = (val: any | any[]): string => { - if (val === undefined || val === null) { - return 'None'; - } else if (_.isArray(val)) { - return `[ ${val.map(objDisplayer).join(', ')}]`; - } else if (_.isBoolean(val)) { - return boolDisplayer(val); - } else if (_.isObject(val)) { - return dictDisplayer(val); - } else { - return val.toString(); - } - return val; -}; - -const objFormatter = (params: ValueFormatterParams): string => { - const val = params.value; - return objDisplayer(val); -}; - -export const boolDisplayer = (val: boolean) => { - if (val === true) { - return 'True'; - } else if (val === false) { - return 'False'; - } - return ''; -}; - -export const booleanFormatter = (params: ValueFormatterParams): string => { - const val = params.value; - return boolDisplayer(val); -}; - -const getIntegerFormatter = (hint: ColumnIntegertHint) => { - const commas = Math.floor(hint.max_digits / 3); - const totalWidth = commas + hint.max_digits; - - const formatter = new Intl.NumberFormat('en-US'); - const numericFormatter = (params: ValueFormatterParams): string => { - const val = params.value; - if (val === null) { - return ''; - } - return formatter.format(params.value).padStart(totalWidth, ' '); - }; - return numericFormatter; -}; - -const getFloatFormatter = (hint: ColumnFloatHint) => { - const floatFormatter = new Intl.NumberFormat('en-US', { - minimumFractionDigits: 3, - maximumFractionDigits: 3, - }); - return (params: ValueFormatterParams): string => { - if (params.value === null) { - return ''; - } - return floatFormatter.format(params.value); - }; -}; - -function getFormatter(hint: ColumnHint): ValueFormatterFunc { - if (hint === undefined) { - return stringFormatter; - } - if (hint.type === 'integer') { - return getIntegerFormatter(hint); - } else if (hint.type === 'string') { - return stringFormatter; - } else if (hint.type === 'datetime') { - return getDatetimeFormatter(hint); - } else if (hint.type === 'float') { - return getFloatFormatter(hint); - } else if (hint.type === 'boolean') { - return booleanFormatter; - } else if (hint.type === 'obj') { - return objFormatter; - } - return stringFormatter; -} - -export function dfToAgrid(tdf: DFWhole): [ColDef[], unknown[]] { - const fields = tdf.schema.fields; - //console.log("tdf", tdf); - //console.log("hints", tdf.table_hints); - const retColumns: ColDef[] = fields.map((f: DFColumn) => { - //console.log(f.name, tdf.table_hints[f.name]) - const colDef: ColDef = { - field: f.name, - headerName: f.name, - valueFormatter: getFormatter( - _.get(tdf.table_hints, f.name, { is_numeric: false, type: 'obj' }) - ), - }; - if (f.name === 'index') { - colDef.pinned = 'left'; - } - return colDef; - }); - return [retColumns, tdf.data]; -} diff --git a/js/components/utils.ts b/js/components/utils.ts index 773acd0b2..3e59f37c6 100644 --- a/js/components/utils.ts +++ b/js/components/utils.ts @@ -1,5 +1,6 @@ import _ from 'lodash'; -import { DFWhole } from './staticData'; +import { DFWhole } from './DFViewerParts/DFWhole'; +import { ColDef } from 'ag-grid-community'; export type setDFFunc = (newDf: DFWhole) => void; @@ -39,3 +40,33 @@ export const objWithoutNull = ( obj: Record, extraStrips: string[] = [] ) => _.pickBy(obj, (x) => ![null, undefined, ...extraStrips].includes(x)); +export const updateAtMatch = ( + cols: ColDef[], + key: string, + subst: Partial, + negative: Partial +) => { + const retColumns = cols.map((x) => { + if (x.field === key) { + return { ...x, ...subst }; + } else { + return { ...x, ...negative }; + } + }); + return retColumns; +}; + +export const replaceAtMatch = ( + cols: ColDef[], + key: string, + subst: Partial +) => { + const retColumns = cols.map((x) => { + if (x.field === key) { + return { ...x, ...subst }; + } else { + return { ...x }; + } + }); + return retColumns; +}; diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index f8bb0e368..c88c23502 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -46,7 +46,6 @@ export class DCEFWidgetModel extends DOMWidgetModel { static view_module = MODULE_NAME; // Set to null if no view static view_module_version = MODULE_VERSION; } - export class DCEFWidgetView extends DOMWidgetView { render(): void { this.el.classList.add('custom-widget'); @@ -70,7 +69,6 @@ export class DCEFWidgetView extends DOMWidgetView { } return React.createElement(WidgetDCFCell, props); }; - console.log('widget el', this.el); const root = ReactDOMClient.createRoot(this.el); const componentEl = React.createElement(Component, {}); diff --git a/js/components/RechartExtra.ts b/js/vendor/RechartExtra.ts similarity index 100% rename from js/components/RechartExtra.ts rename to js/vendor/RechartExtra.ts diff --git a/js/components/RechartTooltip.tsx b/js/vendor/RechartTooltip.tsx similarity index 100% rename from js/components/RechartTooltip.tsx rename to js/vendor/RechartTooltip.tsx diff --git a/package.json b/package.json index 5d39baeb7..6c330863d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.5.2", + "version": "0.6.1", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", @@ -60,8 +60,8 @@ "dependencies": { "@jupyter-widgets/base": "^2 || ^3 || ^4 || ^6.0.0", "@jupyterlab/apputils": "^3.0.2", - "ag-grid-community": "^29.2.0", - "ag-grid-react": "^29.2.0", + "ag-grid-community": "^31.0.3", + "ag-grid-react": "^31.0.3", "lodash": "^4.17.21", "react": "^18.0.0", "react-dom": "^18.0.0", @@ -100,18 +100,18 @@ "markdown-loader": "^7.0.0", "mkdirp": "^0.5.1", "npm-run-all": "^4.1.3", - "prettier": "^2.6.2", - "prettier-standalone": "^1.3.1-0", - "prismjs": "^1.28.0", "postcss": "^8.4.14", "postcss-loader": "^7.0.1", - "postcss-preset-env": "^7.7.2", "postcss-nested": "^6.0.0", - "sass": "^1.53.0", - "sass-loader": "^13.0.2", + "postcss-preset-env": "^7.7.2", + "prettier": "^2.6.2", + "prettier-standalone": "^1.3.1-0", + "prismjs": "^1.28.0", "react-router": "^6.3.0", "react-router-dom": "^5.2.0", "rimraf": "^3.0.2", + "sass": "^1.53.0", + "sass-loader": "^13.0.2", "source-map-loader": "^0.2.4", "style-loader": "^2.0.0", "svg-url-loader": "^7.1.1", diff --git a/pyproject.toml b/pyproject.toml index 6f02e11ab..c030b0b91 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.5.2" +version = "0.6.1" [project.license] file = "LICENSE.txt" @@ -59,7 +59,8 @@ notebook = ["notebook>=7.0.0"] docs = [ - "sphinx>=1.5" + "sphinx>=1.5", + "graphviz>=0.20.1" ] build = [ diff --git a/tests/ts/gridUtils.test.ts b/tests/ts/gridUtils.test.ts new file mode 100644 index 000000000..7bd45c54c --- /dev/null +++ b/tests/ts/gridUtils.test.ts @@ -0,0 +1,69 @@ +//import { add, multiply } from "../src/math"; + +import { extractSDFT, getHistoIndex, } from '../../js/components/DFViewerParts/gridUtils'; +import { DFData } from "../../js/components/DFViewerParts/DFWhole"; +import { getFloatFormatter, getFormatter, objFormatter } from '../../js/components/DFViewerParts/Displayer'; +import { ValueFormatterParams } from 'ag-grid-community'; + +describe("testing utility functions in gridUtils ", () => { + // mostly sanity checks to help develop gridUtils + +it("should test getFormater", () => { +// expect(getFormatter({displayer: 'string'})).toBe(stringFormatter) + expect(getFormatter({displayer: 'obj'})).toBe(objFormatter); + + +}); + +it("should format floats with a consistently spaced decimal pont", + () => { + const floatFormatter = getFloatFormatter( + {'displayer':'float', 'min_fraction_digits':0, 'max_fraction_digits':3}) + const res1 = floatFormatter({'value': 1.997} as ValueFormatterParams); + expect(res1).toBe("1.997"); + const res2 = floatFormatter({'value': 1.000} as ValueFormatterParams); + expect(res2).toBe("1 "); + const res3 = floatFormatter({'value': 1} as ValueFormatterParams); + expect(res3).toBe("1 "); + const res4 = floatFormatter({'value': 31} as ValueFormatterParams); + expect(res4).toBe("31 "); + + const res5 = floatFormatter({'value': 1.5} as ValueFormatterParams); + expect(res5).toBe("1.5 "); + + } +) + it("should convert to expected format", () => { + const basicSDF:DFData = [ + {'index': 'histogram_bins', 'a':[2,3]}, + {'index': 'histogram_log_bins', 'a':[20,30], 'b': [10, 20] + }, + ]; + const expected = { + 'a': {'histogram_bins': [2,3], 'histogram_log_bins': [20, 30]}, + 'b': {'histogram_bins': [], 'histogram_log_bins': [10, 20]} + }; + const result = extractSDFT(basicSDF); + expect(result).toEqual(expected); + }); + it("color mapper should pick from ranges properly", () => { + /* +np.histogram([1, 2, 3, 4, 10, 20, 30, 40, 300, 300, 400, 500], bins=5) +( [ 8, 0, 2, 1, 1], +[ 1. , 100.8, 200.6, 300.4, 400.2, 500. ]) +The bottom matters for us, those are the endge + +this means that 8 values are between 1 and 100.8 and 2 values are between 200.6 and 300.4 + */ + const edges = [2, 4, 10, 30]; + expect(getHistoIndex(1, [])).toBe(0); + expect(getHistoIndex(1, edges)).toBe(0); + expect(getHistoIndex(3, edges)).toBe(1); + expect(getHistoIndex(5, edges)).toBe(2); + expect(getHistoIndex(10, edges)).toBe(2); + expect(getHistoIndex(11, edges)).toBe(3); + expect(getHistoIndex(11000, edges)).toBe(4); + + }); +}); + diff --git a/tests/unit/analysis_management_test.py b/tests/unit/analysis_management_test.py index f80309866..8746284a3 100644 --- a/tests/unit/analysis_management_test.py +++ b/tests/unit/analysis_management_test.py @@ -4,10 +4,9 @@ ColAnalysis) from buckaroo.pluggable_analysis_framework.analysis_management import ( - AnalysisPipeline, NonExistentSummaryRowException, DfStats, - #produce_summary_df, #test this too - - full_produce_summary_df, produce_series_df) + AnalysisPipeline, DfStats, + #full_produce_summary_df, + produce_series_df) from buckaroo.pluggable_analysis_framework.safe_summary_df import (output_full_reproduce) @@ -20,16 +19,16 @@ class DumbTableHints(ColAnalysis): provides_summary = [ 'is_numeric', 'is_integer', 'min_digits', 'max_digits', 'histogram'] + provides_defaults = { + 'is_numeric':False, 'is_integer':False, 'histogram':[]} @staticmethod def computed_summary(summary_dict): return {'is_numeric':True, 'is_integer':False, - 'min_digits':3, - 'max_digits':10, 'histogram': []} class AlwaysErr(ColAnalysis): - provides_summary = ['foo'] + provides_defaults = {'foo':0} @staticmethod def computed_summary(summary_dict): @@ -43,47 +42,53 @@ def test_produce_series_df(self): sdf, errs = produce_series_df( test_df, [Len], 'test_df', debug=True) ld = {'len':4} - assert sdf == {'normal_int_series': ld, 'empty_na_ser': ld, 'float_nan_ser': ld} + #dict(**sdf) makes the types equal and leads to better error messages if there is a problem + assert dict(**sdf) == {'normal_int_series': ld, 'empty_na_ser': ld, 'float_nan_ser': ld, 'index':ld} sdf2, errs = produce_series_df( test_df, [DistinctCount], 'test_df', debug=True) - assert sdf2 == {'normal_int_series': {'distinct_count': 4}, - 'empty_na_ser': {'distinct_count':0}, 'float_nan_ser': {'distinct_count':2}} + assert dict(**sdf2) == { + 'normal_int_series': {'distinct_count': 4}, + 'index': {'distinct_count': 4}, + 'empty_na_ser': {'distinct_count':0}, 'float_nan_ser': {'distinct_count':2}} sdf3, errs = produce_series_df( test_df, [DistinctCount, DistinctPer], 'test_df', debug=True) - assert sdf3 == {'normal_int_series': {'distinct_count': 4}, - 'empty_na_ser': {'distinct_count':0}, 'float_nan_ser': {'distinct_count':2}} + assert dict(**sdf3) == { + 'normal_int_series': {'distinct_count': 4, 'distinct_per':0}, + 'index': {'distinct_count': 4, 'distinct_per':0}, + 'empty_na_ser': {'distinct_count': 0, 'distinct_per':0}, + 'float_nan_ser': {'distinct_count': 2, 'distinct_per':0}} def test_full_produce_summary_df(self): """just make sure this doesn't fail""" - sdf, th, errs = full_produce_summary_df( + sdf, errs = AnalysisPipeline.full_produce_summary_df( test_df, [DistinctCount, Len, DistinctPer], 'test_df', debug=True) assert errs == {} def test_full_produce_summary_df_empy(self): """just make sure this doesn't fail""" - sdf, th, errs = full_produce_summary_df( + sdf, errs = AnalysisPipeline.full_produce_summary_df( empty_df, [DistinctCount, Len, DistinctPer], 'test_df', debug=True) assert errs == {} def test_full_produce_summary_df_empy2(self): """just make sure this doesn't fail""" - sdf, th, errs = full_produce_summary_df( + sdf, errs = AnalysisPipeline.full_produce_summary_df( empty_df_with_columns, [DistinctCount, Len, DistinctPer], 'test_df', debug=True) assert errs == {} def test_full_produce_summary_df_errs(self): """just make sure this doesn't fail""" single_col_df = test_df[['empty_na_ser']] - sdf, th, errs = full_produce_summary_df( + sdf, errs = AnalysisPipeline.full_produce_summary_df( single_col_df, [AlwaysErr], 'test_df', debug=False) err_key = list(errs.keys())[0] err_val = list(errs.values())[0] - assert err_key == ('empty_na_ser', 'computed_summary') + assert err_key == ('index', 'computed_summary') assert err_val[1] == AlwaysErr #can't compare instances of Exception classes # assert errs == { @@ -94,21 +99,6 @@ def test_output_full_reproduce(self): ('empty_na_ser', 'computed_summary'): (ZeroDivisionError('division by zero'), AlwaysErr)} output_full_reproduce(errs, {'bar':8}, 'testing_df') - def test_produce_summary_df_hints(self): - #this test should be ported over to the full basic_widget test with actaul verificaiton of values - - summary_df, hints, errs = full_produce_summary_df( - test_df, [DumbTableHints], 'test_df') - - for col, hint_obj in hints.items(): - #hacky replication of typescript types, just basically testing that hints are constructed properly - if hint_obj['is_numeric'] is False: - assert 'histogram' in hint_obj.keys() - else: - expected_set = set( - ['is_numeric', 'is_integer', 'min_digits', 'max_digits', 'type', 'formatter', 'histogram']) - assert expected_set == set(hint_obj.keys()) - def test_pipeline_base(self): ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) #just verify that there are no errors @@ -117,20 +107,20 @@ def test_pipeline_base(self): def test_add_aobj(self): ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provides_summary = ['foo'] + provides_defaults = {'foo':0} requires_summary = ['length'] @staticmethod def computed_summary(summary): return dict(foo=8) assert ap.add_analysis(Foo) == (True, []) #verify no errors thrown - sdf, _unused, _unused_errs = ap.process_df(df) + sdf, _unused_errs = ap.process_df(df) self.assertEqual(sdf['tripduration']['foo'], 8) def test_add_buggy_aobj(self): ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provides_summary = ['foo'] + provides_defaults = {'foo':0} requires_summary = ['length'] @staticmethod @@ -144,137 +134,36 @@ def computed_summary(summary_dict): def test_replace_aobj(self): ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) class Foo(ColAnalysis): - provides_summary = ['foo'] + provides_defaults = {'foo':0} requires_summary = ['length'] @staticmethod def computed_summary(bar): return dict(foo=8) ap.add_analysis(Foo) - sdf, _unused, _unused_errs = ap.process_df(df) + sdf, _unused_errs = ap.process_df(df) self.assertEqual(sdf['tripduration']['foo'], 8) #18 facts returned about tripduration #FIXME #self.assertEqual(len(sdf['tripduration']), 18) #Create an updated Foo that returns 9 class Foo(ColAnalysis): - provides_summary = ['foo'] + provides_defaults = {'foo':0} requires_summary = ['length'] @staticmethod def computed_summary(bar): return dict(foo=9) ap.add_analysis(Foo) - sdf2, _unused, _unused_errs = ap.process_df(df) + sdf2, _unused_errs = ap.process_df(df) self.assertEqual(sdf2['tripduration']['foo'], 9) #still 18 facts returned about tripduration #self.assertEqual(len(sdf2['tripduration']), 18) #Create an updated Foo that returns 9 - def test_summary_stats_display(self): - class AlwaysFoo(ColAnalysis): - provides_summary = ['foo'] - summary_stats_display = ['foo'] - - @staticmethod - def computed_summary(summary_dict): - return dict(foo=3) - - class AlwaysBar(ColAnalysis): - provides_summary = ['bar'] - summary_stats_display = ['bar'] - - @staticmethod - def computed_summary(summary_dict): - return dict(bar=3) - - ap = AnalysisPipeline([AlwaysFoo]) - self.assertEqual(ap.summary_stats_display, ["foo"]) - ap.add_analysis(AlwaysBar) - assert ap.summary_stats_display == ["bar"] - - ap2 = AnalysisPipeline([AlwaysFoo, AlwaysBar]) - assert ap2.ordered_a_objs == [AlwaysFoo, AlwaysBar] - assert ap2.summary_stats_display == ["bar"] - - def test_summary_stats_display2(self): - """ - defines vagaries of dependent analysis and sumary stats - """ - class AlwaysFoo(ColAnalysis): - provides_summary = ['foo'] - summary_stats_display = ['foo'] - - @staticmethod - def computed_summary(summary_dict): - return dict(foo=3) - class DependsFoo(ColAnalysis): - provides_summary = ['xoq'] - requires_summary = ['foo'] - summary_stats_display = ['xoq'] - - @staticmethod - def computed_summary(summary_dict): - return dict(xoq=3) - - - class AlwaysBar(ColAnalysis): - provides_summary = ['bar'] - summary_stats_display = ['bar'] - - @staticmethod - def computed_summary(summary_dict): - return dict(bar=3) - - ap2 = AnalysisPipeline([AlwaysFoo, AlwaysBar]) - self.assertEqual(ap2.summary_stats_display, ["bar"]) - ap2.add_analysis(DependsFoo) - self.assertEqual(ap2.summary_stats_display, ["xoq"]) - - ap = AnalysisPipeline([DependsFoo, AlwaysFoo]) - self.assertEqual(ap.summary_stats_display, ["xoq"]) - ap2.add_analysis(AlwaysBar) - #Always Bar doesn't depend on anything so it doesn't replace xoq in summary_stats_display - assert ap.summary_stats_display == ["xoq"] - - def test_add_summary_stats_display(self): - ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) - class Foo(ColAnalysis): - provides_summary = ['foo'] - requires_summary = ['length'] - summary_stats_display = ['foo'] - - ap.add_analysis(Foo) - self.assertEquals(ap.summary_stats_display, ['foo']) - - def test_invalid_summary_stats_display_throws(self): - ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) - class Foo(ColAnalysis): - provides_summary = ['foo'] - requires_summary = ['length'] - summary_stats_display = ['not_provided'] - - def bad_add(): - ap.add_analysis(Foo) - - self.assertRaises(NonExistentSummaryRowException, bad_add) - - def test_invalid_summary_stats_display_throws2(self): - ap = AnalysisPipeline([TypingStats, DefaultSummaryStats]) - class Foo(ColAnalysis): - provides_summary = ['foo'] - requires_summary = ['length'] - summary_stats_display = ['not_provided'] - - def bad_add(): - ap.add_analysis(Foo) - - self.assertRaises(NonExistentSummaryRowException, bad_add) - - class SometimesProvides(ColAnalysis): - provides_summary = ['conditional_on_dtype'] + provides_defaults = {'conditional_on_dtype':'xcvz'} summary_stats_display = ['conditional_on_dtype'] @@ -304,6 +193,6 @@ def test_dfstats_sometimes_present(self): #ab = dfs.presentation_sdf #triggers a getter? - DfStats(word_only_df, [SometimesProvides]).presentation_sdf + DfStats(word_only_df, [SometimesProvides]).sdf diff --git a/tests/unit/analysis_test.py b/tests/unit/analysis_test.py index fa92c8d2b..1863431f5 100644 --- a/tests/unit/analysis_test.py +++ b/tests/unit/analysis_test.py @@ -1,7 +1,7 @@ from datetime import datetime as dtdt import numpy as np import pandas as pd -from buckaroo.customizations.analysis import DefaultSummaryStats, ColDisplayHints +from buckaroo.customizations.analysis import DefaultSummaryStats from buckaroo.customizations.histogram import Histogram from buckaroo.pluggable_analysis_framework.analysis_management import PERVERSE_DF @@ -56,15 +56,6 @@ def test_default_summary_stats(): for ser in all_sers: print(DefaultSummaryStats.series_summary(ser, ser)) -def xtest_datetime_hints(): - result = ColDisplayHints.summary( - datetime_ser, {'nan_per':0}, datetime_ser) - assert {'type': 'datetime', - 'formatter': 'default', - 'is_integer': False, - 'is_numeric': False, - } == result - def test_datetime_histogram(): series_result = Histogram.series_summary( datetime_ser, datetime_ser) @@ -153,3 +144,30 @@ def test_perverse_on_histogram2(): nan_per=0 )) + + +def test_weird_grouper(): + """fails on + + File "/Users/paddy/buckaroo/buckaroo/customizations/analysis.py", line 86, in series_summary + value_counts = ser.value_counts() + ^^^^^^^^^^^^^^^^^^ + File "/Users/paddy/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/pandas/core/frame.py", line 7264, in value_counts + counts = self.groupby(subset, dropna=dropna, observed=False).grouper.size() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/paddy/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/pandas/core/frame.py", line 8869, in groupby + return DataFrameGroupBy( + ^^^^^^^^^^^^^^^^^ + File "/Users/paddy/anaconda3/envs/buckaroo-dev-5/lib/python3.11/site-packages/pandas/core/groupby/groupby.py", line 1278, in __init__ + grouper, exclusions, obj = get_grouper( + # """ + # df = pd.DataFrame({'a':np.random.randint(1,50,200), 'b': np.random.randint(1,30,200)}) + # a_ser = df['a'].value_counts() + # b_ser = df['b'].value_counts() + # a_df = pd.DataFrame({ + # 'a': a_ser.index.values, 'a_counts': a_ser.values}) + # b_df = pd.DataFrame({ 'b': b_ser.index.values, 'a_counts': b_ser.values}) + # merged_df = pd.concat([a_df, b_df], axis=1) + + #ahh "a_counts" is repeated, hmmm + diff --git a/tests/unit/basic_widget_test.py b/tests/unit/basic_widget_test.py index d4f29d011..3d075bf80 100644 --- a/tests/unit/basic_widget_test.py +++ b/tests/unit/basic_widget_test.py @@ -10,11 +10,11 @@ def test_basic_instantiation(): w = BuckarooWidget(simple_df) - assert w.dfConfig['totalRows'] == 3 + assert w.df_meta['total_rows'] == 3 def test_perverse_instantiation(): w = BuckarooWidget(PERVERSE_DF) - assert w.dfConfig['totalRows'] == 10 + assert w.df_meta['total_rows'] == 10 def test_word_only_instantiation(): BuckarooWidget(word_only_df) @@ -29,7 +29,7 @@ def test_debug_true(): w = BuckarooWidget(df, debug=True) display(w) -def test_interpreter(): +def xtest_interpreter(): #df = pd.read_csv('./examples/data/2014-01-citibike-tripdata.csv') w = BuckarooWidget(simple_df, auto_clean=True) @@ -44,7 +44,7 @@ def test_interpreter(): tdf = w.operation_results['transformed_df'] assert w.operation_results['transform_error'] is False - field_names = [ f['name'] for f in tdf['schema']['fields'] ] + field_names = [ f['col_name'] for f in tdf['dfviewer_config']['column_config'] ] assert 'str_col' not in field_names assert w.operation_results['generated_py_code'] == """def clean(df): df['int_col'] = smart_to_int(df['int_col']) @@ -70,7 +70,7 @@ def atest_symbol_meta(): assert 'starttime' not in field_names -def test_interpreter_errors(): +def xtest_interpreter_errors(): w = BuckarooWidget(simple_df) w.operations = [ [{"symbol":"dropcol"},{"symbol":"df"},"int_col"], @@ -78,30 +78,3 @@ def test_interpreter_errors(): [{"symbol":"dropcol"},{"symbol":"df"},"int_col"]] assert w.operation_results['transform_error'] == '''"['int_col'] not found in axis"''' -def test_analysis_pipeline(): - """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" - w = BuckarooWidget(simple_df) - assert w.stats.ap.unit_test() == (True, []) - -def test_auto_clean_false(): - """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" - w = BuckarooWidget(simple_df, auto_clean=False) - assert w.stats.ap.unit_test() == (True, []) - -def test_auto_clean_true(): - """ uses built in analysis_management unit tests on the Buckaroo Widget as configured""" - w = BuckarooWidget(simple_df, auto_clean=True) - assert w.stats.ap.unit_test() == (True, []) - - -def test_post_processing(): - def my_func(df): - return df['int_col'].sum() - - bw = BuckarooWidget(simple_df, postProcessingF=my_func) - assert bw.processed_result == 6 - - bw2 = BuckarooWidget(simple_df, auto_clean=False, postProcessingF=my_func) - assert bw2.processed_result == 6 - - diff --git a/tests/unit/dataflow/__init__.py b/tests/unit/dataflow/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit/dataflow/customizable_dataflow_test.py b/tests/unit/dataflow/customizable_dataflow_test.py new file mode 100644 index 000000000..df8d4afbe --- /dev/null +++ b/tests/unit/dataflow/customizable_dataflow_test.py @@ -0,0 +1,198 @@ +import numpy as np +import pandas as pd +import pytest +from ..fixtures import (DistinctCount) +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) +from buckaroo.dataflow import CustomizableDataflow, StylingAnalysis +from buckaroo.buckaroo_widget import BuckarooWidget + + +EMPTY_DF_JSON = { + 'dfviewer_config': { + 'pinned_rows': [], + 'column_config': []}, + 'data': []} + +BASIC_DF = pd.DataFrame({'a': [10, 20, 20], 'b':['foo', 'bar', 'baz']}) +BASIC_DF_JSON_DATA = [{'index':0, 'a':10, 'b':'foo'}, + {'index':1, 'a':20, 'b':'bar'}, + {'index':2, 'a':20, 'b':'baz'}] +DFVIEWER_CONFIG_DEFAULT = { + 'pinned_rows': [], + 'column_config': [ + {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'a', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'b', 'displayer_args': {'displayer': 'obj'}}]} + +def test_widget_instatiation(): + dfc = CustomizableDataflow(BASIC_DF) + assert dfc.widget_args_tuple[1] is BASIC_DF + assert dfc.df_data_dict['main'] == BASIC_DF_JSON_DATA + assert dfc.df_display_args['main']['df_viewer_config'] == DFVIEWER_CONFIG_DEFAULT + +def test_custom_dataflow(): + + class IntStyling(StylingAnalysis): + provides_defaults = {} + @staticmethod + def style_column(col, sd): + return {'col_name':col, 'displayer_args': {'displayer': 'int'}} + + df_display_name = "int_styles" + data_key = "main" + summary_stats_key= '555555555' + + + class TwoStyleDFC(CustomizableDataflow): + analysis_klasses = [StylingAnalysis, IntStyling] + #analysis_klasses = [IntStyling] + + cdfc = TwoStyleDFC(BASIC_DF) + assert cdfc.widget_args_tuple[1] is BASIC_DF + assert cdfc.df_display_args['main']['df_viewer_config'] == DFVIEWER_CONFIG_DEFAULT + DFVIEWER_CONFIG_INT = { + 'pinned_rows': [], + 'column_config': [ + {'col_name':'index', 'displayer_args': {'displayer': 'int'}}, + {'col_name':'a', 'displayer_args': {'displayer': 'int'}}, + {'col_name':'b', 'displayer_args': {'displayer': 'int'}}]} + + assert cdfc.df_display_args['int_styles']['df_viewer_config'] == DFVIEWER_CONFIG_INT + + + +def test_custom_summary_stats(): + class DCDFC(CustomizableDataflow): + analysis_klasses = [DistinctCount, StylingAnalysis] + + dc_dfc = DCDFC(BASIC_DF) + + summary_sd = dc_dfc.widget_args_tuple[2] + print(summary_sd) + print("^"*80) + assert summary_sd == {'index': {'distinct_count': 3}, + 'a': {'distinct_count':2}, 'b': {'distinct_count':3}} + assert list(summary_sd.keys()) == ['index', 'a', 'b'] + +SENTINEL_DF = pd.DataFrame({'sent_int_col':[11, 22, 33], 'sent_str_col':['ka', 'b', 'c']}) + + +class PostProcessingAnalysis(ColAnalysis): + provides_defaults = {} + post_processing_method = "post1" + + @classmethod + def post_process_df(kls, cleaned_df): + return [SENTINEL_DF, {'sent_int_col': {'sentinel_prop':5}}] + + +def test_custom_post_processing(): + class PostDCFC(CustomizableDataflow): + analysis_klasses = [PostProcessingAnalysis, StylingAnalysis] + + p_dfc = PostDCFC(BASIC_DF) + + assert p_dfc.buckaroo_options['post_processing'] == ['', 'post1'] + assert p_dfc.post_processing_method == '' + p_dfc.post_processing_method = 'post1' + + assert p_dfc.processed_df is SENTINEL_DF + +class AlwaysFailAnalysis(ColAnalysis): + provides_defaults = {} + + @staticmethod + def computed_summary(foo): + 1/0 +def test_error_analysis(): + class ErrorCustomDataflow(CustomizableDataflow): + analysis_klasses = [AlwaysFailAnalysis] + + ErrorCustomDataflow(BASIC_DF) + #basically asserting that it doesn't throw an error + with pytest.raises(Exception): + ErrorCustomDataflow(BASIC_DF, debug=True) + +class AlwaysFailPostProcessingAnalysis(ColAnalysis): + provides_defaults = {} + post_processing_method = "always_fail" + + @classmethod + def post_process_df(kls, cleaned_df): + 1/0 + + +def test_error_post_processing(): + class ErrorCFC(CustomizableDataflow): + analysis_klasses = [AlwaysFailPostProcessingAnalysis, StylingAnalysis] + + e_dfc = ErrorCFC(BASIC_DF) + + assert e_dfc.buckaroo_options['post_processing'] == ['', 'always_fail'] + e_dfc.post_processing_method = 'always_fail' + assert e_dfc.processed_df.values == [["division by zero"]] + +def test_column_config_override_widget(): + ROWS = 200 + typed_df = pd.DataFrame( + {'int_col': [1] * ROWS, + 'float_col': [.5] * ROWS, + "str_col": ["foobar"]* ROWS}) + bw2 = BuckarooWidget( + typed_df, + column_config_overrides={ + 'float_col': + {'displayer_args': { 'displayer': 'integer', 'min_digits': 3, 'max_digits': 5 }}}) + float_col_config = bw2.df_display_args['main']['df_viewer_config']['column_config'][2] + assert float_col_config == {'col_name': 'float_col', 'displayer_args': { 'displayer': 'integer', 'min_digits': 3, 'max_digits': 5 }} + + + +def test_pinned_rows_override_widget(): + ROWS = 200 + typed_df = pd.DataFrame( + {'int_col': [1] * ROWS, + 'float_col': [.5] * ROWS, + "str_col": ["foobar"]* ROWS}) + HIST_ROW = {'primary_key_val': 'histogram', 'displayer_args': { 'displayer': 'histogram' }} + bw2 = BuckarooWidget(typed_df, pinned_rows=[HIST_ROW]) + pinned_rows = bw2.df_display_args['main']['df_viewer_config']['pinned_rows'] + assert pinned_rows[0] == HIST_ROW + + + +class TransposeProcessing(ColAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + return [df.T, {}] + post_processing_method = "transpose" + + +def test_transpose_error(): + ROWS = 5 + typed_df = pd.DataFrame( + {'int_col': [1] * ROWS, + 'float_col': [.5] * ROWS, + "str_col": ["foobar"]* ROWS}) + + base_a_klasses = BuckarooWidget.analysis_klasses.copy() + base_a_klasses.extend([TransposeProcessing]) + + class VCBuckarooWidget(BuckarooWidget): + analysis_klasses = base_a_klasses + + vcb = VCBuckarooWidget(typed_df, debug=False) + temp_buckaroo_state = vcb.buckaroo_state.copy() + temp_buckaroo_state['post_processing'] = 'transpose' + vcb.buckaroo_state = temp_buckaroo_state + assert vcb.processed_df.values.tolist() == [ + [1, 1, 1, 1, 1], + [0.5, 0.5, 0.5, 0.5, 0.5], + ['foobar', 'foobar', 'foobar', 'foobar', 'foobar']] +def test_sample(): + big_df = pd.DataFrame({'a': np.arange(105_000)}) + bw = CustomizableDataflow(big_df) + assert len(bw.processed_df) == 100_000 + print(list(bw.df_data_dict.keys())) + assert len(bw.df_data_dict['main']) == 10_000 diff --git a/tests/unit/dataflow/dataflow_polars_test.py b/tests/unit/dataflow/dataflow_polars_test.py new file mode 100644 index 000000000..c577729f5 --- /dev/null +++ b/tests/unit/dataflow/dataflow_polars_test.py @@ -0,0 +1,216 @@ +from buckaroo.dataflow import StylingAnalysis +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) +from buckaroo.polars_buckaroo import PolarsBuckarooWidget +import polars as pl +import numpy as np + +simple_df = pl.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) +BASIC_DF_JSON_DATA = [{'index':0, 'a':10, 'b':'foo'}, + {'index':1, 'a':20, 'b':'bar'}, + {'index':2, 'a':20, 'b':'baz'}] + +BASIC_DF = pl.DataFrame({'a': [10, 20, 20], 'b':['foo', 'bar', 'baz']}) + + +DFVIEWER_CONFIG_DEFAULT = { + 'pinned_rows': [], + 'column_config': [ + {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'a', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'b', 'displayer_args': {'displayer': 'obj'}}]} + + +class BasicStyling(StylingAnalysis): + provides_defaults = {} + df_display_name = "basic" + + +def test_widget_instatiation(): + dfc = PolarsBuckarooWidget(BASIC_DF) + #the BasicStyling is simple and predictable, it writes to 'basic' which nothing else should + dfc.add_analysis(BasicStyling) + + assert dfc.widget_args_tuple[1] is BASIC_DF + assert dfc.df_data_dict['main'] == BASIC_DF_JSON_DATA + + actual_column_config = dfc.df_display_args['basic']['df_viewer_config']['column_config'] + expected_column_config = DFVIEWER_CONFIG_DEFAULT['column_config'] + + #this test is brittle because styling is rapidly changing in development + assert actual_column_config == expected_column_config + +def test_custom_dataflow(): + """Tests that a styling method can be added BuckarooWidget and + that it properly modifies column_config. This Styling analysis + should be identical between polars and pandas + + """ + class IntStyling(StylingAnalysis): + @staticmethod + def style_column(col, sd): + return {'col_name':col, 'displayer_args': {'displayer': 'int'}} + + df_display_name = "int_styles" + data_key = "main" + summary_stats_key= '555555555' + + + class TwoStyleDFC(PolarsBuckarooWidget): + analysis_klasses = [StylingAnalysis, IntStyling] + #analysis_klasses = [IntStyling] + + cdfc = TwoStyleDFC(BASIC_DF) + assert cdfc.widget_args_tuple[1] is BASIC_DF + assert cdfc.df_display_args['main']['df_viewer_config'] == DFVIEWER_CONFIG_DEFAULT + DFVIEWER_CONFIG_INT = { + 'pinned_rows': [], + 'column_config': [ + {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'a', 'displayer_args': {'displayer': 'int'}}, + {'col_name':'b', 'displayer_args': {'displayer': 'int'}}]} + + assert cdfc.df_display_args['int_styles']['df_viewer_config'] == DFVIEWER_CONFIG_INT + + +SENTINEL_DF = pl.DataFrame({'sent_int_col':[11, 22, 33], 'sent_str_col':['ka', 'b', 'c']}) + + +class PostProcessingAnalysis(ColAnalysis): + provides_defaults = {} + post_processing_method = "post1" + + @classmethod + def post_process_df(kls, cleaned_df): + return [SENTINEL_DF, {'sent_int_col': {'sentinel_prop':5}}] + + +def test_custom_post_processing(): + """This test demonstrates that a post processing method can be + added to BuckarooWidget through an analysis class. It further + checks that BuckarooWidget responds to changes in buckaroo_state + that activate the actual post_processing function + + """ + class PostDCFC(PolarsBuckarooWidget): + analysis_klasses = [PostProcessingAnalysis, StylingAnalysis] + + p_dfc = PostDCFC(BASIC_DF) + + assert p_dfc.buckaroo_options['post_processing'] == ['', 'post1'] + assert p_dfc.buckaroo_state['post_processing'] == '' + + temp_buckaroo_state = p_dfc.buckaroo_state.copy() + temp_buckaroo_state['post_processing'] = 'post1' + p_dfc.buckaroo_state = temp_buckaroo_state + + assert p_dfc.processed_df is SENTINEL_DF + + +class TransposeProcessing(ColAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + return [df.transpose(), {}] + post_processing_method = "transpose" + + +def test_transpose_error(): + ROWS = 5 + typed_df = pl.DataFrame( + {'int_col': [1] * ROWS, + 'float_col': [.5] * ROWS, + "str_col": ["foobar"]* ROWS}) + + base_a_klasses = PolarsBuckarooWidget.analysis_klasses.copy() + base_a_klasses.extend([TransposeProcessing]) + + class VCBuckarooWidget(PolarsBuckarooWidget): + analysis_klasses = base_a_klasses + + vcb = VCBuckarooWidget(typed_df, debug=False) + assert type(vcb.processed_df) == pl.DataFrame + assert vcb.processed_df.to_numpy().tolist() ==[ + [1, 0.5, 'foobar'], + [1, 0.5, 'foobar'], + [1, 0.5, 'foobar'], + [1, 0.5, 'foobar'], + [1, 0.5, 'foobar']] + + temp_buckaroo_state = vcb.buckaroo_state.copy() + temp_buckaroo_state['post_processing'] = 'transpose' + vcb.buckaroo_state = temp_buckaroo_state + assert type(vcb.processed_df) == pl.DataFrame + #note that Polars doesn'transpose to objects, but to strings instead + assert vcb.processed_df.to_numpy().tolist() == [ + ['1', '1', '1', '1', '1'], + ['0.5', '0.5', '0.5', '0.5', '0.5'], + ['foobar', 'foobar', 'foobar', 'foobar', 'foobar']] + + +class AlwaysErrorPostProcessing(ColAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + 1/0 + post_processing_method = "always_error" + +def test_always_error_post_processing(): + ROWS = 5 + typed_df = pl.DataFrame( + {'int_col': [1] * ROWS, + 'float_col': [.5] * ROWS, + "str_col": ["foobar"]* ROWS}) + bw = PolarsBuckarooWidget(typed_df, debug=False) + + bw.add_analysis(AlwaysErrorPostProcessing) + + temp_buckaroo_state = bw.buckaroo_state.copy() + temp_buckaroo_state['post_processing'] = 'always_error' + bw.buckaroo_state = temp_buckaroo_state + + print(bw.processed_df.to_numpy().tolist()) + assert bw.processed_df.to_numpy().tolist() == [['division by zero']] + +ROWS = 5 +typed_df = pl.DataFrame( + {'int_col': [1] * ROWS, + 'float_col': [.5] * ROWS, + "str_col": ["foobar"]* ROWS}) + +EXPECTED_OVERRIDE = {'color_map_config': {'color_rule': 'color_from_column', 'col_name': 'Volume_colors'}} +class ColumnConfigOverride(ColAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + return [df, { + 'int_col':{ + 'column_config_override': EXPECTED_OVERRIDE}}] + post_processing_method = "override" + +def test_column_config_override(): + + bw = PolarsBuckarooWidget(typed_df, debug=False) + + bw.add_analysis(ColumnConfigOverride) + + assert 'column_config_override' not in bw.merged_sd['int_col'] + cc_initial = bw.df_display_args['main']['df_viewer_config']['column_config'] + int_cc_initial = cc_initial[1] + assert int_cc_initial['col_name'] == 'int_col' #make sure we found the right row + assert 'color_map_config' not in int_cc_initial + + temp_buckaroo_state = bw.buckaroo_state.copy() + temp_buckaroo_state['post_processing'] = 'override' + bw.buckaroo_state = temp_buckaroo_state + + assert bw.merged_sd['int_col']['column_config_override'] == EXPECTED_OVERRIDE + cc_after = bw.df_display_args['main']['df_viewer_config']['column_config'] + int_cc_after = cc_after[1] + assert int_cc_after['col_name'] == 'int_col' #make sure we found the right row + assert int_cc_after['color_map_config'] == EXPECTED_OVERRIDE['color_map_config'] + +def test_sample(): + big_df = pl.DataFrame({'a': np.arange(30_000)}) + bw = PolarsBuckarooWidget(big_df) + assert len(bw.processed_df) == len(big_df) + assert len(bw.df_data_dict['main']) == 10_000 diff --git a/tests/unit/dataflow/dataflow_test.py b/tests/unit/dataflow/dataflow_test.py new file mode 100644 index 000000000..f992f4c8c --- /dev/null +++ b/tests/unit/dataflow/dataflow_test.py @@ -0,0 +1,209 @@ +import sys +import pandas as pd +from buckaroo.dataflow import DataFlow +from buckaroo import dataflow as dft + +simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) + + +def test_dataflow_operating_df(): + d_flow = DataFlow(simple_df) + d_flow.raw_df = simple_df + assert d_flow.sampled_df is simple_df + d_flow.sample_method = "first" + assert len(d_flow.sampled_df) == 1 + d_flow.sample_method = "default" + assert d_flow.sampled_df is simple_df + + +def test_dataflow_cleaned(): + d_flow = DataFlow(simple_df) + assert d_flow.cleaned_df is simple_df + d_flow.existing_operations = ["one"] + assert d_flow.cleaned_df is dft.SENTINEL_DF_1 + d_flow.cleaning_method = "one op" + assert d_flow.cleaned_df is dft.SENTINEL_DF_2 + +def test_dataflow_processed(): + + d_flow = DataFlow(simple_df) + assert d_flow.processed_df is simple_df + #processed is currently a no-op, so I'm skipping actual tests for now + +def test_summary_sd(): + d_flow = DataFlow(simple_df) + assert d_flow.summary_sd == {'index': {}, 'int_col': {}, 'str_col': {}} + d_flow.analysis_klasses = "foo" + d_flow.cleaning_method = "one op" + assert d_flow.summary_sd == {'some-col': {'foo':8}} + +def test_merged_sd(): + d_flow = DataFlow(simple_df) + assert d_flow.merged_sd == {'index': {}, 'int_col': {}, 'str_col': {}} + d_flow.analysis_klasses = "foo" + d_flow.cleaning_method = "one op" + assert d_flow.summary_sd == {'some-col': {'foo':8}} + assert d_flow.merged_sd == {'some-col': {'foo':8}} + + +def test_column_config(): + basic_df = pd.DataFrame({'a': [10, 20, 30], 'b':['foo', 'bar', 'baz']}) + d_flow = DataFlow(basic_df) + _unused, df, merged_sd = d_flow.widget_args_tuple + + #dfviewer_config = d_flow.df_display_args['main'] + assert merged_sd == {'index' : {}, 'a': {}, 'b': {}} + +def test_merge_sds(): + + sd_base = { + 'Volume' : { + 'a':10, + 'column_config_override': { + 'color_map_config' : {'color_rule': 'color_from_column', + 'col_name': 'Volume_colors'}}}, + 'Volume_colors' : { + 'a': 30, + 'column_config_override': { 'displayer': 'hidden'}}, + 'only_in_base': {'f':77}} + + sd_second = { + 'Volume' : { + 'a': 999, + 'b': "foo", + 'column_config_override': { + 'tooltip_config': {'tooltip_type' : 'summary_series'}}}, + 'Volume_colors' : { + 'd':111, + 'column_config_override': { 'displayer': 'string'}}, + 'completely_new_column': {'k':90}} + + expected = { + 'Volume' : { + 'a': 999, + 'b': "foo", + 'column_config_override': { + 'color_map_config' : {'color_rule': 'color_from_column', + 'col_name': 'Volume_colors'}, + #note that column_config_override is merged, not just overwritten + 'tooltip_config': {'tooltip_type' : 'summary_series'}}}, + 'Volume_colors' : { + 'a': 30, + 'd': 111, + #sd_second has a different value for 'displayer then sd_base + 'column_config_override': { 'displayer': 'string'}}, + #only in base, needs to be present + 'only_in_base': {'f':77}, + #only found in second should show up here + 'completely_new_column': {'k':90}} + + result = dft.merge_sds(sd_base, sd_second) + + assert result == expected + + +def test_merge_column_config(): + overrides = { + 'bar' : {'displayer_args': {'displayer': 'int'}}, + 'foo' : {'color_map_config' : {'color_rule': 'color_from_column', + 'col_name': 'Volume_colors'}}} + + computed_column_config = [ + {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'foo', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'bar', 'displayer_args': {'displayer': 'obj'}}] + + merged = dft.merge_column_config( + computed_column_config, overrides) + + expected = [ + {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'foo', 'displayer_args': {'displayer': 'obj'}, + 'color_map_config' : {'color_rule': 'color_from_column', + 'col_name': 'Volume_colors'}}, + {'col_name':'bar', 'displayer_args': {'displayer': 'int'}}] + assert expected == merged + + +def test_merge_column_config_hide(): + overrides = { + 'bar' : {'merge_rule':'hidden'}} + computed_column_config = [ + + {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'foo', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'bar', 'displayer_args': {'displayer': 'obj'}}] + + merged = dft.merge_column_config( + computed_column_config, overrides) + + expected = [ + {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name':'foo', 'displayer_args': {'displayer': 'obj'}}] + + assert expected == merged + + + +class ExpectedFail(Exception): + pass + + + +def tb_depth(tb, depth=1): + """ + returns the depth of a traceback + """ + if tb.tb_next is None: + return depth + else: + return tb_depth(tb.tb_next, depth+1) + +def exc_depth(exc): + """ + returns the depth of an exception + """ + return tb_depth(exc.__traceback__) + + + +def test_exc_depth(): + def level_3(): + 1/0 + def level_2(): + level_3() + def level_1(): + level_2() + try: + level_1() + except Exception: + l1_exc = sys.exc_info()[1] + assert tb_depth(l1_exc.__traceback__) == 4 + + try: + level_2() + except Exception: + l2_exc = sys.exc_info()[1] + assert tb_depth(l2_exc.__traceback__) == 3 + + +class SampleFailDataFlow(DataFlow): + def _compute_sampled_df(self, raw_df, sample_method): + raise ExpectedFail("_compute_sampled_df") + +def test_error_handling(): + """ + + when something fails in DataFlow, we get stack traces of traitlets.change + there should be shorter stacktraces, the errors should be written to "data_flow_errors" + + I get 300 line stacktraces, aint nobody got time for that + https://pymotw.com/3/traceback/ + """ + try: + SampleFailDataFlow(simple_df) + except Exception: + sf_exc = sys.exc_info()[1] #eption() + print(exc_depth(sf_exc)) + + assert exc_depth(sf_exc) < 7 diff --git a/tests/unit/experimental_pydantic.py b/tests/unit/experimental_pydantic.py new file mode 100644 index 000000000..b68ababf1 --- /dev/null +++ b/tests/unit/experimental_pydantic.py @@ -0,0 +1,236 @@ +import time +import json +import pytest +from pydantic import ValidationError +import pandas as pd +import numpy as np +from buckaroo.serialization_utils import df_to_obj +import pydantic + +# import typing +# if typing.TYPE_CHECKING: +# from . import AnyComponent + + +from typing import Optional, List, Literal, Union, Dict + + + +Formatter = Union[Literal["histogram"], Literal["float"], Literal["string"]] + + +class HistogramFormatterConfig(pydantic.BaseModel): + formatter = Literal["histogram"] + #histograms aren't formatters they are renderers, but that's a frontend problem + +class IntegerFormatterConfig(pydantic.BaseModel): + formatter: Literal["integer"] + min_digits:int + max_digits:int + +FormatterConfig = Union[HistogramFormatterConfig, IntegerFormatterConfig] + +class PinnedRowConfig(pydantic.BaseModel): + primary_key_val : str #value of primary key for this row + displayer_args: FormatterConfig + +class ColumnConfig(pydantic.BaseModel): + col_name : str #value of primary key for this row + displayer_args: FormatterConfig + +class DFViewerConfig(pydantic.BaseModel): + pinned_rows: List[PinnedRowConfig] + column_config: List[ColumnConfig] + + #//extra_config: Dict[str, Any] #height, width + +class DfViewer(pydantic.BaseModel): + df:pd.DataFrame + summary_stats_df: pd.DataFrame + dfviewer_config: DFViewerConfig + + +""" +DFViewer is responsible for picking through summary_stats_df and ordering rows in the order of pinned_rows + +Otherwise, there would be two specification of the order of summary_stats_rows +---- + +When actually displaying summary_stats, the df argument will be empty. Only summary_stats_df will be populated +and every displayed row must have a pinned_row config + + + + + +""" + +class HistogramModel(pydantic.BaseModel): + name: str + population: float + +HT = Optional[List[HistogramModel]] + + + +class ColumnStringHint(pydantic.BaseModel): + type: Literal["string"] + histogram: HT + +class ColumnObjHint(pydantic.BaseModel): + type: Literal["obj"] + histogram: HT + + +class ColumnBooleanHint(pydantic.BaseModel): + type: Literal["boolean"] + histogram: HT + +class ColumnIntegerHint(pydantic.BaseModel): + type: Literal["integer"] + min_digits:int + max_digits:int + histogram: HT + +class DFColumn(pydantic.BaseModel): + name: str + type: str #should be a union + +ColumnHint = Union[ColumnStringHint, ColumnObjHint, ColumnBooleanHint, ColumnIntegerHint] + +class DFSchema(pydantic.BaseModel): + fields: List[DFColumn] + primaryKey: list[str] #; //['index'] + pandas_version: str #; //'1.4.0', + + +DFData = List[Dict[str, Union[str, int, float, None]]] + + + +class DFWhole(pydantic.BaseModel): + schema__ :DFSchema = pydantic.Field(alias='schema') + table_hints: Dict[str, ColumnHint] + data: DFData + +# class DfViewer(pydantic.BaseModel): +# type: 'DFViewer' +# df: DFWhole + +# #Ilike the serialization_alias... but luckily I avoid the need +# #because I don't have any snake cased fields + + +def test_column_hints(): + ColumnStringHint(type="string", histogram=[]) + ColumnStringHint(type="string", histogram=[{'name':'foo', 'population':3500}]) + with pytest.raises(ValidationError) as exc_info: + errant_histogram_entry = {'name':'foo', 'no_population':3500} + ColumnStringHint(type="string", histogram=[errant_histogram_entry]) + assert exc_info.value.errors(include_url=False) == [ + {'type': 'missing', 'loc': ('histogram', 0, 'population'), + 'msg': 'Field required','input': errant_histogram_entry}] + + ColumnBooleanHint(type="boolean", histogram=[]) + +def test_column_hint_extra(): + """verify that we can pass in extra unexpected keys""" + ColumnStringHint(type="string", histogram=[], foo=8) + +def test_dfwhole(): + temp = {'schema': {'fields':[{'name':'foo', 'type':'integer'}], + 'primaryKey':['foo'], 'pandas_version':'1.4.0'}, + 'table_hints': {'foo':{'type':'string', 'histogram':[]}, + 'bar':{'type':'integer', 'min_digits':2, 'max_digits':4, 'histogram':[]}, + 'baz':{'type':'obj', 'histogram':[]}, + }, + 'data': [{'foo': 'hello', 'bar':8}, + {'foo': 'world', 'bar':10}]} + DFWhole(**temp) + +def test_df_to_obj_pydantic(): + named_index_df = pd.DataFrame( + dict(foo=['one', 'two', 'three'], + bar=[1, 2, 3])) + + serialized_df = df_to_obj(named_index_df) + print(json.dumps(serialized_df, indent=4)) + DFWhole(**serialized_df) + +def bimodal(mean_1, mean_2, N, sigma=5): + X1 = np.random.normal(mean_1, sigma, int(N/2)) + X2 = np.random.normal(mean_2, sigma, int(N/2)) + X = np.concatenate([X1, X2]) + return X + +def rand_cat(named_p, na_per, N): + choices, p = [], [] + named_total_per = sum(named_p.values()) + na_per + total_len = int(np.floor(named_total_per * N)) + if named_total_per > 0: + for k, v in named_p.items(): + choices.append(k) + p.append(v/named_total_per) + choices.append(pd.NA) + p.append(na_per/named_total_per) + return [np.random.choice(choices, p=p) for k in range(total_len)] + return [] + +def random_categorical(named_p, unique_per, na_per, longtail_per, N): + choice_arr = rand_cat(named_p, na_per, N) + discrete_choice_len = len(choice_arr) + + longtail_count = int(np.floor(longtail_per * N))//2 + extra_arr = [] + for i in range(longtail_count): + extra_arr.append("long_%d" % i) + extra_arr.append("long_%d" % i) + + unique_len = N - (len(extra_arr) + discrete_choice_len) + for i in range(unique_len): + extra_arr.append("unique_%d" % i) + all_arr = np.concatenate([choice_arr, extra_arr]) + np.random.shuffle(all_arr) + try: + return pd.Series(all_arr, dtype='UInt64') + except Exception: # this is test fixture code + return pd.Series(all_arr, dtype=pd.StringDtype()) + + +def _test_df_to_obj_timing(): + N = 100_000 + df = pd.DataFrame({ + 'normal': np.random.normal(25, .3, N), + 'exponential' : np.random.exponential(1.0, N) * 10 , + 'increasing':[i for i in range(N)], + 'one': [1]*N, + 'dominant_categories': random_categorical({'foo': .6, 'bar': .25, 'baz':.15}, unique_per=0, na_per=0, longtail_per=0, N=N), + 'all_unique_cat': random_categorical({}, unique_per=1, na_per=0, longtail_per=0, N=N), + 'all_NA' : pd.Series([pd.NA] * N, dtype='UInt8'), + 'half_NA' : random_categorical({1: .55}, unique_per=0, na_per=.45, longtail_per=.0, N=N), + 'longtail' : random_categorical({}, unique_per=0, na_per=.2, longtail_per=.8, N=N), + 'longtail_unique' : random_categorical({}, unique_per=0.5, na_per=.0, longtail_per=.5, N=N)}) + + + start_serialize = time.time() + serialized_df = df_to_obj(df) + end_serialize = time.time() + DFWhole(**serialized_df) + end_pydantic = time.time() + + json.dumps(serialized_df) + end_json_time = time.time() + + serialize_time = end_serialize - start_serialize + pydantic_time = end_pydantic - end_serialize + json_time = end_json_time - end_pydantic + + print("serialize_time ", serialize_time) + print("pydantic_time ", pydantic_time) + print("json_time ", json_time) + + #pydantic time was about 1/5th of serialization time + #json.dumps time was around 2/5ths of serialization time + + #the following line triggers an error which will force printing + #1/0 diff --git a/tests/unit/fixtures.py b/tests/unit/fixtures.py index b562d6983..aa74ac8a6 100644 --- a/tests/unit/fixtures.py +++ b/tests/unit/fixtures.py @@ -18,6 +18,7 @@ class DistinctCount(ColAnalysis): + provides_defaults = {'distinct_count':0} requires_raw = True provides_series_stats = ["distinct_count"] @@ -28,6 +29,7 @@ def series_summary(sampled_ser, raw_ser): return {'distinct_count': distinct_count} class Len(ColAnalysis): + provides_defaults = {'len':0} provides_series_stats = ["len"] requires_raw = True @@ -36,6 +38,7 @@ def series_summary(sampled_ser, ser): return {'len': len(ser)} class DCLen(ColAnalysis): + provides_defaults = {'len':0, 'distinct_count':0} provides_series_stats = ["len", "distinct_count"] requires_raw = True @@ -47,7 +50,7 @@ def series_summary(sampled_ser, raw_ser): class DistinctPer(ColAnalysis): - provides_summary = ["distinct_per"] + provides_defaults = {'distinct_per':0} requires_summary = ["len", "distinct_count"] @staticmethod @@ -56,4 +59,5 @@ def computed_summary(summary_dict): return {'distinct_per': summary_dict['distinct_count'] / summary_dict['len']} class DependsNoProvides(ColAnalysis): + provides_defaults = {} requires_summary = ["len"] diff --git a/tests/unit/histogram_test.py b/tests/unit/histogram_test.py new file mode 100644 index 000000000..fc5a931bf --- /dev/null +++ b/tests/unit/histogram_test.py @@ -0,0 +1,67 @@ +import pandas as pd +from buckaroo.pluggable_analysis_framework.analysis_management import ( + DfStats, produce_series_df, AnalysisPipeline) +from buckaroo.customizations.histogram import Histogram +from buckaroo.customizations.analysis import ( + TypingStats, ComputedDefaultSummaryStats, DefaultSummaryStats) + +INT_ARR = [33, 41, 11, 46, 42, 44, 31, 25, 16, 24, 26, 7, 19, 23, 20, 46, 10, + 4, 31, 45, 40, 37, 48, 21, 19, 20, 19, 14, 14, 26, 36, 24, 21, 41, + 19, 17, 24, 27, 32, 30, 19, 49, 22, 20, 16, 7, 45, 10, 23, 44, 28, + 44, 15, 29, 34, 3, 44, 19, 20, 27, 1, 35, 34, 42, 12, 9, 21, 32, + 40, 41, 49, 47, 16, 25, 20, 11, 28, 13, 30, 6, 34, 16, 37, 21, 7, + 34, 34, 29, 24, 2, 7, 17, 13, 22, 13, 32, 11, 24, 24, 31, 11, 9, + 39, 40, 36, 20, 46, 31, 37, 27, 25, 9, 27, 41, 13, 35, 33, 24, 8, + 25, 12, 28, 26, 17, 7, 18, 12, 6, 45, 42, 32, 38, 31, 25, 33, 13, + 24, 23, 40, 18, 33, 42, 7, 40, 48, 29, 27, 13, 38, 35, 33, 24, 40, + 19, 47, 38, 8, 3, 6, 48, 9, 17, 13, 46, 6, 3, 34, 43, 6, 9, + 28, 4, 49, 10, 14, 36, 48, 39, 1, 37, 41, 37, 43, 43, 6, 23, 6, + 30, 27, 11, 19, 19, 34, 14, 37, 42, 15, 6, 48, 32] + +test_df = pd.DataFrame({'a': INT_ARR}) + +def _assert_ha(ha): + assert ha['low_tail'] == 1.99 + assert ha['high_tail'] == 49.0 + + assert ha['normalized_populations'] == [ + 0.07179487179487179, 0.1076923076923077, 0.08205128205128205, 0.1282051282051282, + 0.09743589743589744, 0.1076923076923077, 0.1282051282051282, 0.07692307692307693, + 0.1076923076923077, 0.09230769230769231] + #numpy arrays need special comparison that I will look at later + + # assert ha['meat_histogram'] == ( + # np.array([14, 21, 16, 25, 19, 21, 25, 15, 21, 18]), + # np.array([ 2. , 6.6, 11.2, 15.8, 20.4, 25. , 29.6, 34.2, 38.8, 43.4, 48. ])) + + +def test_produce_series_df(): + """just make sure this doesn't fail""" + sdf, errs = produce_series_df( + test_df, [Histogram], 'test_df', debug=True) + ha = sdf['a']['histogram_args'] + _assert_ha(ha) + +def test_full_produce_summary_df(): + sdf, errs = AnalysisPipeline.full_produce_summary_df(test_df, [Histogram], debug=True) + ha = sdf['a']['histogram_args'] + _assert_ha(ha) + +def test_full_produce_summary_df2(): + sdf, errs = AnalysisPipeline.full_produce_summary_df( + test_df, + [TypingStats, ComputedDefaultSummaryStats, Histogram, DefaultSummaryStats], + debug=True) + ha = sdf['a']['histogram_args'] + _assert_ha(ha) + +def test_dfstats_histogram(): + stats = DfStats( + test_df, + [TypingStats, ComputedDefaultSummaryStats, Histogram, DefaultSummaryStats], + 'test_df', debug=True) + sdf = stats.sdf + + print(sdf['a']) + ha = sdf['a']['histogram_args'] + _assert_ha(ha) diff --git a/tests/unit/perf_regression_test.py b/tests/unit/perf_regression_test.py index 755b4ff68..94a4dcee2 100644 --- a/tests/unit/perf_regression_test.py +++ b/tests/unit/perf_regression_test.py @@ -3,10 +3,15 @@ import buckaroo import time -def float_df(N,K): +def float_df(N_rows, K_columns): return pd.DataFrame( - {chr(i+97): np.random.random_sample(N) for i in range(K)}) + {chr(i+97): np.random.random_sample(N_rows) for i in range(K_columns)}) + +""" +The idea of this is to make a relative timing comparison between just insantiating a dataframe and the full buckaroo testing. it's crude but should alert to major performance regressions. particularly with json serialization + +""" # %timeit float_df(100_000,20) 9ms on my laptop def bw_do_stuff(df, **kwargs): @@ -41,7 +46,7 @@ def test_basic_instantiation(): bw_end2 = time.time() bw_time_2 = bw_end2 - bw_start2 - assert bw_time_2 < np_time * 50 + assert bw_time_2 < np_time * 60 diff --git a/tests/unit/pluggable_analysis_framework_test.py b/tests/unit/pluggable_analysis_framework_test.py index 0e49bc8a2..f05c67e83 100644 --- a/tests/unit/pluggable_analysis_framework_test.py +++ b/tests/unit/pluggable_analysis_framework_test.py @@ -8,29 +8,29 @@ from .fixtures import (DistinctCount, Len, DistinctPer, DCLen, DependsNoProvides) class NoRoute(ColAnalysis): - provides_summary = ['not_used'] + provides_defaults = {'not_used': False} requires_summary = ["does_not_exist"] class CycleA(ColAnalysis): - provides_summary = ['cycle_a'] + provides_defaults = {'cycle_a': 'asdf'} requires_summary = ["cycle_b"] class CycleB(ColAnalysis): - provides_summary = ['cycle_b'] + provides_defaults = {'cycle_b': 'foo'} requires_summary = ["cycle_a"] class CA_AB(ColAnalysis): - provides_summary = ["a", "b"] + provides_summary = {"a":0, "b":99} class CA_CD(ColAnalysis): - provides_summary = ["c", "d"] + provides_summary = {"c":3, "d":1} class CA_EF(ColAnalysis): - provides_summary = ["e", "f"] + provides_defaults = {"e":9, "f":2} requires_summary = ["a", "b", "c", "d"] class CA_G(ColAnalysis): - provides_summary = ["g"] + provides_defaults = {"g":3} requires_summary = ["e"] @@ -53,7 +53,7 @@ def test_multiple_provides(self): [DCLen, DistinctPer]) self.assertEqual( order_analysis([CA_G, CA_CD, CA_AB, CA_EF]), - [CA_CD, CA_AB, CA_EF, CA_G]) + [CA_CD, CA_AB, CA_EF, CA_G ]) #note the order between CA_CD and CA_AB doesn't matter - # as long as they occur before other classes diff --git a/tests/unit/polars_analysis_management_test.py b/tests/unit/polars_analysis_management_test.py index 592e21297..621572e7c 100644 --- a/tests/unit/polars_analysis_management_test.py +++ b/tests/unit/polars_analysis_management_test.py @@ -1,8 +1,7 @@ -from unittest import TestCase - import polars as pl import numpy as np from polars import functions as F +import polars.selectors as cs from buckaroo.customizations.polars_analysis import ( VCAnalysis, PlTyping, BasicAnalysis, HistogramAnalysis, ComputedDefaultSummaryStats) @@ -10,14 +9,12 @@ from buckaroo.pluggable_analysis_framework.utils import (json_postfix, replace_in_dict) from buckaroo.pluggable_analysis_framework.polars_analysis_management import ( - full_produce_summary_df, - produce_series_df, PolarsAnalysis, extract_table_hint) + PolarsAnalysisPipeline, polars_produce_series_df, PolarsAnalysis, PlDfStats) test_df = pl.DataFrame({ 'normal_int_series' : pl.Series([1,2,3,4]), #'empty_na_ser' : pl.Series([pl.Null] * 4, dtype="Int64"), - 'float_nan_ser' : pl.Series([3.5, np.nan, 4.8, 2.2]) - }) + 'float_nan_ser' : pl.Series([3.5, np.nan, 4.8, 2.2])}) word_only_df = pl.DataFrame({'letters': 'h o r s e'.split(' ')}) @@ -29,17 +26,33 @@ class SelectOnlyAnalysis(PolarsAnalysis): - + provides_defaults = {} select_clauses = [ F.all().null_count().name.map(json_postfix('null_count')), F.all().mean().name.map(json_postfix('mean')), F.all().quantile(.99).name.map(json_postfix('quin99'))] +def test_non_full_analysis(): + class MixedAnalysis(PolarsAnalysis): + provides_defaults = dict( + empty_count=0, sum=0) + + select_clauses = [ + F.col(pl.Utf8).str.count_matches("^$").sum().name.map(json_postfix('empty_count')), + cs.numeric().sum().name.map(json_postfix('sum'))] + + df = pl.DataFrame({'a': [10, 20], 'b': ['', 'bar']}) + + pdf = PlDfStats(df, [MixedAnalysis]) + assert pdf.sdf == {'a': dict(empty_count=0, sum=30), + 'b': dict(empty_count=1, sum=0)} + + def test_produce_series_df(): """just make sure this doesn't fail""" - sdf, errs = produce_series_df( + sdf, errs = polars_produce_series_df( test_df, [SelectOnlyAnalysis], 'test_df', debug=True) expected = { 'float_nan_ser': {'mean': None, 'null_count': 0, 'quin99': None}, @@ -48,12 +61,13 @@ def test_produce_series_df(): assert dsdf == expected class MaxAnalysis(PolarsAnalysis): + provides_defaults = {} select_clauses = [F.all().max().name.map(json_postfix('max'))] def test_produce_series_combine_df(): """just make sure this doesn't fail""" - sdf, errs = produce_series_df( + sdf, errs = polars_produce_series_df( test_df, [SelectOnlyAnalysis, MaxAnalysis], 'test_df', debug=True) expected = { 'float_nan_ser': {'mean': None, 'null_count': 0, 'quin99': None, 'max': 4.8}, @@ -62,41 +76,43 @@ def test_produce_series_combine_df(): dsdf = replace_in_dict(sdf, [(np.nan, None)]) assert dsdf == expected + + def test_produce_series_column_ops(): mixed_df = pl.DataFrame( {'string_col': ["foo", "bar", "baz"] + [""]*2, 'int_col':[1,2,3,30, 100], 'float_col':[1.1, 1.1, 3, 3, 5]}) - summary_df, _unused = produce_series_df(mixed_df, [HistogramAnalysis]) - assert summary_df["string_col"] == {} + summary_df, _unused = polars_produce_series_df(mixed_df, [HistogramAnalysis]) + assert summary_df["string_col"] == {'categorical_histogram': [], 'histogram': [], 'histogram_bins': []} assert summary_df["int_col"]["histogram_args"]["meat_histogram"] == ( [2, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1.0, 4.0, 7.0, 10.0, 13.0, 16.0, 19.0, 22.0, 25.0, 28.0, 100.0],) + -HA_CLASSES = [VCAnalysis, PlTyping, BasicAnalysis, ComputedDefaultSummaryStats, HistogramAnalysis] +HA_CLASSES = [VCAnalysis, PlTyping, BasicAnalysis, ComputedDefaultSummaryStats, HistogramAnalysis] def test_histogram_analysis(): cats = [chr(x) for x in range(97, 102)] * 2 cats += [chr(x) for x in range(103,113)] cats += ['foo']*30 + ['bar'] * 50 df = pl.DataFrame({'categories': cats, 'numerical_categories': [3]*30 + [7] * 70}) - summary_df, _unused, errs = full_produce_summary_df(df, HA_CLASSES, debug=True) + + summary_df, errs = PolarsAnalysisPipeline.full_produce_summary_df(df, HA_CLASSES, debug=True) actual_cats = summary_df["categories"]["categorical_histogram"] expected_cats = {'bar': 0.5, 'foo': 0.3, 'longtail': 0.1, 'unique': 0.1} assert actual_cats == expected_cats - actual_numcats = summary_df["numerical_categories"]["categorical_histogram"] - rounded_actual_numcats = dict([(k, np.round(v,2)) for k,v in actual_numcats.items()]) expected_categorical_histogram = {3:.3, 7:.7, 'longtail': 0.0, 'unique': 0.0} assert rounded_actual_numcats == expected_categorical_histogram - + def test_numeric_histograms(): #np.random.standard_normal(50) #note the negative numbers @@ -128,8 +144,8 @@ def test_numeric_histograms(): 'int_col': int_arr, 'int_col2': int_arr2 }) - - summary_df, _unused, errs = full_produce_summary_df(df, HA_CLASSES, debug=True) + + summary_df, errs = PolarsAnalysisPipeline.full_produce_summary_df(df, HA_CLASSES, debug=True) print(summary_df['int_col']['histogram']) expected_float_histogram = [ @@ -142,6 +158,10 @@ def test_numeric_histograms(): {'name': '1.87998263 - 1.87998263', 'tail': 1}] assert summary_df['float_col']['histogram'] == expected_float_histogram + assert summary_df["int_col"]["histogram_bins"] == [ + -272.0, -199.0, -158.0, -117.0, -76.0, + -35.0, 6.0, 47.0, 88.0, 129.0, 174.0] + expected_int_histogram = [ {'name': '-272 - -272.0', 'tail': 1}, {'name': '-272--199', 'population': 4.0}, {'name': '-199--158', 'population': 0.0}, @@ -154,25 +174,14 @@ def test_numeric_histograms(): -def test_extract_table_hint(): - - summary_dict = {'a': {'null_count': 0, - 'mean': 35.0, - 'max': 100, - 'min': 2, - 'is_numeric': True, - '_type': 'integer', - 'type': 'integer'} - } - - - expected = { - 'a': { - 'type':'integer', - 'is_numeric': True, - 'is_integer': None, - 'min_digits':None, - 'max_digits':None, - 'formatter':None, - 'histogram': []}} - TestCase().assertDictEqual(expected, extract_table_hint(summary_dict, ['a'])) +def test_pl_typing(): + + class AdaptingStylingAnalysis(PolarsAnalysis): + provides_defaults = {} + requires_summary = ["histogram", "is_numeric", "dtype", "is_integer"] + + PlDfStats(df, + [AdaptingStylingAnalysis, PlTyping, HistogramAnalysis, + BasicAnalysis, VCAnalysis, + ComputedDefaultSummaryStats]) + diff --git a/tests/unit/polars_analysis_tests.py b/tests/unit/polars_analysis_tests.py new file mode 100644 index 000000000..e76fc45bc --- /dev/null +++ b/tests/unit/polars_analysis_tests.py @@ -0,0 +1,59 @@ + +import polars as pl +import numpy as np +from polars import functions as F + +from buckaroo.pluggable_analysis_framework.utils import (json_postfix, replace_in_dict) + +from buckaroo.pluggable_analysis_framework.polars_analysis_management import ( + polars_produce_series_df, PolarsAnalysis) + +from buckaroo.pluggable_analysis_framework.polars_analysis_management import PlDfStats +from buckaroo.customizations.polars_analysis import BasicAnalysis, VCAnalysis + + +class SelectOnlyAnalysis(PolarsAnalysis): + + select_clauses = [ + F.all().null_count().name.map(json_postfix('null_count')), + F.all().mean().name.map(json_postfix('mean')), + F.all().quantile(.99).name.map(json_postfix('quin99'))] + + +def test_produce_series_df(): + """just make sure this doesn't fail""" + test_df = pl.DataFrame({ + 'normal_int_series' : pl.Series([1,2,3,4]), + #'empty_na_ser' : pl.Series([pl.Null] * 4, dtype="Int64"), + 'float_nan_ser' : pl.Series([3.5, np.nan, 4.8, 2.2]) + }) + + sdf, errs = polars_produce_series_df( + test_df, [SelectOnlyAnalysis], 'test_df', debug=True) + expected = { + 'float_nan_ser': {'mean': None, 'null_count': 0, 'quin99': None}, + 'normal_int_series': {'mean': 2.5, 'null_count': 0, 'quin99': 4.0}} + dsdf = replace_in_dict(sdf, [(np.nan, None)]) + assert dsdf == expected + + +def test_struct(): + """ + structs have caused hard to debug errors. Make sure they are properly tested + """ + ser = pl.Series([{'a':5}]) + df = pl.DataFrame({'b': ser, 'normal': [4]}) + dfs = PlDfStats(df, [VCAnalysis, BasicAnalysis], debug=True) + print(dfs.sdf) + assert dfs.errs == {} + + +''' + +word_only_df = pl.DataFrame({'letters': 'h o r s e'.split(' ')}) + +df = pl.read_csv('./examples/data/2014-01-citibike-tripdata.csv') + +empty_df = pl.DataFrame({}) +#empty_df_with_columns = pl.DataFrame({}, columns=[0]) +''' diff --git a/tests/unit/polars_basic_widget_test.py b/tests/unit/polars_basic_widget_test.py index 8b34d0de9..ea02e0d8b 100644 --- a/tests/unit/polars_basic_widget_test.py +++ b/tests/unit/polars_basic_widget_test.py @@ -1,16 +1,218 @@ import polars as pl - -from buckaroo import polars_buckaroo +from polars import functions as F +import numpy as np +from buckaroo.pluggable_analysis_framework.polars_analysis_management import ( + PolarsAnalysis, polars_produce_series_df) +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ( + ColAnalysis) +from buckaroo.pluggable_analysis_framework.utils import (json_postfix) +from buckaroo.polars_buckaroo import PolarsBuckarooWidget +from buckaroo.dataflow import StylingAnalysis def test_basic_instantiation(): - polars_buckaroo.PolarsBuckarooWidget( - pl.DataFrame({'a':[1,2,3]}), auto_clean=False) + PolarsBuckarooWidget( + pl.DataFrame({'a':[1,2,3]})) + + +EXPECTED_DF_VIEWER_CONFIG = { + 'pinned_rows': [], + 'column_config': [ + {'col_name': 'index', 'displayer_args': {'displayer': 'obj'}}, + {'col_name': 'normal_int_series', 'displayer_args': {'displayer': 'obj'}}]} + +class SelectOnlyAnalysis(PolarsAnalysis): + + select_clauses = [ + F.all().null_count().name.map(json_postfix('null_count')), + F.all().mean().name.map(json_postfix('mean')), + F.all().quantile(.99).name.map(json_postfix('quin99'))] + +test_df = pl.DataFrame({ + 'normal_int_series' : pl.Series([1,2,3,4]), +}) + + + +def test_polars_all_stats(): + """the all_stats verify that PolarsBuckarooWidget produces the + same summary_stats shape tatha pandas does. + + Since polars doesn't have an index concept, some things are a little different, but the summary_stats display essentiall depends on the index being present and displayed + + """ + + sdf, errs = polars_produce_series_df( + test_df, [SelectOnlyAnalysis], 'test_df', debug=True) + expected = { + 'normal_int_series': {'mean': 2.5, 'null_count': 0, 'quin99': 4.0}} + #dsdf = replace_in_dict(sdf, [(np.nan, None)]) + class SimplePolarsBuckaroo(PolarsBuckarooWidget): + analysis_klasses= [SelectOnlyAnalysis, StylingAnalysis] + + spbw = SimplePolarsBuckaroo(test_df) + assert spbw.merged_sd == expected + + assert spbw.df_data_dict['all_stats'] == [ + {'index': 'mean', 'normal_int_series': 2.5}, + {'index': 'null_count', 'normal_int_series': 0.0}, + {'index': 'quin99', 'normal_int_series': 4.0}] + assert spbw.df_display_args['main']['df_viewer_config'] == EXPECTED_DF_VIEWER_CONFIG + +def test_pandas_all_stats(): + """just make sure this doesn't fail""" + from buckaroo.buckaroo_widget import BuckarooWidget + from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) + import pandas as pd + + pd_test_df = pd.DataFrame({ + 'normal_int_series' : pl.Series([1,2,3,4]), + #'empty_na_ser' : pl.Series([pl.Null] * 4, dtype="Int64"), + #'float_nan_ser' : pl.Series([3.5, np.nan, 4.8, 2.2]) + }) + + + class SimpleAnalysis(ColAnalysis): + provides_defaults = {} + requires_raw = True + provides_series_stats = ["distinct_count"] + + @staticmethod + def series_summary(sampled_ser, raw_ser): + return dict( + null_count=0, + mean=2.5, + quin99=4.0) + + class SimpleBuckaroo(BuckarooWidget): + analysis_klasses= [SimpleAnalysis, StylingAnalysis] + + sbw = SimpleBuckaroo(pd_test_df) + assert sbw.merged_sd == { + 'index': {'mean': 2.5, 'null_count': 0, 'quin99': 4.0}, + 'normal_int_series': {'mean': 2.5, 'null_count': 0, 'quin99': 4.0}} + assert sbw.df_display_args['main']['df_viewer_config'] == EXPECTED_DF_VIEWER_CONFIG + + + +def test_object_dtype1(): + """ + originally I thought that these errors with objects in polars were caused by just doing something dumb with polars... + But the first two lines run fine, something happens inside of PolarsBuckarooWidget + + I think the problme is related to type coercion or serialization + """ + ser = pl.Series([{'a':5}]) + df = pl.DataFrame({'b': ser}) + PolarsBuckarooWidget(df) + +def Xtest_object_dtype2(): + + ser = pl.Series([{'a':5}], dtype=pl.Object) + df = pl.DataFrame({'b': ser}) + PolarsBuckarooWidget(df) + + + # I eventually wanted to test non regular object like this + # ser = pl.Series([ + # {'level_1': {'a':10}}, None], dtype=pl.Object) + # df = pl.DataFrame({'nested_dicts2': ser}) + +def test_weird(): +# RAW = { +# 'names': ['all_NA', 'half_NA','longtail', 'longtail_unique'], +# 'histo': [ +# [{'name': 'NA', 'NA': 100.0}], +# [{'name': 1, 'cat_pop': 46.0}, {'name': 'NA', 'NA': 54.0}], +# [{'name': 'long_30', 'cat_pop': 0.0}, {'name': 'long_15', 'cat_pop': 0.0}, +# {'name': 'long_29', 'cat_pop': 0.0}, {'name': 'long_184', 'cat_pop': 0.0}, +# {'name': 'long_101', 'cat_pop': 0.0}, {'name': 'long_48', 'cat_pop': 0.0}, +# {'name': 'long_123', 'cat_pop': 0.0}, {'name': 'longtail', 'longtail': 77.0}, +# {'name': 'NA', 'NA': 20.0}], +# [ +# {'name': 'long_120', 'cat_pop': 0.0}, {'name': 'long_41', 'cat_pop': 0.0}, +# {'name': 'long_0', 'cat_pop': 0.0}, {'name': 'long_32', 'cat_pop': 0.0}, +# {'name': 'long_44', 'cat_pop': 0.0}, {'name': 'long_113', 'cat_pop': 0.0}, +# {'name': 'long_22', 'cat_pop': 0.0}, +# {'name': 'longtail', 'unique': 50.0, 'longtail': 47.0}]]} + +# pl_histo = pl.DataFrame(RAW) +# pl_histo + +# RAW = ​ { +# 'all_NA': [{'name': 'NA', 'NA': 100.0}], +# 'half_NA': [{'name': 1, 'cat_pop': 46.0}, {'name': 'NA', 'NA': 54.0}], +# 'longtail': [{'name': 'long_30', 'cat_pop': 0.0}, {'name': 'long_15', 'cat_pop': 0.0}, +# {'name': 'long_29', 'cat_pop': 0.0}, {'name': 'long_184', 'cat_pop': 0.0}, +# {'name': 'long_101', 'cat_pop': 0.0}, {'name': 'long_48', 'cat_pop': 0.0}, +# {'name': 'long_123', 'cat_pop': 0.0}, {'name': 'longtail', 'longtail': 77.0}, +# {'name': 'NA', 'NA': 20.0}], +# 'longtail_unique': [ +# {'name': 'long_120', 'cat_pop': 0.0}, {'name': 'long_41', 'cat_pop': 0.0}, +# {'name': 'long_0', 'cat_pop': 0.0}, {'name': 'long_32', 'cat_pop': 0.0}, +# {'name': 'long_44', 'cat_pop': 0.0}, {'name': 'long_113', 'cat_pop': 0.0}, +# {'name': 'long_22', 'cat_pop': 0.0}, +# {'name': 'longtail', 'unique': 50.0, 'longtail': 47.0}]} + + RAW = {'names': ['all_NA', 'half_NA'], + 'histo': [ + [{'name': 'NA', 'NA': 100.0}], + [{'name': 1, 'cat_pop': 46.0}, {'name': 'NA', 'NA': 54.0}]]} + pl_histo = pl.DataFrame(RAW) + + PolarsBuckarooWidget(pl_histo) + +class ValueCountPostProcessing(PolarsAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + result_df = df.select( + F.all().value_counts().implode().list.gather(pl.arange(0, 10), null_on_oob=True).explode().struct.rename_fields(['val', 'unused_count']).struct.field('val').prefix('val_'), + F.all().value_counts().implode().list.gather(pl.arange(0, 10), null_on_oob=True).explode().struct.field('count').prefix('count_')) + return [result_df, {}] + post_processing_method = "value_counts" + + +class TransposeProcessing(ColAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + return [df.transpose(), {}] + post_processing_method = "transpose" + +class ShowErrorsPostProcessing(PolarsAnalysis): + provides_defaults = {} + @classmethod + def post_process_df(kls, df): + print("^"*80) + print(type(df)) + df.select + result_df = df.select( + F.all(), + pl.col('float_col').lt(5).replace(True, "foo").replace(False, None).alias('errored_float')) + return [result_df, {}] + + post_processing_method = "show_errors" -def test_sdf_hints(): - pbw = polars_buckaroo.PolarsBuckarooWidget( - pl.DataFrame({'a':[1,2,3]}), auto_clean=False, debug=True) - assert pbw.stats.sdf['a']['type'] == 'integer' +ROWS = 5 +typed_df = pl.DataFrame( + {'int_col':np.random.randint(1,50, ROWS), 'float_col': np.random.randint(1,30, ROWS)/.7, + 'timestamp':["2020-01-01 01:00Z", "2020-01-01 02:00Z", + "2020-02-28 02:00Z", "2020-03-15 02:00Z", None], + "str_col": ["foobar", "Realllllly long string", "", None, "normal"]}) +typed_df = typed_df.with_columns(timestamp=pl.col('timestamp').str.to_datetime() ) +column_config_overrides={'float_col': {'color_map_config': { + 'color_rule': 'color_not_null', + 'conditional_color': 'red', 'exist_column': 'errored_float'}}} + +def test_polars_to_pandas(): + bw = PolarsBuckarooWidget(typed_df) + bw.add_analysis(ShowErrorsPostProcessing) + + temp_buckaroo_state = bw.buckaroo_state.copy() + temp_buckaroo_state['post_processing'] = 'show_errors' + bw.buckaroo_state = temp_buckaroo_state + ''' FIXME:test a large dataframe that forces sampling ''' diff --git a/tests/unit/serialization_pydantic_tests.py b/tests/unit/serialization_pydantic_tests.py index 9673f26ba..ec5717828 100644 --- a/tests/unit/serialization_pydantic_tests.py +++ b/tests/unit/serialization_pydantic_tests.py @@ -1,7 +1,5 @@ import time import json -import pytest -from pydantic import ValidationError import pandas as pd import numpy as np from buckaroo.serialization_utils import df_to_obj @@ -16,16 +14,6 @@ -# class BaseFormField(pydantic.BaseModel, ABC, defer_build=True): -# name: str -# title: str | list[str] -# required: bool = False -# error: str | None = None -# locked: bool = False -# description: str | None = None -# class_name: _class_name.ClassName = None - - class HistogramModel(pydantic.BaseModel): name: str population: float @@ -33,69 +21,198 @@ class HistogramModel(pydantic.BaseModel): HT = Optional[List[HistogramModel]] -# export interface ColumnStringHint { -# type: 'string'; -# histogram?: any[]; -# } +class ObjDisplayerA(pydantic.BaseModel): + displayer: Literal["obj"] -class ColumnStringHint(pydantic.BaseModel): - type: Literal["string"] - histogram: HT +class BooleanDisplayerA(pydantic.BaseModel): + displayer: Literal["boolean"] -class ColumnObjHint(pydantic.BaseModel): - type: Literal["obj"] - histogram: HT +class StringDisplayerA(pydantic.BaseModel): + displayer: Literal["string"] + #max_length: int -# export interface ColumnBooleanHint { -# type: 'boolean'; -# histogram?: any[]; -# } +class FloatDisplayerA(pydantic.BaseModel): + displayer: Literal["float"] -class ColumnBooleanHint(pydantic.BaseModel): - type: Literal["boolean"] - histogram: HT +class DatetimeDefaultDisplayerA(pydantic.BaseModel): + displayer: Literal["datetimeDefault"] -# export interface ColumnIntegertHint { -# type: 'integer'; -# min_digits: number; -# max_digits: number; -# histogram: any[]; -# } +class IntegerDisplayerA(pydantic.BaseModel): + displayer: Literal["integer"] + min_digits: int + max_digits: int -class ColumnIntegerHint(pydantic.BaseModel): - type: Literal["integer"] - min_digits:int - max_digits:int - histogram: HT +class DatetimeLocaleDisplayerA(pydantic.BaseModel): + displayer: Literal["datetimeLocaleString"] + locale: Union[ + *map(lambda x: Literal[x], + ['en-US', 'en-GB', 'en-CA', 'fr-FR', 'es-ES', 'de-DE', 'ja-JP'])] + args: str # start with a dictionary, not sure of full typing + #args: Intl.DateTimeFormatOptions; -class DFColumn(pydantic.BaseModel): - name: str - type: str #should be a union +#End FormatterArgs -ColumnHint = Union[ColumnStringHint, ColumnObjHint, ColumnBooleanHint, ColumnIntegerHint] +# Begin CellRenderArgs +class HistogramDisplayerA(pydantic.BaseModel): + displayer: Literal["histogram"] -class DFSchema(pydantic.BaseModel): - fields: List[DFColumn] - primaryKey: list[str] #; //['index'] - pandas_version: str #; //'1.4.0', +class LinkifyDisplayerA(pydantic.BaseModel): + displayer: Literal["linkify"] -# export type DFDataRow = Record< -# string, -# string | number | boolean | any[] | Record | null -# >; +# Internally DfViewer distinguishes between FormatterArgs and +# CellRendererArgs because they are sent to different functions, but to +# the python side, that is just an implmentation detail -# export type DFData = DFDataRow[]; +DisplayerArgs = Union[ + #formatters + ObjDisplayerA, BooleanDisplayerA, StringDisplayerA, FloatDisplayerA, DatetimeDefaultDisplayerA, + IntegerDisplayerA, DatetimeLocaleDisplayerA, + #Cell Renderers + HistogramDisplayerA, LinkifyDisplayerA] + +class ColorMapRules(pydantic.BaseModel): + color_rule: Literal['color_map'] + map_name: Union[Literal['BLUE_TO_YELLOW'], Literal['DIVERGING_RED_WHITE_BLUE']] + val_column: Optional[str] + +class ColorWhenNotNullRules(pydantic.BaseModel): + color_rule: Literal['color_not_null'] + conditional_color: Union[str, Literal['red']] + exist_column: str + +class ColorFromColumn(pydantic.BaseModel): + color_rule: Literal['color_from_column'] + col_name: str + +ColorMappingConfig = Union[ColorMapRules, ColorWhenNotNullRules, ColorFromColumn] + +class SimpleToolTip(pydantic.BaseModel): + tooltip_type: Literal['simple'] + val_column: str + +class SummarySeriesTooltip(pydantic.BaseModel): + tooltip_type: Literal['summary_series'] + +TooltipConfig = Union[SimpleToolTip, SummarySeriesTooltip] -DFData = List[Dict[str, Union[str, int, float, None]]] +class ColumnConfig(pydantic.BaseModel): + col_name: str + displayer_args: DisplayerArgs + color_map_config: Optional[ColorMappingConfig] + tooltip_config: Optional[TooltipConfig] +class ColorMapRules(pydantic.BaseModel): + color_rule: Literal['color_map'] + map_name: Union[Literal['BLUE_TO_YELLOW'], Literal['DIVERGING_RED_WHITE_BLUE']] + val_column: Optional[str] + +class LinkifyDisplayerA(pydantic.BaseModel): + displayer: Literal["linkify"] + + +class PinnedRowConfig(pydantic.BaseModel): + primary_key_val: str + displayer_args: DisplayerArgs + + +class DFViewerConfig(pydantic.BaseModel): + pinned_rows: List[PinnedRowConfig] + column_config: List[ColumnConfig] + +DFData = List[Dict[str, Union[str, int, float, None]]] class DFWhole(pydantic.BaseModel): - schema__ :DFSchema = pydantic.Field(alias='schema') - table_hints: Dict[str, ColumnHint] + dfviewer_config: DFViewerConfig data: DFData + +class DFMeta(pydantic.BaseModel): + """ + stats as calculated about the underlying dataframe. + Static, these don't change regardless of modification to the dataframe via styling or cleaning + """ + total_rows: int + columns: int + rows_shown: int + +class BuckarooOptions(pydantic.BaseModel): + """ + Buckaroo is opinionated. Each of these represent an opinion about an aspect of buckaroo. + The idea being that different opinions can be swapped through by the frontend + """ + df_list: List[str] #defaults to "base_df" + sampled: List[str] # sampling strategies + #maybe add "base_df" as an always present option... but also maybe + #not. PL_Compare won't really use it + summary_stats: List[str] + auto_clean: List[str] # which cleaning strategy + #reorderd_columns: List[str] #strategy for reordering cloumns + #styling: List[str] # which column ordering strategy + +class BuckarooState(pydantic.BaseModel): + """ + Given BuckarooOptions, the current state of the frontend. each str + will be one of the list from BuckarooOptions + """ + displayed_df: Union[str, Literal['base_df']] + sampled: Union[str, False] + summary_stats: Union[str, False] + show_commands: bool + auto_clean: Union[str, False] + #reorderd_columns: Union[str, False] + #styling: Union[str, False] + +class WidgetOptions(pydantic.BaseModel): + + + #How is summary_dict['all'] pulled out from df_dict. DFViewer gets a dfwhole and a summary_df + df_dict: Dict[str, DFWhole] + df_meta: DFMeta + operations: List[any] # don't think I have typing yet + operation_results: any # don't have typing yet + commandConfig: any # casing, fix. not typing + buckaroo_state: BuckarooState + buckaroo_options: BuckarooOptions + + +""" +auto_clean, reorderd_columns and styling all poke at the same things, and I'm not sure the best way to pull it apart. + +The trickiest example is lat/long. + +imagine a dataframe with a lat column and a long column. + +This should be a 'location' tuple that combines the two columns and is displayed as a map or link to a map... +But editting/combining columns is a whole dataframe operation. Which currently slots it into auto_clean. + +For display only, this makes sense as a post processing step. + +For autocleaning, it makes sense as a 'foreign key recognition step'. for citibike data, start_station name, start_station_id, start_station_latitude, start_station_longitude should be replaced with a categorical linking to a 'station enum'. They should be displayed as either "start station name", a map, or a link to the map geo coordinates. + +For now, I will leave it ambiguous. I will also consider a post_processing_step that has the same interface as auto_clean (df in, df out). + +This same attribute could be manipulated via styling like so. +separate lat/long columns -> display separately +tuple column tagged lat/long in summary stats -> display as link to map +tuple column tagged lat/long in summary stats -> display as inline map +categorical to 3 valued tuple (name, lat/long, id) -> display name +categorical to 3 valued tuple (name, lat/long, id) -> display tuple inline nested +categorical to 3 valued tuple (name, lat/long, id) -> display as link to map +categorical to 3 valued tuple (name, lat/long, id) -> display as map + + +Given the above data processing should go +raw -> auto_clean (pre-processing) -> summary_stats -> post_processing -> styling -> overrides + +I would also like to be able to write partial processing classes that can be combined. So you could just write the lat/long combination into tuple, without having to rewrite a whole auto cleaning command. These could be composed by programmers (not end users initially). + + +""" + + + # class DfViewer(pydantic.BaseModel): # type: 'DFViewer' # df: DFWhole @@ -104,41 +221,43 @@ class DFWhole(pydantic.BaseModel): # #because I don't have any snake cased fields -def test_column_hints(): - ColumnStringHint(type="string", histogram=[]) - ColumnStringHint(type="string", histogram=[{'name':'foo', 'population':3500}]) - with pytest.raises(ValidationError) as exc_info: - errant_histogram_entry = {'name':'foo', 'no_population':3500} - ColumnStringHint(type="string", histogram=[errant_histogram_entry]) - assert exc_info.value.errors(include_url=False) == [ - {'type': 'missing', 'loc': ('histogram', 0, 'population'), - 'msg': 'Field required','input': errant_histogram_entry}] + + +# def test_column_hints(): +# ColumnStringHint(type="string", histogram=[]) +# ColumnStringHint(type="string", histogram=[{'name':'foo', 'population':3500}]) +# with pytest.raises(ValidationError) as exc_info: +# errant_histogram_entry = {'name':'foo', 'no_population':3500} +# ColumnStringHint(type="string", histogram=[errant_histogram_entry]) +# assert exc_info.value.errors(include_url=False) == [ +# {'type': 'missing', 'loc': ('histogram', 0, 'population'), +# 'msg': 'Field required','input': errant_histogram_entry}] - ColumnBooleanHint(type="boolean", histogram=[]) - -def test_column_hint_extra(): - """verify that we can pass in extra unexpected keys""" - ColumnStringHint(type="string", histogram=[], foo=8) - -def test_dfwhole(): - temp = {'schema': {'fields':[{'name':'foo', 'type':'integer'}], - 'primaryKey':['foo'], 'pandas_version':'1.4.0'}, - 'table_hints': {'foo':{'type':'string', 'histogram':[]}, - 'bar':{'type':'integer', 'min_digits':2, 'max_digits':4, 'histogram':[]}, - 'baz':{'type':'obj', 'histogram':[]}, - }, - 'data': [{'foo': 'hello', 'bar':8}, - {'foo': 'world', 'bar':10}]} - DFWhole(**temp) - -def test_df_to_obj_pydantic(): - named_index_df = pd.DataFrame( - dict(foo=['one', 'two', 'three'], - bar=[1, 2, 3])) - - serialized_df = df_to_obj(named_index_df) - print(json.dumps(serialized_df, indent=4)) - DFWhole(**serialized_df) +# ColumnBooleanHint(type="boolean", histogram=[]) + +# def test_column_hint_extra(): +# """verify that we can pass in extra unexpected keys""" +# ColumnStringHint(type="string", histogram=[], foo=8) + +# def test_dfwhole(): +# temp = {'schema': {'fields':[{'name':'foo', 'type':'integer'}], +# 'primaryKey':['foo'], 'pandas_version':'1.4.0'}, +# 'table_hints': {'foo':{'type':'string', 'histogram':[]}, +# 'bar':{'type':'integer', 'min_digits':2, 'max_digits':4, 'histogram':[]}, +# 'baz':{'type':'obj', 'histogram':[]}, +# }, +# 'data': [{'foo': 'hello', 'bar':8}, +# {'foo': 'world', 'bar':10}]} +# DFWhole(**temp) + +# def test_df_to_obj_pydantic(): +# named_index_df = pd.DataFrame( +# dict(foo=['one', 'two', 'three'], +# bar=[1, 2, 3])) + +# serialized_df = df_to_obj(named_index_df) +# print(json.dumps(serialized_df, indent=4)) +# DFWhole(**serialized_df) def bimodal(mean_1, mean_2, N, sigma=5): X1 = np.random.normal(mean_1, sigma, int(N/2)) diff --git a/tests/unit/serialization_utils_test.py b/tests/unit/serialization_utils_test.py index e3b331951..1d20d7a8b 100644 --- a/tests/unit/serialization_utils_test.py +++ b/tests/unit/serialization_utils_test.py @@ -1,5 +1,3 @@ -import pytest -from pydantic import BaseModel, ValidationError import pandas as pd from buckaroo.serialization_utils import df_to_obj @@ -8,17 +6,17 @@ def test_df_to_obj(): dict(names=['one', 'two', 'three'], values=[1, 2, 3])).set_index('names') - serialized_df = df_to_obj(named_index_df) + serialized_df = df_to_obj(named_index_df, {}) assert serialized_df['data'][0]['names'] == 'one' -def test_int_overflow_validation(): - value=float('nan') - class Model(BaseModel): - a: int - Model(a=3) - with pytest.raises(ValidationError) as exc_info: - Model(a=value) - assert exc_info.value.errors(include_url=False) == [ - {'type': 'finite_number', 'loc': ('a',), 'msg': 'Input should be a finite number', - 'input': value - }] +# def test_int_overflow_validation(): +# value=float('nan') +# class Model(BaseModel): +# a: int +# Model(a=3) +# with pytest.raises(ValidationError) as exc_info: +# Model(a=value) +# assert exc_info.value.errors(include_url=False) == [ +# {'type': 'finite_number', 'loc': ('a',), 'msg': 'Input should be a finite number', +# 'input': value +# }] diff --git a/tsconfig.json b/tsconfig.json index 3e9415ee4..6c65b16c1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "declaration": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, - "lib": ["es2015", "dom"], + "lib": ["es2019", "dom", "dom.iterable"], "module": "commonjs", "moduleResolution": "node", "noEmitOnError": true, diff --git a/yarn.lock b/yarn.lock index 58dd8598b..d69b4181d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2599,16 +2599,17 @@ acorn@^8.8.2: resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -ag-grid-community@^29.2.0, ag-grid-community@~29.3.5: - version "29.3.5" - resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.5.tgz" - integrity sha512-LxUo21f2/CH31ACEs1C7Q/ggGGI1fQPSTB4aY5OThmM+lBkygZ7QszBE8jpfgWOIjvjdtcdIeQbmbjkHeMsA7A== +ag-grid-community@^31.0.3, ag-grid-community@~31.0.3: + version "31.0.3" + resolved "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-31.0.3.tgz" + integrity sha512-k81YmLaOQOab9BavYD+Pw2smZSl6TXOJqj9hRuf70XQl3EknOHCGcra7joJxZRJLMKE/HdR+u33TNyX4TCuWfg== -ag-grid-react@^29.2.0: - version "29.3.5" - resolved "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-29.3.5.tgz" - integrity sha512-Eg0GJ8hEBuxdVaN5g+qITOzhw0MGL9avL0Oaajr+p7QRtq2pIFHLZSknWsCBzUTjidiu75WZMKwlZjtGEuafdQ== +ag-grid-react@^31.0.3: + version "31.0.3" + resolved "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-31.0.3.tgz" + integrity sha512-CE4Z5Rdb0H3MFBhmge9854AyDvI4DoG7ZoUJRFB1p2pu5ANVe6tv7cwEI/ugHemEXRRP6s5uvW+ndv0Q6x1/+Q== dependencies: + ag-grid-community "~31.0.3" prop-types "^15.8.1" aggregate-error@^3.0.0: From adc7c739e01bcc8d5db96b955caccd625e9c7bd5 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 9 Feb 2024 14:36:00 -0500 Subject: [PATCH 205/250] Chore/doc link fix (#215) Fixes a bug where docs referenced a non-existent part of the docs due to a merge to main --- docs/source/articles/pluggable.rst | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/docs/source/articles/pluggable.rst b/docs/source/articles/pluggable.rst index 8205a1ff4..b65198bb7 100644 --- a/docs/source/articles/pluggable.rst +++ b/docs/source/articles/pluggable.rst @@ -113,17 +113,3 @@ The pluggable analysis framework runs different functions on analysis functions 2. Run all of the ``summary`` methods and build the ``summary_df`` 3. extract table_hints from the ``summary_df`` -Table Hints -=========== - -Table hints are a subset of the complete summary dataframe. They are used to choose formatters, provide data for the histograms, and modify other display characteristics for the frontend table. Look at the `JS type hints `_ . Also note that table_hints are subject to change soon per this `bug report `_. - -Porting to polars -================= - -I would really like to be able to run these computations in lazy polars, there should be very significant speed increases. I think this stackoverflow answer might be the key... but I'm not sure https://stackoverflow.com/a/76560342 - - -For now I'm just focussing on writing the framework and making sure it works... I can make it fast later... I think. - -After further thought, I think I can make all of the base series calcs lazy with pl.struct. Then do all the other calcs in pure python (they should be fast). From dab0a70c0203713eaf1a976c1d393608b588ba75 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 12 Feb 2024 11:10:08 -0500 Subject: [PATCH 206/250] updated polars dependency, released 0.6.2 (#218) * updated polars dependency, released 0.6.2 * changes to Full-tour noteobok to work properly with polars 0.20.7 in google-colab --- buckaroo/_version.py | 2 +- docs/source/conf.py | 2 +- example-notebooks/Full-tour.ipynb | 11 +---------- package.json | 2 +- pyproject.toml | 4 ++-- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 8f6b3fa07..601c25b9a 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.6.1" +__version__ = "0.6.2" diff --git a/docs/source/conf.py b/docs/source/conf.py index 4b60d3606..642f4e09d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.6.1' +release = '0.6.2' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb index 40194ba0d..53fc7a6fd 100644 --- a/example-notebooks/Full-tour.ipynb +++ b/example-notebooks/Full-tour.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "outputs": [], "source": [ - "%pip install buckaroo\n", + "%pip install buckaroo[polars]\n", "try:\n", " from google.colab import output\n", " output.enable_custom_widget_manager()\n", @@ -228,15 +228,6 @@ "# Buckaroo also works on polars" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install --upgrade polars" - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/package.json b/package.json index 6c330863d..0049df73e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.6.1", + "version": "0.6.2", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index c030b0b91..47a76271f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.6.1" +version = "0.6.2" [project.license] file = "LICENSE.txt" @@ -53,7 +53,7 @@ test = [ "pydantic>=2.5.2", "pyarrow" ] -polars = ["polars>=0.20.2"] +polars = ["polars>=0.20.7"] jupyterlab = ["jupyterlab>=3.6.0"] notebook = ["notebook>=7.0.0"] From 768312cdee0f31ade681772437d7ddc61c8fa320 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Wed, 14 Feb 2024 18:56:27 -0500 Subject: [PATCH 207/250] Feat/pluggable-autocleaning-step-1 (#221) Makes management of lowcode JLisp interpreter, and autocleaning methods swappable like styling and postprocessing. Decided to sideline the full implementation for now because it is too involved... and polars makes some autocleaning functionality very difficult, particularly comparing original to modfified across different dtypes. This makes it much more difficult to color and add tooltips to the resulting dataframe based on modifications. Nothing is integrated into the main flow yet. This just makes the autocleaning module which will be integrated --- buckaroo/buckaroo_widget.py | 2 +- buckaroo/customizations/polars_analysis.py | 20 +- buckaroo/customizations/polars_commands.py | 37 +++- buckaroo/customizations/styling.py | 2 +- buckaroo/dataflow/__init__.py | 0 buckaroo/dataflow/autocleaning.py | 154 +++++++++++++++ buckaroo/{ => dataflow}/dataflow.py | 71 ++----- .../pluggable_analysis_framework/utils.py | 8 + buckaroo/polars_buckaroo.py | 2 +- js/components/ColumnsEditor.tsx | 33 ++-- js/components/DCFCell.tsx | 15 +- tests/unit/dataflow/autocleaning_test.py | 175 ++++++++++++++++++ .../dataflow/customizable_dataflow_test.py | 2 +- tests/unit/dataflow/dataflow_polars_test.py | 2 +- tests/unit/dataflow/dataflow_test.py | 9 +- tests/unit/polars_basic_widget_test.py | 2 +- 16 files changed, 438 insertions(+), 96 deletions(-) create mode 100644 buckaroo/dataflow/__init__.py create mode 100644 buckaroo/dataflow/autocleaning.py rename buckaroo/{ => dataflow}/dataflow.py (91%) create mode 100644 tests/unit/dataflow/autocleaning_test.py diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index ee7884977..f381c776b 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -22,7 +22,7 @@ from .pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis from .serialization_utils import EMPTY_DF_WHOLE -from .dataflow import CustomizableDataflow, StylingAnalysis, exception_protect +from .dataflow.dataflow import CustomizableDataflow, StylingAnalysis, exception_protect class BuckarooWidget(CustomizableDataflow, DOMWidget): diff --git a/buckaroo/customizations/polars_analysis.py b/buckaroo/customizations/polars_analysis.py index c3e62a057..54c90c137 100644 --- a/buckaroo/customizations/polars_analysis.py +++ b/buckaroo/customizations/polars_analysis.py @@ -54,8 +54,6 @@ def computed_summary(summary_dict): NOT_STRUCTS = (~PROBABLY_STRUCTS) class VCAnalysis(PolarsAnalysis): - - provides_defaults = dict( value_counts=pl.Series( "", @@ -210,7 +208,6 @@ class HistogramAnalysis(PolarsAnalysis): 'histogram_args': (NUMERIC_POLARS_DTYPES, normalize_polars_histogram_ser)} requires_summary = ['min', 'max', 'value_counts', 'length', 'unique_count', 'is_numeric', 'nan_per'] - provides_summary = ['categorical_histogram', 'histogram', 'histogram_bins'] provides_defaults = dict(categorical_histogram=[], histogram=[], histogram_bins=[]) @staticmethod @@ -235,6 +232,23 @@ def computed_summary(summary_dict): 'histogram_bins': ['faked'] } +class PLCleaningStats(PolarsAnalysis): + requires_summary = ['value_counts', 'length'] + provides_defaults = {'int_parse_fail': 0.0, 'int_parse':0.0} + + @staticmethod + def computed_summary(column_metadata): + vc_ser, len_ = column_metadata['value_counts'], column_metadata['length'] + vc_df = pl.DataFrame({'vc': vc_ser.explode()}).unnest('vc') + regular_col_vc_df = vc_df.select(pl.all().exclude('count').alias('key'), pl.col('count')) + int_parse = pl.col('key').cast(pl.Int64, strict=False).is_null() + per_df = regular_col_vc_df.select( + int_parse.replace({True:1, False:0}).mul(pl.col('count')).sum().alias('int_parse_fail'), + int_parse.replace({True:0, False:1}).mul(pl.col('count')).sum().alias('int_parse')) / len_ + return per_df.to_dicts()[0] + + PL_Analysis_Klasses = [VCAnalysis, BasicAnalysis, PlTyping, HistogramAnalysis, ComputedDefaultSummaryStats] + diff --git a/buckaroo/customizations/polars_commands.py b/buckaroo/customizations/polars_commands.py index 300786630..ea911fa0c 100644 --- a/buckaroo/customizations/polars_commands.py +++ b/buckaroo/customizations/polars_commands.py @@ -6,8 +6,15 @@ #from ..auto_clean.cleaning_commands import (to_bool, to_datetime, to_int, to_float, to_string) class Command(object): - pass - + @staticmethod + def transform(df, col, val): + return df.with_columns(pl.col(col).fill_null(val)) + return df + + @staticmethod + def transform_to_py(df, col, val): + return " df = df.with_columns(pl.col('%s').fill_null(%r))" % (col, val) + class FillNA(Command): #argument_names = ["df", "col", "fill_val"] command_default = [s('fillna'), s('df'), "col", 8] @@ -22,6 +29,32 @@ def transform(df, col, val): def transform_to_py(df, col, val): return " df = df.with_columns(pl.col('%s').fill_null(%r))" % (col, val) +class NoOp(Command): + #used for testing command stuff + command_default = [s('noop'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + return df + + @staticmethod + def transform_to_py(df, col): + return " #noop" + +class PlSafeInt(Command): + command_default = [s('safe_int'), s('df'), "col"] + command_pattern = [None] + + @staticmethod + def transform(df, col): + return df.with_columns(pl.col(col).cast(pl.Int64, strict=False)) + return df + + @staticmethod + def transform_to_py(df, col): + return " df = df.with_columns(pl.col('%s').cast(pl.Int64, strict=False))" % (col) + class DropCol(Command): #argument_names = ["df", "col"] command_default = [s('dropcol'), s('df'), "col"] diff --git a/buckaroo/customizations/styling.py b/buckaroo/customizations/styling.py index f7506ca28..bc10709b5 100644 --- a/buckaroo/customizations/styling.py +++ b/buckaroo/customizations/styling.py @@ -1,4 +1,4 @@ -from buckaroo.dataflow import StylingAnalysis +from buckaroo.dataflow.dataflow import StylingAnalysis from typing import Any def obj_(pkey): diff --git a/buckaroo/dataflow/__init__.py b/buckaroo/dataflow/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/buckaroo/dataflow/autocleaning.py b/buckaroo/dataflow/autocleaning.py new file mode 100644 index 000000000..10f4033db --- /dev/null +++ b/buckaroo/dataflow/autocleaning.py @@ -0,0 +1,154 @@ +import pandas as pd +from buckaroo.jlisp.lisp_utils import split_operations +from buckaroo.pluggable_analysis_framework.polars_analysis_management import PlDfStats +from ..customizations.all_transforms import configure_buckaroo, DefaultCommandKlsList + + +''' + + + def handle_ops_and_clean_orig(self, df, cleaning_method, existing_operations): + if self.sampled_df is None: + return None + cleaning_operations, cleaning_sd = self._run_cleaning(df, cleaning_method) + merged_operations = merge_ops(existing_operations, cleaning_operations) + cleaned_df = self._run_df_interpreter(df, merged_operations) + generated_code = self._run_code_generator(merged_operations) + self.cleaned [cleaned_df, cleaning_sd, generated_code, merged_operations] + + +''' +def dumb_merge_ops(existing_ops, cleaning_ops): + """ strip cleaning_ops from existing_ops, reinsert cleaning_ops at the beginning """ + a = existing_ops.copy() + a.extend(cleaning_ops) + return a + +SENTINEL_DF_1 = pd.DataFrame({'foo' :[10, 20], 'bar' : ["asdf", "iii"]}) +SENTINEL_DF_2 = pd.DataFrame({'col1' :[55, 55], 'col2': ["pppp", "333"]}) +SENTINEL_DF_3 = pd.DataFrame({'pp' :[99, 33], 'ee': [ 6, 9]}) +SENTINEL_DF_4 = pd.DataFrame({'vvv' :[12, 49], 'oo': [ 'ccc', 'www']}) + +class SentinelAutocleaning: + + def handle_ops_and_clean(self, df, cleaning_method, existing_operations): + cleaning_ops = [] + generated_code = "" + if cleaning_method == "one op": + cleaning_ops = [""] + generated_code = "codegen 1" + generated_code = "codegen 2" + elif cleaning_method == "two op": + cleaning_ops = ["", ""] + + merged_operations = dumb_merge_ops(existing_operations, cleaning_ops) + + if len(merged_operations) == 1: + cleaned_df = SENTINEL_DF_1 + elif len(merged_operations) == 2: + cleaned_df = SENTINEL_DF_2 + else: + cleaned_df = df + return [cleaned_df, {}, generated_code, merged_operations] + +def merge_ops(existing_ops, cleaning_ops): + """ strip cleaning_ops from existing_ops, reinsert cleaning_ops at the beginning """ + old_cleaning_ops, user_gen_ops = split_operations(existing_ops) + merged = cleaning_ops.copy() + merged.extend(user_gen_ops) + return merged + + + +def format_ops(column_meta): + ret_ops = [] + for k,v in column_meta.items(): + ops = v['cleaning_ops'] + if len(ops) > 0: + temp_ops = ops.copy() + temp_ops.insert(2, k) + ret_ops.append(temp_ops) + return ret_ops + +def make_origs(raw_df, cleaned_df): + clauses = [] + for col in raw_df.columns: + clauses.append(cleaned_df[col]) + clauses.append(raw_df[col].alias(col+"_orig")) + # clauses.append( + # pl.when((raw_df[col] - cleaned_df[col]).eq(0)).then(None).otherwise(raw_df[col]).alias(col+"_orig")) + ret_df = cleaned_df.select(clauses) + return ret_df + + +class AutocleaningConfig: + command_klasses = [DefaultCommandKlsList] + autocleaning_analysis_klasses = [] + + name = 'default' + + +class Autocleaning: + # def add_command(self, incomingCommandKls): + # without_incoming = [x for x in self.command_classes if not x.__name__ == incomingCommandKls.__name__] + # without_incoming.append(incomingCommandKls) + # self.command_klasses = without_incoming + # self.setup_from_command_kls_list() + + + def __init__(self, ac_configs): + + self.config_dict = {} + for conf in ac_configs: + self.config_dict[conf.name] = conf + #self._setup_from_command_kls_list() + + ### start code interpreter block + def _setup_from_command_kls_list(self, name): + #used to initially setup the interpreter, and when a command + #is added interactively + if name not in self.config_dict: + options = list(self.config_dict.keys()) + raise Exception( + "Unknown autocleaning conf of %s, available options are %r" % (name, options)) + conf = self.config_dict[name] + c_klasses, self.autocleaning_analysis_klasses = conf.command_klasses, conf.autocleaning_analysis_klasses + + c_defaults, c_patterns, df_interpreter, gencode_interpreter = configure_buckaroo(c_klasses) + self.df_interpreter, self.gencode_interpreter = df_interpreter, gencode_interpreter + self.commandConfig = dict(argspecs=c_patterns, defaultArgs=c_defaults) + #self.autocleaning_genops = filter_analysis(analysis_klasses, "autocleaning_ops") + + + def _run_df_interpreter(self, df, operations): + full_ops = [{'symbol': 'begin'}] + full_ops.extend(operations) + print("*"*80) + print(full_ops) + print("*"*80) + if len(full_ops) == 1: + return df + return self.df_interpreter(full_ops , df) + + def _run_code_generator(self, operations): + if len(operations) == 0: + return 'no operations' + return self.gencode_interpreter(operations) + + def _run_cleaning(self, df, cleaning_method): + dfs = PlDfStats(df, self.autocleaning_analysis_klasses, debug=True) + gen_ops = format_ops(dfs.sdf) + + cleaning_sd = {} + return gen_ops, cleaning_sd + + def handle_ops_and_clean(self, df, cleaning_method, existing_operations): + if df is None: + return None + self._setup_from_command_kls_list(cleaning_method) + cleaning_operations, cleaning_sd = self._run_cleaning(df, cleaning_method) + merged_operations = merge_ops(existing_operations, cleaning_operations) + cleaned_df = self._run_df_interpreter(df, merged_operations) + merged_cleaned_df = make_origs(df, cleaned_df) + generated_code = self._run_code_generator(merged_operations) + return [merged_cleaned_df, cleaning_sd, generated_code, merged_operations] diff --git a/buckaroo/dataflow.py b/buckaroo/dataflow/dataflow.py similarity index 91% rename from buckaroo/dataflow.py rename to buckaroo/dataflow/dataflow.py index b64433f98..550ebaf30 100644 --- a/buckaroo/dataflow.py +++ b/buckaroo/dataflow/dataflow.py @@ -3,10 +3,11 @@ import warnings import pandas as pd from traitlets import Unicode, Any, observe, HasTraits, Dict -from .serialization_utils import pd_to_obj +from ..serialization_utils import pd_to_obj +from buckaroo.pluggable_analysis_framework.utils import (filter_analysis) from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) from buckaroo.pluggable_analysis_framework.analysis_management import DfStats -from .customizations.all_transforms import configure_buckaroo, DefaultCommandKlsList + SENTINEL_DF_1 = pd.DataFrame({'foo' :[10, 20], 'bar' : ["asdf", "iii"]}) SENTINEL_DF_2 = pd.DataFrame({'col1' :[55, 55], 'col2': ["pppp", "333"]}) @@ -14,14 +15,24 @@ SENTINEL_DF_4 = pd.DataFrame({'vvv' :[12, 49], 'oo': [ 'ccc', 'www']}) - - def merge_ops(existing_ops, cleaning_ops): """ strip cleaning_ops from existing_ops, reinsert cleaning_ops at the beginning """ a = existing_ops.copy() a.extend(cleaning_ops) return a +def merge_sds(*sds): + """merge sds with later args taking precedence + + sub-merging of "overide_config"?? + """ + base_sd = {} + for sd in sds: + for column in sd.keys(): + base_sd[column] = merge_column(base_sd.get(column, {}), sd[column]) + return base_sd + + def merge_column(base, new): """ merge individual column dictionaries, with special handling for column_config_override @@ -37,17 +48,6 @@ def merge_column(base, new): ret['column_config_override'] = base_override return ret -def merge_sds(*sds): - """merge sds with later args taking precedence - - sub-merging of "overide_config"?? - """ - base_sd = {} - for sd in sds: - for column in sd.keys(): - base_sd[column] = merge_column(base_sd.get(column, {}), sd[column]) - return base_sd - SENTINEL_COLUMN_CONFIG_1 = "ASDF" SENTINEL_COLUMN_CONFIG_2 = "FOO-BAR" @@ -118,12 +118,13 @@ def __init__(self, raw_df): super().__init__() self.summary_sd = {} self.existing_operations = [] - try: self.raw_df = raw_df except Exception: six.reraise(self.exception[0], self.exception[1], self.exception[2]) + #autocleaning_klass = SentinelAutocleaning + raw_df = Any('') sample_method = Unicode('default') sampled_df = Any('') @@ -202,6 +203,7 @@ def _operation_result(self, change): generated_code = self._run_code_generator(merged_operations) self.cleaned = [cleaned_df, cleaning_sd, generated_code, merged_operations] + @property def cleaned_df(self): if self.cleaned is not None: @@ -335,13 +337,6 @@ def style_columns(kls, sd): 'column_config': ret_col_config} -def filter_analysis(klasses, attr): - ret_klses = {} - for k in klasses: - attr_val = getattr(k, attr, None) - if attr_val is not None: - ret_klses[attr_val] = k - return ret_klses class PostProcessingException(Exception): pass @@ -379,7 +374,6 @@ class CustomizableDataflow(DataFlow): This allows targetd extension and customization of DataFlow """ analysis_klasses = [StylingAnalysis] - command_klasses = DefaultCommandKlsList commandConfig = Dict({}).tag(sync=True) DFStatsClass = DfStats sampling_klass = Sampling @@ -400,7 +394,6 @@ def __init__(self, df, debug=False, column_config_overrides=None, pinned_rows=No self.setup_options_from_analysis() super().__init__(self.sampling_klass.pre_stats_sample(df)) - self._setup_from_command_kls_list() self.populate_df_meta() #self.raw_df = df warnings.filterwarnings('default') @@ -450,34 +443,6 @@ def setup_options_from_analysis(self): df_data_dict = Any({'empty':[]}).tag(sync=True) - ### start code interpreter block - def _setup_from_command_kls_list(self): - #used to initially setup the interpreter, and when a command - #is added interactively - c_klasses = self.command_klasses - c_defaults, c_patterns, df_interpreter, gencode_interpreter = configure_buckaroo(c_klasses) - self.df_interpreter, self.gencode_interpreter = df_interpreter, gencode_interpreter - self.commandConfig = dict(argspecs=c_patterns, defaultArgs=c_defaults) - - def add_command(self, incomingCommandKls): - without_incoming = [x for x in self.command_classes if not x.__name__ == incomingCommandKls.__name__] - without_incoming.append(incomingCommandKls) - self.command_klasses = without_incoming - self.setup_from_command_kls_list() - - def _run_df_interpreter(self, df, operations): - full_ops = [{'symbol': 'begin'}] - full_ops.extend(operations) - if len(full_ops) == 1: - return df - return self.buckaroo_transform(full_ops , df) - - def run_code_generator(self, operations): - if len(operations) == 0: - return 'no operations' - return self.gencode_interpreter(operations) - ### end code interpeter block - def _compute_processed_result(self, cleaned_df, post_processing_method): if post_processing_method == '': return [cleaned_df, {}] diff --git a/buckaroo/pluggable_analysis_framework/utils.py b/buckaroo/pluggable_analysis_framework/utils.py index 38a414e3a..a972eca76 100644 --- a/buckaroo/pluggable_analysis_framework/utils.py +++ b/buckaroo/pluggable_analysis_framework/utils.py @@ -3,6 +3,7 @@ import pandas as pd import numpy as np + BASE_COL_HINT = { 'type':'string', 'is_numeric': False, @@ -81,3 +82,10 @@ def json_postfix(postfix): return lambda nm: json.dumps([nm, postfix]) +def filter_analysis(klasses, attr): + ret_klses = {} + for k in klasses: + attr_val = getattr(k, attr, None) + if attr_val is not None: + ret_klses[attr_val] = k + return ret_klses diff --git a/buckaroo/polars_buckaroo.py b/buckaroo/polars_buckaroo.py index 37707df54..436be9cee 100644 --- a/buckaroo/polars_buckaroo.py +++ b/buckaroo/polars_buckaroo.py @@ -8,7 +8,7 @@ DropCol, FillNA, GroupBy #, OneHot, GroupBy, reindex ) from .customizations.styling import DefaultSummaryStatsStyling, DefaultMainStyling -from .dataflow import Sampling +from .dataflow.dataflow import Sampling class PLSampling(Sampling): diff --git a/js/components/ColumnsEditor.tsx b/js/components/ColumnsEditor.tsx index 63fbd9c0a..412242054 100644 --- a/js/components/ColumnsEditor.tsx +++ b/js/components/ColumnsEditor.tsx @@ -20,7 +20,6 @@ export function ColumnsEditor({ setOperations, operationResult, commandConfig, - widgetConfig, }: { df_viewer_config: DFViewerConfig; activeColumn: string; @@ -28,30 +27,25 @@ export function ColumnsEditor({ setOperations: OperationSetter; operationResult: OperationResult; commandConfig: CommandConfigT; - widgetConfig: WidgetConfig; }) { const allColumns = df_viewer_config.column_config.map( (field) => field.col_name ); return (
    - {widgetConfig.showCommands ? ( -
    - - -
    - ) : ( - - )} +
    + + +
    ); } @@ -72,7 +66,6 @@ export function ColumnsEditorEx() { operations={operations} setOperations={setOperations} operationResult={baseOperationResults} - widgetConfig={{ showCommands: true }} /> ); } diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 4b640fbb3..abe235dba 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -1,7 +1,7 @@ import React, { useState, Dispatch, SetStateAction } from 'react'; import _ from 'lodash'; import { OperationResult, baseOperationResults } from './DependentTabs'; -import { ColumnsEditor, WidgetConfig } from './ColumnsEditor'; +import { ColumnsEditor } from './ColumnsEditor'; import { dfviewer_config_no_pinned, realSummaryConfig, @@ -45,7 +45,6 @@ export function WidgetDCFCell({ on_buckaroo_state, buckaroo_options, }: { - // df_dict: Record; df_meta: DFMeta; df_data_dict: Record; df_display_args: Record; @@ -58,13 +57,14 @@ export function WidgetDCFCell({ buckaroo_options: BuckarooOptions; }) { const [activeCol, setActiveCol] = useState('stoptime'); - const widgetConfig: WidgetConfig = { - showCommands: buckaroo_state.show_commands ? true : false, - }; const cDisp = df_display_args[buckaroo_state.df_display]; if (cDisp === undefined) { - // console.log("cDisp undefined", buckaroo_state.df_display, buckaroo_options.df_display) + console.log( + 'cDisp undefined', + buckaroo_state.df_display, + buckaroo_options.df_display + ); } else { // console.log("cDisp", cDisp); } @@ -95,7 +95,7 @@ export function WidgetDCFCell({ setActiveCol={setActiveCol} />
    - {widgetConfig.showCommands ? ( + {buckaroo_state.show_commands ? ( ) : ( diff --git a/tests/unit/dataflow/autocleaning_test.py b/tests/unit/dataflow/autocleaning_test.py new file mode 100644 index 000000000..62ba048ea --- /dev/null +++ b/tests/unit/dataflow/autocleaning_test.py @@ -0,0 +1,175 @@ +import polars as pl +from buckaroo.customizations.polars_analysis import ( + VCAnalysis, PLCleaningStats, BasicAnalysis) +from buckaroo.pluggable_analysis_framework.polars_analysis_management import PlDfStats, PolarsAnalysis +from buckaroo.dataflow.autocleaning import Autocleaning, merge_ops, format_ops, make_origs, AutocleaningConfig +from buckaroo.customizations.polars_commands import ( + PlSafeInt, DropCol, FillNA, GroupBy, NoOp +) + + + +dirty_df = pl.DataFrame({ + 'a':[10, 20, 30, 40, 10, 20.3, 5, None, None, None], + 'b':["3", "4", "a", "5", "5", "b", "b", None, None, None]}) + + +def make_default_analysis(**kwargs): + class DefaultAnalysis(PolarsAnalysis): + requires_summary = [] + provides_defaults = kwargs + return DefaultAnalysis + +class CleaningGenOps(PolarsAnalysis): + requires_summary = ['int_parse_fail', 'int_parse'] + provides_defaults = {'cleaning_ops': []} + + int_parse_threshhold = .3 + @classmethod + def computed_summary(kls, column_metadata): + if column_metadata['int_parse'] > kls.int_parse_threshhold: + return {'cleaning_ops': [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, {'symbol': 'df'}]} + else: + return {'cleaning_ops': []} + + +def test_cleaning_stats(): + dfs = PlDfStats(dirty_df, [VCAnalysis, PLCleaningStats, BasicAnalysis]) + + # "3", "4", "5", "5" 4 out of 10 + assert dfs.sdf['b']['int_parse'] == 0.4 + assert dfs.sdf['b']['int_parse_fail'] == 0.6 + + +SAFE_INT_TOKEN = [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, {'symbol': 'df'}] +def test_ops_gen(): + + dfs = PlDfStats(dirty_df, [make_default_analysis(int_parse=.4, int_parse_fail=.6), + CleaningGenOps], debug=True) + assert dfs.sdf['b']['cleaning_ops'] == SAFE_INT_TOKEN + dfs = PlDfStats(dirty_df, [make_default_analysis(int_parse=.2, int_parse_fail=.8), + CleaningGenOps]) + assert dfs.sdf['b']['cleaning_ops'] == [] + + + +def test_format_ops(): + column_meta = { + 'a': {'cleaning_ops':SAFE_INT_TOKEN }, + 'b': {'cleaning_ops': [ + {'symbol': 'replace_dirty', 'meta':{'auto_clean': True}}, + {'symbol': 'df'}, '\n', None]}} + + expected_ops = [ + [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, {'symbol': 'df'}, 'a'], + [{'symbol': 'replace_dirty', 'meta':{'auto_clean': True}}, {'symbol': 'df'}, 'b', '\n', None]] + assert format_ops(column_meta) == expected_ops + + + + +class AlwaysSafeIntGenOps(PolarsAnalysis): + requires_summary = [] + provides_defaults = {'cleaning_ops': []} + + @classmethod + def computed_summary(kls, column_metadata): + return {'cleaning_ops': [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, + {'symbol': 'df'}]} + +def test_merge_ops(): + existing_ops = [ + [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, 'a'], + [{'symbol': 'usergen'}, 'foo_column'] + ] + + cleaning_ops = [ + [{'symbol': 'new_cleaning', 'meta':{'auto_clean': True}}, 'a']] + + expected_merged = [ + [{'symbol': 'new_cleaning', 'meta':{'auto_clean': True}}, 'a'], + [{'symbol': 'usergen'}, 'foo_column'] + ] + print( merge_ops(existing_ops, cleaning_ops)) + print("@"*80) + assert merge_ops(existing_ops, cleaning_ops) == expected_merged + +class ACConf(AutocleaningConfig): + autocleaning_analysis_klasses = [VCAnalysis, PLCleaningStats, BasicAnalysis, CleaningGenOps] + command_klasses = [PlSafeInt, DropCol, FillNA, GroupBy, NoOp] + name="default" + + + +def test_handle_user_ops(): + + ac = Autocleaning([ACConf]) + df = pl.DataFrame({'a': [10, 20, 30]}) + cleaning_result = ac.handle_ops_and_clean(df, cleaning_method='default', existing_operations=[]) + cleaned_df, cleaning_sd, generated_code, merged_operations = cleaning_result + assert merged_operations == [ + [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, {'symbol': 'df'}, 'a']] + + existing_ops = [ + [{'symbol': 'old_safe_int', 'meta':{'auto_clean': True}}, {'symbol': 'df'}, 'a']] + cleaning_result2 = ac.handle_ops_and_clean( + df, cleaning_method='default', existing_operations=existing_ops) + cleaned_df, cleaning_sd, generated_code, merged_operations2 = cleaning_result2 + assert merged_operations2 == [ + [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, {'symbol': 'df'}, 'a']] + + user_ops = [ + [{'symbol': 'noop'}, {'symbol': 'df'}, 'b']] + cleaning_result3 = ac.handle_ops_and_clean( + df, cleaning_method='default', existing_operations=user_ops) + cleaned_df, cleaning_sd, generated_code, merged_operations3 = cleaning_result3 + assert merged_operations3 == [ + [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, {'symbol': 'df'}, 'a'], + [{'symbol': 'noop'}, {'symbol': 'df'}, 'b'] + ] + + +def desired_test_make_origs(): + # I can't make this work in a sensible way because it is not + # possible to quickly run comparisons against different dtype + # columns, and object dtypes are serverely limited + df_a = pl.DataFrame({'a': [10, 20, 30, 40], 'b': [1, 2, 3, 4]}) + df_b = pl.DataFrame({'a': [10, 20, 0, 40], 'b': [1, 2, 3, 4]}) + + expected = pl.DataFrame( + [pl.Series("a", [ 10, 20, 0, 40], dtype=pl.Int64), + pl.Series("a_orig", [None, None, 30, None], dtype=pl.Int64), + pl.Series("b", [ 1, 2, 3, 4], dtype=pl.Int64), + pl.Series("b_orig", [None, None, None, None], dtype=pl.Int64)]) + + assert make_origs(df_a, df_b).to_dicts() == expected.to_dicts() + +def test_make_origs_different_dtype(): + raw = pl.DataFrame({'a': [30, "40"]}) + cleaned = pl.DataFrame({'a': [30, 40]}) + expected = pl.DataFrame({ + 'a': [30, 40], + 'a_orig': [30, "40"]}) + assert make_origs(raw, cleaned).to_dicts() == expected.to_dicts() + +def test_handle_clean_df(): + ac = Autocleaning([ACConf]) + df = pl.DataFrame({'a': ["30", "40"]}) + cleaning_result = ac.handle_ops_and_clean(df, cleaning_method='default', existing_operations=[]) + cleaned_df, cleaning_sd, generated_code, merged_operations = cleaning_result + expected = pl.DataFrame({ + 'a': [30, 40], + 'a_orig': ["30", "40"]}) + assert cleaned_df.to_dicts() == expected.to_dicts() + +EXPECTED_GEN_CODE = """def clean(df): + df = df.with_columns(pl.col('a').cast(pl.Int64, strict=False)) + return df""" + +def test_autoclean_codegen(): + ac = Autocleaning([ACConf]) + df = pl.DataFrame({'a': ["30", "40"]}) + cleaning_result = ac.handle_ops_and_clean(df, cleaning_method='default', existing_operations=[]) + cleaned_df, cleaning_sd, generated_code, merged_operations = cleaning_result + + assert generated_code == EXPECTED_GEN_CODE diff --git a/tests/unit/dataflow/customizable_dataflow_test.py b/tests/unit/dataflow/customizable_dataflow_test.py index df8d4afbe..6d4d2aac9 100644 --- a/tests/unit/dataflow/customizable_dataflow_test.py +++ b/tests/unit/dataflow/customizable_dataflow_test.py @@ -3,7 +3,7 @@ import pytest from ..fixtures import (DistinctCount) from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) -from buckaroo.dataflow import CustomizableDataflow, StylingAnalysis +from buckaroo.dataflow.dataflow import CustomizableDataflow, StylingAnalysis from buckaroo.buckaroo_widget import BuckarooWidget diff --git a/tests/unit/dataflow/dataflow_polars_test.py b/tests/unit/dataflow/dataflow_polars_test.py index c577729f5..a7aefb731 100644 --- a/tests/unit/dataflow/dataflow_polars_test.py +++ b/tests/unit/dataflow/dataflow_polars_test.py @@ -1,4 +1,4 @@ -from buckaroo.dataflow import StylingAnalysis +from buckaroo.dataflow.dataflow import StylingAnalysis from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) from buckaroo.polars_buckaroo import PolarsBuckarooWidget import polars as pl diff --git a/tests/unit/dataflow/dataflow_test.py b/tests/unit/dataflow/dataflow_test.py index f992f4c8c..61abfec21 100644 --- a/tests/unit/dataflow/dataflow_test.py +++ b/tests/unit/dataflow/dataflow_test.py @@ -1,7 +1,8 @@ import sys import pandas as pd -from buckaroo.dataflow import DataFlow -from buckaroo import dataflow as dft +from buckaroo.dataflow.dataflow import DataFlow +from buckaroo.dataflow import dataflow as dft +from buckaroo.dataflow.dataflow import SENTINEL_DF_1, SENTINEL_DF_2 simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) @@ -20,9 +21,9 @@ def test_dataflow_cleaned(): d_flow = DataFlow(simple_df) assert d_flow.cleaned_df is simple_df d_flow.existing_operations = ["one"] - assert d_flow.cleaned_df is dft.SENTINEL_DF_1 + assert d_flow.cleaned_df is SENTINEL_DF_1 d_flow.cleaning_method = "one op" - assert d_flow.cleaned_df is dft.SENTINEL_DF_2 + assert d_flow.cleaned_df is SENTINEL_DF_2 def test_dataflow_processed(): diff --git a/tests/unit/polars_basic_widget_test.py b/tests/unit/polars_basic_widget_test.py index ea02e0d8b..004bdde08 100644 --- a/tests/unit/polars_basic_widget_test.py +++ b/tests/unit/polars_basic_widget_test.py @@ -7,7 +7,7 @@ ColAnalysis) from buckaroo.pluggable_analysis_framework.utils import (json_postfix) from buckaroo.polars_buckaroo import PolarsBuckarooWidget -from buckaroo.dataflow import StylingAnalysis +from buckaroo.dataflow.dataflow import StylingAnalysis def test_basic_instantiation(): PolarsBuckarooWidget( From 45df33caa47e45cbf90a9e31e453ae3b2dc1a43c Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Sat, 17 Feb 2024 06:40:46 -0500 Subject: [PATCH 208/250] add PNGImageDisplayer (#227) * added a PNGImageDisplayer, with examples * removing link from docs that consistently fails CI * Fixes #228 --- buckaroo/customizations/histogram.py | 3 + docs/source/articles/histograms.rst | 2 +- example-notebooks/styling-gallery.ipynb | 770 +++++++++++++++++- js/baked_data/staticData.ts | 11 + js/components/DFViewerParts/DFViewer.tsx | 4 +- js/components/DFViewerParts/DFWhole.ts | 17 +- js/components/DFViewerParts/Displayer.ts | 8 +- js/components/DFViewerParts/HistogramCell.tsx | 5 + 8 files changed, 807 insertions(+), 13 deletions(-) diff --git a/buckaroo/customizations/histogram.py b/buckaroo/customizations/histogram.py index 26248e037..71c8ce3f3 100644 --- a/buckaroo/customizations/histogram.py +++ b/buckaroo/customizations/histogram.py @@ -91,6 +91,9 @@ class Histogram(ColAnalysis): @staticmethod def series_summary(sampled_ser, ser): + """ + https://stackoverflow.com/questions/11882393/matplotlib-disregard-outliers-when-plotting + """ if not pd.api.types.is_numeric_dtype(ser): return dict(histogram_args={}) if pd.api.types.is_bool_dtype(ser): diff --git a/docs/source/articles/histograms.rst b/docs/source/articles/histograms.rst index ffbe9834a..1edf602f4 100644 --- a/docs/source/articles/histograms.rst +++ b/docs/source/articles/histograms.rst @@ -67,7 +67,7 @@ Other research https://edwinth.github.io/blog/outlier-bin/ -https://stackoverflow.com/questions/11882393/matplotlib-disregard-outliers-when-plotting + references Boris Iglewicz and David Hoaglin (1993), "Volume 16: How to Detect and diff --git a/example-notebooks/styling-gallery.ipynb b/example-notebooks/styling-gallery.ipynb index 36a6d3560..65ddadaf6 100644 --- a/example-notebooks/styling-gallery.ipynb +++ b/example-notebooks/styling-gallery.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "99218d54-79db-4c3c-8ca5-373e3c1ed677", "metadata": { "tags": [] @@ -11,7 +11,7 @@ "source": [ "import pandas as pd\n", "import numpy as np\n", - "from buckaroo.dataflow import StylingAnalysis\n", + "from buckaroo.dataflow.dataflow import StylingAnalysis\n", "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis\n", "import polars as pl\n", "from buckaroo.polars_buckaroo import PolarsBuckarooWidget\n", @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "840e09f3-8153-4800-a383-636556af4f32", "metadata": { "tags": [] @@ -75,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "4697fa58-9609-412f-b2d0-48a63fed0c99", "metadata": { "tags": [] @@ -95,12 +95,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "6e84d497-539f-4c62-810f-1cef72f417d2", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f1de7ec8051b4cdfa908edb2b3f69291", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "GalleryBuckaroo(buckaroo_options={'sampled': ['random'], 'auto_clean': ['aggressive', 'conservative'], 'post_p…" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "obj_df = pl.DataFrame({\n", " 'bools':[True, True, False, False, True, None],\n", @@ -297,6 +313,51 @@ "#Fixme, this doesn't work with polars right now, probably related to the object dtype problem" ] }, + { + "cell_type": "code", + "execution_count": 5, + "id": "fd4dd7b5-ed26-42b6-aa20-f9d7211b7e95", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "png_smiley = 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=';" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0f6231ea-a570-40d7-ab9d-86e8ce08c5a9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "65cbba804f404b3fa5ed81c9e3bc877d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "PolarsBuckarooWidget(buckaroo_options={'sampled': ['random'], 'auto_clean': ['aggressive', 'conservative'], 'p…" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_df = DataFrame({'raw': [png_smiley, None],\n", + " 'img_displayer' : [png_smiley, None]})\n", + "BUCKAROOWidget(img_df,\n", + " column_config_overrides={\n", + " 'raw': {'displayer_args': {'displayer': 'string', 'max_length':40}},\n", + " 'img_displayer': {'displayer_args': {'displayer': 'Base64PNGImageDisplayer'}, 'ag_grid_specs' : {'width':150}}})" + ] + }, { "cell_type": "markdown", "id": "c8d2accd-4732-43ff-b92a-d827b330b538", @@ -621,7 +682,702 @@ }, "widgets": { "application/vnd.jupyter.widget-state+json": { - "state": {}, + "state": { + "65cbba804f404b3fa5ed81c9e3bc877d": { + "model_module": "buckaroo", + "model_module_version": "^0.6.2", + "model_name": "DCEFWidgetModel", + "state": { + "_model_module_version": "^0.6.2", + "_view_module_version": "^0.6.2", + "_view_name": "DCEFWidgetView", + "buckaroo_options": { + "auto_clean": [ + "aggressive", + "conservative" + ], + "df_display": [ + "summary", + "main" + ], + "post_processing": [ + "" + ], + "sampled": [ + "random" + ], + "show_commands": [ + "on" + ], + "summary_stats": [ + "all" + ] + }, + "buckaroo_state": { + "auto_clean": "conservative", + "df_display": "main", + "post_processing": "", + "sampled": false, + "search_string": "", + "show_commands": false + }, + "commandConfig": {}, + "df_data_dict": { + "all_stats": [ + { + "img_displayer": "shape: (2,)\nSeries: '' [struct[2]]\n[\n\t{\"iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=\",1}\n\t{null,1}\n]", + "index": "value_counts", + "raw": "shape: (2,)\nSeries: '' [struct[2]]\n[\n\t{\"iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=\",1}\n\t{null,1}\n]" + }, + { + "img_displayer": "String", + "index": "dtype", + "raw": "String" + }, + { + "img_displayer": "string", + "index": "_type", + "raw": "string" + }, + { + "img_displayer": false, + "index": "is_numeric", + "raw": false + }, + { + "img_displayer": false, + "index": "is_integer", + "raw": false + }, + { + "img_displayer": 2, + "index": "length", + "raw": 2 + }, + { + "img_displayer": 1, + "index": "nan_count", + "raw": 1 + }, + { + "img_displayer": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=", + "index": "min", + "raw": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + { + "img_displayer": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=", + "index": "max", + "raw": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + { + "img_displayer": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=", + "index": "mode", + "raw": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + { + "img_displayer": null, + "index": "mean", + "raw": null + }, + { + "img_displayer": 2, + "index": "unique_count", + "raw": 2 + }, + { + "img_displayer": 0, + "index": "empty_count", + "raw": 0 + }, + { + "img_displayer": 2, + "index": "distinct_count", + "raw": 2 + }, + { + "img_displayer": 1, + "index": "distinct_per", + "raw": 1 + }, + { + "img_displayer": 0, + "index": "empty_per", + "raw": 0 + }, + { + "img_displayer": 1, + "index": "unique_per", + "raw": 1 + }, + { + "img_displayer": 0.5, + "index": "nan_per", + "raw": 0.5 + }, + { + "img_displayer": { + "None": 0.5, + "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=": 0.5, + "longtail": -1, + "unique": 1 + }, + "index": "categorical_histogram", + "raw": { + "None": 0.5, + "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=": 0.5, + "longtail": -1, + "unique": 1 + } + }, + { + "img_displayer": [ + { + "cat_pop": 50, + "name": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + { + "cat_pop": 50, + "name": null + }, + { + "name": "unique", + "unique": 100 + }, + { + "NA": 50, + "name": "NA" + } + ], + "index": "histogram", + "raw": [ + { + "cat_pop": 50, + "name": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + { + "cat_pop": 50, + "name": null + }, + { + "name": "unique", + "unique": 100 + }, + { + "NA": 50, + "name": "NA" + } + ] + }, + { + "img_displayer": [ + "faked" + ], + "index": "histogram_bins", + "raw": [ + "faked" + ] + } + ], + "empty": [], + "main": [ + { + "img_displayer": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=", + "index": 0, + "raw": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + { + "img_displayer": null, + "index": 1, + "raw": null + } + ] + }, + "df_display_args": { + "main": { + "data_key": "main", + "df_viewer_config": { + "column_config": [ + { + "col_name": "index", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "raw", + "displayer_args": { + "displayer": "string", + "max_length": 40 + } + }, + { + "ag_grid_specs": { + "width": 150 + }, + "col_name": "img_displayer", + "displayer_args": { + "displayer": "Base64PNGImageDisplayer" + } + } + ], + "pinned_rows": [ + { + "displayer_args": { + "displayer": "obj" + }, + "primary_key_val": "dtype" + }, + { + "displayer_args": { + "displayer": "histogram" + }, + "primary_key_val": "histogram" + } + ] + }, + "summary_stats_key": "all_stats" + }, + "summary": { + "data_key": "empty", + "df_viewer_config": { + "column_config": [ + { + "col_name": "index", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "raw", + "displayer_args": { + "displayer": "string", + "max_length": 40 + } + }, + { + "ag_grid_specs": { + "width": 150 + }, + "col_name": "img_displayer", + "displayer_args": { + "displayer": "Base64PNGImageDisplayer" + } + } + ], + "pinned_rows": [ + { + "displayer_args": { + "displayer": "obj" + }, + "primary_key_val": "dtype" + }, + { + "displayer_args": { + "displayer": "float", + "max_fraction_digits": 3, + "min_fraction_digits": 3 + }, + "primary_key_val": "min" + }, + { + "displayer_args": { + "displayer": "float", + "max_fraction_digits": 3, + "min_fraction_digits": 3 + }, + "primary_key_val": "mean" + }, + { + "displayer_args": { + "displayer": "float", + "max_fraction_digits": 3, + "min_fraction_digits": 3 + }, + "primary_key_val": "max" + }, + { + "displayer_args": { + "displayer": "float", + "max_fraction_digits": 0, + "min_fraction_digits": 0 + }, + "primary_key_val": "unique_count" + }, + { + "displayer_args": { + "displayer": "float", + "max_fraction_digits": 0, + "min_fraction_digits": 0 + }, + "primary_key_val": "distinct_count" + }, + { + "displayer_args": { + "displayer": "float", + "max_fraction_digits": 0, + "min_fraction_digits": 0 + }, + "primary_key_val": "empty_count" + } + ] + }, + "summary_stats_key": "all_stats" + } + }, + "df_meta": { + "columns": 2, + "rows_shown": 2, + "total_rows": 2 + }, + "layout": "IPY_MODEL_c5d9e4c6ea08435daa316270b5977d54", + "operation_results": { + "generated_py_code": "# instantiation, unused", + "transformed_df": { + "column_config": [], + "data": [], + "pinned_rows": [] + } + }, + "operations": [] + } + }, + "c5d9e4c6ea08435daa316270b5977d54": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, + "dee2e1643b05493fa3422d21b0f0817d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": {} + }, + "f1de7ec8051b4cdfa908edb2b3f69291": { + "model_module": "buckaroo", + "model_module_version": "^0.6.2", + "model_name": "DCEFWidgetModel", + "state": { + "_model_module_version": "^0.6.2", + "_view_module_version": "^0.6.2", + "_view_name": "DCEFWidgetView", + "buckaroo_options": { + "auto_clean": [ + "aggressive", + "conservative" + ], + "df_display": [ + "main" + ], + "post_processing": [ + "" + ], + "sampled": [ + "random" + ], + "show_commands": [ + "on" + ], + "summary_stats": [ + "all" + ] + }, + "buckaroo_state": { + "auto_clean": "conservative", + "df_display": "main", + "post_processing": "", + "sampled": false, + "search_string": "", + "show_commands": false + }, + "commandConfig": {}, + "df_data_dict": { + "all_stats": [ + { + "bools": "Boolean", + "dicts": "Struct({'a': Int64, 'b': Int64, 'c': String})", + "index": "dtype", + "ints": "Int64", + "lists": "List(String)", + "lists-int": "List(Int64)", + "lists-string": "List(String)", + "nested_dicts": "Struct({'level_1': Struct({'a': Int64, 'b': Int64, 'c': String})})", + "timestamp": "String" + }, + { + "bools": "boolean", + "dicts": "unknown", + "index": "_type", + "ints": "integer", + "lists": "unknown", + "lists-int": "unknown", + "lists-string": "unknown", + "nested_dicts": "unknown", + "timestamp": "string" + }, + { + "bools": false, + "dicts": false, + "index": "is_numeric", + "ints": true, + "lists": false, + "lists-int": false, + "lists-string": false, + "nested_dicts": false, + "timestamp": false + }, + { + "bools": false, + "dicts": false, + "index": "is_integer", + "ints": true, + "lists": false, + "lists-int": false, + "lists-string": false, + "nested_dicts": false, + "timestamp": false + } + ], + "empty": [], + "main": [ + { + "bools": true, + "dicts": { + "a": 10, + "b": 20, + "c": "some string" + }, + "index": 0, + "ints": 5, + "lists": [ + "a", + "b" + ], + "lists-int": [ + 10, + 20 + ], + "lists-string": [ + "a", + "b" + ], + "nested_dicts": { + "level_1": { + "a": 10, + "b": 20, + "c": "some string" + } + }, + "timestamp": "2020-01-01 01:00Z" + }, + { + "bools": true, + "dicts": { + "a": null, + "b": null, + "c": null + }, + "index": 1, + "ints": 20, + "lists": [ + "1", + "2" + ], + "lists-int": [ + 100, + 500 + ], + "lists-string": [ + "foo", + "bar" + ], + "nested_dicts": { + "level_1": { + "a": null, + "b": null, + "c": null + } + }, + "timestamp": "2020-01-01 02:00Z" + }, + { + "bools": false, + "dicts": { + "a": null, + "b": null, + "c": null + }, + "index": 2, + "ints": 30, + "lists": null, + "lists-int": [ + 8 + ], + "lists-string": null, + "nested_dicts": { + "level_1": { + "a": null, + "b": null, + "c": null + } + }, + "timestamp": "2020-02-28 02:00Z" + }, + { + "bools": false, + "dicts": { + "a": null, + "b": null, + "c": null + }, + "index": 3, + "ints": -10, + "lists": null, + "lists-int": null, + "lists-string": null, + "nested_dicts": { + "level_1": { + "a": null, + "b": null, + "c": null + } + }, + "timestamp": "2020-03-15 02:00Z" + }, + { + "bools": true, + "dicts": { + "a": null, + "b": null, + "c": null + }, + "index": 4, + "ints": 7772, + "lists": null, + "lists-int": null, + "lists-string": null, + "nested_dicts": { + "level_1": { + "a": null, + "b": null, + "c": null + } + }, + "timestamp": null + }, + { + "bools": null, + "dicts": { + "a": null, + "b": null, + "c": null + }, + "index": 5, + "ints": null, + "lists": null, + "lists-int": null, + "lists-string": null, + "nested_dicts": { + "level_1": { + "a": null, + "b": null, + "c": null + } + }, + "timestamp": null + } + ] + }, + "df_display_args": { + "main": { + "data_key": "main", + "df_viewer_config": { + "column_config": [ + { + "col_name": "index", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "bools", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "ints", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "timestamp", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "dicts", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "nested_dicts", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "lists", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "lists-string", + "displayer_args": { + "displayer": "obj" + } + }, + { + "col_name": "lists-int", + "displayer_args": { + "displayer": "obj" + } + } + ], + "pinned_rows": [ + { + "displayer_args": { + "displayer": "obj" + }, + "primary_key_val": "dtype" + } + ] + }, + "summary_stats_key": "all_stats" + } + }, + "df_meta": { + "columns": 8, + "rows_shown": 6, + "total_rows": 6 + }, + "layout": "IPY_MODEL_dee2e1643b05493fa3422d21b0f0817d", + "operation_results": { + "generated_py_code": "# instantiation, unused", + "transformed_df": { + "column_config": [], + "data": [], + "pinned_rows": [] + } + }, + "operations": [] + } + } + }, "version_major": 2, "version_minor": 0 } diff --git a/js/baked_data/staticData.ts b/js/baked_data/staticData.ts index 9ec63da87..25e5e813a 100644 --- a/js/baked_data/staticData.ts +++ b/js/baked_data/staticData.ts @@ -133,6 +133,9 @@ export const histograms = { ], }; +export const smileyPNGString = + 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII='; + //export const tableDf2:DFWhole = { export const foo: DFWhole = { dfviewer_config: { @@ -179,6 +182,7 @@ export const foo: DFWhole = { bikeid: 19578, 'birth year': '1987', gender: 2, + img_: smileyPNGString, }, { index: 1, @@ -296,7 +300,13 @@ export const tableDf: DFWhole = { val_column: 'start station name', }, }, + { + col_name: 'img_', + displayer_args: { displayer: 'Base64PNGImageDisplayer' }, + ag_grid_specs: { width: 150 }, + }, ], + extra_grid_config: { rowHeight: 35 }, pinned_rows: [ { primary_key_val: 'dtype', displayer_args: { displayer: 'obj' } }, // { primary_key_val: 'histogram', displayer_args: { displayer: 'histogram' }, }, @@ -313,6 +323,7 @@ export const tableDf: DFWhole = { nanObject: null, nanFloat: null, link_column: 'https://buckaroo.dev', + img_: smileyPNGString, }, { index: 1, diff --git a/js/components/DFViewerParts/DFViewer.tsx b/js/components/DFViewerParts/DFViewer.tsx index e297986dd..11c120501 100644 --- a/js/components/DFViewerParts/DFViewer.tsx +++ b/js/components/DFViewerParts/DFViewer.tsx @@ -47,7 +47,6 @@ export function DFViewer( df_viewer_config, summary_stats_data || [] ); - //agColsPure[0].minWidth=150; const styledColumns = replaceAtMatch( _.clone(agColsPure), @@ -79,6 +78,9 @@ export function DFViewer( setActiveCol(colName); } }, + ...(df_viewer_config.extra_grid_config + ? df_viewer_config.extra_grid_config + : {}), }; const gridRef = useRef>(null); const pinned_rows = df_viewer_config.pinned_rows; diff --git a/js/components/DFViewerParts/DFWhole.ts b/js/components/DFViewerParts/DFWhole.ts index 53d79b5b4..e498c096b 100644 --- a/js/components/DFViewerParts/DFWhole.ts +++ b/js/components/DFViewerParts/DFWhole.ts @@ -1,6 +1,6 @@ // I'm not sure about adding underlying types too -import { ColDef } from 'ag-grid-community'; +import { ColDef, GridOptions } from 'ag-grid-community'; import _ from 'lodash'; type AGGrid_ColDef = ColDef; @@ -58,13 +58,23 @@ export interface BooleanCheckboxDisplayerA { displayer: 'boolean_checkbox'; } +export interface Base64PNGImageDisplayerA { + displayer: 'Base64PNGImageDisplayer'; +} + export type CellRendererArgs = | HistogramDisplayerA | LinkifyDisplayerA - | BooleanCheckboxDisplayerA; + | BooleanCheckboxDisplayerA + | Base64PNGImageDisplayerA; + export type DisplayerArgs = FormatterArgs | CellRendererArgs; -export const cellRendererDisplayers = ['histogram', 'linkify']; +export const cellRendererDisplayers = [ + 'histogram', + 'linkify', + 'Base64PNGImageDisplayer', +]; //ColorMapRules export interface ColorMapRules { @@ -122,6 +132,7 @@ export type PinnedRowConfig = { export interface DFViewerConfig { pinned_rows: PinnedRowConfig[]; column_config: ColumnConfig[]; + extra_grid_config?: GridOptions; } export type DFDataRow = Record< diff --git a/js/components/DFViewerParts/Displayer.ts b/js/components/DFViewerParts/Displayer.ts index b4cfa582f..4bad16d5f 100644 --- a/js/components/DFViewerParts/Displayer.ts +++ b/js/components/DFViewerParts/Displayer.ts @@ -8,7 +8,11 @@ import { StringDisplayerA, } from './DFWhole'; import _ from 'lodash'; -import { HistogramCell, LinkCellRenderer } from './HistogramCell'; +import { + Base64PNGDisplayer, + HistogramCell, + LinkCellRenderer, +} from './HistogramCell'; import { CellRendererArgs, FormatterArgs } from './DFWhole'; /* @@ -194,6 +198,8 @@ export function getCellRenderer(crArgs: CellRendererArgs) { return HistogramCell; case 'linkify': return LinkCellRenderer; + case 'Base64PNGImageDisplayer': + return Base64PNGDisplayer; case 'boolean_checkbox': return 'agCheckboxCellRenderer'; } diff --git a/js/components/DFViewerParts/HistogramCell.tsx b/js/components/DFViewerParts/HistogramCell.tsx index e46e20cfe..ae4955fc2 100644 --- a/js/components/DFViewerParts/HistogramCell.tsx +++ b/js/components/DFViewerParts/HistogramCell.tsx @@ -140,6 +140,11 @@ export const LinkCellRenderer = (props: any) => { return {props.value}; }; +export const Base64PNGDisplayer = (props: any) => { + const imgString = 'data:image/png;base64,' + props.value; + return ; +}; + export const HistogramCell = (props: any) => { //debugger; if (props === undefined || props.value === undefined) { From 194d27ffdda1afa17ee88ae1f2fdb9f82a85026e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 23 Feb 2024 10:24:27 -0500 Subject: [PATCH 209/250] Add a DFViewer widget (#233) * fixes https://github.com/paddymul/buckaroo/issues/225 * fixes https://github.com/paddymul/buckaroo/issues/231 --- buckaroo/__init__.py | 11 +- buckaroo/buckaroo_widget.py | 58 +++++- buckaroo/dataflow/dataflow.py | 177 +----------------- buckaroo/dataflow/dataflow_extras.py | 164 ++++++++++++++++ buckaroo/dataflow/widget_extension_utils.py | 117 ++++++++++++ buckaroo/polars_buckaroo.py | 34 +++- buckaroo/solara/__init__.py | 1 + buckaroo/widget_utils.py | 39 ++-- example-notebooks/DFViewer.ipynb | 121 ++++++++++++ examples/ex/DFViewerEx_large.tsx | 2 +- examples/ex/DFViewerEx_real_summary.tsx | 2 +- examples/ex/DFViewerEx_string_index.tsx | 2 +- js/components/DCFCell.tsx | 2 +- js/components/DFViewerParts/DFViewer.tsx | 39 ++-- .../DFViewerParts/SeriesSummaryTooltip.tsx | 2 +- js/dcefwidget.ts | 56 ++++++ tests/unit/dataflow/widget_extension_tests.py | 92 +++++++++ 17 files changed, 700 insertions(+), 219 deletions(-) create mode 100644 buckaroo/dataflow/dataflow_extras.py create mode 100644 buckaroo/dataflow/widget_extension_utils.py create mode 100644 buckaroo/solara/__init__.py create mode 100644 example-notebooks/DFViewer.ipynb create mode 100644 tests/unit/dataflow/widget_extension_tests.py diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index 4ea97a887..6346a39e2 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- from ._version import __version__ from .buckaroo_widget import BuckarooWidget -from .widget_utils import enable, disable +from .dataflow.widget_extension_utils import DFViewer +from .widget_utils import is_in_ipython, enable, disable def _jupyter_nbextension_paths(): @@ -127,7 +128,13 @@ def debug_packages(): print(f"{package:<17}:", path) try: - enable() + if is_in_ipython(): + enable() + print("Buckaroo has been enabled as the default DataFrame viewer. To return to default dataframe visualization use `from buckaroo import disable; disable()`") + else: + print("must be running inside ipython to enable default display via enable()") + + warn_on_incompatible() except: print("error enabling buckaroo as default display formatter for dataframes (ignore message during testing/builds") diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index f381c776b..1799b724d 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -25,7 +25,20 @@ from .dataflow.dataflow import CustomizableDataflow, StylingAnalysis, exception_protect -class BuckarooWidget(CustomizableDataflow, DOMWidget): +class BuckarooProjectWidget(DOMWidget): + """ + Repetitious code needed to make Jupyter communicate properly with any BuckarooWidget in this package + + """ + _model_module = Unicode(module_name).tag(sync=True) + _view_module = Unicode(module_name).tag(sync=True) + + _model_module_version = Unicode(module_version).tag(sync=True) + _view_module_version = Unicode(module_version).tag(sync=True) + + + +class BuckarooWidget(CustomizableDataflow, BuckarooProjectWidget): """Extends CustomizableDataFlow and DOMWIdget Replaces generic options in CustomizableDataFlow with Pandas implementations @@ -35,11 +48,7 @@ class BuckarooWidget(CustomizableDataflow, DOMWidget): #### DOMWidget Boilerplate _model_name = Unicode('DCEFWidgetModel').tag(sync=True) - _model_module = Unicode(module_name).tag(sync=True) - _model_module_version = Unicode(module_version).tag(sync=True) _view_name = Unicode('DCEFWidgetView').tag(sync=True) - _view_module = Unicode(module_name).tag(sync=True) - _view_module_version = Unicode(module_version).tag(sync=True) #END DOMWidget Boilerplate operations = List().tag(sync=True) @@ -115,3 +124,42 @@ def post_process_df(kls, df): temp_buckaroo_state = self.buckaroo_state.copy() temp_buckaroo_state['post_processing'] = proc_func_name self.buckaroo_state = temp_buckaroo_state + + +class RawDFViewerWidget(BuckarooProjectWidget): + """ + + A very raw way of instaniating just the DFViewer, not meant for use by enduers + + instead use DFViewer, or PolarsDFViewer which have better convience methods + """ + + #### DOMWidget Boilerplate + _model_name = Unicode('DFViewerModel').tag(sync=True) + _view_name = Unicode('DFViewerView').tag(sync=True) + #END DOMWidget Boilerplate + + + + df_data = List([ + {'a': 5 , 'b':20, 'c': 'Paddy'}, + {'a': 58.2, 'b': 9, 'c': 'Margaret'}]).tag(sync=True) + + df_viewer_config = Dict({ + 'column_config': [ + { 'col_name': 'a', + 'displayer_args': { 'displayer': 'float', 'min_fraction_digits': 2, 'max_fraction_digits': 8 }}, + { 'col_name': 'b', + 'displayer_args': { 'displayer': 'integer', 'min_digits': 3, 'max_digits': 5 }}, + { 'col_name': 'c', + 'displayer_args': { 'displayer': 'string', 'min_digits': 3, 'max_digits': 5 }}], + 'pinned_rows': [ + { 'primary_key_val': 'dtype', 'displayer_args': { 'displayer': 'obj' }}, + { 'primary_key_val': 'mean', 'displayer_args': { 'displayer': 'integer', 'min_digits': 3, 'max_digits': 5 }}]} + ).tag(sync=True) + + summary_stats_data = List([ + { 'index': 'mean', 'a': 28, 'b': 14, 'c': 'Padarget' }, + { 'index': 'dtype', 'a': 'float64', 'b': 'int64', 'c': 'object' }]).tag(sync=True) + + diff --git a/buckaroo/dataflow/dataflow.py b/buckaroo/dataflow/dataflow.py index 550ebaf30..4e56091c1 100644 --- a/buckaroo/dataflow/dataflow.py +++ b/buckaroo/dataflow/dataflow.py @@ -1,101 +1,19 @@ import six -import sys import warnings import pandas as pd from traitlets import Unicode, Any, observe, HasTraits, Dict from ..serialization_utils import pd_to_obj from buckaroo.pluggable_analysis_framework.utils import (filter_analysis) -from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) from buckaroo.pluggable_analysis_framework.analysis_management import DfStats +from .dataflow_extras import ( + EMPTY_DF_DISPLAY_ARG, SENTINEL_DF_1, SENTINEL_DF_2, + merge_ops, merge_sds, merge_column_config, + style_columns, exception_protect, StylingAnalysis, + Sampling) -SENTINEL_DF_1 = pd.DataFrame({'foo' :[10, 20], 'bar' : ["asdf", "iii"]}) -SENTINEL_DF_2 = pd.DataFrame({'col1' :[55, 55], 'col2': ["pppp", "333"]}) -SENTINEL_DF_3 = pd.DataFrame({'pp' :[99, 33], 'ee': [ 6, 9]}) -SENTINEL_DF_4 = pd.DataFrame({'vvv' :[12, 49], 'oo': [ 'ccc', 'www']}) -def merge_ops(existing_ops, cleaning_ops): - """ strip cleaning_ops from existing_ops, reinsert cleaning_ops at the beginning """ - a = existing_ops.copy() - a.extend(cleaning_ops) - return a - -def merge_sds(*sds): - """merge sds with later args taking precedence - - sub-merging of "overide_config"?? - """ - base_sd = {} - for sd in sds: - for column in sd.keys(): - base_sd[column] = merge_column(base_sd.get(column, {}), sd[column]) - return base_sd - - -def merge_column(base, new): - """ - merge individual column dictionaries, with special handling for column_config_override - """ - ret = base.copy() - ret.update(new) - - base_override = base.get('column_config_override', {}).copy() - new_override = new.get('column_config_override', {}).copy() - base_override.update(new_override) - - if len(base_override) > 0: - ret['column_config_override'] = base_override - return ret - -SENTINEL_COLUMN_CONFIG_1 = "ASDF" -SENTINEL_COLUMN_CONFIG_2 = "FOO-BAR" - - - - -def style_columns(style_method:str, sd): - if style_method == "foo": - return SENTINEL_COLUMN_CONFIG_2 - else: - ret_col_config = [] - for col in sd.keys(): - ret_col_config.append( - {'col_name':col, 'displayer_args': {'displayer': 'obj'}}) - return { - 'pinned_rows': [ - # {'primary_key_val': 'dtype', 'displayer_args': {'displayer': 'obj'}} - ], - 'column_config': ret_col_config} - -def merge_column_config(styled_column_config, overide_column_configs): - existing_column_config = styled_column_config.copy() - ret_column_config = [] - for row in existing_column_config: - col = row['col_name'] - if col in overide_column_configs: - row.update(overide_column_configs[col]) - if row.get('merge_rule', 'blank') == 'hidden': - continue - ret_column_config.append(row) - return ret_column_config - - -def exception_protect(protect_name=None): - def wrapped_decorator(func): - def wrapped(self, *args, **kwargs): - try: - func(self, *args, **kwargs) - except Exception: - #sometimes useful for debugging tricky call order stuff - # if protect_name: - # print("protect handler", protect_name, self.exception) - if self.exception is None: - self.exception = sys.exc_info() - raise - return wrapped - return wrapped_decorator - class DataFlow(HasTraits): """This class is meant to only represent the dataflow through buckaroo with no accomodation for widget particulars @@ -169,6 +87,11 @@ def _compute_sampled_df(self, raw_df, sample_method): def _sampled_df(self, change): self.sampled_df = self._compute_sampled_df(self.raw_df, self.sample_method) + '''FIXME: remove _run_df_interpreter, _run_code_generator, and + _run_cleaning when autocleaning properly integrated as a separate + testable class + + ''' def _run_df_interpreter(self, df, ops): if len(ops) == 1: return SENTINEL_DF_1 @@ -289,86 +212,6 @@ def _widget_config(self, change): self.widget_args_tuple = (id(self.processed_df), self.processed_df, self.merged_sd) - - - - -class UnknownStyleMethod(Exception): - def __init__(self, style_method, available_methods, analysis_klasses): - self.style_method = style_method - self.available_methods = available_methods - self.msg =\ - "style_method of '{self.style_method}' not found in '{available_methods}', all analysis_klasses is []'" - - -class StylingAnalysis(ColAnalysis): - provides_defaults = {} - pinned_rows = [] - - #the type should be - #def style_column(col:str, column_metadata: SingleColumnMetadata) -> ColumnConfig: - @classmethod - def style_column(kls, col, column_metadata): - return {'col_name':str(col), 'displayer_args': {'displayer': 'obj'}} - - #what is the key for this in the df_display_args_dictionary - df_display_name = "main" - data_key = "main" - summary_stats_key= 'all_stats' - - @classmethod - def style_columns(kls, sd): - ret_col_config = [] - - #this is necessary for polars to add an index column, which is - #required so that summary_stats makes sense - if 'index' not in sd: - ret_col_config.append({'col_name': 'index', 'displayer_args': {'displayer': 'obj'}}) - - for col in sd.keys(): - col_meta = sd[col] - base_style = kls.style_column(col, col_meta) - if 'column_config_override' in col_meta: - base_style.update(col_meta['column_config_override']) - ret_col_config.append(base_style) - - return { - 'pinned_rows': kls.pinned_rows, - 'column_config': ret_col_config} - - - -class PostProcessingException(Exception): - pass - -EMPTY_DFVIEWER_CONFIG = { - 'pinned_rows': [], - 'column_config': []} -EMPTY_DF_DISPLAY_ARG = {'data_key': 'empty', 'df_viewer_config': EMPTY_DFVIEWER_CONFIG, - 'summary_stats_key': 'empty'} - -class Sampling: - - max_columns = 250 - pre_limit = 100_000 - serialize_limit = 10_000 - - @classmethod - def pre_stats_sample(kls, df): - if len(df.columns) > kls.max_columns: - print("Removing excess columns, found %d columns" % len(df.columns)) - df = df[df.columns[:kls.max_columns]] - if kls.pre_limit and len(df) > kls.pre_limit: - return df.sample(kls.pre_limit) - return df - - - @classmethod - def serialize_sample(kls, df): - if kls.serialize_limit and len(df) > kls.serialize_limit: - return df.sample(kls.serialize_limit) - return df - class CustomizableDataflow(DataFlow): """ This allows targetd extension and customization of DataFlow diff --git a/buckaroo/dataflow/dataflow_extras.py b/buckaroo/dataflow/dataflow_extras.py new file mode 100644 index 000000000..b906c2710 --- /dev/null +++ b/buckaroo/dataflow/dataflow_extras.py @@ -0,0 +1,164 @@ +import sys +import pandas as pd +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) + +EMPTY_DFVIEWER_CONFIG = { + 'pinned_rows': [], + 'column_config': []} +EMPTY_DF_DISPLAY_ARG = {'data_key': 'empty', 'df_viewer_config': EMPTY_DFVIEWER_CONFIG, + 'summary_stats_key': 'empty'} + + +SENTINEL_DF_1 = pd.DataFrame({'foo' :[10, 20], 'bar' : ["asdf", "iii"]}) +SENTINEL_DF_2 = pd.DataFrame({'col1' :[55, 55], 'col2': ["pppp", "333"]}) + +SENTINEL_COLUMN_CONFIG_1 = "ASDF" +SENTINEL_COLUMN_CONFIG_2 = "FOO-BAR" + + + +def merge_ops(existing_ops, cleaning_ops): + """ strip cleaning_ops from existing_ops, reinsert cleaning_ops at the beginning """ + a = existing_ops.copy() + a.extend(cleaning_ops) + return a + +def merge_sds(*sds): + """merge sds with later args taking precedence + + sub-merging of "overide_config"?? + """ + base_sd = {} + for sd in sds: + for column in sd.keys(): + base_sd[column] = merge_column(base_sd.get(column, {}), sd[column]) + return base_sd + + +def merge_column(base, new): + """ + merge individual column dictionaries, with special handling for column_config_override + """ + ret = base.copy() + ret.update(new) + + base_override = base.get('column_config_override', {}).copy() + new_override = new.get('column_config_override', {}).copy() + base_override.update(new_override) + + if len(base_override) > 0: + ret['column_config_override'] = base_override + return ret + + +def merge_column_config(styled_column_config, overide_column_configs): + existing_column_config = styled_column_config.copy() + ret_column_config = [] + for row in existing_column_config: + col = row['col_name'] + if col in overide_column_configs: + row.update(overide_column_configs[col]) + if row.get('merge_rule', 'blank') == 'hidden': + continue + ret_column_config.append(row) + return ret_column_config + +def style_columns(style_method:str, sd): + if style_method == "foo": + return SENTINEL_COLUMN_CONFIG_2 + else: + ret_col_config = [] + for col in sd.keys(): + ret_col_config.append( + {'col_name':col, 'displayer_args': {'displayer': 'obj'}}) + return { + 'pinned_rows': [ + # {'primary_key_val': 'dtype', 'displayer_args': {'displayer': 'obj'}} + ], + 'column_config': ret_col_config} + + +def exception_protect(protect_name=None): + """ + used to make sure that an exception from any part of DataFlow derived classes has the minimum amount of traitlets observer stuff in the stack trace. + + Requires that a a class has `self.exception` + + protect_name occurs in the printed exception handler to narrow down the call stack + + """ + def wrapped_decorator(func): + def wrapped(self, *args, **kwargs): + try: + func(self, *args, **kwargs) + except Exception: + #sometimes useful for debugging tricky call order stuff + # if protect_name: + # print("protect handler", protect_name, self.exception) + if self.exception is None: + self.exception = sys.exc_info() + raise + return wrapped + return wrapped_decorator + + + + +class Sampling: + + max_columns = 250 + pre_limit = 100_000 + serialize_limit = 10_000 + + @classmethod + def pre_stats_sample(kls, df): + if len(df.columns) > kls.max_columns: + print("Removing excess columns, found %d columns" % len(df.columns)) + df = df[df.columns[:kls.max_columns]] + if kls.pre_limit and len(df) > kls.pre_limit: + return df.sample(kls.pre_limit) + return df + + + @classmethod + def serialize_sample(kls, df): + if kls.serialize_limit and len(df) > kls.serialize_limit: + return df.sample(kls.serialize_limit) + return df + + +class StylingAnalysis(ColAnalysis): + provides_defaults = {} + pinned_rows = [] + + #the type should be + #def style_column(col:str, column_metadata: SingleColumnMetadata) -> ColumnConfig: + @classmethod + def style_column(kls, col, column_metadata): + return {'col_name':str(col), 'displayer_args': {'displayer': 'obj'}} + + #what is the key for this in the df_display_args_dictionary + df_display_name = "main" + data_key = "main" + summary_stats_key= 'all_stats' + + @classmethod + def style_columns(kls, sd): + ret_col_config = [] + + #this is necessary for polars to add an index column, which is + #required so that summary_stats makes sense + if 'index' not in sd: + ret_col_config.append({'col_name': 'index', 'displayer_args': {'displayer': 'obj'}}) + + for col in sd.keys(): + col_meta = sd[col] + base_style = kls.style_column(col, col_meta) + if 'column_config_override' in col_meta: + base_style.update(col_meta['column_config_override']) + ret_col_config.append(base_style) + + return { + 'pinned_rows': kls.pinned_rows, + 'column_config': ret_col_config} + diff --git a/buckaroo/dataflow/widget_extension_utils.py b/buckaroo/dataflow/widget_extension_utils.py new file mode 100644 index 000000000..b1534c67b --- /dev/null +++ b/buckaroo/dataflow/widget_extension_utils.py @@ -0,0 +1,117 @@ +from buckaroo.customizations.styling import (DefaultMainStyling) +from buckaroo.buckaroo_widget import RawDFViewerWidget, BuckarooWidget + +def find_most_specific_styling(klasses, df_display_name='main'): + """if we have multiple styling klasses, all of which extend StylingAnalysis keyed to df_display_name='main' + we want a deterministic result for which one is the called class to provide styling for that key + + if B extends A, B is more specific. + + Since most class extension for styling will work by extending + DefaultMainStyling, try to follow the user's intent by making sure + the most specific class is chosen + + https://stackoverflow.com/questions/23660447/how-can-i-sort-a-list-of-python-classes-by-inheritance-depth + """ + styling_klasses = filter(lambda x: issubclass(x, DefaultMainStyling), klasses) + klasses_by_depth = sorted(styling_klasses, key=lambda x: len(x.__mro__)) + return klasses_by_depth[-1] + +class InvalidArgumentException(Exception): + pass +def analysis_extend( + BaseBuckarooKls, + extra_analysis_klasses=None, analysis_klasses=None): + + # In this case we are going to extend PolarsBuckarooWidget so we + # can take this combination with us + base_a_klasses = BaseBuckarooKls.analysis_klasses.copy() + if extra_analysis_klasses: + if analysis_klasses is not None: + raise InvalidArgumentException( + "Must specify either extra_analysis_klasses or analysis_klasses, not both") + base_a_klasses.extend(extra_analysis_klasses) + elif analysis_klasses: + base_a_klasses = analysis_klasses + return base_a_klasses + +def get_styling_analysis( + BaseStylingKlass, + extra_pinned_rows=None, pinned_rows=None): + + base_pinned_rows = BaseStylingKlass.pinned_rows.copy() + if extra_pinned_rows: + if pinned_rows is not None: + raise InvalidArgumentException( + "Must specify either extra_pinned_rows or pinned_rows, not both") + base_pinned_rows.extend(extra_pinned_rows) + elif pinned_rows is not None: # is not None accomodates empty list + base_pinned_rows = pinned_rows + + class SyntheticStyling(BaseStylingKlass): + pinned_rows = base_pinned_rows + df_display_name = "dfviewer_special" + + return SyntheticStyling + + +def configure_buckaroo( + BaseBuckarooKls, + extra_pinned_rows=None, pinned_rows=None, + extra_analysis_klasses=None, analysis_klasses=None): + """Used to instantiate a synthetic Buckaroo class with easier extension methods. + + It seemed more straight forward to write this as a completely + separate function vs a classmethod so that things are clear vs + inheritance + """ + + + a_klasses = analysis_extend( + BaseBuckarooKls, + extra_analysis_klasses, analysis_klasses) + + #there could possibly be another way of picking off the styling + #klass vs just knowing that it's default BaseStylingKls + #BaseStylingKls = DefaultMainStyling + BaseStylingKls = find_most_specific_styling(a_klasses) + + special_styling_analysis_klass = get_styling_analysis( + BaseStylingKls, extra_pinned_rows, pinned_rows) + + a_klasses.append(special_styling_analysis_klass) + + class TempBuckarooWidget(BaseBuckarooKls): + analysis_klasses = a_klasses + return TempBuckarooWidget + + + +def DFViewer(df, + column_config_overrides=None, + extra_pinned_rows=None, pinned_rows=None, + extra_analysis_klasses=None, analysis_klasses=None): + """ + Display a DataFrame with buckaroo styling and analysis, no extra UI pieces + + column_config_overrides allows targetted specific overriding of styling + + extra_pinned_rows adds pinned_rows of summary stats + pinned_rows replaces the default pinned rows + + extra_analysis_klasses adds an analysis_klass + analysis_klasses replaces default analysis_klass + """ + BuckarooKls = configure_buckaroo( + BuckarooWidget, + extra_pinned_rows=extra_pinned_rows, pinned_rows=pinned_rows, + extra_analysis_klasses=extra_analysis_klasses, analysis_klasses=analysis_klasses) + + bw = BuckarooKls(df, column_config_overrides=column_config_overrides) + dfv_config = bw.df_display_args['dfviewer_special']['df_viewer_config'] + df_data = bw.df_data_dict['main'] + summary_stats_data = bw.df_data_dict['all_stats'] + return RawDFViewerWidget( + df_data=df_data, df_viewer_config=dfv_config, summary_stats_data=summary_stats_data) + + diff --git a/buckaroo/polars_buckaroo.py b/buckaroo/polars_buckaroo.py index 436be9cee..f5916b24f 100644 --- a/buckaroo/polars_buckaroo.py +++ b/buckaroo/polars_buckaroo.py @@ -1,5 +1,5 @@ import polars as pl -from buckaroo.buckaroo_widget import BuckarooWidget +from buckaroo.buckaroo_widget import BuckarooWidget, RawDFViewerWidget from .customizations.polars_analysis import PL_Analysis_Klasses from .pluggable_analysis_framework.polars_analysis_management import ( PlDfStats) @@ -9,7 +9,7 @@ ) from .customizations.styling import DefaultSummaryStatsStyling, DefaultMainStyling from .dataflow.dataflow import Sampling - +from .dataflow.widget_extension_utils import configure_buckaroo class PLSampling(Sampling): pre_limit = False @@ -44,3 +44,33 @@ def _df_to_obj(self, df): #return pd_to_obj(self.sampling_klass.serialize_sample(df).to_pandas()) return pd_to_obj(self.sampling_klass.serialize_sample(df.to_pandas())) +def PolarsDFViewer(df, + column_config_overrides=None, + extra_pinned_rows=None, pinned_rows=None, + extra_analysis_klasses=None, analysis_klasses=None, + ): + """ + Display a Polars DataFrame with buckaroo styling and analysis, no extra UI pieces + + column_config_overrides allows targetted specific overriding of styling + + extra_pinned_rows adds pinned_rows of summary stats + pinned_rows replaces the default pinned rows + + extra_analysis_klasses adds an analysis_klass + analysis_klasses replaces default analysis_klass + """ + BuckarooKls = configure_buckaroo( + PolarsBuckarooWidget, + extra_pinned_rows=extra_pinned_rows, pinned_rows=pinned_rows, + extra_analysis_klasses=extra_analysis_klasses, analysis_klasses=analysis_klasses) + + bw = BuckarooKls(df, column_config_overrides=column_config_overrides) + dfv_config = bw.df_display_args['dfviewer_special']['df_viewer_config'] + df_data = bw.df_data_dict['main'] + summary_stats_data = bw.df_data_dict['all_stats'] + return RawDFViewerWidget( + df_data=df_data, df_viewer_config=dfv_config, summary_stats_data=summary_stats_data) + + + diff --git a/buckaroo/solara/__init__.py b/buckaroo/solara/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/buckaroo/solara/__init__.py @@ -0,0 +1 @@ + diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 8cc556eb3..d1983da6f 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -2,6 +2,20 @@ from .buckaroo_widget import BuckarooWidget import pandas as pd +def is_in_ipython(): + + try: + from IPython.core.getipython import get_ipython + except ImportError: + raise ImportError('This feature requires IPython 1.0+') + + ip = get_ipython() + if ip is None: + #print("must be running inside ipython to enable default display via enable()") + return False + return ip + + def enable(sampled=True, summaryStats=False, reorderdColumns=False, @@ -16,17 +30,8 @@ def enable(sampled=True, """ - - try: - from IPython.core.getipython import get_ipython - except ImportError: - raise ImportError('This feature requires IPython 1.0+') - - ip = get_ipython() - if ip is None: - print("must be running inside ipython to enable default display via enable()") - return - + ip = is_in_ipython() + def _display_as_buckaroo(df): from IPython.display import display try: @@ -61,24 +66,22 @@ def _display_polars_as_buckaroo(polars_df): ip_formatter.for_type(pl.DataFrame, _display_polars_as_buckaroo) except ImportError: pass + return True def disable(): """ disable bucakroo as the default display method for DataFrames """ - try: - from IPython.core.getipython import get_ipython - except ImportError: - raise ImportError('This feature requires IPython 1.0+') - ip = get_ipython() + ip = is_in_ipython() ip_formatter = ip.display_formatter.ipython_display_formatter - ip_formatter.type_printers.pop(pd.DataFrame, None) + ip_formatter.type_printers.pop(pd.DataFrame, None) + try: import polars as pl ip_formatter.type_printers.pop(pl.DataFrame, None) except ImportError: pass - + print("The default DataFrame displayers have been restored. To re-enable Buckaroo use `from buckaroo import enable; enable()`") diff --git a/example-notebooks/DFViewer.ipynb b/example-notebooks/DFViewer.ipynb new file mode 100644 index 000000000..ab0578eb9 --- /dev/null +++ b/example-notebooks/DFViewer.ipynb @@ -0,0 +1,121 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e95ac3e5-4532-4aad-9ad1-4096d0e2d631", + "metadata": {}, + "source": [ + "# DFViewer\n", + "\n", + "The DFViewerWidget allows you to display a dataframe like the the full BuckarooWidget, without any extra UI options.\n", + "\n", + "This works particularly well for embedding Buckaroo into widget or dashboarding frameworks like Solara" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0150f9f-0fb0-487f-88ad-9c495c406e59", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from buckaroo import DFViewer" + ] + }, + { + "cell_type": "markdown", + "id": "acea57ee-06b6-4244-b6d4-fa14a8747e94", + "metadata": {}, + "source": [ + "# Using the default DFViewer is straightforward" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db41edd1-0569-4cb4-b95a-aaf82e854903", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.DataFrame({'a':[10, 20, 339, 887], 'b': ['foo', 'bar', None, 'baz']})\n", + "DFViewer(df)" + ] + }, + { + "cell_type": "markdown", + "id": "fabc0d41-9343-463e-b2f5-b43671a1d7e2", + "metadata": {}, + "source": [ + "## Removing pinned_rows" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4887466f-afaa-4adc-809a-bb4bdf064d17", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "DFViewer(df, pinned_rows=[])" + ] + }, + { + "cell_type": "markdown", + "id": "fa8be87e-3b64-44e4-acda-76bba7566990", + "metadata": {}, + "source": [ + "## It works with polars too" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "566d9cc1-c1bb-431b-bbab-776e029adebc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import polars as pl\n", + "from buckaroo.polars_buckaroo import PolarsDFViewer\n", + "pl_df = pl.DataFrame({'a':[10, 20, 339, 887], 'b': ['foo', 'bar', None, 'baz']})\n", + "PolarsDFViewer(pl_df)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/ex/DFViewerEx_large.tsx b/examples/ex/DFViewerEx_large.tsx index f1790a9b0..5b5f9e090 100644 --- a/examples/ex/DFViewerEx_large.tsx +++ b/examples/ex/DFViewerEx_large.tsx @@ -258,7 +258,7 @@ const dictOfListsToListOfDicts = (a: Record) : Record; diff --git a/examples/ex/DFViewerEx_real_summary.tsx b/examples/ex/DFViewerEx_real_summary.tsx index 32692abd0..276f3b578 100644 --- a/examples/ex/DFViewerEx_real_summary.tsx +++ b/examples/ex/DFViewerEx_real_summary.tsx @@ -12,7 +12,7 @@ import { realSummaryConfig, realSummaryTableData } from '../../js/baked_data/sta 'df':realSummaryTableData, 'df_viewer_config': realSummaryConfig, 'summary_stats_data':realSummaryTableData }; - return ; diff --git a/examples/ex/DFViewerEx_string_index.tsx b/examples/ex/DFViewerEx_string_index.tsx index e14cecf5b..36bc86aea 100644 --- a/examples/ex/DFViewerEx_string_index.tsx +++ b/examples/ex/DFViewerEx_string_index.tsx @@ -998,7 +998,7 @@ const summary_stats_data =[ const working = {'df':data, 'df_viewer_config': dfvConfig, 'summary_stats_data':summary_stats_data}; - return ; diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index abe235dba..29dddb902 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -88,7 +88,7 @@ export function WidgetDCFCell({ buckarooOptions={buckaroo_options} /> void; -export function DFViewer( - { - df, - df_viewer_config, - summary_stats_data, - style, - activeCol, - setActiveCol, - }: { - df: DFData; - df_viewer_config: DFViewerConfig; - summary_stats_data?: DFData; - style?: CSSProperties; - activeCol?: string; - setActiveCol?: setColumFunc; - } = { +export function DFViewer({ + df_data: df, + df_viewer_config, + summary_stats_data, + style, + activeCol, + setActiveCol, +}: { + df_data: DFData; + df_viewer_config: DFViewerConfig; + summary_stats_data?: DFData; + style?: CSSProperties; + activeCol?: string; + setActiveCol?: setColumFunc; +}) { + /* = { df: EmptyDf.data, df_viewer_config: EmptyDf.dfviewer_config, summary_stats_data: [], style: { height: '300px' }, setActiveCol: () => null, - } -) { + }*/ //console.log("dfviewer df_viewer_config", df_viewer_config); // console.log("summary_stats_data", summary_stats_data); // console.log("full_object", {'df':df, 'df_viewer_config':df_viewer_config, 'summary_stats_data': summary_stats_data}) @@ -128,7 +127,7 @@ export function DFViewerEx() { const [activeCol, setActiveCol] = useState('tripduration'); return (

    series_summary

    diff --git a/js/dcefwidget.ts b/js/dcefwidget.ts index c88c23502..b995149bb 100644 --- a/js/dcefwidget.ts +++ b/js/dcefwidget.ts @@ -20,6 +20,7 @@ import { MODULE_NAME, MODULE_VERSION } from './version'; import 'ag-grid-community/styles/ag-grid.css'; import 'ag-grid-community/styles/ag-theme-alpine.css'; import '../js/style/dcf-npm.css'; +import { DFViewer } from './components/DFViewerParts/DFViewer'; export class DCEFWidgetModel extends DOMWidgetModel { defaults(): Backbone.ObjectHash { @@ -75,3 +76,58 @@ export class DCEFWidgetView extends DOMWidgetView { root.render(componentEl); } } +export class DFViewerModel extends DOMWidgetModel { + defaults(): Backbone.ObjectHash { + return { + ...super.defaults(), + _model_name: DFViewerModel.model_name, + _model_module: DFViewerModel.model_module, + _model_module_version: DFViewerModel.model_module_version, + _view_name: DFViewerModel.view_name, + _view_module: DFViewerModel.view_module, + _view_module_version: DFViewerModel.view_module_version, + }; + } + + static serializers: ISerializers = { + ...DOMWidgetModel.serializers, + // Add any extra serializers here + }; + + static model_name = 'DFViewerModel'; + static model_module = MODULE_NAME; + static model_module_version = MODULE_VERSION; + static view_name = 'DFViewerView'; // Set to null if no view + static view_module = MODULE_NAME; // Set to null if no view + static view_module_version = MODULE_VERSION; +} +export class DFViewerView extends DOMWidgetView { + render(): void { + this.el.classList.add('dfviewer-widget'); + + const Component = () => { + const [_, setCounter] = useState(0); + const forceRerender = () => { + setCounter((x: number) => x + 1); + }; + useEffect(() => { + this.listenTo(this.model, 'change', forceRerender); + }, []); + + const props: any = {}; + for (const key of Object.keys(this.model.attributes)) { + props[key] = this.model.get(key); + props['on_' + key] = (value: any) => { + this.model.set(key, value); + this.touch(); + }; + } + return React.createElement(DFViewer, props); + //return React.createElement(WidgetDCFCell, props); + }; + + const root = ReactDOMClient.createRoot(this.el); + const componentEl = React.createElement(Component, {}); + root.render(componentEl); + } +} diff --git a/tests/unit/dataflow/widget_extension_tests.py b/tests/unit/dataflow/widget_extension_tests.py new file mode 100644 index 000000000..58025c502 --- /dev/null +++ b/tests/unit/dataflow/widget_extension_tests.py @@ -0,0 +1,92 @@ +import pytest +from buckaroo.dataflow.widget_extension_utils import ( + find_most_specific_styling, analysis_extend, get_styling_analysis, + InvalidArgumentException, + configure_buckaroo) +from buckaroo.customizations.styling import (DefaultMainStyling, obj_) +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) +from buckaroo.buckaroo_widget import BuckarooWidget + +def foo(): + print(analysis_extend, get_styling_analysis, configure_buckaroo) + +class Custom_1(ColAnalysis): + pass + +class CustomStyling(DefaultMainStyling): + pinned_rows= ['foo'] + +class ExtendedCustomStyling(CustomStyling): + pinned_rows= ['foo', 'bar'] + +def test_find_most_specific_styling(): + # Custom_1 doesn't extend DefaultMain, it looses + assert find_most_specific_styling([Custom_1, DefaultMainStyling]) == DefaultMainStyling + #order shouldn't matter + assert find_most_specific_styling([DefaultMainStyling, Custom_1]) == DefaultMainStyling + + assert find_most_specific_styling([CustomStyling, DefaultMainStyling]) == CustomStyling + assert find_most_specific_styling([DefaultMainStyling, CustomStyling]) == CustomStyling + + assert find_most_specific_styling([ExtendedCustomStyling, CustomStyling, DefaultMainStyling]) == ExtendedCustomStyling + assert find_most_specific_styling([DefaultMainStyling, CustomStyling, ExtendedCustomStyling]) == ExtendedCustomStyling + +def test_analysis_extend(): + #Custom_1 doesn't extend BaseStylingKlass, so it won't work + assert [Custom_1] == analysis_extend(BuckarooWidget, analysis_klasses=[Custom_1]) + + base_len = len(BuckarooWidget.analysis_klasses) + extra_kls_lst = analysis_extend(BuckarooWidget, extra_analysis_klasses=[Custom_1]) + assert Custom_1 in extra_kls_lst + assert len(extra_kls_lst) == (base_len) + 1 + + with pytest.raises(InvalidArgumentException): + analysis_extend(BuckarooWidget, extra_analysis_klasses=[Custom_1], analysis_klasses=[ExtendedCustomStyling]) + + +foo_row = obj_('foo') + +def test_get_styling_analysis(): + base_pinned_row_len = len(DefaultMainStyling.pinned_rows) + ExtraFooStyling = get_styling_analysis( + DefaultMainStyling, + extra_pinned_rows=[foo_row]) + + assert foo_row in ExtraFooStyling.pinned_rows + assert len(ExtraFooStyling.pinned_rows) == (base_pinned_row_len + 1) + + ReplacePinnedStyling = get_styling_analysis(DefaultMainStyling, pinned_rows=[foo_row]) + assert ReplacePinnedStyling.pinned_rows == [foo_row] + with pytest.raises(InvalidArgumentException): + get_styling_analysis(DefaultMainStyling, extra_pinned_rows=[1], pinned_rows=[2]) + +def test_configure_buckaroo_extra(): + + ExtraBuckaroo = configure_buckaroo( + BuckarooWidget, extra_pinned_rows=[foo_row], extra_analysis_klasses=[Custom_1]) + SyntheticStyling = [kls for kls in ExtraBuckaroo.analysis_klasses if kls.__name__ == 'SyntheticStyling'][0] + + base_pinned_row_len = len(DefaultMainStyling.pinned_rows) + + assert foo_row in SyntheticStyling.pinned_rows + assert len(SyntheticStyling.pinned_rows) == (base_pinned_row_len + 1) + + assert Custom_1 in ExtraBuckaroo.analysis_klasses + + +def test_configure_buckaroo_replace(): + + ReplaceBuckaroo = configure_buckaroo( + BuckarooWidget, analysis_klasses=[Custom_1, DefaultMainStyling], + pinned_rows=[foo_row]) + + #bad things will happen if there isn't a Styling, but I'd caveat empetor for that + + SyntheticStyling = [kls for kls in ReplaceBuckaroo.analysis_klasses if kls.__name__ == 'SyntheticStyling'][0] + + assert SyntheticStyling.pinned_rows == [foo_row] + + assert len(ReplaceBuckaroo.analysis_klasses) == 3 + assert Custom_1 in ReplaceBuckaroo.analysis_klasses + + From 939061114610fd62ffc0b34502f6e0f7284083fe Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 23 Feb 2024 13:15:16 -0500 Subject: [PATCH 210/250] Add solara component (#234) Adds SolaraBuckarooWidget, SolaraDFViewer, SolaraPolarsBuckarooWidget, SolaraPolarsDFViewer Fixes https://github.com/paddymul/buckaroo/issues/229 --- buckaroo/solara_buckaroo.py | 69 ++++++++++ example-notebooks/Solara-Buckaroo.ipynb | 163 ++++++++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 buckaroo/solara_buckaroo.py create mode 100644 example-notebooks/Solara-Buckaroo.ipynb diff --git a/buckaroo/solara_buckaroo.py b/buckaroo/solara_buckaroo.py new file mode 100644 index 000000000..24a1318b3 --- /dev/null +++ b/buckaroo/solara_buckaroo.py @@ -0,0 +1,69 @@ +from buckaroo import BuckarooWidget +from buckaroo.buckaroo_widget import RawDFViewerWidget +from buckaroo.dataflow.widget_extension_utils import configure_buckaroo + +def SolaraDFViewer(df, column_config_overrides=None, + extra_pinned_rows=None, pinned_rows=None, + extra_analysis_klasses=None, analysis_klasses=None): + import reacton + BuckarooKls = configure_buckaroo( + BuckarooWidget, + extra_pinned_rows=extra_pinned_rows, pinned_rows=pinned_rows, + extra_analysis_klasses=extra_analysis_klasses, analysis_klasses=analysis_klasses) + + bw = BuckarooKls(df, column_config_overrides=column_config_overrides) + dfv_config = bw.df_display_args['dfviewer_special']['df_viewer_config'] + df_data = bw.df_data_dict['main'] + summary_stats_data = bw.df_data_dict['all_stats'] + + comp = reacton.core.ComponentWidget(widget=RawDFViewerWidget) + + element_kwargs = dict(df_data=df_data, df_viewer_config=dfv_config, summary_stats_data=summary_stats_data) + + return reacton.core.Element(comp, kwargs=element_kwargs) + +def SolaraBuckarooWidget(df, column_config_overrides=None, + extra_pinned_rows=None, pinned_rows=None, + extra_analysis_klasses=None, analysis_klasses=None): + import reacton + BuckarooKls = configure_buckaroo( + BuckarooWidget, + extra_pinned_rows=extra_pinned_rows, pinned_rows=pinned_rows, + extra_analysis_klasses=extra_analysis_klasses, analysis_klasses=analysis_klasses) + + comp = reacton.core.ComponentWidget(widget=BuckarooKls) + return reacton.core.Element(comp, df=df, column_config_overrides=column_config_overrides) + +def SolaraPolarsDFViewer(df, column_config_overrides=None, + extra_pinned_rows=None, pinned_rows=None, + extra_analysis_klasses=None, analysis_klasses=None): + import reacton + from buckaroo.polars_buckaroo import PolarsBuckarooWidget + BuckarooKls = configure_buckaroo( + PolarsBuckarooWidget, + extra_pinned_rows=extra_pinned_rows, pinned_rows=pinned_rows, + extra_analysis_klasses=extra_analysis_klasses, analysis_klasses=analysis_klasses) + + bw = BuckarooKls(df, column_config_overrides=column_config_overrides) + dfv_config = bw.df_display_args['dfviewer_special']['df_viewer_config'] + df_data = bw.df_data_dict['main'] + summary_stats_data = bw.df_data_dict['all_stats'] + + comp = reacton.core.ComponentWidget(widget=RawDFViewerWidget) + + element_kwargs = dict(df_data=df_data, df_viewer_config=dfv_config, summary_stats_data=summary_stats_data) + + return reacton.core.Element(comp, kwargs=element_kwargs) + +def SolaraPolarsBuckarooWidget(df, column_config_overrides=None, + extra_pinned_rows=None, pinned_rows=None, + extra_analysis_klasses=None, analysis_klasses=None): + import reacton + from buckaroo.polars_buckaroo import PolarsBuckarooWidget + BuckarooKls = configure_buckaroo( + PolarsBuckarooWidget, + extra_pinned_rows=extra_pinned_rows, pinned_rows=pinned_rows, + extra_analysis_klasses=extra_analysis_klasses, analysis_klasses=analysis_klasses) + + comp = reacton.core.ComponentWidget(widget=BuckarooKls) + return reacton.core.Element(comp, df=df, column_config_overrides=column_config_overrides) diff --git a/example-notebooks/Solara-Buckaroo.ipynb b/example-notebooks/Solara-Buckaroo.ipynb new file mode 100644 index 000000000..5a1a84bda --- /dev/null +++ b/example-notebooks/Solara-Buckaroo.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d69037a0-5b72-469c-8de7-d48a2788bede", + "metadata": {}, + "source": [ + "# Buckaroo works in Solara too" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79fc4322-12b9-42bb-8bc6-2139e1a7d1f8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import solara\n", + "from buckaroo.solara_buckaroo import SolaraDFViewer, SolaraBuckarooWidget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd085457-3ecf-438d-bf03-be1c2f0fa8ef", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.DataFrame({'a':[10,20]})\n", + "@solara.component\n", + "def Page():\n", + " bw = SolaraDFViewer(df=df)\n", + "display(Page())" + ] + }, + { + "cell_type": "markdown", + "id": "ce7aec8e-412a-46a4-af4e-7a026fd33fa1", + "metadata": {}, + "source": [ + "## You can turn off pinned_rows too" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b3558422-55f4-4f88-b85d-71e910d10bd5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "df = pd.DataFrame({'a':[10,20]})\n", + "@solara.component\n", + "def Page():\n", + " bw = SolaraDFViewer(df=df, pinned_rows=[])\n", + "display(Page())" + ] + }, + { + "cell_type": "markdown", + "id": "1551cd59-2e52-4fd0-9d93-f136eed71e2d", + "metadata": {}, + "source": [ + "# And it works with Polars" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7e2556c-b768-408b-8aa2-bb81bd91ee9c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import polars as pl\n", + "from buckaroo.solara_buckaroo import SolaraPolarsDFViewer, SolaraPolarsBuckarooWidget\n", + "df = pl.DataFrame({'a':[10,20]})\n", + "@solara.component\n", + "def Page():\n", + " bw = SolaraPolarsDFViewer(df=df, pinned_rows=[])\n", + "display(Page())" + ] + }, + { + "cell_type": "markdown", + "id": "02db2eb2-0b6a-40c4-bcc8-b310a1d6e405", + "metadata": {}, + "source": [ + "# Let's look at more data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f74b8fb-7ba3-4c33-ad2e-e17baad839bc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cb_trips_df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22d571e5-6bf2-4a5f-8bfe-2c69d679f8f8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "@solara.component\n", + "def Page():\n", + " bw = SolaraDFViewer(df=cb_trips_df, pinned_rows=[])\n", + "display(Page())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f87e093-c12c-4761-94ac-16c3b7bd7662", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2638d0516ca9ee7470fd837172a62d105838f56c Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 23 Feb 2024 13:16:08 -0500 Subject: [PATCH 211/250] Feat/sorted sampling (#235) Assures that pandas dataframes are sorted by index when sampled. --- buckaroo/buckaroo_widget.py | 8 +++++++- buckaroo/dataflow/dataflow_extras.py | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/buckaroo/buckaroo_widget.py b/buckaroo/buckaroo_widget.py index 1799b724d..ea12d67e1 100644 --- a/buckaroo/buckaroo_widget.py +++ b/buckaroo/buckaroo_widget.py @@ -23,7 +23,7 @@ from .serialization_utils import EMPTY_DF_WHOLE from .dataflow.dataflow import CustomizableDataflow, StylingAnalysis, exception_protect - +from .dataflow.dataflow_extras import (Sampling) class BuckarooProjectWidget(DOMWidget): """ @@ -38,6 +38,10 @@ class BuckarooProjectWidget(DOMWidget): +class PdSampling(Sampling): + #pre_limit = 500_000 + pre_limit = False + class BuckarooWidget(CustomizableDataflow, BuckarooProjectWidget): """Extends CustomizableDataFlow and DOMWIdget @@ -51,6 +55,8 @@ class BuckarooWidget(CustomizableDataflow, BuckarooProjectWidget): _view_name = Unicode('DCEFWidgetView').tag(sync=True) #END DOMWidget Boilerplate + sampling_klass = PdSampling + operations = List().tag(sync=True) operation_results = Dict( {'transformed_df': EMPTY_DF_WHOLE, 'generated_py_code':'# instantiation, unused'} diff --git a/buckaroo/dataflow/dataflow_extras.py b/buckaroo/dataflow/dataflow_extras.py index b906c2710..1d4c59d94 100644 --- a/buckaroo/dataflow/dataflow_extras.py +++ b/buckaroo/dataflow/dataflow_extras.py @@ -116,14 +116,20 @@ def pre_stats_sample(kls, df): print("Removing excess columns, found %d columns" % len(df.columns)) df = df[df.columns[:kls.max_columns]] if kls.pre_limit and len(df) > kls.pre_limit: - return df.sample(kls.pre_limit) + sampled = df.sample(kls.pre_limit) + if isinstance(sampled, pd.DataFrame): + return sampled.sort_index() + return sampled return df @classmethod def serialize_sample(kls, df): if kls.serialize_limit and len(df) > kls.serialize_limit: - return df.sample(kls.serialize_limit) + sampled = df.sample(kls.serialize_limit) + if isinstance(sampled, pd.DataFrame): + return sampled.sort_index() + return sampled return df From 40c59a4eec6786c695a64c46b45300936ae0a4d6 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 23 Feb 2024 13:44:50 -0500 Subject: [PATCH 212/250] version bump (#236) This releases fixes for Add a DFViewer component #231 Add image displayer #228 SolaraBuckaroo #229 At least notify users that Buckaroo has changed output handler for DataFrames, show debug statement #225 --- .bumpversion.cfg | 2 +- buckaroo/_version.py | 2 +- docs/source/conf.py | 2 +- package.json | 2 +- pyproject.toml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 18087329e..ffcd695b9 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.4.8 +current_version = 0.6.3 commit = True tag = True diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 601c25b9a..61b0a3232 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.6.2" +__version__ = "0.6.3" diff --git a/docs/source/conf.py b/docs/source/conf.py index 642f4e09d..d7aeee9e4 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.6.2' +release = '0.6.3' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/package.json b/package.json index 0049df73e..a05ad8108 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.6.2", + "version": "0.6.3", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 47a76271f..45ed314f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.6.2" +version = "0.6.3" [project.license] file = "LICENSE.txt" From 5294f3268b278aa2cdf917a0f22a601a1d62a209 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 29 Feb 2024 07:04:55 -0500 Subject: [PATCH 213/250] Docs and notebook fixes (#241) --- example-notebooks/Extending.ipynb | 3 ++- example-notebooks/Full-tour.ipynb | 7 +++---- example-notebooks/Solara-Buckaroo.ipynb | 28 +++++++++++++++++++++++-- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/example-notebooks/Extending.ipynb b/example-notebooks/Extending.ipynb index e3d0da71c..e2b0662d3 100644 --- a/example-notebooks/Extending.ipynb +++ b/example-notebooks/Extending.ipynb @@ -30,7 +30,7 @@ "source": [ "import pandas as pd\n", "import numpy as np\n", - "from buckaroo.dataflow import StylingAnalysis\n", + "from buckaroo.dataflow.dataflow_extras import StylingAnalysis\n", "from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis\n", "import polars as pl\n", "from polars import functions as F\n", @@ -98,6 +98,7 @@ "class Quin99Analysis(StylingAnalysis):\n", " select_clauses = [\n", " cs.numeric().quantile(.99).name.map(json_postfix('quin99'))]\n", + " \n", " pinned_rows = [{'primary_key_val': 'quin99', 'displayer_args': {'displayer': 'obj' }}]\n", " df_display_name = 'quin99'\n", " data_key = \"empty\" # the non pinned rows will pull from the empty dataframe\n", diff --git a/example-notebooks/Full-tour.ipynb b/example-notebooks/Full-tour.ipynb index 53fc7a6fd..6741809d9 100644 --- a/example-notebooks/Full-tour.ipynb +++ b/example-notebooks/Full-tour.ipynb @@ -77,8 +77,8 @@ }, "outputs": [], "source": [ - "df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")\n", - "#df = pd.read_csv(\"/Users/paddy/code/example-notebooks/citibike-trips.csv\") #for airplane work\n", + "df = pd.read_csv(\"https://github.com/paddymul/buckaroo-data/raw/main/cb_data/2016-04.csv\")\n", + "#df = pd.read_parquet(\"https://github.com/paddymul/buckaroo-data/raw/main/cb_data/2016-04.parq\")\n", "df" ] }, @@ -237,8 +237,7 @@ "outputs": [], "source": [ "import polars as pl\n", - "df.to_csv('cb_trips.csv')\n", - "pl.read_csv('cb_trips.csv')" + "df = pl.read_parquet(\"https://github.com/paddymul/buckaroo-data/raw/main/cb_data/2016-04.parq\")" ] }, { diff --git a/example-notebooks/Solara-Buckaroo.ipynb b/example-notebooks/Solara-Buckaroo.ipynb index 5a1a84bda..b79793a0d 100644 --- a/example-notebooks/Solara-Buckaroo.ipynb +++ b/example-notebooks/Solara-Buckaroo.ipynb @@ -123,13 +123,37 @@ "display(Page())" ] }, + { + "cell_type": "markdown", + "id": "5e4c06cc-7e9c-4d77-afec-7c9e78d8ca3b", + "metadata": {}, + "source": [ + "# Building an app around SolaraDFViewer\n", + "The following app hardcodes two dataframes and lets you select between them" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "4f87e093-c12c-4761-94ac-16c3b7bd7662", + "id": "4d1256ef-edf5-494a-8a2c-a5c1a6a38b29", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "dataframe_names = [\"foo\", \"bar\"]\n", + "df_name = solara.reactive(\"foo\")\n", + "\n", + "dataframes = dict(foo=df,\n", + " bar=pd.DataFrame({'c':[20,50,90], 'd':[False, True, True]}))\n", + "\n", + "@solara.component\n", + "def Page():\n", + " solara.Select(label=\"df_name\", value=df_name, values=dataframe_names)\n", + " active_df = dataframes[df_name.value]\n", + " bw = SolaraDFViewer(active_df)\n", + "\n", + " solara.Markdown(f\"**Selected**: {df_name.value}\")\n", + "display(Page())" + ] } ], "metadata": { From db42f750838a33ff11dd54d76e3f147c110a941e Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 29 Feb 2024 07:43:41 -0500 Subject: [PATCH 214/250] added Learn more section (#242) --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7c4c2d093..8457e9b68 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,13 @@ Buckaroo works with the following DataFrame libraries - `polars` optional +# Learn More + +Buckaroo has extensive docs and tests, the best way to learn about the system is from feature example videos on youtube + +## [Extending Buckaroo](https://www.youtube.com/watch?v=GPl6_9n31NE) +## [Styling Buckaroo](https://www.youtube.com/watch?v=cbwJyo_PzKY) + # Features ## High performance table From 0adb32c796a99cc4a76b39f5f4b9abdb3ec5f4d0 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Mon, 4 Mar 2024 09:02:22 -0500 Subject: [PATCH 215/250] Feat/readme example notebooks (#243) --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8457e9b68..d39298c2f 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,21 @@ Buckaroo works with the following DataFrame libraries Buckaroo has extensive docs and tests, the best way to learn about the system is from feature example videos on youtube -## [Extending Buckaroo](https://www.youtube.com/watch?v=GPl6_9n31NE) -## [Styling Buckaroo](https://www.youtube.com/watch?v=cbwJyo_PzKY) + +## Videos +- [Extending Buckaroo](https://www.youtube.com/watch?v=GPl6_9n31NE) +- [Styling Buckaroo](https://www.youtube.com/watch?v=cbwJyo_PzKY) + +## Example Notebooks + +The following notebooks must executed in an environemnt with Buckaroo installed. +- [Full Tour](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Full-tour.ipynb) Start here. This gives a broad overview of Buckaroo's features. +- [Histogram Demo](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Histograms-demo.ipynb) Explantion of the embedded histograms of Buckaroo. +- [Styling Gallery](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/styling-gallery.ipynb) Examples of all of the different formatters and styling available for the table +- [Extending Buckaroo](http://localhost:8888/lab/workspaces/auto-p/tree/Extending.ipynb) Broad overview of how to add post processing methods and custom styling methods to Buckaroo +- [Styling Howto](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/styling-howto.ipynb) In depth explanation of how to write custom styling methods +- [Pluggable Analysis Framework](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Pluggable-Analysis-Framework.ipynb) How to add new summary stats to Buckaroo +- [Solara Buckaroo](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Solara-Buckaroo.ipynb) Using Buckaroo with Solara # Features From 71d3d298804f58c7141e35a7f22f75b770bec9f8 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 5 Mar 2024 12:06:15 -0500 Subject: [PATCH 216/250] Feat/widget not found error messaging (#245) * error messaging for model not found errors --- buckaroo/widget_utils.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index d1983da6f..2fb1c9193 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -1,6 +1,10 @@ import traceback from .buckaroo_widget import BuckarooWidget import pandas as pd +from datetime import datetime as dtdt +import os +import psutil + def is_in_ipython(): @@ -31,6 +35,20 @@ def enable(sampled=True, """ ip = is_in_ipython() + + parent_process = psutil.Process().parent() + server_start_time = dtdt.fromtimestamp(parent_process.create_time()) + + buckaroo_mtime = dtdt.fromtimestamp(os.path.getmtime(__file__)) + + if buckaroo_mtime > server_start_time: + print("""It looks like you installed Buckaroo after you started this notebook server. If you see a message like "Failed to load model class 'DCEFWidgetModel' from module 'buckaroo'", restart the jupyter server and try again. If you have furter errors, please file a bug report at https://github.com/paddymul/buckaroo""") + print("-"*80) + print("buckaroo_mtime", buckaroo_mtime, "server_start_time", server_start_time) + #note we don't throw an exception here because this is a + #warning. I think this usecase specifically works on google + #colab + def _display_as_buckaroo(df): from IPython.display import display From 79ec2798371e1f96b8613f395b08e5fa0cb2a3c1 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 5 Mar 2024 14:01:35 -0500 Subject: [PATCH 217/250] Chore/version bump-0.6.4 (#246) --- buckaroo/_version.py | 2 +- docs/source/conf.py | 2 +- package.json | 2 +- pyproject.toml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 61b0a3232..7b5b0a31a 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.6.3" +__version__ = "0.6.4" diff --git a/docs/source/conf.py b/docs/source/conf.py index d7aeee9e4..e76996c4d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.6.3' +release = '0.6.4' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/package.json b/package.json index a05ad8108..c0618dfd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.6.3", + "version": "0.6.4", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 45ed314f6..6ad64df85 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.6.3" +version = "0.6.4" [project.license] file = "LICENSE.txt" From 83135c0e1386b284e88c1fe826e687786bc73a7d Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 5 Mar 2024 15:17:56 -0500 Subject: [PATCH 218/250] better formatted error message that only occurs for jupyter-notebook/lab (#247) --- buckaroo/__init__.py | 20 +------------------- buckaroo/widget_utils.py | 31 +++++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/buckaroo/__init__.py b/buckaroo/__init__.py index 6346a39e2..ffbd7eb0f 100644 --- a/buckaroo/__init__.py +++ b/buckaroo/__init__.py @@ -2,7 +2,7 @@ from ._version import __version__ from .buckaroo_widget import BuckarooWidget from .dataflow.widget_extension_utils import DFViewer -from .widget_utils import is_in_ipython, enable, disable +from .widget_utils import is_in_ipython, enable, disable, determine_jupter_env def _jupyter_nbextension_paths(): @@ -48,24 +48,6 @@ def _jupyter_labextension_paths(): -def determine_jupter_env(): - import psutil - parent_process = psutil.Process().parent().cmdline()[-1] - - if 'jupyter-lab' in parent_process: - return "jupyter-lab" - elif 'jupyter-notebook' in parent_process: - return "jupyter-notebook" - elif '__vsc_ipynb_file__' in globals(): - return "vscode" - else: - try: - from IPython.core import getipython - if 'google.colab' in str(getipython.get_ipython()): - return "google-colab" - except: - pass - return "unknown" def is_notebook_compatible(): jupyter_env = determine_jupter_env() diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 2fb1c9193..409ab6372 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -41,8 +41,13 @@ def enable(sampled=True, buckaroo_mtime = dtdt.fromtimestamp(os.path.getmtime(__file__)) - if buckaroo_mtime > server_start_time: - print("""It looks like you installed Buckaroo after you started this notebook server. If you see a message like "Failed to load model class 'DCEFWidgetModel' from module 'buckaroo'", restart the jupyter server and try again. If you have furter errors, please file a bug report at https://github.com/paddymul/buckaroo""") + jupyter_env = determine_jupter_env() + if jupyter_env in ["jupyter-lab", "jupyter-notebook"] and buckaroo_mtime > server_start_time: + print("It looks like you installed Buckaroo after you started this notebook server.") + print("""If you see a messages like""") + print(""""Failed to load model class 'DCEFWidgetModel' from module 'buckaroo'" """) + print("""restart the jupyter server and try again.""") + print("""If you have furter errors, please file a bug report at https://github.com/paddymul/buckaroo""") print("-"*80) print("buckaroo_mtime", buckaroo_mtime, "server_start_time", server_start_time) #note we don't throw an exception here because this is a @@ -53,8 +58,7 @@ def enable(sampled=True, def _display_as_buckaroo(df): from IPython.display import display try: - bw = BuckarooWidget(df, - debug=debug) + bw = BuckarooWidget(df, debug=debug) return display(bw) except: if debug: @@ -103,3 +107,22 @@ def disable(): except ImportError: pass print("The default DataFrame displayers have been restored. To re-enable Buckaroo use `from buckaroo import enable; enable()`") + +def determine_jupter_env(): + import psutil + parent_process = psutil.Process().parent().cmdline()[-1] + + if 'jupyter-lab' in parent_process: + return "jupyter-lab" + elif 'jupyter-notebook' in parent_process: + return "jupyter-notebook" + elif '__vsc_ipynb_file__' in globals(): + return "vscode" + else: + try: + from IPython.core import getipython + if 'google.colab' in str(getipython.get_ipython()): + return "google-colab" + except: + pass + return "unknown" From dfb9958d4daa106592540bd7f4ef01978771e936 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 5 Mar 2024 16:28:05 -0500 Subject: [PATCH 219/250] example of swapping between larger dataframes (#248) --- example-notebooks/Solara-Buckaroo.ipynb | 37 ++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/example-notebooks/Solara-Buckaroo.ipynb b/example-notebooks/Solara-Buckaroo.ipynb index b79793a0d..a0a3d08de 100644 --- a/example-notebooks/Solara-Buckaroo.ipynb +++ b/example-notebooks/Solara-Buckaroo.ipynb @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "cb_trips_df = pd.read_csv(\"https://s3.amazonaws.com/tripdata/201401-citibike-tripdata.zip\")" + "cb_trips_df = pd.read_csv(\"https://github.com/paddymul/buckaroo-data/raw/main/cb_data/2016-04.csv\")\n" ] }, { @@ -154,6 +154,41 @@ " solara.Markdown(f\"**Selected**: {df_name.value}\")\n", "display(Page())" ] + }, + { + "cell_type": "markdown", + "id": "9ca33684-b15f-48f9-a19d-f3a5221343ba", + "metadata": {}, + "source": [ + "# Reading large dataframes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74ff8e28-56ed-4cf8-9473-b88f9b047178", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "url_base = \"https://github.com/paddymul/buckaroo-data/raw/main/cb_data/\"\n", + "\n", + "dataframe_names = [\n", + " \"2016-01.parq\", \"2016-02.parq\",\n", + " \"2016-03.parq\", \"2016-04.parq\"]\n", + "\n", + "df_name = solara.reactive(\"2016-01.parq\")\n", + "\n", + "@solara.component\n", + "def Page():\n", + " solara.Select(label=\"df_name\", value=df_name, values=dataframe_names)\n", + " active_df = pl.read_parquet(url_base+df_name.value)\n", + " bw = SolaraPolarsDFViewer(active_df)\n", + "\n", + " solara.Markdown(f\"**Selected**: {df_name.value}\")\n", + "display(Page())" + ] } ], "metadata": { From 2277c02a54647a319ce171457d8ae3b4e9dfb5b5 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 8 Mar 2024 12:36:28 -0500 Subject: [PATCH 220/250] Basic GeoPandas support (#250) * Adds SVGDisplayer * Creates the GeopandasBuckarooWidget that displays a GeopandasDataframe without a stacktrace * Better sizing for small dataframe * Controllable vertical sizing via `component_config={'height_fraction':1.2}` --- buckaroo/_version.py | 2 +- buckaroo/dataflow/dataflow.py | 17 +- buckaroo/dataflow/dataflow_extras.py | 9 +- buckaroo/geopandas_buckaroo.py | 72 +++++++ buckaroo/widget_utils.py | 23 ++ docs/source/conf.py | 2 +- example-notebooks/GeoPandas.ipynb | 196 ++++++++++++++++++ examples/App.tsx | 1 + examples/ex/DFViewerEx_large.tsx | 2 + examples/ex/DFViewerEx_short_data.tsx | 24 +++ js/baked_data/staticData.ts | 16 +- js/components/DCFCell.tsx | 5 +- js/components/DFViewerParts/DFViewer.tsx | 28 ++- js/components/DFViewerParts/DFWhole.ts | 14 +- js/components/DFViewerParts/Displayer.ts | 21 +- js/components/DFViewerParts/HistogramCell.tsx | 10 + js/style/dcf-npm.css | 11 +- package.json | 2 +- pyproject.toml | 2 +- tests/ts/gridUtils.test.ts | 4 +- .../dataflow/customizable_dataflow_test.py | 10 +- tests/unit/dataflow/dataflow_polars_test.py | 11 +- tests/unit/polars_basic_widget_test.py | 5 +- 23 files changed, 456 insertions(+), 31 deletions(-) create mode 100644 buckaroo/geopandas_buckaroo.py create mode 100644 example-notebooks/GeoPandas.ipynb create mode 100644 examples/ex/DFViewerEx_short_data.tsx diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 7b5b0a31a..02b5e707b 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.6.4" +__version__ = "0.6.5" diff --git a/buckaroo/dataflow/dataflow.py b/buckaroo/dataflow/dataflow.py index 4e56091c1..a3c0a961b 100644 --- a/buckaroo/dataflow/dataflow.py +++ b/buckaroo/dataflow/dataflow.py @@ -222,11 +222,17 @@ class CustomizableDataflow(DataFlow): sampling_klass = Sampling df_display_klasses = {} - def __init__(self, df, debug=False, column_config_overrides=None, pinned_rows=None): + + def __init__(self, df, debug=False, + column_config_overrides=None, + pinned_rows=None, extra_grid_config=None, + component_config=None): if column_config_overrides is None: column_config_overrides = {} self.column_config_overrides = column_config_overrides self.pinned_rows = pinned_rows + self.extra_grid_config = extra_grid_config + self.component_config = component_config if not debug: warnings.filterwarnings('ignore') @@ -240,8 +246,6 @@ def __init__(self, df, debug=False, column_config_overrides=None, pinned_rows=No self.populate_df_meta() #self.raw_df = df warnings.filterwarnings('default') - - def populate_df_meta(self): self.df_meta = { @@ -366,8 +370,13 @@ def _handle_widget_change(self, change): 'summary_stats_key': A_Klass.summary_stats_key} temp_display_args[display_name] = disp_arg - if self.pinned_rows: + if self.pinned_rows is not None: temp_display_args['main']['df_viewer_config']['pinned_rows'] = self.pinned_rows + if self.extra_grid_config: + temp_display_args['main']['df_viewer_config']['extra_grid_config'] = self.extra_grid_config + if self.component_config: + temp_display_args['main']['df_viewer_config']['component_config'] = self.component_config + self.df_display_args = temp_display_args """ diff --git a/buckaroo/dataflow/dataflow_extras.py b/buckaroo/dataflow/dataflow_extras.py index 1d4c59d94..786e70007 100644 --- a/buckaroo/dataflow/dataflow_extras.py +++ b/buckaroo/dataflow/dataflow_extras.py @@ -137,6 +137,9 @@ class StylingAnalysis(ColAnalysis): provides_defaults = {} pinned_rows = [] + extra_grid_config = {} + component_config = {} + #the type should be #def style_column(col:str, column_metadata: SingleColumnMetadata) -> ColumnConfig: @classmethod @@ -166,5 +169,7 @@ def style_columns(kls, sd): return { 'pinned_rows': kls.pinned_rows, - 'column_config': ret_col_config} - + 'column_config': ret_col_config, + 'extra_grid_config': kls.extra_grid_config, + 'component_config': kls.component_config + } diff --git a/buckaroo/geopandas_buckaroo.py b/buckaroo/geopandas_buckaroo.py new file mode 100644 index 000000000..e1bebeadc --- /dev/null +++ b/buckaroo/geopandas_buckaroo.py @@ -0,0 +1,72 @@ +import pandas as pd +import buckaroo + +from buckaroo.customizations.styling import DefaultMainStyling, StylingAnalysis +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import ColAnalysis +from .dataflow.dataflow_extras import (Sampling) +from buckaroo.serialization_utils import pd_to_obj +from buckaroo.customizations.analysis import (TypingStats) +import geopandas + + +class SvgReprPostProcessing(ColAnalysis): + @classmethod + def post_process_df(kls, gdf): + geo_columns = [] + svg_columns = [] + svg_ser_dict = {} + for col in gdf.columns: + ser = gdf[col] + if isinstance(ser.dtype, geopandas.array.GeometryDtype): + svg_col_name = col+"_svg" + geo_columns.append(col) + svg_columns.append(svg_col_name) + svg_ser_dict[svg_col_name] = ser.apply(lambda x: x._repr_svg_()) + svg_df = pd.DataFrame(svg_ser_dict) + merged_df = pd.concat([svg_df, gdf], axis=1) + + extra_conf = {} + for col in svg_columns: + extra_conf[col] = {'column_config_override': {'displayer_args': {'displayer': 'SVGDisplayer'}}} + return merged_df, extra_conf + post_processing_method = "svg_geo" + +class GeoStyling(StylingAnalysis): #DefaultMainStyling): + requires_summary = [#"histogram", + "is_numeric", "dtype", "_type"] + @classmethod + def style_column(kls, col:str, column_metadata): + t = column_metadata['_type'] + if t == 'obj': + return {'col_name':col, 'displayer_args': {'displayer': 'string', 'max_length': 50}} + else: + return DefaultMainStyling.style_column(col, column_metadata) + pinned_rows = [ + #obj_('dtype'), obj_('_type') + ] + + extra_grid_config = {'rowHeight':105} + +class GeoPdSampling(Sampling): + #pre_limit = 500_000 + #no point in a larger limit until summary stats work for Geopandas + pre_limit = 2_000 + + +class GeopandasBuckarooWidget(buckaroo.BuckarooWidget): + analysis_klasses = [ + TypingStats, + GeoStyling, + SvgReprPostProcessing] + + sampling_klass = GeoPdSampling + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + t_state = self.buckaroo_state.copy() + t_state['post_processing'] = 'svg_geo' + self.buckaroo_state = t_state + + def _df_to_obj(self, df): + pd_df = pd.DataFrame(dict(zip(df.columns, df.to_numpy().T))) + return pd_to_obj(self.sampling_klass.serialize_sample(pd_df)) diff --git a/buckaroo/widget_utils.py b/buckaroo/widget_utils.py index 409ab6372..6329a920d 100644 --- a/buckaroo/widget_utils.py +++ b/buckaroo/widget_utils.py @@ -54,6 +54,7 @@ def enable(sampled=True, #warning. I think this usecase specifically works on google #colab + def _display_as_buckaroo(df): from IPython.display import display @@ -80,6 +81,19 @@ def _display_polars_as_buckaroo(polars_df): return raise NotImplementedError + def _display_geopandas_as_buckaroo(gdf): + from IPython.display import display + from buckaroo.geopandas_buckaroo import GeopandasBuckarooWidget + + try: + return display(GeopandasBuckarooWidget(gdf)) + except: + if debug: + traceback.print_exc() + return + raise NotImplementedError + + ip_formatter = ip.display_formatter.ipython_display_formatter ip_formatter.for_type(pd.DataFrame, _display_as_buckaroo) @@ -88,6 +102,14 @@ def _display_polars_as_buckaroo(polars_df): ip_formatter.for_type(pl.DataFrame, _display_polars_as_buckaroo) except ImportError: pass + + try: + import geopandas + ip_formatter.for_type(geopandas.geodataframe.GeoDataFrame, _display_geopandas_as_buckaroo) + except ImportError: + pass + + return True def disable(): @@ -126,3 +148,4 @@ def determine_jupter_env(): except: pass return "unknown" + diff --git a/docs/source/conf.py b/docs/source/conf.py index e76996c4d..967031d38 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.6.4' +release = '0.6.5' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/example-notebooks/GeoPandas.ipynb b/example-notebooks/GeoPandas.ipynb new file mode 100644 index 000000000..ad9285821 --- /dev/null +++ b/example-notebooks/GeoPandas.ipynb @@ -0,0 +1,196 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "5b17aae3-6857-4eda-b8e0-a5b824edbbf4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import buckaroo\n", + "import geopandas\n", + "from buckaroo.geopandas_buckaroo import GeopandasBuckarooWidget" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c2d060d-7430-4d54-855d-44cd9376cdab", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "world_df = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "147ecebd-952c-4fe0-832d-8b93421e69a1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "world_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dea5fb3e-1e0c-41c0-bbe4-3f4564681665", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "abbrev_geo_obj = {\n", + " \"type\": \"FeatureCollection\",\n", + " \"features\": [\n", + " { \"id\": \"0\",\n", + " \"type\": \"Feature\",\n", + " \"properties\": { \"sovereignt\": \"Ethiopia\"},\n", + " \"geometry\": {\n", + " \"type\": \"Polygon\",\n", + " \"coordinates\": [[[ 47.78, 8.00],\n", + " [ 44.96, 5.00],\n", + " [ 43.66, 4.95],\n", + " [ 46.94, 7.99],\n", + " [ 47.78, 8.00]]]}},\n", + " { \"id\": \"1\",\n", + " \"type\": \"Feature\",\n", + " \"properties\": { \"sovereignt\": \"South Sudan\"},\n", + " \"geometry\": {\n", + " \"type\": \"Polygon\",\n", + " \"coordinates\": [[[ 30.83, 3.50],\n", + " [ 29.95, 4.17],\n", + " [ 29.71, 4.60],\n", + " [ 29.15, 4.38],\n", + " [ 30.83, 3.50]]]}},\n", + " { \"id\": \"2\",\n", + " \"type\": \"Feature\",\n", + " \"properties\": { \"sovereignt\": \"Somalia\"},\n", + " \"geometry\": {\n", + " \"type\": \"Polygon\",\n", + " \"coordinates\": [[[ 41.58, -1.68],\n", + " [ 40.93, -0.85],\n", + " [ 40.95, 2.78],\n", + " [ 41.85, 3.91],\n", + " [ 42.13, 4.23],\n", + " [ 41.58, -1.68]]]}}]}\n", + "abbrev_df = geopandas.GeoDataFrame.from_features(abbrev_geo_obj)\n", + "abbrev_df" + ] + }, + { + "cell_type": "markdown", + "id": "04381d81-91d2-48ed-a10a-436a6bce568d", + "metadata": {}, + "source": [ + "## Tweaking row height\n", + "Shapely emits SVG graphics, they seem to vary in height, Buckaroo needs a global rowHeight, here is how to set it\n", + "We also made buckaroo larger" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a69c95d7-d66d-4ca5-b11e-5b00c4b7e500", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "nybb_df = geopandas.read_file(geopandas.datasets.get_path('nybb'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "432e571c-e7dc-46b3-9707-f301033fee8a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "GeopandasBuckarooWidget(nybb_df, component_config={'height_fraction':1.2},\n", + " extra_grid_config={'rowHeight':305})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b309bab6-01f7-4a21-a895-b4075d4c757d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import requests\n", + "geojson = requests.get('https://gist.githubusercontent.com/chbrandt/bb64d9a6fc00a89d7410e6db8d126dfe/raw/8bc7a45c57e1c701618c940525d83bee80fd6b90/africa.geojson')\n", + "assert 200 <= geojson.status_code < 400\n", + "gdf = geopandas.GeoDataFrame.from_features(geojson.json())\n", + "gdf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd9b37da-b9a8-4a22-a20d-81edde8060f8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cities = geopandas.read_file(geopandas.datasets.get_path('naturalearth_cities'))\n", + "cities" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aae6abe4-227e-481a-9af7-daf9c25b0df1", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "bigdf = pd.concat([world_df] *100)\n", + "bigdf['newindex'] = np.arange(17700)\n", + "bigdf.set_index('newindex')\n", + "print(len(bigdf))\n", + "%timeit GeopandasBuckarooWidget(bigdf[:1500])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/App.tsx b/examples/App.tsx index 847cec4e5..03d9df943 100644 --- a/examples/App.tsx +++ b/examples/App.tsx @@ -19,6 +19,7 @@ const examples = { DFViewerEx_string_index: {title: 'DFViewer string index', file: 'DFViewerEx_string_index'}, DFViewerEx_large: {title: 'DFViewer large', file: 'DFViewerEx_large'}, DFViewerEx_real_summary: {title: 'DFViewer summary', file: 'DFViewerEx_real_summary'}, + DFViewerEx_short_data: {title: 'DFViewer short_data', file: 'DFViewerEx_short_data'}, StatusBarEx: {title: 'StatusBar', file: 'StatusBarEx'}, HistogramEx: {title: 'Histogram', file: 'HistogramEx'} diff --git a/examples/ex/DFViewerEx_large.tsx b/examples/ex/DFViewerEx_large.tsx index 5b5f9e090..4bd7f3b03 100644 --- a/examples/ex/DFViewerEx_large.tsx +++ b/examples/ex/DFViewerEx_large.tsx @@ -198,6 +198,8 @@ const dictOfListsToListOfDicts = (a: Record) : Record; + } + diff --git a/js/baked_data/staticData.ts b/js/baked_data/staticData.ts index 25e5e813a..205b2391a 100644 --- a/js/baked_data/staticData.ts +++ b/js/baked_data/staticData.ts @@ -243,6 +243,10 @@ export const tableDf: DFWhole = { col_name: 'index', displayer_args: { displayer: 'integer', min_digits: 3, max_digits: 5 }, }, + { + col_name: 'svg_column', + displayer_args: { displayer: 'SVGDisplayer' }, + }, { col_name: 'link_column', displayer_args: { displayer: 'linkify' }, @@ -306,9 +310,10 @@ export const tableDf: DFWhole = { ag_grid_specs: { width: 150 }, }, ], - extra_grid_config: { rowHeight: 35 }, + extra_grid_config: { rowHeight: 105 }, + component_config: { height_fraction: 1 }, pinned_rows: [ - { primary_key_val: 'dtype', displayer_args: { displayer: 'obj' } }, + // { primary_key_val: 'dtype', displayer_args: { displayer: 'obj' } }, // { primary_key_val: 'histogram', displayer_args: { displayer: 'histogram' }, }, ], }, @@ -322,6 +327,7 @@ export const tableDf: DFWhole = { nanNumeric: null, nanObject: null, nanFloat: null, + //svg_column: '

    paddy

    ', link_column: 'https://buckaroo.dev', img_: smileyPNGString, }, @@ -334,6 +340,8 @@ export const tableDf: DFWhole = { nanNumeric: null, nanObject: null, nanFloat: null, + svg_column: + '', link_column: 'https://pola.rs/', }, { @@ -344,6 +352,8 @@ export const tableDf: DFWhole = { floatCol: '9.999', nanNumeric: null, nanObject: null, + svg_column: + '', nanFloat: 10, }, { @@ -355,6 +365,8 @@ export const tableDf: DFWhole = { nanCol: null, nanNumeric: null, nanObject: null, + svg_column: + '', nanFloat: null, }, { diff --git a/js/components/DCFCell.tsx b/js/components/DCFCell.tsx index 29dddb902..6042dcabb 100644 --- a/js/components/DCFCell.tsx +++ b/js/components/DCFCell.tsx @@ -79,7 +79,10 @@ export function WidgetDCFCell({ >
    +
    { return val; }; -export const objFormatter = (params: ValueFormatterParams): string => { - const val = params.value; - return objDisplayer(val); +export const getObjectFormatter = (fArgs: ObjDisplayerA) => { + const objFormatter = (params: ValueFormatterParams): string => { + const val = params.value; + const fullString = objDisplayer(val); + if (fArgs.max_length) { + return fullString.slice(0, fArgs.max_length); + } else { + return fullString; + } + }; + return objFormatter; }; +export const objFormatter = getObjectFormatter({ displayer: 'obj' }); export const boolDisplayer = (val: boolean) => { if (val === true) { @@ -180,7 +191,7 @@ export function getFormatter( case 'boolean': return booleanFormatter; case 'obj': - return objFormatter; + return getObjectFormatter(fArgs); default: return getStringFormatter({ displayer: 'string' }); } @@ -202,6 +213,8 @@ export function getCellRenderer(crArgs: CellRendererArgs) { return Base64PNGDisplayer; case 'boolean_checkbox': return 'agCheckboxCellRenderer'; + case 'SVGDisplayer': + return SVGDisplayer; } } diff --git a/js/components/DFViewerParts/HistogramCell.tsx b/js/components/DFViewerParts/HistogramCell.tsx index ae4955fc2..79d838fa1 100644 --- a/js/components/DFViewerParts/HistogramCell.tsx +++ b/js/components/DFViewerParts/HistogramCell.tsx @@ -145,6 +145,16 @@ export const Base64PNGDisplayer = (props: any) => { return ; }; +export const SVGDisplayer = (props: any) => { + const markup = { __html: props.value }; + + return ( +
    + ); +}; + export const HistogramCell = (props: any) => { //debugger; if (props === undefined || props.value === undefined) { diff --git a/js/style/dcf-npm.css b/js/style/dcf-npm.css index be5556c9f..67cc1191f 100644 --- a/js/style/dcf-npm.css +++ b/js/style/dcf-npm.css @@ -208,8 +208,17 @@ div.dependent-tabs ul.tabs li.active { clear:right; } +.df-viewer.short-mode .ag-center-cols-viewport { +/* min-height: unset !important; */ + min-height: 50px; +} +/* +.df-viewer.short-mode > div { - + min-height: 100; + max-height: 800 +} +*/ /*# sourceMappingURL=dcf-npm.css.map */ diff --git a/package.json b/package.json index c0618dfd8..32258cfd3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.6.4", + "version": "0.6.5", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 6ad64df85..46dac316c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.6.4" +version = "0.6.5" [project.license] file = "LICENSE.txt" diff --git a/tests/ts/gridUtils.test.ts b/tests/ts/gridUtils.test.ts index 7bd45c54c..8be2ef2e5 100644 --- a/tests/ts/gridUtils.test.ts +++ b/tests/ts/gridUtils.test.ts @@ -2,7 +2,7 @@ import { extractSDFT, getHistoIndex, } from '../../js/components/DFViewerParts/gridUtils'; import { DFData } from "../../js/components/DFViewerParts/DFWhole"; -import { getFloatFormatter, getFormatter, objFormatter } from '../../js/components/DFViewerParts/Displayer'; +import { getFloatFormatter } from '../../js/components/DFViewerParts/Displayer'; import { ValueFormatterParams } from 'ag-grid-community'; describe("testing utility functions in gridUtils ", () => { @@ -10,7 +10,7 @@ describe("testing utility functions in gridUtils ", () => { it("should test getFormater", () => { // expect(getFormatter({displayer: 'string'})).toBe(stringFormatter) - expect(getFormatter({displayer: 'obj'})).toBe(objFormatter); + // expect(getFormatter({displayer: 'obj'})).toBe(objFormatter); }); diff --git a/tests/unit/dataflow/customizable_dataflow_test.py b/tests/unit/dataflow/customizable_dataflow_test.py index 6d4d2aac9..197153bcc 100644 --- a/tests/unit/dataflow/customizable_dataflow_test.py +++ b/tests/unit/dataflow/customizable_dataflow_test.py @@ -22,7 +22,10 @@ 'column_config': [ {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, {'col_name':'a', 'displayer_args': {'displayer': 'obj'}}, - {'col_name':'b', 'displayer_args': {'displayer': 'obj'}}]} + {'col_name':'b', 'displayer_args': {'displayer': 'obj'}}], + 'component_config': {}, + 'extra_grid_config': {}, +} def test_widget_instatiation(): dfc = CustomizableDataflow(BASIC_DF) @@ -55,7 +58,10 @@ class TwoStyleDFC(CustomizableDataflow): 'column_config': [ {'col_name':'index', 'displayer_args': {'displayer': 'int'}}, {'col_name':'a', 'displayer_args': {'displayer': 'int'}}, - {'col_name':'b', 'displayer_args': {'displayer': 'int'}}]} + {'col_name':'b', 'displayer_args': {'displayer': 'int'}}], + 'component_config': {}, + 'extra_grid_config': {}, + } assert cdfc.df_display_args['int_styles']['df_viewer_config'] == DFVIEWER_CONFIG_INT diff --git a/tests/unit/dataflow/dataflow_polars_test.py b/tests/unit/dataflow/dataflow_polars_test.py index a7aefb731..4b298448e 100644 --- a/tests/unit/dataflow/dataflow_polars_test.py +++ b/tests/unit/dataflow/dataflow_polars_test.py @@ -17,7 +17,10 @@ 'column_config': [ {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, {'col_name':'a', 'displayer_args': {'displayer': 'obj'}}, - {'col_name':'b', 'displayer_args': {'displayer': 'obj'}}]} + {'col_name':'b', 'displayer_args': {'displayer': 'obj'}}], + 'component_config' : {}, + 'extra_grid_config': {}, +} class BasicStyling(StylingAnalysis): @@ -57,7 +60,6 @@ def style_column(col, sd): class TwoStyleDFC(PolarsBuckarooWidget): analysis_klasses = [StylingAnalysis, IntStyling] - #analysis_klasses = [IntStyling] cdfc = TwoStyleDFC(BASIC_DF) assert cdfc.widget_args_tuple[1] is BASIC_DF @@ -67,7 +69,10 @@ class TwoStyleDFC(PolarsBuckarooWidget): 'column_config': [ {'col_name':'index', 'displayer_args': {'displayer': 'obj'}}, {'col_name':'a', 'displayer_args': {'displayer': 'int'}}, - {'col_name':'b', 'displayer_args': {'displayer': 'int'}}]} + {'col_name':'b', 'displayer_args': {'displayer': 'int'}}], + 'component_config' : {}, + 'extra_grid_config': {}, + } assert cdfc.df_display_args['int_styles']['df_viewer_config'] == DFVIEWER_CONFIG_INT diff --git a/tests/unit/polars_basic_widget_test.py b/tests/unit/polars_basic_widget_test.py index 004bdde08..4a0125499 100644 --- a/tests/unit/polars_basic_widget_test.py +++ b/tests/unit/polars_basic_widget_test.py @@ -18,7 +18,10 @@ def test_basic_instantiation(): 'pinned_rows': [], 'column_config': [ {'col_name': 'index', 'displayer_args': {'displayer': 'obj'}}, - {'col_name': 'normal_int_series', 'displayer_args': {'displayer': 'obj'}}]} + {'col_name': 'normal_int_series', 'displayer_args': {'displayer': 'obj'}}], + 'component_config': {}, + 'extra_grid_config': {}, +} class SelectOnlyAnalysis(PolarsAnalysis): From e407dbb9d11b935e087c6d98ec3a055e07523a5a Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 8 Mar 2024 14:39:21 -0500 Subject: [PATCH 221/250] Update README.md Explain new GeoPandas support --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d39298c2f..a982927d7 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,8 @@ Buckaroo works in the following notebook environments Buckaroo works with the following DataFrame libraries - `pandas` (version >=1.3.5) -- `polars` optional +- `polars` optional +- `geopandas` optional # Learn More @@ -46,6 +47,7 @@ Buckaroo has extensive docs and tests, the best way to learn about the system is ## Videos - [Extending Buckaroo](https://www.youtube.com/watch?v=GPl6_9n31NE) - [Styling Buckaroo](https://www.youtube.com/watch?v=cbwJyo_PzKY) +- [GeoPandas Support](https://youtu.be/8WBhoNjDJsA) ## Example Notebooks @@ -57,6 +59,7 @@ The following notebooks must executed in an environemnt with Buckaroo installed. - [Styling Howto](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/styling-howto.ipynb) In depth explanation of how to write custom styling methods - [Pluggable Analysis Framework](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Pluggable-Analysis-Framework.ipynb) How to add new summary stats to Buckaroo - [Solara Buckaroo](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/Solara-Buckaroo.ipynb) Using Buckaroo with Solara +- [GeoPandas with Bucakroo](https://github.com/paddymul/buckaroo/blob/main/example-notebooks/GeoPandas.ipynb) # Features From 3c8f4faf0d3cf4c8c11c1e285805286856e9b85b Mon Sep 17 00:00:00 2001 From: Carlos H Brandt <482051+chbrandt@users.noreply.github.com> Date: Fri, 8 Mar 2024 20:40:25 +0100 Subject: [PATCH 222/250] Update index.rst (#213) Include install instruction upfront in the front page --- docs/source/index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/source/index.rst b/docs/source/index.rst index e9bf16b1f..e85d446d6 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -10,6 +10,11 @@ Buckaroo is a tool to quickly clean and explore DataFrames with a visual UI for We all know how awkward it is to clean data in jupyter notebooks. Multiple cells of exploratory work, trying different transforms, looking up different transforms, adhoc functions that work in one notebook and have to be either copied/pasta-ed to the next notebook, or rewritten from scratch. Buckaroo aims to massively speed up that process. +**Install Buckaroo**:: + + pip install buckaroo + + .. raw:: html From f58de9c066d243b88e0290b6d3a4d29fd84e7802 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Fri, 8 Mar 2024 16:29:16 -0500 Subject: [PATCH 223/250] Feat/refactor autocleaning (#219) * Basic working pluggable autocleaning for polars --- buckaroo/dataflow/autocleaning.py | 9 ++-- buckaroo/dataflow/dataflow.py | 61 ++++++++---------------- buckaroo/polars_buckaroo.py | 6 +++ tests/unit/dataflow/autocleaning_test.py | 27 ++++------- tests/unit/dataflow/dataflow_test.py | 2 +- 5 files changed, 40 insertions(+), 65 deletions(-) diff --git a/buckaroo/dataflow/autocleaning.py b/buckaroo/dataflow/autocleaning.py index 10f4033db..2d8959cea 100644 --- a/buckaroo/dataflow/autocleaning.py +++ b/buckaroo/dataflow/autocleaning.py @@ -1,6 +1,7 @@ import pandas as pd from buckaroo.jlisp.lisp_utils import split_operations -from buckaroo.pluggable_analysis_framework.polars_analysis_management import PlDfStats +#from buckaroo.pluggable_analysis_framework.polars_analysis_management import PlDfStats +from buckaroo.pluggable_analysis_framework.analysis_management import DfStats from ..customizations.all_transforms import configure_buckaroo, DefaultCommandKlsList @@ -95,13 +96,12 @@ class Autocleaning: # self.command_klasses = without_incoming # self.setup_from_command_kls_list() - + DFStatsKlass = DfStats def __init__(self, ac_configs): self.config_dict = {} for conf in ac_configs: self.config_dict[conf.name] = conf - #self._setup_from_command_kls_list() ### start code interpreter block def _setup_from_command_kls_list(self, name): @@ -117,7 +117,6 @@ def _setup_from_command_kls_list(self, name): c_defaults, c_patterns, df_interpreter, gencode_interpreter = configure_buckaroo(c_klasses) self.df_interpreter, self.gencode_interpreter = df_interpreter, gencode_interpreter self.commandConfig = dict(argspecs=c_patterns, defaultArgs=c_defaults) - #self.autocleaning_genops = filter_analysis(analysis_klasses, "autocleaning_ops") def _run_df_interpreter(self, df, operations): @@ -136,7 +135,7 @@ def _run_code_generator(self, operations): return self.gencode_interpreter(operations) def _run_cleaning(self, df, cleaning_method): - dfs = PlDfStats(df, self.autocleaning_analysis_klasses, debug=True) + dfs = self.DFStatsKlass(df, self.autocleaning_analysis_klasses, debug=True) gen_ops = format_ops(dfs.sdf) cleaning_sd = {} diff --git a/buckaroo/dataflow/dataflow.py b/buckaroo/dataflow/dataflow.py index a3c0a961b..3e0db01d4 100644 --- a/buckaroo/dataflow/dataflow.py +++ b/buckaroo/dataflow/dataflow.py @@ -5,15 +5,13 @@ from ..serialization_utils import pd_to_obj from buckaroo.pluggable_analysis_framework.utils import (filter_analysis) from buckaroo.pluggable_analysis_framework.analysis_management import DfStats +from .autocleaning import SentinelAutocleaning from .dataflow_extras import ( - EMPTY_DF_DISPLAY_ARG, SENTINEL_DF_1, SENTINEL_DF_2, - merge_ops, merge_sds, merge_column_config, + EMPTY_DF_DISPLAY_ARG, merge_sds, merge_column_config, style_columns, exception_protect, StylingAnalysis, Sampling) - - class DataFlow(HasTraits): """This class is meant to only represent the dataflow through buckaroo with no accomodation for widget particulars @@ -36,12 +34,13 @@ def __init__(self, raw_df): super().__init__() self.summary_sd = {} self.existing_operations = [] + self.ac_obj = self.autocleaning_klass() try: self.raw_df = raw_df except Exception: six.reraise(self.exception[0], self.exception[1], self.exception[2]) - #autocleaning_klass = SentinelAutocleaning + autocleaning_klass = SentinelAutocleaning raw_df = Any('') sample_method = Unicode('default') @@ -87,46 +86,15 @@ def _compute_sampled_df(self, raw_df, sample_method): def _sampled_df(self, change): self.sampled_df = self._compute_sampled_df(self.raw_df, self.sample_method) - '''FIXME: remove _run_df_interpreter, _run_code_generator, and - _run_cleaning when autocleaning properly integrated as a separate - testable class - - ''' - def _run_df_interpreter(self, df, ops): - if len(ops) == 1: - return SENTINEL_DF_1 - if len(ops) == 2: - return SENTINEL_DF_2 - return df - - def _run_code_generator(self, ops): - if len(ops) == 1: - return "codegen 1" - if len(ops) == 2: - return "codegen 2" - return "" - - def _run_cleaning(self, df, cleaning_method): - cleaning_ops = [] - if cleaning_method == "one op": - cleaning_ops = [""] - if cleaning_method == "two op": - cleaning_ops = ["", ""] - cleaning_sd = {} - return cleaning_ops, cleaning_sd - @observe('sampled_df', 'cleaning_method', 'existing_operations') @exception_protect('operation_result-protector') def _operation_result(self, change): - if self.sampled_df is None: + result = self.ac_obj.handle_ops_and_clean( + self.sampled_df, self.cleaning_method, self.existing_operations) + if result is None: return - cleaning_operations, cleaning_sd = self._run_cleaning(self.sampled_df, self.cleaning_method) - merged_operations = merge_ops(self.existing_operations, cleaning_operations) - cleaned_df = self._run_df_interpreter(self.sampled_df, merged_operations) - generated_code = self._run_code_generator(merged_operations) - self.cleaned = [cleaned_df, cleaning_sd, generated_code, merged_operations] - - + else: + self.cleaned = result @property def cleaned_df(self): if self.cleaned is not None: @@ -290,6 +258,17 @@ def setup_options_from_analysis(self): df_data_dict = Any({'empty':[]}).tag(sync=True) + ### start code interpreter block + def add_command(self, incomingCommandKls): + return self.ac_obj.add_command(incomingCommandKls) + + def _run_df_interpreter(self, df, operations): + self.ac_obj._run_df_interpreter(df, operations) + + def run_code_generator(self, operations): + self.ac_obj.run_code_generator(operations) + ### end code interpeter block + def _compute_processed_result(self, cleaned_df, post_processing_method): if post_processing_method == '': return [cleaned_df, {}] diff --git a/buckaroo/polars_buckaroo.py b/buckaroo/polars_buckaroo.py index f5916b24f..ad07b3c36 100644 --- a/buckaroo/polars_buckaroo.py +++ b/buckaroo/polars_buckaroo.py @@ -9,6 +9,7 @@ ) from .customizations.styling import DefaultSummaryStatsStyling, DefaultMainStyling from .dataflow.dataflow import Sampling +from .dataflow.autocleaning import Autocleaning from .dataflow.widget_extension_utils import configure_buckaroo class PLSampling(Sampling): @@ -18,6 +19,11 @@ class PLSampling(Sampling): local_analysis_klasses.extend( [DefaultSummaryStatsStyling, DefaultMainStyling]) + +class PolarsAutocleaning(Autocleaning): + DFStatsKlass = PlDfStats + + class PolarsBuckarooWidget(BuckarooWidget): """TODO: Add docstring here """ diff --git a/tests/unit/dataflow/autocleaning_test.py b/tests/unit/dataflow/autocleaning_test.py index 62ba048ea..fa161ed19 100644 --- a/tests/unit/dataflow/autocleaning_test.py +++ b/tests/unit/dataflow/autocleaning_test.py @@ -1,8 +1,10 @@ import polars as pl from buckaroo.customizations.polars_analysis import ( VCAnalysis, PLCleaningStats, BasicAnalysis) -from buckaroo.pluggable_analysis_framework.polars_analysis_management import PlDfStats, PolarsAnalysis -from buckaroo.dataflow.autocleaning import Autocleaning, merge_ops, format_ops, make_origs, AutocleaningConfig +from buckaroo.pluggable_analysis_framework.polars_analysis_management import PlDfStats +from buckaroo.pluggable_analysis_framework.pluggable_analysis_framework import (ColAnalysis) +from buckaroo.dataflow.autocleaning import merge_ops, format_ops, make_origs, AutocleaningConfig +from buckaroo.polars_buckaroo import PolarsAutocleaning from buckaroo.customizations.polars_commands import ( PlSafeInt, DropCol, FillNA, GroupBy, NoOp ) @@ -15,12 +17,12 @@ def make_default_analysis(**kwargs): - class DefaultAnalysis(PolarsAnalysis): + class DefaultAnalysis(ColAnalysis): requires_summary = [] provides_defaults = kwargs return DefaultAnalysis -class CleaningGenOps(PolarsAnalysis): +class CleaningGenOps(ColAnalysis): requires_summary = ['int_parse_fail', 'int_parse'] provides_defaults = {'cleaning_ops': []} @@ -66,17 +68,6 @@ def test_format_ops(): assert format_ops(column_meta) == expected_ops - - -class AlwaysSafeIntGenOps(PolarsAnalysis): - requires_summary = [] - provides_defaults = {'cleaning_ops': []} - - @classmethod - def computed_summary(kls, column_metadata): - return {'cleaning_ops': [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, - {'symbol': 'df'}]} - def test_merge_ops(): existing_ops = [ [{'symbol': 'safe_int', 'meta':{'auto_clean': True}}, 'a'], @@ -103,7 +94,7 @@ class ACConf(AutocleaningConfig): def test_handle_user_ops(): - ac = Autocleaning([ACConf]) + ac = PolarsAutocleaning([ACConf]) df = pl.DataFrame({'a': [10, 20, 30]}) cleaning_result = ac.handle_ops_and_clean(df, cleaning_method='default', existing_operations=[]) cleaned_df, cleaning_sd, generated_code, merged_operations = cleaning_result @@ -153,7 +144,7 @@ def test_make_origs_different_dtype(): assert make_origs(raw, cleaned).to_dicts() == expected.to_dicts() def test_handle_clean_df(): - ac = Autocleaning([ACConf]) + ac = PolarsAutocleaning([ACConf]) df = pl.DataFrame({'a': ["30", "40"]}) cleaning_result = ac.handle_ops_and_clean(df, cleaning_method='default', existing_operations=[]) cleaned_df, cleaning_sd, generated_code, merged_operations = cleaning_result @@ -167,7 +158,7 @@ def test_handle_clean_df(): return df""" def test_autoclean_codegen(): - ac = Autocleaning([ACConf]) + ac = PolarsAutocleaning([ACConf]) df = pl.DataFrame({'a': ["30", "40"]}) cleaning_result = ac.handle_ops_and_clean(df, cleaning_method='default', existing_operations=[]) cleaned_df, cleaning_sd, generated_code, merged_operations = cleaning_result diff --git a/tests/unit/dataflow/dataflow_test.py b/tests/unit/dataflow/dataflow_test.py index 61abfec21..36c1d1a65 100644 --- a/tests/unit/dataflow/dataflow_test.py +++ b/tests/unit/dataflow/dataflow_test.py @@ -2,7 +2,7 @@ import pandas as pd from buckaroo.dataflow.dataflow import DataFlow from buckaroo.dataflow import dataflow as dft -from buckaroo.dataflow.dataflow import SENTINEL_DF_1, SENTINEL_DF_2 +from buckaroo.dataflow.autocleaning import SENTINEL_DF_1, SENTINEL_DF_2 simple_df = pd.DataFrame({'int_col':[1, 2, 3], 'str_col':['a', 'b', 'c']}) From bbb33a7608ca3e2e238327a22a12e98d7da9f76c Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Tue, 12 Mar 2024 20:22:21 -0400 Subject: [PATCH 224/250] Chore/fix solara notebook (#254) * naming conflict with pandas and polars dataframe both named df * updates to solara demo, threaded dataframe fetching --- example-notebooks/Solara-Buckaroo.ipynb | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/example-notebooks/Solara-Buckaroo.ipynb b/example-notebooks/Solara-Buckaroo.ipynb index a0a3d08de..f88628441 100644 --- a/example-notebooks/Solara-Buckaroo.ipynb +++ b/example-notebooks/Solara-Buckaroo.ipynb @@ -81,10 +81,10 @@ "source": [ "import polars as pl\n", "from buckaroo.solara_buckaroo import SolaraPolarsDFViewer, SolaraPolarsBuckarooWidget\n", - "df = pl.DataFrame({'a':[10,20]})\n", + "pldf = pl.DataFrame({'a':[10,20]})\n", "@solara.component\n", "def Page():\n", - " bw = SolaraPolarsDFViewer(df=df, pinned_rows=[])\n", + " bw = SolaraPolarsDFViewer(df=pldf, pinned_rows=[])\n", "display(Page())" ] }, @@ -105,7 +105,7 @@ }, "outputs": [], "source": [ - "cb_trips_df = pd.read_csv(\"https://github.com/paddymul/buckaroo-data/raw/main/cb_data/2016-04.csv\")\n" + "cb_trips_df = pd.read_csv(\"https://github.com/paddymul/buckaroo-data/raw/main/cb_data/2016-04.csv\")" ] }, { @@ -166,7 +166,7 @@ { "cell_type": "code", "execution_count": null, - "id": "74ff8e28-56ed-4cf8-9473-b88f9b047178", + "id": "48f11839-2fe0-454b-b616-d82d5fcabf38", "metadata": { "tags": [] }, @@ -183,8 +183,15 @@ "@solara.component\n", "def Page():\n", " solara.Select(label=\"df_name\", value=df_name, values=dataframe_names)\n", - " active_df = pl.read_parquet(url_base+df_name.value)\n", - " bw = SolaraPolarsDFViewer(active_df)\n", + "\n", + " @solara.lab.use_task(dependencies=[df_name.value])\n", + " def read_df():\n", + " return pl.read_parquet(url_base+df_name.value)\n", + "\n", + " solara.ProgressLinear(read_df.pending)\n", + " if read_df.latest is not None:\n", + " with solara.Div(style={\"opacity\": 0.3 if read_df.pending else 1.0}):\n", + " SolaraPolarsDFViewer(read_df.latest)\n", "\n", " solara.Markdown(f\"**Selected**: {df_name.value}\")\n", "display(Page())" From 2616cda95ed4e365136d574e9127d67d25eb28d3 Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 21 Mar 2024 17:56:08 -0400 Subject: [PATCH 225/250] fix for google-colab being in an iframe... I think (#257) * fix for google-colab being in an iframe... I think * turns out it still doesn't work * Version bump to 0.6.6 --- buckaroo/_version.py | 2 +- docs/source/conf.py | 2 +- examples/index-iframe.html | 24 ++++++++++++++++++++++++ js/components/DFViewerParts/DFViewer.tsx | 9 +++++++-- js/style/dcf-npm.css | 13 +++++++++++++ package.json | 2 +- pyproject.toml | 2 +- tests/unit/polars_basic_widget_test.py | 6 ++++-- webpack-local-dev.config.js | 8 +++++++- 9 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 examples/index-iframe.html diff --git a/buckaroo/_version.py b/buckaroo/_version.py index 02b5e707b..317675ec7 100644 --- a/buckaroo/_version.py +++ b/buckaroo/_version.py @@ -1,4 +1,4 @@ # Copyright (c) Paddy Mullen. # Distributed under the terms of the Modified BSD License. -__version__ = "0.6.5" +__version__ = "0.6.6" diff --git a/docs/source/conf.py b/docs/source/conf.py index 967031d38..684e36e06 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,7 @@ project = 'Buckaroo' copyright = '2023, Paddy Mullen' author = 'Paddy Mullen' -release = '0.6.5' +release = '0.6.6' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/examples/index-iframe.html b/examples/index-iframe.html new file mode 100644 index 000000000..9a9a8ae53 --- /dev/null +++ b/examples/index-iframe.html @@ -0,0 +1,24 @@ + + + + + + + + + iframe wrapper index 2 + + + + + +

    index iframe

    +
    + + + + diff --git a/js/components/DFViewerParts/DFViewer.tsx b/js/components/DFViewerParts/DFViewer.tsx index 78e9c317e..d99ea216e 100644 --- a/js/components/DFViewerParts/DFViewer.tsx +++ b/js/components/DFViewerParts/DFViewer.tsx @@ -114,6 +114,7 @@ export function DFViewer({ minHeight: 50, maxHeight: dfvHeight, }; + const inIframe = window.parent !== window; const belowMinRows = agData.length + df_viewer_config.pinned_rows.length < 10; const shortMode = @@ -121,9 +122,13 @@ export function DFViewer({ df_viewer_config?.extra_grid_config?.rowHeight === undefined; const layoutType = shortMode ? 'autoHeight' : 'normal'; const applicableStyle = shortMode ? shortDivStyle : regularDivStyle; - console.log('shortMode', shortMode, dfvHeight); + console.log('shortMode', shortMode, dfvHeight, inIframe); return ( -
    +
    div { diff --git a/package.json b/package.json index 32258cfd3..56226ae9e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "buckaroo", - "version": "0.6.5", + "version": "0.6.6", "description": "Fast Datagrid widget for the Jupyter Notebook and JupyterLab", "keywords": [ "jupyter", diff --git a/pyproject.toml b/pyproject.toml index 46dac316c..d58c3e8fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "ipywidgets>=7.6.0,<9", "graphlib_backport>=1.0.0" ] -version = "0.6.5" +version = "0.6.6" [project.license] file = "LICENSE.txt" diff --git a/tests/unit/polars_basic_widget_test.py b/tests/unit/polars_basic_widget_test.py index 4a0125499..137582394 100644 --- a/tests/unit/polars_basic_widget_test.py +++ b/tests/unit/polars_basic_widget_test.py @@ -158,8 +158,10 @@ def test_weird(): RAW = {'names': ['all_NA', 'half_NA'], 'histo': [ - [{'name': 'NA', 'NA': 100.0}], - [{'name': 1, 'cat_pop': 46.0}, {'name': 'NA', 'NA': 54.0}]]} + [{'name': 'NA', 'NA': 100.0 }], + [ + {'name': '1', 'cat_pop': 46.0}, + {'name': 'NA', 'NA': 54.0 }]]} pl_histo = pl.DataFrame(RAW) PolarsBuckarooWidget(pl_histo) diff --git a/webpack-local-dev.config.js b/webpack-local-dev.config.js index e87e68cd2..5f17375b3 100644 --- a/webpack-local-dev.config.js +++ b/webpack-local-dev.config.js @@ -111,7 +111,13 @@ module.exports = [ plugins: [new HtmlWebpackPlugin({ //template: './examples/index.html' template: './examples/index.html' - })], + }), + new HtmlWebpackPlugin({ + filename: path.join(__dirname, '/examples/dist', 'index-iframe.html'), + template: 'examples/index-iframe.html', + // chunks: ['exampleEntry'] + }) + ], performance }, From 8271116cda1348f627515803454aa8cb893ba16b Mon Sep 17 00:00:00 2001 From: Paddy Mullen Date: Thu, 21 Mar 2024 19:13:08 -0400 Subject: [PATCH 226/250] Feat/docs js examples (#258) * moves live example js docs to read-the-docs --- .readthedocs.yaml | 13 + {examples => docs/examples}/App.tsx | 47 ++-- docs/examples/CodeBlock.tsx | 27 ++ docs/examples/CodePenButton.tsx | 77 ++++++ docs/examples/ReadmeBlock.tsx | 12 + {examples => docs/examples}/app.css | 21 +- .../data/2014-01-citibike-tripdata.csv | 0 .../data/yellow_tripdata_2021-02.csv | 0 docs/examples/ex/ColumnsEditorEx.tsx | 5 + docs/examples/ex/CommandViewerEx.tsx | 20 ++ docs/examples/ex/DFViewerEx.tsx | 3 + .../examples}/ex/DFViewerEx_large.tsx | 16 +- docs/examples/ex/DFViewerEx_real_summary.tsx | 20 ++ docs/examples/ex/DFViewerEx_short_data.tsx | 22 ++ .../examples}/ex/DFViewerEx_string_index.tsx | 20 +- .../examples}/ex/HistogramEx.tsx | 41 ++- .../examples}/ex/StatusBarEx.tsx | 4 +- docs/examples/ex/WidgetDCFCellEx.tsx | 6 + {examples => docs/examples}/example.css | 0 .../examples/index-iframe.hnottml | 4 +- {examples => docs/examples}/index-react18.tsx | 0 {examples => docs/examples}/index.html | 6 +- {examples => docs/examples}/index.tsx | 1 - docs/examples/jsx-loader.ts | 22 ++ .../examples_tsconfig.json | 2 +- .../_static/embed-bundle.js.LICENSE.txt | 6 +- docs/webpack.typescript.localdev.ts | 120 +++++++++ examples/ex/ColumnsEditorEx.tsx | 9 - examples/ex/CommandViewerEx.tsx | 20 -- examples/ex/DFViewerEx.tsx | 3 - examples/ex/DFViewerEx_real_summary.tsx | 20 -- examples/ex/DFViewerEx_short_data.tsx | 24 -- examples/ex/WidgetDCFCellEx.tsx | 7 - js/index.ts | 29 ++ package.json | 6 +- tests/unit/basic_widget_test.py | 2 +- tests/unit/fixtures.py | 2 +- tests/unit/polars_analysis_management_test.py | 2 +- tests/unit/polars_basic_widget_test.py | 8 +- yarn.lock | 249 +++++++++++++++--- 40 files changed, 698 insertions(+), 198 deletions(-) rename {examples => docs/examples}/App.tsx (66%) create mode 100644 docs/examples/CodeBlock.tsx create mode 100644 docs/examples/CodePenButton.tsx create mode 100644 docs/examples/ReadmeBlock.tsx rename {examples => docs/examples}/app.css (92%) rename {examples => docs/examples}/data/2014-01-citibike-tripdata.csv (100%) rename {examples => docs/examples}/data/yellow_tripdata_2021-02.csv (100%) create mode 100644 docs/examples/ex/ColumnsEditorEx.tsx create mode 100644 docs/examples/ex/CommandViewerEx.tsx create mode 100644 docs/examples/ex/DFViewerEx.tsx rename {examples => docs/examples}/ex/DFViewerEx_large.tsx (91%) create mode 100644 docs/examples/ex/DFViewerEx_real_summary.tsx create mode 100644 docs/examples/ex/DFViewerEx_short_data.tsx rename {examples => docs/examples}/ex/DFViewerEx_string_index.tsx (96%) rename {examples => docs/examples}/ex/HistogramEx.tsx (58%) rename {examples => docs/examples}/ex/StatusBarEx.tsx (62%) create mode 100644 docs/examples/ex/WidgetDCFCellEx.tsx rename {examples => docs/examples}/example.css (100%) rename examples/index-iframe.html => docs/examples/index-iframe.hnottml (78%) rename {examples => docs/examples}/index-react18.tsx (100%) rename {examples => docs/examples}/index.html (74%) rename {examples => docs/examples}/index.tsx (84%) create mode 100644 docs/examples/jsx-loader.ts rename examples/tsconfig.json => docs/examples_tsconfig.json (96%) create mode 100644 docs/webpack.typescript.localdev.ts delete mode 100644 examples/ex/ColumnsEditorEx.tsx delete mode 100644 examples/ex/CommandViewerEx.tsx delete mode 100644 examples/ex/DFViewerEx.tsx delete mode 100644 examples/ex/DFViewerEx_real_summary.tsx delete mode 100644 examples/ex/DFViewerEx_short_data.tsx delete mode 100644 examples/ex/WidgetDCFCellEx.tsx diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 8287f2413..22a186a89 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -4,5 +4,18 @@ build: os: ubuntu-22.04 tools: python: "3.11" + nodejs: "18" apt_packages: - graphviz + - npm + jobs: + post_build: + - echo "Command run at 'post_build' step" + - echo `date` + - echo "$READTHEDOCS_OUTPUT/html" + - node --version + - npm install + - npm run build:examples + - pwd + - ls + - cp -r docs/build/html/examples "$READTHEDOCS_OUTPUT/html" \ No newline at end of file diff --git a/examples/App.tsx b/docs/examples/App.tsx similarity index 66% rename from examples/App.tsx rename to docs/examples/App.tsx index 03d9df943..01eea628c 100644 --- a/examples/App.tsx +++ b/docs/examples/App.tsx @@ -2,14 +2,10 @@ import 'bootstrap/dist/css/bootstrap.min.css'; import React from 'react'; import {HashRouter as Router, Route, Link} from 'react-router-dom'; -//import {Button} from 'react-bootstrap'; +import {Button} from 'react-bootstrap'; import './app.css'; -import 'ag-grid-community/styles/ag-grid.css'; -import 'ag-grid-community/styles/ag-theme-alpine.css'; -import '../js/style/dcf-npm.css'; - const examples = { WidgetDCFCellEx: {title: 'WigetDCFCell', file: 'WidgetDCFCellEx'}, @@ -25,33 +21,43 @@ const examples = { HistogramEx: {title: 'Histogram', file: 'HistogramEx'} }; + +// The examples use a code-loading technique that I have described in +// https://mmomtchev.medium.com/making-examples-displaying-code-along-its-output-with-webpack-a28dcf5439c6 + +const ReadmeBlock = React.lazy(() => import(/* webpackPrefetch: true */ './ReadmeBlock')); +const CodeBlock = React.lazy(() => import(/* webpackPrefetch: true */ './CodeBlock')); + for (const ex of Object.keys(examples)) { examples[ex].comp = React.lazy( () => import(/* webpackPrefetch: true */ `./ex/${examples[ex].file}.tsx`) ); - examples[ex].code = 'asfd' - examples[ex].text = 'text' + examples[ex].code = import( + /* webpackPrefetch: true */ `!!html-loader?{"minimize":false}!./jsx-loader.ts!./ex/${examples[ex].file}.tsx` + ).then((code) => code.default); + examples[ex].text = import( + /* webpackPrefetch: true */ `!!raw-loader!./ex/${examples[ex].file}.tsx` + ).then((text) => text.default); } const LeftMenuItem = (props): JSX.Element => ( -
    -

    +

    + -
    ); +// eslint-disable-next-line no-var +//declare var VERSION: string = "handwritten"; const App = (): JSX.Element => { const [jsText, setJSText] = React.useState(''); return ( -

    - buckaroo stuff examples + Buckaroo JS Frontend Examples

    @@ -65,20 +71,28 @@ const App = (): JSX.Element => {
    Loading...
    }> +
    {Object.keys(examples).map((e) => (
    -
    +
    Loading component...
    }> - {React.createElement(examples[e].comp)} +
    +

    Component example

    + {React.createElement(examples[e].comp)} +
    Parsing code...
    }> - +
    @@ -87,7 +101,6 @@ const App = (): JSX.Element => {
    -
    ); }; diff --git a/docs/examples/CodeBlock.tsx b/docs/examples/CodeBlock.tsx new file mode 100644 index 000000000..47853fea0 --- /dev/null +++ b/docs/examples/CodeBlock.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import CodePenButton from './CodePenButton'; +import 'prism-themes/themes/prism-vsc-dark-plus.css'; + +// This is expensive to render +const CodeBlock = React.memo(function _CodeBlock(props: { + title: string; + code: Promise; + text: Promise; +}) { + const [code, setCode] = React.useState('loading()'); + React.useEffect(() => { + props.code.then((r) => setCode(r)); + }, [props.code, props.text]); + return ( +
    + +
    +
    +                    
    +                
    +
    +
    + ); +}); + +export default CodeBlock; diff --git a/docs/examples/CodePenButton.tsx b/docs/examples/CodePenButton.tsx new file mode 100644 index 000000000..cae1f9493 --- /dev/null +++ b/docs/examples/CodePenButton.tsx @@ -0,0 +1,77 @@ +import * as React from 'react'; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import exampleCss from '!!raw-loader!./example.css'; + +const CodePenButton = React.memo(function _CodePenButton(props: { + text: Promise; + title: string; +}) { + const [text, setText] = React.useState('loading()'); + React.useEffect(() => { + props.text.then((r) => { + r = r.replace( + /import (.*) from '(.*)'/g, + (match, g1, g2) => `import ${g1} from "https://cdn.skypack.dev/${g2}"` + ); + r = r.replace(/import '.*';\n/g, ''); + r = r.replace(/export default function (.*)/, 'function Comp() {'); + r = 'import * as ReactDOM from "https://cdn.skypack.dev/react-dom";\n' + r; + r += '\nReactDOM.render(, document.getElementById("root"));\n'; + setText(r); + }); + }, [props.text]); + + const ref = React.useRef(); + + return ( +
    +
    ', + js: text, + js_pre_processor: 'typescript', + css: exampleCss, + js_external: + 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js', + css_external: + 'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css;' + + 'https://unpkg.com/react-day-picker/dist/style.css' + })} + /> + + + ); +}); + +export default CodePenButton; diff --git a/docs/examples/ReadmeBlock.tsx b/docs/examples/ReadmeBlock.tsx new file mode 100644 index 000000000..9360cbd0e --- /dev/null +++ b/docs/examples/ReadmeBlock.tsx @@ -0,0 +1,12 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import React from 'react'; +// @ts-ignore +import READMEmd from '../../README.md'; +//const READMEmd = "

    paddy readme

    " + +// This is expensive to render +const ReadmeBlock = React.memo(function _README() { + return
    ; +}); + +export default ReadmeBlock; diff --git a/examples/app.css b/docs/examples/app.css similarity index 92% rename from examples/app.css rename to docs/examples/app.css index c464b4569..bfc3bb42e 100644 --- a/examples/app.css +++ b/docs/examples/app.css @@ -18,6 +18,7 @@ .codeblock { max-height: 90vh; overflow-y: scroll; + text-align: left; } .codeblock > pre { @@ -50,9 +51,15 @@ html,body min-height: 100vh; font-size: 16px; text-align: center; - color: var(--color-example); + /*color: var(--color-example); */ + color:black; margin: 0; } +#fullscreen { + width:100% + +} + #app { @@ -73,6 +80,18 @@ html,body color:black; } +.component-example { + border:1px solid black; + table { + th { + border: 2px solid black; + } + td { + border:1px solid black; + } + } +} + .customHeaderRenderer { height:100%; } diff --git a/examples/data/2014-01-citibike-tripdata.csv b/docs/examples/data/2014-01-citibike-tripdata.csv similarity index 100% rename from examples/data/2014-01-citibike-tripdata.csv rename to docs/examples/data/2014-01-citibike-tripdata.csv diff --git a/examples/data/yellow_tripdata_2021-02.csv b/docs/examples/data/yellow_tripdata_2021-02.csv similarity index 100% rename from examples/data/yellow_tripdata_2021-02.csv rename to docs/examples/data/yellow_tripdata_2021-02.csv diff --git a/docs/examples/ex/ColumnsEditorEx.tsx b/docs/examples/ex/ColumnsEditorEx.tsx new file mode 100644 index 000000000..b9a3c6402 --- /dev/null +++ b/docs/examples/ex/ColumnsEditorEx.tsx @@ -0,0 +1,5 @@ +import { extraComponents } from 'buckaroo'; +import 'ag-grid-community/styles/ag-grid.css'; +import 'ag-grid-community/styles/ag-theme-alpine.css'; + +export default extraComponents.ColumnsEditorEx; diff --git a/docs/examples/ex/CommandViewerEx.tsx b/docs/examples/ex/CommandViewerEx.tsx new file mode 100644 index 000000000..4b1a62dfc --- /dev/null +++ b/docs/examples/ex/CommandViewerEx.tsx @@ -0,0 +1,20 @@ +import * as React from 'react'; + +//import {bakedOperations, bakedCommandConfig } from '../../../js/baked_data/staticData'; +import { bakedData } from 'buckaroo'; +import { extraComponents } from 'buckaroo'; + + +export default function Simple() { + return ( + { + console.log('setCommands sent', foo); + }} + activeColumn={'foo-column'} + allColumns={['foo-col', 'bar-col', 'baz-col']} + commandConfig={bakedData.bakedCommandConfig} + /> + ); +} diff --git a/docs/examples/ex/DFViewerEx.tsx b/docs/examples/ex/DFViewerEx.tsx new file mode 100644 index 000000000..410ea2411 --- /dev/null +++ b/docs/examples/ex/DFViewerEx.tsx @@ -0,0 +1,3 @@ +import { extraComponents } from 'buckaroo'; + +export default extraComponents.DFViewerEx; diff --git a/examples/ex/DFViewerEx_large.tsx b/docs/examples/ex/DFViewerEx_large.tsx similarity index 91% rename from examples/ex/DFViewerEx_large.tsx rename to docs/examples/ex/DFViewerEx_large.tsx index 4bd7f3b03..3fde2d756 100644 --- a/examples/ex/DFViewerEx_large.tsx +++ b/docs/examples/ex/DFViewerEx_large.tsx @@ -1,9 +1,8 @@ -import {DFViewer} from '../../js/components/DFViewerParts/DFViewer'; +import React, { useState} from 'react'; import _ from 'lodash'; -//import { stringIndexDf } from '../../js/baked_data/staticData'; -import React, { useState} from 'react'; -import { DFData, DFViewerConfig } from '../../js/components/DFViewerParts/DFWhole'; +import { extraComponents } from 'buckaroo'; +//import { DFData, DFViewerConfig } from 'buckaroo'; const data = [ { @@ -181,7 +180,9 @@ const dictOfListsToListOfDicts = (a: Record) : Record) : Record; diff --git a/docs/examples/ex/DFViewerEx_real_summary.tsx b/docs/examples/ex/DFViewerEx_real_summary.tsx new file mode 100644 index 000000000..4f2673b08 --- /dev/null +++ b/docs/examples/ex/DFViewerEx_real_summary.tsx @@ -0,0 +1,20 @@ +import React, { useState} from 'react'; +import { extraComponents, bakedData } from 'buckaroo'; + +//import { realSummaryConfig, realSummaryTableData } from '../../../js/baked_data/staticData'; +//import { realSummaryConfig, realSummaryTableData } from 'buckaroo'; + + + export default function DFViewerExString() { + const [activeCol, setActiveCol] = useState('tripduration'); + + const current = { + 'df': bakedData.realSummaryTableData, 'df_viewer_config': bakedData.realSummaryConfig, + 'summary_stats_data': bakedData.realSummaryTableData }; + + return ; + } + diff --git a/docs/examples/ex/DFViewerEx_short_data.tsx b/docs/examples/ex/DFViewerEx_short_data.tsx new file mode 100644 index 000000000..cc95a3ac7 --- /dev/null +++ b/docs/examples/ex/DFViewerEx_short_data.tsx @@ -0,0 +1,22 @@ +import React, { useState} from 'react'; +import { bakedData, extraComponents } from 'buckaroo'; + + + + export default function DFViewerExString() { + const [activeCol, setActiveCol] = useState('tripduration'); +// const dfv_config:DFViewerConfig = { + const dfv_config:any = { + column_config: bakedData.realSummaryConfig.column_config, + pinned_rows: []} + + const current = { + 'df':bakedData.realSummaryTableData, 'df_viewer_config': bakedData.realSummaryConfig, + 'summary_stats_data': bakedData.realSummaryTableData }; + + return ; + } + diff --git a/examples/ex/DFViewerEx_string_index.tsx b/docs/examples/ex/DFViewerEx_string_index.tsx similarity index 96% rename from examples/ex/DFViewerEx_string_index.tsx rename to docs/examples/ex/DFViewerEx_string_index.tsx index 36bc86aea..c43207d39 100644 --- a/examples/ex/DFViewerEx_string_index.tsx +++ b/docs/examples/ex/DFViewerEx_string_index.tsx @@ -1,7 +1,7 @@ -import {DFViewer} from '../../js/components/DFViewerParts/DFViewer'; -//import { stringIndexDf } from '../../js/baked_data/staticData'; import React, { useState} from 'react'; -import { DFData, DFViewerConfig } from '../../js/components/DFViewerParts/DFWhole'; +import { extraComponents } from 'buckaroo'; +//import { DFData, DFViewerConfig } from 'buckaroo'; + const data = [ { @@ -479,7 +479,9 @@ const summary_stats_data =[ export default function DFViewerExString() { const [activeCol, setActiveCol] = useState('tripduration'); - const dfvConfig:DFViewerConfig = { + //const dfvConfig:DFViewerConfig = { + + const dfvConfig:any = { "pinned_rows": [ { "primary_key_val": "dtype", @@ -552,7 +554,9 @@ const summary_stats_data =[ // } // ] // } - const current: {'df':DFData, 'df_viewer_config':DFViewerConfig, 'summary_stats_data':DFData} = { + //const current: {'df':DFData, 'df_viewer_config':DFViewerConfig, 'summary_stats_data':DFData} = { + + const current: {'df':any, 'df_viewer_config':any, 'summary_stats_data':any} = { "df": [], "df_viewer_config": { "pinned_rows": [ @@ -996,9 +1000,11 @@ const summary_stats_data =[ ] } - const working = {'df':data, 'df_viewer_config': dfvConfig, 'summary_stats_data':summary_stats_data}; + //const working = {'df':data, 'df_viewer_config': dfvConfig, 'summary_stats_data':summary_stats_data}; + const working = {'df':data, 'df_viewer_config': dfvConfig, 'summary_stats_data':summary_stats_data}; + - return ; diff --git a/examples/ex/HistogramEx.tsx b/docs/examples/ex/HistogramEx.tsx similarity index 58% rename from examples/ex/HistogramEx.tsx rename to docs/examples/ex/HistogramEx.tsx index 76d094739..6e1310250 100644 --- a/examples/ex/HistogramEx.tsx +++ b/docs/examples/ex/HistogramEx.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import {histograms } from '../../js/baked_data/staticData'; -import { HistogramCell } from '../../js/components/DFViewerParts/HistogramCell'; +//import { histograms } from '../../js/baked_data/staticData'; +//import { HistogramCell } from '../../js/components/DFViewerParts/HistogramCell'; +import { extraComponents, bakedData } from 'buckaroo'; @@ -9,70 +10,58 @@ export default function Simple() { num_histo, bool_histo, NA_Only, simple_catgeorical, categorical_histo, categorical_histo_lt, all_unique, unique_na, unique_continuous, unique_continuous_scaled, unique_continuous_scaled_50, - start_station_categorical} = histograms; + start_station_categorical} = bakedData.histograms; return
    Numeric - +
    Boolean with NA - +
    NA Only - +
    Simple Categorical - +
    Categorical unique NA - +
    Categorical_longtail - +
    Categorical All unique - +
    Categorical Unique with NA - +
    Numeric all Unique - +
    start station categorical - +
    Numeric 50% unique - +
    - - -
    } -/* - - - */ diff --git a/examples/ex/StatusBarEx.tsx b/docs/examples/ex/StatusBarEx.tsx similarity index 62% rename from examples/ex/StatusBarEx.tsx rename to docs/examples/ex/StatusBarEx.tsx index 9074996f0..7fa15299e 100644 --- a/examples/ex/StatusBarEx.tsx +++ b/docs/examples/ex/StatusBarEx.tsx @@ -1,6 +1,6 @@ -import {StatusBarEx} from '../../js/components/StatusBar'; +import { extraComponents } from 'buckaroo'; -export default StatusBarEx; +export default extraComponents.StatusBarEx; // export default function Simple() { // return ; // } diff --git a/docs/examples/ex/WidgetDCFCellEx.tsx b/docs/examples/ex/WidgetDCFCellEx.tsx new file mode 100644 index 000000000..05909a988 --- /dev/null +++ b/docs/examples/ex/WidgetDCFCellEx.tsx @@ -0,0 +1,6 @@ +import * as React from 'react'; +import {extraComponents} from 'buckaroo'; + +export default function Simple() { + return ; +} diff --git a/examples/example.css b/docs/examples/example.css similarity index 100% rename from examples/example.css rename to docs/examples/example.css diff --git a/examples/index-iframe.html b/docs/examples/index-iframe.hnottml similarity index 78% rename from examples/index-iframe.html rename to docs/examples/index-iframe.hnottml index 9a9a8ae53..ec751fb20 100644 --- a/examples/index-iframe.html +++ b/docs/examples/index-iframe.hnottml @@ -6,7 +6,7 @@ - iframe wrapper index 2 + iframe wrapper index

    RSS Feed   channeldata.json

    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�W{K->(aN*3#r%q7DZU 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 z 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 Xg=nJtr>WEf@W;%^%CPF9TlD_{*#Zx= literal 0 HcmV?d00001 diff --git a/docs/source/articles/histograms.rst b/docs/source/articles/histograms.rst index 4cb9988bc..ffbe9834a 100644 --- a/docs/source/articles/histograms.rst +++ b/docs/source/articles/histograms.rst @@ -4,39 +4,62 @@ Histograms ========== -Buckaroo uses histograms to convey the general shape of a colum in the minimum amount of screen real estate. Like the rest of buckaroo, this is an opionated feature. +Buckaroo uses histograms to convey the general shape of a colum in the minimum amount of screen real estate. Like the rest of buckaroo, this is an opionated feature that can be overridden with your own preferences. -Simple histograms for numeric columns -===================================== +Interpreting Buckaroo histograms by example +============================== +Histograms in buckaroo are designed to give you a rough understanding of the distribution of values in a column at a glance. This can tell you important things like "is this an ID column?" "is this a categorical column". The following pictures give some context. -Histograms traditionally show the distribution of values in a column allowing different distributions to be identified (normal distribution, bimodal, random, skew). This works well for accurate data without outliers. -There are a couple types of outliers that mess up normal histogrrams. +Common patterns +--------------- -Traditional histograms make no provision for NaNs. There are two ways we could deal with NaN's treating them as another bar, or as an independent bar. We chose a separate bar because NaNs are a property of the entire dataset and the histogram is a function of the relevant values. NaNs are displayed in a different color and pattern. +.. image:: ../_static/histograms-common.png + :alt: Most common histograms +This picture shows 5 common column types. -Sentinel values. Columns frquently have sentinel values mixed in to convey missing data or some special condition. After dropping NaNs, we then look at the value counts, here is one explanation of a sampling -imagine a dataset inserts 0 for NaNs, without 0's the range of numbers goes from 55 to 235, 0's account for 10% of observations. 0 is obviosuly a sentinel here and should be plotted as a categorical. If you disagree you can write your own histogram implementation and plug it in with the pluggable analysis framework. +* ``normal`` shows a numerical column with random (unordered) values from the standard distribution +* ``exponential`` shows a numerical column with random unorderd values from the exponential distribution +* ``increasing`` shows all numbers from 1 to 2000 ordered. +* ``one`` shows a column where every value is "1". This is displayed in pink with a pattern because the histogram treats it as a categorical histogram even though it is a numerical column +* ``all_unique_cat`` shows the histogram for a string column where each value is different. This is a categorical histogram -Extreme values. Buckaroo limits the extents of the set where the histogram is computed so that of the 10 bins, no single bin represents more than 50% of samples, limited to the quantile range from (0.1 to 0.9). The reasoning is that the extreme values represent errant values if they are so far off that they mess up the range of the rest of the histogram. I haven't decided how to convey which quantile range was chosen. +Categorical patterns +-------------------- + +Buckaroo has special colors and patterns for categorical type columns. Categoricals are always displayed in decreasing order with the most frequent value on the left. There are other special columns. Unique and longtail are stacked. Longtail is the sum of occurences of every value that is not unique, and is not one of the 7 most frequent categories. Unique is the bar for values that occur only once. + + +.. image:: ../_static/histograms-categorical-1.png + :alt: Most common histograms + + +Numeric columns with less than 5 values are treated as categoricals. The thinking was that a limited number of values in a numeric column probably represented some type of flag field, and not a true measurement. + +* ``all_NA`` has only NA/NaN values. The red cross hatch takes up the entire histogram area +* ``half_NA`` has half NA values and the other half is filled with ``1``. +* ``longtail`` has 80% longtail values and 20% NA +* ``longtail_unique`` has half longtail values and half unique values. Note that the bars are stacked + + +Numeric patterns +---------------- -Categorical Histograms for everything else -========================================== -Histograms are generally considered for numeric columns. Most datasets have many categorical or non numeric values, how can we get a quick overview of them? +Numeric histograms work mostly as expected. One thing to note, there is a separate bar for the 1st and last percentile of values. This filters out extreme values and gives much more resolution to the middle 98% of data. With such a small area, this seemed like the best approach. -Well we already know how to plot NaNs, there are three other sentinel values that matter False, True, and "0". -Remaining categoricals are plotted as a long tail plot, most frequent on the left with decreasing frequency to the right. The top 7 most frequent values are plotted, with a final bar of "long tail" consisting of the sum of all the remaining values" +.. image:: ../_static/histograms-numeric.png + :alt: Most common histograms +* ``bimodal`` shows a bimodal distribution +* ``Exp`` shows an exponential distribution +* ``geometric`` shows a geometric distribution. Note that this is very difficult to decipher from an exponential distribution, probably due to outlier filters and limited resolution. -Objections to this approach -=========================== -This is not a traditional histogram and should not be read as such. It is the best way to show the most insight about frequency of values in a column that we could come up with. Other research diff --git a/example-notebooks/Histograms-demo.ipynb b/example-notebooks/Histograms-demo.ipynb new file mode 100644 index 000000000..078ebd906 --- /dev/null +++ b/example-notebooks/Histograms-demo.ipynb @@ -0,0 +1,241 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "75a6af82-5029-4d16-abf1-f0aeb0489957", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import itertools\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import buckaroo\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7e8c5b0-a8c4-4b18-95a3-4be3e4dd6cb6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#regular histograms \n", + "N=400\n", + "mu, sigma = 40, 5\n", + "mu2, sigma2 = 60, 5\n", + "X1 = np.random.normal(mu, sigma, N)\n", + "X2 = np.random.normal(mu2, sigma2, N)\n", + "X = np.concatenate([X1, X2])\n", + "ab = plt.hist(X,bins=10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa9097b0-1c99-46b1-b966-06a9e47e57d6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def bimodal(mean_1, mean_2, N, sigma=5):\n", + " X1 = np.random.normal(mean_1, sigma, int(N/2))\n", + " X2 = np.random.normal(mean_2, sigma2, int(N/2))\n", + " X = np.concatenate([X1, X2])\n", + " return X\n", + "ab = plt.hist(bimodal(20,40, 400),bins=10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1f7c1ac-26c1-4660-8a6f-936f13d95351", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#lognormal histograms\n", + "mu, sigma = 3, .5 # mean and standard deviation\n", + "s = np.random.lognormal(mu, sigma, N)\n", + "ab = plt.hist(s,bins=10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91c4cf93-4a15-48ba-a1e9-a46683fcfccf", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def rand_cat(named_p, na_per, N):\n", + " choices, p = [], []\n", + " named_total_per = sum(named_p.values()) + na_per\n", + " total_len = int(np.floor(named_total_per * N))\n", + " if named_total_per > 0:\n", + " for k, v in named_p.items():\n", + " choices.append(k)\n", + " p.append(v/named_total_per)\n", + "\n", + " choices.append(pd.NA)\n", + " p.append(na_per/named_total_per) \n", + " return [np.random.choice(choices, p=p) for k in range(total_len)]\n", + " else:\n", + " return []\n", + "\n", + "def random_categorical(named_p, unique_per, na_per, longtail_per, N):\n", + " choice_arr = rand_cat(named_p, na_per, N)\n", + " discrete_choice_len = len(choice_arr)\n", + "\n", + " longtail_count = int(np.floor(longtail_per * N))//2\n", + " extra_arr = []\n", + " for i in range(longtail_count):\n", + " extra_arr.append(\"long_%d\" % i)\n", + " extra_arr.append(\"long_%d\" % i)\n", + "\n", + " unique_len = N - (len(extra_arr) + discrete_choice_len)\n", + " #print(\"discrete_choice_len\", discrete_choice_len, \"longtail_count\", longtail_count, \"unique_len\", unique_len)\n", + " for i in range(unique_len):\n", + " extra_arr.append(\"unique_%d\" % i)\n", + " all_arr = np.concatenate([choice_arr, extra_arr])\n", + " np.random.shuffle(all_arr)\n", + " return all_arr " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51cc9b45-beeb-4f68-bcd5-d115bb91f1a2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "N = 4000" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cfe316a-077c-4347-8b5e-c6048c16b5ca", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pd.DataFrame({\n", + " 'all_NA' : [pd.NA] * N,\n", + " 'half_NA' : random_categorical({1: .5}, unique_per=0, na_per=.5, longtail_per=.0, N=N),\n", + " 'longtail' : random_categorical({}, unique_per=0, na_per=.2, longtail_per=.8, N=N),\n", + " 'longtail_unique' : random_categorical({}, unique_per=0.5, na_per=.0, longtail_per=.5, N=N),\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36089fd7-cb7d-43d8-8e91-dbdf30f6a032", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#kitchen sink\n", + "pd.DataFrame({\n", + " 'one': [1]*N, \n", + " 'log_normal': np.random.lognormal(25, .3, N),\n", + " 'bimodal': bimodal(20,40, N),\n", + " 'cat_1':random_categorical({'foo': .35, 'bar': .2}, unique_per=.25, na_per=.2, longtail_per=0, N=N),\n", + " 'all_unique_cat':[str(i)+ \"_a\" for i in range(N)],\n", + " 'all_unique_N':[i for i in range(N)],\n", + " 'cat_long_tail': random_categorical({}, unique_per=0, na_per=.2, longtail_per=.8, N=N),\n", + " 'all_NA': [pd.NA] * N,\n", + "\n", + " 'cat_3':random_categorical({'foo': .3, 'bar': .05, 'baz':.1}, unique_per=.3, na_per=.25, longtail_per=0, N=N),\n", + " 'cat_4':random_categorical({'foo': .3, 'bar': .05, 'baz':.1}, unique_per=.3, na_per=.25, longtail_per=0, N=N)\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "02d70ce5-4dc6-42ea-853e-b5d5e99d684f", + "metadata": {}, + "outputs": [], + "source": [ + "pd.DataFrame({\n", + " 'normal': np.random.normal(25, .3, N),\n", + " 'exponential' : np.random.exponential(1.0, N) * 10 ,\n", + " 'increasing':[i for i in range(N)],\n", + " 'one': [1]*N, \n", + " 'all_unique_cat': random_categorical({}, unique_per=1, na_per=0, longtail_per=0, N=N)\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bb02641-0653-4ee7-86c5-7b058abaeb79", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pd.DataFrame({\n", + " 'bimodal' : bimodal(20,40, N),\n", + " 'exponential' : np.random.exponential(1.0, N) * 10 ,\n", + " 'geometric': np.random.geometric(.2, N) * 10,\n", + " 'log_normal': np.random.lognormal(25, .3, N),\n", + " 'normal': np.random.normal(25, .3, N),\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "425e2df3-54cd-4127-bac7-549fe2c15520", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#categoricals\n", + "pd.DataFrame({\n", + " 'two_vals': random_categorical({1: .75, 2: .25}, unique_per=0, na_per=0, longtail_per=0, N=N),\n", + " 'dominant_categories': random_categorical({'foo': .6, 'bar': .25, 'baz':.15}, unique_per=0, na_per=0, longtail_per=0, N=N),\n", + " 'dispersed_categories': random_categorical({'foo': .3, 'bar': .05, 'baz':.1}, unique_per=.3, na_per=.25, longtail_per=0, N=N),\n", + "})" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/introduction.ipynb b/introduction.ipynb index 79c757b52..97706d67f 100644 --- a/introduction.ipynb +++ b/introduction.ipynb @@ -17,7 +17,7 @@ "metadata": {}, "outputs": [], "source": [ - "df = pd.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')\n", + "df = pd.read_csv('./examples/data/yellow_tripdata_2021-02.csv')\n", "df" ] }, @@ -49,13 +49,13 @@ "from buckaroo.pluggable_analysis_framework import (ColAnalysis)\n", "from scipy.stats import skew\n", "class Skew(ColAnalysis):\n", - " provided_summary = [\"skew\"]\n", + " provides_summary = [\"skew\"]\n", " requires_summary = []\n", " \n", " @staticmethod\n", " def summary(sampled_ser, summary_ser, ser):\n", " if pd.api.types.is_integer_dtype(sampled_ser):\n", - " return dict(skew=skew(sampled_ser.astype('int64')))\n", + " return dict(skew=skew(sampled_ser.dropna().astype('int64')))\n", " elif pd.api.types.is_float_dtype(sampled_ser):\n", " return dict(skew=skew(sampled_ser.astype('float64')))\n", " else:\n", @@ -81,6 +81,15 @@ "w.add_analysis(Skew)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic Unit testing is built in\n", + "\n", + "Because there are so many corner cases with numerical code, every time a new summary stat is added, a variety of simple tests are run against it. This lets you discover bugs earlier." + ] + }, { "cell_type": "code", "execution_count": null, @@ -89,22 +98,82 @@ }, "outputs": [], "source": [ - "w.stats.presentation_sdf" + "w = BuckarooWidget(df[:500], showCommands=False)\n", + "# Here we try to replace min_digits with a version that throws errors on bools.\n", + "# Small error, but representantive of the types of erros that we see in the wild.\n", + "def int_digits(n):\n", + " if np.isnan(n):\n", + " return 1\n", + " if n == 0:\n", + " return 1\n", + " if np.sign(n) == -1:\n", + " return int(np.floor(np.log10(np.abs(n)))) + 2\n", + " return int(np.floor(np.log10(n)+1))\n", + "\n", + "class MinDigits(ColAnalysis):\n", + " requires_summary = [\"min\"]\n", + " provides_summary = [\"min_digits\"]\n", + " \n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype)\n", + " if is_numeric:\n", + " return {\n", + " 'min_digits':int_digits(summary_ser.loc['min'])}\n", + " else:\n", + " return {\n", + " 'min_digits':0}\n", + "w.add_analysis(MinDigits)" ] }, { - "cell_type": "markdown", - "metadata": {}, + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], "source": [ - "# Making a new default dataframe display function" + "#now we can use the reproduce line to quickly try this and iterate until we get to a solution\n", + "from buckaroo.analysis_management import PERVERSE_DF\n", + "MinDigits.summary(PERVERSE_DF['UInt8None'], pd.Series({'min': pd.NA, }), PERVERSE_DF['UInt8None'])" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], - "source": [] + "source": [ + "# use quiet = True if you just want the analysis to shutup and work for the most part.\n", + "# not generally recommended, but expedient. If this wasn't built in, users would write\n", + "# this functionality again over and over, poorly\n", + "\n", + "class MinDigits(ColAnalysis):\n", + " requires_summary = [\"min\"]\n", + " provides_summary = [\"min_digits\"]\n", + " quiet = True\n", + " \n", + " @staticmethod\n", + " def summary(sampled_ser, summary_ser, ser):\n", + " is_numeric = pd.api.types.is_numeric_dtype(sampled_ser.dtype)\n", + " if is_numeric:\n", + " return {\n", + " 'min_digits':int_digits(summary_ser.loc['min'])}\n", + " else:\n", + " return {\n", + " 'min_digits':0}\n", + "w.add_analysis(MinDigits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Making a new default dataframe display function" + ] }, { "cell_type": "code", @@ -224,7 +293,7 @@ "outputs": [], "source": [ "import polars as pl\n", - "pl.read_csv('/Users/paddy/code/citibike-play/2014-01 - Citi Bike trip data.csv')" + "pl.read_csv('./examples/data/yellow_tripdata_2021-02.csv')" ] }, { diff --git a/regular-summary-stats.ipynb b/regular-summary-stats.ipynb new file mode 100644 index 000000000..00c49832c --- /dev/null +++ b/regular-summary-stats.ipynb @@ -0,0 +1,3039 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "f43d2958-7872-4d38-ad01-a6b75cac29eb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2cc2ce06-572f-4962-aee9-345d4db6d0a2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "

    Syt 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