gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant-backoffice] branch master updated: some fixes


From: gnunet
Subject: [taler-merchant-backoffice] branch master updated: some fixes
Date: Tue, 23 Feb 2021 19:53:57 +0100

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

sebasjm pushed a commit to branch master
in repository merchant-backoffice.

The following commit(s) were added to refs/heads/master by this push:
     new 2a54606  some fixes
2a54606 is described below

commit 2a54606abd6b00fb33381e07d8a31b20c2ff25fb
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Tue Feb 23 15:53:41 2021 -0300

    some fixes
---
 CHANGELOG.md                                       | 10 +++--
 README.md                                          |  2 +
 build-system/Makefile                              | 13 +-----
 package.json                                       |  2 +-
 .../list/EmptyTable.tsx => copyleft-header.js}     | 18 --------
 packages/frontend/package.json                     | 19 +++++++--
 .../frontend/src/assets/icons/languageicon.svg     | 48 ++++++++++++++++++++++
 packages/frontend/src/components/auth/index.tsx    |  2 +-
 packages/frontend/src/components/modal/index.tsx   |  9 ++--
 packages/frontend/src/components/navbar/index.tsx  |  6 ++-
 packages/frontend/src/components/sidebar/index.tsx | 33 +++++++++++----
 packages/frontend/src/components/yup/YupField.tsx  | 28 +++++++------
 packages/frontend/src/context/backend.ts           | 17 ++++++++
 packages/frontend/src/custom.d.ts                  | 19 +++++++++
 packages/frontend/src/declaration.d.ts             |  1 +
 packages/frontend/src/hooks/index.ts               | 26 +++++++-----
 packages/frontend/src/index.tsx                    | 15 +++++--
 packages/frontend/src/messages/en.po               | 43 ++++++++++++++++++-
 packages/frontend/src/messages/index.ts            | 15 +++++++
 .../frontend/src/routes/instances/create/index.tsx | 15 +++++++
 .../src/routes/instances/details/DetailPage.tsx    | 17 +++++---
 .../src/routes/instances/details/index.tsx         | 31 ++++++++++----
 .../src/routes/instances/list/EmptyTable.tsx       |  3 +-
 .../frontend/src/routes/instances/list/Table.tsx   | 10 ++---
 .../frontend/src/routes/instances/update/index.tsx | 15 +++++++
 packages/frontend/src/routes/login/index.tsx       | 20 +++++++++
 packages/frontend/src/schemas/index.ts             |  3 +-
 packages/frontend/src/scss/_aside.scss             |  6 +--
 packages/frontend/src/scss/_theme-default.scss     |  2 +
 pnpm-lock.yaml                                     | 10 +++++
 30 files changed, 352 insertions(+), 106 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d364c57..c1e5d5f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,13 +5,9 @@ The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic 
Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [Future work]
- - show the connection state (url, currency, version) in the sidebar
  - date format (error handling)
  - bug: set text int the intpu date (seconds)
  - connection errors
- - add backend url without slash
- - edit button should be a pen
- - check the url from the backend when login
  - allow point separator for amounts
  - prevent letters to be input in numbers
  - red color when input is invalid (onchange)
@@ -33,11 +29,17 @@ and this project adheres to [Semantic 
Versioning](https://semver.org/spec/v2.0.0
  - prune scss styles to reduce size
 
 ## [Unreleased]
+ - check the url from the backend when login
+ - edit button should be a pen
  - implement correct weblate feature
  - what happend if cannot access the config
  - reorder the fields from the address/juriction section (take example)
  - save every auth token of different instances
  - remove footer
+ - show the connection state (url, currency, version) in the sidebar
+ - add backend url without slash
+ - added linter rule for source header
+
 ## [0.0.1] - 2021-02-18
 ### Changed
  - button of the form to the right
diff --git a/README.md b/README.md
index 656c756..0396e75 100644
--- a/README.md
+++ b/README.md
@@ -68,3 +68,5 @@ This should start a watch process that will reload the server 
every time that a
 
 *   Date-fns: library for manipulating javascript date
 
+*   messageformat: ICU MessageFormat for Javascript, with support for .po and 
.mo files 
+
diff --git a/build-system/Makefile b/build-system/Makefile
index c819c48..fc57ad5 100644
--- a/build-system/Makefile
+++ b/build-system/Makefile
@@ -2,12 +2,7 @@
 
 src = src
 
-tsc = node_modules/typescript/bin/tsc
-typedoc = node_modules/typedoc/bin/typedoc
-ava = node_modules/.bin/ava
-nyc = node_modules/nyc/bin/nyc.js
-git-archive-all = 
./build-system/taler-build-scripts/archive-with-submodules/git_archive_all.py
-
+PORT = 8080
 include ./build-system/config.mk
 
 .PHONY: compile
@@ -15,15 +10,11 @@ compile:
        pnpm i -r
        pnpm run compile
 
-# .PHONY: dist
-# dist:
-#      $(git-archive-all) --include ./configure taler-wallet-$(shell git 
describe --tags).tar.gz
-
 # .PHONY: publish
 # publish: compile
 #      pnpm publish -r --no-git-checks
 
-# make documentation from docstrings
+
 .PHONY: typedoc
 typedoc:
        pnpm run typedoc
diff --git a/package.json b/package.json
index 99a785d..1a18f02 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
     "compile": "pnpm run --filter '{packages}' compile",
     "build": "pnpm run --filter '{packages}' build",
     "serve": "pnpm run --filter '{packages}' serve",
