diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 30d98f3c..ee219b90 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -12,12 +12,21 @@ jobs:
       matrix:
         python:
           - "3.8"
-          - "3.9"
           - "3.10"
           - "3.11"
           - "3.12"
         plone:
           - "6.0-latest"
+          - "6.1-latest"
+        exclude:
+          - python: "3.10"
+            plone: "6.0-latest"
+          - python: "3.12"
+            plone: "6.0-latest"
+          - python: "3.8"
+            plone: "6.1-latest"
+          - python: "3.11"
+            plone: "6.1-latest"
 
     steps:
       - uses: actions/checkout@v4
@@ -28,8 +37,6 @@ jobs:
         with:
           python-version: ${{ matrix.python }}
           plone-version: ${{ matrix.plone }}
-          setuptools-version: 69.5.1
-          additional-eggs: 'setuptools'
       - name: Install package
         run: |
           make install
@@ -41,3 +48,7 @@ jobs:
       - name: Run tests
         run: |
           make test-ignore-warnings
+
+      - name: Run Javascript Tests
+        run: |
+          cd resources; make test
diff --git a/.gitignore b/.gitignore
index fc71f6a7..9afa3e6e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,6 +20,8 @@ __pycache__/
 .tox
 .vscode/
 node_modules/
+forest.dot
+forest.json
 
 # venv / buildout related
 bin/
@@ -46,7 +48,8 @@ local.cfg
 /venv/
 .installed.txt
 
-forest.*
+robot_*
+test_*
 
 ##
 # Add extra configuration options in .meta.toml:
diff --git a/.meta.toml b/.meta.toml
index d6b0222b..b841a770 100644
--- a/.meta.toml
+++ b/.meta.toml
@@ -3,7 +3,7 @@
 # See the inline comments on how to expand/tweak this configuration file
 [meta]
 template = "default"
-commit-id = "5d22fbf8"
+commit-id = "4cf2df11"
 
 [pyproject]
 codespell_skip = "*.js,*.min.js,*.min.js.map,*.min.css.map,*.svg,*.lock,*.json"
