gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] branch master updated (66460e565 -> f79bca0ab)


From: gnunet
Subject: [taler-wallet-core] branch master updated (66460e565 -> f79bca0ab)
Date: Fri, 04 Nov 2022 15:56:17 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a change to branch master
in repository wallet-core.

    from 66460e565 repo: bump versions to v0.9.0
     new e6a95d246 fix imports
     new 1c4640682 es6 and ts lib
     new 50e51429e add index.js to import that point to folders
     new 80ab8ccce upgrade amount api
     new a69e55989 better type signature for undefinedIfEmpty
     new 9a9629249 fix some test style and SWRConfig type compilation
     new f79bca0ab fix dependecies version

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 bootstrap                                          |   1 +
 .../Makefile                                       |   5 +-
 packages/merchant-backoffice-ui/package.json       |  18 +-
 .../merchant-backoffice-ui/src/AdminRoutes.tsx     |   4 +-
 .../src/ApplicationReadyRoutes.tsx                 |  14 +-
 .../merchant-backoffice-ui/src/InstanceRoutes.tsx  |  52 +-
 .../src/components/exception/AsyncButton.tsx       |   6 +-
 .../src/components/exception/login.tsx             |   8 +-
 .../src/components/form/Input.tsx                  |   2 +-
 .../src/components/form/InputArray.tsx             |   4 +-
 .../src/components/form/InputBoolean.tsx           |   2 +-
 .../src/components/form/InputCurrency.tsx          |   8 +-
 .../src/components/form/InputDate.tsx              |   6 +-
 .../src/components/form/InputDuration.tsx          |   8 +-
 .../src/components/form/InputGroup.tsx             |   2 +-
 .../src/components/form/InputImage.tsx             |   7 +-
 .../src/components/form/InputLocation.tsx          |   4 +-
 .../src/components/form/InputNumber.tsx            |   4 +-
 .../src/components/form/InputPayto.tsx             |   6 +-
 .../src/components/form/InputPaytoForm.tsx         |  23 +-
 .../src/components/form/InputSearchProduct.tsx     |   9 +-
 .../src/components/form/InputSecured.stories.tsx   |   4 +-
 .../src/components/form/InputSecured.tsx           |   4 +-
 .../src/components/form/InputSelector.tsx          |   2 +-
 .../src/components/form/InputStock.stories.tsx     |   4 +-
 .../src/components/form/InputStock.tsx             |  18 +-
 .../src/components/form/InputTaxes.tsx             |  14 +-
 .../src/components/form/InputWithAddon.tsx         |   2 +-
 .../src/components/form/TextField.tsx              |   2 +-
 .../src/components/form/useField.tsx               |   2 +-
 .../src/components/form/useGroupField.tsx          |   2 +-
 .../instance/DefaultInstanceFormFields.tsx         |  22 +-
 .../src/components/menu/LangSelector.tsx           |   2 +-
 .../src/components/menu/NavigationBar.tsx          |   2 +-
 .../src/components/menu/SideBar.tsx                |  12 +-
 .../src/components/menu/index.tsx                  |  10 +-
 .../src/components/modal/index.tsx                 |  12 +-
 .../notifications/Notifications.stories.tsx        |   2 +-
 .../src/components/notifications/index.tsx         |   2 +-
 .../components/picker/DurationPicker.stories.tsx   |   2 +-
 .../src/components/picker/DurationPicker.tsx       |   2 +-
 .../product/InventoryProductForm.stories.tsx       |   2 +-
 .../components/product/InventoryProductForm.tsx    |  12 +-
 .../components/product/NonInventoryProductForm.tsx |  20 +-
 .../src/components/product/ProductForm.tsx         |  24 +-
 .../src/components/product/ProductList.tsx         |   4 +-
 .../merchant-backoffice-ui/src/context/backend.ts  |   2 +-
 packages/merchant-backoffice-ui/src/hooks/async.ts |   2 +-
 .../merchant-backoffice-ui/src/hooks/backend.ts    |   8 +-
 packages/merchant-backoffice-ui/src/hooks/index.ts |   2 +-
 .../merchant-backoffice-ui/src/hooks/instance.ts   |   8 +-
 .../src/hooks/notifications.ts                     |   2 +-
 packages/merchant-backoffice-ui/src/hooks/order.ts |  10 +-
 .../merchant-backoffice-ui/src/hooks/product.ts    |   8 +-
 .../merchant-backoffice-ui/src/hooks/reserves.ts   |   8 +-
 .../merchant-backoffice-ui/src/hooks/transfer.ts   |  10 +-
 packages/merchant-backoffice-ui/src/i18n/index.tsx |   2 +-
 packages/merchant-backoffice-ui/src/index.tsx      |  19 +-
 .../src/paths/admin/create/Create.stories.tsx      |   2 +-
 .../src/paths/admin/create/CreatePage.tsx          |  21 +-
 .../admin/create/InstanceCreatedSuccessfully.tsx   |   4 +-
 .../src/paths/admin/create/index.tsx               |  14 +-
 .../src/paths/admin/list/TableActive.tsx           |   4 +-
 .../src/paths/admin/list/View.stories.tsx          |   2 +-
 .../src/paths/admin/list/View.tsx                  |   6 +-
 .../src/paths/admin/list/index.tsx                 |  18 +-
 .../src/paths/instance/details/DetailPage.tsx      |   8 +-
 .../src/paths/instance/details/Details.stories.tsx |   2 +-
 .../src/paths/instance/details/index.tsx           |  12 +-
 .../src/paths/instance/kyc/list/ListPage.tsx       |   4 +-
 .../src/paths/instance/kyc/list/index.tsx          |   8 +-
 .../instance/orders/create/Create.stories.tsx      |   2 +-
 .../paths/instance/orders/create/CreatePage.tsx    |  41 +-
 .../orders/create/OrderCreatedSuccessfully.tsx     |   8 +-
 .../src/paths/instance/orders/create/index.tsx     |  20 +-
 .../instance/orders/details/Detail.stories.tsx     |   4 +-
 .../paths/instance/orders/details/DetailPage.tsx   |  32 +-
 .../src/paths/instance/orders/details/index.tsx    |  14 +-
 .../paths/instance/orders/list/List.stories.tsx    |   2 +-
 .../src/paths/instance/orders/list/ListPage.tsx    |   8 +-
 .../src/paths/instance/orders/list/Table.tsx       |  24 +-
 .../src/paths/instance/orders/list/index.tsx       |  18 +-
 .../instance/products/create/Create.stories.tsx    |   2 +-
 .../paths/instance/products/create/CreatePage.tsx  |  10 +-
 .../products/create/CreatedSuccessfully.tsx        |   4 +-
 .../src/paths/instance/products/create/index.tsx   |  12 +-
 .../paths/instance/products/list/List.stories.tsx  |   2 +-
 .../src/paths/instance/products/list/Table.tsx     |  10 +-
 .../src/paths/instance/products/list/index.tsx     |  16 +-
 .../instance/products/update/Update.stories.tsx    |   2 +-
 .../paths/instance/products/update/UpdatePage.tsx  |  10 +-
 .../src/paths/instance/products/update/index.tsx   |  16 +-
 .../instance/reserves/create/Create.stories.tsx    |   2 +-
 .../paths/instance/reserves/create/CreatePage.tsx  |  18 +-
 .../create/CreatedSuccessfully.stories.tsx         |   2 +-
 .../reserves/create/CreatedSuccessfully.tsx        |   8 +-
 .../src/paths/instance/reserves/create/index.tsx   |  14 +-
 .../paths/instance/reserves/details/DetailPage.tsx |  22 +-
 .../instance/reserves/details/Details.stories.tsx  |   2 +-
 .../paths/instance/reserves/details/TipInfo.tsx    |   4 +-
 .../src/paths/instance/reserves/details/index.tsx  |   8 +-
 .../instance/reserves/list/AutorizeTipModal.tsx    |  16 +-
 .../instance/reserves/list/CreatedSuccessfully.tsx |   4 +-
 .../paths/instance/reserves/list/List.stories.tsx  |   2 +-
 .../src/paths/instance/reserves/list/Table.tsx     |   4 +-
 .../src/paths/instance/reserves/list/index.tsx     |  18 +-
 .../instance/transfers/create/Create.stories.tsx   |   2 +-
 .../paths/instance/transfers/create/CreatePage.tsx |  18 +-
 .../src/paths/instance/transfers/create/index.tsx  |  14 +-
 .../paths/instance/transfers/list/List.stories.tsx |   2 +-
 .../src/paths/instance/transfers/list/ListPage.tsx |  10 +-
 .../src/paths/instance/transfers/list/Table.tsx    |   4 +-
 .../src/paths/instance/transfers/list/index.tsx    |  12 +-
 .../src/paths/instance/update/Update.stories.tsx   |   2 +-
 .../src/paths/instance/update/UpdatePage.tsx       |  24 +-
 .../src/paths/instance/update/index.tsx            |  18 +-
 .../src/paths/login/index.tsx                      |   2 +-
 .../merchant-backoffice-ui/src/schemas/index.ts    |   2 +-
 .../merchant-backoffice-ui/src/utils/amount.ts     |   2 +-
 packages/merchant-backoffice-ui/src/utils/table.ts |  18 +-
 packages/merchant-backoffice-ui/tests/axiosMock.ts |   6 +-
 .../tests/context/backend.test.tsx                 |  10 +-
 .../tests/functions/regex.test.ts                  |   2 +-
 .../merchant-backoffice-ui/tests/header.test.tsx   |   8 +-
 .../tests/hooks/async.test.ts                      |   2 +-
 .../tests/hooks/listener.test.ts                   |   4 +-
 .../tests/hooks/notification.test.ts               |   2 +-
 .../tests/hooks/swr/index.tsx                      |   7 +-
 .../tests/hooks/swr/instance.test.ts               |  28 +-
 .../tests/hooks/swr/order.test.ts                  |  16 +-
 .../tests/hooks/swr/product.test.ts                |  16 +-
 .../tests/hooks/swr/reserve.test.ts                |  20 +-
 .../tests/hooks/swr/transfer.test.ts               |  10 +-
 .../merchant-backoffice-ui/tests/stories.test.tsx  |  13 +-
 packages/merchant-backoffice-ui/tsconfig.json      |   6 +-
 pnpm-lock.yaml                                     | 797 ++++++++++++++++++---
 136 files changed, 1318 insertions(+), 703 deletions(-)
 copy packages/{demobank-ui => merchant-backoffice-ui}/Makefile (64%)

diff --git a/bootstrap b/bootstrap
index 5f813c3a4..12eb0afa7 100755
--- a/bootstrap
+++ b/bootstrap
@@ -28,3 +28,4 @@ our_configure=build-system/taler-build-scripts/configure
 copy_configure "$our_configure" ./configure
 copy_configure "$our_configure" ./packages/taler-wallet-cli/configure
 copy_configure "$our_configure" ./packages/demobank-ui/configure
+copy_configure "$our_configure" ./packages/merchant-backoffice-ui/configure
diff --git a/packages/demobank-ui/Makefile 
b/packages/merchant-backoffice-ui/Makefile
similarity index 64%
copy from packages/demobank-ui/Makefile
copy to packages/merchant-backoffice-ui/Makefile
index 3c3a3f602..2dfee7999 100644
--- a/packages/demobank-ui/Makefile
+++ b/packages/merchant-backoffice-ui/Makefile
@@ -6,11 +6,10 @@ include .config.mk
 all:
        @echo run \'make install\' to install
 
-spa_dir=$(prefix)/share/taler/demobank-ui
+spa_dir=$(prefix)/share/taler/merchant-backoffice
 
 install:
-       pnpm install --frozen-lockfile --filter @gnu-taler/demobank-ui...
-       pnpm run check
+       pnpm install --frozen-lockfile --filter 
@gnu-taler/merchant-backoffice...
        pnpm run build
        install -d $(spa_dir)
        install ./dist/* $(spa_dir)
diff --git a/packages/merchant-backoffice-ui/package.json 
b/packages/merchant-backoffice-ui/package.json
index 0a1da317c..f7e0972ec 100644
--- a/packages/merchant-backoffice-ui/package.json
+++ b/packages/merchant-backoffice-ui/package.json
@@ -1,6 +1,6 @@
 {
   "private": true,
-  "name": "merchant-backoffice",
+  "name": "@gnu-taler/merchant-backoffice",
   "version": "0.0.4",
   "license": "MIT",
   "scripts": {
@@ -45,13 +45,14 @@
   "dependencies": {
     "@gnu-taler/taler-util": "workspace:*",
     "axios": "^0.21.1",
-    "date-fns": "^2.21.1",
+    "date-fns": "2.29.3",
     "history": "4.10.1",
-    "jed": "^1.1.1",
-    "preact": "10.6.1",
-    "preact-router": "^3.2.1",
-    "qrcode-generator": "^1.4.4",
-    "swr": "1.1.0",
+    "jed": "1.1.1",
+    "preact": "10.6.5",
+    "preact-router": "3.2.1",
+    "qrcode-generator": "1.4.4",
+    "swr": "1.3.0",
+    "react": "npm:@preact/compat@^17.1.2",
     "yup": "^0.32.9"
   },
   "devDependencies": {
@@ -70,6 +71,7 @@
     "@types/history": "^4.7.8",
     "@types/jest": "^26.0.23",
     "@types/mocha": "^8.2.2",
+    "@types/node": "^18.8.5",
     "@typescript-eslint/eslint-plugin": "^4.22.0",
     "@typescript-eslint/parser": "^4.22.0",
     "babel-loader": "^8.2.2",
@@ -101,7 +103,7 @@
     "script-ext-html-webpack-plugin": "^2.1.5",
     "sirv-cli": "^1.0.11",
     "typedoc": "^0.20.36",
-    "typescript": "^4.2.4"
+    "typescript": "4.4.4"
   },
   "jest": {
     "preset": "jest-preset-preact",
diff --git a/packages/merchant-backoffice-ui/src/AdminRoutes.tsx 
b/packages/merchant-backoffice-ui/src/AdminRoutes.tsx
index a3ffbe2e6..9caf8ea7a 100644
--- a/packages/merchant-backoffice-ui/src/AdminRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/AdminRoutes.tsx
@@ -15,8 +15,8 @@
  */
 import { h, VNode } from "preact";
 import Router, { route, Route } from "preact-router";