-    "lint": "pnpm run --filter '{packages}' lint",
+    "lint": "pnpm run --filter '{packages}' lint-check",
     "typedoc": "pnpm run --filter '{packages}' typedoc",
     "pretty": "pnpm run --filter '{packages}' pretty",
     "check": "pnpm run --filter '{packages}' --if-present test"
diff --git a/packages/frontend/src/routes/instances/list/EmptyTable.tsx 
b/packages/frontend/copyleft-header.js
similarity index 58%
copy from packages/frontend/src/routes/instances/list/EmptyTable.tsx
copy to packages/frontend/copyleft-header.js
index 154e3a8..0794cb8 100644
--- a/packages/frontend/src/routes/instances/list/EmptyTable.tsx
+++ b/packages/frontend/copyleft-header.js
@@ -13,21 +13,3 @@
  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/>
  */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { h, VNode } from "preact";
-import { useMessageTemplate } from "preact-messages";
-import { Message } from "preact-messages";
-
-export function EmptyTable(): VNode {
-  return <div class="content has-text-grey has-text-centered">
-    <p>
-      <span class="icon is-large"><i class="mdi mdi-emoticon-sad mdi-48px" 
/></span>
-    </p>
-    <p><Message id="There is no instances yet, add more pressing the + sign" 
/></p>
-  </div>
-}
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index 07a7191..ebf9baa 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -6,9 +6,10 @@
   "scripts": {
     "build": "preact build --no-sw --no-esm",
     "compile": "tsc",
-    "serve": "sirv build --port 8080 --cors --single --no-sw --no-esm",
-    "dev": "preact watch --no-sw --no-esm",
-    "lint": "eslint 'src/**/*.{js,jsx,ts,tsx}' --fix",
+    "serve": "sirv build --port ${PORT:=8080} --cors --single --no-sw 
--no-esm",
+    "dev": "preact watch --port ${PORT:=8080} --no-sw --no-esm",
+    "lint-check": "eslint 'src/**/*.{js,jsx,ts,tsx}'",
+    "lint-fix": "eslint --fix 'src/**/*.{js,jsx,ts,tsx}'",
     "test": "jest ./tests",
     "typedoc": "typedoc src",
     "clean": "rimraf build storybook-static docs",
@@ -24,6 +25,15 @@
       "preact",
       "plugin:@typescript-eslint/recommended"
     ],
+    "plugins": [
+      "header"
+    ],
+    "rules": {
+      "header/header": [
+        2,
+        "copyleft-header.js"
+      ]
+    },
     "ignorePatterns": [
       "build/"
     ]
@@ -33,8 +43,8 @@
     "date-fns": "^2.17.0",
     "messageformat": "^2.3.0",
     "preact": "^10.3.1",
-    "preact-router": "^3.2.1",
     "preact-messages": "workspace:*",
+    "preact-router": "^3.2.1",
     "swr": "^0.4.1",
     "yup": "^0.32.8"
   },
@@ -67,6 +77,7 @@
     "enzyme-adapter-preact-pure": "^3.0.0",
     "eslint": "^7.20.0",
     "eslint-config-preact": "^1.1.1",
+    "eslint-plugin-header": "^3.1.1",
     "jest": "^26.2.2",
     "jest-preset-preact": "^4.0.2",
     "messageformat-po-loader": "^0.3.0",
diff --git a/packages/frontend/src/assets/icons/languageicon.svg 
b/packages/frontend/src/assets/icons/languageicon.svg
new file mode 100644
index 0000000..22d58da
--- /dev/null
+++ b/packages/frontend/src/assets/icons/languageicon.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 
6.00 Build 0)  -->
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; x="0px" y="0px"
+        viewBox="0 0 2411.2 2794" style="enable-background:new 0 0 2411.2 
2794;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+       .st1{fill-rule:evenodd;clip-rule:evenodd;}
+       .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
+</style>
+<g id="Layer_2">
+</g>
+<g id="Layer_x5F_1_x5F_1">
+       <g>
+               <polygon points="1204.6,359.2 271.8,30 271.8,2060.1 
1204.6,1758.3               "/>
+               <polygon class="st0" points="1182.2,358.1 2150.6,29 2150.6,2059 
1182.2,1757.3           "/>
+               <polygon class="st0" points="30,2415.4 1182.2,2031.4 
1182.2,357.9 30,742                "/>
+               <polygon points="1707.2,2440.7 1870.5,2709.4 1956.6,2459.8      
        "/>