@@ -17,5 +17,6 @@ jobs = [
 
 [gitignore]
 extra_lines = """
-forest.*
+robot_*
+test_*
 """
diff --git a/MANIFEST.in b/MANIFEST.in
index 7c60d292..0ff55560 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,11 +1,15 @@
-exclude Makefile *.cfg *.in *.nix *.sh *.conf *.js *.json Procfile .jshintrc *-mxdev.txt .installed.txt
+exclude Makefile *.cfg *.in *.nix *.sh *.conf *.js *.json Procfile .jshintrc *-mxdev.txt .installed.txt *.yaml *.ini
+global-exclude *.pyc
+global-exclude *.yarn-integrity
+global-exclude cypress.json
+global-exclude cypress/**/*
+global-exclude node_modules/**
+global-exclude resources/**
 include *.py
 include *.rst
 include *.txt
 include .coveragerc
 include buildout.cfg
-include *.yaml
-include mx.ini
 recursive-include images *.gif
 recursive-include docs *.GPL
 recursive-include docs *.bugfix
@@ -13,11 +17,4 @@ recursive-include docs *.gif
 recursive-include docs *.md
 recursive-include docs *.png
 recursive-include docs *.rst
-prune src/collective/taxonomy/javascripts/node_modules/**/*
 graft src
-exclude src/collective/taxonomy/javascripts/build/messages/src/js/components/*.json
-global-exclude *.pyc
-global-exclude *.yarn-integrity
-global-exclude cypress.json
-global-exclude cypress/**/*
-global-exclude node_modules/**
diff --git a/README.rst b/README.rst
index 0ecd2d3c..673f006a 100644
--- a/README.rst
+++ b/README.rst
@@ -160,14 +160,34 @@ The languages allowed for the taxonomies are the languages defined in ``portal_l
 Development
 ===========
 
-Run the app, run ``npm start`` in the ``javascripts`` directory.
-To make Plone use the development code, you need the ``NODE_ENV`` environment
-variable to be set to ``development``:
+All JS development resources are in the directory ``resources/js``.
+
+While making changes to these files you can:
+
+  1. change to directory ``resources/``
+  2. run ``make serve``
+
+This starts a webpack development server at ``localhost:3000`` and
+serves the JS files.
+
+Now start your Plone instance with
 
 ::
 
     NODE_ENV=development bin/instance fg
 
+and the taxonomy controlpanel will use the files served from the webpack server.
+
+When you have finished your changes run:
+
+::
+
+    make test
+    make build
+
+this will build the resources and save it in ``src/collective/taxonomy/static/js``.
+
+
 
 i18n
 ----
diff --git a/images/edit_taxonomy_data.gif b/images/edit_taxonomy_data.gif
index 717b1128..b2e7423d 100644
Binary files a/images/edit_taxonomy_data.gif and b/images/edit_taxonomy_data.gif differ
diff --git a/src/collective/taxonomy/javascripts/.babelrc b/resources/.babelrc
similarity index 100%
rename from src/collective/taxonomy/javascripts/.babelrc
rename to resources/.babelrc
diff --git a/src/collective/taxonomy/javascripts/.eslintignore b/resources/.eslintignore
similarity index 100%
rename from src/collective/taxonomy/javascripts/.eslintignore
rename to resources/.eslintignore
diff --git a/src/collective/taxonomy/javascripts/.eslintrc b/resources/.eslintrc
similarity index 87%
rename from src/collective/taxonomy/javascripts/.eslintrc
rename to resources/.eslintrc
index 3b347eab..57930cd2 100644
--- a/src/collective/taxonomy/javascripts/.eslintrc
+++ b/resources/.eslintrc
@@ -1,5 +1,5 @@
 {
-  "extends": "airbnb",
+  "extends": ["eslint:recommended"],
   "parser": "babel-eslint",
   "env": {
     "browser": true,
@@ -7,10 +7,6 @@
     "jquery": true,
     "mocha": true
   },
-  "ecmaFeatures": {
-    "jsx": true,
-    "modules": true,
-  },
   "rules": {
     "array-bracket-spacing": [2, "never"],
     "no-redeclare": 0,
@@ -34,6 +30,6 @@
   ],
   "globals": {
     "__DEV__" : true,
-    "expect": true,
+    "expect": true
   }
 }
diff --git a/src/collective/taxonomy/javascripts/.gitignore b/resources/.gitignore
similarity index 76%
rename from src/collective/taxonomy/javascripts/.gitignore
rename to resources/.gitignore
index a58134b4..4527eb19 100644
--- a/src/collective/taxonomy/javascripts/.gitignore
+++ b/resources/.gitignore
@@ -1,2 +1,3 @@
 yarn-error.log
 cypress/screenshots/
+stamp-yarn
diff --git a/resources/Makefile b/resources/Makefile
new file mode 100644
index 00000000..16665fd6
--- /dev/null
+++ b/resources/Makefile
@@ -0,0 +1,29 @@
+# Taxonomy JS Development
+
+YARN   ?= npx yarn
+
+
+.PHONY: install
+stamp-yarn install:
+	$(YARN) install
+	touch stamp-yarn
+
+
+.PHONY:
+build: stamp-yarn
+	$(YARN) run build
+
+
+.PHONY:
+serve: stamp-yarn
+	$(YARN) run start
+
+
+.PHONY:
+test: stamp-yarn
+	$(YARN) run test
+
+
+.PHONY:
+lint: stamp-yarn
+	$(YARN) run lint
diff --git a/src/collective/taxonomy/javascripts/cypress.json b/resources/cypress.json
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress.json
rename to resources/cypress.json
diff --git a/src/collective/taxonomy/javascripts/cypress/fixtures/Centraal_Museum.png b/resources/cypress/fixtures/Centraal_Museum.png
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/fixtures/Centraal_Museum.png
rename to resources/cypress/fixtures/Centraal_Museum.png
diff --git a/src/collective/taxonomy/javascripts/cypress/fixtures/Kunsthal_KAdE.png b/resources/cypress/fixtures/Kunsthal_KAdE.png
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/fixtures/Kunsthal_KAdE.png
rename to resources/cypress/fixtures/Kunsthal_KAdE.png
diff --git a/src/collective/taxonomy/javascripts/cypress/fixtures/Musee_du_Louvre.png b/resources/cypress/fixtures/Musee_du_Louvre.png
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/fixtures/Musee_du_Louvre.png
rename to resources/cypress/fixtures/Musee_du_Louvre.png
diff --git a/src/collective/taxonomy/javascripts/cypress/fixtures/Zeeuws_Museum.png b/resources/cypress/fixtures/Zeeuws_Museum.png
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/fixtures/Zeeuws_Museum.png
rename to resources/cypress/fixtures/Zeeuws_Museum.png
diff --git a/src/collective/taxonomy/javascripts/cypress/fixtures/example.json b/resources/cypress/fixtures/example.json
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/fixtures/example.json
rename to resources/cypress/fixtures/example.json
diff --git a/src/collective/taxonomy/javascripts/cypress/integration/end_to_end.js b/resources/cypress/integration/end_to_end.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/integration/end_to_end.js
rename to resources/cypress/integration/end_to_end.js
diff --git a/src/collective/taxonomy/javascripts/cypress/plugins/index.js b/resources/cypress/plugins/index.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/plugins/index.js
rename to resources/cypress/plugins/index.js
diff --git a/src/collective/taxonomy/javascripts/cypress/support/commands.js b/resources/cypress/support/commands.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/support/commands.js
rename to resources/cypress/support/commands.js
diff --git a/src/collective/taxonomy/javascripts/cypress/support/index.js b/resources/cypress/support/index.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/cypress/support/index.js
rename to resources/cypress/support/index.js
diff --git a/src/collective/taxonomy/javascripts/index.html b/resources/index.html
similarity index 100%
rename from src/collective/taxonomy/javascripts/index.html
rename to resources/index.html
diff --git a/src/collective/taxonomy/javascripts/package.json b/resources/package.json
similarity index 94%
rename from src/collective/taxonomy/javascripts/package.json
rename to resources/package.json
index 3cbbe64f..99763989 100644
--- a/src/collective/taxonomy/javascripts/package.json
+++ b/resources/package.json
@@ -35,7 +35,7 @@
     "chai-spies": "*",
     "cypress": "^4.3.0",
     "eslint": "^6.6.0",
-    "eslint-config-airbnb": "^9.0.1",
+    "eslint-config-prettier": "^9.0.0",
     "eslint-plugin-import": "^1.7.0",
     "eslint-plugin-jsx-a11y": "^1.2.0",
     "eslint-plugin-react": "^5.1.1",
@@ -49,7 +49,7 @@
     "redux-devtools-log-monitor": "^1.0.11",
     "webpack": "^3.12.0",
     "webpack-dev-middleware": "^1.2.0",
-    "webpack-hot-middleware": "^2.25.4"
+    "webpack-hot-middleware": "^2.26.1"
   },
   "dependencies": {
     "har-validator": "5.1.5",
@@ -66,5 +66,9 @@
     "redux-thunk": "^2.1.0",
     "uid": "0.0.2",
     "whatwg-fetch": "^1.0.0"
+  },
+  "volta": {
+    "node": "18.20.3",
+    "yarn": "1.22.22"
   }
 }
diff --git a/src/collective/taxonomy/javascripts/server.js b/resources/server.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/server.js
rename to resources/server.js
diff --git a/src/collective/taxonomy/javascripts/src/js/actions.js b/resources/src/js/actions.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/actions.js
rename to resources/src/js/actions.js
diff --git a/src/collective/taxonomy/javascripts/src/js/api.js b/resources/src/js/api.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/api.js
rename to resources/src/js/api.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/AddNodeButton.js b/resources/src/js/components/AddNodeButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/AddNodeButton.js
rename to resources/src/js/components/AddNodeButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/App.js b/resources/src/js/components/App.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/App.js
rename to resources/src/js/components/App.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/EditableId.js b/resources/src/js/components/EditableId.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/EditableId.js
rename to resources/src/js/components/EditableId.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/EditableIds.js b/resources/src/js/components/EditableIds.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/EditableIds.js
rename to resources/src/js/components/EditableIds.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/EditableTree.js b/resources/src/js/components/EditableTree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/EditableTree.js
rename to resources/src/js/components/EditableTree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/EditableValue.js b/resources/src/js/components/EditableValue.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/EditableValue.js
rename to resources/src/js/components/EditableValue.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/EditableValues.js b/resources/src/js/components/EditableValues.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/EditableValues.js
rename to resources/src/js/components/EditableValues.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/FormControls.js b/resources/src/js/components/FormControls.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/FormControls.js
rename to resources/src/js/components/FormControls.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/HideTreeCheckbox.js b/resources/src/js/components/HideTreeCheckbox.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/HideTreeCheckbox.js
rename to resources/src/js/components/HideTreeCheckbox.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/InputText.js b/resources/src/js/components/InputText.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/InputText.js
rename to resources/src/js/components/InputText.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/LanguageSelector.js b/resources/src/js/components/LanguageSelector.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/LanguageSelector.js
rename to resources/src/js/components/LanguageSelector.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/Leaf.js b/resources/src/js/components/Leaf.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/Leaf.js
rename to resources/src/js/components/Leaf.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/MoveDownButton.js b/resources/src/js/components/MoveDownButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/MoveDownButton.js
rename to resources/src/js/components/MoveDownButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/MoveUpButton.js b/resources/src/js/components/MoveUpButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/MoveUpButton.js
rename to resources/src/js/components/MoveUpButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/Node.js b/resources/src/js/components/Node.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/Node.js
rename to resources/src/js/components/Node.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/ReadOnlySubTree.js b/resources/src/js/components/ReadOnlySubTree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/ReadOnlySubTree.js
rename to resources/src/js/components/ReadOnlySubTree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/RemoveNodeButton.js b/resources/src/js/components/RemoveNodeButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/RemoveNodeButton.js
rename to resources/src/js/components/RemoveNodeButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/SubTree.js b/resources/src/js/components/SubTree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/SubTree.js
rename to resources/src/js/components/SubTree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/TaxonomyTree.js b/resources/src/js/components/TaxonomyTree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/TaxonomyTree.js
rename to resources/src/js/components/TaxonomyTree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/Tree.js b/resources/src/js/components/Tree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/Tree.js
rename to resources/src/js/components/Tree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/common/Button.js b/resources/src/js/components/common/Button.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/common/Button.js
rename to resources/src/js/components/common/Button.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/common/MessageBox.js b/resources/src/js/components/common/MessageBox.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/common/MessageBox.js
rename to resources/src/js/components/common/MessageBox.js
diff --git a/src/collective/taxonomy/javascripts/src/js/components/common/Spinner.js b/resources/src/js/components/common/Spinner.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/components/common/Spinner.js
rename to resources/src/js/components/common/Spinner.js
diff --git a/src/collective/taxonomy/javascripts/src/js/constants.js b/resources/src/js/constants.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/constants.js
rename to resources/src/js/constants.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/AddNodeButton.js b/resources/src/js/containers/AddNodeButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/AddNodeButton.js
rename to resources/src/js/containers/AddNodeButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/App.js b/resources/src/js/containers/App.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/App.js
rename to resources/src/js/containers/App.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/DevTools.js b/resources/src/js/containers/DevTools.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/DevTools.js
rename to resources/src/js/containers/DevTools.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/EditableId.js b/resources/src/js/containers/EditableId.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/EditableId.js
rename to resources/src/js/containers/EditableId.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/EditableIds.js b/resources/src/js/containers/EditableIds.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/EditableIds.js
rename to resources/src/js/containers/EditableIds.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/EditableValue.js b/resources/src/js/containers/EditableValue.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/EditableValue.js
rename to resources/src/js/containers/EditableValue.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/EditableValues.js b/resources/src/js/containers/EditableValues.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/EditableValues.js
rename to resources/src/js/containers/EditableValues.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/LanguageSelector.js b/resources/src/js/containers/LanguageSelector.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/LanguageSelector.js
rename to resources/src/js/containers/LanguageSelector.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/MoveDownButton.js b/resources/src/js/containers/MoveDownButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/MoveDownButton.js
rename to resources/src/js/containers/MoveDownButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/MoveUpButton.js b/resources/src/js/containers/MoveUpButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/MoveUpButton.js
rename to resources/src/js/containers/MoveUpButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/ReadOnlySubTree.js b/resources/src/js/containers/ReadOnlySubTree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/ReadOnlySubTree.js
rename to resources/src/js/containers/ReadOnlySubTree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/RemoveNodeButton.js b/resources/src/js/containers/RemoveNodeButton.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/RemoveNodeButton.js
rename to resources/src/js/containers/RemoveNodeButton.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/SubTree.js b/resources/src/js/containers/SubTree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/SubTree.js
rename to resources/src/js/containers/SubTree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/containers/Tree.js b/resources/src/js/containers/Tree.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/containers/Tree.js
rename to resources/src/js/containers/Tree.js
diff --git a/src/collective/taxonomy/javascripts/src/js/i18n.js b/resources/src/js/i18n.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/i18n.js
rename to resources/src/js/i18n.js
diff --git a/src/collective/taxonomy/javascripts/src/js/index.js b/resources/src/js/index.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/index.js
rename to resources/src/js/index.js
diff --git a/src/collective/taxonomy/javascripts/src/js/reducers.js b/resources/src/js/reducers.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/reducers.js
rename to resources/src/js/reducers.js
diff --git a/src/collective/taxonomy/javascripts/src/js/store/configureStore.dev.js b/resources/src/js/store/configureStore.dev.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/store/configureStore.dev.js
rename to resources/src/js/store/configureStore.dev.js
diff --git a/src/collective/taxonomy/javascripts/src/js/store/configureStore.js b/resources/src/js/store/configureStore.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/store/configureStore.js
rename to resources/src/js/store/configureStore.js
diff --git a/src/collective/taxonomy/javascripts/src/js/store/configureStore.prod.js b/resources/src/js/store/configureStore.prod.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/store/configureStore.prod.js
rename to resources/src/js/store/configureStore.prod.js
diff --git a/src/collective/taxonomy/javascripts/src/js/store/middlewares.js b/resources/src/js/store/middlewares.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/store/middlewares.js
rename to resources/src/js/store/middlewares.js
diff --git a/src/collective/taxonomy/javascripts/src/js/translations/es.js b/resources/src/js/translations/es.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/translations/es.js
rename to resources/src/js/translations/es.js
diff --git a/src/collective/taxonomy/javascripts/src/js/translations/fr.js b/resources/src/js/translations/fr.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/translations/fr.js
rename to resources/src/js/translations/fr.js
diff --git a/src/collective/taxonomy/javascripts/src/js/translations/index.js b/resources/src/js/translations/index.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/translations/index.js
rename to resources/src/js/translations/index.js
diff --git a/src/collective/taxonomy/javascripts/src/js/translations/nl.js b/resources/src/js/translations/nl.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/js/translations/nl.js
rename to resources/src/js/translations/nl.js
diff --git a/src/collective/taxonomy/javascripts/src/test/actions.spec.js b/resources/src/test/actions.spec.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/test/actions.spec.js
rename to resources/src/test/actions.spec.js
diff --git a/src/collective/taxonomy/javascripts/src/test/reducers.spec.js b/resources/src/test/reducers.spec.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/test/reducers.spec.js
rename to resources/src/test/reducers.spec.js
diff --git a/src/collective/taxonomy/javascripts/src/test/setup.js b/resources/src/test/setup.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/src/test/setup.js
rename to resources/src/test/setup.js
diff --git a/src/collective/taxonomy/javascripts/webpack.config.js b/resources/webpack.config.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/webpack.config.js
rename to resources/webpack.config.js
diff --git a/resources/webpack.config.prod.js b/resources/webpack.config.prod.js
new file mode 100644
index 00000000..d5b2d6fd
--- /dev/null
+++ b/resources/webpack.config.prod.js
@@ -0,0 +1,44 @@
+var path = require('path')
+var webpack = require('webpack')
+
+module.exports = () => {
+  const config = {
+    devtool: 'cheap-module-source-map', // https://webpack.js.org/configuration/devtool
+    entry: {
+      edittaxonomydata: ['./src/js/index'],
+    },
+    output: {
+      path: path.join(__dirname, '../src/collective/taxonomy/static/js'),
+      filename: '[name].js',
+    },
+    plugins: [
+      new webpack.IgnorePlugin(/^(buffertools)$/),
+      new webpack.optimize.OccurrenceOrderPlugin(),
+      new webpack.DefinePlugin({
+        'process.env.NODE_ENV': JSON.stringify('production')
+      }),
+      new webpack.optimize.UglifyJsPlugin({
+        compressor: {
+          pure_getters: true,
+          unsafe: true,
+          unsafe_comps: true,
+          screw_ie8: true,
+          warnings: false
+        }
+      })
+    ],
+    module: {
+      loaders: [{
+        test: /\.js$/,
+        loaders: ['babel-loader'],
+        exclude: /node_modules/,
+        include: path.join(__dirname, 'src'),
+      }]
+    }
+  };
+
+  console.log(JSON.stringify(config, null, 4));
+
+  return config;
+
+}
diff --git a/src/collective/taxonomy/javascripts/yarn.lock b/resources/yarn.lock
similarity index 97%
rename from src/collective/taxonomy/javascripts/yarn.lock
rename to resources/yarn.lock
index eb47b4ed..8f2d4dd7 100644
--- a/src/collective/taxonomy/javascripts/yarn.lock
+++ b/resources/yarn.lock
@@ -3,24 +3,24 @@
 
 
 "@babel/code-frame@^7.0.0":
-  version "7.24.2"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
-  integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
+  version "7.25.7"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7"
+  integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
   dependencies:
-    "@babel/highlight" "^7.24.2"
+    "@babel/highlight" "^7.25.7"
     picocolors "^1.0.0"
 
-"@babel/helper-validator-identifier@^7.24.5":
-  version "7.24.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
-  integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
+"@babel/helper-validator-identifier@^7.25.7":
+  version "7.25.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5"
+  integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
 
-"@babel/highlight@^7.24.2":
-  version "7.24.5"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e"
-  integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==
+"@babel/highlight@^7.25.7":
+  version "7.25.7"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5"
+  integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.24.5"
+    "@babel/helper-validator-identifier" "^7.25.7"
     chalk "^2.4.2"
     js-tokens "^4.0.0"
     picocolors "^1.0.0"
@@ -75,9 +75,9 @@
     any-observable "^0.3.0"
 
 "@types/prop-types@^15.7.3":
-  version "15.7.12"
-  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
-  integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
+  version "15.7.13"
+  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
+  integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
 
 "@types/sinonjs__fake-timers@^6.0.1":
   version "6.0.4"
@@ -371,9 +371,9 @@ async@^2.1.2:
     lodash "^4.17.14"
 
 async@^3.2.0:
-  version "3.2.5"
-  resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66"
-  integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==
+  version "3.2.6"
+  resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
+  integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
 
 asynckit@^0.4.0:
   version "0.4.0"
@@ -403,9 +403,9 @@ aws-sign2@~0.7.0:
   integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
 
 aws4@^1.8.0:
-  version "1.13.0"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc"
-  integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef"
+  integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
 
 babel-code-frame@^6.26.0:
   version "6.26.0"
@@ -1265,15 +1265,15 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
   integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
 
-bn.js@^5.0.0, bn.js@^5.2.1:
+bn.js@^5.2.1:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
   integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
 
-body-parser@1.20.2:
-  version "1.20.2"
-  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
-  integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
+body-parser@1.20.3:
+  version "1.20.3"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
+  integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
   dependencies:
     bytes "3.1.2"
     content-type "~1.0.5"
@@ -1283,7 +1283,7 @@ body-parser@1.20.2:
     http-errors "2.0.0"
     iconv-lite "0.4.24"
     on-finished "2.4.1"
-    qs "6.11.0"
+    qs "6.13.0"
     raw-body "2.5.2"
     type-is "~1.6.18"
     unpipe "1.0.0"
@@ -1356,12 +1356,13 @@ browserify-des@^1.0.0:
     safe-buffer "^5.1.2"
 
 browserify-rsa@^4.0.0, browserify-rsa@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
-  integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238"
+  integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==
   dependencies:
-    bn.js "^5.0.0"
-    randombytes "^2.0.1"
+    bn.js "^5.2.1"
+    randombytes "^2.1.0"
+    safe-buffer "^5.2.1"
 
 browserify-sign@^4.0.0:
   version "4.2.3"
@@ -1807,10 +1808,10 @@ cookie-signature@1.0.6:
   resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
   integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
 
-cookie@0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
-  integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
+cookie@0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+  integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
 
 copy-descriptor@^0.1.0:
   version "0.1.1"
@@ -2030,11 +2031,11 @@ debug@^3.1.0:
     ms "^2.1.1"
 
 debug@^4.0.1, debug@^4.1.1:
-  version "4.3.4"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
-  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+  version "4.3.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+  integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
   dependencies:
-    ms "2.1.2"
+    ms "^2.1.3"
 
 decamelize@^1.0.0, decamelize@^1.1.1:
   version "1.2.0"
@@ -2202,9 +2203,9 @@ elegant-spinner@^1.0.1:
   integrity sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==
 
 elliptic@^6.5.3, elliptic@^6.5.5:
-  version "6.5.5"
-  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded"
-  integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==
+  version "6.5.7"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b"
+  integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==
   dependencies:
     bn.js "^4.11.9"
     brorand "^1.1.0"
@@ -2239,6 +2240,11 @@ encodeurl@~1.0.2:
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
 
+encodeurl@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+  integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
 encoding@^0.1.11:
   version "0.1.13"
   resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
@@ -2488,17 +2494,10 @@ escope@^3.6.0:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
 
-eslint-config-airbnb-base@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-3.0.1.tgz#b777e01f65e946933442b499fc8518aa251a6530"
-  integrity sha512-71Gd90ksJRHhGrFv7A9TwgvpOGeHooJFpvDoaOaIPkypToIGXyOeiMwWxrj8LNyT6wOHqZCMalMmM0Eo7t2V9Q==
-
-eslint-config-airbnb@^9.0.1:
-  version "9.0.1"
-  resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-9.0.1.tgz#6708170d5034b579d52913fe49dee2f7fec7d894"
-  integrity sha512-Q6mYyfyVWQSBHmuluWQaKppEUYSuxAxuqhxdE/Z2V+xy4E4mQj97Jchka5E/eLc2eU6ZqArnVIGpk6ajHv84iw==
-  dependencies:
-    eslint-config-airbnb-base "^3.0.0"
+eslint-config-prettier@^9.0.0:
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f"
+  integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
 
 eslint-import-resolver-node@^0.2.0:
   version "0.2.3"
@@ -2641,9 +2640,9 @@ esprima@^4.0.0, esprima@^4.0.1:
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
 esquery@^1.0.1:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
-  integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+  integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
   dependencies:
     estraverse "^5.1.0"
 
@@ -2757,36 +2756,36 @@ expand-brackets@^2.1.4:
     to-regex "^3.0.1"
 
 express@^4.13.3:
-  version "4.19.2"
-  resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
-  integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
+  version "4.21.1"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281"
+  integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==
   dependencies:
     accepts "~1.3.8"
     array-flatten "1.1.1"
-    body-parser "1.20.2"
+    body-parser "1.20.3"
     content-disposition "0.5.4"
     content-type "~1.0.4"
-    cookie "0.6.0"
+    cookie "0.7.1"
     cookie-signature "1.0.6"
     debug "2.6.9"
     depd "2.0.0"
-    encodeurl "~1.0.2"
+    encodeurl "~2.0.0"
     escape-html "~1.0.3"
     etag "~1.8.1"
-    finalhandler "1.2.0"
+    finalhandler "1.3.1"
     fresh "0.5.2"
     http-errors "2.0.0"
-    merge-descriptors "1.0.1"
+    merge-descriptors "1.0.3"
     methods "~1.1.2"
     on-finished "2.4.1"
     parseurl "~1.3.3"
-    path-to-regexp "0.1.7"
+    path-to-regexp "0.1.10"
     proxy-addr "~2.0.7"
-    qs "6.11.0"
+    qs "6.13.0"
     range-parser "~1.2.1"
     safe-buffer "5.2.1"
-    send "0.18.0"
-    serve-static "1.15.0"
+    send "0.19.0"
+    serve-static "1.16.2"
     setprototypeof "1.2.0"
     statuses "2.0.1"
     type-is "~1.6.18"
@@ -2949,13 +2948,13 @@ fill-range@^7.1.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==
+finalhandler@1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
+  integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
   dependencies:
     debug "2.6.9"
-    encodeurl "~1.0.2"
+    encodeurl "~2.0.0"
     escape-html "~1.0.3"
     on-finished "2.4.1"
     parseurl "~1.3.3"
@@ -3673,11 +3672,11 @@ is-ci@^2.0.0:
     ci-info "^2.0.0"
 
 is-core-module@^2.13.0:
-  version "2.13.1"
-  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
-  integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+  version "2.15.1"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
+  integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
   dependencies:
-    hasown "^2.0.0"
+    hasown "^2.0.2"
 
 is-data-descriptor@^1.0.1:
   version "1.0.1"
@@ -4352,10 +4351,10 @@ memory-fs@^0.4.0, memory-fs@~0.4.1:
     errno "^0.1.3"
     readable-stream "^2.0.1"
 
-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-descriptors@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+  integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
 
 methods@~1.1.2:
   version "1.1.2"
@@ -4516,12 +4515,7 @@ ms@2.0.0:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
   integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
 
-ms@2.1.2:
-  version "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:
+ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
   integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -4532,9 +4526,9 @@ mute-stream@0.0.8:
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
 nan@^2.12.1:
-  version "2.19.0"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0"
-  integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==
+  version "2.22.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
+  integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
 
 nanomatch@^1.2.9:
   version "1.2.13"
@@ -4686,9 +4680,9 @@ object-copy@^0.1.0:
     kind-of "^3.0.3"
 
 object-inspect@^1.13.1:
-  version "1.13.1"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
-  integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
+  integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
 
 object-keys@^1.1.1:
   version "1.1.1"
@@ -4905,10 +4899,10 @@ 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-to-regexp@0.1.10:
+  version "0.1.10"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b"
+  integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==
 
 path-type@^2.0.0:
   version "2.0.0"
@@ -4939,9 +4933,9 @@ performance-now@^2.1.0:
   integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
 
 picocolors@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
-  integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
 
 picomatch@^2.0.4, picomatch@^2.2.1:
   version "2.3.1"
@@ -5076,9 +5070,9 @@ public-encrypt@^4.0.0:
     safe-buffer "^5.1.2"
 
 pump@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
-  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+  integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
   dependencies:
     end-of-stream "^1.1.0"
     once "^1.3.1"
@@ -5098,17 +5092,10 @@ pure-color@^1.2.0:
   resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e"
   integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==
 
-qs@6.11.0:
-  version "6.11.0"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
-  integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
-  dependencies:
-    side-channel "^1.0.4"
-
-qs@^6.11.2:
-  version "6.12.1"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a"
-  integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==
+qs@6.13.0, qs@^6.12.3:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
+  integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
   dependencies:
     side-channel "^1.0.6"
 
@@ -5134,7 +5121,7 @@ ramda@~0.26.1:
   resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06"
   integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==
 
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+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"
   integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@@ -5470,14 +5457,14 @@ regex-not@^1.0.0, regex-not@^1.0.2:
     safe-regex "^1.1.0"
 
 regexp.prototype.flags@^1.5.2:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
-  integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+  version "1.5.3"
+  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+  integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
   dependencies:
-    call-bind "^1.0.6"
+    call-bind "^1.0.7"
     define-properties "^1.2.1"
     es-errors "^1.3.0"
-    set-function-name "^2.0.1"
+    set-function-name "^2.0.2"
 
 regexpp@^2.0.1:
   version "2.0.1"
@@ -5694,10 +5681,10 @@ semver@^6.1.2, semver@^6.3.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
   integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
 
-send@0.18.0:
-  version "0.18.0"
-  resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
-  integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+send@0.19.0:
+  version "0.19.0"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+  integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
   dependencies:
     debug "2.6.9"
     depd "2.0.0"
@@ -5713,15 +5700,15 @@ send@0.18.0:
     range-parser "~1.2.1"
     statuses "2.0.1"
 
-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==
+serve-static@1.16.2:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+  integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
   dependencies:
-    encodeurl "~1.0.2"
+    encodeurl "~2.0.0"
     escape-html "~1.0.3"
     parseurl "~1.3.3"
-    send "0.18.0"
+    send "0.19.0"
 
 set-blocking@^2.0.0:
   version "2.0.0"
@@ -5740,7 +5727,7 @@ set-function-length@^1.2.1:
     gopd "^1.0.1"
     has-property-descriptors "^1.0.2"
 
-set-function-name@^2.0.1:
+set-function-name@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
   integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
@@ -5945,9 +5932,9 @@ spdx-expression-parse@^3.0.0:
     spdx-license-ids "^3.0.0"
 
 spdx-license-ids@^3.0.0:
-  version "3.0.17"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c"
-  integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==
+  version "3.0.20"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89"
+  integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==
 
 split-string@^3.0.1, split-string@^3.0.2:
   version "3.1.0"
@@ -6313,9 +6300,9 @@ tough-cookie@^4.1.3:
     url-parse "^1.5.3"
 
 traverse@^0.6.6:
-  version "0.6.9"
-  resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.9.tgz#76cfdbacf06382d460b76f8b735a44a6209d8b81"
-  integrity sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==
+  version "0.6.10"
+  resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.10.tgz#4c93482381d794dee046882c036f3c4eee481324"
+  integrity sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==
   dependencies:
     gopd "^1.0.1"
     typedarray.prototype.slice "^1.0.3"
@@ -6384,9 +6371,9 @@ type-is@~1.6.18:
     mime-types "~2.1.24"
 
 type@^2.7.2:
-  version "2.7.2"
-  resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
-  integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486"
+  integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==
 
 typed-array-buffer@^1.0.2:
   version "1.0.2"
@@ -6450,9 +6437,9 @@ typedarray@^0.0.6:
   integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
 
 ua-parser-js@^0.7.30:
-  version "0.7.37"
-  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832"
-  integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==
+  version "0.7.39"
+  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.39.tgz#c71efb46ebeabc461c4612d22d54f88880fabe7e"
+  integrity sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==
 
 uglify-js@^2.8.29:
   version "2.8.29"
@@ -6465,9 +6452,9 @@ uglify-js@^2.8.29:
     uglify-to-browserify "~1.0.0"
 
 uglify-js@^3.1.4:
-  version "3.17.4"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c"
-  integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==
+  version "3.19.3"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f"
+  integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==
 
 uglify-to-browserify@~1.0.0:
   version "1.0.2"
@@ -6567,12 +6554,12 @@ url-parse@^1.5.3:
     requires-port "^1.0.0"
 
 url@^0.11.0:
-  version "0.11.3"
-  resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad"
-  integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c"
+  integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==
   dependencies:
     punycode "^1.4.1"
-    qs "^6.11.2"
+    qs "^6.12.3"
 
 use@^3.1.0:
   version "3.1.1"
@@ -6669,7 +6656,7 @@ webpack-dev-middleware@^1.2.0:
     range-parser "^1.0.3"
     time-stamp "^2.0.0"
 
-webpack-hot-middleware@^2.25.4:
+webpack-hot-middleware@^2.26.1:
   version "2.26.1"
   resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz#87214f1e3f9f3acab9271fef9e6ed7b637d719c0"
   integrity sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==
diff --git a/setup.py b/setup.py
index 03de70c2..6bba7c37 100644
--- a/setup.py
+++ b/setup.py
@@ -55,7 +55,6 @@
             "zest.releaser[recommended]",
         ],
         "test": [
-            "collective.MockMailHost",
             "mock",
             "plone.api",
             "plone.app.caching",
@@ -65,7 +64,7 @@
             "plone.app.querystring",
             "plone.app.robotframework[debug]",
             "plone.app.testing",
-            "plone.restapi",
+            "plone.restapi[test]",
             "plone.testing",
             "requests",
         ],
diff --git a/src/collective/taxonomy/configure.zcml b/src/collective/taxonomy/configure.zcml
index f5498093..90f899fa 100644
--- a/src/collective/taxonomy/configure.zcml
+++ b/src/collective/taxonomy/configure.zcml
@@ -116,19 +116,7 @@
 
   <browser:resourceDirectory
       name="taxonomy"
-      directory="javascripts/build"
-      layer=".interfaces.IBrowserLayer"
-      />
-
-  <browser:resourceDirectory
-      name="taxonomy.icons"
-      directory="icons"
-      layer=".interfaces.IBrowserLayer"
-      />
-
-  <browser:resource
-      name="collective.taxonomy.css"
-      file="collective.taxonomy.css"
+      directory="static"
       layer=".interfaces.IBrowserLayer"
       />
 
diff --git a/src/collective/taxonomy/edit_taxonomy_data.pt b/src/collective/taxonomy/edit_taxonomy_data.pt
index 095e9d0c..cfd38306 100644
--- a/src/collective/taxonomy/edit_taxonomy_data.pt
+++ b/src/collective/taxonomy/edit_taxonomy_data.pt
@@ -10,19 +10,19 @@
       <link rel="stylesheet"
             type="text/css"
             tal:attributes="
-              href string:$portal_url/++resource++taxonomy.icons/css/taxonomy.css;
+              href string:$portal_url/++resource++taxonomy/icons/css/taxonomy.css;
             "
       />
       <link rel="stylesheet"
             type="text/css"
             tal:attributes="
-              href string:$portal_url/++resource++taxonomy/css/react-treeview.css;
+              href string:$portal_url/++resource++taxonomy/js/css/react-treeview.css;
             "
       />
       <link rel="stylesheet"
             type="text/css"
             tal:attributes="
-              href string:$portal_url/++resource++collective.taxonomy.css;
+              href string:$portal_url/++resource++taxonomy/css/collective.taxonomy.css;
             "
       />
     </metal:block>
diff --git a/src/collective/taxonomy/javascripts/webpack.config.prod.js b/src/collective/taxonomy/javascripts/webpack.config.prod.js
deleted file mode 100644
index 1277cacc..00000000
--- a/src/collective/taxonomy/javascripts/webpack.config.prod.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var path = require('path')
-var webpack = require('webpack')
-
-module.exports = {
-  devtool: 'cheap-module-source-map', // https://webpack.js.org/configuration/devtool
-  entry: {
-    edittaxonomydata: ['./src/js/index'],
-  },
-  output: {
-    path: path.join(__dirname, 'build'),
-    filename: '[name].js',
-  },
-  plugins: [
-    new webpack.IgnorePlugin(/^(buffertools)$/),
-    new webpack.optimize.OccurrenceOrderPlugin(),
-    new webpack.DefinePlugin({
-      'process.env.NODE_ENV': JSON.stringify('production')
-    }),
-    new webpack.optimize.UglifyJsPlugin({
-      compressor: {
-        pure_getters: true,
-        unsafe: true,
-        unsafe_comps: true,
-        screw_ie8: true,
-        warnings: false
-      }
-    })
-  ],
-  module: {
-    loaders: [{
-      test: /\.js$/,
-      loaders: ['babel-loader'],
-      exclude: /node_modules/,
-      include: path.join(__dirname, 'src'),
-    }]
-  }
-}
diff --git a/src/collective/taxonomy/jsonimpl.py b/src/collective/taxonomy/jsonimpl.py
index 2eb32858..a5e09948 100644
--- a/src/collective/taxonomy/jsonimpl.py
+++ b/src/collective/taxonomy/jsonimpl.py
@@ -90,7 +90,7 @@ def get_resource_url(self):
         if node_env == "development" and api.env.debug_mode():
             return "http://localhost:3000/static/edittaxonomydata.js"
         else:
-            return "{}/++resource++taxonomy/edittaxonomydata.js".format(
+            return "{}/++resource++taxonomy/js/edittaxonomydata.js".format(
                 api.portal.get().absolute_url()
             )
 
diff --git a/src/collective/taxonomy/collective.taxonomy.css b/src/collective/taxonomy/static/css/collective.taxonomy.css
similarity index 100%
rename from src/collective/taxonomy/collective.taxonomy.css
rename to src/collective/taxonomy/static/css/collective.taxonomy.css
diff --git a/src/collective/taxonomy/icons/LICENSE.txt b/src/collective/taxonomy/static/icons/LICENSE.txt
similarity index 100%
rename from src/collective/taxonomy/icons/LICENSE.txt
rename to src/collective/taxonomy/static/icons/LICENSE.txt
diff --git a/src/collective/taxonomy/icons/README.txt b/src/collective/taxonomy/static/icons/README.txt
similarity index 100%
rename from src/collective/taxonomy/icons/README.txt
rename to src/collective/taxonomy/static/icons/README.txt
diff --git a/src/collective/taxonomy/icons/config.json b/src/collective/taxonomy/static/icons/config.json
similarity index 100%
rename from src/collective/taxonomy/icons/config.json
rename to src/collective/taxonomy/static/icons/config.json
diff --git a/src/collective/taxonomy/icons/css/animation.css b/src/collective/taxonomy/static/icons/css/animation.css
similarity index 100%
rename from src/collective/taxonomy/icons/css/animation.css
rename to src/collective/taxonomy/static/icons/css/animation.css
diff --git a/src/collective/taxonomy/icons/css/taxonomy-codes.css b/src/collective/taxonomy/static/icons/css/taxonomy-codes.css
similarity index 100%
rename from src/collective/taxonomy/icons/css/taxonomy-codes.css
rename to src/collective/taxonomy/static/icons/css/taxonomy-codes.css
diff --git a/src/collective/taxonomy/icons/css/taxonomy-embedded.css b/src/collective/taxonomy/static/icons/css/taxonomy-embedded.css
similarity index 100%
rename from src/collective/taxonomy/icons/css/taxonomy-embedded.css
rename to src/collective/taxonomy/static/icons/css/taxonomy-embedded.css
diff --git a/src/collective/taxonomy/icons/css/taxonomy-ie7-codes.css b/src/collective/taxonomy/static/icons/css/taxonomy-ie7-codes.css
similarity index 100%
rename from src/collective/taxonomy/icons/css/taxonomy-ie7-codes.css
rename to src/collective/taxonomy/static/icons/css/taxonomy-ie7-codes.css
diff --git a/src/collective/taxonomy/icons/css/taxonomy-ie7.css b/src/collective/taxonomy/static/icons/css/taxonomy-ie7.css
similarity index 100%
rename from src/collective/taxonomy/icons/css/taxonomy-ie7.css
rename to src/collective/taxonomy/static/icons/css/taxonomy-ie7.css
diff --git a/src/collective/taxonomy/icons/css/taxonomy.css b/src/collective/taxonomy/static/icons/css/taxonomy.css
similarity index 100%
rename from src/collective/taxonomy/icons/css/taxonomy.css
rename to src/collective/taxonomy/static/icons/css/taxonomy.css
diff --git a/src/collective/taxonomy/icons/demo.html b/src/collective/taxonomy/static/icons/demo.html
similarity index 100%
rename from src/collective/taxonomy/icons/demo.html
rename to src/collective/taxonomy/static/icons/demo.html
diff --git a/src/collective/taxonomy/icons/font/taxonomy.eot b/src/collective/taxonomy/static/icons/font/taxonomy.eot
similarity index 100%
rename from src/collective/taxonomy/icons/font/taxonomy.eot
rename to src/collective/taxonomy/static/icons/font/taxonomy.eot
diff --git a/src/collective/taxonomy/icons/font/taxonomy.svg b/src/collective/taxonomy/static/icons/font/taxonomy.svg
similarity index 100%
rename from src/collective/taxonomy/icons/font/taxonomy.svg
rename to src/collective/taxonomy/static/icons/font/taxonomy.svg
diff --git a/src/collective/taxonomy/icons/font/taxonomy.ttf b/src/collective/taxonomy/static/icons/font/taxonomy.ttf
similarity index 100%
rename from src/collective/taxonomy/icons/font/taxonomy.ttf
rename to src/collective/taxonomy/static/icons/font/taxonomy.ttf
diff --git a/src/collective/taxonomy/icons/font/taxonomy.woff b/src/collective/taxonomy/static/icons/font/taxonomy.woff
similarity index 100%
rename from src/collective/taxonomy/icons/font/taxonomy.woff
rename to src/collective/taxonomy/static/icons/font/taxonomy.woff
diff --git a/src/collective/taxonomy/icons/font/taxonomy.woff2 b/src/collective/taxonomy/static/icons/font/taxonomy.woff2
similarity index 100%
rename from src/collective/taxonomy/icons/font/taxonomy.woff2
rename to src/collective/taxonomy/static/icons/font/taxonomy.woff2
diff --git a/src/collective/taxonomy/javascripts/build/.gitkeep b/src/collective/taxonomy/static/js/.gitkeep
similarity index 100%
rename from src/collective/taxonomy/javascripts/build/.gitkeep
rename to src/collective/taxonomy/static/js/.gitkeep
diff --git a/src/collective/taxonomy/javascripts/build/css/react-treeview.css b/src/collective/taxonomy/static/js/css/react-treeview.css
similarity index 100%
rename from src/collective/taxonomy/javascripts/build/css/react-treeview.css
rename to src/collective/taxonomy/static/js/css/react-treeview.css
diff --git a/src/collective/taxonomy/javascripts/build/edittaxonomydata.js b/src/collective/taxonomy/static/js/edittaxonomydata.js
similarity index 100%
rename from src/collective/taxonomy/javascripts/build/edittaxonomydata.js
rename to src/collective/taxonomy/static/js/edittaxonomydata.js
diff --git a/src/collective/taxonomy/javascripts/build/edittaxonomydata.js.map b/src/collective/taxonomy/static/js/edittaxonomydata.js.map
similarity index 100%
rename from src/collective/taxonomy/javascripts/build/edittaxonomydata.js.map
rename to src/collective/taxonomy/static/js/edittaxonomydata.js.map
diff --git a/src/collective/taxonomy/tests/test_json.py b/src/collective/taxonomy/tests/test_json.py
index 0213f1f5..70c4e9c5 100644
--- a/src/collective/taxonomy/tests/test_json.py
+++ b/src/collective/taxonomy/tests/test_json.py
@@ -169,5 +169,5 @@ def test_get_languages_mapping(self):
     def test_get_resource_url(self):
         url = self.view.get_resource_url()
         self.assertEqual(
-            "http://nohost/plone/++resource++taxonomy/edittaxonomydata.js", url
+            "http://nohost/plone/++resource++taxonomy/js/edittaxonomydata.js", url
         )