-import InstanceCreatePage from "./paths/admin/create";
-import InstanceListPage from './paths/admin/list';
+import InstanceCreatePage from "./paths/admin/create/index.js";
+import InstanceListPage from './paths/admin/list/index.js';
 
 
 export enum AdminPaths {
diff --git a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx 
b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
index ebc3d1d95..27a1406a0 100644
--- a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
@@ -20,13 +20,13 @@
  */
 import { Fragment, h, VNode } from "preact";
 import Router, { Route, route } from "preact-router";
-import { useBackendContext } from "./context/backend";
-import { useBackendInstancesTestForAdmin } from "./hooks/backend";
-import { InstanceRoutes } from "./InstanceRoutes";
-import LoginPage from "./paths/login";
-import { INSTANCE_ID_LOOKUP } from "./utils/constants";
-import { NotYetReadyAppMenu, Menu, NotificationCard } from "./components/menu";
-import { useTranslator } from "./i18n";
+import { useBackendContext } from "./context/backend.js";
+import { useBackendInstancesTestForAdmin } from "./hooks/backend.js";
+import { InstanceRoutes } from "./InstanceRoutes.js";
+import LoginPage from "./paths/login/index.js";
+import { INSTANCE_ID_LOOKUP } from "./utils/constants.js";
+import { NotYetReadyAppMenu, NotificationCard } from 
"./components/menu/index.js";
+import { useTranslator } from "./i18n/index.js";
 import { createHashHistory } from "history";
 import { useState } from "preact/hooks";
 
diff --git a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx 
b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
index 06f1db17c..9e1593fe5 100644
--- a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
@@ -22,39 +22,39 @@
 import { Fragment, FunctionComponent, h, VNode } from "preact";
 import { Route, route, Router } from "preact-router";
 import { useCallback, useEffect, useMemo, useState } from "preact/hooks";
-import { Loading } from "./components/exception/loading";
-import { Menu, NotificationCard } from "./components/menu";
-import { useBackendContext } from "./context/backend";
-import { InstanceContextProvider } from "./context/instance";
+import { Loading } from "./components/exception/loading.js";
+import { Menu, NotificationCard } from "./components/menu/index.js";
+import { useBackendContext } from "./context/backend.js";
+import { InstanceContextProvider } from "./context/instance.js";
 import {
   useBackendDefaultToken,
   useBackendInstanceToken,
   useLocalStorage,
-} from "./hooks";
-import { HttpError } from "./hooks/backend";
-import { Translate, useTranslator } from "./i18n";
-import InstanceCreatePage from "./paths/admin/create";
-import InstanceListPage from "./paths/admin/list";
-import OrderCreatePage from "./paths/instance/orders/create";
-import OrderDetailsPage from "./paths/instance/orders/details";
-import OrderListPage from "./paths/instance/orders/list";
-import ProductCreatePage from "./paths/instance/products/create";
-import ProductListPage from "./paths/instance/products/list";
-import ProductUpdatePage from "./paths/instance/products/update";
-import TransferListPage from "./paths/instance/transfers/list";
-import TransferCreatePage from "./paths/instance/transfers/create";
-import ReservesCreatePage from "./paths/instance/reserves/create";
-import ReservesDetailsPage from "./paths/instance/reserves/details";
-import ReservesListPage from "./paths/instance/reserves/list";
-import ListKYCPage from "./paths/instance/kyc/list";
+} from "./hooks/index.js";
+import { HttpError } from "./hooks/backend.js";
+import { Translate, useTranslator } from "./i18n/index.js";
+import InstanceCreatePage from "./paths/admin/create/index.js";
+import InstanceListPage from "./paths/admin/list/index.js";
+import OrderCreatePage from "./paths/instance/orders/create/index.js";
+import OrderDetailsPage from "./paths/instance/orders/details/index.js";
+import OrderListPage from "./paths/instance/orders/list/index.js";
+import ProductCreatePage from "./paths/instance/products/create/index.js";
+import ProductListPage from "./paths/instance/products/list/index.js";
+import ProductUpdatePage from "./paths/instance/products/update/index.js";
+import TransferListPage from "./paths/instance/transfers/list/index.js";
+import TransferCreatePage from "./paths/instance/transfers/create/index.js";
+import ReservesCreatePage from "./paths/instance/reserves/create/index.js";
+import ReservesDetailsPage from "./paths/instance/reserves/details/index.js";
+import ReservesListPage from "./paths/instance/reserves/list/index.js";
+import ListKYCPage from "./paths/instance/kyc/list/index.js";
 import InstanceUpdatePage, {
   Props as InstanceUpdatePageProps,
   AdminUpdate as InstanceAdminUpdatePage,
-} from "./paths/instance/update";
-import LoginPage from "./paths/login";
-import NotFoundPage from "./paths/notfound";
-import { Notification } from "./utils/types";
-import { useInstanceKYCDetails } from "./hooks/instance";
+} from "./paths/instance/update/index.js";
+import LoginPage from "./paths/login/index.js";
+import NotFoundPage from "./paths/notfound/index.js";
+import { Notification } from "./utils/types.js";
+import { useInstanceKYCDetails } from "./hooks/instance.js";
 import { format } from "date-fns";
 
 export enum InstancePaths {
diff --git 
a/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx 
b/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx
index 92bab4bfb..2060425fb 100644
--- a/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx
+++ b/packages/merchant-backoffice-ui/src/components/exception/AsyncButton.tsx
@@ -20,9 +20,9 @@
 */
 
 import { ComponentChildren, h } from "preact";
-import { LoadingModal } from "../modal";
-import { useAsync } from "../../hooks/async";
-import { Translate } from "../../i18n";
+import { LoadingModal } from "../modal/index.js";
+import { useAsync } from "../../hooks/async.js";
+import { Translate } from "../../i18n/index.js";
 
 type Props = {
   children: ComponentChildren,
diff --git a/packages/merchant-backoffice-ui/src/components/exception/login.tsx 
b/packages/merchant-backoffice-ui/src/components/exception/login.tsx
index 498d994ed..eefce2de7 100644
--- a/packages/merchant-backoffice-ui/src/components/exception/login.tsx
+++ b/packages/merchant-backoffice-ui/src/components/exception/login.tsx
@@ -21,10 +21,10 @@
 
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { useBackendContext } from "../../context/backend";
-import { useInstanceContext } from "../../context/instance";
-import { Translate, useTranslator } from "../../i18n";
-import { Notification } from "../../utils/types";
+import { useBackendContext } from "../../context/backend.js";
+import { useInstanceContext } from "../../context/instance.js";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { Notification } from "../../utils/types.js";
 
 interface Props {
   withMessage?: Notification;
diff --git a/packages/merchant-backoffice-ui/src/components/form/Input.tsx 
b/packages/merchant-backoffice-ui/src/components/form/Input.tsx
index 9a9691e9b..dc4e9ae1a 100644
--- a/packages/merchant-backoffice-ui/src/components/form/Input.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/Input.tsx
@@ -19,7 +19,7 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { ComponentChildren, h, VNode } from "preact";
-import { useField, InputProps } from "./useField";
+import { useField, InputProps } from "./useField.js";
 
 interface Props<T> extends InputProps<T> {
   inputType?: 'text' | 'number' | 'multiline' | 'password';
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx
index 984c6dc49..bcefc25d9 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputArray.tsx
@@ -20,8 +20,8 @@
 */
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Translate, useTranslator } from "../../i18n";
-import { InputProps, useField } from "./useField";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { InputProps, useField } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   isValid?: (e: any) => boolean;
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx
index 2771fe483..c4ef9441c 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputBoolean.tsx
@@ -19,7 +19,7 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { h, VNode } from "preact";
-import { InputProps, useField } from "./useField";
+import { InputProps, useField } from "./useField.js";
 
 interface Props<T> extends InputProps<T> {
   name: T;
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx
index d3a46f483..c4c6b8ce3 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputCurrency.tsx
@@ -19,10 +19,10 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { ComponentChildren, h } from "preact";
-import { useConfigContext } from "../../context/config";
-import { Amount } from "../../declaration";
-import { InputWithAddon } from "./InputWithAddon";
-import { InputProps } from "./useField";
+import { useConfigContext } from "../../context/config.js";
+import { Amount } from "../../declaration.js";
+import { InputWithAddon } from "./InputWithAddon.js";
+import { InputProps } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   expand?: boolean;
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputDate.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputDate.tsx
index 77199527f..ce99a02fb 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputDate.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputDate.tsx
@@ -21,9 +21,9 @@
 import { format } from "date-fns";
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Translate, useTranslator } from "../../i18n";
-import { DatePicker } from "../picker/DatePicker";
-import { InputProps, useField } from "./useField";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { DatePicker } from "../picker/DatePicker.js";
+import { InputProps, useField } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   readonly?: boolean;
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx
index d5c208e25..6abe55be0 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputDuration.tsx
@@ -21,10 +21,10 @@
 import { intervalToDuration, formatDuration } from "date-fns";
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Translate, useTranslator } from "../../i18n";
-import { SimpleModal } from "../modal";
-import { DurationPicker } from "../picker/DurationPicker";
-import { InputProps, useField } from "./useField";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { SimpleModal } from "../modal/index.js";
+import { DurationPicker } from "../picker/DurationPicker.js";
+import { InputProps, useField } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   expand?: boolean;
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx
index 8af9c7d96..b73e5c5f7 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputGroup.tsx
@@ -20,7 +20,7 @@
 */
 import { ComponentChildren, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { useGroupField } from "./useGroupField";
+import { useGroupField } from "./useGroupField.js";
 
 export interface Props<T> {
   name: T;
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx
index 6cc9b9dcc..8e2586933 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputImage.tsx
@@ -20,10 +20,9 @@
 */
 import { ComponentChildren, h, VNode } from "preact";
 import { useRef, useState } from "preact/hooks";
-import emptyImage from "../../assets/empty.png";
-import { Translate } from "../../i18n";
-import { MAX_IMAGE_SIZE as MAX_IMAGE_UPLOAD_SIZE } from 
"../../utils/constants";
-import { InputProps, useField } from "./useField";
+import { Translate } from "../../i18n/index.js";
+import { MAX_IMAGE_SIZE as MAX_IMAGE_UPLOAD_SIZE } from 
"../../utils/constants.js";
+import { InputProps, useField } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   expand?: boolean;
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx
index 12755f47a..bc90cf128 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputLocation.tsx
@@ -19,8 +19,8 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { Fragment, h } from "preact";
-import { useTranslator } from "../../i18n";
-import { Input } from "./Input";
+import { useTranslator } from "../../i18n/index.js";
+import { Input } from "./Input.js";
 
 export function InputLocation({name}:{name:string}) {
   const i18n = useTranslator()
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx
index 046cda59e..7b7499f2d 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputNumber.tsx
@@ -19,8 +19,8 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { ComponentChildren, h } from "preact";
-import { InputWithAddon } from "./InputWithAddon";
-import { InputProps } from "./useField";
+import { InputWithAddon } from "./InputWithAddon.js";
+import { InputProps } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   readonly?: boolean;
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx
index 44252317e..703792936 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputPayto.tsx
@@ -19,9 +19,9 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { h, VNode } from "preact";
-import { InputArray } from "./InputArray";
-import { PAYTO_REGEX } from "../../utils/constants";
-import { InputProps } from "./useField";
+import { InputArray } from "./InputArray.js";
+import { PAYTO_REGEX } from "../../utils/constants.js";
+import { InputProps } from "./useField.js";
 
 export type Props<T> = InputProps<T>;
 
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx
index 9cfef07cf..e8022ca15 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx
@@ -20,13 +20,14 @@
  */
 import { h, VNode, Fragment } from "preact";
 import { useCallback, useState } from "preact/hooks";
-import { Translate, Translator, useTranslator } from "../../i18n";
-import { COUNTRY_TABLE } from "../../utils/constants";
-import { FormErrors, FormProvider } from "./FormProvider";
-import { Input } from "./Input";
-import { InputGroup } from "./InputGroup";
-import { InputSelector } from "./InputSelector";
-import { InputProps, useField } from "./useField";
+import { Translate, Translator, useTranslator } from "../../i18n/index.js";
+import { COUNTRY_TABLE } from "../../utils/constants.js";
+import { undefinedIfEmpty } from "../../utils/table.js";
+import { FormErrors, FormProvider } from "./FormProvider.js";
+import { Input } from "./Input.js";
+import { InputGroup } from "./InputGroup.js";
+import { InputSelector } from "./InputSelector.js";
+import { InputProps, useField } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   isValid?: (e: any) => boolean;
@@ -154,12 +155,6 @@ const targets = [
 const noTargetValue = targets[0];
 const defaultTarget = { target: noTargetValue, options: {} };
 
-function undefinedIfEmpty<T>(obj: T): T | undefined {
-  return Object.keys(obj).some((k) => (obj as any)[k] !== undefined)
-    ? obj
-    : undefined;
-}
-
 export function InputPaytoForm<T>({
   name,
   readonly,
@@ -217,7 +212,7 @@ export function InputPaytoForm<T>({
   };
 
   const hasErrors = Object.keys(errors).some(
-    (k) => (errors as any)[k] !== undefined
+    (k) => (errors as any)[k] !== undefined,
   );
 
   const submit = useCallback((): void => {
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx
index 51f84fd12..2b239d483 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputSearchProduct.tsx
@@ -21,11 +21,10 @@
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
 import emptyImage from "../../assets/empty.png";
-import { MerchantBackend, WithId } from "../../declaration";
-import { useInstanceProducts } from "../../hooks/product";
-import { Translate, useTranslator } from "../../i18n";
-import { FormErrors, FormProvider } from "./FormProvider";
-import { InputWithAddon } from "./InputWithAddon";
+import { MerchantBackend, WithId } from "../../declaration.js";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { FormErrors, FormProvider } from "./FormProvider.js";
+import { InputWithAddon } from "./InputWithAddon.js";
 
 type Entity = MerchantBackend.Products.ProductDetail & WithId
 
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx
index 1990eeeae..72355e242 100644
--- 
a/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/components/form/InputSecured.stories.tsx
@@ -21,8 +21,8 @@
 
 import { h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { FormProvider } from "./FormProvider";
-import { InputSecured } from './InputSecured';
+import { FormProvider } from "./FormProvider.js";
+import { InputSecured } from './InputSecured.js';
 
 export default {
   title: 'Components/Form/InputSecured',
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx
index c9b0f43b9..17431fcfc 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputSecured.tsx
@@ -20,8 +20,8 @@
 */
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Translate, useTranslator } from "../../i18n";
-import { InputProps, useField } from "./useField";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { InputProps, useField } from "./useField.js";
 
 export type Props<T> = InputProps<T>;
 
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputSelector.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputSelector.tsx
index 86f4de756..f2574240b 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputSelector.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputSelector.tsx
@@ -19,7 +19,7 @@
  * @author Sebastian Javier Marchano (sebasjm)
  */
 import { h, VNode } from "preact";
-import { InputProps, useField } from "./useField";
+import { InputProps, useField } from "./useField.js";
 
 interface Props<T> extends InputProps<T> {
   readonly?: boolean;
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputStock.stories.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputStock.stories.tsx
index 63c7e4131..bfd607c4e 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputStock.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputStock.stories.tsx
@@ -22,8 +22,8 @@
 import { addDays } from "date-fns";
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { FormProvider } from "./FormProvider";
-import { InputStock, Stock } from "./InputStock";
+import { FormProvider } from "./FormProvider.js";
+import { InputStock, Stock } from "./InputStock.js";
 
 export default {
   title: "Components/Form/InputStock",
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx
index 158f44192..8e9b56f62 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputStock.tsx
@@ -19,16 +19,16 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { Fragment, h } from "preact";
-import { MerchantBackend, Timestamp } from "../../declaration";
-import { InputProps, useField } from "./useField";
-import { FormProvider, FormErrors } from "./FormProvider";
+import { MerchantBackend, Timestamp } from "../../declaration.js";
+import { InputProps, useField } from "./useField.js";
+import { FormProvider, FormErrors } from "./FormProvider.js";
 import { useLayoutEffect, useState } from "preact/hooks";
-import { Input } from "./Input";
-import { InputGroup } from "./InputGroup";
-import { InputNumber } from "./InputNumber";
-import { InputDate } from "./InputDate";
-import { Translate, useTranslator } from "../../i18n";
-import { InputLocation } from "./InputLocation";
+import { Input } from "./Input.js";
+import { InputGroup } from "./InputGroup.js";
+import { InputNumber } from "./InputNumber.js";
+import { InputDate } from "./InputDate.js";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { InputLocation } from "./InputLocation.js";
 
 export interface Props<T> extends InputProps<T> {
   alreadyExist?: boolean;
diff --git a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx
index 507a61242..f7e983460 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputTaxes.tsx
@@ -21,13 +21,13 @@
 import { h, VNode } from "preact";
 import { useCallback, useState } from "preact/hooks";
 import * as yup from 'yup';
-import { MerchantBackend } from "../../declaration";
-import { Translate, useTranslator } from "../../i18n";
-import { TaxSchema as schema } from '../../schemas';
-import { FormErrors, FormProvider } from "./FormProvider";
-import { Input } from "./Input";
-import { InputGroup } from "./InputGroup";
-import { InputProps, useField } from "./useField";
+import { MerchantBackend } from "../../declaration.js";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { TaxSchema as schema } from "../../schemas/index.js";
+import { FormErrors, FormProvider } from "./FormProvider.js";
+import { Input } from "./Input.js";
+import { InputGroup } from "./InputGroup.js";
+import { InputProps, useField } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   isValid?: (e: any) => boolean;
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx 
b/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx
index a16ebc2e9..16fc5d611 100644
--- a/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/InputWithAddon.tsx
@@ -19,7 +19,7 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { ComponentChildren, h, VNode } from "preact";
-import { InputProps, useField } from "./useField";
+import { InputProps, useField } from "./useField.js";
 
 export interface Props<T> extends InputProps<T> {
   expand?: boolean;
diff --git a/packages/merchant-backoffice-ui/src/components/form/TextField.tsx 
b/packages/merchant-backoffice-ui/src/components/form/TextField.tsx
index 2579a27b2..3dd157b79 100644
--- a/packages/merchant-backoffice-ui/src/components/form/TextField.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/TextField.tsx
@@ -19,7 +19,7 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { ComponentChildren, h, VNode } from "preact";
-import { useField, InputProps } from "./useField";
+import { useField, InputProps } from "./useField.js";
 
 interface Props<T> extends InputProps<T> {
   inputType?: 'text' | 'number' | 'multiline' | 'password';
diff --git a/packages/merchant-backoffice-ui/src/components/form/useField.tsx 
b/packages/merchant-backoffice-ui/src/components/form/useField.tsx
index 8479d7ad8..a6e5a01a8 100644
--- a/packages/merchant-backoffice-ui/src/components/form/useField.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/useField.tsx
@@ -20,7 +20,7 @@
 */
 
 import { ComponentChildren, VNode } from "preact";
-import { useFormContext } from "./FormProvider";
+import { useFormContext } from "./FormProvider.js";
 
 interface Use<V> {
   error?: string;
diff --git 
a/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx 
b/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx
index a73f464a1..d2bb021cf 100644
--- a/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx
+++ b/packages/merchant-backoffice-ui/src/components/form/useGroupField.tsx
@@ -19,7 +19,7 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 
-import { useFormContext } from "./FormProvider";
+import { useFormContext } from "./FormProvider.js";
 
 interface Use {
   hasError?: boolean;
diff --git 
a/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx
 
b/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx
index d80c65cc2..a32eb9088 100644
--- 
a/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx
+++ 
b/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx
@@ -20,17 +20,17 @@
  */
 
 import { Fragment, h, VNode } from "preact";
-import { useBackendContext } from "../../context/backend";
-import { useTranslator } from "../../i18n";
-import { Entity } from "../../paths/admin/create/CreatePage";
-import { Input } from "../form/Input";
-import { InputCurrency } from "../form/InputCurrency";
-import { InputDuration } from "../form/InputDuration";
-import { InputGroup } from "../form/InputGroup";
-import { InputImage } from "../form/InputImage";
-import { InputLocation } from "../form/InputLocation";
-import { InputPaytoForm } from "../form/InputPaytoForm";
-import { InputWithAddon } from "../form/InputWithAddon";
+import { useBackendContext } from "../../context/backend.js";
+import { useTranslator } from "../../i18n/index.js";
+import { Entity } from "../../paths/admin/create/CreatePage.js";
+import { Input } from "../form/Input.js";
+import { InputCurrency } from "../form/InputCurrency.js";
+import { InputDuration } from "../form/InputDuration.js";
+import { InputGroup } from "../form/InputGroup.js";
+import { InputImage } from "../form/InputImage.js";
+import { InputLocation } from "../form/InputLocation.js";
+import { InputPaytoForm } from "../form/InputPaytoForm.js";
+import { InputWithAddon } from "../form/InputWithAddon.js";
 
 export function DefaultInstanceFormFields({
   readonlyId,
diff --git 
a/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx 
b/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx
index 41d08a58b..4f35e3f76 100644
--- a/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx
+++ b/packages/merchant-backoffice-ui/src/components/menu/LangSelector.tsx
@@ -22,7 +22,7 @@
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
 import langIcon from '../../assets/icons/languageicon.svg';
-import { useTranslationContext } from "../../context/translation";
+import { useTranslationContext } from "../../context/translation.js";
 import { strings as messages } from '../../i18n/strings'
 
 type LangsNames = {
diff --git 
a/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx 
b/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx
index e1bb4c7c0..7ef446bd1 100644
--- a/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx
+++ b/packages/merchant-backoffice-ui/src/components/menu/NavigationBar.tsx
@@ -21,7 +21,7 @@
 
 import { h, VNode } from 'preact';
 import logo from '../../assets/logo.jpeg';
-import { LangSelector } from './LangSelector';
+import { LangSelector } from "./LangSelector.js";
 
 interface Props {
   onMobileMenu: () => void;
diff --git a/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx 
b/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx
index e9c5ef8ae..11dec6e80 100644
--- a/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx
+++ b/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx
@@ -21,12 +21,12 @@
 
 import { Fragment, h, VNode } from "preact";
 import { useCallback } from "preact/hooks";
-import { useBackendContext } from "../../context/backend";
-import { useConfigContext } from "../../context/config";
-import { useInstanceContext } from "../../context/instance";
-import { useInstanceKYCDetails } from "../../hooks/instance";
-import { Translate } from "../../i18n";
-import { LangSelector } from "./LangSelector";
+import { useBackendContext } from "../../context/backend.js";
+import { useConfigContext } from "../../context/config.js";
+import { useInstanceContext } from "../../context/instance.js";
+import { useInstanceKYCDetails } from "../../hooks/instance.js";
+import { Translate } from "../../i18n/index.js";
+import { LangSelector } from "./LangSelector.js";
 
 interface Props {
   onLogout: () => void;
diff --git a/packages/merchant-backoffice-ui/src/components/menu/index.tsx 
b/packages/merchant-backoffice-ui/src/components/menu/index.tsx
index 0a621af56..2a2e6f819 100644
--- a/packages/merchant-backoffice-ui/src/components/menu/index.tsx
+++ b/packages/merchant-backoffice-ui/src/components/menu/index.tsx
@@ -17,11 +17,11 @@
 import { ComponentChildren, Fragment, h, VNode } from "preact";
 import Match from "preact-router/match";
 import { useEffect, useState } from "preact/hooks";
-import { AdminPaths } from "../../AdminRoutes";
-import { InstancePaths } from "../../InstanceRoutes";
-import { Notification } from "../../utils/types";
-import { NavigationBar } from "./NavigationBar";
-import { Sidebar } from "./SideBar";
+import { AdminPaths } from "../../AdminRoutes.js";
+import { InstancePaths } from "../../InstanceRoutes.js";
+import { Notification } from "../../utils/types.js";
+import { NavigationBar } from "./NavigationBar.js";
+import { Sidebar } from "./SideBar.js";
 
 function getInstanceTitle(path: string, id: string): string {
   switch (path) {
diff --git a/packages/merchant-backoffice-ui/src/components/modal/index.tsx 
b/packages/merchant-backoffice-ui/src/components/modal/index.tsx
index a7edb9e48..15e80f470 100644
--- a/packages/merchant-backoffice-ui/src/components/modal/index.tsx
+++ b/packages/merchant-backoffice-ui/src/components/modal/index.tsx
@@ -22,12 +22,12 @@
 
 import { ComponentChildren, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { useInstanceContext } from "../../context/instance";
-import { Translate, useTranslator } from "../../i18n";
-import { DEFAULT_REQUEST_TIMEOUT } from "../../utils/constants";
-import { Loading, Spinner } from "../exception/loading";
-import { FormProvider } from "../form/FormProvider";
-import { Input } from "../form/Input";
+import { useInstanceContext } from "../../context/instance.js";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { DEFAULT_REQUEST_TIMEOUT } from "../../utils/constants.js";
+import { Loading, Spinner } from "../exception/loading.js";
+import { FormProvider } from "../form/FormProvider.js";
+import { Input } from "../form/Input.js";
 
 interface Props {
   active?: boolean;
diff --git 
a/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx
 
b/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx
index 3b95295fe..15e00b790 100644
--- 
a/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/components/notifications/Notifications.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h } from 'preact';
-import { Notifications } from './index';
+import { Notifications } from "./index.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/components/notifications/index.tsx 
b/packages/merchant-backoffice-ui/src/components/notifications/index.tsx
index 34bd40ec6..d4da7b35a 100644
--- a/packages/merchant-backoffice-ui/src/components/notifications/index.tsx
+++ b/packages/merchant-backoffice-ui/src/components/notifications/index.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode } from "preact";
-import { MessageType, Notification } from "../../utils/types";
+import { MessageType, Notification } from "../../utils/types.js";
 
 interface Props {
   notifications: Notification[];
diff --git 
a/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx
 
b/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx
index 275c80fa6..81bca17ba 100644
--- 
a/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.stories.tsx
@@ -21,7 +21,7 @@
 
 import { h, FunctionalComponent } from 'preact';
 import { useState } from 'preact/hooks';
-import { DurationPicker as TestedComponent } from './DurationPicker';
+import { DurationPicker as TestedComponent } from "./DurationPicker.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.tsx 
b/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.tsx
index f32a48fd4..63ac22697 100644
--- a/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.tsx
+++ b/packages/merchant-backoffice-ui/src/components/picker/DurationPicker.tsx
@@ -21,7 +21,7 @@
 
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { useTranslator } from "../../i18n";
+import { useTranslator } from "../../i18n/index.js";
 import "../../scss/DurationPicker.scss";
 
 export interface Props {
diff --git 
a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx
 
b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx
index 6504d85ba..fd87283c4 100644
--- 
a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { InventoryProductForm as TestedComponent } from 
'./InventoryProductForm';
+import { InventoryProductForm as TestedComponent } from 
"./InventoryProductForm.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx
 
b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx
index 8f05c9736..30cb06c12 100644
--- 
a/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx
+++ 
b/packages/merchant-backoffice-ui/src/components/product/InventoryProductForm.tsx
@@ -15,12 +15,12 @@
  */
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { FormProvider, FormErrors } from "../form/FormProvider";
-import { InputNumber } from "../form/InputNumber";
-import { InputSearchProduct } from "../form/InputSearchProduct";
-import { MerchantBackend, WithId } from "../../declaration";
-import { Translate, useTranslator } from "../../i18n";
-import { ProductMap } from "../../paths/instance/orders/create/CreatePage";
+import { FormProvider, FormErrors } from "../form/FormProvider.js";
+import { InputNumber } from "../form/InputNumber.js";
+import { InputSearchProduct } from "../form/InputSearchProduct.js";
+import { MerchantBackend, WithId } from "../../declaration.js";
+import { Translate, useTranslator } from "../../i18n/index.js";
+import { ProductMap } from "../../paths/instance/orders/create/CreatePage.js";
 
 type Form = {
   product: MerchantBackend.Products.ProductDetail & WithId,
diff --git 
a/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx
 
b/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx
index 397efe616..1a864d0b3 100644
--- 
a/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx
+++ 
b/packages/merchant-backoffice-ui/src/components/product/NonInventoryProductForm.tsx
@@ -16,18 +16,18 @@
 import { Fragment, h, VNode } from "preact";
 import { useCallback, useEffect, useState } from "preact/hooks";
 import * as yup from 'yup';
-import { FormErrors, FormProvider } from "../form/FormProvider";
-import { Input } from "../form/Input";
-import { InputCurrency } from "../form/InputCurrency";
-import { InputImage } from "../form/InputImage";
-import { InputNumber } from "../form/InputNumber";
-import { InputTaxes } from "../form/InputTaxes";
-import { MerchantBackend } from "../../declaration";
-import { useListener } from "../../hooks/listener";
-import { Translate, useTranslator } from "../../i18n";
+import { FormErrors, FormProvider } from "../form/FormProvider.js";
+import { Input } from "../form/Input.js";
+import { InputCurrency } from "../form/InputCurrency.js";
+import { InputImage } from "../form/InputImage.js";
+import { InputNumber } from "../form/InputNumber.js";
+import { InputTaxes } from "../form/InputTaxes.js";
+import { MerchantBackend } from "../../declaration.js";
+import { useListener } from "../../hooks/listener.js";
+import { Translate, useTranslator } from "../../i18n/index.js";
 import {
   NonInventoryProductSchema as schema
-} from '../../schemas';
+} from "../../schemas/index.js";
 
 
 type Entity = MerchantBackend.Product
diff --git 
a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx 
b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
index 9434d3de8..bf7489a94 100644
--- a/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/ProductForm.tsx
@@ -22,21 +22,21 @@
 import { h } from "preact";
 import { useCallback, useEffect, useState } from "preact/hooks";
 import * as yup from "yup";
-import { useBackendContext } from "../../context/backend";
-import { MerchantBackend } from "../../declaration";
-import { useTranslator } from "../../i18n";
+import { useBackendContext } from "../../context/backend.js";
+import { MerchantBackend } from "../../declaration.js";
+import { useTranslator } from "../../i18n/index.js";
 import {
   ProductCreateSchema as createSchema,
   ProductUpdateSchema as updateSchema,
-} from "../../schemas";
-import { FormProvider, FormErrors } from "../form/FormProvider";
-import { Input } from "../form/Input";
-import { InputCurrency } from "../form/InputCurrency";
-import { InputImage } from "../form/InputImage";
-import { InputNumber } from "../form/InputNumber";
-import { InputStock, Stock } from "../form/InputStock";
-import { InputTaxes } from "../form/InputTaxes";
-import { InputWithAddon } from "../form/InputWithAddon";
+} from "../../schemas/index.js";
+import { FormProvider, FormErrors } from "../form/FormProvider.js";
+import { Input } from "../form/Input.js";
+import { InputCurrency } from "../form/InputCurrency.js";
+import { InputImage } from "../form/InputImage.js";
+import { InputNumber } from "../form/InputNumber.js";
+import { InputStock, Stock } from "../form/InputStock.js";
+import { InputTaxes } from "../form/InputTaxes.js";
+import { InputWithAddon } from "../form/InputWithAddon.js";
 
 type Entity = MerchantBackend.Products.ProductDetail & { product_id: string };
 
diff --git 
a/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx 
b/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx
index ff141bb39..8b3d0fa20 100644
--- a/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx
+++ b/packages/merchant-backoffice-ui/src/components/product/ProductList.tsx
@@ -16,8 +16,8 @@
 import { Amounts } from "@gnu-taler/taler-util";
 import { h, VNode } from "preact";
 import emptyImage from "../../assets/empty.png";
-import { MerchantBackend } from "../../declaration";
-import { Translate } from "../../i18n";
+import { MerchantBackend } from "../../declaration.js";
+import { Translate } from "../../i18n/index.js";
 
 interface Props {
   list: MerchantBackend.Product[];
diff --git a/packages/merchant-backoffice-ui/src/context/backend.ts 
b/packages/merchant-backoffice-ui/src/context/backend.ts
index 9ef7bfdea..cbfebe2e4 100644
--- a/packages/merchant-backoffice-ui/src/context/backend.ts
+++ b/packages/merchant-backoffice-ui/src/context/backend.ts
@@ -21,7 +21,7 @@
 
 import { createContext, h, VNode } from 'preact'
 import { useCallback, useContext, useState } from 'preact/hooks'
-import { useBackendDefaultToken, useBackendURL } from '../hooks';
+import { useBackendDefaultToken, useBackendURL } from "../hooks/index.js";
 
 interface BackendContextType {
   url: string;
diff --git a/packages/merchant-backoffice-ui/src/hooks/async.ts 
b/packages/merchant-backoffice-ui/src/hooks/async.ts
index fd550043b..69cb231a4 100644
--- a/packages/merchant-backoffice-ui/src/hooks/async.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/async.ts
@@ -19,7 +19,7 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { useState } from "preact/hooks";
-import { cancelPendingRequest } from "./backend";
+import { cancelPendingRequest } from "./backend.js";
 
 export interface Options {
   slowTolerance: number,
diff --git a/packages/merchant-backoffice-ui/src/hooks/backend.ts 
b/packages/merchant-backoffice-ui/src/hooks/backend.ts
index 789cfc81c..6262a0bca 100644
--- a/packages/merchant-backoffice-ui/src/hooks/backend.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/backend.ts
@@ -21,11 +21,11 @@
 
 import { useSWRConfig } from "swr";
 import axios, { AxiosError, AxiosResponse } from "axios";
-import { MerchantBackend } from "../declaration";
-import { useBackendContext } from "../context/backend";
+import { MerchantBackend } from "../declaration.js";
+import { useBackendContext } from "../context/backend.js";
 import { useEffect, useState } from "preact/hooks";
-import { DEFAULT_REQUEST_TIMEOUT } from "../utils/constants";
-import { axiosHandler, removeAxiosCancelToken } from 
"../utils/switchableAxios";
+import { DEFAULT_REQUEST_TIMEOUT } from "../utils/constants.js";
+import { axiosHandler, removeAxiosCancelToken } from 
"../utils/switchableAxios.js";
 
 export function useMatchMutate(): (
   re: RegExp,
diff --git a/packages/merchant-backoffice-ui/src/hooks/index.ts 
b/packages/merchant-backoffice-ui/src/hooks/index.ts
index a647e3e6c..e61dc4c34 100644
--- a/packages/merchant-backoffice-ui/src/hooks/index.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/index.ts
@@ -20,7 +20,7 @@
 */
 
 import { StateUpdater, useCallback, useState } from "preact/hooks";
-import { ValueOrFunction } from '../utils/types';
+import { ValueOrFunction } from "../utils/types.js";
 
 
 const calculateRootPath = () => {
diff --git a/packages/merchant-backoffice-ui/src/hooks/instance.ts 
b/packages/merchant-backoffice-ui/src/hooks/instance.ts
index 748bb82af..fd78aabf6 100644
--- a/packages/merchant-backoffice-ui/src/hooks/instance.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/instance.ts
@@ -14,9 +14,9 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 import useSWR, { useSWRConfig } from "swr";
-import { useBackendContext } from "../context/backend";
-import { useInstanceContext } from "../context/instance";
-import { MerchantBackend } from "../declaration";
+import { useBackendContext } from "../context/backend.js";
+import { useInstanceContext } from "../context/instance.js";
+import { MerchantBackend } from "../declaration.js";
 import {
   fetcher,
   HttpError,
@@ -24,7 +24,7 @@ import {
   HttpResponseOk,
   request,
   useMatchMutate,
-} from "./backend";
+} from "./backend.js";
 
 interface InstanceAPI {
   updateInstance: (
diff --git a/packages/merchant-backoffice-ui/src/hooks/notifications.ts 
b/packages/merchant-backoffice-ui/src/hooks/notifications.ts
index 1c0c37308..9c5e21c79 100644
--- a/packages/merchant-backoffice-ui/src/hooks/notifications.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/notifications.ts
@@ -20,7 +20,7 @@
 */
 
 import { useState } from "preact/hooks";
-import { Notification } from '../utils/types';
+import { Notification } from "../utils/types.js";
 
 interface Result {
   notifications: Notification[];
diff --git a/packages/merchant-backoffice-ui/src/hooks/order.ts 
b/packages/merchant-backoffice-ui/src/hooks/order.ts
index d0829683d..a25d18681 100644
--- a/packages/merchant-backoffice-ui/src/hooks/order.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/order.ts
@@ -15,10 +15,10 @@
  */
 import { useEffect, useState } from "preact/hooks";
 import useSWR, { useSWRConfig } from "swr";
-import { useBackendContext } from "../context/backend";
-import { useInstanceContext } from "../context/instance";
-import { MerchantBackend } from "../declaration";
-import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants";
+import { useBackendContext } from "../context/backend.js";
+import { useInstanceContext } from "../context/instance.js";
+import { MerchantBackend } from "../declaration.js";
+import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js";
 import {
   fetcher,
   HttpError,
@@ -27,7 +27,7 @@ import {
   HttpResponsePaginated,
   request,
   useMatchMutate,
-} from "./backend";
+} from "./backend.js";
 
 export interface OrderAPI {
   //FIXME: add OutOfStockResponse on 410
diff --git a/packages/merchant-backoffice-ui/src/hooks/product.ts 
b/packages/merchant-backoffice-ui/src/hooks/product.ts
index c99542bc9..2b6332c51 100644
--- a/packages/merchant-backoffice-ui/src/hooks/product.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/product.ts
@@ -14,9 +14,9 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 import useSWR, { useSWRConfig } from "swr";
-import { useBackendContext } from "../context/backend";
-import { useInstanceContext } from "../context/instance";
-import { MerchantBackend, WithId } from "../declaration";
+import { useBackendContext } from "../context/backend.js";
+import { useInstanceContext } from "../context/instance.js";
+import { MerchantBackend, WithId } from "../declaration.js";
 import {
   fetcher,
   HttpError,
@@ -25,7 +25,7 @@ import {
   multiFetcher,
   request,
   useMatchMutate
-} from "./backend";
+} from "./backend.js";
 
 export interface ProductAPI {
   createProduct: (
diff --git a/packages/merchant-backoffice-ui/src/hooks/reserves.ts 
b/packages/merchant-backoffice-ui/src/hooks/reserves.ts
index 7a662dfbc..d1dcb0b7a 100644
--- a/packages/merchant-backoffice-ui/src/hooks/reserves.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/reserves.ts
@@ -14,9 +14,9 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 import useSWR, { useSWRConfig } from "swr";
-import { useBackendContext } from "../context/backend";
-import { useInstanceContext } from "../context/instance";
-import { MerchantBackend } from "../declaration";
+import { useBackendContext } from "../context/backend.js";
+import { useInstanceContext } from "../context/instance.js";
+import { MerchantBackend } from "../declaration.js";
 import {
   fetcher,
   HttpError,
@@ -24,7 +24,7 @@ import {
   HttpResponseOk,
   request,
   useMatchMutate,
-} from "./backend";
+} from "./backend.js";
 
 export function useReservesAPI(): ReserveMutateAPI {
   const mutateAll = useMatchMutate();
diff --git a/packages/merchant-backoffice-ui/src/hooks/transfer.ts 
b/packages/merchant-backoffice-ui/src/hooks/transfer.ts
index 0c12d6d4d..fddbc7cda 100644
--- a/packages/merchant-backoffice-ui/src/hooks/transfer.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/transfer.ts
@@ -13,8 +13,8 @@
  You should have received a copy of the GNU General Public License along with
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
-import { MerchantBackend } from "../declaration";
-import { useBackendContext } from "../context/backend";
+import { MerchantBackend } from "../declaration.js";
+import { useBackendContext } from "../context/backend.js";
 import {
   request,
   HttpResponse,
@@ -22,10 +22,10 @@ import {
   HttpResponseOk,
   HttpResponsePaginated,
   useMatchMutate,
-} from "./backend";
+} from "./backend.js";
 import useSWR from "swr";
-import { useInstanceContext } from "../context/instance";
-import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants";
+import { useInstanceContext } from "../context/instance.js";
+import { MAX_RESULT_SIZE, PAGE_SIZE } from "../utils/constants.js";
 import { useEffect, useState } from "preact/hooks";
 
 async function transferFetcher<T>(
diff --git a/packages/merchant-backoffice-ui/src/i18n/index.tsx 
b/packages/merchant-backoffice-ui/src/i18n/index.tsx
index 9403de1f5..f2638fc05 100644
--- a/packages/merchant-backoffice-ui/src/i18n/index.tsx
+++ b/packages/merchant-backoffice-ui/src/i18n/index.tsx
@@ -23,7 +23,7 @@
  */
 import { ComponentChild, ComponentChildren, h, Fragment, VNode } from "preact";
 
-import { useTranslationContext } from "../context/translation";
+import { useTranslationContext } from "../context/translation.js";
 
 export type Translator = (
   stringSeq: TemplateStringsArray,
diff --git a/packages/merchant-backoffice-ui/src/index.tsx 
b/packages/merchant-backoffice-ui/src/index.tsx
index 26dcc3eb8..8834ada53 100644
--- a/packages/merchant-backoffice-ui/src/index.tsx
+++ b/packages/merchant-backoffice-ui/src/index.tsx
@@ -22,16 +22,15 @@
 import { h, VNode } from 'preact';
 import { route } from 'preact-router';
 import { useMemo } from "preact/hooks";
-import { ApplicationReadyRoutes } from "./ApplicationReadyRoutes";
-import { Loading } from "./components/exception/loading";
-import { NotificationCard, NotYetReadyAppMenu } from "./components/menu";
-import { BackendContextProvider, useBackendContext } from './context/backend';
-import { ConfigContextProvider } from './context/config';
-import { FetchContextProvider } from './context/fetch';
-import { TranslationProvider } from './context/translation';
-import { useBackendConfig } from "./hooks/backend";
-import { useTranslator } from './i18n';
-import LoginPage from './paths/login';
+import { ApplicationReadyRoutes } from "./ApplicationReadyRoutes.js";
+import { Loading } from "./components/exception/loading.js";
+import { NotificationCard, NotYetReadyAppMenu } from 
"./components/menu/index.js";
+import { BackendContextProvider, useBackendContext } from 
'./context/backend.js';
+import { ConfigContextProvider } from './context/config.js';
+import { TranslationProvider } from './context/translation.js';
+import { useBackendConfig } from "./hooks/backend.js";
+import { useTranslator } from './i18n/index.js';
+import LoginPage from './paths/login/index.js';
 import "./scss/main.scss";
 
 export default function Application(): VNode {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx 
b/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx
index c1287557d..7411586a1 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/create/Create.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { CreatePage as TestedComponent } from './CreatePage';
+import { CreatePage as TestedComponent } from "./CreatePage.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx 
b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx
index 1851e52f1..0d7681e1d 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx
@@ -22,17 +22,18 @@
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
 import * as yup from "yup";
-import { AsyncButton } from "../../../components/exception/AsyncButton";
+import { AsyncButton } from "../../../components/exception/AsyncButton.js";
 import {
   FormErrors,
   FormProvider,
-} from "../../../components/form/FormProvider";
-import { SetTokenNewInstanceModal } from "../../../components/modal";
-import { MerchantBackend } from "../../../declaration";
-import { Translate, useTranslator } from "../../../i18n";
-import { DefaultInstanceFormFields } from 
"../../../components/instance/DefaultInstanceFormFields";
-import { INSTANCE_ID_REGEX, PAYTO_REGEX } from "../../../utils/constants";
+} from "../../../components/form/FormProvider.js";
+import { SetTokenNewInstanceModal } from "../../../components/modal/index.js";
+import { MerchantBackend } from "../../../declaration.js";
+import { Translate, useTranslator } from "../../../i18n/index.js";
+import { DefaultInstanceFormFields } from 
"../../../components/instance/DefaultInstanceFormFields.js";
+import { INSTANCE_ID_REGEX, PAYTO_REGEX } from "../../../utils/constants.js";
 import { Amounts } from "@gnu-taler/taler-util";
+import { undefinedIfEmpty } from "../../../utils/table.js";
 
 export type Entity = MerchantBackend.Instances.InstanceConfigurationMessage & {
   auth_token?: string;
@@ -54,12 +55,6 @@ function with_defaults(id?: string): Partial<Entity> {
   };
 }
 
-function undefinedIfEmpty<T>(obj: T): T | undefined {
-  return Object.keys(obj).some((k) => (obj as any)[k] !== undefined)
-    ? obj
-    : undefined;
-}
-
 export function CreatePage({ onCreate, onBack, forceId }: Props): VNode {
   const [value, valueHandler] = useState(with_defaults(forceId));
   const [isTokenSet, updateIsTokenSet] = useState<boolean>(false);
diff --git 
a/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx
 
b/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx
index 00b3f20fc..37aa7e7d6 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/admin/create/InstanceCreatedSuccessfully.tsx
@@ -18,8 +18,8 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { h, VNode } from "preact";
-import { CreatedSuccessfully } from 
"../../../components/notifications/CreatedSuccessfully";
-import { Entity } from "./index";
+import { CreatedSuccessfully } from 
"../../../components/notifications/CreatedSuccessfully.js";
+import { Entity } from "./index.js";
 
 export function InstanceCreatedSuccessfully({ entity, onConfirm }: { entity: 
Entity; onConfirm: () => void; }): VNode {
   return <CreatedSuccessfully onConfirm={onConfirm}>
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx
index aaed6d666..dd124eab8 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/create/index.tsx
@@ -19,13 +19,13 @@
  */
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { NotificationCard } from "../../../components/menu";
-import { MerchantBackend } from "../../../declaration";
-import { useAdminAPI } from "../../../hooks/instance";
-import { useTranslator } from "../../../i18n";
-import { Notification } from "../../../utils/types";
-import { CreatePage } from "./CreatePage";
-import { InstanceCreatedSuccessfully } from "./InstanceCreatedSuccessfully";
+import { NotificationCard } from "../../../components/menu/index.js";
+import { MerchantBackend } from "../../../declaration.js";
+import { useAdminAPI } from "../../../hooks/instance.js";
+import { useTranslator } from "../../../i18n/index.js";
+import { Notification } from "../../../utils/types.js";
+import { CreatePage } from "./CreatePage.js";
+import { InstanceCreatedSuccessfully } from "./InstanceCreatedSuccessfully.js";
 
 interface Props {
   onBack?: () => void;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx 
b/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx
index 56b3f299c..71e90889a 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/list/TableActive.tsx
@@ -21,8 +21,8 @@
 
 import { h, VNode } from "preact";
 import { StateUpdater, useEffect, useState } from "preact/hooks";
-import { MerchantBackend } from "../../../declaration";
-import { Translate, useTranslator } from "../../../i18n";
+import { MerchantBackend } from "../../../declaration.js";
+import { Translate, useTranslator } from "../../../i18n/index.js";
 
 interface Props {
   instances: MerchantBackend.Instances.Instance[];
diff --git 
a/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx 
b/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx
index 3da8c2e50..f0b04aabe 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/list/View.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h } from 'preact';
-import { View } from './View';
+import { View } from "./View.js";
 
 
 export default {
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx 
b/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx
index a77a5a1bf..4197a6679 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/list/View.tsx
@@ -20,10 +20,10 @@
 */
 
 import { h, VNode } from "preact";
-import { MerchantBackend } from "../../../declaration";
-import { CardTable as CardTableActive } from './TableActive';
+import { MerchantBackend } from "../../../declaration.js";
+import { CardTable as CardTableActive } from "./TableActive.js";
 import { useState } from 'preact/hooks';
-import { Translate, useTranslator } from "../../../i18n";
+import { Translate, useTranslator } from "../../../i18n/index.js";
 
 interface Props {
   instances: MerchantBackend.Instances.Instance[];
diff --git a/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx
index c5609fd10..f20f0e921 100644
--- a/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/admin/list/index.tsx
@@ -21,15 +21,15 @@
 
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Loading } from "../../../components/exception/loading";
-import { NotificationCard } from "../../../components/menu";
-import { DeleteModal, PurgeModal } from "../../../components/modal";
-import { MerchantBackend } from "../../../declaration";
-import { HttpError } from "../../../hooks/backend";
-import { useAdminAPI, useBackendInstances } from "../../../hooks/instance";
-import { useTranslator } from "../../../i18n";
-import { Notification } from "../../../utils/types";
-import { View } from "./View";
+import { Loading } from "../../../components/exception/loading.js";
+import { NotificationCard } from "../../../components/menu/index.js";
+import { DeleteModal, PurgeModal } from "../../../components/modal/index.js";
+import { MerchantBackend } from "../../../declaration.js";
+import { HttpError } from "../../../hooks/backend.js";
+import { useAdminAPI, useBackendInstances } from "../../../hooks/instance.js";
+import { useTranslator } from "../../../i18n/index.js";
+import { Notification } from "../../../utils/types.js";
+import { View } from "./View.js";
 
 interface Props {
   onCreate: () => void;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx
index 2561f5842..d4717f251 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/details/DetailPage.tsx
@@ -21,10 +21,10 @@
 
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { FormProvider } from "../../../components/form/FormProvider";
-import { Input } from "../../../components/form/Input";
-import { MerchantBackend } from "../../../declaration";
-import { useTranslator } from "../../../i18n";
+import { FormProvider } from "../../../components/form/FormProvider.js";
+import { Input } from "../../../components/form/Input.js";
+import { MerchantBackend } from "../../../declaration.js";
+import { useTranslator } from "../../../i18n/index.js";
 
 type Entity = MerchantBackend.Instances.InstanceReconfigurationMessage;
 interface Props {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx
index fb7c9144c..068dd55c0 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/details/Details.stories.tsx
@@ -20,7 +20,7 @@
  */
 
 import { h, VNode, FunctionalComponent } from "preact";
-import { DetailPage as TestedComponent } from "./DetailPage";
+import { DetailPage as TestedComponent } from "./DetailPage.js";
 
 export default {
   title: "Pages/Instance/Detail",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx
index 15675891e..2ef0f6d1d 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/details/index.tsx
@@ -15,12 +15,12 @@
  */
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Loading } from "../../../components/exception/loading";
-import { DeleteModal } from "../../../components/modal";
-import { useInstanceContext } from "../../../context/instance";
-import { HttpError } from "../../../hooks/backend";
-import { useInstanceAPI, useInstanceDetails } from "../../../hooks/instance";
-import { DetailPage } from "./DetailPage";
+import { Loading } from "../../../components/exception/loading.js";
+import { DeleteModal } from "../../../components/modal/index.js";
+import { useInstanceContext } from "../../../context/instance.js";
+import { HttpError } from "../../../hooks/backend.js";
+import { useInstanceAPI, useInstanceDetails } from 
"../../../hooks/instance.js";
+import { DetailPage } from "./DetailPage.js";
 
 interface Props {
   onUnauthorized: () => VNode;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx
index 52363d3cd..6b9a50660 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/ListPage.tsx
@@ -20,8 +20,8 @@
  */
 
 import { h, VNode } from "preact";
-import { MerchantBackend } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
+import { MerchantBackend } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
 
 export interface Props {
   status: MerchantBackend.Instances.AccountKycRedirects;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx
index 5dff01994..3ef95cb34 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/kyc/list/index.tsx
@@ -20,10 +20,10 @@
  */
 
 import { h, VNode } from "preact";
-import { Loading } from "../../../../components/exception/loading";
-import { HttpError } from "../../../../hooks/backend";
-import { useInstanceKYCDetails } from "../../../../hooks/instance";
-import { ListPage } from "./ListPage";
+import { Loading } from "../../../../components/exception/loading.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { useInstanceKYCDetails } from "../../../../hooks/instance.js";
+import { ListPage } from "./ListPage.js";
 
 interface Props {
   onUnauthorized: () => VNode;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx
index 43df8484a..e658dff8f 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/Create.stories.tsx
@@ -20,7 +20,7 @@
  */
 
 import { h, VNode, FunctionalComponent } from "preact";
-import { CreatePage as TestedComponent } from "./CreatePage";
+import { CreatePage as TestedComponent } from "./CreatePage.js";
 
 export default {
   title: "Pages/Order/Create",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx
index c08d8ee1d..56bb65b90 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx
@@ -26,22 +26,23 @@ import { useEffect, useState } from "preact/hooks";
 import {
   FormProvider,
   FormErrors,
-} from "../../../../components/form/FormProvider";
-import { Input } from "../../../../components/form/Input";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { InputDate } from "../../../../components/form/InputDate";
-import { InputGroup } from "../../../../components/form/InputGroup";
-import { InputLocation } from "../../../../components/form/InputLocation";
-import { ProductList } from "../../../../components/product/ProductList";
-import { useConfigContext } from "../../../../context/config";
-import { Duration, MerchantBackend, WithId } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
-import { OrderCreateSchema as schema } from "../../../../schemas/index";
-import { rate } from "../../../../utils/amount";
-import { InventoryProductForm } from 
"../../../../components/product/InventoryProductForm";
-import { NonInventoryProductFrom } from 
"../../../../components/product/NonInventoryProductForm";
-import { InputNumber } from "../../../../components/form/InputNumber";
-import { InputBoolean } from "../../../../components/form/InputBoolean";
+} from "../../../../components/form/FormProvider.js";
+import { Input } from "../../../../components/form/Input.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { InputDate } from "../../../../components/form/InputDate.js";
+import { InputGroup } from "../../../../components/form/InputGroup.js";
+import { InputLocation } from "../../../../components/form/InputLocation.js";
+import { ProductList } from "../../../../components/product/ProductList.js";
+import { useConfigContext } from "../../../../context/config.js";
+import { Duration, MerchantBackend, WithId } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
+import { OrderCreateSchema as schema } from "../../../../schemas/index.js";
+import { rate } from "../../../../utils/amount.js";
+import { InventoryProductForm } from 
"../../../../components/product/InventoryProductForm.js";
+import { NonInventoryProductFrom } from 
"../../../../components/product/NonInventoryProductForm.js";
+import { InputNumber } from "../../../../components/form/InputNumber.js";
+import { InputBoolean } from "../../../../components/form/InputBoolean.js";
+import { undefinedIfEmpty } from "../../../../utils/table.js";
 
 interface Props {
   onCreate: (d: MerchantBackend.Orders.PostOrderRequest) => void;
@@ -126,12 +127,6 @@ const stringIsValidJSON = (value: string) => {
   }
 };
 
-function undefinedIfEmpty<T>(obj: T): T | undefined {
-  return Object.keys(obj).some((k) => (obj as any)[k] !== undefined)
-    ? obj
-    : undefined;
-}
-
 export function CreatePage({
   onCreate,
   onBack,
@@ -140,7 +135,7 @@ export function CreatePage({
 }: Props): VNode {
   const [value, valueHandler] = useState(with_defaults(instanceConfig));
   const config = useConfigContext();
-  const zero = Amounts.getZero(config.currency);
+  const zero = Amounts.zeroOfCurrency(config.currency);
 
   const inventoryList = Object.values(value.inventoryProducts || {});
   const productList = Object.values(value.products || {});
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx
index 14c5d68c3..d94013da3 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/OrderCreatedSuccessfully.tsx
@@ -15,10 +15,10 @@
  */
 import { h, VNode } from "preact";
 import { useEffect, useState } from "preact/hooks";
-import { CreatedSuccessfully } from 
"../../../../components/notifications/CreatedSuccessfully";
-import { useOrderAPI } from "../../../../hooks/order";
-import { Translate } from "../../../../i18n";
-import { Entity } from "./index";
+import { CreatedSuccessfully } from 
"../../../../components/notifications/CreatedSuccessfully.js";
+import { useOrderAPI } from "../../../../hooks/order.js";
+import { Translate } from "../../../../i18n/index.js";
+import { Entity } from "./index.js";
 
 interface Props {
   entity: Entity;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx
index c447c4b04..b58a6507e 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/index.tsx
@@ -21,16 +21,16 @@
 
 import { Fragment, h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { Loading } from '../../../../components/exception/loading';
-import { NotificationCard } from '../../../../components/menu';
-import { MerchantBackend } from '../../../../declaration';
-import { HttpError } from '../../../../hooks/backend';
-import { useInstanceDetails } from '../../../../hooks/instance';
-import { useOrderAPI } from '../../../../hooks/order';
-import { useInstanceProducts } from '../../../../hooks/product';
-import { Notification } from '../../../../utils/types';
-import { CreatePage } from './CreatePage';
-import { OrderCreatedSuccessfully } from './OrderCreatedSuccessfully';
+import { Loading } from "../../../../components/exception/loading.js";
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { useInstanceDetails } from "../../../../hooks/instance.js";
+import { useOrderAPI } from "../../../../hooks/order.js";
+import { useInstanceProducts } from "../../../../hooks/product.js";
+import { Notification } from "../../../../utils/types.js";
+import { CreatePage } from "./CreatePage.js";
+import { OrderCreatedSuccessfully } from "./OrderCreatedSuccessfully.js";
 
 export type Entity = {
   request: MerchantBackend.Orders.PostOrderRequest,
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx
index 812b11a76..8c21665e6 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/Detail.stories.tsx
@@ -21,8 +21,8 @@
 
 import { addDays } from "date-fns";
 import { h, VNode, FunctionalComponent } from "preact";
-import { MerchantBackend } from "../../../../declaration";
-import { DetailPage as TestedComponent } from "./DetailPage";
+import { MerchantBackend } from "../../../../declaration.js";
+import { DetailPage as TestedComponent } from "./DetailPage.js";
 
 export default {
   title: "Pages/Order/Detail",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx
index 4bb7051d6..3445a86df 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/DetailPage.tsx
@@ -23,21 +23,21 @@ import { AmountJson, Amounts } from "@gnu-taler/taler-util";
 import { format } from "date-fns";
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { FormProvider } from "../../../../components/form/FormProvider";
-import { Input } from "../../../../components/form/Input";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { InputDate } from "../../../../components/form/InputDate";
-import { InputDuration } from "../../../../components/form/InputDuration";
-import { InputGroup } from "../../../../components/form/InputGroup";
-import { InputLocation } from "../../../../components/form/InputLocation";
-import { TextField } from "../../../../components/form/TextField";
-import { ProductList } from "../../../../components/product/ProductList";
-import { useBackendContext } from "../../../../context/backend";
-import { MerchantBackend } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
-import { mergeRefunds } from "../../../../utils/amount";
-import { RefundModal } from "../list/Table";
-import { Event, Timeline } from "./Timeline";
+import { FormProvider } from "../../../../components/form/FormProvider.js";
+import { Input } from "../../../../components/form/Input.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { InputDate } from "../../../../components/form/InputDate.js";
+import { InputDuration } from "../../../../components/form/InputDuration.js";
+import { InputGroup } from "../../../../components/form/InputGroup.js";
+import { InputLocation } from "../../../../components/form/InputLocation.js";
+import { TextField } from "../../../../components/form/TextField.js";
+import { ProductList } from "../../../../components/product/ProductList.js";
+import { useBackendContext } from "../../../../context/backend.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
+import { mergeRefunds } from "../../../../utils/amount.js";
+import { RefundModal } from "../list/Table.js";
+import { Event, Timeline } from "./Timeline.js";
 
 type Entity = MerchantBackend.Orders.MerchantOrderStatusResponse;
 type CT = MerchantBackend.ContractTerms;
@@ -432,7 +432,7 @@ function PaidPage({
   const refund_taken = order.refund_details.reduce((prev, cur) => {
     if (cur.pending) return prev;
     return Amounts.add(prev, Amounts.parseOrThrow(cur.amount)).amount;
-  }, Amounts.getZero(amount.currency));
+  }, Amounts.zeroOfCurrency(amount.currency));
   value.refund_taken = Amounts.stringify(refund_taken);
 
   return (
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx
index cd4e163eb..0549ab8ed 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/details/index.tsx
@@ -15,13 +15,13 @@
  */
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Loading } from "../../../../components/exception/loading";
-import { NotificationCard } from "../../../../components/menu";
-import { HttpError } from "../../../../hooks/backend";
-import { useOrderDetails, useOrderAPI } from "../../../../hooks/order";
-import { useTranslator } from "../../../../i18n";
-import { Notification } from "../../../../utils/types";
-import { DetailPage } from "./DetailPage";
+import { Loading } from "../../../../components/exception/loading.js";
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { useOrderDetails, useOrderAPI } from "../../../../hooks/order.js";
+import { useTranslator } from "../../../../i18n/index.js";
+import { Notification } from "../../../../utils/types.js";
+import { DetailPage } from "./DetailPage.js";
 
 export interface Props {
   oid: string;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx
index 1dbb3f20d..f68c3fd2e 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/List.stories.tsx
@@ -20,7 +20,7 @@
  */
 
 import { h, VNode, FunctionalComponent } from "preact";
-import { ListPage as TestedComponent } from "./ListPage";
+import { ListPage as TestedComponent } from "./ListPage.js";
 
 export default {
   title: "Pages/Order/List",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx
index 032801bde..69e60954f 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/ListPage.tsx
@@ -22,10 +22,10 @@
 import { format } from 'date-fns';
 import { h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { DatePicker } from '../../../../components/picker/DatePicker';
-import { MerchantBackend, WithId } from '../../../../declaration';
-import { Translate, useTranslator } from '../../../../i18n';
-import { CardTable } from './Table';
+import { DatePicker } from "../../../../components/picker/DatePicker.js";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
+import { Translate, useTranslator } from '../../../../i18n/index.js';
+import { CardTable } from "./Table.js";
 
 export interface ListPageProps {
   errorOrderId: string | undefined,
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx
index 60d5fae59..02d5b0bfc 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/Table.tsx
@@ -26,16 +26,16 @@ import { StateUpdater, useState } from "preact/hooks";
 import {
   FormErrors,
   FormProvider,
-} from "../../../../components/form/FormProvider";
-import { Input } from "../../../../components/form/Input";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { InputGroup } from "../../../../components/form/InputGroup";
-import { InputSelector } from "../../../../components/form/InputSelector";
-import { ConfirmModal } from "../../../../components/modal";
-import { useConfigContext } from "../../../../context/config";
-import { MerchantBackend, WithId } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
-import { mergeRefunds } from "../../../../utils/amount";
+} from "../../../../components/form/FormProvider.js";
+import { Input } from "../../../../components/form/Input.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { InputGroup } from "../../../../components/form/InputGroup.js";
+import { InputSelector } from "../../../../components/form/InputSelector.js";
+import { ConfirmModal } from "../../../../components/modal/index.js";
+import { useConfigContext } from "../../../../context/config.js";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
+import { mergeRefunds } from "../../../../utils/amount.js";
 
 type Entity = MerchantBackend.Orders.OrderHistoryEntry & WithId;
 interface Props {
@@ -268,14 +268,14 @@ export function RefundModal({
     .map((r) => r.amount)
     .reduce(
       (p, c) => Amounts.add(p, Amounts.parseOrThrow(c)).amount,
-      Amounts.getZero(config.currency)
+      Amounts.zeroOfCurrency(config.currency)
     );
   const orderPrice =
     order.order_status === "paid"
       ? Amounts.parseOrThrow(order.contract_terms.amount)
       : undefined;
   const totalRefundable = !orderPrice
-    ? Amounts.getZero(totalRefunded.currency)
+    ? Amounts.zeroOfCurrency(totalRefunded.currency)
     : refunds.length
     ? Amounts.sub(orderPrice, totalRefunded).amount
     : orderPrice;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx
index 47e143fb7..233afde04 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/list/index.tsx
@@ -21,15 +21,15 @@
 
 import { h, VNode, Fragment } from 'preact';
 import { useState } from 'preact/hooks';
-import { Loading } from '../../../../components/exception/loading';
-import { NotificationCard } from '../../../../components/menu';
-import { MerchantBackend, WithId } from '../../../../declaration';
-import { HttpError } from '../../../../hooks/backend';
-import { InstanceOrderFilter, useInstanceOrders, useOrderAPI, useOrderDetails 
} from '../../../../hooks/order';
-import { useTranslator } from '../../../../i18n';
-import { Notification } from '../../../../utils/types';
-import { RefundModal } from './Table';
-import { ListPage } from './ListPage';
+import { Loading } from "../../../../components/exception/loading.js";
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { InstanceOrderFilter, useInstanceOrders, useOrderAPI, useOrderDetails 
} from "../../../../hooks/order.js";
+import { useTranslator } from '../../../../i18n/index.js';
+import { Notification } from "../../../../utils/types.js";
+import { RefundModal } from "./Table.js";
+import { ListPage } from "./ListPage.js";
 
 interface Props {
   onUnauthorized: () => VNode;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx
index 1d9ea53f6..b42b9f929 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/Create.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { CreatePage as TestedComponent } from './CreatePage';
+import { CreatePage as TestedComponent } from "./CreatePage.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx
index ed669f67f..434a55aab 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatePage.tsx
@@ -20,11 +20,11 @@
 */
 
 import { h, VNode } from "preact";
-import { AsyncButton } from "../../../../components/exception/AsyncButton";
-import { ProductForm } from "../../../../components/product/ProductForm";
-import { MerchantBackend } from "../../../../declaration";
-import { useListener } from "../../../../hooks/listener";
-import { Translate, useTranslator } from "../../../../i18n";
+import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
+import { ProductForm } from "../../../../components/product/ProductForm.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { useListener } from "../../../../hooks/listener.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
 
 type Entity = MerchantBackend.Products.ProductAddDetail & { product_id: string}
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx
index b56750405..9bbdc4070 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/CreatedSuccessfully.tsx
@@ -14,8 +14,8 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 import { h, VNode } from "preact";
-import { CreatedSuccessfully as Template } from 
"../../../../components/notifications/CreatedSuccessfully";
-import { Entity } from "./index";
+import { CreatedSuccessfully as Template } from 
"../../../../components/notifications/CreatedSuccessfully.js";
+import { Entity } from "./index.js";
 import emptyImage from "../../assets/empty.png";
 
 interface Props {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx
index 46454582a..51dc63431 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/create/index.tsx
@@ -21,12 +21,12 @@
 
 import { Fragment, h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { NotificationCard } from '../../../../components/menu';
-import { MerchantBackend } from '../../../../declaration';
-import { useProductAPI } from '../../../../hooks/product';
-import { useTranslator } from '../../../../i18n';
-import { Notification } from '../../../../utils/types';
-import { CreatePage } from './CreatePage';
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { useProductAPI } from "../../../../hooks/product.js";
+import { useTranslator } from '../../../../i18n/index.js';
+import { Notification } from "../../../../utils/types.js";
+import { CreatePage } from "./CreatePage.js";
 
 export type Entity = MerchantBackend.Products.ProductAddDetail
 interface Props {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx
index beae83b15..53217d051 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/list/List.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { CardTable as TestedComponent } from './Table';
+import { CardTable as TestedComponent } from "./Table.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx
index 9c85d976e..81acb9876 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/Table.tsx
@@ -25,12 +25,12 @@ import { StateUpdater, useState } from "preact/hooks";
 import {
   FormProvider,
   FormErrors,
-} from "../../../../components/form/FormProvider";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { InputNumber } from "../../../../components/form/InputNumber";
-import { MerchantBackend, WithId } from "../../../../declaration";
+} from "../../../../components/form/FormProvider.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { InputNumber } from "../../../../components/form/InputNumber.js";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
 import emptyImage from "../../../../assets/empty.png";
-import { Translate, useTranslator } from "../../../../i18n";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
 import { Amounts } from "@gnu-taler/taler-util";
 
 type Entity = MerchantBackend.Products.ProductDetail & WithId;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx
index 63e440df5..eb98d7871 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/products/list/index.tsx
@@ -21,14 +21,14 @@
 
 import { h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { Loading } from '../../../../components/exception/loading';
-import { NotificationCard } from '../../../../components/menu';
-import { MerchantBackend, WithId } from '../../../../declaration';
-import { HttpError } from '../../../../hooks/backend';
-import { useInstanceProducts, useProductAPI } from "../../../../hooks/product";
-import { useTranslator } from '../../../../i18n';
-import { Notification } from '../../../../utils/types';
-import { CardTable } from './Table';
+import { Loading } from "../../../../components/exception/loading.js";
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { useInstanceProducts, useProductAPI } from 
"../../../../hooks/product.js";
+import { useTranslator } from '../../../../i18n/index.js';
+import { Notification } from "../../../../utils/types.js";
+import { CardTable } from "./Table.js";
 
 interface Props {
   onUnauthorized: () => VNode;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx
index 3a57f7fac..f97d6d367 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/update/Update.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { UpdatePage as TestedComponent } from './UpdatePage';
+import { UpdatePage as TestedComponent } from "./UpdatePage.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx
index d7eb3d162..ff1b3979d 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/update/UpdatePage.tsx
@@ -20,11 +20,11 @@
 */
 
 import { h, VNode } from "preact";
-import { AsyncButton } from "../../../../components/exception/AsyncButton";
-import { ProductForm } from "../../../../components/product/ProductForm";
-import { MerchantBackend, WithId } from "../../../../declaration";
-import { useListener } from "../../../../hooks/listener";
-import { Translate, useTranslator } from "../../../../i18n";
+import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
+import { ProductForm } from "../../../../components/product/ProductForm.js";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
+import { useListener } from "../../../../hooks/listener.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
 
 type Entity = MerchantBackend.Products.ProductDetail & { product_id: string }
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx
index a6a61c815..59cfec15a 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/products/update/index.tsx
@@ -21,14 +21,14 @@
 
 import { Fragment, h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { Loading } from '../../../../components/exception/loading';
-import { NotificationCard } from '../../../../components/menu';
-import { MerchantBackend } from '../../../../declaration';
-import { HttpError } from '../../../../hooks/backend';
-import { useProductAPI, useProductDetails } from '../../../../hooks/product';
-import { useTranslator } from '../../../../i18n';
-import { Notification } from '../../../../utils/types';
-import { UpdatePage } from './UpdatePage';
+import { Loading } from "../../../../components/exception/loading.js";
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { useProductAPI, useProductDetails } from 
"../../../../hooks/product.js";
+import { useTranslator } from '../../../../i18n/index.js';
+import { Notification } from "../../../../utils/types.js";
+import { UpdatePage } from "./UpdatePage.js";
 
 export type Entity = MerchantBackend.Products.ProductAddDetail
 interface Props {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx
index e138770a8..586881318 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/Create.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { CreatePage as TestedComponent } from './CreatePage';
+import { CreatePage as TestedComponent } from "./CreatePage.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx
index 2e85cf9c8..4d92e812f 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatePage.tsx
@@ -21,16 +21,16 @@
 
 import { Fragment, h, VNode } from "preact";
 import { StateUpdater, useEffect, useState } from "preact/hooks";
-import { FormErrors, FormProvider } from 
"../../../../components/form/FormProvider";
-import { Input } from "../../../../components/form/Input";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { ExchangeBackend, MerchantBackend } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
-import { AsyncButton } from "../../../../components/exception/AsyncButton";
+import { FormErrors, FormProvider } from 
"../../../../components/form/FormProvider.js";
+import { Input } from "../../../../components/form/Input.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { ExchangeBackend, MerchantBackend } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
+import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
 import { canonicalizeBaseUrl, ExchangeKeysJson } from "@gnu-taler/taler-util"
-import { PAYTO_WIRE_METHOD_LOOKUP, URL_REGEX } from 
"../../../../utils/constants";
-import { request } from "../../../../hooks/backend";
-import { InputSelector } from "../../../../components/form/InputSelector";
+import { PAYTO_WIRE_METHOD_LOOKUP, URL_REGEX } from 
"../../../../utils/constants.js";
+import { request } from "../../../../hooks/backend.js";
+import { InputSelector } from "../../../../components/form/InputSelector.js";
 
 type Entity = MerchantBackend.Tips.ReserveCreateRequest
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx
index f013040ff..0cea361fd 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { CreatedSuccessfully as TestedComponent } from './CreatedSuccessfully';
+import { CreatedSuccessfully as TestedComponent } from 
"./CreatedSuccessfully.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx
index 255486d22..68ddc70b5 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/CreatedSuccessfully.tsx
@@ -15,10 +15,10 @@
  */
 
 import { h, VNode } from "preact";
-import { CreatedSuccessfully as Template } from 
"../../../../components/notifications/CreatedSuccessfully";
-import { MerchantBackend } from "../../../../declaration";
-import { Translate } from "../../../../i18n";
-import { QR } from "../../../../components/exception/QR";
+import { CreatedSuccessfully as Template } from 
"../../../../components/notifications/CreatedSuccessfully.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { Translate } from "../../../../i18n/index.js";
+import { QR } from "../../../../components/exception/QR.js";
 
 type Entity = { request: MerchantBackend.Tips.ReserveCreateRequest, response: 
MerchantBackend.Tips.ReserveCreateConfirmation };
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/index.tsx
index 5c2fdaf4b..c00261d8c 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/create/index.tsx
@@ -21,13 +21,13 @@
 
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { NotificationCard } from "../../../../components/menu";
-import { MerchantBackend } from "../../../../declaration";
-import { useReservesAPI } from "../../../../hooks/reserves";
-import { useTranslator } from "../../../../i18n";
-import { Notification } from "../../../../utils/types";
-import { CreatedSuccessfully } from "./CreatedSuccessfully";
-import { CreatePage } from "./CreatePage";
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { useReservesAPI } from "../../../../hooks/reserves.js";
+import { useTranslator } from "../../../../i18n/index.js";
+import { Notification } from "../../../../utils/types.js";
+import { CreatedSuccessfully } from "./CreatedSuccessfully.js";
+import { CreatePage } from "./CreatePage.js";
 interface Props {
   onBack: () => void;
   onConfirm: () => void;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx
index cbc70179b..ad1089eb5 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/DetailPage.tsx
@@ -23,17 +23,17 @@ import { Amounts } from "@gnu-taler/taler-util";
 import { format } from "date-fns";
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { QR } from "../../../../components/exception/QR";
-import { FormProvider } from "../../../../components/form/FormProvider";
-import { Input } from "../../../../components/form/Input";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { InputDate } from "../../../../components/form/InputDate";
-import { TextField } from "../../../../components/form/TextField";
-import { ContinueModal, SimpleModal } from "../../../../components/modal";
-import { MerchantBackend } from "../../../../declaration";
-import { useTipDetails } from "../../../../hooks/reserves";
-import { Translate, useTranslator } from "../../../../i18n";
-import { TipInfo } from "./TipInfo";
+import { QR } from "../../../../components/exception/QR.js";
+import { FormProvider } from "../../../../components/form/FormProvider.js";
+import { Input } from "../../../../components/form/Input.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { InputDate } from "../../../../components/form/InputDate.js";
+import { TextField } from "../../../../components/form/TextField.js";
+import { ContinueModal, SimpleModal } from 
"../../../../components/modal/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { useTipDetails } from "../../../../hooks/reserves.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
+import { TipInfo } from "./TipInfo.js";
 
 type Entity = MerchantBackend.Tips.ReserveDetail;
 type CT = MerchantBackend.ContractTerms;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx
index 98c1fa72e..48a12f02a 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/Details.stories.tsx
@@ -20,7 +20,7 @@
  */
 
 import { h, VNode, FunctionalComponent } from "preact";
-import { DetailPage as TestedComponent } from "./DetailPage";
+import { DetailPage as TestedComponent } from "./DetailPage.js";
 
 export default {
   title: "Pages/Reserve/Detail",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx
index 3f384966b..02bc6f6df 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/TipInfo.tsx
@@ -15,8 +15,8 @@
  */
 import { format } from "date-fns";
 import { Fragment, h, VNode } from "preact";
-import { useBackendContext } from "../../../../context/backend";
-import { MerchantBackend } from "../../../../declaration";
+import { useBackendContext } from "../../../../context/backend.js";
+import { MerchantBackend } from "../../../../declaration.js";
 
 type Entity = MerchantBackend.Tips.TipDetails;
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/index.tsx
index c2483f053..882c2adac 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/details/index.tsx
@@ -20,10 +20,10 @@
  */
 
 import { Fragment, h, VNode } from "preact";
-import { Loading } from "../../../../components/exception/loading";
-import { HttpError } from "../../../../hooks/backend";
-import { useReserveDetails } from "../../../../hooks/reserves";
-import { DetailPage } from "./DetailPage";
+import { Loading } from "../../../../components/exception/loading.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { useReserveDetails } from "../../../../hooks/reserves.js";
+import { DetailPage } from "./DetailPage.js";
 
 interface Props {
   rid: string;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx
index ec468b2e9..e72bfa1f7 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/AutorizeTipModal.tsx
@@ -21,14 +21,14 @@
 
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { FormErrors, FormProvider } from 
"../../../../components/form/FormProvider";
-import { Input } from "../../../../components/form/Input";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { ConfirmModal, ContinueModal } from "../../../../components/modal";
-import { MerchantBackend } from "../../../../declaration";
-import { useTranslator } from "../../../../i18n";
-import { AuthorizeTipSchema } from "../../../../schemas";
-import { CreatedSuccessfully } from "./CreatedSuccessfully";
+import { FormErrors, FormProvider } from 
"../../../../components/form/FormProvider.js";
+import { Input } from "../../../../components/form/Input.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { ConfirmModal, ContinueModal } from 
"../../../../components/modal/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { useTranslator } from "../../../../i18n/index.js";
+import { AuthorizeTipSchema } from "../../../../schemas/index.js";
+import { CreatedSuccessfully } from "./CreatedSuccessfully.js";
 import * as yup from 'yup';
 
 interface AuthorizeTipModalProps {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx
index 1e5f0758f..92a21bfd1 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/CreatedSuccessfully.tsx
@@ -15,8 +15,8 @@
  */
 import { format } from "date-fns";
 import { Fragment, h, VNode } from "preact";
-import { CreatedSuccessfully as Template } from 
"../../../../components/notifications/CreatedSuccessfully";
-import { MerchantBackend } from "../../../../declaration";
+import { CreatedSuccessfully as Template } from 
"../../../../components/notifications/CreatedSuccessfully.js";
+import { MerchantBackend } from "../../../../declaration.js";
 
 type Entity = MerchantBackend.Tips.TipCreateConfirmation;
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx
index 1cb9e748c..7a4e9ff42 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/List.stories.tsx
@@ -20,7 +20,7 @@
  */
 
 import { h, VNode, FunctionalComponent } from "preact";
-import { CardTable as TestedComponent } from "./Table";
+import { CardTable as TestedComponent } from "./Table.js";
 
 export default {
   title: "Pages/Reserve/List",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx
index b3bb7b020..0d094d9aa 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/Table.tsx
@@ -21,8 +21,8 @@
 
 import { format } from "date-fns";
 import { Fragment, h, VNode } from "preact";
-import { MerchantBackend, WithId } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
 
 type Entity = MerchantBackend.Tips.ReserveStatusEntry & WithId;
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx
index f071b5635..9d0b4054d 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/reserves/list/index.tsx
@@ -21,18 +21,18 @@
 
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Loading } from "../../../../components/exception/loading";
-import { NotificationCard } from "../../../../components/menu";
-import { MerchantBackend } from "../../../../declaration";
-import { HttpError } from "../../../../hooks/backend";
+import { Loading } from "../../../../components/exception/loading.js";
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { HttpError } from "../../../../hooks/backend.js";
 import {
   useInstanceReserves,
   useReservesAPI,
-} from "../../../../hooks/reserves";
-import { useTranslator } from "../../../../i18n";
-import { Notification } from "../../../../utils/types";
-import { CardTable } from "./Table";
-import { AuthorizeTipModal } from "./AutorizeTipModal";
+} from "../../../../hooks/reserves.js";
+import { useTranslator } from "../../../../i18n/index.js";
+import { Notification } from "../../../../utils/types.js";
+import { CardTable } from "./Table.js";
+import { AuthorizeTipModal } from "./AutorizeTipModal.js";
 
 interface Props {
   onUnauthorized: () => VNode;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx
index 535cb1e37..a21fe8e5b 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/Create.stories.tsx
@@ -20,7 +20,7 @@
 */
 
 import { h, VNode, FunctionalComponent } from 'preact';
-import { CreatePage as TestedComponent } from './CreatePage';
+import { CreatePage as TestedComponent } from "./CreatePage.js";
 
 
 export default {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx
index d0f5c5e95..15860381c 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/CreatePage.tsx
@@ -21,15 +21,15 @@
 
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { AsyncButton } from "../../../../components/exception/AsyncButton";
-import { FormErrors, FormProvider } from 
"../../../../components/form/FormProvider";
-import { Input } from "../../../../components/form/Input";
-import { InputCurrency } from "../../../../components/form/InputCurrency";
-import { InputSelector } from "../../../../components/form/InputSelector";
-import { useConfigContext } from "../../../../context/config";
-import { MerchantBackend } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
-import { CROCKFORD_BASE32_REGEX, URL_REGEX } from 
"../../../../utils/constants";
+import { AsyncButton } from "../../../../components/exception/AsyncButton.js";
+import { FormErrors, FormProvider } from 
"../../../../components/form/FormProvider.js";
+import { Input } from "../../../../components/form/Input.js";
+import { InputCurrency } from "../../../../components/form/InputCurrency.js";
+import { InputSelector } from "../../../../components/form/InputSelector.js";
+import { useConfigContext } from "../../../../context/config.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
+import { CROCKFORD_BASE32_REGEX, URL_REGEX } from 
"../../../../utils/constants.js";
 
 type Entity = MerchantBackend.Transfers.TransferInformation
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx
index d95929a0e..0d3676096 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/create/index.tsx
@@ -21,13 +21,13 @@
 
 import { Fragment, h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { NotificationCard } from '../../../../components/menu';
-import { MerchantBackend } from '../../../../declaration';
-import { useInstanceDetails } from '../../../../hooks/instance';
-import { useTransferAPI } from '../../../../hooks/transfer';
-import { useTranslator } from '../../../../i18n';
-import { Notification } from '../../../../utils/types';
-import { CreatePage } from './CreatePage';
+import { NotificationCard } from "../../../../components/menu/index.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { useInstanceDetails } from "../../../../hooks/instance.js";
+import { useTransferAPI } from "../../../../hooks/transfer.js";
+import { useTranslator } from '../../../../i18n/index.js';
+import { Notification } from "../../../../utils/types.js";
+import { CreatePage } from "./CreatePage.js";
 
 export type Entity = MerchantBackend.Transfers.TransferInformation
 interface Props {
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx
index 24a791187..94d03a492 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/List.stories.tsx
@@ -20,7 +20,7 @@
  */
 
 import { h, VNode, FunctionalComponent } from "preact";
-import { ListPage as TestedComponent } from "./ListPage";
+import { ListPage as TestedComponent } from "./ListPage.js";
 
 export default {
   title: "Pages/Transfer/List",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx
index 544a720b8..25f9ff95c 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/ListPage.tsx
@@ -20,11 +20,11 @@
 */
 
 import { h, VNode } from 'preact';
-import { FormProvider } from '../../../../components/form/FormProvider';
-import { InputSelector } from '../../../../components/form/InputSelector';
-import { MerchantBackend } from '../../../../declaration';
-import { Translate, useTranslator } from '../../../../i18n';
-import { CardTable } from './Table';
+import { FormProvider } from "../../../../components/form/FormProvider.js";
+import { InputSelector } from "../../../../components/form/InputSelector.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { Translate, useTranslator } from '../../../../i18n/index.js';
+import { CardTable } from "./Table.js";
 
 export interface Props {
   transfers: MerchantBackend.Transfers.TransferDetails[];
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx
index 4cb04694d..26cb1ff83 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/Table.tsx
@@ -22,8 +22,8 @@
 import { format } from "date-fns";
 import { h, VNode } from "preact";
 import { StateUpdater, useState } from "preact/hooks";
-import { MerchantBackend, WithId } from "../../../../declaration";
-import { Translate, useTranslator } from "../../../../i18n";
+import { MerchantBackend, WithId } from "../../../../declaration.js";
+import { Translate, useTranslator } from "../../../../i18n/index.js";
 
 type Entity = MerchantBackend.Transfers.TransferDetails & WithId;
 
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx
index d8e2f60e9..c3079c136 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/transfers/list/index.tsx
@@ -21,12 +21,12 @@
 
 import { h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
-import { Loading } from '../../../../components/exception/loading';
-import { MerchantBackend } from '../../../../declaration';
-import { HttpError } from '../../../../hooks/backend';
-import { useInstanceDetails } from '../../../../hooks/instance';
-import { useInstanceTransfers } from "../../../../hooks/transfer";
-import { ListPage } from './ListPage';
+import { Loading } from "../../../../components/exception/loading.js";
+import { MerchantBackend } from "../../../../declaration.js";
+import { HttpError } from "../../../../hooks/backend.js";
+import { useInstanceDetails } from "../../../../hooks/instance.js";
+import { useInstanceTransfers } from "../../../../hooks/transfer.js";
+import { ListPage } from "./ListPage.js";
 
 interface Props {
   onUnauthorized: () => VNode;
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx
index 3239d9c5c..8c4717275 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/update/Update.stories.tsx
@@ -20,7 +20,7 @@
  */
 
 import { h, VNode, FunctionalComponent } from "preact";
-import { UpdatePage as TestedComponent } from "./UpdatePage";
+import { UpdatePage as TestedComponent } from "./UpdatePage.js";
 
 export default {
   title: "Pages/Instance/Update",
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx
index 4c7a51121..b5328249a 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx
@@ -22,19 +22,19 @@
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
 import * as yup from "yup";
-import { AsyncButton } from "../../../components/exception/AsyncButton";
+import { AsyncButton } from "../../../components/exception/AsyncButton.js";
 import {
   FormProvider,
   FormErrors,
-} from "../../../components/form/FormProvider";
-import { UpdateTokenModal } from "../../../components/modal";
-import { useInstanceContext } from "../../../context/instance";
-import { MerchantBackend } from "../../../declaration";
-import { Translate, useTranslator } from "../../../i18n";
-import { InstanceUpdateSchema as schema } from "../../../schemas";
-import { DefaultInstanceFormFields } from 
"../../../components/instance/DefaultInstanceFormFields";
-import { PAYTO_REGEX } from "../../../utils/constants";
+} from "../../../components/form/FormProvider.js";
+import { UpdateTokenModal } from "../../../components/modal/index.js";
+import { useInstanceContext } from "../../../context/instance.js";
+import { MerchantBackend } from "../../../declaration.js";
+import { Translate, useTranslator } from "../../../i18n/index.js";
+import { DefaultInstanceFormFields } from 
"../../../components/instance/DefaultInstanceFormFields.js";
+import { PAYTO_REGEX } from "../../../utils/constants.js";
 import { Amounts } from "@gnu-taler/taler-util";
+import { undefinedIfEmpty } from "../../../utils/table.js";
 
 type Entity = MerchantBackend.Instances.InstanceReconfigurationMessage & {
   auth_token?: string;
@@ -71,12 +71,6 @@ function getTokenValuePart(t?: string): string | undefined {
   return match[1];
 }
 
-function undefinedIfEmpty<T>(obj: T): T | undefined {
-  return Object.keys(obj).some((k) => (obj as any)[k] !== undefined)
-    ? obj
-    : undefined;
-}
-
 export function UpdatePage({
   onUpdate,
   onChangeAuth,
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx
index bd5f4c727..c0780fadf 100644
--- a/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/instance/update/index.tsx
@@ -15,20 +15,20 @@
  */
 import { Fragment, h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { Loading } from "../../../components/exception/loading";
-import { NotificationCard } from "../../../components/menu";
-import { useInstanceContext } from "../../../context/instance";
-import { MerchantBackend } from "../../../declaration";
-import { HttpError, HttpResponse } from "../../../hooks/backend";
+import { Loading } from "../../../components/exception/loading.js";
+import { NotificationCard } from "../../../components/menu/index.js";
+import { useInstanceContext } from "../../../context/instance.js";
+import { MerchantBackend } from "../../../declaration.js";
+import { HttpError, HttpResponse } from "../../../hooks/backend.js";
 import {
   useInstanceAPI,
   useInstanceDetails,
   useManagedInstanceDetails,
   useManagementAPI,
-} from "../../../hooks/instance";
-import { useTranslator } from "../../../i18n";
-import { Notification } from "../../../utils/types";
-import { UpdatePage } from "./UpdatePage";
+} from "../../../hooks/instance.js";
+import { useTranslator } from "../../../i18n/index.js";
+import { Notification } from "../../../utils/types.js";
+import { UpdatePage } from "./UpdatePage.js";
 
 export interface Props {
   onBack: () => void;
diff --git a/packages/merchant-backoffice-ui/src/paths/login/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/login/index.tsx
index acad7fe0b..ac75e094f 100644
--- a/packages/merchant-backoffice-ui/src/paths/login/index.tsx
+++ b/packages/merchant-backoffice-ui/src/paths/login/index.tsx
@@ -19,7 +19,7 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import { h, VNode } from "preact";
-import { LoginModal } from '../../components/exception/login';
+import { LoginModal } from "../../components/exception/login.js";
 
 interface Props {
   onConfirm: (url: string, token?: string) => void;
diff --git a/packages/merchant-backoffice-ui/src/schemas/index.ts 
b/packages/merchant-backoffice-ui/src/schemas/index.ts
index 00e80199a..0f705c555 100644
--- a/packages/merchant-backoffice-ui/src/schemas/index.ts
+++ b/packages/merchant-backoffice-ui/src/schemas/index.ts
@@ -21,7 +21,7 @@
 
 import { isAfter, isFuture } from 'date-fns';
 import * as yup from 'yup';
-import { AMOUNT_REGEX, PAYTO_REGEX } from "../utils/constants";
+import { AMOUNT_REGEX, PAYTO_REGEX } from "../utils/constants.js";
 
 yup.setLocale({
   mixed: {
diff --git a/packages/merchant-backoffice-ui/src/utils/amount.ts 
b/packages/merchant-backoffice-ui/src/utils/amount.ts
index 1cfd5c1d1..575d70d87 100644
--- a/packages/merchant-backoffice-ui/src/utils/amount.ts
+++ b/packages/merchant-backoffice-ui/src/utils/amount.ts
@@ -14,7 +14,7 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 import { amountFractionalBase, AmountJson, Amounts } from 
"@gnu-taler/taler-util";
-import { MerchantBackend } from "../declaration";
+import { MerchantBackend } from "../declaration.js";
 
 /**
  * sums two prices,
diff --git a/packages/merchant-backoffice-ui/src/utils/table.ts 
b/packages/merchant-backoffice-ui/src/utils/table.ts
index 198c46543..199e5fda5 100644
--- a/packages/merchant-backoffice-ui/src/utils/table.ts
+++ b/packages/merchant-backoffice-ui/src/utils/table.ts
@@ -14,7 +14,7 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { WithId } from "../declaration";
+import { WithId } from "../declaration.js";
 
 /**
 *
@@ -35,3 +35,19 @@ export function buildActions<T extends WithId>(instances: 
T[], selected: string[
     .filter(notEmpty)
     .map(id => ({ element: id, type: action }))
 }
+
+/**
+ * For any object or array, return the same object if is not empty.
+ * not empty: 
+ *  - for arrays: at least one element not undefined
+ *  - for objects: at least one property not undefined
+ * @param obj 
+ * @returns 
+ */
+export function undefinedIfEmpty<T extends Record<string, 
unknown>|Array<unknown>>(obj: T): T | undefined {
+  if (obj === undefined) return undefined
+  return Object.values(obj).some((v) => v !== undefined)
+    ? obj
+    : undefined;
+}
+
diff --git a/packages/merchant-backoffice-ui/tests/axiosMock.ts 
b/packages/merchant-backoffice-ui/tests/axiosMock.ts
index 13ddab598..5bb8694c9 100644
--- a/packages/merchant-backoffice-ui/tests/axiosMock.ts
+++ b/packages/merchant-backoffice-ui/tests/axiosMock.ts
@@ -19,9 +19,9 @@
 * @author Sebastian Javier Marchano (sebasjm)
 */
 import * as axios from 'axios';
-import { MerchantBackend } from '../src/declaration';
-import { mockAxiosOnce, setAxiosRequestAsTestingEnvironment } from 
'../src/utils/switchableAxios';
-// import { mockAxiosOnce, setAxiosRequestAsTestingEnvironment } from 
"../src/hooks/backend";
+import { MerchantBackend } from "../src/declaration.js";
+import { mockAxiosOnce, setAxiosRequestAsTestingEnvironment } from 
"../src/utils/switchableAxios.js";
+// import { mockAxiosOnce, setAxiosRequestAsTestingEnvironment } from 
"../src/hooks/backend.js";
 
 export type Query<Req, Res> = (GetQuery | PostQuery | DeleteQuery | 
PatchQuery) & RequestResponse<Req, Res>
 
diff --git a/packages/merchant-backoffice-ui/tests/context/backend.test.tsx 
b/packages/merchant-backoffice-ui/tests/context/backend.test.tsx
index b7b50fd47..5e80d4adb 100644
--- a/packages/merchant-backoffice-ui/tests/context/backend.test.tsx
+++ b/packages/merchant-backoffice-ui/tests/context/backend.test.tsx
@@ -22,14 +22,14 @@
 import { renderHook } from "@testing-library/preact-hooks";
 import { ComponentChildren, h, VNode } from "preact";
 import { act } from "preact/test-utils";
-import { BackendContextProvider } from "../../src/context/backend";
-import { InstanceContextProvider } from "../../src/context/instance";
-import { MerchantBackend } from "../../src/declaration";
+import { BackendContextProvider } from "../../src/context/backend.js";
+import { InstanceContextProvider } from "../../src/context/instance.js";
+import { MerchantBackend } from "../../src/declaration.js";
 import {
   useAdminAPI,
   useInstanceAPI,
   useManagementAPI,
-} from "../../src/hooks/instance";
+} from "../../src/hooks/instance.js";
 import {
   API_CREATE_INSTANCE,
   API_GET_CURRENT_INSTANCE,
@@ -37,7 +37,7 @@ import {
   API_UPDATE_INSTANCE_AUTH_BY_ID,
   assertJustExpectedRequestWereMade,
   AxiosMockEnvironment,
-} from "../axiosMock";
+} from "../axiosMock.js";
 
 interface TestingContextProps {
   children?: ComponentChildren;
diff --git a/packages/merchant-backoffice-ui/tests/functions/regex.test.ts 
b/packages/merchant-backoffice-ui/tests/functions/regex.test.ts
index fc8a6a42f..ed06fb655 100644
--- a/packages/merchant-backoffice-ui/tests/functions/regex.test.ts
+++ b/packages/merchant-backoffice-ui/tests/functions/regex.test.ts
@@ -19,7 +19,7 @@
  * @author Sebastian Javier Marchano (sebasjm)
  */
 
-import { AMOUNT_REGEX, PAYTO_REGEX } from "../../src/utils/constants";
+import { AMOUNT_REGEX, PAYTO_REGEX } from "../../src/utils/constants.js";
 
 describe('payto uri format', () => {
   const valids = [
diff --git a/packages/merchant-backoffice-ui/tests/header.test.tsx 
b/packages/merchant-backoffice-ui/tests/header.test.tsx
index f098b70d5..d855346de 100644
--- a/packages/merchant-backoffice-ui/tests/header.test.tsx
+++ b/packages/merchant-backoffice-ui/tests/header.test.tsx
@@ -20,12 +20,12 @@
  */
 
 import { h } from "preact";
-import { ProductList } from "../src/components/product/ProductList";
+import { ProductList } from "../src/components/product/ProductList.js";
 // See: https://github.com/preactjs/enzyme-adapter-preact-pure
 // import { shallow } from 'enzyme';
-import * as backend from "../src/context/config";
+import * as backend from "../src/context/config.js";
 import { render, findAllByText } from "@testing-library/preact";
-import * as i18n from "../src/context/translation";
+import * as i18n from "../src/context/translation.js";
 
 import * as jedLib from "jed";
 const handler = new jedLib.Jed("en");
@@ -54,7 +54,7 @@ describe("Initial Test of the Sidebar", () => {
             unit: "book",
           },
         ]}
-      />
+      />,
     );
 
     expect(context.findAllByText("description of the product")).toBeDefined();
diff --git a/packages/merchant-backoffice-ui/tests/hooks/async.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/async.test.ts
index a6d0cddfa..ebdfc9bb9 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/async.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/async.test.ts
@@ -15,7 +15,7 @@
  */
 
 import { renderHook } from "@testing-library/preact-hooks"
-import { useAsync } from "../../src/hooks/async"
+import { useAsync } from "../../src/hooks/async.js"
 
 /**
 *
diff --git a/packages/merchant-backoffice-ui/tests/hooks/listener.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/listener.test.ts
index ae34c1339..597243f76 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/listener.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/listener.test.ts
@@ -20,7 +20,7 @@
 */
 
 import { renderHook, act } from '@testing-library/preact-hooks';
-import { useListener } from '../../src/hooks/listener';
+import { useListener } from "../../src/hooks/listener.js";
 
 // jest.useFakeTimers()
 
@@ -37,8 +37,8 @@ test('listener', async () => {
 
   const { result } = renderHook(() => useListener(addWorldToTheEnd))
 
+  expect(result.current).toBeDefined()
   if (!result.current) {
-    expect(result.current).toBeDefined()
     return;
   }
 
diff --git a/packages/merchant-backoffice-ui/tests/hooks/notification.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/notification.test.ts
index 561c991ad..75cfcd015 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/notification.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/notification.test.ts
@@ -20,7 +20,7 @@
  */
 
 import { renderHook, act} from '@testing-library/preact-hooks';
-import { useNotifications } from '../../src/hooks/notifications';
+import { useNotifications } from "../../src/hooks/notifications.js";
 
 jest.useFakeTimers()
 
diff --git a/packages/merchant-backoffice-ui/tests/hooks/swr/index.tsx 
b/packages/merchant-backoffice-ui/tests/hooks/swr/index.tsx
index 44514855d..655081711 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/swr/index.tsx
+++ b/packages/merchant-backoffice-ui/tests/hooks/swr/index.tsx
@@ -21,13 +21,14 @@
 
 import { ComponentChildren, h, VNode } from "preact";
 import { SWRConfig } from "swr";
-import { BackendContextProvider } from "../../../src/context/backend";
-import { InstanceContextProvider } from "../../../src/context/instance";
+import { BackendContextProvider } from "../../../src/context/backend.js";
+import { InstanceContextProvider } from "../../../src/context/instance.js";
 
 interface TestingContextProps {
   children?: ComponentChildren;
 }
 export function TestingContext({ children }: TestingContextProps): VNode {
+  const SC: any = SWRConfig
   return (
     <BackendContextProvider defaultUrl="http://backend"; initialToken="token">
       <InstanceContextProvider
@@ -38,7 +39,7 @@ export function TestingContext({ children }: 
TestingContextProps): VNode {
           changeToken: () => null,
         }}
       >
-        <SWRConfig value={{ provider: () => new Map() }}>{children}</SWRConfig>
+        <SC value={{ provider: () => new Map() }}>{children}</SC>
       </InstanceContextProvider>
     </BackendContextProvider>
   );
diff --git a/packages/merchant-backoffice-ui/tests/hooks/swr/instance.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/swr/instance.test.ts
index 55d9fa6ee..2a1fd76ee 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/swr/instance.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/swr/instance.test.ts
@@ -21,8 +21,8 @@
 
 import { renderHook } from "@testing-library/preact-hooks";
 import { act } from "preact/test-utils";
-import { MerchantBackend } from "../../../src/declaration";
-import { useAdminAPI, useBackendInstances, useInstanceAPI, useInstanceDetails, 
useManagementAPI } from "../../../src/hooks/instance";
+import { MerchantBackend } from "../../../src/declaration.js";
+import { useAdminAPI, useBackendInstances, useInstanceAPI, useInstanceDetails, 
useManagementAPI } from "../../../src/hooks/instance.js";
 import {
   API_CREATE_INSTANCE,
   API_DELETE_INSTANCE,
@@ -34,10 +34,10 @@ import {
   API_UPDATE_INSTANCE_BY_ID,
   assertJustExpectedRequestWereMade,
   AxiosMockEnvironment
-} from "../../axiosMock";
-import { TestingContext } from "./index";
+} from "../../axiosMock.js";
+import { TestingContext } from "./index.js";
 
-describe("instance api interaction with details ", () => {
+describe("instance api interaction with details", () => {
 
   it("should evict cache when updating an instance", async () => {
 
@@ -59,8 +59,8 @@ describe("instance api interaction with details ", () => {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -135,8 +135,8 @@ describe("instance api interaction with details ", () => {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -222,8 +222,8 @@ describe("instance api interaction with details ", () => {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -284,7 +284,7 @@ describe("instance api interaction with details ", () => {
   });
 });
 
-describe("instance admin api interaction with listing ", () => {
+describe("instance admin api interaction with listing", () => {
 
   it("should evict cache when creating a new instance", async () => {
     const env = new AxiosMockEnvironment();
@@ -307,8 +307,8 @@ describe("instance admin api interaction with listing ", () 
=> {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -397,8 +397,8 @@ describe("instance admin api interaction with listing ", () 
=> {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -481,8 +481,8 @@ describe("instance admin api interaction with listing ", () 
=> {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -545,7 +545,7 @@ describe("instance admin api interaction with listing ", () 
=> {
   });
 });
 
-describe("instance management api interaction with listing ", () => {
+describe("instance management api interaction with listing", () => {
 
   it("should evict cache when updating an instance", async () => {
     const env = new AxiosMockEnvironment();
@@ -569,8 +569,8 @@ describe("instance management api interaction with listing 
", () => {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
diff --git a/packages/merchant-backoffice-ui/tests/hooks/swr/order.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/swr/order.test.ts
index e7f6c9334..31444d942 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/swr/order.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/swr/order.test.ts
@@ -22,15 +22,15 @@
 import { renderHook } from "@testing-library/preact-hooks";
 import { act } from "preact/test-utils";
 import { TestingContext } from ".";
-import { MerchantBackend } from "../../../src/declaration";
-import { useInstanceOrders, useOrderAPI, useOrderDetails } from 
"../../../src/hooks/order";
+import { MerchantBackend } from "../../../src/declaration.js";
+import { useInstanceOrders, useOrderAPI, useOrderDetails } from 
"../../../src/hooks/order.js";
 import {
   API_CREATE_ORDER,
   API_DELETE_ORDER,
   API_FORGET_ORDER_BY_ID,
   API_GET_ORDER_BY_ID,
   API_LIST_ORDERS, API_REFUND_ORDER_BY_ID, assertJustExpectedRequestWereMade, 
assertNextRequest, assertNoMoreRequestWereMade, AxiosMockEnvironment
-} from "../../axiosMock";
+} from "../../axiosMock.js";
 
 describe("order api interaction with listing", () => {
 
@@ -62,8 +62,8 @@ describe("order api interaction with listing", () => {
       return { query, api };
     }, { wrapper: TestingContext });
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
 
@@ -143,8 +143,8 @@ describe("order api interaction with listing", () => {
       return { query, api };
     }, { wrapper: TestingContext });
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
 
@@ -234,8 +234,8 @@ describe("order api interaction with listing", () => {
       return { query, api };
     }, { wrapper: TestingContext });
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
 
@@ -305,8 +305,8 @@ describe("order api interaction with details", () => {
       return { query, api };
     }, { wrapper: TestingContext });
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
 
@@ -374,8 +374,8 @@ describe("order api interaction with details", () => {
       return { query, api };
     }, { wrapper: TestingContext });
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
 
diff --git a/packages/merchant-backoffice-ui/tests/hooks/swr/product.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/swr/product.test.ts
index 5d39a7c47..3ea03e3c7 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/swr/product.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/swr/product.test.ts
@@ -22,8 +22,8 @@
 import { renderHook } from "@testing-library/preact-hooks";
 import { act } from "preact/test-utils";
 import { TestingContext } from ".";
-import { MerchantBackend } from "../../../src/declaration";
-import { useInstanceProducts, useProductAPI, useProductDetails } from 
"../../../src/hooks/product";
+import { MerchantBackend } from "../../../src/declaration.js";
+import { useInstanceProducts, useProductAPI, useProductDetails } from 
"../../../src/hooks/product.js";
 import {
   API_CREATE_PRODUCT,
   API_DELETE_PRODUCT, API_GET_PRODUCT_BY_ID,
@@ -32,9 +32,9 @@ import {
   assertJustExpectedRequestWereMade,
   assertNextRequest,
   AxiosMockEnvironment
-} from "../../axiosMock";
+} from "../../axiosMock.js";
 
-describe("product api interaction with listing ", () => {
+describe("product api interaction with listing", () => {
   it("should evict cache when creating a product", async () => {
     const env = new AxiosMockEnvironment();
 
@@ -56,8 +56,8 @@ describe("product api interaction with listing ", () => {
       { wrapper: TestingContext }
     ); // get products -> loading
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -141,8 +141,8 @@ describe("product api interaction with listing ", () => {
       { wrapper: TestingContext }
     ); // get products -> loading
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -218,8 +218,8 @@ describe("product api interaction with listing ", () => {
       { wrapper: TestingContext }
     ); // get products -> loading
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -289,8 +289,8 @@ describe("product api interaction with details", () => {
       return { query, api };
     }, { wrapper: TestingContext });
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
diff --git a/packages/merchant-backoffice-ui/tests/hooks/swr/reserve.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/swr/reserve.test.ts
index 0361c54e8..deae9d389 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/swr/reserve.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/swr/reserve.test.ts
@@ -21,13 +21,13 @@
 
 import { renderHook } from "@testing-library/preact-hooks";
 import { act } from "preact/test-utils";
-import { MerchantBackend } from "../../../src/declaration";
+import { MerchantBackend } from "../../../src/declaration.js";
 import {
   useInstanceReserves,
   useReserveDetails,
   useReservesAPI,
   useTipDetails,
-} from "../../../src/hooks/reserves";
+} from "../../../src/hooks/reserves.js";
 import {
   API_AUTHORIZE_TIP,
   API_AUTHORIZE_TIP_FOR_RESERVE,
@@ -38,10 +38,10 @@ import {
   API_LIST_RESERVES,
   assertJustExpectedRequestWereMade,
   AxiosMockEnvironment,
-} from "../../axiosMock";
-import { TestingContext } from "./index";
+} from "../../axiosMock.js";
+import { TestingContext } from "./index.js";
 
-describe("reserve api interaction with listing ", () => {
+describe("reserve api interaction with listing", () => {
   it("should evict cache when creating a reserve", async () => {
     const env = new AxiosMockEnvironment();
 
@@ -65,8 +65,8 @@ describe("reserve api interaction with listing ", () => {
       { wrapper: TestingContext }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -171,8 +171,8 @@ describe("reserve api interaction with listing ", () => {
       }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -260,8 +260,8 @@ describe("reserve api interaction with details", () => {
       }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -353,8 +353,8 @@ describe("reserve api interaction with details", () => {
       }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
@@ -448,8 +448,8 @@ describe("reserve api interaction with tip details", () => {
       }
     );
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
     expect(result.current.query.loading).toBeTruthy();
diff --git a/packages/merchant-backoffice-ui/tests/hooks/swr/transfer.test.ts 
b/packages/merchant-backoffice-ui/tests/hooks/swr/transfer.test.ts
index 612cf8842..45efea04c 100644
--- a/packages/merchant-backoffice-ui/tests/hooks/swr/transfer.test.ts
+++ b/packages/merchant-backoffice-ui/tests/hooks/swr/transfer.test.ts
@@ -20,16 +20,16 @@
  */
 
 import { act, renderHook } from "@testing-library/preact-hooks";
-import { TestingContext } from "./index";
-import { useInstanceTransfers, useTransferAPI } from 
"../../../src/hooks/transfer";
+import { TestingContext } from "./index.js";
+import { useInstanceTransfers, useTransferAPI } from 
"../../../src/hooks/transfer.js";
 import {
   API_INFORM_TRANSFERS,
   API_LIST_TRANSFERS,
   assertJustExpectedRequestWereMade,
   assertNoMoreRequestWereMade,
   AxiosMockEnvironment,
-} from "../../axiosMock";
-import { MerchantBackend } from "../../../src/declaration";
+} from "../../axiosMock.js";
+import { MerchantBackend } from "../../../src/declaration.js";
 
 describe("transfer api interaction with listing", () => {
 
@@ -62,8 +62,8 @@ describe("transfer api interaction with listing", () => {
       return { query, api };
     }, { wrapper: TestingContext });
 
+    expect(result.current).toBeDefined();
     if (!result.current) {
-      expect(result.current).toBeDefined();
       return;
     }
 
diff --git a/packages/merchant-backoffice-ui/tests/stories.test.tsx 
b/packages/merchant-backoffice-ui/tests/stories.test.tsx
index 5fb3483d2..b53b703e9 100644
--- a/packages/merchant-backoffice-ui/tests/stories.test.tsx
+++ b/packages/merchant-backoffice-ui/tests/stories.test.tsx
@@ -19,8 +19,8 @@
  * @author Sebastian Javier Marchano (sebasjm)
  */
 import { h, VNode } from "preact";
-import * as config from "../src/context/config";
-import * as i18n from "../src/context/translation";
+import * as config from "../src/context/config.js";
+import * as i18n from "../src/context/translation.js";
 import { cleanup, render as originalRender } from "@testing-library/preact";
 import { SWRConfig } from "swr";
 
@@ -42,14 +42,11 @@ function getFiles(dir: string, files_: string[] = []) {
 const STORIES_NAME_REGEX = RegExp(".*.stories.tsx");
 
 function render(vnode: VNode) {
+  const SC: any = SWRConfig
   return originalRender(
-    <SWRConfig
-      value={{
-        provider: () => new Map(),
-      }}
-    >
+    <SC value={{ provider: () => new Map() }}>
       {vnode}
-    </SWRConfig>
+    </SC>,
   );
 }
 
diff --git a/packages/merchant-backoffice-ui/tsconfig.json 
b/packages/merchant-backoffice-ui/tsconfig.json
index dfb87582a..a0f25cba2 100644
--- a/packages/merchant-backoffice-ui/tsconfig.json
+++ b/packages/merchant-backoffice-ui/tsconfig.json
@@ -1,10 +1,10 @@
 {
     "compilerOptions": {
         /* Basic Options */
-        "target": "ES5",                          /* Specify ECMAScript target 
version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
+        "target": "ES6",                          /* Specify ECMAScript target 
version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */
         "module": "ESNext",                       /* Specify module code 
generation: 'none', commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
-        // "lib": [],                             /* Specify library files to 
be included in the compilation:  */
-        "allowJs": true,                          /* Allow javascript files to 
be compiled. */
+        "lib": ["es2021","dom"],                             /* Specify 
library files to be included in the compilation:  */
+        // "allowJs": true,                          /* Allow javascript files 
to be compiled. */
         // "checkJs": true,                       /* Report errors in .js 
files. */
         "jsx": "react",                           /* Specify JSX code 
generation: 'preserve', 'react-native', or 'react'. */
         "jsxFactory": "h",                        /* Specify the JSX factory 
function to use when targeting react JSX emit, e.g. React.createElement or h. */
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f68d3d850..afbbd59f8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -341,6 +341,7 @@ importers:
       '@types/history': ^4.7.8
       '@types/jest': ^26.0.23
       '@types/mocha': ^8.2.2
+      '@types/node': ^18.8.5
       '@typescript-eslint/eslint-plugin': ^4.22.0
       '@typescript-eslint/parser': ^4.22.0
       axios: ^0.21.1
@@ -353,7 +354,7 @@ importers:
       bulma-switch-control: ^1.1.1
       bulma-timeline: ^3.0.4
       bulma-upload-control: ^1.2.0
-      date-fns: ^2.21.1
+      date-fns: 2.29.3
       dotenv: ^8.2.0
       eslint: ^7.25.0
       eslint-config-preact: ^1.1.4
@@ -363,22 +364,23 @@ importers:
       html-webpack-inline-source-plugin: 0.0.10
       html-webpack-skip-assets-plugin: ^1.0.1
       inline-chunk-html-plugin: ^1.1.1
-      jed: ^1.1.1
+      jed: 1.1.1
       jest: ^26.6.3
       jest-preset-preact: ^4.0.2
       po2json: ^0.4.5
-      preact: 10.6.1
+      preact: 10.6.5
       preact-cli: ^3.0.5
       preact-render-to-json: ^3.6.6
       preact-render-to-string: ^5.1.19
-      preact-router: ^3.2.1
-      qrcode-generator: ^1.4.4
+      preact-router: 3.2.1
+      qrcode-generator: 1.4.4
+      react: npm:@preact/compat@^17.1.2
       rimraf: ^3.0.2
       sass: ^1.32.13
       sass-loader: 10.1.1
       script-ext-html-webpack-plugin: ^2.1.5
       sirv-cli: ^1.0.11
-      swr: 1.1.0
+      swr: 1.3.0
       typedoc: ^0.20.36
       typescript: ^4.2.4
       yup: ^0.32.9
@@ -388,27 +390,29 @@ importers:
       date-fns: 2.29.3
       history: 4.10.1
       jed: 1.1.1
-      preact: 10.6.1
-      preact-router: 3.2.1_preact@10.6.1
+      preact: 10.6.5
+      preact-router: 3.2.1_preact@10.6.5
       qrcode-generator: 1.4.4
-      swr: 1.1.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      swr: 1.3.0_@preact+compat@17.1.2
       yup: 0.32.11
     devDependencies:
       '@babel/core': 7.18.9
       '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.18.9
       '@creativebulma/bulma-tooltip': 1.2.0
       '@gnu-taler/pogen': link:../pogen
-      '@storybook/addon-a11y': 6.5.13
-      '@storybook/addon-actions': 6.5.13
-      '@storybook/addon-essentials': 6.5.13_dazlt7ye7nu7xsezygxn7bviwy
-      '@storybook/addon-links': 6.5.13
-      '@storybook/preact': 6.5.13_pq7cousu3rtgfnoj6unnfcty2q
+      '@storybook/addon-a11y': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addon-actions': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addon-essentials': 6.5.13_2nt5iz47gcdduxcnvfnexph4hq
+      '@storybook/addon-links': 6.5.13_@preact+compat@17.1.2
+      '@storybook/preact': 6.5.13_xa5zyoe4qu34opzfrw5imxak3u
       '@storybook/preset-scss': 1.0.3_sass-loader@10.1.1
-      '@testing-library/preact': 2.0.1_preact@10.6.1
-      '@testing-library/preact-hooks': 1.1.0_p7poi7nh2j5v3fg73wd3em3ise
+      '@testing-library/preact': 2.0.1_preact@10.6.5
+      '@testing-library/preact-hooks': 1.1.0_vfcmu6iy7nffpurikpgxo6gwxi
       '@types/history': 4.7.11
       '@types/jest': 26.0.24
       '@types/mocha': 8.2.3
+      '@types/node': 18.11.5
       '@typescript-eslint/eslint-plugin': 4.33.0_k4l66av2tbo6kxzw52jzgbfzii
       '@typescript-eslint/parser': 4.33.0_3rubbgt5ekhqrcgx4uwls3neim
       babel-loader: 8.2.5_@babel+core@7.18.9
@@ -429,11 +433,11 @@ importers:
       html-webpack-skip-assets-plugin: 1.0.3
       inline-chunk-html-plugin: 1.1.1
       jest: 26.6.3
-      jest-preset-preact: 4.0.5_dcv2axrifehkp735gj6dgclvdu
+      jest-preset-preact: 4.0.5_moqeqtbsr7edkxzj3jgnhqkxsm
       po2json: 0.4.5
-      preact-cli: 3.4.1_qdzd4gcyyybakwym2gbbbdbrae
-      preact-render-to-json: 3.6.6_preact@10.6.1
-      preact-render-to-string: 5.2.6_preact@10.6.1
+      preact-cli: 3.4.1_bbfn3vavr32nbxkp5peg6brs4i
+      preact-render-to-json: 3.6.6_preact@10.6.5
+      preact-render-to-string: 5.2.6_preact@10.6.5
       rimraf: 3.0.2
       sass: 1.55.0
       sass-loader: 10.1.1_sass@1.55.0
@@ -3935,6 +3939,14 @@ packages:
       react: ^16.13.1 || ^17.0.0
     dev: true
 
+  /@mdx-js/react/1.6.22_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==}
+    peerDependencies:
+      react: ^16.13.1 || ^17.0.0
+    dependencies:
+      react: /@preact/compat/17.1.2_preact@10.6.5
+    dev: true
+
   /@mdx-js/util/1.6.22:
     resolution: {integrity: 
sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==}
     dev: true
@@ -4039,7 +4051,7 @@ packages:
       preact: 10.11.2
     dev: true
 
-  /@preact/async-loader/3.0.1_preact@10.6.1:
+  /@preact/async-loader/3.0.1_preact@10.6.5:
     resolution: {integrity: 
sha512-BoUN24hxEfAQYnWjliAmkZLuliv+ONQi7AWn+/+VOJHTIHmbFiXrvmSxITf7PDkKiK0a5xy4OErZtVVLlk96Tg==}
     engines: {node: '>=8'}
     peerDependencies:
@@ -4047,7 +4059,7 @@ packages:
     dependencies:
       kleur: 4.1.5
       loader-utils: 2.0.3
-      preact: 10.6.1
+      preact: 10.6.5
     dev: true
 
   /@preact/compat/17.1.2_preact@10.6.5:
@@ -4056,7 +4068,6 @@ packages:
       preact: '*'
     dependencies:
       preact: 10.6.5
-    dev: false
 
   /@prefresh/babel-plugin/0.4.4:
     resolution: {integrity: 
sha512-/EvgIFMDL+nd20WNvMO0JQnzIl1EJPgmSaSYrZUww7A+aSdKsi37aL07TljrZR1cBMuzFxcr4xvqsUQLFJEukw==}
@@ -4070,12 +4081,12 @@ packages:
       preact: 10.11.2
     dev: true
 
-  /@prefresh/core/1.4.1_preact@10.6.1:
+  /@prefresh/core/1.4.1_preact@10.6.5:
     resolution: {integrity: 
sha512-og1vaBj3LMJagVncNrDb37Gqc0cWaUcDbpVt5hZtsN4i2Iwzd/5hyTsDHvlMirhSym3wL9ihU0Xa2VhSaOue7g==}
     peerDependencies:
       preact: ^10.0.0
     dependencies:
-      preact: 10.6.1
+      preact: 10.6.5
     dev: true
 
   /@prefresh/utils/1.1.3:
@@ -4096,7 +4107,7 @@ packages:
       webpack: 4.46.0
     dev: true
 
-  /@prefresh/webpack/3.3.4_w7ilujyunkfi5rlgeto2i3lxcy:
+  /@prefresh/webpack/3.3.4_l37gxlnxrbylk7wqownx5ddpoa:
     resolution: {integrity: 
sha512-RiXS/hvXDup5cQw/267kxkKie81kxaAB7SFbkr8ppshobDEzwgUN1tbGbHNx6Uari0Ql2XByC6HIgQGpaq2Q7w==}
     peerDependencies:
       '@prefresh/babel-plugin': ^0.4.0
@@ -4104,9 +4115,9 @@ packages:
       webpack: ^4.0.0 || ^5.0.0
     dependencies:
       '@prefresh/babel-plugin': 0.4.4
-      '@prefresh/core': 1.4.1_preact@10.6.1
+      '@prefresh/core': 1.4.1_preact@10.6.5
       '@prefresh/utils': 1.1.3
-      preact: 10.6.1
+      preact: 10.6.5
       webpack: 4.46.0
     dev: true
 
@@ -4342,6 +4353,36 @@ packages:
       util-deprecate: 1.0.2
     dev: true
 
+  /@storybook/addon-a11y/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-+Tcl/4LWRh3ygLUZFGvkjT42CF/tJcP+kgsIho7i2MxpgZyD6+BUhL9srPZusjbR+uHcHXJ/yxw/vxFQ+UCTLA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/channels': 6.5.13
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      axe-core: 4.5.0
+      core-js: 3.26.0
+      global: 4.4.0
+      lodash: 4.17.21
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      react-sizeme: 3.0.2
+      regenerator-runtime: 0.13.10
+      ts-dedent: 2.2.0
+      util-deprecate: 1.0.2
+    dev: true
+
   /@storybook/addon-actions/6.5.13:
     resolution: {integrity: 
sha512-3Tji0gIy95havhTpSc6CsFl5lNxGn4O5Y1U9fyji+GRkKqDFOrvVLYAHPtLOpYdEI5tF0bDo+akiqfDouY8+eA==}
     peerDependencies:
@@ -4374,6 +4415,39 @@ packages:
       uuid-browser: 3.1.0
     dev: true
 
+  /@storybook/addon-actions/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-3Tji0gIy95havhTpSc6CsFl5lNxGn4O5Y1U9fyji+GRkKqDFOrvVLYAHPtLOpYdEI5tF0bDo+akiqfDouY8+eA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      core-js: 3.26.0
+      fast-deep-equal: 3.1.3
+      global: 4.4.0
+      lodash: 4.17.21
+      polished: 4.2.2
+      prop-types: 15.8.1
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      react-inspector: 5.1.1_@preact+compat@17.1.2
+      regenerator-runtime: 0.13.10
+      telejson: 6.0.8
+      ts-dedent: 2.2.0
+      util-deprecate: 1.0.2
+      uuid-browser: 3.1.0
+    dev: true
+
   /@storybook/addon-backgrounds/6.5.13:
     resolution: {integrity: 
sha512-b4JX7JMY7e50y1l6g71D+2XWV3GO0TO2z1ta8J6W4OQt8f44V7sSkRQaJUzXdLjQMrA+Anojuy1ZwPjVeLC6vg==}
     peerDependencies:
@@ -4400,6 +4474,33 @@ packages:
       util-deprecate: 1.0.2
     dev: true
 
+  /@storybook/addon-backgrounds/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-b4JX7JMY7e50y1l6g71D+2XWV3GO0TO2z1ta8J6W4OQt8f44V7sSkRQaJUzXdLjQMrA+Anojuy1ZwPjVeLC6vg==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      core-js: 3.26.0
+      global: 4.4.0
+      memoizerific: 1.11.3
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      ts-dedent: 2.2.0
+      util-deprecate: 1.0.2
+    dev: true
+
   /@storybook/addon-controls/6.5.13_3rubbgt5ekhqrcgx4uwls3neim:
     resolution: {integrity: 
sha512-lYq3uf2mlVevm0bi6ueL3H6TpUMRYW9s/pTNTVJT225l27kLdFR9wEKxAkCBrlKaTgDLJmzzDRsJE3NLZlR/5Q==}
     peerDependencies:
@@ -4432,6 +4533,93 @@ packages:
       - webpack-command
     dev: true
 
+  /@storybook/addon-controls/6.5.13_j3fy4dsuv6tweqy6dixwnav3v4:
+    resolution: {integrity: 
sha512-lYq3uf2mlVevm0bi6ueL3H6TpUMRYW9s/pTNTVJT225l27kLdFR9wEKxAkCBrlKaTgDLJmzzDRsJE3NLZlR/5Q==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-common': 6.5.13_j3fy4dsuv6tweqy6dixwnav3v4
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/node-logger': 6.5.13
+      '@storybook/store': 6.5.13_@preact+compat@17.1.2
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      core-js: 3.26.0
+      lodash: 4.17.21
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      ts-dedent: 2.2.0
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+      - vue-template-compiler
+      - webpack-cli
+      - webpack-command
+    dev: true
+
+  /@storybook/addon-docs/6.5.13_2nt5iz47gcdduxcnvfnexph4hq:
+    resolution: {integrity: 
sha512-RG/NjsheD9FixZ789RJlNyNccaR2Cuy7CtAwph4oUNi3aDFjtOI8Oe9L+FOT7qtVnZLw/YMjF+pZxoDqJNKLPw==}
+    peerDependencies:
+      '@storybook/mdx2-csf': ^0.0.3
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      '@storybook/mdx2-csf':
+        optional: true
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.18.9
+      '@babel/preset-env': 7.19.4_@babel+core@7.18.9
+      '@jest/transform': 26.6.2
+      '@mdx-js/react': 1.6.22_@preact+compat@17.1.2
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-common': 6.5.13_j3fy4dsuv6tweqy6dixwnav3v4
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/docs-tools': 6.5.13_@preact+compat@17.1.2
+      '@storybook/mdx1-csf': 0.0.1_@babel+core@7.18.9
+      '@storybook/node-logger': 6.5.13
+      '@storybook/postinstall': 6.5.13
+      '@storybook/preview-web': 6.5.13_@preact+compat@17.1.2
+      '@storybook/source-loader': 6.5.13_@preact+compat@17.1.2
+      '@storybook/store': 6.5.13_@preact+compat@17.1.2
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      babel-loader: 8.2.5_@babel+core@7.18.9
+      core-js: 3.26.0
+      fast-deep-equal: 3.1.3
+      global: 4.4.0
+      lodash: 4.17.21
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      remark-external-links: 8.0.0
+      remark-slug: 6.1.0
+      ts-dedent: 2.2.0
+      util-deprecate: 1.0.2
+    transitivePeerDependencies:
+      - '@babel/core'
+      - eslint
+      - supports-color
+      - typescript
+      - vue-template-compiler
+      - webpack
+      - webpack-cli
+      - webpack-command
+    dev: true
+
   /@storybook/addon-docs/6.5.13_dazlt7ye7nu7xsezygxn7bviwy:
     resolution: {integrity: 
sha512-RG/NjsheD9FixZ789RJlNyNccaR2Cuy7CtAwph4oUNi3aDFjtOI8Oe9L+FOT7qtVnZLw/YMjF+pZxoDqJNKLPw==}
     peerDependencies:
@@ -4485,6 +4673,90 @@ packages:
       - webpack-command
     dev: true
 
+  /@storybook/addon-essentials/6.5.13_2nt5iz47gcdduxcnvfnexph4hq:
+    resolution: {integrity: 
sha512-G9FVAWV7ixjVLWeLgIX+VT90tcAk6yQxfZQegfg5ucRilGysJCDaNnoab4xuuvm1R40TfFhba3iAGZtQYsddmw==}
+    peerDependencies:
+      '@babel/core': ^7.9.6
+      '@storybook/angular': '*'
+      '@storybook/builder-manager4': '*'
+      '@storybook/builder-manager5': '*'
+      '@storybook/builder-webpack4': '*'
+      '@storybook/builder-webpack5': '*'
+      '@storybook/html': '*'
+      '@storybook/vue': '*'
+      '@storybook/vue3': '*'
+      '@storybook/web-components': '*'
+      lit: '*'
+      lit-html: '*'
+      react: '*'
+      react-dom: '*'
+      svelte: '*'
+      sveltedoc-parser: '*'
+      vue: '*'
+      webpack: '*'
+    peerDependenciesMeta:
+      '@storybook/angular':
+        optional: true
+      '@storybook/builder-manager4':
+        optional: true
+      '@storybook/builder-manager5':
+        optional: true
+      '@storybook/builder-webpack4':
+        optional: true
+      '@storybook/builder-webpack5':
+        optional: true
+      '@storybook/html':
+        optional: true
+      '@storybook/vue':
+        optional: true
+      '@storybook/vue3':
+        optional: true
+      '@storybook/web-components':
+        optional: true
+      lit:
+        optional: true
+      lit-html:
+        optional: true
+      react:
+        optional: true
+      react-dom:
+        optional: true
+      svelte:
+        optional: true
+      sveltedoc-parser:
+        optional: true
+      vue:
+        optional: true
+      webpack:
+        optional: true
+    dependencies:
+      '@babel/core': 7.18.9
+      '@storybook/addon-actions': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addon-backgrounds': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addon-controls': 6.5.13_j3fy4dsuv6tweqy6dixwnav3v4
+      '@storybook/addon-docs': 6.5.13_2nt5iz47gcdduxcnvfnexph4hq
+      '@storybook/addon-measure': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addon-outline': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addon-toolbars': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addon-viewport': 6.5.13_@preact+compat@17.1.2
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-common': 6.5.13_j3fy4dsuv6tweqy6dixwnav3v4
+      '@storybook/node-logger': 6.5.13
+      core-js: 3.26.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      ts-dedent: 2.2.0
+    transitivePeerDependencies:
+      - '@storybook/mdx2-csf'
+      - eslint
+      - supports-color
+      - typescript
+      - vue-template-compiler
+      - webpack-cli
+      - webpack-command
+    dev: true
+
   /@storybook/addon-essentials/6.5.13_dazlt7ye7nu7xsezygxn7bviwy:
     resolution: {integrity: 
sha512-G9FVAWV7ixjVLWeLgIX+VT90tcAk6yQxfZQegfg5ucRilGysJCDaNnoab4xuuvm1R40TfFhba3iAGZtQYsddmw==}
     peerDependencies:
@@ -4593,6 +4865,32 @@ packages:
       ts-dedent: 2.2.0
     dev: true
 
+  /@storybook/addon-links/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-K/LYYu9R/Xoah5h9MNh4mSHOic3q5csqjderLqr2YW/KPYiuNubgvzEbAAbzI5xq5JrtAZqnINrZUv2A4CyYbQ==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/router': 6.5.13_@preact+compat@17.1.2
+      '@types/qs': 6.9.7
+      core-js: 3.26.0
+      global: 4.4.0
+      prop-types: 15.8.1
+      qs: 6.11.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      ts-dedent: 2.2.0
+    dev: true
+
   /@storybook/addon-measure/6.5.13:
     resolution: {integrity: 
sha512-pi5RFB9YTnESRFtYHAVRUrgEI5to0TFc4KndtwcCKt1fMJ8OFjXQeznEfdj95PFeUvW5TNUwjL38vK4LhicB+g==}
     peerDependencies:
@@ -4614,6 +4912,28 @@ packages:
       global: 4.4.0
     dev: true
 
+  /@storybook/addon-measure/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-pi5RFB9YTnESRFtYHAVRUrgEI5to0TFc4KndtwcCKt1fMJ8OFjXQeznEfdj95PFeUvW5TNUwjL38vK4LhicB+g==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      core-js: 3.26.0
+      global: 4.4.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+    dev: true
+
   /@storybook/addon-outline/6.5.13:
     resolution: {integrity: 
sha512-8d8taPheO/tryflzXbj2QRuxHOIS8CtzRzcaglCcioqHEMhOIDOx9BdXKdheq54gdk/UN94HdGJUoVxYyXwZ4Q==}
     peerDependencies:
@@ -4637,6 +4957,30 @@ packages:
       ts-dedent: 2.2.0
     dev: true
 
+  /@storybook/addon-outline/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-8d8taPheO/tryflzXbj2QRuxHOIS8CtzRzcaglCcioqHEMhOIDOx9BdXKdheq54gdk/UN94HdGJUoVxYyXwZ4Q==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      core-js: 3.26.0
+      global: 4.4.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      ts-dedent: 2.2.0
+    dev: true
+
   /@storybook/addon-toolbars/6.5.13:
     resolution: {integrity: 
sha512-Qgr4wKRSP+gY1VaN7PYT4TM1um7KY341X3GHTglXLFHd8nDsCweawfV2shaX3WxCfZmVro8g4G+Oest30kLLCw==}
     peerDependencies:
@@ -4657,6 +5001,27 @@ packages:
       regenerator-runtime: 0.13.10
     dev: true
 
+  /@storybook/addon-toolbars/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-Qgr4wKRSP+gY1VaN7PYT4TM1um7KY341X3GHTglXLFHd8nDsCweawfV2shaX3WxCfZmVro8g4G+Oest30kLLCw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      core-js: 3.26.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+    dev: true
+
   /@storybook/addon-viewport/6.5.13:
     resolution: {integrity: 
sha512-KSfeuCSIjncwWGnUu6cZBx8WNqYvm5gHyFvkSPKEu0+MJtgncbUy7pl53lrEEr6QmIq0GRXvS3A0XzV8RCnrSA==}
     peerDependencies:
@@ -4681,6 +5046,31 @@ packages:
       regenerator-runtime: 0.13.10
     dev: true
 
+  /@storybook/addon-viewport/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-KSfeuCSIjncwWGnUu6cZBx8WNqYvm5gHyFvkSPKEu0+MJtgncbUy7pl53lrEEr6QmIq0GRXvS3A0XzV8RCnrSA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/components': 6.5.13_@preact+compat@17.1.2
+      '@storybook/core-events': 6.5.13
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      core-js: 3.26.0
+      global: 4.4.0
+      memoizerific: 1.11.3
+      prop-types: 15.8.1
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+    dev: true
+
   /@storybook/addons/6.5.13:
     resolution: {integrity: 
sha512-18CqzNnrGMfeZtiKz+R/3rHtSNnfNwz6y6prIQIbWseK16jY8ELTfIFGviwO5V2OqpbHDQi5+xQQ63QAIb89YA==}
     peerDependencies:
@@ -4700,6 +5090,26 @@ packages:
       regenerator-runtime: 0.13.10
     dev: true
 
+  /@storybook/addons/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-18CqzNnrGMfeZtiKz+R/3rHtSNnfNwz6y6prIQIbWseK16jY8ELTfIFGviwO5V2OqpbHDQi5+xQQ63QAIb89YA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/api': 6.5.13_@preact+compat@17.1.2
+      '@storybook/channels': 6.5.13
+      '@storybook/client-logger': 6.5.13
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/router': 6.5.13_@preact+compat@17.1.2
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      '@types/webpack-env': 1.18.0
+      core-js: 3.26.0
+      global: 4.4.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+    dev: true
+
   /@storybook/addons/6.5.13_wcqkhtmu7mswc6yz4uyexck3ty:
     resolution: {integrity: 
sha512-18CqzNnrGMfeZtiKz+R/3rHtSNnfNwz6y6prIQIbWseK16jY8ELTfIFGviwO5V2OqpbHDQi5+xQQ63QAIb89YA==}
     peerDependencies:
@@ -4716,12 +5126,37 @@ packages:
       '@types/webpack-env': 1.18.0
       core-js: 3.26.0
       global: 4.4.0
-      react: 16.14.0
-      react-dom: 16.14.0_react@16.14.0
+      react: 16.14.0
+      react-dom: 16.14.0_react@16.14.0
+      regenerator-runtime: 0.13.10
+    dev: true
+
+  /@storybook/api/6.5.13:
+    resolution: {integrity: 
sha512-xVSmB7/IuFd6G7eiJjbI2MuS7SZunoUM6d+YCWpjiehfMeX47MXt1gZtOwFrgJC1ShZlefXFahq/dvxwtmWs+w==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/channels': 6.5.13
+      '@storybook/client-logger': 6.5.13
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/router': 6.5.13
+      '@storybook/semver': 7.3.2
+      '@storybook/theming': 6.5.13
+      core-js: 3.26.0
+      fast-deep-equal: 3.1.3
+      global: 4.4.0
+      lodash: 4.17.21
+      memoizerific: 1.11.3
       regenerator-runtime: 0.13.10
+      store2: 2.14.2
+      telejson: 6.0.8
+      ts-dedent: 2.2.0
+      util-deprecate: 1.0.2
     dev: true
 
-  /@storybook/api/6.5.13:
+  /@storybook/api/6.5.13_@preact+compat@17.1.2:
     resolution: {integrity: 
sha512-xVSmB7/IuFd6G7eiJjbI2MuS7SZunoUM6d+YCWpjiehfMeX47MXt1gZtOwFrgJC1ShZlefXFahq/dvxwtmWs+w==}
     peerDependencies:
       react: ^16.8.0 || ^17.0.0 || ^18.0.0
@@ -4731,14 +5166,15 @@ packages:
       '@storybook/client-logger': 6.5.13
       '@storybook/core-events': 6.5.13
       '@storybook/csf': 0.0.2--canary.4566f4d.1
-      '@storybook/router': 6.5.13
+      '@storybook/router': 6.5.13_@preact+compat@17.1.2
       '@storybook/semver': 7.3.2
-      '@storybook/theming': 6.5.13
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
       core-js: 3.26.0
       fast-deep-equal: 3.1.3
       global: 4.4.0
       lodash: 4.17.21
       memoizerific: 1.11.3
+      react: /@preact/compat/17.1.2_preact@10.6.5
       regenerator-runtime: 0.13.10
       store2: 2.14.2
       telejson: 6.0.8
@@ -4925,6 +5361,23 @@ packages:
       util-deprecate: 1.0.2
     dev: true
 
+  /@storybook/components/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-6Hhx70JK5pGfKCkqMU4yq/BBH+vRTmzj7tZKfPwba+f8VmTMoOr/2ysTQFRtXryiHB6Z15xBYgfq5x2pIwQzLQ==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/client-logger': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/theming': 6.5.13_@preact+compat@17.1.2
+      core-js: 3.26.0
+      memoizerific: 1.11.3
+      qs: 6.11.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      util-deprecate: 1.0.2
+    dev: true
+
   /@storybook/components/6.5.13_wcqkhtmu7mswc6yz4uyexck3ty:
     resolution: {integrity: 
sha512-6Hhx70JK5pGfKCkqMU4yq/BBH+vRTmzj7tZKfPwba+f8VmTMoOr/2ysTQFRtXryiHB6Z15xBYgfq5x2pIwQzLQ==}
     peerDependencies:
@@ -5086,6 +5539,76 @@ packages:
       - webpack-command
     dev: true
 
+  /@storybook/core-common/6.5.13_j3fy4dsuv6tweqy6dixwnav3v4:
+    resolution: {integrity: 
sha512-+DVZrRsteE9pw0X5MNffkdBgejQnbnL+UOG3qXkE9xxUamQALnuqS/w1BzpHE9WmOHuf7RWMKflyQEW3OLKAJg==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@babel/core': 7.18.9
+      '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.18.9
+      '@babel/plugin-proposal-decorators': 7.19.6_@babel+core@7.18.9
+      '@babel/plugin-proposal-export-default-from': 7.18.10_@babel+core@7.18.9
+      '@babel/plugin-proposal-nullish-coalescing-operator': 
7.18.6_@babel+core@7.18.9
+      '@babel/plugin-proposal-object-rest-spread': 7.19.4_@babel+core@7.18.9
+      '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.9
+      '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.18.9
+      '@babel/plugin-proposal-private-property-in-object': 
7.18.6_@babel+core@7.18.9
+      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.9
+      '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.18.9
+      '@babel/plugin-transform-block-scoping': 7.19.4_@babel+core@7.18.9
+      '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.18.9
+      '@babel/plugin-transform-destructuring': 7.19.4_@babel+core@7.18.9
+      '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.18.9
+      '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.9
+      '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.18.9
+      '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.18.9
+      '@babel/preset-env': 7.19.4_@babel+core@7.18.9
+      '@babel/preset-react': 7.18.6_@babel+core@7.18.9
+      '@babel/preset-typescript': 7.18.6_@babel+core@7.18.9
+      '@babel/register': 7.18.9_@babel+core@7.18.9
+      '@storybook/node-logger': 6.5.13
+      '@storybook/semver': 7.3.2
+      '@types/node': 16.18.0
+      '@types/pretty-hrtime': 1.0.1
+      babel-loader: 8.2.5_7uc2ny5pnz7ums2wq2q562bf6y
+      babel-plugin-macros: 3.1.0
+      babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.18.9
+      chalk: 4.1.2
+      core-js: 3.26.0
+      express: 4.18.2
+      file-system-cache: 1.1.0
+      find-up: 5.0.0
+      fork-ts-checker-webpack-plugin: 6.5.2_3n2x3j6farblcaf52bherr6og4
+      fs-extra: 9.1.0
+      glob: 7.2.3
+      handlebars: 4.7.7
+      interpret: 2.2.0
+      json5: 2.2.1
+      lazy-universal-dotenv: 3.0.1
+      picomatch: 2.3.1
+      pkg-dir: 5.0.0
+      pretty-hrtime: 1.0.3
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      resolve-from: 5.0.0
+      slash: 3.0.0
+      telejson: 6.0.8
+      ts-dedent: 2.2.0
+      typescript: 4.8.4
+      util-deprecate: 1.0.2
+      webpack: 4.46.0
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - vue-template-compiler
+      - webpack-cli
+      - webpack-command
+    dev: true
+
   /@storybook/core-common/6.5.13_u5cwnb36e3nipolzgtjnnpepdu:
     resolution: {integrity: 
sha512-+DVZrRsteE9pw0X5MNffkdBgejQnbnL+UOG3qXkE9xxUamQALnuqS/w1BzpHE9WmOHuf7RWMKflyQEW3OLKAJg==}
     peerDependencies:
@@ -5324,6 +5847,22 @@ packages:
       - supports-color
     dev: true
 
+  /@storybook/docs-tools/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-hB+hk+895ny4SW84j3X5iV55DHs3bCfTOp7cDdcZJdQrlm0wuDb4A6d4ffNC7ZLh9VkUjU6ST4VEV5Bb0Cptow==}
+    dependencies:
+      '@babel/core': 7.18.9
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/store': 6.5.13_@preact+compat@17.1.2
+      core-js: 3.26.0
+      doctrine: 3.0.0
+      lodash: 4.17.21
+      regenerator-runtime: 0.13.10
+    transitivePeerDependencies:
+      - react
+      - react-dom
+      - supports-color
+    dev: true
+
   /@storybook/manager-webpack4/6.5.13_u5cwnb36e3nipolzgtjnnpepdu:
     resolution: {integrity: 
sha512-pURzS5W3XM0F7bCBWzpl7TRsuy+OXFwLXiWLaexuvo0POZe31Ueo2A1R4rx3MT5Iee8O9mYvG2XTmvK9MlLefQ==}
     peerDependencies:
@@ -5417,7 +5956,7 @@ packages:
       core-js: 3.26.0
     dev: true
 
-  /@storybook/preact/6.5.13_pq7cousu3rtgfnoj6unnfcty2q:
+  /@storybook/preact/6.5.13_xa5zyoe4qu34opzfrw5imxak3u:
     resolution: {integrity: 
sha512-5/ufRgxh5VypFcOeIBQMg/AqZQ2+KfUw4Glo9HU75dbIe/kYqSnN3+5SEv8J6ykxHHtUWcmnILS1r7/I5R7j/w==}
     engines: {node: '>=10.13.0'}
     hasBin: true
@@ -5436,7 +5975,7 @@ packages:
       '@types/webpack-env': 1.18.0
       core-js: 3.26.0
       global: 4.4.0
-      preact: 10.6.1
+      preact: 10.6.5
       react: 16.14.0
       react-dom: 16.14.0_react@16.14.0
       read-pkg-up: 7.0.1
@@ -5541,6 +6080,31 @@ packages:
       util-deprecate: 1.0.2
     dev: true
 
+  /@storybook/preview-web/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-GNNYVzw4SmRua3dOc52Ye6Us4iQbq5GKQ56U3iwnzZM3TBdJB+Rft94Fn1/pypHujEHS8hl5Xgp9td6C1lLCow==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/channel-postmessage': 6.5.13
+      '@storybook/client-logger': 6.5.13
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      '@storybook/store': 6.5.13_@preact+compat@17.1.2
+      ansi-to-html: 0.6.15
+      core-js: 3.26.0
+      global: 4.4.0
+      lodash: 4.17.21
+      qs: 6.11.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      synchronous-promise: 2.0.16
+      ts-dedent: 2.2.0
+      unfetch: 4.2.0
+      util-deprecate: 1.0.2
+    dev: true
+
   /@storybook/preview-web/6.5.13_wcqkhtmu7mswc6yz4uyexck3ty:
     resolution: {integrity: 
sha512-GNNYVzw4SmRua3dOc52Ye6Us4iQbq5GKQ56U3iwnzZM3TBdJB+Rft94Fn1/pypHujEHS8hl5Xgp9td6C1lLCow==}
     peerDependencies:
@@ -5580,6 +6144,20 @@ packages:
       regenerator-runtime: 0.13.10
     dev: true
 
+  /@storybook/router/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-sf5aogfirH5ucD0d0hc2mKf2iyWsZsvXhr5kjxUQmgkcoflkGUWhc34sbSQVRQ1i8K5lkLIDH/q2s1Zr2SbzhQ==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/client-logger': 6.5.13
+      core-js: 3.26.0
+      memoizerific: 1.11.3
+      qs: 6.11.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+    dev: true
+
   /@storybook/router/6.5.13_wcqkhtmu7mswc6yz4uyexck3ty:
     resolution: {integrity: 
sha512-sf5aogfirH5ucD0d0hc2mKf2iyWsZsvXhr5kjxUQmgkcoflkGUWhc34sbSQVRQ1i8K5lkLIDH/q2s1Zr2SbzhQ==}
     peerDependencies:
@@ -5622,6 +6200,25 @@ packages:
       regenerator-runtime: 0.13.10
     dev: true
 
+  /@storybook/source-loader/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-tHuM8PfeB/0m+JigbaFp+Ld0euFH+fgOObH2W9rjEXy5vnwmaeex/JAdCprv4oL+LcDQEERqNULUUNIvbcTPAg==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      core-js: 3.26.0
+      estraverse: 5.3.0
+      global: 4.4.0
+      loader-utils: 2.0.3
+      lodash: 4.17.21
+      prettier: 2.3.0
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+    dev: true
+
   /@storybook/store/6.5.13:
     resolution: {integrity: 
sha512-GG6lm+8fBX1tNUnX7x3raBOjYhhf14bPWLtYiPlxDTFEMs3sJte7zWKZq6NQ79MoBLL6jjzTeolBfDCBw6fiWQ==}
     peerDependencies:
@@ -5645,6 +6242,30 @@ packages:
       util-deprecate: 1.0.2
     dev: true
 
+  /@storybook/store/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-GG6lm+8fBX1tNUnX7x3raBOjYhhf14bPWLtYiPlxDTFEMs3sJte7zWKZq6NQ79MoBLL6jjzTeolBfDCBw6fiWQ==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/addons': 6.5.13_@preact+compat@17.1.2
+      '@storybook/client-logger': 6.5.13
+      '@storybook/core-events': 6.5.13
+      '@storybook/csf': 0.0.2--canary.4566f4d.1
+      core-js: 3.26.0
+      fast-deep-equal: 3.1.3
+      global: 4.4.0
+      lodash: 4.17.21
+      memoizerific: 1.11.3
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+      slash: 3.0.0
+      stable: 0.1.8
+      synchronous-promise: 2.0.16
+      ts-dedent: 2.2.0
+      util-deprecate: 1.0.2
+    dev: true
+
   /@storybook/store/6.5.13_wcqkhtmu7mswc6yz4uyexck3ty:
     resolution: {integrity: 
sha512-GG6lm+8fBX1tNUnX7x3raBOjYhhf14bPWLtYiPlxDTFEMs3sJte7zWKZq6NQ79MoBLL6jjzTeolBfDCBw6fiWQ==}
     peerDependencies:
@@ -5709,6 +6330,19 @@ packages:
       regenerator-runtime: 0.13.10
     dev: true
 
+  /@storybook/theming/6.5.13_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-oif5NGFAUQhizo50r+ctw2hZNLWV4dPHai+L/gFvbaSeRBeHSNkIcMoZ2FlrO566HdGZTDutYXcR+xus8rI28g==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@storybook/client-logger': 6.5.13
+      core-js: 3.26.0
+      memoizerific: 1.11.3
+      react: /@preact/compat/17.1.2_preact@10.6.5
+      regenerator-runtime: 0.13.10
+    dev: true
+
   /@storybook/theming/6.5.13_wcqkhtmu7mswc6yz4uyexck3ty:
     resolution: {integrity: 
sha512-oif5NGFAUQhizo50r+ctw2hZNLWV4dPHai+L/gFvbaSeRBeHSNkIcMoZ2FlrO566HdGZTDutYXcR+xus8rI28g==}
     peerDependencies:
@@ -5787,14 +6421,14 @@ packages:
       preact: 10.11.2
     dev: true
 
-  /@testing-library/preact-hooks/1.1.0_p7poi7nh2j5v3fg73wd3em3ise:
+  /@testing-library/preact-hooks/1.1.0_vfcmu6iy7nffpurikpgxo6gwxi:
     resolution: {integrity: 
sha512-+JIor+NsOHkK3oIrwMDGKGHXTN0JJi462dBJlj4FNbGaDPTlctE6eu2ranWQirh7/FJMkWfzQCP+tk7jmY8ZrQ==}
     peerDependencies:
       '@testing-library/preact': ^2.0.0
       preact: ^10.4.8
     dependencies:
-      '@testing-library/preact': 2.0.1_preact@10.6.1
-      preact: 10.6.1
+      '@testing-library/preact': 2.0.1_preact@10.6.5
+      preact: 10.6.5
     dev: true
 
   /@testing-library/preact/2.0.1_preact@10.11.2:
@@ -5807,14 +6441,14 @@ packages:
       preact: 10.11.2
     dev: true
 
-  /@testing-library/preact/2.0.1_preact@10.6.1:
+  /@testing-library/preact/2.0.1_preact@10.6.5:
     resolution: {integrity: 
sha512-79kwVOY+3caoLgaPbiPzikjgY0Aya7Fc7TvGtR1upCnz2wrtmPDnN2t9vO7I7vDP2zoA+feSwOH5Q0BFErhaaQ==}
     engines: {node: '>= 10'}
     peerDependencies:
       preact: '>=10 || ^10.0.0-alpha.0 || ^10.0.0-beta.0'
     dependencies:
       '@testing-library/dom': 7.31.2
-      preact: 10.6.1
+      preact: 10.6.5
     dev: true
 
   /@tootallnate/once/1.1.2:
@@ -5973,7 +6607,7 @@ packages:
     resolution: {integrity: 
sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==}
     dependencies:
       '@types/minimatch': 5.1.2
-      '@types/node': 14.18.32
+      '@types/node': 18.11.5
     dev: true
 
   /@types/graceful-fs/4.1.5:
@@ -6079,14 +6713,10 @@ packages:
   /@types/node-fetch/2.6.2:
     resolution: {integrity: 
sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==}
     dependencies:
-      '@types/node': 14.18.32
+      '@types/node': 18.11.5
       form-data: 3.0.1
     dev: true
 
-  /@types/node/14.18.32:
-    resolution: {integrity: 
sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==}
-    dev: true
-
   /@types/node/16.18.0:
     resolution: {integrity: 
sha512-LqYqYzYvnbCaQfLAwRt0zboqnsViwhZm+vjaMSqcfN36vulAg7Pt0T83q4WZO2YOBw3XdyHi8cQ88H22zmULOA==}
     dev: true
@@ -14130,7 +14760,7 @@ packages:
       jest-resolve: 26.6.2
     dev: true
 
-  /jest-preset-preact/4.0.5_dcv2axrifehkp735gj6dgclvdu:
+  /jest-preset-preact/4.0.5_k4rseuq4tu3ktjhgekqzusjwfq:
     resolution: {integrity: 
sha512-MnU7mfpnwopJkdx0WoEyRmrNDIvRN+w6sOur0zEhaRYYMo0gJM7UdZHWTV8k6uo0+ypY+m0kQW6kMukUx4v8JQ==}
     peerDependencies:
       jest: 26.x || 27.x
@@ -14147,14 +14777,14 @@ packages:
       isomorphic-unfetch: 3.1.0
       jest: 26.6.3
       jest-watch-typeahead: 0.6.5_jest@26.6.3
-      preact: 10.6.1
-      preact-render-to-string: 5.2.6_preact@10.6.1
+      preact: 10.11.2
+      preact-render-to-string: 5.2.6_preact@10.11.2
     transitivePeerDependencies:
       - encoding
       - supports-color
     dev: true
 
-  /jest-preset-preact/4.0.5_k4rseuq4tu3ktjhgekqzusjwfq:
+  /jest-preset-preact/4.0.5_moqeqtbsr7edkxzj3jgnhqkxsm:
     resolution: {integrity: 
sha512-MnU7mfpnwopJkdx0WoEyRmrNDIvRN+w6sOur0zEhaRYYMo0gJM7UdZHWTV8k6uo0+ypY+m0kQW6kMukUx4v8JQ==}
     peerDependencies:
       jest: 26.x || 27.x
@@ -14171,8 +14801,8 @@ packages:
       isomorphic-unfetch: 3.1.0
       jest: 26.6.3
       jest-watch-typeahead: 0.6.5_jest@26.6.3
-      preact: 10.11.2
-      preact-render-to-string: 5.2.6_preact@10.11.2
+      preact: 10.6.5
+      preact-render-to-string: 5.2.6_preact@10.6.5
     transitivePeerDependencies:
       - encoding
       - supports-color
@@ -17288,7 +17918,7 @@ packages:
       source-map-js: 1.0.2
     dev: true
 
-  /preact-cli/3.4.1_mawv7s6bnnlf5iblnjjf6vghau:
+  /preact-cli/3.4.1_bbfn3vavr32nbxkp5peg6brs4i:
     resolution: {integrity: 
sha512-/4be0PuBmAIAox9u8GLJublFpEymq7Lk4JW4PEPz9ErFH/ncZf/oBPhECtXGq9IPqNOEe4r2l8sA+3uqKVwBfw==}
     engines: {node: '>=12'}
     hasBin: true
@@ -17315,9 +17945,9 @@ packages:
       '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.18.9
       '@babel/preset-env': 7.19.4_@babel+core@7.18.9
       '@babel/preset-typescript': 7.18.6_@babel+core@7.18.9
-      '@preact/async-loader': 3.0.1_preact@10.11.2
+      '@preact/async-loader': 3.0.1_preact@10.6.5
       '@prefresh/babel-plugin': 0.4.4
-      '@prefresh/webpack': 3.3.4_kitpfapqi2defymxf2rxzdj6na
+      '@prefresh/webpack': 3.3.4_l37gxlnxrbylk7wqownx5ddpoa
       '@types/webpack': 4.41.33
       autoprefixer: 10.4.12_postcss@8.4.18
       babel-esm-plugin: 0.9.0_webpack@4.46.0
@@ -17336,7 +17966,7 @@ packages:
       envinfo: 7.8.1
       esm: 3.2.25
       file-loader: 6.2.0_webpack@4.46.0
-      fork-ts-checker-webpack-plugin: 4.1.6_u7kjabuvawcog7hjctusduehvm
+      fork-ts-checker-webpack-plugin: 4.1.6_gplzhsecki363wzvnzp4wfrwvi
       get-port: 5.1.1
       gittar: 0.1.1
       glob: 8.0.3
@@ -17355,8 +17985,8 @@ packages:
       postcss: 8.4.18
       postcss-load-config: 3.1.4_postcss@8.4.18
       postcss-loader: 4.3.0_dhonik3q6ff6ozbzdscnovq2ka
-      preact: 10.11.2
-      preact-render-to-string: 5.2.6_preact@10.11.2
+      preact: 10.6.5
+      preact-render-to-string: 5.2.6_preact@10.6.5
       progress-bar-webpack-plugin: 2.1.0_webpack@4.46.0
       promise-polyfill: 8.2.3
       prompts: 2.4.2
@@ -17364,6 +17994,7 @@ packages:
       react-refresh: 0.10.0
       rimraf: 3.0.2
       sade: 1.8.1
+      sass-loader: 10.1.1_sass@1.55.0
       size-plugin: 3.0.0_webpack@4.46.0
       source-map: 0.7.4
       stack-trace: 0.0.10
@@ -17402,7 +18033,7 @@ packages:
       - webpack-command
     dev: true
 
-  /preact-cli/3.4.1_qdzd4gcyyybakwym2gbbbdbrae:
+  /preact-cli/3.4.1_mawv7s6bnnlf5iblnjjf6vghau:
     resolution: {integrity: 
sha512-/4be0PuBmAIAox9u8GLJublFpEymq7Lk4JW4PEPz9ErFH/ncZf/oBPhECtXGq9IPqNOEe4r2l8sA+3uqKVwBfw==}
     engines: {node: '>=12'}
     hasBin: true
@@ -17429,9 +18060,9 @@ packages:
       '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.18.9
       '@babel/preset-env': 7.19.4_@babel+core@7.18.9
       '@babel/preset-typescript': 7.18.6_@babel+core@7.18.9
-      '@preact/async-loader': 3.0.1_preact@10.6.1
+      '@preact/async-loader': 3.0.1_preact@10.11.2
       '@prefresh/babel-plugin': 0.4.4
-      '@prefresh/webpack': 3.3.4_w7ilujyunkfi5rlgeto2i3lxcy
+      '@prefresh/webpack': 3.3.4_kitpfapqi2defymxf2rxzdj6na
       '@types/webpack': 4.41.33
       autoprefixer: 10.4.12_postcss@8.4.18
       babel-esm-plugin: 0.9.0_webpack@4.46.0
@@ -17450,7 +18081,7 @@ packages:
       envinfo: 7.8.1
       esm: 3.2.25
       file-loader: 6.2.0_webpack@4.46.0
-      fork-ts-checker-webpack-plugin: 4.1.6_gplzhsecki363wzvnzp4wfrwvi
+      fork-ts-checker-webpack-plugin: 4.1.6_u7kjabuvawcog7hjctusduehvm
       get-port: 5.1.1
       gittar: 0.1.1
       glob: 8.0.3
@@ -17469,8 +18100,8 @@ packages:
       postcss: 8.4.18
       postcss-load-config: 3.1.4_postcss@8.4.18
       postcss-loader: 4.3.0_dhonik3q6ff6ozbzdscnovq2ka
-      preact: 10.6.1
-      preact-render-to-string: 5.2.6_preact@10.6.1
+      preact: 10.11.2
+      preact-render-to-string: 5.2.6_preact@10.11.2
       progress-bar-webpack-plugin: 2.1.0_webpack@4.46.0
       promise-polyfill: 8.2.3
       prompts: 2.4.2
@@ -17478,7 +18109,6 @@ packages:
       react-refresh: 0.10.0
       rimraf: 3.0.2
       sade: 1.8.1
-      sass-loader: 10.1.1_sass@1.55.0
       size-plugin: 3.0.0_webpack@4.46.0
       source-map: 0.7.4
       stack-trace: 0.0.10
@@ -17640,12 +18270,12 @@ packages:
       preact: 10.11.2
     dev: true
 
-  /preact-render-to-json/3.6.6_preact@10.6.1:
+  /preact-render-to-json/3.6.6_preact@10.6.5:
     resolution: {integrity: 
sha512-w+guVnrKJMtSdAYKD3INih1O+XNEgJmj58r49KjjnwE1tLqzNXq1NaZXDg1DGhQ0fj67DYKdR9BqhogFI0lvsg==}
     peerDependencies:
       preact: '*'
     dependencies:
-      preact: 10.6.1
+      preact: 10.6.5
     dev: true
 
   /preact-render-to-string/5.2.6_preact@10.11.2:
@@ -17656,12 +18286,12 @@ packages:
       preact: 10.11.2
       pretty-format: 3.8.0
 
-  /preact-render-to-string/5.2.6_preact@10.6.1:
+  /preact-render-to-string/5.2.6_preact@10.6.5:
     resolution: {integrity: 
sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==}
     peerDependencies:
       preact: '>=10'
     dependencies:
-      preact: 10.6.1
+      preact: 10.6.5
       pretty-format: 3.8.0
     dev: true
 
@@ -17673,14 +18303,6 @@ packages:
       preact: 10.11.2
     dev: false
 
-  /preact-router/3.2.1_preact@10.6.1:
-    resolution: {integrity: 
sha512-KEN2VN1DxUlTwzW5IFkF13YIA2OdQ2OvgJTkQREF+AA2NrHRLaGbB68EjS4IeZOa1shvQ1FvEm3bSLta4sXBhg==}
-    peerDependencies:
-      preact: '>=10'
-    dependencies:
-      preact: 10.6.1
-    dev: false
-
   /preact-router/3.2.1_preact@10.6.5:
     resolution: {integrity: 
sha512-KEN2VN1DxUlTwzW5IFkF13YIA2OdQ2OvgJTkQREF+AA2NrHRLaGbB68EjS4IeZOa1shvQ1FvEm3bSLta4sXBhg==}
     peerDependencies:
@@ -17692,12 +18314,8 @@ packages:
   /preact/10.11.2:
     resolution: {integrity: 
sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==}
 
-  /preact/10.6.1:
-    resolution: {integrity: 
sha512-ydCg+ISIq70vqiThvNWStZWLRjR9U2awP/JAmGdWUKm9+Tyuy+MqVdAIyEByeIspAVtD4GWC/SJtxO8XD4knVA==}
-
   /preact/10.6.5:
     resolution: {integrity: 
sha512-i+LXM6JiVjQXSt2jG2vZZFapGpCuk1fl8o6ii3G84MA3xgj686FKjs4JFDkmUVhtxyq21+4ay74zqPykz9hU6w==}
-    dev: false
 
   /prelude-ls/1.1.2:
     resolution: {integrity: 
sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
@@ -18101,6 +18719,17 @@ packages:
       prop-types: 15.8.1
     dev: true
 
+  /react-inspector/5.1.1_@preact+compat@17.1.2:
+    resolution: {integrity: 
sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==}
+    peerDependencies:
+      react: ^16.8.4 || ^17.0.0
+    dependencies:
+      '@babel/runtime': 7.19.4
+      is-dom: 1.1.0
+      prop-types: 15.8.1
+      react: /@preact/compat/17.1.2_preact@10.6.5
+    dev: true
+
   /react-is/16.13.1:
     resolution: {integrity: 
sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
     dev: true
@@ -19816,12 +20445,6 @@ packages:
       dequal: 2.0.2
     dev: false
 
-  /swr/1.1.0:
-    resolution: {integrity: 
sha512-MFL3mkl752Uap81nLA1tEu7vQmikPamSziW+6dBidYKAo4oLOlUx/x5GZy4ZCkCwfZe2uedylkz1UMGnatUX4g==}
-    peerDependencies:
-      react: ^16.11.0 || ^17.0.0 || ^18.0.0
-    dev: false
-
   /swr/1.3.0_@preact+compat@17.1.2:
     resolution: {integrity: 
sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==}
     peerDependencies:

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]