+               <g>
+                       <path 
d="M421.7,934.8c-6.1-6,8,49.1,27.6,68.9c34.8,35.1,61.9,39.6,76.4,40.2c32,1.3,71.5-8,94.9-17.8
+                               
c22.7-9.7,62.4-30,77.5-59.6c3.2-6.3,11.9-17,6.4-43.2c-4.2-20.2-17-27.3-32.7-26.2c-15.7,1.1-63.2,13.7-86.1,20.8
+                               
c-23,7-70.3,21.4-90.9,25.8C474.3,948.2,429,941.7,421.7,934.8z"/>
+                       <path 
d="M1003.1,1593.7c-9.1-3.3-196.9-81.1-223.6-93.9c-21.8-10.5-75.2-33.1-100.4-43.3c70.8-109.2,115.5-191.6,121.5-204.1
+                               
c11-23,86-169.6,87.7-178.7c1.7-9.1,3.8-42.9,2.2-51c-1.7-8.2-29.1,7.6-66.4,20.2c-37.4,12.6-108.4,58.8-135.8,64.6
+                               
c-27.5,5.7-115.5,39.1-160.5,54c-45,14.9-130.2,40.9-165.2,50.4c-35.1,9.5-65.7,10.2-85.3,16.2c0,0,2.6,27.5,7.8,35.7
+                               
c5.2,8.2,23.7,28.4,45.3,34.1c21.6,5.7,57.3,3.4,73.6-0.3c16.3-3.8,44.4-17.5,48.2-23.6c3.8-6.1-2-24.9,4.5-30.6
+                               
c6.5-5.6,92.2-25.7,124.6-35.4c32.4-10,156.3-52.6,173.1-50.5c-5.3,17.7-105,215.1-137.1,274c-32.1,58.9-218.6,318-258.3,363.6
+                               
c-30.1,34.7-103.2,123.5-128.5,143.6c6.4,1.8,51.6-2.1,59.9-7.2c51.3-31.6,136.9-138.1,164.4-170.5
+                               
c81.9-96,153.8-196.8,210.8-283.4h0.1c11.1,4.6,100.9,77.8,124.4,94c23.4,16.2,115.9,67.8,136,76.4c20,8.7,97.1,44.2,100.3,32.2
+                               C1029.4,1668,1012.2,1597.1,1003.1,1593.7z"/>
+               </g>
+               <path class="st1" 
d="M569,2572c18,11,35,20,54,29c38,19,81,39,122,54c56,21,112,38,168,51c31,7,65,13,98,18c3,0,92,11,110,11h90
+                       
c35-3,68-5,103-10c28-4,59-9,89-16c22-5,45-10,67-17c21-6,45-14,68-22c15-5,31-12,47-18c13-6,29-13,44-19c18-8,39-19,59-29
+                       
c16-8,34-18,51-28c13-7,43-30,59-30c18,0,30,16,30,30c0,29-39,38-57,51c-19,13-42,23-62,34c-40,21-81,39-120,54
+                       
c-51,19-107,37-157,49c-19,4-38,9-57,12c-10,2-114,18-143,18h-132c-35-3-72-7-107-12c-31-5-64-11-95-18c-24-5-50-12-73-19
+                       
c-40-11-79-25-117-40c-69-26-141-60-209-105c-12-8-13-16-13-25c0-15,11-29,29-29C531,2546,563,2569,569,2572z"/>
+               <path class="st1" d="M1151,2009L61,2372V764l1090-363V2009z 
M1212,354v1680c-1,5-3,10-7,15c-2,3-6,7-9,8c-25,10-1151,388-1166,388
+                       
c-12,0-23-8-29-21c0-1-1-2-1-4V739c2-5,3-12,7-16c8-11,22-13,31-16c17-6,1126-378,1142-378C1190,329,1212,336,1212,354z"/>
+               <path class="st1" d="M2120,2017l-907-282V380l907-308V2017z 
M2181,32v2023c-1,23-17,33-32,33c-13,0-107-32-123-37
+                       
c-126-39-253-78-378-117c-28-9-57-18-84-27c-24-7-50-15-74-23c-107-33-216-66-323-102c-4-1-14-15-14-18V351c2-5,4-11,9-15
+                       
c8-9,351-123,486-168c36-13,487-168,501-168C2167,0,2181,13,2181,32z"/>
+               <polygon points="2411.2,2440.7 1199.5,2054.5 1204.6,373.2 
2411.2,757.2          "/>
+               <g>
+                       <path class="st2" 
d="M1800.3,1124.6L1681.4,1412l218.6,66.3L1800.3,1124.6z 
M1729,853.2l156.1,47.3l284.4,1025l-160.3-48.7
+                               
l-57.6-210.4L1620.2,1566l-71.3,171.4l-160.4-48.7L1729,853.2z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/packages/frontend/src/components/auth/index.tsx 
b/packages/frontend/src/components/auth/index.tsx
index 2688586..a12022a 100644
--- a/packages/frontend/src/components/auth/index.tsx
+++ b/packages/frontend/src/components/auth/index.tsx
@@ -44,7 +44,7 @@ export function LoginModal({ onConfirm, withMessage }: 
Props): VNode {
         <div class="columns is-vcentered">
           <div class="column is-12">
               <div>
-                <p>{withMessage.message}</p>
+                <p><strong>{withMessage.message}</strong></p>
                 {withMessage.description}
               </div>
             </div>
diff --git a/packages/frontend/src/components/modal/index.tsx 
b/packages/frontend/src/components/modal/index.tsx
index 6ba0101..0c04a4f 100644
--- a/packages/frontend/src/components/modal/index.tsx
+++ b/packages/frontend/src/components/modal/index.tsx
@@ -14,10 +14,11 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 
 import { h, VNode } from "preact";
 import { Message } from "preact-messages";
diff --git a/packages/frontend/src/components/navbar/index.tsx 
b/packages/frontend/src/components/navbar/index.tsx
index 08ac6d0..be381fa 100644
--- a/packages/frontend/src/components/navbar/index.tsx
+++ b/packages/frontend/src/components/navbar/index.tsx
@@ -22,6 +22,8 @@
 import { h, VNode } from 'preact';
 import * as messages from '../../messages'
 import logo from '../../assets/logo.jpeg';
+import langIcon from '../../assets/icons/languageicon.svg'
+import { Message } from 'preact-messages';
 
 interface Props {
   lang: string;
@@ -50,11 +52,11 @@ export function NavigationBar({ lang, setLang, onLogout }: 
Props): VNode {
           <div class="control has-icons-left">
             <div class="select">
               <select onChange={(e): void => setLang(e.currentTarget.value)}>
-                {Object.keys(messages).map(l => <option selected={lang === l} 
value={l}>{l}</option>)}
+                {Object.keys(messages).map(l => <option selected={lang === l} 
value={l}><Message id={l} /></option>)}
               </select>
             </div>
             <div class="icon is-small is-left">
-              <i class="mdi mdi-web" />
+              <img src={langIcon} />
             </div>
           </div>
         </div>
diff --git a/packages/frontend/src/components/sidebar/index.tsx 
b/packages/frontend/src/components/sidebar/index.tsx
index 42719de..0d1877f 100644
--- a/packages/frontend/src/components/sidebar/index.tsx
+++ b/packages/frontend/src/components/sidebar/index.tsx
@@ -14,14 +14,19 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
+
 
 import { h, VNode } from 'preact';
+import { useContext } from 'preact/hooks';
+import { BackendContext, ConfigContext } from '../../context/backend';
 
 export function Sidebar(): VNode {
+  const config = useContext(ConfigContext);
+  const backend = useContext(BackendContext);
   return (
     <aside class="aside is-placed-left is-expanded">
       <div class="aside-tools">
@@ -66,12 +71,24 @@ export function Sidebar(): VNode {
             </a>
           </li>
         </ul>
-        <p class="menu-label">About</p>
+        <p class="menu-label">Connection</p>
         <ul class="menu-list">
           <li>
-            <a href="https://taler.net/"; class="has-icon">
-              <span class="icon"><i class="mdi mdi-help-circle" /></span>
-              <span class="menu-item-label">About</span>
+            <a>
+            <span class="icon"><i class="mdi mdi-currency-eur" /></span>
+            <span class="menu-item-label">{config.currency}</span>
+            </a>
+          </li>
+          <li>
+          <a>
+            <span class="icon"><i class="mdi mdi-web" /></span>
+            <span class="menu-item-label">{backend.url}</span>
+            </a>
+          </li>
+          <li>
+          <a>
+            <span class="icon">V</span>
+            <span class="menu-item-label">{config.version}</span>
             </a>
           </li>
         </ul>
diff --git a/packages/frontend/src/components/yup/YupField.tsx 
b/packages/frontend/src/components/yup/YupField.tsx
index 49a8e30..b6103a2 100644
--- a/packages/frontend/src/components/yup/YupField.tsx
+++ b/packages/frontend/src/components/yup/YupField.tsx
@@ -47,6 +47,7 @@ interface PropsObject {
   value: any;
   errors: any;
   onChange: any;
+  readonly?: boolean;
 }
 
 interface Props {
@@ -56,12 +57,13 @@ interface Props {
   object: any;
   valueHandler: StateUpdater<any>;
   info: any;
+  readonly?: boolean;
 }
-export function YupField({ name, field, errors, object, valueHandler, info }: 
Props): VNode {
+export function YupField({ name, field, errors, object, valueHandler, info, 
readonly }: Props): VNode {
   const updateField = (f: string) => (v: string): void => valueHandler((prev: 
any) => ({ ...prev, [f]: v }))
   const values = {
     name, errors,
-    readonly: info?.meta?.readonly,
+    readonly: readonly || info?.meta?.readonly,
     value: object && object[field],
     onChange: updateField(field)
   }
@@ -73,6 +75,7 @@ export function YupField({ name, field, errors, object, 
valueHandler, info }: Pr
       return <YupObjectInput name={name}
         info={info} errors={errors}
         value={object && object[field]}
+        readonly={values.readonly}
         onChange={(updater: any): void => valueHandler((prev: any) => ({ 
...prev, [field]: updater(prev[field]) }))}
       />
     }
@@ -91,7 +94,7 @@ export function YupField({ name, field, errors, object, 
valueHandler, info }: Pr
   }
 }
 
-function YupObjectInput({ name, info, value, errors, onChange }: PropsObject): 
VNode {
+function YupObjectInput({ name, info, value, errors, onChange, readonly }: 
PropsObject): VNode {
   const [active, setActive] = useState(false)
   return <div class="card">
     <header class="card-header">
@@ -111,6 +114,7 @@ function YupObjectInput({ name, info, value, errors, 
onChange }: PropsObject): V
         {Object.keys(info.fields).map(f => <YupField name={`${name}.${f}`}
           field={f} errors={errors} object={value}
           valueHandler={onChange} info={info.fields[f]}
+          readonly={readonly}
         />)}
       </div>
     </div>
@@ -135,7 +139,7 @@ function YupInput({ name, readonly, value, errors, onChange 
}: PropsInputInterna
         <p class="control">
           <input class={errors[name] ? "input is-danger" : "input"} type="text"
             placeholder={placeholder} readonly={readonly}
-            name={name} value={value}
+            name={name} value={value} disabled={readonly}
             onChange={(e): void => onChange(e.currentTarget.value)} />
           <Message id={`fields.instance.${name}.help`} > </Message>
         </p>
@@ -166,19 +170,19 @@ function YupInputArray({ name, readonly, value, errors, 
onChange }: PropsInputIn
     <div class="field-body">
       <div class="field">
         <div class="field has-addons">
-          <p class="control">
-            <button class="button is-info" onClick={(): void => {
-              onChange([currentValue, ...array])
-              setCurrentValue('')
-            }} >add</button>
-          </p>
           <p class="control">
             <input class={errors[name] ? "input is-danger" : "input"} 
type="text"
-              placeholder={placeholder} readonly={readonly}
+              placeholder={placeholder} readonly={readonly} disabled={readonly}
               name={name} value={currentValue}
               onChange={(e): void => setCurrentValue(e.currentTarget.value)} />
             <Message id={`fields.instance.${name}.help`} > </Message>
           </p>
+          <p class="control">
+            <button class="button is-info" onClick={(): void => {
+              onChange([currentValue, ...array])
+              setCurrentValue('')
+            }} >add</button>
+          </p>
         </div>
         {errors[name] ? <p class="help is-danger">
           <Message id={`validation.${errors[name].type}`} 
fields={errors[name].params}>{errors[name].message}</Message>
@@ -218,7 +222,7 @@ function YupInputWithAddon({ name, readonly, value, errors, 
onChange, addon, atT
           </div>}
           <p class="control is-expanded">
             <input class={errors[name] ? "input is-danger" : "input"} 
type="text"
-              placeholder={placeholder} readonly={readonly}
+              placeholder={placeholder} readonly={readonly} disabled={readonly}
               name={name} value={value}
               onChange={(e): void => onChange(e.currentTarget.value)} />
             <Message id={`fields.instance.${name}.help`} > </Message>
diff --git a/packages/frontend/src/context/backend.ts 
b/packages/frontend/src/context/backend.ts
index f48b2e3..31d9e62 100644
--- a/packages/frontend/src/context/backend.ts
+++ b/packages/frontend/src/context/backend.ts
@@ -1,3 +1,18 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ 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 { createContext } from 'preact'
 import { StateUpdater } from 'preact/hooks'
 
@@ -14,6 +29,7 @@ export interface BackendContextType {
 
 export interface ConfigContextType {
   currency?: string;
+  version?: string;
 }
 
 export interface InstanceContextType {
@@ -34,6 +50,7 @@ export const BackendContext = 
createContext<BackendContextType>({
 
 export const ConfigContext = createContext<ConfigContextType>({
   currency: undefined,
+  version: undefined,
 })
 
 export const InstanceContext = createContext<InstanceContextType>({
diff --git a/packages/frontend/src/custom.d.ts 
b/packages/frontend/src/custom.d.ts
index bdf59ac..e9defe8 100644
--- a/packages/frontend/src/custom.d.ts
+++ b/packages/frontend/src/custom.d.ts
@@ -1,3 +1,18 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ 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/>
+ */
 declare module '*.po' {
   const content: any;
   export default content;
@@ -6,3 +21,7 @@ declare module "*.jpeg" {
   const content: any;
   export default content;
 }
+declare module '*.svg' {
+  const content: any;
+  export default content;
+}
diff --git a/packages/frontend/src/declaration.d.ts 
b/packages/frontend/src/declaration.d.ts
index a81260a..6e420c4 100644
--- a/packages/frontend/src/declaration.d.ts
+++ b/packages/frontend/src/declaration.d.ts
@@ -31,6 +31,7 @@ interface Notification {
     params?: any;
 }
 
+type ValueOrFunction<T> = T | ((p: T) => T)
 type MessageType = 'INFO' | 'WARN' | 'ERROR' | 'SUCCESS'
 
 type EddsaPublicKey = string;
diff --git a/packages/frontend/src/hooks/index.ts 
b/packages/frontend/src/hooks/index.ts
index 69a5e8e..b832613 100644
--- a/packages/frontend/src/hooks/index.ts
+++ b/packages/frontend/src/hooks/index.ts
@@ -20,10 +20,12 @@
 */
 
 import { StateUpdater, useEffect, useState } from "preact/hooks";
-import { mutate } from 'swr';
+import { ValueOrFunction } from '../declaration';
 
 export function useBackendURL(): [string, StateUpdater<string>] {
-  return useNotNullLocalStorage('backend-url', typeof window !== 'undefined' ? 
window.location.origin : '')
+  const [value, setter] = useNotNullLocalStorage('backend-url', typeof window 
!== 'undefined' ? window.location.origin : '')
+  const checkedSetter = (v: ValueOrFunction<string>) => setter(p => (v 
instanceof Function ? v(p) : v).replace(/\/$/, ''))
+  return [value, checkedSetter]
 }
 export function useBackendDefaultToken(): [string | undefined, 
StateUpdater<string | undefined>] {
   return useLocalStorage('backend-token')
@@ -46,7 +48,7 @@ export function useBackendInstanceToken(id: string): [string 
| undefined, StateU
       return all.concat(id).filter(Boolean).join(',')
     })
   }, [id, setIds])
-  
+
   return [token, setToken, clearAllTokens]
 }
 
@@ -75,15 +77,17 @@ export function useLocalStorage(key: string, initialValue?: 
string): [string | u
   });
 
   const setValue = (value?: string | ((val?: string) => string | undefined)) 
=> {
-    const valueToStore = value instanceof Function ? value(storedValue) : 
value;
-    setStoredValue(valueToStore);
-    if (typeof window !== "undefined") {
-      if (!valueToStore) {
-        window.localStorage.removeItem(key)
-      } else {
-        window.localStorage.setItem(key, valueToStore);
+    setStoredValue(p => {
+      const toStore = value instanceof Function ? value(p) : value
+      if (typeof window !== "undefined") {
+        if (!toStore) {
+          window.localStorage.removeItem(key)
+        } else {
+          window.localStorage.setItem(key, toStore);
+        }
       }
-    }
+      return toStore
+    })
   };
 
   return [storedValue, setValue];
diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx
index ea2ef54..a4885cc 100644
--- a/packages/frontend/src/index.tsx
+++ b/packages/frontend/src/index.tsx
@@ -122,11 +122,11 @@ function AppReady({ pushNotification,addTokenCleaner }: { 
pushNotification: (n:
       }}
 
       onUpdate={(id: string): void => {
-        route(`/instance/${id}/update`)
+        route(`/instance/${id}/`)
       }}
 
       onUnauthorized={() => <Login
-        withMessage={{ message: i18n`unauthorized`, type: 'ERROR', }}
+        withMessage={{ message: i18n`Access denied`, description: i18n`Check 
your token is valid`, type: 'ERROR', }}
         onConfirm={updateLoginStatus}
       />}
 
@@ -211,9 +211,10 @@ function SubPages({ id, pushNotification, addTokenCleaner 
}: SubPagesProps): VNo
     <Router>
       <Route path={InstancePages.details}
         component={Details}
+        pushNotification={pushNotification}
 
         onUnauthorized={() => <Login
-          withMessage={{ message: i18n`unauthorized`, type: 'ERROR', }}
+          withMessage={{ message: i18n`Access denied`, description: i18n`Check 
your token is valid`, type: 'ERROR', }}
           onConfirm={updateLoginStatus}
         />}
 
@@ -221,6 +222,10 @@ function SubPages({ id, pushNotification, addTokenCleaner 
}: SubPagesProps): VNo
           route(`/instance/${id}/update`)
         }}
 
+        onDelete={() => {
+          route(`/instances`)
+        }}
+
         onLoadError={(e: SwrError) => {
           pushNotification({ message: i18n`update_load_error`, type: 'ERROR', 
params: e })
           route(`/instance/${id}/`)
@@ -230,8 +235,10 @@ function SubPages({ id, pushNotification, addTokenCleaner 
}: SubPagesProps): VNo
 
       <Route path={InstancePages.update}
         component={Update}
+        // pushNotification={pushNotification}
+
         onUnauthorized={() => <Login
-          withMessage={{ message: i18n`unauthorized`, type: 'ERROR', }}
+          withMessage={{ message: i18n`Access denied`, description: i18n`Check 
your token is valid`, type: 'ERROR', }}
           onConfirm={updateLoginStatus}
         />}
         onLoadError={(e: SwrError) => {
diff --git a/packages/frontend/src/messages/en.po 
b/packages/frontend/src/messages/en.po
index b0be0c0..c8819bd 100644
--- a/packages/frontend/src/messages/en.po
+++ b/packages/frontend/src/messages/en.po
@@ -137,7 +137,7 @@ msgid "Couldnt access the server"
 msgstr "Couldnt access the server"
 
 msgid "Got message: %s from: %s (hasToken: %s)"
-msgstr "Recibimos el mensaje: %s desde: %s (con token: %s)"
+msgstr "Got message \"%s\" from %s"
 
 msgid "Merchant"
 msgstr "Merchant"
@@ -152,4 +152,43 @@ msgid "Cancel"
 msgstr "Cancel"
 
 msgid "Confirm"
-msgstr "Confirm"
\ No newline at end of file
+msgstr "Confirm"
+
+msgid "en"
+msgstr "English [en]"
+
+msgid "es"
+msgstr "EspaƱol [es]"
+
+msgid "fields.instance.id.label"
+msgstr "Id"
+
+msgid "fields.instance.name.label"
+msgstr "Business Name"
+
+msgid "fields.instance.merchant_pub.label"
+msgstr "Public Key"
+
+msgid "fields.instance.payment_targets.label"
+msgstr "Payment targets"
+
+msgid "Access denied"
+msgstr "Access denied"
+
+msgid "Check your token is valid"
+msgstr "Check your token is valid"
+
+msgid "delete"
+msgstr "Delete"
+
+msgid "update"
+msgstr "Update"
+
+msgid "Instance details"
+msgstr "Instance details"
+
+
+
+
+
+
diff --git a/packages/frontend/src/messages/index.ts 
b/packages/frontend/src/messages/index.ts
index 3b965a4..f060157 100644
--- a/packages/frontend/src/messages/index.ts
+++ b/packages/frontend/src/messages/index.ts
@@ -1,3 +1,18 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ 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/>
+ */
 export * as en from './en.po'
 export * as es from './es.po'
 
diff --git a/packages/frontend/src/routes/instances/create/index.tsx 
b/packages/frontend/src/routes/instances/create/index.tsx
index 4af7b5a..819b549 100644
--- a/packages/frontend/src/routes/instances/create/index.tsx
+++ b/packages/frontend/src/routes/instances/create/index.tsx
@@ -1,3 +1,18 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ 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 { h, VNode } from "preact";
 import { MerchantBackend } from "../../../declaration";
 import { useBackendMutateAPI } from "../../../hooks/backend";
diff --git a/packages/frontend/src/routes/instances/details/DetailPage.tsx 
b/packages/frontend/src/routes/instances/details/DetailPage.tsx
index 17dab63..908366c 100644
--- a/packages/frontend/src/routes/instances/details/DetailPage.tsx
+++ b/packages/frontend/src/routes/instances/details/DetailPage.tsx
@@ -23,7 +23,7 @@ import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
 import { MerchantBackend } from "../../../declaration";
 import { YupField } from "../../../components/yup/YupField"
-import { InstanceUpdateSchema as schema } from '../../../schemas'
+import { InstanceSchema as schema } from '../../../schemas'
 import { Message } from "preact-messages";
 
 interface Props {
@@ -87,15 +87,22 @@ export function DetailPage({ onUpdate, isLoading, selected, 
onDelete }: Props):
     <section class="section is-main-section">
       <div class="columns">
         <div class="column" />
-        <div class="column is-two-thirds">
-          {Object.keys(schema.fields)
+        <div class="column is-6">
+          {Object.keys(schema.pick(['name','address']).fields)
             .map(f => <YupField name={f}
               field={f} errors={errors} object={value}
               valueHandler={valueHandler} info={schema.fields[f].describe()}
+              readonly
             />)}
           <div class="buttons is-right">
-            <button class="button is-danger" onClick={() => onDelete()} 
><Message id="delete" /></button>
-            <button class="button is-success" onClick={() => onUpdate()} 
><Message id="update" /></button>
+            <button class="button is-danger" onClick={() => onDelete()} >
+              <span class="icon"><i class="mdi mdi-delete" /></span>
+              <span><Message id="delete" /></span>
+            </button>
+            <button class="button is-success" onClick={() => onUpdate()} >
+              <span class="icon"><i class="mdi mdi-pen" /></span>
+              <span><Message id="update" /></span>
+            </button>
           </div>
         </div>
         <div class="column" />
diff --git a/packages/frontend/src/routes/instances/details/index.tsx 
b/packages/frontend/src/routes/instances/details/index.tsx
index ffd3be8..da57b27 100644
--- a/packages/frontend/src/routes/instances/details/index.tsx
+++ b/packages/frontend/src/routes/instances/details/index.tsx
@@ -1,3 +1,18 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ 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 { Fragment, h, VNode } from "preact";
 import { useContext, useState } from "preact/hooks";
 import { InstanceContext } from "../../../context/backend";
@@ -10,10 +25,11 @@ interface Props {
   onUnauthorized: () => VNode;
   onLoadError: (e: SwrError) => VNode;
   onUpdate: () => void;
+  onDelete: () => void;
   pushNotification: (n: Notification) => void;
 }
 
-export default function Detail({ onUpdate, onLoadError, onUnauthorized, 
pushNotification }: Props): VNode {
+export default function Detail({ onUpdate, onLoadError, onUnauthorized, 
pushNotification, onDelete }: Props): VNode {
   const { id } = useContext(InstanceContext)
   const details = useBackendInstance()
   const [deleting, setDeleting] = useState<boolean>(false)
@@ -31,22 +47,23 @@ export default function Detail({ onUpdate, onLoadError, 
onUnauthorized, pushNoti
   return <Fragment>
     <DetailPage
       isLoading={false}
-      selected={details.data} 
+      selected={details.data}
       onUpdate={onUpdate}
-      onDelete={() => setDeleting(true) }
+      onDelete={() => setDeleting(true)}
     />
-    {deleting && <DeleteModal 
-      element={{name: details.data.name, id }} 
-      onCancel={() => setDeleting(false) } 
+    {deleting && <DeleteModal
+      element={{ name: details.data.name, id }}
+      onCancel={() => setDeleting(false)}
       onConfirm={async (): Promise<void> => {
         try {
           await deleteInstance()
           pushNotification({ message: 'delete_success', type: 'SUCCESS' })
+          onDelete()
         } catch (error) {
           pushNotification({ message: 'delete_error', type: 'ERROR', params: 
error })
         }
         setDeleting(false)
-    }}
+      }}
     />}
 
   </Fragment>
diff --git a/packages/frontend/src/routes/instances/list/EmptyTable.tsx 
b/packages/frontend/src/routes/instances/list/EmptyTable.tsx
index 154e3a8..e1de4da 100644
--- a/packages/frontend/src/routes/instances/list/EmptyTable.tsx
+++ b/packages/frontend/src/routes/instances/list/EmptyTable.tsx
@@ -20,8 +20,7 @@
  */
 
 import { h, VNode } from "preact";
-import { useMessageTemplate } from "preact-messages";
-import { Message } from "preact-messages";
+import { Message, useMessageTemplate } from "preact-messages";
 
 export function EmptyTable(): VNode {
   return <div class="content has-text-grey has-text-centered">
diff --git a/packages/frontend/src/routes/instances/list/Table.tsx 
b/packages/frontend/src/routes/instances/list/Table.tsx
index a7298ef..961832e 100644
--- a/packages/frontend/src/routes/instances/list/Table.tsx
+++ b/packages/frontend/src/routes/instances/list/Table.tsx
@@ -47,10 +47,10 @@ export function Table({ rowSelection, rowSelectionHandler, 
instances, onUpdate,
               <span class="check" />
             </label>
           </th>
-          <th><Message id="fields_instance_id_label" /></th>
-          <th><Message id="fields_instance_name_label" /></th>
-          <th><Message id="fields_instance_merchant_pub_label" /></th>
-          <th><Message id="fields_instance_payment_targets_label" /></th>
+          <th><Message id="fields.instance.id.label" /></th>
+          <th><Message id="fields.instance.name.label" /></th>
+          <th><Message id="fields.instance.merchant_pub.label" /></th>
+          <th><Message id="fields.instance.payment_targets.label" /></th>
           <th />
         </tr>
       </thead>
@@ -69,7 +69,7 @@ export function Table({ rowSelection, rowSelectionHandler, 
instances, onUpdate,
             <td >{i.payment_targets}</td>
             <td class="is-actions-cell">
               <div class="buttons is-right">
-                <button class="button is-small is-primary" type="button" 
onClick={(): void => onUpdate(i.id)}>
+                <button class="button is-small is-link" type="button" 
onClick={(): void => onUpdate(i.id)}>
                   <span class="icon"><i class="mdi mdi-eye" /></span>
                 </button>
                 <button class="button is-small is-danger jb-modal" 
type="button" onClick={(): void => onDelete(i)}>
diff --git a/packages/frontend/src/routes/instances/update/index.tsx 
b/packages/frontend/src/routes/instances/update/index.tsx
index ecaad37..f27908c 100644
--- a/packages/frontend/src/routes/instances/update/index.tsx
+++ b/packages/frontend/src/routes/instances/update/index.tsx
@@ -1,3 +1,18 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ 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 { h, VNode } from "preact";
 import { MerchantBackend } from "../../../declaration";
 import { SwrError, useBackendInstance, useBackendInstanceMutateAPI } from 
"../../../hooks/backend";
diff --git a/packages/frontend/src/routes/login/index.tsx 
b/packages/frontend/src/routes/login/index.tsx
index b7aa67a..b8cc5d6 100644
--- a/packages/frontend/src/routes/login/index.tsx
+++ b/packages/frontend/src/routes/login/index.tsx
@@ -1,3 +1,23 @@
+/*
+ This file is part of GNU Taler
+ (C) 2021 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ 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/>
+ */
+
+ /**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
 import { h, VNode } from "preact";
 import { LoginModal } from '../../components/auth';
 import { Notification } from "../../declaration";
diff --git a/packages/frontend/src/schemas/index.ts 
b/packages/frontend/src/schemas/index.ts
index b047bc8..054b363 100644
--- a/packages/frontend/src/schemas/index.ts
+++ b/packages/frontend/src/schemas/index.ts
@@ -21,7 +21,6 @@
 
 import * as yup from 'yup';
 import { AMOUNT_REGEX, PAYTO_REGEX } from "../constants";
-import { Duration } from '../declaration';
 
 yup.setLocale({
   mixed: {
@@ -46,7 +45,7 @@ function listOfPayToUrisAreValid(values?: (string | 
undefined)[]): boolean {
 function currencyWithAmountIsValid(value?: string): boolean {
   return !!value && AMOUNT_REGEX.test(value)
 }
-const InstanceSchema = yup.object().shape({
+export const InstanceSchema = yup.object().shape({
   id: yup.string().required().meta({type: 'url'}),
   name: yup.string().required(),
   auth_token: yup.string()
diff --git a/packages/frontend/src/scss/_aside.scss 
b/packages/frontend/src/scss/_aside.scss
index 3fbb1ee..9598c60 100644
--- a/packages/frontend/src/scss/_aside.scss
+++ b/packages/frontend/src/scss/_aside.scss
@@ -131,7 +131,7 @@ aside.aside {
 }
 
 @include touch {
-  #app, nav.navbar {
+   nav.navbar {
     @include transition(margin-left);
   }
   aside.aside {
@@ -141,7 +141,7 @@ aside.aside {
     body {
       overflow-x: hidden;
     }
-    body, #app, nav.navbar {
+    body,  nav.navbar {
       width: 100vw;
     }
     aside.aside {
@@ -172,7 +172,7 @@ aside.aside {
     }
   }
   html.has-aside-mobile-expanded {
-    #app, nav.navbar {
+     nav.navbar {
       margin-left: $aside-mobile-width;
     }
     aside.aside {
diff --git a/packages/frontend/src/scss/_theme-default.scss 
b/packages/frontend/src/scss/_theme-default.scss
index e9540e7..3ad807b 100644
--- a/packages/frontend/src/scss/_theme-default.scss
+++ b/packages/frontend/src/scss/_theme-default.scss
@@ -122,3 +122,5 @@ $progress-bar-background-color: $grey-lighter;
 /* Icon: specifics */
 $icon-update-mark-size: $size-base * .5;
 $icon-update-mark-color: $yellow;
+
+$input-disabled-border-color: $grey-lighter;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 934ddbf..ac25c28 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -40,6 +40,7 @@ importers:
       enzyme-adapter-preact-pure: 3.0.0_enzyme@3.11.0+preact@10.5.12
       eslint: 7.20.0
       eslint-config-preact: 1.1.3_eslint@7.20.0+typescript@4.1.5
+      eslint-plugin-header: 3.1.1_eslint@7.20.0
       jest: 26.6.3
       jest-preset-preact: 4.0.2_120c6743da4bd73ebdbf5629f89f97bc
       messageformat-po-loader: 0.3.0_messageformat@2.3.0
@@ -82,6 +83,7 @@ importers:
       enzyme-adapter-preact-pure: ^3.0.0
       eslint: ^7.20.0
       eslint-config-preact: ^1.1.1
+      eslint-plugin-header: ^3.1.1
       jest: ^26.2.2
       jest-preset-preact: ^4.0.2
       messageformat: ^2.3.0
@@ -7131,6 +7133,14 @@ packages:
       eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0
     resolution:
       integrity: 
sha512-lt3l5PHFHVEYSZ5zijcoYvtQJPsBifRiH5N0Et57KwVu7l/yxmHhSG6VJiLMa/lXrg93Qu8049RNQOMn0+yJBg==
+  /eslint-plugin-header/3.1.1_eslint@7.20.0:
+    dependencies:
+      eslint: 7.20.0
+    dev: true
+    peerDependencies:
+      eslint: '>=7.7.0'
+    resolution:
+      integrity: 
sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==
   /eslint-plugin-jest/23.20.0_eslint@7.20.0+typescript@4.1.5:
     dependencies:
       '@typescript-eslint/experimental-utils': 
2.34.0_eslint@7.20.0+typescript@4.1.5

-- 
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]