From aa4fbb700c5396c64eb6101546fd1c1922a987b6 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Fri, 3 Mar 2023 13:52:49 +0000 Subject: [PATCH 01/22] svelte --- .gitignore | 24 + Makefile | 3 +- service/pom.xml | 21 + .../app/fullstackdemo/GreetingResource.java | 16 - .../fullstackdemo/hello/GreetingResource.java | 56 + .../app/fullstackdemo/{ => hello}/Hello.java | 2 +- .../app/fullstackdemo/users/Roles.java | 9 + .../app/fullstackdemo/users/User.java | 57 + .../src/main/resources/application.properties | 8 + service/src/main/resources/privateKey.pem | 28 + service/src/main/resources/publicKey.pem | 9 + service/src/main/resources/rsaPrivateKey.pem | 27 + .../app/fullstackdemo/GenerateToken.java | 21 + .../{ => hello}/GreetingResourceTest.java | 2 +- .../{ => hello}/NativeGreetingResourceIT.java | 2 +- web/.env.development | 2 - web/index.html | 14 +- web/package.json | 43 +- web/postcss.config.cjs | 13 + web/src/App.svelte | 167 ++ web/src/App.tsx | 21 - web/src/app.postcss | 4 + web/src/assets/svelte.svg | 5 + web/src/components/HelloDemo.tsx | 37 - web/src/components/index.ts | 1 - web/src/favicon.svg | 15 - web/src/index.css | 13 - web/src/lib/Counter.svelte | 11 + web/src/lib/EmptyPage.svelte | 15 + web/src/lib/Hamburger.svelte | 45 + web/src/lib/Kbd.svelte | 11 + web/src/lib/Logo.svelte | 9 + web/src/lib/Main.svelte | 3 + web/src/lib/Menu.svelte | 10 + web/src/lib/Navbar.svelte | 31 + web/src/lib/Navigation.svelte | 335 ++++ web/src/lib/Search.svelte | 167 ++ web/src/lib/SideBar.svelte | 15 + web/src/lib/icons.ts | 46 + web/src/logo.svg | 7 - web/src/main.ts | 8 + web/src/main.tsx | 11 - web/src/page.ts | 6 + web/src/vite-env.d.ts | 1 - web/svelte.config.js | 13 + web/tailwind.config.cjs | 11 + web/tsconfig.json | 24 +- web/tsconfig.node.json | 4 +- web/vite.config.ts | 7 +- web/yarn.lock | 1755 +++++++++-------- 50 files changed, 2203 insertions(+), 962 deletions(-) delete mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/GreetingResource.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java rename service/src/main/java/com/lopixlabs/app/fullstackdemo/{ => hello}/Hello.java (67%) create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java create mode 100644 service/src/main/resources/privateKey.pem create mode 100644 service/src/main/resources/publicKey.pem create mode 100644 service/src/main/resources/rsaPrivateKey.pem create mode 100644 service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java rename service/src/test/java/com/lopixlabs/app/fullstackdemo/{ => hello}/GreetingResourceTest.java (89%) rename service/src/test/java/com/lopixlabs/app/fullstackdemo/{ => hello}/NativeGreetingResourceIT.java (79%) delete mode 100644 web/.env.development create mode 100644 web/postcss.config.cjs create mode 100644 web/src/App.svelte delete mode 100644 web/src/App.tsx create mode 100644 web/src/app.postcss create mode 100644 web/src/assets/svelte.svg delete mode 100644 web/src/components/HelloDemo.tsx delete mode 100644 web/src/components/index.ts delete mode 100644 web/src/favicon.svg delete mode 100644 web/src/index.css create mode 100644 web/src/lib/Counter.svelte create mode 100644 web/src/lib/EmptyPage.svelte create mode 100644 web/src/lib/Hamburger.svelte create mode 100644 web/src/lib/Kbd.svelte create mode 100644 web/src/lib/Logo.svelte create mode 100644 web/src/lib/Main.svelte create mode 100644 web/src/lib/Menu.svelte create mode 100644 web/src/lib/Navbar.svelte create mode 100644 web/src/lib/Navigation.svelte create mode 100644 web/src/lib/Search.svelte create mode 100644 web/src/lib/SideBar.svelte create mode 100644 web/src/lib/icons.ts delete mode 100644 web/src/logo.svg create mode 100644 web/src/main.ts delete mode 100644 web/src/main.tsx create mode 100644 web/src/page.ts delete mode 100644 web/src/vite-env.d.ts create mode 100644 web/svelte.config.js create mode 100644 web/tailwind.config.cjs diff --git a/.gitignore b/.gitignore index bdf57ce3..ace9cb13 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,27 @@ nb-configuration.xml # Local environment .env + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json + +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/Makefile b/Makefile index 8ef162ab..aa003851 100644 --- a/Makefile +++ b/Makefile @@ -27,4 +27,5 @@ web-build: web-dev: yarn start --prefix ./web - +generate-jwt: + mvn exec:java -pl "service" -Dexec.mainClass=com.lopixlabs.app.fullstackdemo.GenerateToken -Dexec.classpathScope=test -Dsmallrye.jwt.sign.key.location=privateKey.pem diff --git a/service/pom.xml b/service/pom.xml index 8596e2ac..8ccd30d1 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -23,6 +23,22 @@ io.quarkus quarkus-smallrye-openapi + + io.quarkus + quarkus-smallrye-jwt + + + io.quarkus + quarkus-smallrye-jwt-build + + + io.quarkus + quarkus-hibernate-orm-panache + + + io.quarkus + quarkus-jdbc-postgresql + org.projectlombok lombok @@ -33,6 +49,11 @@ quarkus-junit5 test + + io.quarkus + quarkus-test-security-jwt + test + io.rest-assured rest-assured diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/GreetingResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/GreetingResource.java deleted file mode 100644 index a0762875..00000000 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/GreetingResource.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.lopixlabs.app.fullstackdemo; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -@Path("/hello") -@Produces(MediaType.APPLICATION_JSON) -public class GreetingResource { - - @GET - public Hello hello() { - return Hello.of("hello from quarkus!!!"); - } -} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java new file mode 100644 index 00000000..20fbab46 --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java @@ -0,0 +1,56 @@ +package com.lopixlabs.app.fullstackdemo.hello; + +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.inject.Inject; +import javax.ws.rs.GET; +import javax.ws.rs.InternalServerErrorException; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.SecurityContext; +import org.eclipse.microprofile.jwt.JsonWebToken; + +@Path("/hello") +@Produces(MediaType.APPLICATION_JSON) +public class GreetingResource { + @Inject + JsonWebToken jwt; + + @GET + @Path("permit-all") + @PermitAll + public Hello hello(@Context SecurityContext ctx) { + return Hello.of(getResponseString(ctx)); + } + @GET + @Path("roles-allowed") + @RolesAllowed({ "User", "Admin" }) + @Produces(MediaType.TEXT_PLAIN) + public Hello helloRolesAllowed(@Context SecurityContext ctx) { + return Hello.of(getResponseString(ctx) + ", birthdate: " + jwt.getClaim("birthdate").toString()); + } + + + private String getResponseString(SecurityContext ctx) { + String name; + if (ctx.getUserPrincipal() == null) { + name = "anonymous"; + } else if (!ctx.getUserPrincipal().getName().equals(jwt.getName())) { + throw new InternalServerErrorException("Principal and JsonWebToken names do not match"); + } else { + name = ctx.getUserPrincipal().getName(); + } + return String.format("hello + %s," + + " isHttps: %s," + + " authScheme: %s," + + " hasJWT: %s", + name, ctx.isSecure(), ctx.getAuthenticationScheme(), hasJwt()); + } + + private boolean hasJwt() { + return jwt.getClaimNames() != null; + } + +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/Hello.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/Hello.java similarity index 67% rename from service/src/main/java/com/lopixlabs/app/fullstackdemo/Hello.java rename to service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/Hello.java index b5ea4608..66b975ea 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/Hello.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/Hello.java @@ -1,4 +1,4 @@ -package com.lopixlabs.app.fullstackdemo; +package com.lopixlabs.app.fullstackdemo.hello; import lombok.Value; diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java new file mode 100644 index 00000000..f76804b8 --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java @@ -0,0 +1,9 @@ +package com.lopixlabs.app.fullstackdemo.users; + +import javax.persistence.Entity; +import lombok.Data; + +@Entity +@Data +public class Roles { +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java new file mode 100644 index 00000000..68f45688 --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java @@ -0,0 +1,57 @@ +package com.lopixlabs.app.fullstackdemo.users; + +import static lombok.AccessLevel.PRIVATE; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.OneToMany; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.GenericGenerator; + +@Data +@NoArgsConstructor() +@AllArgsConstructor(access = PRIVATE) +@Accessors(chain = true) +@EqualsAndHashCode(of = {"id"}) +@Builder(toBuilder = true) +public class User extends PanacheEntityBase { + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid") + @Column(name = "id", nullable = false, updatable = false) + private String id; + @NotNull + private String name; + + @CreationTimestamp + @Column(name = "pes_data_hora_cadastro") + private LocalDateTime createAt = LocalDateTime.now(); + @Email + private String email; + + private Boolean enabled = true; + + private String password; + + @OneToMany(fetch = FetchType.EAGER) + @JoinTable() + private List roles = new ArrayList<>(); +} diff --git a/service/src/main/resources/application.properties b/service/src/main/resources/application.properties index 5c3c0b0d..4c5349dd 100644 --- a/service/src/main/resources/application.properties +++ b/service/src/main/resources/application.properties @@ -2,3 +2,11 @@ quarkus.smallrye-openapi.store-schema-directory=src/main/resources/api %dev.quarkus.http.cors=true quarkus.http.access-log.enabled=true +# +quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".level=TRACE +quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".min-level=TRACE + +mp.jwt.verify.publickey.location=publicKey.pem +mp.jwt.verify.issuer=https://localhost/issuer + +quarkus.native.resources.includes=publicKey.pem diff --git a/service/src/main/resources/privateKey.pem b/service/src/main/resources/privateKey.pem new file mode 100644 index 00000000..19dbe61c --- /dev/null +++ b/service/src/main/resources/privateKey.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDYnJ3r2stJLdEo +IV3e3C+qjE91yHVhKAQ+0eJdSTPUzbhsrRPCjV6TGHi5S5jkNj4um0SVI6scV0aK +lwpeewFssK26X8Be/afuveGEyhkFNkbOdfjI9/Oug7Zl/fZXl21+CYH2SWxXXwx9 +DGcPcR6gB3jwsB2BqVKnywbTflbzhrt7WToc3uj0F20Q4j2qsPDtRjIXAsICqsdb +IQIPKaVaqBDf+GyFIS+3lrbplbVo6aHo3OMfP8KiDKnKK/Pq1yPanMxZHBjUBk0S +PxLijlKn7DA11SpdGkp5S97DdbWceAcMflvM0KwONd/N5s3Ai9fhdPZa5uO++l2T +b9ey0P5dAgMBAAECggEAbkzyLZOwSIdIJkM3ZbCBpTrli3iULPEPmF2QAyiveAF5 +k/1ePod2TTj84H4aULs+VsVB2x/algfrJ89ZvFqukwY0sN7pOnW3+d4+5Dt1Gi5V +R/TSxqNcNtVjH/R+aIP3gWKeByfEP4lq9pJGOJrFmX+0mftUSx5JtJ+xzihbZo2Z +JCUOOMG71yk6Zx1dWUQi6eUwHAKF1lxbSZHmtdAKU1UIOm+eXVl1AvdiGxyFGY/i +mqEyF1afBX4WFSY0Myk3p82XJLjPclqOL+2jQ9nP696NOg17r3doM1vjbyWV6O4n +cSHUYigV2H4HOo/o3W6hmH4XHKTtf2nSQCPGgdSSAQKBgQDymkWfRaDSl/gGphLV +TXfPXdkRMSafP3ygYVwsGCkTz1mAjk0XgnFGGGO1zd8eJtrZK763+hA8q9kdQRiP +93uPUJNSZfg71lpftNqQl58Blsl4kMFE6by8WjxaEi86lFoyRZMHCup9QJEbVk6i +ZsnaDMFTgqOKuTpJaqkNx+zSIQKBgQDkkugTgjdkwGv58foOMXSwKnFwi6Cnveqa +bSIVZEdq8rAFUp8k66zbUdc/7ke5+hCIKNJXgsSCN6SIPtkUZ/pxRmYmvyFgY1BM +psqClpBJ72zXrLpgZVGm9Fjk3WREXQzr05UI77UWd1RQqOFTSpqCFl5l2phECB5E +YU/1WrZcvQKBgQCL1oDrHadlvFMrAe85JD47OU01q68ne+DKUVRf1k1XLd3ZTC0D +sBy62rQex1wkdSEQrTZxtaJGVof/ZNZTpcODCF7i0AQV+ah+IjEZx0vQDqpy5H2C +y3gO2bSP9otiqMCU2aW2GYSwTddWepk44ybWmSOWj2bVP49pYiGv392SAQKBgQDB +ynvQ7noghbQGOc4T8oJISfPbw8X18eLSAuz+zgJu/kuWd7JODzKC0CR7I37Ugts5 +VcLgRxJshNiOWxqZXn7LQzCgcTPPEOSn2FGh3h1/UesqAFwUFlLgBhLIF5xHCc1G +tCCLbxBNd+aYbFZ906aj3Gs0V9z48RkYSJkOIFa00QKBgDdYMrUXn1N2WsToJ1W/ +f2UO7qwQNyT9RD8WAGSBCWyEYxok5dTbXezI88QYPWQna1qPn2daHPbKV3O3K82l +rzV1/sXD1LQu+cse1Tv85H99AL4CJyeUugWTiaVU+BvavCoTNDjKOf8W7fzGlz1g +n1qeDefY4o5AqUpeBizG2kvV +-----END PRIVATE KEY----- diff --git a/service/src/main/resources/publicKey.pem b/service/src/main/resources/publicKey.pem new file mode 100644 index 00000000..7ea50bf9 --- /dev/null +++ b/service/src/main/resources/publicKey.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Jyd69rLSS3RKCFd3twv +qoxPdch1YSgEPtHiXUkz1M24bK0Two1ekxh4uUuY5DY+LptElSOrHFdGipcKXnsB +bLCtul/AXv2n7r3hhMoZBTZGznX4yPfzroO2Zf32V5dtfgmB9klsV18MfQxnD3Ee +oAd48LAdgalSp8sG035W84a7e1k6HN7o9BdtEOI9qrDw7UYyFwLCAqrHWyECDyml +WqgQ3/hshSEvt5a26ZW1aOmh6NzjHz/Cogypyivz6tcj2pzMWRwY1AZNEj8S4o5S +p+wwNdUqXRpKeUvew3W1nHgHDH5bzNCsDjXfzebNwIvX4XT2Wubjvvpdk2/XstD+ +XQIDAQAB +-----END PUBLIC KEY----- diff --git a/service/src/main/resources/rsaPrivateKey.pem b/service/src/main/resources/rsaPrivateKey.pem new file mode 100644 index 00000000..53230267 --- /dev/null +++ b/service/src/main/resources/rsaPrivateKey.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA2Jyd69rLSS3RKCFd3twvqoxPdch1YSgEPtHiXUkz1M24bK0T +wo1ekxh4uUuY5DY+LptElSOrHFdGipcKXnsBbLCtul/AXv2n7r3hhMoZBTZGznX4 +yPfzroO2Zf32V5dtfgmB9klsV18MfQxnD3EeoAd48LAdgalSp8sG035W84a7e1k6 +HN7o9BdtEOI9qrDw7UYyFwLCAqrHWyECDymlWqgQ3/hshSEvt5a26ZW1aOmh6Nzj +Hz/Cogypyivz6tcj2pzMWRwY1AZNEj8S4o5Sp+wwNdUqXRpKeUvew3W1nHgHDH5b +zNCsDjXfzebNwIvX4XT2Wubjvvpdk2/XstD+XQIDAQABAoIBAG5M8i2TsEiHSCZD +N2WwgaU65Yt4lCzxD5hdkAMor3gBeZP9Xj6Hdk04/OB+GlC7PlbFQdsf2pYH6yfP +WbxarpMGNLDe6Tp1t/nePuQ7dRouVUf00sajXDbVYx/0fmiD94FingcnxD+JavaS +RjiaxZl/tJn7VEseSbSfsc4oW2aNmSQlDjjBu9cpOmcdXVlEIunlMBwChdZcW0mR +5rXQClNVCDpvnl1ZdQL3YhschRmP4pqhMhdWnwV+FhUmNDMpN6fNlyS4z3Jaji/t +o0PZz+vejToNe693aDNb428llejuJ3Eh1GIoFdh+BzqP6N1uoZh+Fxyk7X9p0kAj +xoHUkgECgYEA8ppFn0Wg0pf4BqYS1U13z13ZETEmnz98oGFcLBgpE89ZgI5NF4Jx +Rhhjtc3fHiba2Su+t/oQPKvZHUEYj/d7j1CTUmX4O9ZaX7TakJefAZbJeJDBROm8 +vFo8WhIvOpRaMkWTBwrqfUCRG1ZOombJ2gzBU4Kjirk6SWqpDcfs0iECgYEA5JLo +E4I3ZMBr+fH6DjF0sCpxcIugp73qmm0iFWRHavKwBVKfJOus21HXP+5HufoQiCjS +V4LEgjekiD7ZFGf6cUZmJr8hYGNQTKbKgpaQSe9s16y6YGVRpvRY5N1kRF0M69OV +CO+1FndUUKjhU0qaghZeZdqYRAgeRGFP9Vq2XL0CgYEAi9aA6x2nZbxTKwHvOSQ+ +OzlNNauvJ3vgylFUX9ZNVy3d2UwtA7Acutq0HsdcJHUhEK02cbWiRlaH/2TWU6XD +gwhe4tAEFfmofiIxGcdL0A6qcuR9gst4Dtm0j/aLYqjAlNmlthmEsE3XVnqZOOMm +1pkjlo9m1T+PaWIhr9/dkgECgYEAwcp70O56IIW0BjnOE/KCSEnz28PF9fHi0gLs +/s4Cbv5LlneyTg8ygtAkeyN+1ILbOVXC4EcSbITYjlsamV5+y0MwoHEzzxDkp9hR +od4df1HrKgBcFBZS4AYSyBecRwnNRrQgi28QTXfmmGxWfdOmo9xrNFfc+PEZGEiZ +DiBWtNECgYA3WDK1F59TdlrE6CdVv39lDu6sEDck/UQ/FgBkgQlshGMaJOXU213s +yPPEGD1kJ2taj59nWhz2yldztyvNpa81df7Fw9S0LvnLHtU7/OR/fQC+AicnlLoF +k4mlVPgb2rwqEzQ4yjn/Fu38xpc9YJ9ang3n2OKOQKlKXgYsxtpL1Q== +-----END RSA PRIVATE KEY----- diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java new file mode 100644 index 00000000..b32e913b --- /dev/null +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java @@ -0,0 +1,21 @@ +package com.lopixlabs.app.fullstackdemo; + +import io.smallrye.jwt.build.Jwt; +import java.util.Arrays; +import java.util.HashSet; +import org.eclipse.microprofile.jwt.Claims; + +public class GenerateToken { + /** + * Generate JWT token + */ + public static void main(String[] args) { + String token = + Jwt.issuer("https://localhost.com/issuer") + .upn("jdoe@temp.io") + .groups(new HashSet<>(Arrays.asList("User", "Admin"))) + .claim(Claims.birthdate.name(), "1973-06-16") + .sign(); + System.out.println(token); + } +} diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/GreetingResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResourceTest.java similarity index 89% rename from service/src/test/java/com/lopixlabs/app/fullstackdemo/GreetingResourceTest.java rename to service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResourceTest.java index ddc9c605..dcaf6b02 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/GreetingResourceTest.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResourceTest.java @@ -1,4 +1,4 @@ -package com.lopixlabs.app.fullstackdemo; +package com.lopixlabs.app.fullstackdemo.hello; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/NativeGreetingResourceIT.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/NativeGreetingResourceIT.java similarity index 79% rename from service/src/test/java/com/lopixlabs/app/fullstackdemo/NativeGreetingResourceIT.java rename to service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/NativeGreetingResourceIT.java index 2fcafed2..887a28ab 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/NativeGreetingResourceIT.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/NativeGreetingResourceIT.java @@ -1,4 +1,4 @@ -package com.lopixlabs.app.fullstackdemo; +package com.lopixlabs.app.fullstackdemo.hello; import io.quarkus.test.junit.NativeImageTest; diff --git a/web/.env.development b/web/.env.development deleted file mode 100644 index c0930e2d..00000000 --- a/web/.env.development +++ /dev/null @@ -1,2 +0,0 @@ -VITE_SERVICE_URL=http://localhost:8080 - diff --git a/web/index.html b/web/index.html index 38f38611..fa3531c3 100644 --- a/web/index.html +++ b/web/index.html @@ -1,13 +1,13 @@ - + - - - - Vite App + + + + Full stack demo quarkus + svelte -
- +
+ diff --git a/web/package.json b/web/package.json index 6925cd33..3f42bddf 100644 --- a/web/package.json +++ b/web/package.json @@ -1,27 +1,32 @@ { - "name": "audio-stream", + "name": "fullstackdemo", "private": true, "version": "0.0.0", + "type": "module", "scripts": { - "start": "vite", - "build": "tsc && vite build", - "preview": "vite preview" - }, - "dependencies": { - "@mantine/core": "^3.6.8", - "@mantine/hooks": "^3.6.8", - "axios": "^0.26.0", - "axios-case-converter": "^0.9.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json" }, "devDependencies": { - "@types/node": "^17.0.21", - "@types/react": "^17.0.33", - "@types/react-dom": "^17.0.10", - "@vitejs/plugin-react": "^1.0.7", - "typescript": "^4.5.4", - "vite": "^2.9.13", - "yarn": "^2.4.3" + "@sveltejs/vite-plugin-svelte": "^2.0.2", + "@tailwindcss/forms": "^0.5.3", + "@tsconfig/svelte": "^3.0.0", + "autoprefixer": "^10.4.7", + "axios": "^1.3.4", + "axios-case-converter": "^1.0.1", + "postcss": "^8.4.14", + "postcss-load-config": "^4.0.1", + "stwui": "^0.0.36-next", + "svelte": "^3.55.1", + "svelte-check": "^2.10.3", + "svelte-preprocess": "^4.10.7", + "tailwindcss": "^3.1.5", + "tslib": "^2.5.0", + "typescript": "^4.9.3", + "vite": "^4.1.4", + "dayjs": "^1.11.7", + "radix-icons-svelte": "^1.2.1" } } diff --git a/web/postcss.config.cjs b/web/postcss.config.cjs new file mode 100644 index 00000000..e48cff58 --- /dev/null +++ b/web/postcss.config.cjs @@ -0,0 +1,13 @@ +const tailwindcss = require("tailwindcss"); +const autoprefixer = require("autoprefixer"); + +const config = { + plugins: [ + //Some plugins, like tailwindcss/nesting, need to run before Tailwind, + tailwindcss(), + //But others, like autoprefixer, need to run after, + autoprefixer, + ], +}; + +module.exports = config; diff --git a/web/src/App.svelte b/web/src/App.svelte new file mode 100644 index 00000000..143a7d69 --- /dev/null +++ b/web/src/App.svelte @@ -0,0 +1,167 @@ + + + + + {#if darkTheme} + + {:else} + + {/if} + Quarkus and Svelte + + + + + + + + + + +
+ +
+ + + + + logo-icon + + +
STWUI
+ + + + + + + + + + + + + +
+ + + + + + +
+ + + +

page... + +

+ + + + +
+
+
+
+ +
+ + + {#if openMenu} + + + + + + {/if} + diff --git a/web/src/App.tsx b/web/src/App.tsx deleted file mode 100644 index fa875f43..00000000 --- a/web/src/App.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import HelloDemo from "./components"; -import {HttpClientProvider} from "./http/HttpClientContext"; -import {MantineProvider} from '@mantine/core' - -function App() { - - const serviceUrl = import.meta.env.VITE_SERVICE_URL as string || ""; - console.log(import.meta.env.MODE); - - return ( - - -

Demo

-
-
-
-
- ); -} - -export default App diff --git a/web/src/app.postcss b/web/src/app.postcss new file mode 100644 index 00000000..1a7b7cf3 --- /dev/null +++ b/web/src/app.postcss @@ -0,0 +1,4 @@ +/* Write your global styles here, in PostCSS syntax */ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/web/src/assets/svelte.svg b/web/src/assets/svelte.svg new file mode 100644 index 00000000..084d5e16 --- /dev/null +++ b/web/src/assets/svelte.svg @@ -0,0 +1,5 @@ + diff --git a/web/src/components/HelloDemo.tsx b/web/src/components/HelloDemo.tsx deleted file mode 100644 index 2b4543c5..00000000 --- a/web/src/components/HelloDemo.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import {useEffect, useState} from "react"; -import {Hello} from "http/generated"; -import useHttpClient from "../http/HttpClient"; -import {Blockquote, Loader} from "@mantine/core"; - - -function HelloDemo() { - - const [hello, setHello] = useState(); - const [loading, setLoading] = useState(false); - const httpClient = useHttpClient(); - - useEffect(() => { - const fecth = () => { - setLoading(true); - httpClient.hello.helloGet() - .then((response) => response.data) - .then((json) => setHello(json)) - .finally(() => setLoading(false)); - } - - fecth() - }, []) - - if (loading) { - return - } - - return (<> -
- HelloDemo -
- ); -} - -export default HelloDemo; - diff --git a/web/src/components/index.ts b/web/src/components/index.ts deleted file mode 100644 index b11ca639..00000000 --- a/web/src/components/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './HelloDemo'; diff --git a/web/src/favicon.svg b/web/src/favicon.svg deleted file mode 100644 index de4aeddc..00000000 --- a/web/src/favicon.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/web/src/index.css b/web/src/index.css deleted file mode 100644 index ec2585e8..00000000 --- a/web/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/web/src/lib/Counter.svelte b/web/src/lib/Counter.svelte new file mode 100644 index 00000000..35373844 --- /dev/null +++ b/web/src/lib/Counter.svelte @@ -0,0 +1,11 @@ + + + + diff --git a/web/src/lib/EmptyPage.svelte b/web/src/lib/EmptyPage.svelte new file mode 100644 index 00000000..a88787b4 --- /dev/null +++ b/web/src/lib/EmptyPage.svelte @@ -0,0 +1,15 @@ +
+ + + + + + +
+ + diff --git a/web/src/lib/Hamburger.svelte b/web/src/lib/Hamburger.svelte new file mode 100644 index 00000000..aeccb316 --- /dev/null +++ b/web/src/lib/Hamburger.svelte @@ -0,0 +1,45 @@ + + + + + diff --git a/web/src/lib/Kbd.svelte b/web/src/lib/Kbd.svelte new file mode 100644 index 00000000..74c4640d --- /dev/null +++ b/web/src/lib/Kbd.svelte @@ -0,0 +1,11 @@ + + +
+ +
diff --git a/web/src/lib/Logo.svelte b/web/src/lib/Logo.svelte new file mode 100644 index 00000000..6fe41935 --- /dev/null +++ b/web/src/lib/Logo.svelte @@ -0,0 +1,9 @@ + + Quarkus & Svelte + + + diff --git a/web/src/lib/Main.svelte b/web/src/lib/Main.svelte new file mode 100644 index 00000000..7e3cad95 --- /dev/null +++ b/web/src/lib/Main.svelte @@ -0,0 +1,3 @@ + + + diff --git a/web/src/lib/Menu.svelte b/web/src/lib/Menu.svelte new file mode 100644 index 00000000..1f4320f9 --- /dev/null +++ b/web/src/lib/Menu.svelte @@ -0,0 +1,10 @@ + diff --git a/web/src/lib/Navbar.svelte b/web/src/lib/Navbar.svelte new file mode 100644 index 00000000..838c4c6b --- /dev/null +++ b/web/src/lib/Navbar.svelte @@ -0,0 +1,31 @@ + + +
+ +
+ diff --git a/web/src/lib/Navigation.svelte b/web/src/lib/Navigation.svelte new file mode 100644 index 00000000..5ba98b1d --- /dev/null +++ b/web/src/lib/Navigation.svelte @@ -0,0 +1,335 @@ + + +

GET STARTED

+ + handleClick('/installation')} + /> + handleClick('/typography')} + /> + + +

COMPONENTS

+ + {#each sidebarItems as item} + {#if item.beta} + handleClick(item.href)} + > + BETA + + {:else if item.updated} + handleClick(item.href)} + > + UPDATED + + {:else} + handleClick(item.href)} + /> + {/if} + {/each} + + +

ACTIONS

+ + handleClick('/click-outside')} + /> + handleClick('/clipboard')} + /> + handleClick('/tooltip')} + /> + + +

UTILITIES

+ + handleClick('/compute-progress')} + /> + handleClick('/compute-trend-percent')} + /> + handleClick('/compute-trend-value')} + /> + handleClick('/copy-to-clipboard')} + /> + handleClick('/encode-search-params')} + /> + handleClick('/format-date')} + /> + handleClick('/format-number')} + /> + + +

TYPES

+ + handleClick('/types')} /> + diff --git a/web/src/lib/Search.svelte b/web/src/lib/Search.svelte new file mode 100644 index 00000000..5c937915 --- /dev/null +++ b/web/src/lib/Search.svelte @@ -0,0 +1,167 @@ + + + + + + +{#if open} + + + +
+ + + + + {#if value && value.length > 0} + + + + + + {/if} + + + esc + +
+ + {#if fiteredData.length > 0} +
    + {#each fiteredData as item} +
  • handleSelect(item.href)} + on:keypress + > +
    + {#if item.type === 'Component'} + + {:else if item.type === 'Guide'} + + {:else if item.type === 'Action'} + + {:else if item.type === 'Utility'} + + {/if} +
    +
    +

    + {item.name} +

    +

    + {item.type} +

    +
    +
  • + {/each} +
+ {:else} + + + No results found + No results found for this search. Please try again. + + {/if} +
+
+
+{/if} diff --git a/web/src/lib/SideBar.svelte b/web/src/lib/SideBar.svelte new file mode 100644 index 00000000..e777d785 --- /dev/null +++ b/web/src/lib/SideBar.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/web/src/lib/icons.ts b/web/src/lib/icons.ts new file mode 100644 index 00000000..804e1fc6 --- /dev/null +++ b/web/src/lib/icons.ts @@ -0,0 +1,46 @@ +export const email = +''; +export const phone = +''; +export const lock = +''; +export const brightness_5 = +''; +export const brightness_4 = +''; +export const home = +''; +export const magnify = +''; +export const send = +''; +export const trash = +''; +export const toggle_switch = +''; +export const format_list_numbered = +''; +export const lightning_bolt_circle = +''; +export const function_variant = +''; +export const cog = +''; +export const plus_circle = +''; +export const numeric_1_box = +''; +export const numeric_2_box = +''; +export const account_multiple = +''; +export const folder = +''; +export const file_document = +''; +export const poll = +''; +export const favorite = +''; +export const chart_box = +''; diff --git a/web/src/logo.svg b/web/src/logo.svg deleted file mode 100644 index 6b60c104..00000000 --- a/web/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/web/src/main.ts b/web/src/main.ts new file mode 100644 index 00000000..c030412b --- /dev/null +++ b/web/src/main.ts @@ -0,0 +1,8 @@ +import "./app.postcss"; +import App from "./App.svelte"; + +const app = new App({ + target: document.getElementById("app"), +}); + +export default app; diff --git a/web/src/main.tsx b/web/src/main.tsx deleted file mode 100644 index fbb54c64..00000000 --- a/web/src/main.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom' -import './index.css' -import App from './App' - -ReactDOM.render( - - - , - document.getElementById('root') -) diff --git a/web/src/page.ts b/web/src/page.ts new file mode 100644 index 00000000..d23c0e7d --- /dev/null +++ b/web/src/page.ts @@ -0,0 +1,6 @@ +export function page() { + return { + title: 'STWUI Component Library', + description: 'Opinionated yet customizable Svelte & TailwindCSS component library' + }; +} diff --git a/web/src/vite-env.d.ts b/web/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2..00000000 --- a/web/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/web/svelte.config.js b/web/svelte.config.js new file mode 100644 index 00000000..4e7698e2 --- /dev/null +++ b/web/svelte.config.js @@ -0,0 +1,13 @@ +import preprocess from "svelte-preprocess"; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: [ + vitePreprocess(), + preprocess({ + postcss: true, + }), + ], +}; diff --git a/web/tailwind.config.cjs b/web/tailwind.config.cjs new file mode 100644 index 00000000..5ff9ceb7 --- /dev/null +++ b/web/tailwind.config.cjs @@ -0,0 +1,11 @@ +module.exports = { + content: [ + './src/**/*.{html,js,svelte,ts}', + './node_modules/stwui/**/*.{svelte,js,ts,html}' + ], + plugins: [ + require('@tailwindcss/forms'), + require('stwui/plugin') + ], + darkMode: 'class', +}; diff --git a/web/tsconfig.json b/web/tsconfig.json index 8cbb0159..c4e1c5fe 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,22 +1,20 @@ { + "extends": "@tsconfig/svelte/tsconfig.json", "compilerOptions": { "target": "ESNext", "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": false, - "skipLibCheck": false, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, "module": "ESNext", - "moduleResolution": "Node", "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "baseUrl": "src" + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true }, - "include": ["src"], + "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/web/tsconfig.node.json b/web/tsconfig.node.json index e993792c..65dbdb96 100644 --- a/web/tsconfig.node.json +++ b/web/tsconfig.node.json @@ -1,8 +1,8 @@ { "compilerOptions": { "composite": true, - "module": "esnext", - "moduleResolution": "node" + "module": "ESNext", + "moduleResolution": "Node" }, "include": ["vite.config.ts"] } diff --git a/web/vite.config.ts b/web/vite.config.ts index b1b5f91e..1fd156e5 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,7 +1,10 @@ import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { svelte } from '@sveltejs/vite-plugin-svelte' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()] + plugins: [svelte()], + optimizeDeps: { + exclude: ['radix-icons-svelte'] + } }) diff --git a/web/yarn.lock b/web/yarn.lock index 864e4fa6..4a93dddf 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -2,987 +2,1160 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz" - dependencies: - "@jridgewell/trace-mapping" "^0.3.0" - -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.16.4": - version "7.17.0" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz" - -"@babel/core@^7.16.12": - version "7.17.4" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.17.4.tgz" - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.3" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - -"@babel/generator@^7.17.3": - version "7.17.3" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz" - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz" - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz" - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" +"@esbuild/android-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" + integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== + +"@esbuild/android-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" + integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== + +"@esbuild/android-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" + integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== + +"@esbuild/darwin-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz" + integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== + +"@esbuild/darwin-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" + integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== + +"@esbuild/freebsd-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" + integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== + +"@esbuild/freebsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" + integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== + +"@esbuild/linux-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" + integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== + +"@esbuild/linux-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" + integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== + +"@esbuild/linux-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" + integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== + +"@esbuild/linux-loong64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" + integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== + +"@esbuild/linux-mips64el@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" + integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== + +"@esbuild/linux-ppc64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" + integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== + +"@esbuild/linux-riscv64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" + integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== + +"@esbuild/linux-s390x@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" + integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== + +"@esbuild/linux-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" + integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== + +"@esbuild/netbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" + integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== + +"@esbuild/openbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" + integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== + +"@esbuild/sunos-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" + integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== + +"@esbuild/win32-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" + integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== + +"@esbuild/win32-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" + integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== + +"@esbuild/win32-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" + integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.13": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@popperjs/core@^2.9.0": + version "2.11.6" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + +"@sveltejs/vite-plugin-svelte@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.3.tgz" + integrity sha512-o+cguBFdwIGtRbNkYOyqTM7KvRUffxh5bfK4oJsWKG2obu+v/cbpT03tJrGl58C7tRXo/aEC0/axN5FVHBj0nA== + dependencies: + debug "^4.3.4" + deepmerge "^4.3.0" + kleur "^4.1.5" + magic-string "^0.29.0" + svelte-hmr "^0.15.1" + vitefu "^0.2.4" + +"@tailwindcss/forms@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.3.tgz#e4d7989686cbcaf416c53f1523df5225332a86e7" + integrity sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q== + dependencies: + mini-svg-data-uri "^1.2.3" + +"@tsconfig/svelte@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz" + integrity sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg== + +"@types/node@*": + version "18.14.4" + resolved "https://registry.npmjs.org/@types/node/-/node-18.14.4.tgz" + integrity sha512-VhCw7I7qO2X49+jaKcAUwi3rR+hbxT5VcYF493+Z5kMLI0DL568b7JI4IDJaxWFH0D/xwmGJNoXisyX+w7GH/g== + +"@types/pug@^2.0.4": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz" + integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== + +"@types/sass@^1.16.0": + version "1.43.1" + resolved "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz" + integrity sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g== + dependencies: + "@types/node" "*" + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autoprefixer@^10.4.7: + version "10.4.13" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz" +axios-case-converter@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/axios-case-converter/-/axios-case-converter-1.0.1.tgz" + integrity sha512-Mk6JK13OwYd0pmWHtF2Kn3awIObRGvxdCjZwMOElrBk1DoyOjVHLdSthD6eSbNwPzxnhV4W2Fa7283iozqD1wQ== dependencies: - "@babel/types" "^7.16.7" + camel-case "^4.1.1" + header-case "^2.0.3" + snake-case "^3.0.3" + tslib "^2.3.0" -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz" +axios@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz" - dependencies: - "@babel/types" "^7.16.7" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz" - dependencies: - "@babel/types" "^7.16.7" +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - "@babel/types" "^7.16.7" + balanced-match "^1.0.0" + concat-map "0.0.1" -"@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz" +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-plugin-utils@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz" + fill-range "^7.0.1" -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz" +browserslist@^4.21.4: + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz" - dependencies: - "@babel/types" "^7.16.7" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" +buffer-crc32@^0.2.5: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -"@babel/helpers@^7.17.2": - version "7.17.2" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz" +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" + pascal-case "^3.1.2" + tslib "^2.0.3" -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz" - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -"@babel/parser@^7.16.7", "@babel/parser@^7.17.3": - version "7.17.3" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz" +caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: + version "1.0.30001460" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz" + integrity sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ== -"@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz" +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz" - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" +chokidar@^3.4.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" -"@babel/plugin-transform-react-jsx-self@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.16.7.tgz" - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" +color-name@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -"@babel/plugin-transform-react-jsx-source@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz" +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + delayed-stream "~1.0.0" -"@babel/plugin-transform-react-jsx@^7.16.7": - version "7.17.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz" - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.17.0" +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -"@babel/runtime@^7.10.2", "@babel/runtime@^7.13.10": - version "7.17.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.2.tgz" - dependencies: - regenerator-runtime "^0.13.4" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.16.7", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3": - version "7.17.3" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz" - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.3" - "@babel/types" "^7.17.0" - debug "^4.1.0" - globals "^11.1.0" +dayjs@^1.11.7: + version "1.11.7" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -"@babel/types@^7.16.7", "@babel/types@^7.17.0": - version "7.17.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz" +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" + ms "2.1.2" -"@emotion/cache@^11.7.1": - version "11.7.1" - resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz" - dependencies: - "@emotion/memoize" "^0.7.4" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - stylis "4.0.13" +deepmerge@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== -"@emotion/memoize@^0.7.4": - version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -"@emotion/react@^11.7.1": - version "11.7.1" - resolved "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz" - dependencies: - "@babel/runtime" "^7.13.10" - "@emotion/cache" "^11.7.1" - "@emotion/serialize" "^1.0.2" - "@emotion/sheet" "^1.1.0" - "@emotion/utils" "^1.0.0" - "@emotion/weak-memoize" "^0.2.5" - hoist-non-react-statics "^3.3.1" +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== -"@emotion/serialize@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz" +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== dependencies: - "@emotion/hash" "^0.8.0" - "@emotion/memoize" "^0.7.4" - "@emotion/unitless" "^0.7.5" - "@emotion/utils" "^1.0.0" - csstype "^3.0.2" + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" -"@emotion/sheet@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz" +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -"@emotion/unitless@^0.7.5": - version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== -"@emotion/utils@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz" +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" -"@emotion/weak-memoize@^0.2.5": - version "0.2.5" - resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz" +electron-to-chromium@^1.4.284: + version "1.4.317" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.317.tgz" + integrity sha512-JhCRm9v30FMNzQSsjl4kXaygU+qHBD0Yh7mKxyjmF0V8VwYVB6qpBRX28GyAucrM9wDCpSUctT6FpMUQxbyKuA== -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz" +esbuild@^0.16.14: + version "0.16.17" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz" + integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== + optionalDependencies: + "@esbuild/android-arm" "0.16.17" + "@esbuild/android-arm64" "0.16.17" + "@esbuild/android-x64" "0.16.17" + "@esbuild/darwin-arm64" "0.16.17" + "@esbuild/darwin-x64" "0.16.17" + "@esbuild/freebsd-arm64" "0.16.17" + "@esbuild/freebsd-x64" "0.16.17" + "@esbuild/linux-arm" "0.16.17" + "@esbuild/linux-arm64" "0.16.17" + "@esbuild/linux-ia32" "0.16.17" + "@esbuild/linux-loong64" "0.16.17" + "@esbuild/linux-mips64el" "0.16.17" + "@esbuild/linux-ppc64" "0.16.17" + "@esbuild/linux-riscv64" "0.16.17" + "@esbuild/linux-s390x" "0.16.17" + "@esbuild/linux-x64" "0.16.17" + "@esbuild/netbsd-x64" "0.16.17" + "@esbuild/openbsd-x64" "0.16.17" + "@esbuild/sunos-x64" "0.16.17" + "@esbuild/win32-arm64" "0.16.17" + "@esbuild/win32-ia32" "0.16.17" + "@esbuild/win32-x64" "0.16.17" -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.11" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz" +fast-glob@^3.2.12, fast-glob@^3.2.7: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" -"@mantine/core@^3.6.8": - version "3.6.9" - resolved "https://registry.npmjs.org/@mantine/core/-/core-3.6.9.tgz" +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: - "@mantine/styles" "3.6.9" - "@popperjs/core" "^2.9.3" - "@radix-ui/react-scroll-area" "^0.1.1" - clsx "^1.1.1" - react-popper "^2.2.5" - react-textarea-autosize "^8.3.2" - -"@mantine/hooks@^3.6.8": - version "3.6.9" - resolved "https://registry.npmjs.org/@mantine/hooks/-/hooks-3.6.9.tgz" + reusify "^1.0.4" -"@mantine/styles@3.6.9": - version "3.6.9" - resolved "https://registry.npmjs.org/@mantine/styles/-/styles-3.6.9.tgz" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - "@emotion/cache" "^11.7.1" - "@emotion/react" "^11.7.1" - "@emotion/serialize" "^1.0.2" - "@emotion/utils" "^1.0.0" - clsx "^1.1.1" - csstype "^3.0.9" + to-regex-range "^5.0.1" -"@popperjs/core@^2.9.3": - version "2.11.2" - resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz" +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -"@radix-ui/number@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@radix-ui/number/-/number-0.1.0.tgz" - dependencies: - "@babel/runtime" "^7.13.10" - -"@radix-ui/primitive@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-0.1.0.tgz" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: - "@babel/runtime" "^7.13.10" + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" -"@radix-ui/react-compose-refs@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-0.1.0.tgz" - dependencies: - "@babel/runtime" "^7.13.10" +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -"@radix-ui/react-context@0.1.1": - version "0.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-0.1.1.tgz" - dependencies: - "@babel/runtime" "^7.13.10" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -"@radix-ui/react-presence@0.1.1": - version "0.1.1" - resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-0.1.1.tgz" - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "0.1.0" - "@radix-ui/react-use-layout-effect" "0.1.0" +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -"@radix-ui/react-primitive@0.1.3": - version "0.1.3" - resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-0.1.3.tgz" - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-slot" "0.1.2" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -"@radix-ui/react-scroll-area@^0.1.1": - version "0.1.3" - resolved "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-0.1.3.tgz" +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/number" "0.1.0" - "@radix-ui/primitive" "0.1.0" - "@radix-ui/react-compose-refs" "0.1.0" - "@radix-ui/react-context" "0.1.1" - "@radix-ui/react-presence" "0.1.1" - "@radix-ui/react-primitive" "0.1.3" - "@radix-ui/react-use-callback-ref" "0.1.0" - "@radix-ui/react-use-direction" "0.1.0" - "@radix-ui/react-use-layout-effect" "0.1.0" + is-glob "^4.0.1" -"@radix-ui/react-slot@0.1.2": - version "0.1.2" - resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-0.1.2.tgz" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "0.1.0" + is-glob "^4.0.3" -"@radix-ui/react-use-callback-ref@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-0.1.0.tgz" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: - "@babel/runtime" "^7.13.10" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" -"@radix-ui/react-use-direction@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@radix-ui/react-use-direction/-/react-use-direction-0.1.0.tgz" - dependencies: - "@babel/runtime" "^7.13.10" +graceful-fs@^4.1.3: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -"@radix-ui/react-use-layout-effect@0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-0.1.0.tgz" +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - "@babel/runtime" "^7.13.10" + function-bind "^1.1.1" -"@rollup/pluginutils@^4.1.2": - version "4.1.2" - resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.2.tgz" +header-case@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - -"@types/node@^17.0.21": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== - -"@types/prop-types@*": - version "15.7.4" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz" + capital-case "^1.0.4" + tslib "^2.0.3" -"@types/react-dom@^17.0.10": - version "17.0.11" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: - "@types/react" "*" + parent-module "^1.0.0" + resolve-from "^4.0.0" -"@types/react@*", "@types/react@^17.0.33": - version "17.0.39" - resolved "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz" +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" + once "^1.3.0" + wrappy "1" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz" +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -"@vitejs/plugin-react@^1.0.7": - version "1.2.0" - resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.2.0.tgz" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: - "@babel/core" "^7.16.12" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-jsx-self" "^7.16.7" - "@babel/plugin-transform-react-jsx-source" "^7.16.7" - "@rollup/pluginutils" "^4.1.2" - react-refresh "^0.11.0" - resolve "^1.22.0" + binary-extensions "^2.0.0" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: - color-convert "^1.9.0" + has "^1.0.3" -axios-case-converter@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/axios-case-converter/-/axios-case-converter-0.9.0.tgz#9f47f641ae3f8c04a5395370601342e4f8c33c77" - integrity sha512-G6tOanR1cdIrBtRyiPvR+xXyWCCZacSw8LtT8bmImvpye+XiyoOlLluz0N61IfetznNQ9BeMi5yA0rIyYDr8mQ== - dependencies: - camel-case "^4.1.1" - header-case "^2.0.3" - snake-case "^3.0.3" - tslib "^2.3.0" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -axios@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928" - integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - follow-redirects "^1.14.8" + is-extglob "^2.1.1" -browserslist@^4.17.5: - version "4.19.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz" - dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -camel-case@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" +kleur@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -caniuse-lite@^1.0.30001286: - version "1.0.30001312" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz" +lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: - no-case "^3.0.4" tslib "^2.0.3" - upper-case-first "^2.0.2" -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -clsx@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + sourcemap-codec "^1.4.8" -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" +magic-string@^0.29.0: + version "0.29.0" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz" + integrity sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q== dependencies: - safe-buffer "~5.1.1" - -csstype@^3.0.2, csstype@^3.0.9: - version "3.0.10" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz" + "@jridgewell/sourcemap-codec" "^1.4.13" -debug@^4.1.0: - version "4.3.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - dependencies: - ms "2.1.2" +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -electron-to-chromium@^1.4.17: - version "1.4.71" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz" - -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - -esbuild-linux-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" - integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== - -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - -esbuild@^0.14.27: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" - integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== - optionalDependencies: - "@esbuild/linux-loong64" "0.14.54" - esbuild-android-64 "0.14.54" - esbuild-android-arm64 "0.14.54" - esbuild-darwin-64 "0.14.54" - esbuild-darwin-arm64 "0.14.54" - esbuild-freebsd-64 "0.14.54" - esbuild-freebsd-arm64 "0.14.54" - esbuild-linux-32 "0.14.54" - esbuild-linux-64 "0.14.54" - esbuild-linux-arm "0.14.54" - esbuild-linux-arm64 "0.14.54" - esbuild-linux-mips64le "0.14.54" - esbuild-linux-ppc64le "0.14.54" - esbuild-linux-riscv64 "0.14.54" - esbuild-linux-s390x "0.14.54" - esbuild-netbsd-64 "0.14.54" - esbuild-openbsd-64 "0.14.54" - esbuild-sunos-64 "0.14.54" - esbuild-windows-32 "0.14.54" - esbuild-windows-64 "0.14.54" - esbuild-windows-arm64 "0.14.54" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + braces "^3.0.2" + picomatch "^2.3.1" -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" - -follow-redirects@^1.14.8: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - function-bind "^1.1.1" + mime-db "1.52.0" -header-case@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - dependencies: - react-is "^16.7.0" +mini-svg-data-uri@^1.2.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== -is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz" +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - has "^1.0.3" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + brace-expansion "^1.1.7" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -json5@^2.1.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -loose-envify@^1.0.0, loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - js-tokens "^3.0.0 || ^4.0.0" + minimist "^1.2.6" -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nanoid@^3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" tslib "^2.0.3" -node-releases@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz" +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" tslib "^2.0.3" +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.2.2: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -postcss@^8.4.13: - version "8.4.16" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + postcss-selector-parser "^6.0.10" -react-fast-compare@^3.0.1: - version "3.2.0" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz" +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11: + version "6.0.11" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" -react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -react-popper@^2.2.5: - version "2.2.5" - resolved "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz" +postcss@^8.0.9, postcss@^8.4.14, postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: - react-fast-compare "^3.0.1" - warning "^4.0.2" + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" -react-refresh@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-textarea-autosize@^8.3.2: - version "8.3.3" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz" +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +radix-icons-svelte@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/radix-icons-svelte/-/radix-icons-svelte-1.2.1.tgz" + integrity sha512-svmiMd0ocpdTm9cvAz0klcZpnh639lVctj6psQiawd4pYalVzOG4cX+JizAgRckyTAsRVdzObP7D2EBrSfdghA== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.0.0" - use-latest "^1.0.0" + pify "^2.3.0" -react@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" + picomatch "^2.2.1" -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.22.0: - version "1.22.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" +resolve@^1.1.7, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -rollup@^2.59.0: - version "2.67.2" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.67.2.tgz" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.5.2: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rollup@^3.10.0: + version "3.18.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz" + integrity sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg== optionalDependencies: fsevents "~2.3.2" -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" +sade@^1.7.4: + version "1.8.1" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" + mri "^1.1.0" -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz" + integrity sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA== + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" snake-case@^3.0.3: version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== dependencies: dot-case "^3.0.4" tslib "^2.0.3" +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz" + integrity sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g== + dependencies: + buffer-crc32 "^0.2.5" + minimist "^1.2.0" + sander "^0.5.0" + sourcemap-codec "^1.3.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" +sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -stylis@4.0.13: - version "4.0.13" - resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz" +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" +stwui@^0.0.36-next: + version "0.0.36-next" + resolved "https://registry.npmjs.org/stwui/-/stwui-0.0.36-next.tgz" + integrity sha512-OtvHtErRcjsSZqX3qm7QD6EqGoQPgBS20XQxRZFNVvxjYMAYvkNDLtbaEFwjyEozN/Ydp3JN2cyGfmc146gioA== dependencies: - has-flag "^3.0.0" + dayjs "^1.11.7" + tailwind-merge "^1.9.1" + tippy.js "^6.3.7" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - -tslib@^2.0.3, tslib@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -typescript@^4.5.4: - version "4.5.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz" +svelte-check@^2.10.3: + version "2.10.3" + resolved "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz" + integrity sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.9" + chokidar "^3.4.1" + fast-glob "^3.2.7" + import-fresh "^3.2.1" + picocolors "^1.0.0" + sade "^1.7.4" + svelte-preprocess "^4.0.0" + typescript "*" + +svelte-hmr@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz" + integrity sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA== + +svelte-preprocess@^4.0.0, svelte-preprocess@^4.10.7: + version "4.10.7" + resolved "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz" + integrity sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw== + dependencies: + "@types/pug" "^2.0.4" + "@types/sass" "^1.16.0" + detect-indent "^6.0.0" + magic-string "^0.25.7" + sorcery "^0.10.0" + strip-indent "^3.0.0" + +svelte@^3.55.1: + version "3.55.1" + resolved "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz" + integrity sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ== + +tailwind-merge@^1.9.1: + version "1.10.0" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.10.0.tgz" + integrity sha512-WFnDXSS4kFTZwjKg5/oZSGzBRU/l+qcbv5NVTzLUQvJ9yovDAP05h0F2+ZFW0Lw9EcgRoc2AfURUdZvnEFrXKg== + +tailwindcss@^3.1.5: + version "3.2.7" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz" + integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.0.9" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + +tippy.js@^6.3.7: + version "6.3.7" + resolved "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== + dependencies: + "@popperjs/core" "^2.9.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tslib@^2.0.3, tslib@^2.3.0, tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +typescript@*, typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" upper-case-first@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== dependencies: tslib "^2.0.3" -use-composed-ref@^1.0.0: - version "1.2.1" - resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz" - -use-isomorphic-layout-effect@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz" - -use-latest@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz" - dependencies: - use-isomorphic-layout-effect "^1.0.0" - -vite@^2.9.13: - version "2.9.13" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.13.tgz#859cb5d4c316c0d8c6ec9866045c0f7858ca6abc" - integrity sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw== - dependencies: - esbuild "^0.14.27" - postcss "^8.4.13" - resolve "^1.22.0" - rollup "^2.59.0" +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +vite@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz" + integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== + dependencies: + esbuild "^0.16.14" + postcss "^8.4.21" + resolve "^1.22.1" + rollup "^3.10.0" optionalDependencies: fsevents "~2.3.2" -warning@^4.0.2: - version "4.0.3" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" - dependencies: - loose-envify "^1.0.0" +vitefu@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz" + integrity sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g== -yarn@^2.4.3: - version "2.4.3" - resolved "https://registry.npmjs.org/yarn/-/yarn-2.4.3.tgz" +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== From 72cad98572b574547dd6156e93f400cfa29754b4 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Fri, 3 Mar 2023 14:01:02 +0000 Subject: [PATCH 02/22] svelte --- web/yarn.lock | 1170 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1170 insertions(+) diff --git a/web/yarn.lock b/web/yarn.lock index e69de29b..3b0a67e9 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -0,0 +1,1170 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@esbuild/android-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" + integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== + +"@esbuild/android-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" + integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== + +"@esbuild/android-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" + integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== + +"@esbuild/darwin-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" + integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== + +"@esbuild/darwin-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" + integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== + +"@esbuild/freebsd-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" + integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== + +"@esbuild/freebsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" + integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== + +"@esbuild/linux-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" + integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== + +"@esbuild/linux-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" + integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== + +"@esbuild/linux-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" + integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== + +"@esbuild/linux-loong64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" + integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== + +"@esbuild/linux-mips64el@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" + integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== + +"@esbuild/linux-ppc64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" + integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== + +"@esbuild/linux-riscv64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" + integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== + +"@esbuild/linux-s390x@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" + integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== + +"@esbuild/linux-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" + integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== + +"@esbuild/netbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" + integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== + +"@esbuild/openbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" + integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== + +"@esbuild/sunos-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" + integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== + +"@esbuild/win32-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" + integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== + +"@esbuild/win32-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" + integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== + +"@esbuild/win32-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" + integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.13": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@popperjs/core@^2.9.0": + version "2.11.6" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== + +"@sveltejs/vite-plugin-svelte@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.3.tgz#3d276eab341638dd58691a3de610774e155a7578" + integrity sha512-o+cguBFdwIGtRbNkYOyqTM7KvRUffxh5bfK4oJsWKG2obu+v/cbpT03tJrGl58C7tRXo/aEC0/axN5FVHBj0nA== + dependencies: + debug "^4.3.4" + deepmerge "^4.3.0" + kleur "^4.1.5" + magic-string "^0.29.0" + svelte-hmr "^0.15.1" + vitefu "^0.2.4" + +"@tailwindcss/forms@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.3.tgz#e4d7989686cbcaf416c53f1523df5225332a86e7" + integrity sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q== + dependencies: + mini-svg-data-uri "^1.2.3" + +"@tsconfig/svelte@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-3.0.0.tgz#b06e059209f04c414de0069f2f0e2796d979fc6f" + integrity sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg== + +"@types/pug@^2.0.4": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" + integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== + +"@types/sass@^1.16.0": + version "1.45.0" + resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.45.0.tgz#a949eb1e080ff34715e6c2040357b940bffb89bb" + integrity sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA== + dependencies: + sass "*" + +acorn-node@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.0.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autoprefixer@^10.4.7: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axios-case-converter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/axios-case-converter/-/axios-case-converter-1.0.1.tgz#e9c6fee32b37bad84051e080feb9711593a60a0c" + integrity sha512-Mk6JK13OwYd0pmWHtF2Kn3awIObRGvxdCjZwMOElrBk1DoyOjVHLdSthD6eSbNwPzxnhV4W2Fa7283iozqD1wQ== + dependencies: + camel-case "^4.1.1" + header-case "^2.0.3" + snake-case "^3.0.3" + tslib "^2.3.0" + +axios@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.4: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-crc32@^0.2.5: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: + version "1.0.30001460" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz#31d2e26f0a2309860ed3eff154e03890d9d851a7" + integrity sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ== + +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +color-name@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +dayjs@^1.11.7: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + +debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +deepmerge@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + +defined@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detective@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== + dependencies: + acorn-node "^1.8.2" + defined "^1.0.0" + minimist "^1.2.6" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +electron-to-chromium@^1.4.284: + version "1.4.317" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.317.tgz#9a3d38a1a37f26a417d3d95dafe198ff11ed072b" + integrity sha512-JhCRm9v30FMNzQSsjl4kXaygU+qHBD0Yh7mKxyjmF0V8VwYVB6qpBRX28GyAucrM9wDCpSUctT6FpMUQxbyKuA== + +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== + +esbuild@^0.16.14: + version "0.16.17" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" + integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== + optionalDependencies: + "@esbuild/android-arm" "0.16.17" + "@esbuild/android-arm64" "0.16.17" + "@esbuild/android-x64" "0.16.17" + "@esbuild/darwin-arm64" "0.16.17" + "@esbuild/darwin-x64" "0.16.17" + "@esbuild/freebsd-arm64" "0.16.17" + "@esbuild/freebsd-x64" "0.16.17" + "@esbuild/linux-arm" "0.16.17" + "@esbuild/linux-arm64" "0.16.17" + "@esbuild/linux-ia32" "0.16.17" + "@esbuild/linux-loong64" "0.16.17" + "@esbuild/linux-mips64el" "0.16.17" + "@esbuild/linux-ppc64" "0.16.17" + "@esbuild/linux-riscv64" "0.16.17" + "@esbuild/linux-s390x" "0.16.17" + "@esbuild/linux-x64" "0.16.17" + "@esbuild/netbsd-x64" "0.16.17" + "@esbuild/openbsd-x64" "0.16.17" + "@esbuild/sunos-x64" "0.16.17" + "@esbuild/win32-arm64" "0.16.17" + "@esbuild/win32-ia32" "0.16.17" + "@esbuild/win32-x64" "0.16.17" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +fast-glob@^3.2.12, fast-glob@^3.2.7: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.3: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +header-case@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + +immutable@^4.0.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" + integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +kleur@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.29.0.tgz#f034f79f8c43dba4ae1730ffb5e8c4e084b16cf3" + integrity sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-svg-data-uri@^1.2.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +postcss-import@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + dependencies: + lilconfig "^2.0.5" + yaml "^1.10.2" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-nested@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" + integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.0.9, postcss@^8.4.14, postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +radix-icons-svelte@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/radix-icons-svelte/-/radix-icons-svelte-1.2.1.tgz#532706b0cd838cb8a832b1d7098d06c7f7ab534f" + integrity sha512-svmiMd0ocpdTm9cvAz0klcZpnh639lVctj6psQiawd4pYalVzOG4cX+JizAgRckyTAsRVdzObP7D2EBrSfdghA== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.5.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rollup@^3.10.0: + version "3.18.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.18.0.tgz#2354ba63ba66d6a09c652c3ea0dbcd9dad72bbde" + integrity sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +sade@^1.7.4: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + integrity sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA== + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + +sass@*: + version "1.58.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d" + integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +snake-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" + integrity sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g== + dependencies: + buffer-crc32 "^0.2.5" + minimist "^1.2.0" + sander "^0.5.0" + sourcemap-codec "^1.3.0" + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +stwui@^0.0.36-next: + version "0.0.36-next" + resolved "https://registry.yarnpkg.com/stwui/-/stwui-0.0.36-next.tgz#31344ac53ddccef86d3b682a3be2f49418f24432" + integrity sha512-OtvHtErRcjsSZqX3qm7QD6EqGoQPgBS20XQxRZFNVvxjYMAYvkNDLtbaEFwjyEozN/Ydp3JN2cyGfmc146gioA== + dependencies: + dayjs "^1.11.7" + tailwind-merge "^1.9.1" + tippy.js "^6.3.7" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svelte-check@^2.10.3: + version "2.10.3" + resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-2.10.3.tgz#c16426c47630e024bf3cd5fab9b8c4f1702db34a" + integrity sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.9" + chokidar "^3.4.1" + fast-glob "^3.2.7" + import-fresh "^3.2.1" + picocolors "^1.0.0" + sade "^1.7.4" + svelte-preprocess "^4.0.0" + typescript "*" + +svelte-hmr@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.15.1.tgz#d11d878a0bbb12ec1cba030f580cd2049f4ec86b" + integrity sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA== + +svelte-preprocess@^4.0.0, svelte-preprocess@^4.10.7: + version "4.10.7" + resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz#3626de472f51ffe20c9bc71eff5a3da66797c362" + integrity sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw== + dependencies: + "@types/pug" "^2.0.4" + "@types/sass" "^1.16.0" + detect-indent "^6.0.0" + magic-string "^0.25.7" + sorcery "^0.10.0" + strip-indent "^3.0.0" + +svelte@^3.55.1: + version "3.55.1" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.55.1.tgz#6f93b153e5248039906ce5fe196efdb9e05dfce8" + integrity sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ== + +tailwind-merge@^1.9.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.10.0.tgz#535541c7373d8a31afa81a4267e2ab9b4afa9429" + integrity sha512-WFnDXSS4kFTZwjKg5/oZSGzBRU/l+qcbv5NVTzLUQvJ9yovDAP05h0F2+ZFW0Lw9EcgRoc2AfURUdZvnEFrXKg== + +tailwindcss@^3.1.5: + version "3.2.7" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.7.tgz#5936dd08c250b05180f0944500c01dce19188c07" + integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== + dependencies: + arg "^5.0.2" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.1" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.6" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.0.9" + postcss-import "^14.1.0" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "6.0.0" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.1" + +tippy.js@^6.3.7: + version "6.3.7" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" + integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== + dependencies: + "@popperjs/core" "^2.9.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tslib@^2.0.3, tslib@^2.3.0, tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +typescript@*, typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +vite@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" + integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== + dependencies: + esbuild "^0.16.14" + postcss "^8.4.21" + resolve "^1.22.1" + rollup "^3.10.0" + optionalDependencies: + fsevents "~2.3.2" + +vitefu@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.4.tgz#212dc1a9d0254afe65e579351bed4e25d81e0b35" + integrity sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== From d9f0bcd82d70f88054e67ea0a025d8ada18f4d0b Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Sat, 4 Mar 2023 18:15:16 +0000 Subject: [PATCH 03/22] svelte menu --- web/package.json | 9 +- web/src/App.svelte | 167 +---------------- web/src/AppLayout.svelte | 165 +++++++++++++++++ web/src/PublicPage.svelte | 6 + web/src/app/Dashboard.svelte | 6 + web/src/assets/apple-icon.png | Bin 0 -> 2446 bytes web/src/assets/favicon.ico | Bin 0 -> 1150 bytes web/src/assets/svelte.svg | 5 - web/src/auth/Login.svelte | 5 + web/src/lib/EmptyPage.svelte | 22 ++- web/src/lib/Logo.svelte | 26 ++- web/src/lib/Main.svelte | 3 - web/src/lib/Menu.svelte | 10 -- web/src/lib/Navbar.svelte | 31 ---- web/src/lib/Navigation.svelte | 326 ++-------------------------------- web/src/lib/SideBar.svelte | 15 -- web/src/lib/interfaces.ts | 23 +++ web/src/page.ts | 6 - web/src/routes.ts | 35 ++++ web/src/settings.ts | 25 +++ web/yarn.lock | 12 ++ 21 files changed, 336 insertions(+), 561 deletions(-) create mode 100644 web/src/AppLayout.svelte create mode 100644 web/src/PublicPage.svelte create mode 100644 web/src/app/Dashboard.svelte create mode 100644 web/src/assets/apple-icon.png create mode 100644 web/src/assets/favicon.ico delete mode 100644 web/src/assets/svelte.svg create mode 100644 web/src/auth/Login.svelte delete mode 100644 web/src/lib/Main.svelte delete mode 100644 web/src/lib/Menu.svelte delete mode 100644 web/src/lib/Navbar.svelte delete mode 100644 web/src/lib/SideBar.svelte create mode 100644 web/src/lib/interfaces.ts delete mode 100644 web/src/page.ts create mode 100644 web/src/routes.ts create mode 100644 web/src/settings.ts diff --git a/web/package.json b/web/package.json index 3f42bddf..32acf0e3 100644 --- a/web/package.json +++ b/web/package.json @@ -16,8 +16,10 @@ "autoprefixer": "^10.4.7", "axios": "^1.3.4", "axios-case-converter": "^1.0.1", + "dayjs": "^1.11.7", "postcss": "^8.4.14", "postcss-load-config": "^4.0.1", + "radix-icons-svelte": "^1.2.1", "stwui": "^0.0.36-next", "svelte": "^3.55.1", "svelte-check": "^2.10.3", @@ -25,8 +27,9 @@ "tailwindcss": "^3.1.5", "tslib": "^2.5.0", "typescript": "^4.9.3", - "vite": "^4.1.4", - "dayjs": "^1.11.7", - "radix-icons-svelte": "^1.2.1" + "vite": "^4.1.4" + }, + "dependencies": { + "svelte-router-spa": "^6.0.3" } } diff --git a/web/src/App.svelte b/web/src/App.svelte index 143a7d69..f08c73f7 100644 --- a/web/src/App.svelte +++ b/web/src/App.svelte @@ -1,167 +1,8 @@ - - - {#if darkTheme} - - {:else} - - {/if} - Quarkus and Svelte - - - - - - - - - - -
- -
- - - - - logo-icon - - -
STWUI
- - - - - - - - - - - - - -
- - - - - - -
- - - -

page... - -

- - - - -
-
-
-
- +
+
- - - {#if openMenu} - - - - - - {/if} - diff --git a/web/src/AppLayout.svelte b/web/src/AppLayout.svelte new file mode 100644 index 00000000..4872758d --- /dev/null +++ b/web/src/AppLayout.svelte @@ -0,0 +1,165 @@ + + + + {#if darkTheme} + + {:else} + + {/if} + Quarkus and Svelte + + + + + + + + + + +
+ +
+ + + + + + + +
{app.name}
+ + + + + + + + + + + + + +
+ + + + + + +
+ + + + + + + + + + + + + +
+
+
+ +
+ + + {#if openMenu} + + + + + + {/if} + diff --git a/web/src/PublicPage.svelte b/web/src/PublicPage.svelte new file mode 100644 index 00000000..21c18f52 --- /dev/null +++ b/web/src/PublicPage.svelte @@ -0,0 +1,6 @@ + + + + diff --git a/web/src/app/Dashboard.svelte b/web/src/app/Dashboard.svelte new file mode 100644 index 00000000..48f5c134 --- /dev/null +++ b/web/src/app/Dashboard.svelte @@ -0,0 +1,6 @@ + + + + diff --git a/web/src/assets/apple-icon.png b/web/src/assets/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a20470fac33b4c58417dc4790349de2f62839da2 GIT binary patch literal 2446 zcmeH`iC2?X7QkQF41~=pt38!XD@c+r8zf&DhR~oy0%Tzm2g{e0Ab|jZ3}8{QB83k0 zAhr>yR1i~8DZ-#aJr0rxYH?{%o7#v#-JpO_78SSoFmtA9&zUoSz|1@6-FNSOzkBcZ z-uv#y+?b6HcAjnbh2d!7% z9zzW;Q6xVafWox^?EDCTMbx$P5de7*0OP3uz#0JDly%*_5CAN`;d0_4P{7jC(#FOH zgTYu>SfJ+r$N%OHps$Y(^fy3{Z&Fa*WTGCEZj$ErW9~P>sC<*@H(}2I+iSv1A?Cn; z)lGq~U%%eFr@jxR@2mJRf;UkZ%jG^H-tUA`9kG8BR_l#<*4Nr=a$^G=?ERDW{4~4R z<#*)Ole4=Mn=o6DK|M49`2>!m&?G z*+q=LYw4xbFLW*=?;4nUW&2U%CVR?Xdu@H|2V9**mkx1M$=hJfx-3=L=M40q7-7^# z)}ysI)JxrJtBl;73jl7#(!_w;I(M|8W7sTaT#`Tcbby7H3}Uf8OhP59jg1B2eh zexikj zNBk>3oog>B2LVH&=Zarp=vPEIti7Ehsi@pOT<1KpdTM5+3yZZOqW>a-`-kDoQ>%k4 z>iyV#)g$QwKiYLkefp8xN1J4+n*9g%f3X|6F{te-cm}zoTgRTnRP{D+;u@2>DxwD3 zTJV3{-OMKHT85iT`HXV;i;!^_Lwx9o<0bypeNFe8BWcyK0;_EUN`KCYJpq@$I@aH` zp^>@M1uOi~AoLjZ+(%V57mW{Db<&y`7FwT&Y$Y*TX6I~tv$1AgUn6ecE-XO z6goLIHu+0Els)QKZ`3~R5l59Ff}^7ycb zO(o66{@4Krc6qh5=HUDdmQ9An_;!G1UNsfchRiWbOXo^T#fq-9qv42`}JP+J#DnN}P3unF~kfN7uMgJ})O!#BM$3V^IYk zOejNy4MX(z8`Mq7fl$@G4h(L`-uM;St4`G}OFk6uKf*oSCB?7i$G2y`ER|h56#C)9 z#IsqMmkk;EcvnmLPi39rNRAzu)%w`|K#*dnect0@AV+uV%3hbrVuLX&rA_=^@=g6& z(Zkj|28VBlECqj8uP)^U9GhJbCFlm0IlcpLx2iw_4o$aI{=BZR@OpI}Veg3`nKUH- zh5nL2``u(rip}X~1Dn<21Nw-ES64y9ATZF4u(jJ*<$BpC1nXk=AvRl$zuP%0@=#j3 zezrdGi?36hn630%bf0@}y~#}J5RK^?Jndl}y*5~OC;i-Hf)n1Bm&|Nehu!*WE>U_n zy^DR_51T4ccNY<#=O5`(>j!P0{OJ7FqLY!Il1RPw3CY>_`*mpzWNeW;(X-~|BT_s5 z*VxQFWj*41$xl;tfqZqk(aL`PP0zcgzJcsY9RVmSn`_GhPh-$_Tce6dQi&0j1Qz8; z&;^ho5)BVA@MKyXi2{?!FonJzf?x>RIet_3y8uO&SS~I2&jB;16+6&?4NDbrv!p6D zk|P0Z1tOC~BQm*Yn^zDam_WxfywH+VJVe8j$X+~BkXM>YrG$w@wOUP(FVW~kX+ll1vp0b5S%GkhHJAA^w4RQxk^MByw4r3Xm9NCy=uT zW!%j2{EJDHi&be$$l!5rEQ)xTA<=S$L{*@afHz-7RA$Ql+@7#>hvs>r<4_8as8kAx z9!#OpD>r#(qllAP9)Y}20-*5lnugE`bSuGZE1u5=QhA01Jw8#9smjQb5v54JT$GiW zOZ@F&h+-;TOok|ADMct`kf?~5&Y(&W2?ZhxML`HfL_i}5==VkW`{tt+06QXv)f%2! F@=rJ{z@GpB literal 0 HcmV?d00001 diff --git a/web/src/assets/favicon.ico b/web/src/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7482a653daf1130d6dea4ba9a92259a8cf15c87a GIT binary patch literal 1150 zcmeH_F-`(e6h+^6Y={&PBZU=}F`+kc5tPKZ13H6^p@Xmhw<9GbE<<}0s3=f47yeED zB<=v-${Wq#=&@RX63=ee@lalIfsEBhb5 zC_QWKxW)+k?i;+XjI@1s?YN#1<@0}YeuZvETAp{6)sE{9@dLMR-X2&UQwsn9 literal 0 HcmV?d00001 diff --git a/web/src/assets/svelte.svg b/web/src/assets/svelte.svg deleted file mode 100644 index 084d5e16..00000000 --- a/web/src/assets/svelte.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/web/src/auth/Login.svelte b/web/src/auth/Login.svelte new file mode 100644 index 00000000..30f37e17 --- /dev/null +++ b/web/src/auth/Login.svelte @@ -0,0 +1,5 @@ + + + diff --git a/web/src/lib/EmptyPage.svelte b/web/src/lib/EmptyPage.svelte index a88787b4..a854e340 100644 --- a/web/src/lib/EmptyPage.svelte +++ b/web/src/lib/EmptyPage.svelte @@ -1,10 +1,18 @@ -
- - - - - - + + +
+

{title}

+
+
+ + + + + + +
+ + + + + + +logo diff --git a/web/src/lib/Main.svelte b/web/src/lib/Main.svelte deleted file mode 100644 index 7e3cad95..00000000 --- a/web/src/lib/Main.svelte +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/web/src/lib/Menu.svelte b/web/src/lib/Menu.svelte deleted file mode 100644 index 1f4320f9..00000000 --- a/web/src/lib/Menu.svelte +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/web/src/lib/Navbar.svelte b/web/src/lib/Navbar.svelte deleted file mode 100644 index 838c4c6b..00000000 --- a/web/src/lib/Navbar.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - -
- -
- diff --git a/web/src/lib/Navigation.svelte b/web/src/lib/Navigation.svelte index 5ba98b1d..d6bc9c99 100644 --- a/web/src/lib/Navigation.svelte +++ b/web/src/lib/Navigation.svelte @@ -1,209 +1,19 @@ -

GET STARTED

- - handleClick('/installation')} - /> - handleClick('/typography')} - /> - - -

COMPONENTS

- {#each sidebarItems as item} - {#if item.beta} - handleClick(item.href)} - > - BETA - - {:else if item.updated} + {#each sideBar.items as item} +
handleClick(item.href)} - > - UPDATED - - {:else} - handleClick(item.href)} + href={item.path} + icon={item.icon} + on:click={() => handleClick(item.path)} /> - {/if} +
{/each} +
- -

ACTIONS

- - handleClick('/click-outside')} - /> - handleClick('/clipboard')} - /> - handleClick('/tooltip')} - /> - - -

UTILITIES

- - handleClick('/compute-progress')} - /> - handleClick('/compute-trend-percent')} - /> - handleClick('/compute-trend-value')} - /> - handleClick('/copy-to-clipboard')} - /> - handleClick('/encode-search-params')} - /> - handleClick('/format-date')} - /> - handleClick('/format-number')} - /> - - -

TYPES

- - handleClick('/types')} /> - + + diff --git a/web/src/lib/SideBar.svelte b/web/src/lib/SideBar.svelte deleted file mode 100644 index e777d785..00000000 --- a/web/src/lib/SideBar.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/web/src/lib/interfaces.ts b/web/src/lib/interfaces.ts new file mode 100644 index 00000000..fec0e313 --- /dev/null +++ b/web/src/lib/interfaces.ts @@ -0,0 +1,23 @@ +import type {SvelteComponent} from "svelte"; +import type {Icon} from "stwui"; + +export interface Module { + name: String; + title: String; + path?: String; + icon?: typeof Icon; + component: typeof SvelteComponent; +} + +export interface App { + name: String; + title: String; + description: String; + logo: typeof SvelteComponent +} + +export interface SideBar { + name?: String, + items: Array +} + diff --git a/web/src/page.ts b/web/src/page.ts deleted file mode 100644 index d23c0e7d..00000000 --- a/web/src/page.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function page() { - return { - title: 'STWUI Component Library', - description: 'Opinionated yet customizable Svelte & TailwindCSS component library' - }; -} diff --git a/web/src/routes.ts b/web/src/routes.ts new file mode 100644 index 00000000..005107f2 --- /dev/null +++ b/web/src/routes.ts @@ -0,0 +1,35 @@ + +import Login from "./auth/Login.svelte"; +import Dashboard from "./app/Dashboard.svelte"; +import AppLayout from "./AppLayout.svelte"; +import PublicPage from "./PublicPage.svelte"; +import EmptyPage from "./lib/EmptyPage.svelte"; + +const userIsAdmin = () => true; + +export const routes = [ + { + name: '/', + component: PublicPage, + layout: AppLayout, + }, + {name: "login", component: Login}, + {name: "dashboard", component: Dashboard, layout: AppLayout}, + {name: "empty", component: EmptyPage, layout: AppLayout}, + { + name: 'other', + component: AppLayout, + onlyIf: {guard: userIsAdmin, redirect: '/login'}, + nestedRoutes: [ + {name: 'index', component: Dashboard}, + { + name: 'todo', + component: '', + nestedRoutes: [ + {name: '/', component: Dashboard}, + {name: 'show/:id', component: Dashboard}, + ], + }, + ], + }, +] diff --git a/web/src/settings.ts b/web/src/settings.ts new file mode 100644 index 00000000..5117eeef --- /dev/null +++ b/web/src/settings.ts @@ -0,0 +1,25 @@ +import type {App, Module, SideBar} from "./lib/interfaces"; +import Logo from "./lib/Logo.svelte"; +import Login from "./auth/Login.svelte"; +import {Dashboard} from "radix-icons-svelte"; +import EmptyPage from "./lib/EmptyPage.svelte"; + +const dashboard = {name: "dashboard", path: "/dashboard", title: "Dashboard", component: Dashboard}; +const login = {name: "login", path: "login", title: "Login", component: Login}; +const empty = {name: "empty", path: "/empty", title: "Empty Page", component: EmptyPage}; +export const modules: Array = [ + login, + dashboard, + login +] + +export const app: App = { + name: 'myApp', + title: 'myApp', + description: 'Quarkus and Stelve fullstack demo', + logo: Logo +} + +export const sideBar: SideBar = { + items: [dashboard, empty] +} diff --git a/web/yarn.lock b/web/yarn.lock index 3b0a67e9..cba47974 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1049,6 +1049,13 @@ svelte-preprocess@^4.0.0, svelte-preprocess@^4.10.7: sorcery "^0.10.0" strip-indent "^3.0.0" +svelte-router-spa@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/svelte-router-spa/-/svelte-router-spa-6.0.3.tgz#2f769f4b124ac5995dcdfd43b4e887b44ad6cb5a" + integrity sha512-aHgyUVVI/WjipQNmKcXpX0hFZtkW5Y6hwH5aXLr2P/aRQ/qlX8ZbKQJUwKjOD59p7tt/c+wqokiIt68N7aNuKQ== + dependencies: + url-params-parser "^1.0.3" + svelte@^3.55.1: version "3.55.1" resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.55.1.tgz#6f93b153e5248039906ce5fe196efdb9e05dfce8" @@ -1127,6 +1134,11 @@ upper-case-first@^2.0.2: dependencies: tslib "^2.0.3" +url-params-parser@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/url-params-parser/-/url-params-parser-1.0.4.tgz#10003b232e9cd13e2ba2374a1abc6e1aa8ff1b67" + integrity sha512-0m6BqGpY2OetTZ3UPTLKkbTfUHigsX2YhrzORT9iYiyUJ/SP2WJ3cggg2YWtvMs36GPwK9Q44ffddyarniu2Tg== + util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 03c3dfe1be01007f79fda0f5fbe53260c6e59829 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 6 Mar 2023 11:27:35 +0000 Subject: [PATCH 04/22] svelte menu --- web/src/routes.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/src/routes.ts b/web/src/routes.ts index 005107f2..79ff365f 100644 --- a/web/src/routes.ts +++ b/web/src/routes.ts @@ -10,8 +10,7 @@ const userIsAdmin = () => true; export const routes = [ { name: '/', - component: PublicPage, - layout: AppLayout, + component: PublicPage }, {name: "login", component: Login}, {name: "dashboard", component: Dashboard, layout: AppLayout}, From f99605cb1945faf28d7d8426819e7bf70d2eb093 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 6 Mar 2023 18:14:17 +0000 Subject: [PATCH 05/22] Svelte menus --- web/package.json | 4 +- web/src/App.svelte | 3 + web/src/AppLayout.svelte | 25 ++---- ...{Dashboard.svelte => DashboardPage.svelte} | 0 web/src/lib/Navigation.svelte | 87 ++++++++++++++----- web/src/lib/icons.ts | 1 + web/src/lib/interfaces.ts | 44 +++++++--- web/src/routes.ts | 31 ++----- web/src/settings.ts | 32 ++++--- 9 files changed, 134 insertions(+), 93 deletions(-) rename web/src/app/{Dashboard.svelte => DashboardPage.svelte} (100%) diff --git a/web/package.json b/web/package.json index 32acf0e3..717a9040 100644 --- a/web/package.json +++ b/web/package.json @@ -27,9 +27,7 @@ "tailwindcss": "^3.1.5", "tslib": "^2.5.0", "typescript": "^4.9.3", - "vite": "^4.1.4" - }, - "dependencies": { + "vite": "^4.1.4", "svelte-router-spa": "^6.0.3" } } diff --git a/web/src/App.svelte b/web/src/App.svelte index f08c73f7..ee82ffbc 100644 --- a/web/src/App.svelte +++ b/web/src/App.svelte @@ -1,8 +1,11 @@
+
diff --git a/web/src/AppLayout.svelte b/web/src/AppLayout.svelte index 4872758d..6b739104 100644 --- a/web/src/AppLayout.svelte +++ b/web/src/AppLayout.svelte @@ -5,7 +5,7 @@ import {Route} from 'svelte-router-spa' import Search from "./lib/Search.svelte"; import Navigation from "./lib/Navigation.svelte"; - import {app} from "./settings"; + import {app, sideBar} from "./settings"; let darkTheme = false; let openMenu = false; @@ -21,11 +21,11 @@ } $: if (darkTheme) { - const htmlElement = document.documentElement; - htmlElement.classList.add('dark'); + const htmlElement = document.documentElement; + htmlElement.classList.add('dark'); } else { - const htmlElement = document.documentElement; - htmlElement.classList.remove('dark'); + const htmlElement = document.documentElement; + htmlElement.classList.remove('dark'); } @@ -128,27 +128,20 @@ expandedWidth="17rem" > - + -
- - - - - - -
+ v>
@@ -158,7 +151,7 @@ {#if openMenu} - + {/if} diff --git a/web/src/app/Dashboard.svelte b/web/src/app/DashboardPage.svelte similarity index 100% rename from web/src/app/Dashboard.svelte rename to web/src/app/DashboardPage.svelte diff --git a/web/src/lib/Navigation.svelte b/web/src/lib/Navigation.svelte index d6bc9c99..b74b9bd8 100644 --- a/web/src/lib/Navigation.svelte +++ b/web/src/lib/Navigation.svelte @@ -1,41 +1,82 @@ - - - {#each sideBar.items as item} -
+ + {#each items as item} + {#if item.children && item.children.length > 0} + {#if item.data} + + + {#each item.children as child} + handleClick(item,child)} + /> + {/each} + + {:else} + + {#each item.children as child} + handleClick(item,child)} + /> + {/each} + + {/if} + {:else if item.data && item.badge} + handleClick(item)} + > + + {item.badge} + + {:else if item.iconData} + handleClick(item)} + > + + + {:else if item.badge} handleClick(item.path)} + key={item.name} + label={item.label} + on:click={() => handleClick(item)} + > + {item.badge} + + {:else} + handleClick(item)} /> -
+ {/if} {/each} -
+ diff --git a/web/src/lib/icons.ts b/web/src/lib/icons.ts index 804e1fc6..61dc84d3 100644 --- a/web/src/lib/icons.ts +++ b/web/src/lib/icons.ts @@ -44,3 +44,4 @@ export const favorite = ''; export const chart_box = ''; + diff --git a/web/src/lib/interfaces.ts b/web/src/lib/interfaces.ts index fec0e313..d056d6e1 100644 --- a/web/src/lib/interfaces.ts +++ b/web/src/lib/interfaces.ts @@ -1,23 +1,41 @@ import type {SvelteComponent} from "svelte"; -import type {Icon} from "stwui"; + +export interface App { + name: string; + title: string; + description: string; + logo: typeof SvelteComponent +} export interface Module { - name: String; - title: String; - path?: String; - icon?: typeof Icon; + name: string; + label: string; + href?: string; + iconData?: string; component: typeof SvelteComponent; } -export interface App { - name: String; - title: String; - description: String; - logo: typeof SvelteComponent +export interface GroupMenuItem { + name: string; + label: string; + href: string; } -export interface SideBar { - name?: String, - items: Array +export interface MenuItem { + name: string; + iconData?: string; + label: string; + badge?: string; + badgeType?: 'info' | 'warn' | 'error' | 'success'; + href: string; + component: typeof SvelteComponent; + children?: GroupMenuItem[]; } +export const toMenu = (module: Module): MenuItem => ({ + name: module.name, + label: module.label, + href: module.href, + iconData: module.iconData, + component: module.component +}); diff --git a/web/src/routes.ts b/web/src/routes.ts index 79ff365f..b7660627 100644 --- a/web/src/routes.ts +++ b/web/src/routes.ts @@ -1,34 +1,17 @@ - -import Login from "./auth/Login.svelte"; -import Dashboard from "./app/Dashboard.svelte"; import AppLayout from "./AppLayout.svelte"; import PublicPage from "./PublicPage.svelte"; -import EmptyPage from "./lib/EmptyPage.svelte"; +import {dashboardModule, emptyModule, loginModule} from "./settings"; + const userIsAdmin = () => true; export const routes = [ { name: '/', - component: PublicPage - }, - {name: "login", component: Login}, - {name: "dashboard", component: Dashboard, layout: AppLayout}, - {name: "empty", component: EmptyPage, layout: AppLayout}, - { - name: 'other', - component: AppLayout, - onlyIf: {guard: userIsAdmin, redirect: '/login'}, - nestedRoutes: [ - {name: 'index', component: Dashboard}, - { - name: 'todo', - component: '', - nestedRoutes: [ - {name: '/', component: Dashboard}, - {name: 'show/:id', component: Dashboard}, - ], - }, - ], + component: PublicPage, + layout: AppLayout }, + {...loginModule}, + {...dashboardModule, layout: AppLayout}, + {...emptyModule, layout: AppLayout}, ] diff --git a/web/src/settings.ts b/web/src/settings.ts index 5117eeef..35ed7f45 100644 --- a/web/src/settings.ts +++ b/web/src/settings.ts @@ -1,25 +1,29 @@ -import type {App, Module, SideBar} from "./lib/interfaces"; +import type {App, MenuItem, Module} from "./lib/interfaces"; +import {toMenu} from "./lib/interfaces"; import Logo from "./lib/Logo.svelte"; import Login from "./auth/Login.svelte"; -import {Dashboard} from "radix-icons-svelte"; import EmptyPage from "./lib/EmptyPage.svelte"; +import DashboardPage from "./app/DashboardPage.svelte"; +import {chart_box, file_document} from './lib/icons'; -const dashboard = {name: "dashboard", path: "/dashboard", title: "Dashboard", component: Dashboard}; -const login = {name: "login", path: "login", title: "Login", component: Login}; -const empty = {name: "empty", path: "/empty", title: "Empty Page", component: EmptyPage}; -export const modules: Array = [ - login, - dashboard, - login -] + +export let modules = new Map(); + +function add(module: Module) { + modules.set(module.name, module); + return module; +} + +export const dashboardModule = add({name: "dashboard", href: "/dashboard", label: "Dashboard", component: DashboardPage, iconData: chart_box}); +export const loginModule = add({name: "login", href: "login", label: "Login", component: Login}); +export const emptyModule = add({name: "empty", href: "/empty", label: "Empty Page", component: EmptyPage, iconData:file_document}); export const app: App = { name: 'myApp', title: 'myApp', - description: 'Quarkus and Stelve fullstack demo', + description: 'Quarkus and Svelte fullstack demo', logo: Logo } -export const sideBar: SideBar = { - items: [dashboard, empty] -} +export const sideBar: MenuItem[] = [toMenu(dashboardModule), toMenu(emptyModule)]; + From 83e15444c424c00c4391c3e3a638fa93f07682d7 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 6 Mar 2023 22:31:08 +0000 Subject: [PATCH 06/22] svelte menu --- web/src/AppLayout.svelte | 118 +++++++++++++++----------------------- web/src/lib/interfaces.ts | 2 +- web/src/settings.ts | 22 ++++++- 3 files changed, 68 insertions(+), 74 deletions(-) diff --git a/web/src/AppLayout.svelte b/web/src/AppLayout.svelte index 6b739104..a22b0ef6 100644 --- a/web/src/AppLayout.svelte +++ b/web/src/AppLayout.svelte @@ -1,14 +1,15 @@ @@ -37,15 +46,7 @@ {/if} Quarkus and Svelte - - - - - - - - - +
@@ -72,54 +73,27 @@
{app.name}
- - - - - - - - - - + + + + + + + + + + + + + @@ -134,14 +108,14 @@ id="content-body" class="relative h-full w-full overflow-x-hidden overflow-y-auto pt-[calc(1rem+var(--sat))] pb-[calc(1rem+var(--sab))] pr-[calc(1rem+var(--sar))] pl-[calc(1rem+var(--sal))] md:pt-[calc(2rem+var(--sat))] md:pb-[calc(2rem+var(--sab))] md:pr-[calc(2rem+var(--sar))] md:pl-[calc(2rem+var(--sal))] bg-light-icon-background dark:bg-dark-icon-background text-light-icon dark:text-dark-icon" > - - - - - - - - v> + + + + + + + + v>
diff --git a/web/src/lib/interfaces.ts b/web/src/lib/interfaces.ts index d056d6e1..9dfb7733 100644 --- a/web/src/lib/interfaces.ts +++ b/web/src/lib/interfaces.ts @@ -28,7 +28,7 @@ export interface MenuItem { badge?: string; badgeType?: 'info' | 'warn' | 'error' | 'success'; href: string; - component: typeof SvelteComponent; + component?: typeof SvelteComponent; children?: GroupMenuItem[]; } diff --git a/web/src/settings.ts b/web/src/settings.ts index 35ed7f45..0cb8a985 100644 --- a/web/src/settings.ts +++ b/web/src/settings.ts @@ -4,7 +4,7 @@ import Logo from "./lib/Logo.svelte"; import Login from "./auth/Login.svelte"; import EmptyPage from "./lib/EmptyPage.svelte"; import DashboardPage from "./app/DashboardPage.svelte"; -import {chart_box, file_document} from './lib/icons'; +import {account_multiple, chart_box, file_document} from './lib/icons'; export let modules = new Map(); @@ -26,4 +26,24 @@ export const app: App = { } export const sideBar: MenuItem[] = [toMenu(dashboardModule), toMenu(emptyModule)]; +export const menuBar: MenuItem[] = [ + { + name: 'team', + iconData: account_multiple, + label: 'Team', + href: '#item2', + children: [ + { + name: 'sub1', + label: 'Sub 1', + href: '#item2-sub1' + }, + { + name: 'sub2', + label: 'Sub 2', + href: '#item2-sub2' + } + ] + } +]; From 14ae291c20aecc2fd124dccd48228d3e58801cd7 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 6 Mar 2023 23:01:30 +0000 Subject: [PATCH 07/22] svelte menu --- .../app/fullstackdemo/users/Roles.java | 32 +++++++++++++++++-- .../app/fullstackdemo/users/User.java | 3 ++ .../app/fullstackdemo/users/UserRole.java | 5 +++ service/src/main/resources/api/openapi.json | 30 ++++++++++++++++- service/src/main/resources/api/openapi.yaml | 24 +++++++++++++- .../src/main/resources/application.properties | 8 ++--- service/src/main/resources/rsaPrivateKey.pem | 27 ---------------- .../hello/GreetingResourceTest.java | 4 +-- 8 files changed, 96 insertions(+), 37 deletions(-) create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java delete mode 100644 service/src/main/resources/rsaPrivateKey.pem diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java index f76804b8..cc8ca043 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java @@ -1,9 +1,37 @@ package com.lopixlabs.app.fullstackdemo.users; -import javax.persistence.Entity; +import static lombok.AccessLevel.PRIVATE; + +import javax.persistence.Column; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; +import org.hibernate.annotations.GenericGenerator; -@Entity @Data +@NoArgsConstructor() +@AllArgsConstructor(access = PRIVATE) +@Accessors(chain = true) +@EqualsAndHashCode(of = {"id"}) +@Builder(toBuilder = true) public class Roles { + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid") + @Column(name = "id", nullable = false, updatable = false) + @Setter(AccessLevel.PROTECTED) + private String id; + @NotNull + @Enumerated(EnumType.STRING) + private UserRole name; } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java index 68f45688..5dbed89f 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java @@ -17,11 +17,13 @@ import javax.persistence.OneToMany; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.Accessors; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.GenericGenerator; @@ -37,6 +39,7 @@ public class User extends PanacheEntityBase { @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") @Column(name = "id", nullable = false, updatable = false) + @Setter(AccessLevel.PROTECTED) private String id; @NotNull private String name; diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java new file mode 100644 index 00000000..a90192b8 --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java @@ -0,0 +1,5 @@ +package com.lopixlabs.app.fullstackdemo.users; + +public enum UserRole { + ADMIN +} diff --git a/service/src/main/resources/api/openapi.json b/service/src/main/resources/api/openapi.json index 616ba767..a7c5e567 100644 --- a/service/src/main/resources/api/openapi.json +++ b/service/src/main/resources/api/openapi.json @@ -12,7 +12,7 @@ "description" : "Auto generated value" } ], "paths" : { - "/hello" : { + "/hello/permit-all" : { "get" : { "tags" : [ "Greeting Resource" ], "responses" : { @@ -28,6 +28,34 @@ } } } + }, + "/hello/roles-allowed" : { + "get" : { + "tags" : [ "Greeting Resource" ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "text/plain" : { + "schema" : { + "$ref" : "#/components/schemas/Hello" + } + } + } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" + } + }, + "security" : [ { + "SecurityScheme" : [ "User", "Admin" ] + }, { + "SecurityScheme" : [ "User", "Admin" ] + } ] + } } }, "components" : { diff --git a/service/src/main/resources/api/openapi.yaml b/service/src/main/resources/api/openapi.yaml index 4e73d310..50306415 100644 --- a/service/src/main/resources/api/openapi.yaml +++ b/service/src/main/resources/api/openapi.yaml @@ -9,7 +9,7 @@ servers: - url: http://0.0.0.0:8080 description: Auto generated value paths: - /hello: + /hello/permit-all: get: tags: - Greeting Resource @@ -20,6 +20,28 @@ paths: application/json: schema: $ref: '#/components/schemas/Hello' + /hello/roles-allowed: + get: + tags: + - Greeting Resource + responses: + "200": + description: OK + content: + text/plain: + schema: + $ref: '#/components/schemas/Hello' + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: + - User + - Admin + - SecurityScheme: + - User + - Admin components: schemas: Hello: diff --git a/service/src/main/resources/application.properties b/service/src/main/resources/application.properties index 4c5349dd..2bd6ef75 100644 --- a/service/src/main/resources/application.properties +++ b/service/src/main/resources/application.properties @@ -1,10 +1,10 @@ quarkus.smallrye-openapi.store-schema-directory=src/main/resources/api %dev.quarkus.http.cors=true -quarkus.http.access-log.enabled=true -# -quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".level=TRACE -quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".min-level=TRACE + +%dev.quarkus.http.access-log.enabled=true +%dev.quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".level=TRACE +%dev.quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".min-level=TRACE mp.jwt.verify.publickey.location=publicKey.pem mp.jwt.verify.issuer=https://localhost/issuer diff --git a/service/src/main/resources/rsaPrivateKey.pem b/service/src/main/resources/rsaPrivateKey.pem deleted file mode 100644 index 53230267..00000000 --- a/service/src/main/resources/rsaPrivateKey.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA2Jyd69rLSS3RKCFd3twvqoxPdch1YSgEPtHiXUkz1M24bK0T -wo1ekxh4uUuY5DY+LptElSOrHFdGipcKXnsBbLCtul/AXv2n7r3hhMoZBTZGznX4 -yPfzroO2Zf32V5dtfgmB9klsV18MfQxnD3EeoAd48LAdgalSp8sG035W84a7e1k6 -HN7o9BdtEOI9qrDw7UYyFwLCAqrHWyECDymlWqgQ3/hshSEvt5a26ZW1aOmh6Nzj -Hz/Cogypyivz6tcj2pzMWRwY1AZNEj8S4o5Sp+wwNdUqXRpKeUvew3W1nHgHDH5b -zNCsDjXfzebNwIvX4XT2Wubjvvpdk2/XstD+XQIDAQABAoIBAG5M8i2TsEiHSCZD -N2WwgaU65Yt4lCzxD5hdkAMor3gBeZP9Xj6Hdk04/OB+GlC7PlbFQdsf2pYH6yfP -WbxarpMGNLDe6Tp1t/nePuQ7dRouVUf00sajXDbVYx/0fmiD94FingcnxD+JavaS -RjiaxZl/tJn7VEseSbSfsc4oW2aNmSQlDjjBu9cpOmcdXVlEIunlMBwChdZcW0mR -5rXQClNVCDpvnl1ZdQL3YhschRmP4pqhMhdWnwV+FhUmNDMpN6fNlyS4z3Jaji/t -o0PZz+vejToNe693aDNb428llejuJ3Eh1GIoFdh+BzqP6N1uoZh+Fxyk7X9p0kAj -xoHUkgECgYEA8ppFn0Wg0pf4BqYS1U13z13ZETEmnz98oGFcLBgpE89ZgI5NF4Jx -Rhhjtc3fHiba2Su+t/oQPKvZHUEYj/d7j1CTUmX4O9ZaX7TakJefAZbJeJDBROm8 -vFo8WhIvOpRaMkWTBwrqfUCRG1ZOombJ2gzBU4Kjirk6SWqpDcfs0iECgYEA5JLo -E4I3ZMBr+fH6DjF0sCpxcIugp73qmm0iFWRHavKwBVKfJOus21HXP+5HufoQiCjS -V4LEgjekiD7ZFGf6cUZmJr8hYGNQTKbKgpaQSe9s16y6YGVRpvRY5N1kRF0M69OV -CO+1FndUUKjhU0qaghZeZdqYRAgeRGFP9Vq2XL0CgYEAi9aA6x2nZbxTKwHvOSQ+ -OzlNNauvJ3vgylFUX9ZNVy3d2UwtA7Acutq0HsdcJHUhEK02cbWiRlaH/2TWU6XD -gwhe4tAEFfmofiIxGcdL0A6qcuR9gst4Dtm0j/aLYqjAlNmlthmEsE3XVnqZOOMm -1pkjlo9m1T+PaWIhr9/dkgECgYEAwcp70O56IIW0BjnOE/KCSEnz28PF9fHi0gLs -/s4Cbv5LlneyTg8ygtAkeyN+1ILbOVXC4EcSbITYjlsamV5+y0MwoHEzzxDkp9hR -od4df1HrKgBcFBZS4AYSyBecRwnNRrQgi28QTXfmmGxWfdOmo9xrNFfc+PEZGEiZ -DiBWtNECgYA3WDK1F59TdlrE6CdVv39lDu6sEDck/UQ/FgBkgQlshGMaJOXU213s -yPPEGD1kJ2taj59nWhz2yldztyvNpa81df7Fw9S0LvnLHtU7/OR/fQC+AicnlLoF -k4mlVPgb2rwqEzQ4yjn/Fu38xpc9YJ9ang3n2OKOQKlKXgYsxtpL1Q== ------END RSA PRIVATE KEY----- diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResourceTest.java index dcaf6b02..39f5161d 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResourceTest.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResourceTest.java @@ -12,10 +12,10 @@ class GreetingResourceTest { @Test void testHelloEndpoint() { given() - .when().get("/hello") + .when().get("/hello/permit-all") .then() .statusCode(200) - .body("value",is("hello from quarkus!!!")); + .body("value",is("hello + anonymous, isHttps: false, authScheme: null, hasJWT: false")); } } From ea5eeea916a468fdf89087bde39d7b587b520212 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Tue, 7 Mar 2023 01:05:54 +0000 Subject: [PATCH 08/22] svelte menu --- doc/src/main/asciidoc/jwt.adoc | 14 ++ .../openapi.yaml-asciidoc.sha256 | 2 +- doc/src/main/asciidoc/openapi/index.adoc | 219 +++++++++++++++++- service/pom.xml | 5 + .../app/fullstackdemo/hello/Hello.java | 4 +- .../fullstackdemo/login/LoginResource.java | 42 ++++ .../app/fullstackdemo/login/LoginService.java | 32 +++ .../app/fullstackdemo/login/model/Login.java | 14 ++ .../login/model/LoginResult.java | 10 + .../security/TokenException.java | 6 + .../fullstackdemo/security/TokenService.java | 54 +++++ .../fullstackdemo/security/TokenSettings.java | 16 ++ service/src/main/resources/api/openapi.json | 42 ++++ service/src/main/resources/api/openapi.yaml | 26 +++ .../src/main/resources/application.properties | 6 +- .../app/fullstackdemo/GenerateToken.java | 4 +- .../login/LoginResourceTest.java | 24 ++ tools/Login.http | 12 + tools/api/.openapi-generator/FILES | 1 + .../openapi.yaml-jetbrains-http-client.sha256 | 2 +- tools/api/Apis/GreetingResourceApi.http | 8 +- tools/api/README.md | 4 +- tools/http-client.env.json | 5 + .../openapi.yaml-axios.sha256 | 2 +- web/src/http/generated/api.ts | 199 +++++++++++++++- 25 files changed, 727 insertions(+), 26 deletions(-) create mode 100644 doc/src/main/asciidoc/jwt.adoc create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenException.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java create mode 100644 service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java create mode 100644 tools/Login.http create mode 100644 tools/http-client.env.json diff --git a/doc/src/main/asciidoc/jwt.adoc b/doc/src/main/asciidoc/jwt.adoc new file mode 100644 index 00000000..8fe1f56b --- /dev/null +++ b/doc/src/main/asciidoc/jwt.adoc @@ -0,0 +1,14 @@ + +|=== +|Property |Description +|iss|The issuer of the token, typically the server that generated it. +|sub|The subject of the token, typically the user to whom the token pertains. +|aud|The intended audience of the token, typically the server(s) that should accept and validate the token. +|exp|The expiration time of the token, after which it should no longer be accepted. +|iat|The time at which the token was issued. +|jti|The unique identifier of the token, which can be used to prevent replay attacks. + +|=== + + + diff --git a/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 b/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 index 463b9162..70936897 100644 --- a/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 +++ b/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 @@ -1 +1 @@ -d624c50784935cfcca1dc30c29b4b047623e40011cd9bf82ec19db74c9422e24 \ No newline at end of file +6129a3aba6c01d6a2caed3abfacddec6979074614b2bda9708f1ee04bb8e54a7 \ No newline at end of file diff --git a/doc/src/main/asciidoc/openapi/index.adoc b/doc/src/main/asciidoc/openapi/index.adoc index 95c8d842..b1702eb8 100644 --- a/doc/src/main/asciidoc/openapi/index.adoc +++ b/doc/src/main/asciidoc/openapi/index.adoc @@ -28,10 +28,10 @@ No description provided (generated by Openapi Generator https://github.com/opena === GreetingResource -[.helloGet] -==== helloGet +[.helloPermitAllGet] +==== helloPermitAllGet -`GET /hello` +`GET /hello/permit-all` @@ -40,7 +40,7 @@ No description provided (generated by Openapi Generator https://github.com/opena -// markup not found, no include::{specDir}hello/GET/spec.adoc[opts=optional] +// markup not found, no include::{specDir}hello/permit-all/GET/spec.adoc[opts=optional] @@ -78,20 +78,185 @@ No description provided (generated by Openapi Generator https://github.com/opena ===== Samples -// markup not found, no include::{snippetDir}hello/GET/http-request.adoc[opts=optional] +// markup not found, no include::{snippetDir}hello/permit-all/GET/http-request.adoc[opts=optional] -// markup not found, no include::{snippetDir}hello/GET/http-response.adoc[opts=optional] +// markup not found, no include::{snippetDir}hello/permit-all/GET/http-response.adoc[opts=optional] -// file not found, no * wiremock data link :hello/GET/GET.json[] +// file not found, no * wiremock data link :hello/permit-all/GET/GET.json[] ifdef::internal-generation[] ===== Implementation -// markup not found, no include::{specDir}hello/GET/implementation.adoc[opts=optional] +// markup not found, no include::{specDir}hello/permit-all/GET/implementation.adoc[opts=optional] + + +endif::internal-generation[] + + +[.helloRolesAllowedGet] +==== helloRolesAllowedGet + +`GET /hello/roles-allowed` + + + +===== Description + + + + +// markup not found, no include::{specDir}hello/roles-allowed/GET/spec.adoc[opts=optional] + + + +===== Parameters + + + + + + + +===== Return Type + +<> + + +===== Content Type + +* text/plain + +===== Responses + +.http response codes +[cols="2,3,1"] +|=== +| Code | Message | Datatype + + +| 200 +| OK +| <> + + +| 401 +| Not Authorized +| <<>> + + +| 403 +| Not Allowed +| <<>> + +|=== + +===== Samples + + +// markup not found, no include::{snippetDir}hello/roles-allowed/GET/http-request.adoc[opts=optional] + + +// markup not found, no include::{snippetDir}hello/roles-allowed/GET/http-response.adoc[opts=optional] + + + +// file not found, no * wiremock data link :hello/roles-allowed/GET/GET.json[] + + +ifdef::internal-generation[] +===== Implementation + +// markup not found, no include::{specDir}hello/roles-allowed/GET/implementation.adoc[opts=optional] + + +endif::internal-generation[] + + +[.LoginResource] +=== LoginResource + + +[.apiLoginPost] +==== apiLoginPost + +`POST /api/login` + + + +===== Description + + + + +// markup not found, no include::{specDir}api/login/POST/spec.adoc[opts=optional] + + + +===== Parameters + + +====== Body Parameter + +[cols="2,3,1,1,1"] +|=== +|Name| Description| Required| Default| Pattern + +| Login +| <> +| - +| +| + +|=== + + + + + +===== Return Type + +<> + + +===== Content Type + +* application/json + +===== Responses + +.http response codes +[cols="2,3,1"] +|=== +| Code | Message | Datatype + + +| 200 +| OK +| <> + +|=== + +===== Samples + + +// markup not found, no include::{snippetDir}api/login/POST/http-request.adoc[opts=optional] + + +// markup not found, no include::{snippetDir}api/login/POST/http-response.adoc[opts=optional] + + + +// file not found, no * wiremock data link :api/login/POST/POST.json[] + + +ifdef::internal-generation[] +===== Implementation + +// markup not found, no include::{specDir}api/login/POST/implementation.adoc[opts=optional] endif::internal-generation[] @@ -120,3 +285,41 @@ endif::internal-generation[] |=== +[#Login] +=== _Login_ + + + +[.fields-Login] +[cols="2,1,2,4,1"] +|=== +| Field Name| Required| Type| Description| Format + +| authentication +| +| String +| +| + +|=== + + +[#LoginResult] +=== _LoginResult_ + + + +[.fields-LoginResult] +[cols="2,1,2,4,1"] +|=== +| Field Name| Required| Type| Description| Format + +| jwt +| +| String +| +| + +|=== + + diff --git a/service/pom.xml b/service/pom.xml index 8ccd30d1..ec34bbbd 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -59,6 +59,11 @@ rest-assured test + + io.quarkus + quarkus-test-security + test + diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/Hello.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/Hello.java index 66b975ea..37c1df4d 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/Hello.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/Hello.java @@ -1,8 +1,10 @@ package com.lopixlabs.app.fullstackdemo.hello; +import lombok.AllArgsConstructor; import lombok.Value; -@Value(staticConstructor = "of") +@Value +@AllArgsConstructor(staticName = "of") public class Hello { String value; } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java new file mode 100644 index 00000000..5528a36b --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java @@ -0,0 +1,42 @@ +package com.lopixlabs.app.fullstackdemo.login; + +import com.lopixlabs.app.fullstackdemo.login.model.Login; +import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; +import javax.annotation.security.PermitAll; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.eclipse.microprofile.jwt.JsonWebToken; + +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@ApplicationScoped +@Path("api") +public class LoginResource { + private final LoginService loginService; + private final JsonWebToken jwt; + @Inject + public LoginResource(final LoginService loginService, final JsonWebToken jwt) { + this.loginService = loginService; + this.jwt = jwt; + } + + @POST + @Path("login") + @PermitAll + public LoginResult hello(final Login login) { + return loginService.login(login); + } + + @GET + @Path("renew") + public LoginResult hello() { + return loginService.renew(jwt); + } + +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java new file mode 100644 index 00000000..fc84ac8a --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java @@ -0,0 +1,32 @@ +package com.lopixlabs.app.fullstackdemo.login; + +import com.lopixlabs.app.fullstackdemo.login.model.Login; +import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; +import com.lopixlabs.app.fullstackdemo.security.TokenService; +import java.util.Arrays; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import org.eclipse.microprofile.jwt.JsonWebToken; +import org.jose4j.base64url.Base64; + +@ApplicationScoped +public class LoginService { + private final TokenService tokenService; + + @Inject + public LoginService(final TokenService tokenService) { + this.tokenService = tokenService; + } + + public LoginResult login(final Login login) { + final String authentication = new String(Base64.decode("dXNlcjpwYXNz")); + + final String token = tokenService.generate("teste@test.com", "user"); + return LoginResult.of(token); + } + + public LoginResult renew(final JsonWebToken jwt) { + final String token = tokenService.renew(jwt); + return LoginResult.of(token); + } +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java new file mode 100644 index 00000000..e1c6fc4a --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java @@ -0,0 +1,14 @@ +package com.lopixlabs.app.fullstackdemo.login.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Value; +import lombok.extern.jackson.Jacksonized; + +@Value +@AllArgsConstructor +@Builder +@Jacksonized +public class Login { + String authentication; +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java new file mode 100644 index 00000000..23bb2bef --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java @@ -0,0 +1,10 @@ +package com.lopixlabs.app.fullstackdemo.login.model; + +import lombok.AllArgsConstructor; +import lombok.Value; + +@Value +@AllArgsConstructor(staticName = "of") +public class LoginResult { + String jwt; +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenException.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenException.java new file mode 100644 index 00000000..30d0f7f1 --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenException.java @@ -0,0 +1,6 @@ +package com.lopixlabs.app.fullstackdemo.security; + +public class TokenException extends RuntimeException { + public TokenException(final String s, final Exception e) { + } +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java new file mode 100644 index 00000000..38a23ebe --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java @@ -0,0 +1,54 @@ +package com.lopixlabs.app.fullstackdemo.security; + +import com.lopixlabs.app.fullstackdemo.users.UserRole; +import io.smallrye.jwt.build.Jwt; +import java.time.Instant; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Locale; +import javax.enterprise.context.ApplicationScoped; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.microprofile.jwt.JsonWebToken; + +@ApplicationScoped +@Slf4j +public class TokenService { + private final TokenSettings tokenSettings; + + public TokenService(final TokenSettings tokenSettings) { + this.tokenSettings = tokenSettings; + } + + public String generate(String email, String username) { + try { + return Jwt.issuer(tokenSettings.getIssuer()) + .upn(email) + .issuedAt(Instant.now()) + .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpires())) + .preferredUserName(username) + .groups(new HashSet<>(Arrays.asList(UserRole.ADMIN.name().toLowerCase(Locale.ROOT)))) + .sign(); + } catch (Exception e) { + log.error("Error generate token: " + e.getMessage(), e); + throw new TokenException("Error generate token: " + e.getMessage(), e); + } + } + + /** + * @return the current time in seconds since epoch + */ + public static int currentTimeInSecs() { + long currentTimeMS = System.currentTimeMillis(); + return (int) (currentTimeMS / 1000); + } + + public String renew(final JsonWebToken jwt) { + return Jwt.issuer(tokenSettings.getIssuer()) + .upn(jwt.getClaim("upn")) + .issuedAt(Instant.now()) + .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpires())) + .preferredUserName(jwt.getName()) + .groups(jwt.getGroups()) + .sign(); + } +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java new file mode 100644 index 00000000..79672bd4 --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java @@ -0,0 +1,16 @@ +package com.lopixlabs.app.fullstackdemo.security; + +import io.quarkus.runtime.annotations.ConfigItem; +import javax.enterprise.context.ApplicationScoped; +import lombok.Getter; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +@ApplicationScoped +@Getter +public class TokenSettings { + @ConfigProperty(name = "mp.jwt.verify.issuer") + private String issuer; + + @ConfigProperty(name = "jwt.expires", defaultValue = "3000") + private int expires; +} diff --git a/service/src/main/resources/api/openapi.json b/service/src/main/resources/api/openapi.json index a7c5e567..bf75ef37 100644 --- a/service/src/main/resources/api/openapi.json +++ b/service/src/main/resources/api/openapi.json @@ -12,6 +12,32 @@ "description" : "Auto generated value" } ], "paths" : { + "/api/login" : { + "post" : { + "tags" : [ "Login Resource" ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Login" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/LoginResult" + } + } + } + } + } + } + }, "/hello/permit-all" : { "get" : { "tags" : [ "Greeting Resource" ], @@ -67,6 +93,22 @@ "type" : "string" } } + }, + "Login" : { + "type" : "object", + "properties" : { + "authentication" : { + "type" : "string" + } + } + }, + "LoginResult" : { + "type" : "object", + "properties" : { + "jwt" : { + "type" : "string" + } + } } } } diff --git a/service/src/main/resources/api/openapi.yaml b/service/src/main/resources/api/openapi.yaml index 50306415..70db7644 100644 --- a/service/src/main/resources/api/openapi.yaml +++ b/service/src/main/resources/api/openapi.yaml @@ -9,6 +9,22 @@ servers: - url: http://0.0.0.0:8080 description: Auto generated value paths: + /api/login: + post: + tags: + - Login Resource + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Login' + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/LoginResult' /hello/permit-all: get: tags: @@ -49,3 +65,13 @@ components: properties: value: type: string + Login: + type: object + properties: + authentication: + type: string + LoginResult: + type: object + properties: + jwt: + type: string diff --git a/service/src/main/resources/application.properties b/service/src/main/resources/application.properties index 2bd6ef75..4b81872b 100644 --- a/service/src/main/resources/application.properties +++ b/service/src/main/resources/application.properties @@ -6,7 +6,9 @@ quarkus.smallrye-openapi.store-schema-directory=src/main/resources/api %dev.quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".level=TRACE %dev.quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".min-level=TRACE -mp.jwt.verify.publickey.location=publicKey.pem -mp.jwt.verify.issuer=https://localhost/issuer +mp.jwt.verify.publickey.location=publicKey.pem +smallrye.jwt.sign.key.location=privateKey.pem +mp.jwt.verify.issuer=https://localhost/issuer + quarkus.native.resources.includes=publicKey.pem diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java index b32e913b..5b6df738 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/GenerateToken.java @@ -1,8 +1,10 @@ package com.lopixlabs.app.fullstackdemo; +import com.lopixlabs.app.fullstackdemo.users.UserRole; import io.smallrye.jwt.build.Jwt; import java.util.Arrays; import java.util.HashSet; +import java.util.Locale; import org.eclipse.microprofile.jwt.Claims; public class GenerateToken { @@ -13,7 +15,7 @@ public static void main(String[] args) { String token = Jwt.issuer("https://localhost.com/issuer") .upn("jdoe@temp.io") - .groups(new HashSet<>(Arrays.asList("User", "Admin"))) + .groups(new HashSet<>(Arrays.asList(UserRole.ADMIN.name().toLowerCase(Locale.ROOT)))) .claim(Claims.birthdate.name(), "1973-06-16") .sign(); System.out.println(token); diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java new file mode 100644 index 00000000..c7fb60e4 --- /dev/null +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java @@ -0,0 +1,24 @@ +package com.lopixlabs.app.fullstackdemo.login; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.is; + +import com.lopixlabs.app.fullstackdemo.login.model.Login; +import io.quarkus.test.common.http.TestHTTPEndpoint; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; + +@QuarkusTest +@TestHTTPEndpoint(LoginResource.class) +class LoginResourceTest { + + @Test + void testHelloEndpoint() { + given() + .when() + .body(Login.builder().authentication("user").build()) + .post("/login") + .then() + .statusCode(200); + } +} diff --git a/tools/Login.http b/tools/Login.http new file mode 100644 index 00000000..21723114 --- /dev/null +++ b/tools/Login.http @@ -0,0 +1,12 @@ +## LoginResourceApi + +### +# @name apiLoginPost +POST {{host}}/api/login +Content-Type: application/json + +{ + "authentication": "dXNlcjpwYXNz" +} + + diff --git a/tools/api/.openapi-generator/FILES b/tools/api/.openapi-generator/FILES index 587115b8..c63cd2a2 100644 --- a/tools/api/.openapi-generator/FILES +++ b/tools/api/.openapi-generator/FILES @@ -1,2 +1,3 @@ Apis/GreetingResourceApi.http +Apis/LoginResourceApi.http README.md diff --git a/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 b/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 index 463b9162..70936897 100644 --- a/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 +++ b/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 @@ -1 +1 @@ -d624c50784935cfcca1dc30c29b4b047623e40011cd9bf82ec19db74c9422e24 \ No newline at end of file +6129a3aba6c01d6a2caed3abfacddec6979074614b2bda9708f1ee04bb8e54a7 \ No newline at end of file diff --git a/tools/api/Apis/GreetingResourceApi.http b/tools/api/Apis/GreetingResourceApi.http index 865f2120..8193b8df 100644 --- a/tools/api/Apis/GreetingResourceApi.http +++ b/tools/api/Apis/GreetingResourceApi.http @@ -1,5 +1,9 @@ ## GreetingResourceApi ### -# @name helloGet -GET http://localhost:8080/hello +# @name helloPermitAllGet +GET http://localhost:8080/hello/permit-all + +### +# @name helloRolesAllowedGet +GET http://localhost:8080/hello/roles-allowed diff --git a/tools/api/README.md b/tools/api/README.md index 21a1396c..d2a9083b 100644 --- a/tools/api/README.md +++ b/tools/api/README.md @@ -13,7 +13,9 @@ All URIs are relative to *http://localhost:8080*, but will link to the `.http` f Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- -*GreetingResourceApi* | [**helloGet**](Apis/GreetingResourceApi.http#helloget) | **GET** /hello | +*GreetingResourceApi* | [**helloPermitAllGet**](Apis/GreetingResourceApi.http#hellopermitallget) | **GET** /hello/permit-all | +*GreetingResourceApi* | [**helloRolesAllowedGet**](Apis/GreetingResourceApi.http#hellorolesallowedget) | **GET** /hello/roles-allowed | +*LoginResourceApi* | [**apiLoginPost**](Apis/LoginResourceApi.http#apiloginpost) | **POST** /api/login | diff --git a/tools/http-client.env.json b/tools/http-client.env.json new file mode 100644 index 00000000..cf48461f --- /dev/null +++ b/tools/http-client.env.json @@ -0,0 +1,5 @@ +{ + "dev": { + "host": "http://localhost:8080" + } +} diff --git a/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 b/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 index 463b9162..70936897 100644 --- a/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 +++ b/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 @@ -1 +1 @@ -d624c50784935cfcca1dc30c29b4b047623e40011cd9bf82ec19db74c9422e24 \ No newline at end of file +6129a3aba6c01d6a2caed3abfacddec6979074614b2bda9708f1ee04bb8e54a7 \ No newline at end of file diff --git a/web/src/http/generated/api.ts b/web/src/http/generated/api.ts index 83cfc1cf..19b632ce 100644 --- a/web/src/http/generated/api.ts +++ b/web/src/http/generated/api.ts @@ -36,6 +36,32 @@ export interface Hello { */ 'value'?: string; } +/** + * + * @export + * @interface Login + */ +export interface Login { + /** + * + * @type {string} + * @memberof Login + */ + 'authentication'?: string; +} +/** + * + * @export + * @interface LoginResult + */ +export interface LoginResult { + /** + * + * @type {string} + * @memberof LoginResult + */ + 'jwt'?: string; +} /** * GreetingResourceApi - axios parameter creator @@ -48,8 +74,37 @@ export const GreetingResourceApiAxiosParamCreator = function (configuration?: Co * @param {*} [options] Override http request option. * @throws {RequiredError} */ - helloGet: async (options: AxiosRequestConfig = {}): Promise => { - const localVarPath = `/hello`; + helloPermitAllGet: async (options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/hello/permit-all`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + helloRolesAllowedGet: async (options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/hello/roles-allowed`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -87,8 +142,17 @@ export const GreetingResourceApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async helloGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.helloGet(options); + async helloPermitAllGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.helloPermitAllGet(options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async helloRolesAllowedGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.helloRolesAllowedGet(options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, } @@ -106,8 +170,16 @@ export const GreetingResourceApiFactory = function (configuration?: Configuratio * @param {*} [options] Override http request option. * @throws {RequiredError} */ - helloGet(options?: any): AxiosPromise { - return localVarFp.helloGet(options).then((request) => request(axios, basePath)); + helloPermitAllGet(options?: any): AxiosPromise { + return localVarFp.helloPermitAllGet(options).then((request) => request(axios, basePath)); + }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + helloRolesAllowedGet(options?: any): AxiosPromise { + return localVarFp.helloRolesAllowedGet(options).then((request) => request(axios, basePath)); }, }; }; @@ -125,8 +197,119 @@ export class GreetingResourceApi extends BaseAPI { * @throws {RequiredError} * @memberof GreetingResourceApi */ - public helloGet(options?: AxiosRequestConfig) { - return GreetingResourceApiFp(this.configuration).helloGet(options).then((request) => request(this.axios, this.basePath)); + public helloPermitAllGet(options?: AxiosRequestConfig) { + return GreetingResourceApiFp(this.configuration).helloPermitAllGet(options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof GreetingResourceApi + */ + public helloRolesAllowedGet(options?: AxiosRequestConfig) { + return GreetingResourceApiFp(this.configuration).helloRolesAllowedGet(options).then((request) => request(this.axios, this.basePath)); + } +} + + +/** + * LoginResourceApi - axios parameter creator + * @export + */ +export const LoginResourceApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @param {Login} [login] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + apiLoginPost: async (login?: Login, options: AxiosRequestConfig = {}): Promise => { + const localVarPath = `/api/login`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(login, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * LoginResourceApi - functional programming interface + * @export + */ +export const LoginResourceApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = LoginResourceApiAxiosParamCreator(configuration) + return { + /** + * + * @param {Login} [login] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async apiLoginPost(login?: Login, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.apiLoginPost(login, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, + } +}; + +/** + * LoginResourceApi - factory interface + * @export + */ +export const LoginResourceApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = LoginResourceApiFp(configuration) + return { + /** + * + * @param {Login} [login] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + apiLoginPost(login?: Login, options?: any): AxiosPromise { + return localVarFp.apiLoginPost(login, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * LoginResourceApi - object-oriented interface + * @export + * @class LoginResourceApi + * @extends {BaseAPI} + */ +export class LoginResourceApi extends BaseAPI { + /** + * + * @param {Login} [login] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof LoginResourceApi + */ + public apiLoginPost(login?: Login, options?: AxiosRequestConfig) { + return LoginResourceApiFp(this.configuration).apiLoginPost(login, options).then((request) => request(this.axios, this.basePath)); } } From 0a10df6f9c4c787a9399d4054c5b4c00c748b3ae Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Tue, 7 Mar 2023 01:06:42 +0000 Subject: [PATCH 09/22] jwt login --- .gitignore | 1 + service/src/main/resources/api/openapi.json | 17 +++++++++++++++++ service/src/main/resources/api/openapi.yaml | 11 +++++++++++ 3 files changed, 29 insertions(+) diff --git a/.gitignore b/.gitignore index ace9cb13..c702f62a 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ dist-ssr *.njsproj *.sln *.sw? +/tools/api/ diff --git a/service/src/main/resources/api/openapi.json b/service/src/main/resources/api/openapi.json index bf75ef37..2660d31d 100644 --- a/service/src/main/resources/api/openapi.json +++ b/service/src/main/resources/api/openapi.json @@ -38,6 +38,23 @@ } } }, + "/api/renew" : { + "get" : { + "tags" : [ "Login Resource" ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/LoginResult" + } + } + } + } + } + } + }, "/hello/permit-all" : { "get" : { "tags" : [ "Greeting Resource" ], diff --git a/service/src/main/resources/api/openapi.yaml b/service/src/main/resources/api/openapi.yaml index 70db7644..edac4b9b 100644 --- a/service/src/main/resources/api/openapi.yaml +++ b/service/src/main/resources/api/openapi.yaml @@ -25,6 +25,17 @@ paths: application/json: schema: $ref: '#/components/schemas/LoginResult' + /api/renew: + get: + tags: + - Login Resource + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/LoginResult' /hello/permit-all: get: tags: From 7aa429416dc27ba710a58af5d7100fc7eb5c654c Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Tue, 7 Mar 2023 09:50:13 +0000 Subject: [PATCH 10/22] update node --- web/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/pom.xml b/web/pom.xml index 51634059..a7dcdf29 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -14,8 +14,8 @@ 1.0.0-SNAPSHOT - v17.5.0 - v1.22.17 + v18.14.2 + v1.22.19 From b1ab38de206416b4a55e9da633cc4477f5ac0e84 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Tue, 7 Mar 2023 09:54:33 +0000 Subject: [PATCH 11/22] fix test --- service/src/main/resources/api/openapi.json | 29 +++++++++++++++++-- service/src/main/resources/api/openapi.yaml | 20 +++++++++++-- .../login/LoginResourceTest.java | 3 ++ 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/service/src/main/resources/api/openapi.json b/service/src/main/resources/api/openapi.json index 2660d31d..340f3194 100644 --- a/service/src/main/resources/api/openapi.json +++ b/service/src/main/resources/api/openapi.json @@ -55,7 +55,7 @@ } } }, - "/hello/permit-all" : { + "/hello" : { "get" : { "tags" : [ "Greeting Resource" ], "responses" : { @@ -72,6 +72,23 @@ } } }, + "/hello/permit-all" : { + "get" : { + "tags" : [ "Greeting Resource" ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Hello1" + } + } + } + } + } + } + }, "/hello/roles-allowed" : { "get" : { "tags" : [ "Greeting Resource" ], @@ -81,7 +98,7 @@ "content" : { "text/plain" : { "schema" : { - "$ref" : "#/components/schemas/Hello" + "$ref" : "#/components/schemas/Hello1" } } } @@ -111,6 +128,14 @@ } } }, + "Hello1" : { + "type" : "object", + "properties" : { + "value" : { + "type" : "string" + } + } + }, "Login" : { "type" : "object", "properties" : { diff --git a/service/src/main/resources/api/openapi.yaml b/service/src/main/resources/api/openapi.yaml index edac4b9b..ca317d49 100644 --- a/service/src/main/resources/api/openapi.yaml +++ b/service/src/main/resources/api/openapi.yaml @@ -36,7 +36,7 @@ paths: application/json: schema: $ref: '#/components/schemas/LoginResult' - /hello/permit-all: + /hello: get: tags: - Greeting Resource @@ -47,6 +47,17 @@ paths: application/json: schema: $ref: '#/components/schemas/Hello' + /hello/permit-all: + get: + tags: + - Greeting Resource + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Hello1' /hello/roles-allowed: get: tags: @@ -57,7 +68,7 @@ paths: content: text/plain: schema: - $ref: '#/components/schemas/Hello' + $ref: '#/components/schemas/Hello1' "401": description: Not Authorized "403": @@ -76,6 +87,11 @@ components: properties: value: type: string + Hello1: + type: object + properties: + value: + type: string Login: type: object properties: diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java index c7fb60e4..e2e1c45e 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java @@ -6,6 +6,7 @@ import com.lopixlabs.app.fullstackdemo.login.model.Login; import io.quarkus.test.common.http.TestHTTPEndpoint; import io.quarkus.test.junit.QuarkusTest; +import io.restassured.http.ContentType; import org.junit.jupiter.api.Test; @QuarkusTest @@ -17,6 +18,8 @@ void testHelloEndpoint() { given() .when() .body(Login.builder().authentication("user").build()) + .accept(ContentType.JSON) + .contentType(ContentType.JSON) .post("/login") .then() .statusCode(200); From 763a834fee0ceb7cd889858c57a589c17bf8f7fa Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Fri, 10 Mar 2023 18:51:10 +0000 Subject: [PATCH 12/22] jwt login --- README.md | 4 ++-- .../app/fullstackdemo/login/LoginResource.java | 7 +------ .../app/fullstackdemo/login/LoginService.java | 6 +----- .../app/fullstackdemo/security/TokenService.java | 4 ++-- .../app/fullstackdemo/security/TokenSettings.java | 15 ++++++++++----- web/src/App.svelte | 2 -- web/src/app/DashboardPage.svelte | 1 - 7 files changed, 16 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 1fec3d98..e15a3d1a 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ * [Open-api generate](https://openapi-generator.tech/docs/generators/typescript-axios) ## Frontend -* [React](https://reactjs.org/) +* [svelte](https://svelte.dev) * [Vite](https://vitejs.dev/) -* [mantine](https://mantine.dev/) +* [stwui](https://stwui.vercel.app/) ## How to run project diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java index 5528a36b..08716c87 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java @@ -29,14 +29,9 @@ public LoginResource(final LoginService loginService, final JsonWebToken jwt) { @POST @Path("login") @PermitAll - public LoginResult hello(final Login login) { + public LoginResult login(final Login login) { return loginService.login(login); } - @GET - @Path("renew") - public LoginResult hello() { - return loginService.renew(jwt); - } } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java index fc84ac8a..a00d0d11 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java @@ -19,14 +19,10 @@ public LoginService(final TokenService tokenService) { } public LoginResult login(final Login login) { - final String authentication = new String(Base64.decode("dXNlcjpwYXNz")); + final String authentication = new String(Base64.decode("dXNlcjpwYXNz")); //user:passs final String token = tokenService.generate("teste@test.com", "user"); return LoginResult.of(token); } - public LoginResult renew(final JsonWebToken jwt) { - final String token = tokenService.renew(jwt); - return LoginResult.of(token); - } } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java index 38a23ebe..52b0a8c3 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java @@ -24,7 +24,7 @@ public String generate(String email, String username) { return Jwt.issuer(tokenSettings.getIssuer()) .upn(email) .issuedAt(Instant.now()) - .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpires())) + .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpiresSeconds())) .preferredUserName(username) .groups(new HashSet<>(Arrays.asList(UserRole.ADMIN.name().toLowerCase(Locale.ROOT)))) .sign(); @@ -46,7 +46,7 @@ public String renew(final JsonWebToken jwt) { return Jwt.issuer(tokenSettings.getIssuer()) .upn(jwt.getClaim("upn")) .issuedAt(Instant.now()) - .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpires())) + .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpiresSeconds())) .preferredUserName(jwt.getName()) .groups(jwt.getGroups()) .sign(); diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java index 79672bd4..4f06bdea 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java @@ -1,6 +1,5 @@ package com.lopixlabs.app.fullstackdemo.security; -import io.quarkus.runtime.annotations.ConfigItem; import javax.enterprise.context.ApplicationScoped; import lombok.Getter; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -8,9 +7,15 @@ @ApplicationScoped @Getter public class TokenSettings { - @ConfigProperty(name = "mp.jwt.verify.issuer") - private String issuer; + public static final String EXPIRE_24HOURS = "86400"; + private final String issuer; + private final int expiresSeconds; - @ConfigProperty(name = "jwt.expires", defaultValue = "3000") - private int expires; + public TokenSettings( + @ConfigProperty(name = "mp.jwt.verify.issuer") final String issuer, + @ConfigProperty(name = "jwt.expires", defaultValue = EXPIRE_24HOURS) final int expiresSeconds + ) { + this.issuer = issuer; + this.expiresSeconds = expiresSeconds; + } } diff --git a/web/src/App.svelte b/web/src/App.svelte index ee82ffbc..e905c7ce 100644 --- a/web/src/App.svelte +++ b/web/src/App.svelte @@ -1,11 +1,9 @@
-
diff --git a/web/src/app/DashboardPage.svelte b/web/src/app/DashboardPage.svelte index 48f5c134..99616646 100644 --- a/web/src/app/DashboardPage.svelte +++ b/web/src/app/DashboardPage.svelte @@ -1,6 +1,5 @@ - From 1fa9823ea79603b5bd598963b24f21b8144455bb Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Tue, 14 Mar 2023 18:35:17 +0000 Subject: [PATCH 13/22] jwt login --- service/pom.xml | 10 +++ .../com/lopixlabs/app/fullstackdemo/App.java | 31 +++++++++ .../fullstackdemo/hello/GreetingResource.java | 2 +- .../fullstackdemo/login/LoginResource.java | 15 ++++- .../app/fullstackdemo/login/LoginService.java | 7 +- .../app/fullstackdemo/login/model/Login.java | 3 +- .../login/model/LoginResult.java | 4 +- .../fullstackdemo/security/TokenService.java | 2 +- .../users/{Roles.java => Role.java} | 19 ++++-- .../app/fullstackdemo/users/User.java | 20 ++++-- .../app/fullstackdemo/users/UserRole.java | 1 + service/src/main/resources/api/openapi.json | 66 +++++++++---------- service/src/main/resources/api/openapi.yaml | 54 +++++++-------- .../src/main/resources/application.properties | 4 +- .../login/LoginResourceTest.java | 37 +++++++++-- 15 files changed, 183 insertions(+), 92 deletions(-) create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/App.java rename service/src/main/java/com/lopixlabs/app/fullstackdemo/users/{Roles.java => Role.java} (67%) diff --git a/service/pom.xml b/service/pom.xml index ec34bbbd..14d462cc 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -64,6 +64,16 @@ quarkus-test-security test + + io.quarkus.resteasy.reactive + resteasy-reactive-common + 2.16.4.Final + + + io.quarkus + quarkus-security-jpa + 2.16.4.Final + diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/App.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/App.java new file mode 100644 index 00000000..c4ac926b --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/App.java @@ -0,0 +1,31 @@ +package com.lopixlabs.app.fullstackdemo; + + +import javax.ws.rs.core.Application; +import org.eclipse.microprofile.openapi.annotations.OpenAPIDefinition; +import org.eclipse.microprofile.openapi.annotations.enums.SecuritySchemeType; +import org.eclipse.microprofile.openapi.annotations.info.Info; +import org.eclipse.microprofile.openapi.annotations.security.SecurityRequirement; +import org.eclipse.microprofile.openapi.annotations.security.SecurityScheme; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +@OpenAPIDefinition( + tags = { + @Tag(name = "Demo", description = "Quarkus and svelte demo application"), + }, + info = @Info( + title = "Quarkus and svelte demo application", + version = "1.0.0" + ), + security = @SecurityRequirement(name = "basicAuth") +) +//@SecurityScheme( +// securitySchemeName = "basicAuth", // can be set to anything +// type = SecuritySchemeType.HTTP, +// scheme = "basic" +//) +@SecurityScheme( + type = SecuritySchemeType.APIKEY +) +public class App extends Application { +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java index 20fbab46..cad3224c 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/hello/GreetingResource.java @@ -26,7 +26,7 @@ public Hello hello(@Context SecurityContext ctx) { } @GET @Path("roles-allowed") - @RolesAllowed({ "User", "Admin" }) + @RolesAllowed({ "user", "admin" }) @Produces(MediaType.TEXT_PLAIN) public Hello helloRolesAllowed(@Context SecurityContext ctx) { return Hello.of(getResponseString(ctx) + ", birthdate: " + jwt.getClaim("birthdate").toString()); diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java index 08716c87..b4c57242 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java @@ -3,6 +3,7 @@ import com.lopixlabs.app.fullstackdemo.login.model.Login; import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.ws.rs.Consumes; @@ -12,14 +13,18 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.eclipse.microprofile.jwt.JsonWebToken; +import org.eclipse.microprofile.openapi.annotations.enums.SecuritySchemeType; +import org.eclipse.microprofile.openapi.annotations.security.SecurityScheme; +import org.jboss.resteasy.reactive.RestHeader; @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @ApplicationScoped -@Path("api") +@Path("/api") public class LoginResource { private final LoginService loginService; private final JsonWebToken jwt; + @Inject public LoginResource(final LoginService loginService, final JsonWebToken jwt) { this.loginService = loginService; @@ -27,11 +32,17 @@ public LoginResource(final LoginService loginService, final JsonWebToken jwt) { } @POST - @Path("login") + @Path("/login") @PermitAll public LoginResult login(final Login login) { return loginService.login(login); } + @GET + @Path("/me") + @RolesAllowed("user") + public LoginResult me() { + return LoginResult.of(jwt.getRawToken()); + } } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java index a00d0d11..6366cbdb 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java @@ -3,11 +3,8 @@ import com.lopixlabs.app.fullstackdemo.login.model.Login; import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; import com.lopixlabs.app.fullstackdemo.security.TokenService; -import java.util.Arrays; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import org.eclipse.microprofile.jwt.JsonWebToken; -import org.jose4j.base64url.Base64; @ApplicationScoped public class LoginService { @@ -19,9 +16,9 @@ public LoginService(final TokenService tokenService) { } public LoginResult login(final Login login) { - final String authentication = new String(Base64.decode("dXNlcjpwYXNz")); //user:passs + //final String authentication = new String(Base64.decode(authorization)); //user:passs - final String token = tokenService.generate("teste@test.com", "user"); + final String token = tokenService.generate("teste@test.com", login.getUsername()); return LoginResult.of(token); } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java index e1c6fc4a..c5dd8a69 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java @@ -10,5 +10,6 @@ @Builder @Jacksonized public class Login { - String authentication; + String username; + String password; } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java index 23bb2bef..9c7ede63 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java @@ -2,9 +2,11 @@ import lombok.AllArgsConstructor; import lombok.Value; +import lombok.extern.jackson.Jacksonized; @Value @AllArgsConstructor(staticName = "of") +@Jacksonized public class LoginResult { - String jwt; + String token; } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java index 52b0a8c3..5661245f 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java @@ -26,7 +26,7 @@ public String generate(String email, String username) { .issuedAt(Instant.now()) .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpiresSeconds())) .preferredUserName(username) - .groups(new HashSet<>(Arrays.asList(UserRole.ADMIN.name().toLowerCase(Locale.ROOT)))) + .groups(new HashSet<>(Arrays.asList(UserRole.USER.name().toLowerCase(Locale.ROOT)))) .sign(); } catch (Exception e) { log.error("Error generate token: " + e.getMessage(), e); diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Role.java similarity index 67% rename from service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java rename to service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Role.java index cc8ca043..516b3e26 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Roles.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/Role.java @@ -2,12 +2,14 @@ import static lombok.AccessLevel.PRIVATE; +import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import java.time.LocalDateTime; +import java.util.List; import javax.persistence.Column; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; +import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; -import javax.validation.constraints.NotNull; +import javax.persistence.ManyToMany; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,6 +18,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; +import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.GenericGenerator; @Data @@ -24,14 +27,16 @@ @Accessors(chain = true) @EqualsAndHashCode(of = {"id"}) @Builder(toBuilder = true) -public class Roles { +@Entity(name = "_role") +public class Role extends PanacheEntityBase { @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") @Column(name = "id", nullable = false, updatable = false) @Setter(AccessLevel.PROTECTED) private String id; - @NotNull - @Enumerated(EnumType.STRING) - private UserRole name; + + @CreationTimestamp + private LocalDateTime createAt = LocalDateTime.now(); + private String role; } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java index 5dbed89f..0e95ecc8 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/User.java @@ -3,7 +3,9 @@ import static lombok.AccessLevel.PRIVATE; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.quarkus.elytron.security.common.BcryptUtil; import io.quarkus.hibernate.orm.panache.PanacheEntityBase; +import io.quarkus.security.jpa.Roles; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -14,6 +16,7 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; @@ -34,6 +37,7 @@ @Accessors(chain = true) @EqualsAndHashCode(of = {"id"}) @Builder(toBuilder = true) +@Entity(name = "_user") public class User extends PanacheEntityBase { @Id @GeneratedValue(generator = "system-uuid") @@ -42,10 +46,9 @@ public class User extends PanacheEntityBase { @Setter(AccessLevel.PROTECTED) private String id; @NotNull - private String name; + private String username; @CreationTimestamp - @Column(name = "pes_data_hora_cadastro") private LocalDateTime createAt = LocalDateTime.now(); @Email private String email; @@ -54,7 +57,14 @@ public class User extends PanacheEntityBase { private String password; - @OneToMany(fetch = FetchType.EAGER) - @JoinTable() - private List roles = new ArrayList<>(); + @ManyToMany + public List roles = new ArrayList<>(); + + public static void add(String username, String password, List role) { + User user = new User(); + user.username = username; + user.password = BcryptUtil.bcryptHash(password); + user.roles = role; + user.persist(); + } } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java index a90192b8..69f7df5d 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java @@ -1,5 +1,6 @@ package com.lopixlabs.app.fullstackdemo.users; public enum UserRole { + USER, ADMIN } diff --git a/service/src/main/resources/api/openapi.json b/service/src/main/resources/api/openapi.json index 340f3194..4e028b10 100644 --- a/service/src/main/resources/api/openapi.json +++ b/service/src/main/resources/api/openapi.json @@ -1,8 +1,8 @@ { "openapi" : "3.0.3", "info" : { - "title" : "service API", - "version" : "1.0.0-SNAPSHOT" + "title" : "Quarkus and svelte demo application", + "version" : "1.0.0" }, "servers" : [ { "url" : "http://localhost:8080", @@ -11,6 +11,13 @@ "url" : "http://0.0.0.0:8080", "description" : "Auto generated value" } ], + "security" : [ { + "basicAuth" : [ ] + } ], + "tags" : [ { + "name" : "Demo", + "description" : "Quarkus and svelte demo application" + } ], "paths" : { "/api/login" : { "post" : { @@ -38,7 +45,7 @@ } } }, - "/api/renew" : { + "/api/me" : { "get" : { "tags" : [ "Login Resource" ], "responses" : { @@ -51,25 +58,19 @@ } } } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" } - } - } - }, - "/hello" : { - "get" : { - "tags" : [ "Greeting Resource" ], - "responses" : { - "200" : { - "description" : "OK", - "content" : { - "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/Hello" - } - } - } - } - } + }, + "security" : [ { + "SecurityScheme" : [ "user" ] + }, { + "SecurityScheme" : [ "user" ] + } ] } }, "/hello/permit-all" : { @@ -81,7 +82,7 @@ "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/Hello1" + "$ref" : "#/components/schemas/Hello" } } } @@ -98,7 +99,7 @@ "content" : { "text/plain" : { "schema" : { - "$ref" : "#/components/schemas/Hello1" + "$ref" : "#/components/schemas/Hello" } } } @@ -111,9 +112,9 @@ } }, "security" : [ { - "SecurityScheme" : [ "User", "Admin" ] + "SecurityScheme" : [ "user", "admin" ] }, { - "SecurityScheme" : [ "User", "Admin" ] + "SecurityScheme" : [ "user", "admin" ] } ] } } @@ -128,18 +129,13 @@ } } }, - "Hello1" : { - "type" : "object", - "properties" : { - "value" : { - "type" : "string" - } - } - }, "Login" : { "type" : "object", "properties" : { - "authentication" : { + "username" : { + "type" : "string" + }, + "password" : { "type" : "string" } } @@ -147,7 +143,7 @@ "LoginResult" : { "type" : "object", "properties" : { - "jwt" : { + "token" : { "type" : "string" } } diff --git a/service/src/main/resources/api/openapi.yaml b/service/src/main/resources/api/openapi.yaml index ca317d49..b58411ae 100644 --- a/service/src/main/resources/api/openapi.yaml +++ b/service/src/main/resources/api/openapi.yaml @@ -1,13 +1,18 @@ --- openapi: 3.0.3 info: - title: service API - version: 1.0.0-SNAPSHOT + title: Quarkus and svelte demo application + version: 1.0.0 servers: - url: http://localhost:8080 description: Auto generated value - url: http://0.0.0.0:8080 description: Auto generated value +security: +- basicAuth: [] +tags: +- name: Demo + description: Quarkus and svelte demo application paths: /api/login: post: @@ -25,7 +30,7 @@ paths: application/json: schema: $ref: '#/components/schemas/LoginResult' - /api/renew: + /api/me: get: tags: - Login Resource @@ -36,17 +41,15 @@ paths: application/json: schema: $ref: '#/components/schemas/LoginResult' - /hello: - get: - tags: - - Greeting Resource - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/Hello' + "401": + description: Not Authorized + "403": + description: Not Allowed + security: + - SecurityScheme: + - user + - SecurityScheme: + - user /hello/permit-all: get: tags: @@ -57,7 +60,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/Hello1' + $ref: '#/components/schemas/Hello' /hello/roles-allowed: get: tags: @@ -68,18 +71,18 @@ paths: content: text/plain: schema: - $ref: '#/components/schemas/Hello1' + $ref: '#/components/schemas/Hello' "401": description: Not Authorized "403": description: Not Allowed security: - SecurityScheme: - - User - - Admin + - user + - admin - SecurityScheme: - - User - - Admin + - user + - admin components: schemas: Hello: @@ -87,18 +90,15 @@ components: properties: value: type: string - Hello1: - type: object - properties: - value: - type: string Login: type: object properties: - authentication: + username: + type: string + password: type: string LoginResult: type: object properties: - jwt: + token: type: string diff --git a/service/src/main/resources/application.properties b/service/src/main/resources/application.properties index 4b81872b..63a1cdba 100644 --- a/service/src/main/resources/application.properties +++ b/service/src/main/resources/application.properties @@ -1,6 +1,7 @@ quarkus.smallrye-openapi.store-schema-directory=src/main/resources/api %dev.quarkus.http.cors=true +%dev.quarkus.http.cors.origins=* %dev.quarkus.http.access-log.enabled=true %dev.quarkus.log.category."io.quarkus.smallrye.jwt.runtime.auth.MpJwtValidator".level=TRACE @@ -10,5 +11,6 @@ mp.jwt.verify.publickey.location=publicKey.pem smallrye.jwt.sign.key.location=privateKey.pem mp.jwt.verify.issuer=https://localhost/issuer +%dev.quarkus.hibernate-orm.database.generation=drop-and-create -quarkus.native.resources.includes=publicKey.pem +quarkus.native.resources.includes=publicKey.pem diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java index e2e1c45e..cd9edd43 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java @@ -1,12 +1,13 @@ package com.lopixlabs.app.fullstackdemo.login; import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; -import com.lopixlabs.app.fullstackdemo.login.model.Login; +import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; import io.quarkus.test.common.http.TestHTTPEndpoint; import io.quarkus.test.junit.QuarkusTest; import io.restassured.http.ContentType; +import java.util.Base64; +import org.apache.http.HttpStatus; import org.junit.jupiter.api.Test; @QuarkusTest @@ -14,14 +15,38 @@ class LoginResourceTest { @Test - void testHelloEndpoint() { + void shouldNotAccessAdminWhenAnonymous() { + given(). + get("/api/me") + .then() + .statusCode(HttpStatus.SC_UNAUTHORIZED); + } + + @Test + void shouldLogin() { + final LoginResult loginResult = given() + .when() + .auth().basic("user", "pass") + .accept(ContentType.JSON) + .contentType(ContentType.JSON) + .get("/api/login") + .then() + .statusCode(HttpStatus.SC_OK) + .extract().body().as(LoginResult.class); + given() .when() - .body(Login.builder().authentication("user").build()) + .auth().oauth2(loginResult.getToken()) .accept(ContentType.JSON) .contentType(ContentType.JSON) - .post("/login") + .post("/me") .then() - .statusCode(200); + .statusCode(HttpStatus.SC_OK) + .extract().body().as(LoginResult.class); + } + + private String getBasicAuthenticationHeader(String username, String password) { + String valueToEncode = username + ":" + password; + return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes()); } } From 8ab834fdb99bf070bd90ef841fe9e2ac1b15f8ed Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 20 Mar 2023 23:03:00 +0000 Subject: [PATCH 14/22] jwt login --- doc/pom.xml | 7 + doc/src/main/asciidoc/auth.adoc | 7 + doc/src/main/asciidoc/auth.puml | 27 ++ .../openapi.yaml-asciidoc.sha256 | 2 +- doc/src/main/asciidoc/openapi/index.adoc | 231 ++++++++++++------ .../app/fullstackdemo/auth/AuthResource.java | 46 ++++ .../app/fullstackdemo/auth/AuthService.java | 35 +++ .../model/AuthResult.java} | 5 +- .../{login => auth}/model/Login.java | 2 +- .../fullstackdemo/login/LoginResource.java | 48 ---- .../app/fullstackdemo/login/LoginService.java | 25 -- .../app/fullstackdemo/security/Roles.java | 7 + .../fullstackdemo/security/TokenService.java | 30 +-- .../fullstackdemo/security/TokenSettings.java | 6 +- .../app/fullstackdemo/users/UserRole.java | 14 +- service/src/main/resources/api/openapi.json | 79 +++--- service/src/main/resources/api/openapi.yaml | 54 ++-- .../src/main/resources/application.properties | 3 + .../AuthResourceTest.java} | 14 +- tools/api/.openapi-generator/FILES | 2 +- .../openapi.yaml-jetbrains-http-client.sha256 | 2 +- tools/api/README.md | 7 +- web/package.json | 5 +- web/src/AppLayout.svelte | 6 +- web/src/app/DashboardPage.svelte | 14 +- web/src/http/HttpClient.ts | 73 +++++- web/src/http/HttpClientContext.tsx | 42 ---- .../openapi.yaml-axios.sha256 | 2 +- web/src/http/generated/api.ts | 206 ++++++++++------ web/src/http/generated/base.ts | 4 +- web/src/http/generated/common.ts | 4 +- web/src/http/generated/configuration.ts | 4 +- web/src/http/generated/index.ts | 4 +- web/src/http/getAxiosInstance.ts | 10 - web/yarn.lock | 5 + 35 files changed, 639 insertions(+), 393 deletions(-) create mode 100644 doc/src/main/asciidoc/auth.adoc create mode 100644 doc/src/main/asciidoc/auth.puml create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthService.java rename service/src/main/java/com/lopixlabs/app/fullstackdemo/{login/model/LoginResult.java => auth/model/AuthResult.java} (63%) rename service/src/main/java/com/lopixlabs/app/fullstackdemo/{login => auth}/model/Login.java (81%) delete mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java delete mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/security/Roles.java rename service/src/test/java/com/lopixlabs/app/fullstackdemo/{login/LoginResourceTest.java => auth/AuthResourceTest.java} (79%) delete mode 100644 web/src/http/HttpClientContext.tsx delete mode 100644 web/src/http/getAxiosInstance.ts diff --git a/doc/pom.xml b/doc/pom.xml index c2eb67f8..1f4b646d 100644 --- a/doc/pom.xml +++ b/doc/pom.xml @@ -41,6 +41,13 @@ + + + org.asciidoctor + asciidoctorj-diagram + 2.2.1 + + diff --git a/doc/src/main/asciidoc/auth.adoc b/doc/src/main/asciidoc/auth.adoc new file mode 100644 index 00000000..df311738 --- /dev/null +++ b/doc/src/main/asciidoc/auth.adoc @@ -0,0 +1,7 @@ + +The diagram shows flow of how we implemented Authentication process with Access Token and Refresh Token. + +["plantuml","containers",svg] +plantuml::auth.puml[] + + diff --git a/doc/src/main/asciidoc/auth.puml b/doc/src/main/asciidoc/auth.puml new file mode 100644 index 00000000..5d21a087 --- /dev/null +++ b/doc/src/main/asciidoc/auth.puml @@ -0,0 +1,27 @@ +@startuml +autonumber 1 + +alt User Login +Client -> Server: Login \nPOST /api/auth/signin {username, password} +activate Server +Server --> Client: Authentication Response {token, refreshToken} +deactivate Server +end alt + +alt Access resource with Expired token +Client -> Server: Request data with JWT on header +activate Server +Server --> Client: Token Expired +deactivate Server +end alt + +alt Refresh token +Client -> Server: Send Refresh token request \nPOST /api/auth/refreshToken +activate Server +Server --> Client: Authentication Response {token, refreshToken} +deactivate Server +end alt + + + +@enduml diff --git a/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 b/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 index 70936897..de4a5b6b 100644 --- a/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 +++ b/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 @@ -1 +1 @@ -6129a3aba6c01d6a2caed3abfacddec6979074614b2bda9708f1ee04bb8e54a7 \ No newline at end of file +1af7d8aab950bf5156a990876f2a8b2e531a64498a566f8aefcbebf10b18858c \ No newline at end of file diff --git a/doc/src/main/asciidoc/openapi/index.adoc b/doc/src/main/asciidoc/openapi/index.adoc index b1702eb8..28ce761b 100644 --- a/doc/src/main/asciidoc/openapi/index.adoc +++ b/doc/src/main/asciidoc/openapi/index.adoc @@ -1,16 +1,16 @@ -= service API += Quarkus and svelte demo application team@openapitools.org -1.0.0-SNAPSHOT +1.0.0 :toc: left :numbered: :toclevels: 3 :source-highlighter: highlightjs -:keywords: openapi, rest, service API +:keywords: openapi, rest, Quarkus and svelte demo application :specDir: :snippetDir: :generator-template: v1 2019-12-20 :info-url: https://openapi-generator.tech -:app-name: service API +:app-name: Quarkus and svelte demo application [abstract] .Abstract @@ -24,14 +24,14 @@ No description provided (generated by Openapi Generator https://github.com/opena == Endpoints -[.GreetingResource] -=== GreetingResource +[.AuthResource] +=== AuthResource -[.helloPermitAllGet] -==== helloPermitAllGet +[.apiAuthRefreshGet] +==== apiAuthRefreshGet -`GET /hello/permit-all` +`GET /api/auth/refresh` @@ -40,7 +40,7 @@ No description provided (generated by Openapi Generator https://github.com/opena -// markup not found, no include::{specDir}hello/permit-all/GET/spec.adoc[opts=optional] +// markup not found, no include::{specDir}api/auth/refresh/GET/spec.adoc[opts=optional] @@ -54,7 +54,7 @@ No description provided (generated by Openapi Generator https://github.com/opena ===== Return Type -<> +<> ===== Content Type @@ -71,36 +71,46 @@ No description provided (generated by Openapi Generator https://github.com/opena | 200 | OK -| <> +| <> + + +| 401 +| Not Authorized +| <<>> + + +| 403 +| Not Allowed +| <<>> |=== ===== Samples -// markup not found, no include::{snippetDir}hello/permit-all/GET/http-request.adoc[opts=optional] +// markup not found, no include::{snippetDir}api/auth/refresh/GET/http-request.adoc[opts=optional] -// markup not found, no include::{snippetDir}hello/permit-all/GET/http-response.adoc[opts=optional] +// markup not found, no include::{snippetDir}api/auth/refresh/GET/http-response.adoc[opts=optional] -// file not found, no * wiremock data link :hello/permit-all/GET/GET.json[] +// file not found, no * wiremock data link :api/auth/refresh/GET/GET.json[] ifdef::internal-generation[] ===== Implementation -// markup not found, no include::{specDir}hello/permit-all/GET/implementation.adoc[opts=optional] +// markup not found, no include::{specDir}api/auth/refresh/GET/implementation.adoc[opts=optional] endif::internal-generation[] -[.helloRolesAllowedGet] -==== helloRolesAllowedGet +[.apiAuthSigninPost] +==== apiAuthSigninPost -`GET /hello/roles-allowed` +`POST /api/auth/signin` @@ -109,13 +119,26 @@ endif::internal-generation[] -// markup not found, no include::{specDir}hello/roles-allowed/GET/spec.adoc[opts=optional] +// markup not found, no include::{specDir}api/auth/signin/POST/spec.adoc[opts=optional] ===== Parameters +====== Body Parameter + +[cols="2,3,1,1,1"] +|=== +|Name| Description| Required| Default| Pattern + +| Login +| <> +| - +| +| + +|=== @@ -123,12 +146,12 @@ endif::internal-generation[] ===== Return Type -<> +<> ===== Content Type -* text/plain +* application/json ===== Responses @@ -140,50 +163,40 @@ endif::internal-generation[] | 200 | OK -| <> - - -| 401 -| Not Authorized -| <<>> - - -| 403 -| Not Allowed -| <<>> +| <> |=== ===== Samples -// markup not found, no include::{snippetDir}hello/roles-allowed/GET/http-request.adoc[opts=optional] +// markup not found, no include::{snippetDir}api/auth/signin/POST/http-request.adoc[opts=optional] -// markup not found, no include::{snippetDir}hello/roles-allowed/GET/http-response.adoc[opts=optional] +// markup not found, no include::{snippetDir}api/auth/signin/POST/http-response.adoc[opts=optional] -// file not found, no * wiremock data link :hello/roles-allowed/GET/GET.json[] +// file not found, no * wiremock data link :api/auth/signin/POST/POST.json[] ifdef::internal-generation[] ===== Implementation -// markup not found, no include::{specDir}hello/roles-allowed/GET/implementation.adoc[opts=optional] +// markup not found, no include::{specDir}api/auth/signin/POST/implementation.adoc[opts=optional] endif::internal-generation[] -[.LoginResource] -=== LoginResource +[.GreetingResource] +=== GreetingResource -[.apiLoginPost] -==== apiLoginPost +[.helloPermitAllGet] +==== helloPermitAllGet -`POST /api/login` +`GET /hello/permit-all` @@ -192,39 +205,95 @@ endif::internal-generation[] -// markup not found, no include::{specDir}api/login/POST/spec.adoc[opts=optional] +// markup not found, no include::{specDir}hello/permit-all/GET/spec.adoc[opts=optional] ===== Parameters -====== Body Parameter -[cols="2,3,1,1,1"] + + + + +===== Return Type + +<> + + +===== Content Type + +* application/json + +===== Responses + +.http response codes +[cols="2,3,1"] |=== -|Name| Description| Required| Default| Pattern +| Code | Message | Datatype -| Login -| <> -| - -| -| + +| 200 +| OK +| <> |=== +===== Samples + + +// markup not found, no include::{snippetDir}hello/permit-all/GET/http-request.adoc[opts=optional] + + +// markup not found, no include::{snippetDir}hello/permit-all/GET/http-response.adoc[opts=optional] + + + +// file not found, no * wiremock data link :hello/permit-all/GET/GET.json[] + + +ifdef::internal-generation[] +===== Implementation + +// markup not found, no include::{specDir}hello/permit-all/GET/implementation.adoc[opts=optional] + + +endif::internal-generation[] + + +[.helloRolesAllowedGet] +==== helloRolesAllowedGet + +`GET /hello/roles-allowed` + + + +===== Description + + + + +// markup not found, no include::{specDir}hello/roles-allowed/GET/spec.adoc[opts=optional] + + + +===== Parameters + + + ===== Return Type -<> +<> ===== Content Type -* application/json +* text/plain ===== Responses @@ -236,27 +305,37 @@ endif::internal-generation[] | 200 | OK -| <> +| <> + + +| 401 +| Not Authorized +| <<>> + + +| 403 +| Not Allowed +| <<>> |=== ===== Samples -// markup not found, no include::{snippetDir}api/login/POST/http-request.adoc[opts=optional] +// markup not found, no include::{snippetDir}hello/roles-allowed/GET/http-request.adoc[opts=optional] -// markup not found, no include::{snippetDir}api/login/POST/http-response.adoc[opts=optional] +// markup not found, no include::{snippetDir}hello/roles-allowed/GET/http-response.adoc[opts=optional] -// file not found, no * wiremock data link :api/login/POST/POST.json[] +// file not found, no * wiremock data link :hello/roles-allowed/GET/GET.json[] ifdef::internal-generation[] ===== Implementation -// markup not found, no include::{specDir}api/login/POST/implementation.adoc[opts=optional] +// markup not found, no include::{specDir}hello/roles-allowed/GET/implementation.adoc[opts=optional] endif::internal-generation[] @@ -266,17 +345,23 @@ endif::internal-generation[] == Models -[#Hello] -=== _Hello_ +[#AuthResult] +=== _AuthResult_ -[.fields-Hello] +[.fields-AuthResult] [cols="2,1,2,4,1"] |=== | Field Name| Required| Type| Description| Format -| value +| token +| +| String +| +| + +| refreshToken | | String | @@ -285,17 +370,17 @@ endif::internal-generation[] |=== -[#Login] -=== _Login_ +[#Hello] +=== _Hello_ -[.fields-Login] +[.fields-Hello] [cols="2,1,2,4,1"] |=== | Field Name| Required| Type| Description| Format -| authentication +| value | | String | @@ -304,17 +389,23 @@ endif::internal-generation[] |=== -[#LoginResult] -=== _LoginResult_ +[#Login] +=== _Login_ -[.fields-LoginResult] +[.fields-Login] [cols="2,1,2,4,1"] |=== | Field Name| Required| Type| Description| Format -| jwt +| username +| +| String +| +| + +| password | | String | diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java new file mode 100644 index 00000000..c545c8ad --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java @@ -0,0 +1,46 @@ +package com.lopixlabs.app.fullstackdemo.auth; + +import static com.lopixlabs.app.fullstackdemo.security.Roles.REFRESH; + +import com.lopixlabs.app.fullstackdemo.auth.model.Login; +import com.lopixlabs.app.fullstackdemo.auth.model.AuthResult; +import javax.annotation.security.PermitAll; +import javax.annotation.security.RolesAllowed; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import org.eclipse.microprofile.jwt.JsonWebToken; + +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@ApplicationScoped +@Path("/api/auth") +public class AuthResource { + private final AuthService authService; + private final JsonWebToken jwt; + + @Inject + public AuthResource(final AuthService authService, final JsonWebToken jwt) { + this.authService = authService; + this.jwt = jwt; + } + + @POST + @Path("/signin") + @PermitAll + public AuthResult login(final Login login) { + return authService.login(login); + } + + @GET + @Path("/refresh") + @RolesAllowed(REFRESH) + public AuthResult refresh() { + return authService.refresh(jwt); + } +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthService.java new file mode 100644 index 00000000..370b4cfe --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthService.java @@ -0,0 +1,35 @@ +package com.lopixlabs.app.fullstackdemo.auth; + +import static com.lopixlabs.app.fullstackdemo.users.UserRole.USER; + +import com.lopixlabs.app.fullstackdemo.auth.model.Login; +import com.lopixlabs.app.fullstackdemo.auth.model.AuthResult; +import com.lopixlabs.app.fullstackdemo.security.TokenService; +import java.util.List; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import org.eclipse.microprofile.jwt.JsonWebToken; + +@ApplicationScoped +public class AuthService { + private final TokenService tokenService; + + @Inject + public AuthService(final TokenService tokenService) { + this.tokenService = tokenService; + } + + public AuthResult login(final Login login) { + //final String authentication = new String(Base64.decode(authorization)); //user:passs + + final String token = tokenService.generate("teste@test.com", List.of(USER.getRoleName())); + final String refreshToken = tokenService.generateRefreshToken("teste@test.com"); + return AuthResult.of(token, refreshToken); + } + + public AuthResult refresh(final JsonWebToken jwt) { + final String token = tokenService.generate("teste@test.com", List.of(USER.getRoleName())); + final String refreshToken = tokenService.generateRefreshToken("teste@test.com"); + return AuthResult.of(token, refreshToken); + } +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/model/AuthResult.java similarity index 63% rename from service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java rename to service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/model/AuthResult.java index 9c7ede63..e0da0cf1 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/LoginResult.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/model/AuthResult.java @@ -1,4 +1,4 @@ -package com.lopixlabs.app.fullstackdemo.login.model; +package com.lopixlabs.app.fullstackdemo.auth.model; import lombok.AllArgsConstructor; import lombok.Value; @@ -7,6 +7,7 @@ @Value @AllArgsConstructor(staticName = "of") @Jacksonized -public class LoginResult { +public class AuthResult { String token; + String refreshToken; } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/model/Login.java similarity index 81% rename from service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java rename to service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/model/Login.java index c5dd8a69..f02c7fd2 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/model/Login.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/model/Login.java @@ -1,4 +1,4 @@ -package com.lopixlabs.app.fullstackdemo.login.model; +package com.lopixlabs.app.fullstackdemo.auth.model; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java deleted file mode 100644 index b4c57242..00000000 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginResource.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.lopixlabs.app.fullstackdemo.login; - -import com.lopixlabs.app.fullstackdemo.login.model.Login; -import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; -import javax.annotation.security.PermitAll; -import javax.annotation.security.RolesAllowed; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import org.eclipse.microprofile.jwt.JsonWebToken; -import org.eclipse.microprofile.openapi.annotations.enums.SecuritySchemeType; -import org.eclipse.microprofile.openapi.annotations.security.SecurityScheme; -import org.jboss.resteasy.reactive.RestHeader; - -@Produces(MediaType.APPLICATION_JSON) -@Consumes(MediaType.APPLICATION_JSON) -@ApplicationScoped -@Path("/api") -public class LoginResource { - private final LoginService loginService; - private final JsonWebToken jwt; - - @Inject - public LoginResource(final LoginService loginService, final JsonWebToken jwt) { - this.loginService = loginService; - this.jwt = jwt; - } - - @POST - @Path("/login") - @PermitAll - public LoginResult login(final Login login) { - return loginService.login(login); - } - - @GET - @Path("/me") - @RolesAllowed("user") - public LoginResult me() { - return LoginResult.of(jwt.getRawToken()); - } - -} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java deleted file mode 100644 index 6366cbdb..00000000 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/login/LoginService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.lopixlabs.app.fullstackdemo.login; - -import com.lopixlabs.app.fullstackdemo.login.model.Login; -import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; -import com.lopixlabs.app.fullstackdemo.security.TokenService; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; - -@ApplicationScoped -public class LoginService { - private final TokenService tokenService; - - @Inject - public LoginService(final TokenService tokenService) { - this.tokenService = tokenService; - } - - public LoginResult login(final Login login) { - //final String authentication = new String(Base64.decode(authorization)); //user:passs - - final String token = tokenService.generate("teste@test.com", login.getUsername()); - return LoginResult.of(token); - } - -} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/Roles.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/Roles.java new file mode 100644 index 00000000..b7c32d15 --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/Roles.java @@ -0,0 +1,7 @@ +package com.lopixlabs.app.fullstackdemo.security; + +public class Roles { + public static final String REFRESH = "refresh"; + public static final String USER = "user"; + public static final String ADMIN = "admin"; +} diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java index 5661245f..125edb1c 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenService.java @@ -1,32 +1,31 @@ package com.lopixlabs.app.fullstackdemo.security; -import com.lopixlabs.app.fullstackdemo.users.UserRole; +import static com.lopixlabs.app.fullstackdemo.security.Roles.REFRESH; + import io.smallrye.jwt.build.Jwt; import java.time.Instant; -import java.util.Arrays; import java.util.HashSet; -import java.util.Locale; +import java.util.List; import javax.enterprise.context.ApplicationScoped; import lombok.extern.slf4j.Slf4j; -import org.eclipse.microprofile.jwt.JsonWebToken; @ApplicationScoped @Slf4j public class TokenService { private final TokenSettings tokenSettings; + // TODO WIP public TokenService(final TokenSettings tokenSettings) { this.tokenSettings = tokenSettings; } - public String generate(String email, String username) { + public String generate(final String email, final List roles) { try { return Jwt.issuer(tokenSettings.getIssuer()) .upn(email) .issuedAt(Instant.now()) .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpiresSeconds())) - .preferredUserName(username) - .groups(new HashSet<>(Arrays.asList(UserRole.USER.name().toLowerCase(Locale.ROOT)))) + .groups(new HashSet<>(roles)) .sign(); } catch (Exception e) { log.error("Error generate token: " + e.getMessage(), e); @@ -34,21 +33,12 @@ public String generate(String email, String username) { } } - /** - * @return the current time in seconds since epoch - */ - public static int currentTimeInSecs() { - long currentTimeMS = System.currentTimeMillis(); - return (int) (currentTimeMS / 1000); - } - - public String renew(final JsonWebToken jwt) { + public String generateRefreshToken(String email) { return Jwt.issuer(tokenSettings.getIssuer()) - .upn(jwt.getClaim("upn")) + .upn(email) .issuedAt(Instant.now()) - .expiresAt(Instant.now().plusSeconds(tokenSettings.getExpiresSeconds())) - .preferredUserName(jwt.getName()) - .groups(jwt.getGroups()) + .expiresAt(Instant.now().plusSeconds(tokenSettings.getRefreshExpiresSeconds())) + .groups(new HashSet<>(List.of(REFRESH))) .sign(); } } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java index 4f06bdea..34fb4359 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/security/TokenSettings.java @@ -7,15 +7,19 @@ @ApplicationScoped @Getter public class TokenSettings { + public static final String EXPIRE_5MIN = "300"; public static final String EXPIRE_24HOURS = "86400"; private final String issuer; private final int expiresSeconds; + private final int refreshExpiresSeconds; public TokenSettings( @ConfigProperty(name = "mp.jwt.verify.issuer") final String issuer, - @ConfigProperty(name = "jwt.expires", defaultValue = EXPIRE_24HOURS) final int expiresSeconds + @ConfigProperty(name = "jwt.expires", defaultValue = EXPIRE_5MIN) final int expiresSeconds, + @ConfigProperty(name = "jwt.refreshExpires", defaultValue = EXPIRE_24HOURS) final int refreshExpiresSeconds ) { this.issuer = issuer; this.expiresSeconds = expiresSeconds; + this.refreshExpiresSeconds = refreshExpiresSeconds; } } diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java index 69f7df5d..94d22104 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/users/UserRole.java @@ -1,6 +1,16 @@ package com.lopixlabs.app.fullstackdemo.users; +import com.lopixlabs.app.fullstackdemo.security.Roles; +import lombok.Getter; + public enum UserRole { - USER, - ADMIN + USER(Roles.USER), + ADMIN(Roles.ADMIN); + + @Getter + private final String roleName; + + UserRole(final String roleName) { + this.roleName = roleName; + } } diff --git a/service/src/main/resources/api/openapi.json b/service/src/main/resources/api/openapi.json index 4e028b10..13049521 100644 --- a/service/src/main/resources/api/openapi.json +++ b/service/src/main/resources/api/openapi.json @@ -19,58 +19,58 @@ "description" : "Quarkus and svelte demo application" } ], "paths" : { - "/api/login" : { - "post" : { - "tags" : [ "Login Resource" ], - "requestBody" : { - "content" : { - "application/json" : { - "schema" : { - "$ref" : "#/components/schemas/Login" - } - } - } - }, + "/api/auth/refresh" : { + "get" : { + "tags" : [ "Auth Resource" ], "responses" : { "200" : { "description" : "OK", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/LoginResult" + "$ref" : "#/components/schemas/AuthResult" } } } + }, + "401" : { + "description" : "Not Authorized" + }, + "403" : { + "description" : "Not Allowed" } - } + }, + "security" : [ { + "SecurityScheme" : [ "refresh" ] + }, { + "SecurityScheme" : [ "refresh" ] + } ] } }, - "/api/me" : { - "get" : { - "tags" : [ "Login Resource" ], + "/api/auth/signin" : { + "post" : { + "tags" : [ "Auth Resource" ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Login" + } + } + } + }, "responses" : { "200" : { "description" : "OK", "content" : { "application/json" : { "schema" : { - "$ref" : "#/components/schemas/LoginResult" + "$ref" : "#/components/schemas/AuthResult" } } } - }, - "401" : { - "description" : "Not Authorized" - }, - "403" : { - "description" : "Not Allowed" } - }, - "security" : [ { - "SecurityScheme" : [ "user" ] - }, { - "SecurityScheme" : [ "user" ] - } ] + } } }, "/hello/permit-all" : { @@ -121,6 +121,17 @@ }, "components" : { "schemas" : { + "AuthResult" : { + "type" : "object", + "properties" : { + "token" : { + "type" : "string" + }, + "refreshToken" : { + "type" : "string" + } + } + }, "Hello" : { "type" : "object", "properties" : { @@ -139,14 +150,6 @@ "type" : "string" } } - }, - "LoginResult" : { - "type" : "object", - "properties" : { - "token" : { - "type" : "string" - } - } } } } diff --git a/service/src/main/resources/api/openapi.yaml b/service/src/main/resources/api/openapi.yaml index b58411ae..2af9776d 100644 --- a/service/src/main/resources/api/openapi.yaml +++ b/service/src/main/resources/api/openapi.yaml @@ -14,42 +14,42 @@ tags: - name: Demo description: Quarkus and svelte demo application paths: - /api/login: - post: - tags: - - Login Resource - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Login' - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/LoginResult' - /api/me: + /api/auth/refresh: get: tags: - - Login Resource + - Auth Resource responses: "200": description: OK content: application/json: schema: - $ref: '#/components/schemas/LoginResult' + $ref: '#/components/schemas/AuthResult' "401": description: Not Authorized "403": description: Not Allowed security: - SecurityScheme: - - user + - refresh - SecurityScheme: - - user + - refresh + /api/auth/signin: + post: + tags: + - Auth Resource + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Login' + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/AuthResult' /hello/permit-all: get: tags: @@ -85,6 +85,13 @@ paths: - admin components: schemas: + AuthResult: + type: object + properties: + token: + type: string + refreshToken: + type: string Hello: type: object properties: @@ -97,8 +104,3 @@ components: type: string password: type: string - LoginResult: - type: object - properties: - token: - type: string diff --git a/service/src/main/resources/application.properties b/service/src/main/resources/application.properties index 63a1cdba..02fb72d1 100644 --- a/service/src/main/resources/application.properties +++ b/service/src/main/resources/application.properties @@ -14,3 +14,6 @@ mp.jwt.verify.issuer=https://localhost/issuer %dev.quarkus.hibernate-orm.database.generation=drop-and-create quarkus.native.resources.includes=publicKey.pem + +#DB +quarkus.datasource.db-kind=postgresql diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java similarity index 79% rename from service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java rename to service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java index cd9edd43..762e7475 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/login/LoginResourceTest.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java @@ -1,8 +1,8 @@ -package com.lopixlabs.app.fullstackdemo.login; +package com.lopixlabs.app.fullstackdemo.auth; import static io.restassured.RestAssured.given; -import com.lopixlabs.app.fullstackdemo.login.model.LoginResult; +import com.lopixlabs.app.fullstackdemo.auth.model.AuthResult; import io.quarkus.test.common.http.TestHTTPEndpoint; import io.quarkus.test.junit.QuarkusTest; import io.restassured.http.ContentType; @@ -11,8 +11,8 @@ import org.junit.jupiter.api.Test; @QuarkusTest -@TestHTTPEndpoint(LoginResource.class) -class LoginResourceTest { +@TestHTTPEndpoint(AuthResource.class) +class AuthResourceTest { @Test void shouldNotAccessAdminWhenAnonymous() { @@ -24,7 +24,7 @@ void shouldNotAccessAdminWhenAnonymous() { @Test void shouldLogin() { - final LoginResult loginResult = given() + final AuthResult loginResult = given() .when() .auth().basic("user", "pass") .accept(ContentType.JSON) @@ -32,7 +32,7 @@ void shouldLogin() { .get("/api/login") .then() .statusCode(HttpStatus.SC_OK) - .extract().body().as(LoginResult.class); + .extract().body().as(AuthResult.class); given() .when() @@ -42,7 +42,7 @@ void shouldLogin() { .post("/me") .then() .statusCode(HttpStatus.SC_OK) - .extract().body().as(LoginResult.class); + .extract().body().as(AuthResult.class); } private String getBasicAuthenticationHeader(String username, String password) { diff --git a/tools/api/.openapi-generator/FILES b/tools/api/.openapi-generator/FILES index c63cd2a2..405f38d0 100644 --- a/tools/api/.openapi-generator/FILES +++ b/tools/api/.openapi-generator/FILES @@ -1,3 +1,3 @@ +Apis/AuthResourceApi.http Apis/GreetingResourceApi.http -Apis/LoginResourceApi.http README.md diff --git a/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 b/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 index 70936897..de4a5b6b 100644 --- a/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 +++ b/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 @@ -1 +1 @@ -6129a3aba6c01d6a2caed3abfacddec6979074614b2bda9708f1ee04bb8e54a7 \ No newline at end of file +1af7d8aab950bf5156a990876f2a8b2e531a64498a566f8aefcbebf10b18858c \ No newline at end of file diff --git a/tools/api/README.md b/tools/api/README.md index d2a9083b..bbad8864 100644 --- a/tools/api/README.md +++ b/tools/api/README.md @@ -1,11 +1,11 @@ -# service API - Jetbrains API Client +# Quarkus and svelte demo application - Jetbrains API Client ## OpenAPI File description No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * API basepath : [http://localhost:8080](http://localhost:8080) -* Version : 1.0.0-SNAPSHOT +* Version : 1.0.0 ## Documentation for API Endpoints @@ -13,9 +13,10 @@ All URIs are relative to *http://localhost:8080*, but will link to the `.http` f Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- +*AuthResourceApi* | [**apiAuthRefreshGet**](Apis/AuthResourceApi.http#apiauthrefreshget) | **GET** /api/auth/refresh | +*AuthResourceApi* | [**apiAuthSigninPost**](Apis/AuthResourceApi.http#apiauthsigninpost) | **POST** /api/auth/signin | *GreetingResourceApi* | [**helloPermitAllGet**](Apis/GreetingResourceApi.http#hellopermitallget) | **GET** /hello/permit-all | *GreetingResourceApi* | [**helloRolesAllowedGet**](Apis/GreetingResourceApi.http#hellorolesallowedget) | **GET** /hello/roles-allowed | -*LoginResourceApi* | [**apiLoginPost**](Apis/LoginResourceApi.http#apiloginpost) | **POST** /api/login | diff --git a/web/package.json b/web/package.json index 717a9040..8599fd40 100644 --- a/web/package.json +++ b/web/package.json @@ -17,6 +17,7 @@ "axios": "^1.3.4", "axios-case-converter": "^1.0.1", "dayjs": "^1.11.7", + "jwt-decode": "^3.1.2", "postcss": "^8.4.14", "postcss-load-config": "^4.0.1", "radix-icons-svelte": "^1.2.1", @@ -24,10 +25,10 @@ "svelte": "^3.55.1", "svelte-check": "^2.10.3", "svelte-preprocess": "^4.10.7", + "svelte-router-spa": "^6.0.3", "tailwindcss": "^3.1.5", "tslib": "^2.5.0", "typescript": "^4.9.3", - "vite": "^4.1.4", - "svelte-router-spa": "^6.0.3" + "vite": "^4.1.4" } } diff --git a/web/src/AppLayout.svelte b/web/src/AppLayout.svelte index a22b0ef6..8cc9ed96 100644 --- a/web/src/AppLayout.svelte +++ b/web/src/AppLayout.svelte @@ -9,7 +9,7 @@ let darkTheme = false; let openMenu = false; - let userMenu = true; + let userMenu = false; let params = {} export let currentRoute @@ -51,9 +51,9 @@
- + - - - - - - + + + + + + + + + + + + + diff --git a/web/src/auth/AuthService.ts b/web/src/auth/AuthService.ts new file mode 100644 index 00000000..1837ceef --- /dev/null +++ b/web/src/auth/AuthService.ts @@ -0,0 +1,27 @@ +// store.js +import type {Login} from "../http/generated"; +import {httpClient} from "../http/HttpClient"; +import {navigateTo} from "svelte-router-spa"; +import {dashboardModule} from "../settings"; +import {authData, store} from "./AuthStore"; + +export const authService = { + doLogin: async (username: string, password: string, rememberMe: Boolean) => { + const login: Login = {username, password}; + if (rememberMe) { + store.setLogin(login); + } else { + store.clearLogin(); + } + const response = await httpClient.auth.apiAuthSigninPost(login); + if (response.status === 200) { + console.log("login ok") + authData.set(response.data); + navigateTo(dashboardModule.href); + } + }, + logout: () => { + store.clearLogin(); + navigateTo("login"); + } +} diff --git a/web/src/auth/AuthStore.ts b/web/src/auth/AuthStore.ts new file mode 100644 index 00000000..2b8c7a09 --- /dev/null +++ b/web/src/auth/AuthStore.ts @@ -0,0 +1,28 @@ +import type {AuthResult, Login} from "../http/generated"; +import {writable} from "svelte/store"; + +const userKey = 'user'; +const authKey = 'authData'; +const emptyLogin: Login = {username: null, password: null} + +export const store = { + setLogin: (value: Login) => localStorage.setItem(userKey, JSON.stringify(value)), + getLogin: (): Login => JSON.parse(localStorage.getItem(userKey)) || emptyLogin, + clearLogin: () => localStorage.removeItem(userKey), + setAuthData: (value: AuthResult) => localStorage.setItem(authKey, JSON.stringify(value)), + getAuthData: (): AuthResult => JSON.parse(localStorage.getItem(authKey)), + clearAuthData: () => localStorage.removeItem(authKey), +} + +export const login = writable(store.getLogin()) +export const authData = writable(store.getAuthData()) + +const unsubscribe = authData.subscribe(value => { + store.setAuthData(value); +}) + +export function cleanup() { + if (unsubscribe) { + unsubscribe(); + } +} diff --git a/web/src/auth/Login.svelte b/web/src/auth/Login.svelte index 30f37e17..f3311b1b 100644 --- a/web/src/auth/Login.svelte +++ b/web/src/auth/Login.svelte @@ -1,5 +1,73 @@ - +
+
+
+
+ login image +
+
+
+ + User name + + + + Password + +
+ + + Remember Me + + + + + + + +
+ + + +
+
+
+
+
diff --git a/web/src/http/HttpClient.ts b/web/src/http/HttpClient.ts index 75413e5c..255a13b3 100644 --- a/web/src/http/HttpClient.ts +++ b/web/src/http/HttpClient.ts @@ -1,13 +1,23 @@ -import {AuthResourceApi, GreetingResourceApi} from "./generated"; +import type {AuthResult} from "./generated"; +import {AuthResourceApiFactory, GreetingResourceApi} from "./generated"; import applyCaseConverter from "axios-case-converter"; import axios from "axios"; import {navigateTo} from "svelte-router-spa"; +import {loginModule} from "../settings"; +import {authData} from "../auth/AuthStore"; + +let auth: AuthResult = null; +authData.subscribe(value => { + console.log("token changed"); + auth = value; +}); const axiosInstance = applyCaseConverter( axios.create({ timeout: 10000, headers: { - "Content-Type": "application/json" + "Content-Type": "application/json", + "Authorization": "bearer ", } }) ); @@ -16,10 +26,11 @@ axiosInstance.interceptors.response.use( return response; }, (error) => { + console.log("axios error", error) if (error.response.status === 401) { console.log("redirect to login") - navigateTo("/login"); // Redirect to login page + navigateTo(loginModule.href); // Redirect to login page } return Promise.reject(error); } @@ -39,29 +50,25 @@ axiosInstance.interceptors.response.use( // } // }; - - -// axios.interceptors.request.use( -// async (config) => { -// const loginResult: LoginResult = JSON.parse(localStorage.getItem("session")); -// -// if (loginResult?.token) { -// config.headers = { -// ...config.headers, -// authorization: `Bearer ${loginResult?.token}`, -// }; -// } -// return config; -// }, -// function (error) { -// console.log(error); -// return Promise.reject(error); -// } -// ); - +axiosInstance.interceptors.request.use( + async (config) => { + if (config.url.endsWith("/auth/signin")) { + return config; + } + const token = auth?.token; + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + function (error) { + console.log(error); + return Promise.reject(error); + } +); const getFactory = (baseUrl: string) => ({ hello: new GreetingResourceApi(undefined, baseUrl, axiosInstance), - auth: new AuthResourceApi(undefined, baseUrl, axiosInstance), + auth: AuthResourceApiFactory(undefined, baseUrl, axiosInstance) // new AuthResourceApi(undefined, baseUrl, axiosInstance), }); export const httpClient = getFactory("http://localhost:8080") diff --git a/web/src/settings.ts b/web/src/settings.ts index 0cb8a985..f75c85d5 100644 --- a/web/src/settings.ts +++ b/web/src/settings.ts @@ -15,7 +15,7 @@ function add(module: Module) { } export const dashboardModule = add({name: "dashboard", href: "/dashboard", label: "Dashboard", component: DashboardPage, iconData: chart_box}); -export const loginModule = add({name: "login", href: "login", label: "Login", component: Login}); +export const loginModule = add({name: "login", href: "/login", label: "Login", component: Login}); export const emptyModule = add({name: "empty", href: "/empty", label: "Empty Page", component: EmptyPage, iconData:file_document}); export const app: App = { diff --git a/web/yarn.lock b/web/yarn.lock index 841cd0f7..76d7e700 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -1061,6 +1061,18 @@ svelte-router-spa@^6.0.3: dependencies: url-params-parser "^1.0.3" +svelte-use-form@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/svelte-use-form/-/svelte-use-form-2.6.1.tgz#bb6858ec18ba5858218dc8dc93aad8bf65d41ac2" + integrity sha512-+KSZIpel3S6JyqlIKRwDqO3I+L4AtOPkwo9kVzqsNJ8IjhhWRc1bXLSLBxCUlJa6LMbIHRLgO7CfqSVvgVlGgA== + dependencies: + svelte "^3.46.0" + +svelte@^3.46.0: + version "3.57.0" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.57.0.tgz#a3969cfe51f25f2a55e75f7b98dbd02c3af0980b" + integrity sha512-WMXEvF+RtAaclw0t3bPDTUe19pplMlfyKDsixbHQYgCWi9+O9VN0kXU1OppzrB9gPAvz4NALuoca2LfW2bOjTQ== + svelte@^3.55.1: version "3.55.1" resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.55.1.tgz#6f93b153e5248039906ce5fe196efdb9e05dfce8" From 020eec8c87706a2362a375227e67d11f8c278777 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Thu, 23 Mar 2023 23:07:21 +0000 Subject: [PATCH 16/22] jwt login --- web/src/auth/AuthService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/auth/AuthService.ts b/web/src/auth/AuthService.ts index 1837ceef..3429f43f 100644 --- a/web/src/auth/AuthService.ts +++ b/web/src/auth/AuthService.ts @@ -21,7 +21,7 @@ export const authService = { } }, logout: () => { - store.clearLogin(); + store.clearAuthData(); navigateTo("login"); } } From 594266b528116351f1e3e093191451d680bbe0a9 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Thu, 23 Mar 2023 23:39:23 +0000 Subject: [PATCH 17/22] jwt login --- web/src/auth/Login.svelte | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/web/src/auth/Login.svelte b/web/src/auth/Login.svelte index f3311b1b..87e680e6 100644 --- a/web/src/auth/Login.svelte +++ b/web/src/auth/Login.svelte @@ -1,16 +1,15 @@

Admin

-User name: {token} +User name: {result} +

+ +Refresh diff --git a/web/src/auth/AuthService.ts b/web/src/auth/AuthService.ts index 3429f43f..6e265fe8 100644 --- a/web/src/auth/AuthService.ts +++ b/web/src/auth/AuthService.ts @@ -13,7 +13,12 @@ export const authService = { } else { store.clearLogin(); } - const response = await httpClient.auth.apiAuthSigninPost(login); + const response = await httpClient.auth.apiAuthSigninPost(login, + { + headers: { + Authorization: null + } + }); if (response.status === 200) { console.log("login ok") authData.set(response.data); diff --git a/web/src/auth/Login.svelte b/web/src/auth/Login.svelte index 87e680e6..83bcb558 100644 --- a/web/src/auth/Login.svelte +++ b/web/src/auth/Login.svelte @@ -1,25 +1,16 @@ + + + + diff --git a/web/src/components/PLButton.svelte b/web/src/components/PLButton.svelte new file mode 100644 index 00000000..4c4d76b6 --- /dev/null +++ b/web/src/components/PLButton.svelte @@ -0,0 +1,3 @@ + diff --git a/web/src/components/PLInput.svelte b/web/src/components/PLInput.svelte new file mode 100644 index 00000000..0a448634 --- /dev/null +++ b/web/src/components/PLInput.svelte @@ -0,0 +1,32 @@ + + +
+ +
diff --git a/web/src/components/PLToggle.svelte b/web/src/components/PLToggle.svelte new file mode 100644 index 00000000..452af02a --- /dev/null +++ b/web/src/components/PLToggle.svelte @@ -0,0 +1,52 @@ + + +
+ +
+ +
+ +
diff --git a/web/src/http/HttpClient.ts b/web/src/http/HttpClient.ts index 255a13b3..48cafe9f 100644 --- a/web/src/http/HttpClient.ts +++ b/web/src/http/HttpClient.ts @@ -1,74 +1,103 @@ import type {AuthResult} from "./generated"; -import {AuthResourceApiFactory, GreetingResourceApi} from "./generated"; +import {AuthResourceApiFactory, GreetingResourceApiFactory} from "./generated"; import applyCaseConverter from "axios-case-converter"; import axios from "axios"; -import {navigateTo} from "svelte-router-spa"; +import {authData, store} from "../auth/AuthStore"; import {loginModule} from "../settings"; -import {authData} from "../auth/AuthStore"; +import {navigateTo} from "svelte-router-spa"; let auth: AuthResult = null; -authData.subscribe(value => { - console.log("token changed"); - auth = value; -}); +let refresh = false; const axiosInstance = applyCaseConverter( axios.create({ timeout: 10000, headers: { - "Content-Type": "application/json", - "Authorization": "bearer ", + "Content-Type": "application/json" } }) ); -axiosInstance.interceptors.response.use( - (response) => { - return response; - }, - (error) => { - - console.log("axios error", error) - if (error.response.status === 401) { - console.log("redirect to login") - navigateTo(loginModule.href); // Redirect to login page + +function setAuthData(value: AuthResult) { + console.log("token changed"); + auth = value; + axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${auth?.token}`; +} + +authData.subscribe(value => { + setAuthData(value); +}); + +const gotoLogin = () => { + console.log("redirect to login"); + navigateTo(loginModule.href); +} + +axiosInstance.interceptors.response.use(resp => resp, async error => { + if (error.response.status === 401 && !refresh) { + refresh = true; + const response = await refreshToken(); + if (response.status === 200) { + store.setAuthData(response.data); + setAuthData(response.data); + error.config.headers.Authorization = `Bearer ${response.data.token}`; + return axiosInstance(error.config); + } + } + refresh = false; + gotoLogin(); + return +}); + +const refreshToken = async () => { + try { + console.log("refreshToken") + const response = await httpClient.auth.apiAuthRefreshGet( + { + headers: { + Authorization: `Bearer ${auth?.refreshToken}` + } + } + ) + const authResult = response.data; + if (!authResult?.token) { + console.log("refreshToken failed") + store.clearAuthData(); + return response + } + console.log("refreshToken ok") + return response; + } catch (error) { + console.log("refreshToken failed", error) + store.clearAuthData(); } - return Promise.reject(error); } -); +; -// const refreshTokenFn = async () => { -// try { -// const response = await httpClient.login.apiRefreshGet(); -// const loginResult = response.data; -// if (!loginResult?.token) { -// localStorage.removeItem("session"); +// axiosInstance.interceptors.request.use(async (config) => { +// if (config.url.endsWith("/auth/signin")) { +// return config; +// } +// let token = auth?.token; +// if (config.url.endsWith("/auth/refresh")) { +// token = auth?.refreshToken; +// } +// if (token) { +// config.headers.Authorization = `Bearer ${token}`; +// } else { +// gotoLogin(); +// } +// return config; +// }, +// function (error) { +// console.log(error); +// return Promise.reject(error); // } -// localStorage.setItem("session", JSON.stringify(loginResult)); -// return loginResult; -// } catch (error) { -// localStorage.removeItem("session"); -// } -// }; +// ); -axiosInstance.interceptors.request.use( - async (config) => { - if (config.url.endsWith("/auth/signin")) { - return config; - } - const token = auth?.token; - if (token) { - config.headers.Authorization = `Bearer ${token}`; - } - return config; - }, - function (error) { - console.log(error); - return Promise.reject(error); - } -); const getFactory = (baseUrl: string) => ({ - hello: new GreetingResourceApi(undefined, baseUrl, axiosInstance), - auth: AuthResourceApiFactory(undefined, baseUrl, axiosInstance) // new AuthResourceApi(undefined, baseUrl, axiosInstance), + hello: GreetingResourceApiFactory(undefined, baseUrl, axiosInstance), + auth: AuthResourceApiFactory(undefined, baseUrl, axiosInstance) }); export const httpClient = getFactory("http://localhost:8080") diff --git a/web/yarn.lock b/web/yarn.lock index 76d7e700..0dee4658 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@babel/runtime@^7.15.4": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== + dependencies: + regenerator-runtime "^0.13.11" + "@esbuild/android-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" @@ -251,6 +258,14 @@ axios-case-converter@^1.0.1: snake-case "^3.0.3" tslib "^2.3.0" +axios-retry@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.4.0.tgz#f464dbe9408e5aa78fa319afd38bb69b533d8854" + integrity sha512-VdgaP+gHH4iQYCCNUWF2pcqeciVOdGrBBAYUfTY+wPcO5Ltvp/37MLFNCmJKo7Gj3SHvCSdL8ouI1qLYJN3liA== + dependencies: + "@babel/runtime" "^7.15.4" + is-retry-allowed "^2.2.0" + axios@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" @@ -633,6 +648,11 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + jwt-decode@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" @@ -908,6 +928,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" From 7151d2a34c2233d234e40e4832e4075f91e39828 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Tue, 28 Mar 2023 00:21:35 +0100 Subject: [PATCH 19/22] jwt login --- web/src/http/HttpClient.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/http/HttpClient.ts b/web/src/http/HttpClient.ts index 48cafe9f..897edf80 100644 --- a/web/src/http/HttpClient.ts +++ b/web/src/http/HttpClient.ts @@ -41,6 +41,7 @@ axiosInstance.interceptors.response.use(resp => resp, async error => { store.setAuthData(response.data); setAuthData(response.data); error.config.headers.Authorization = `Bearer ${response.data.token}`; + refresh = false; return axiosInstance(error.config); } } From d97c4f5b39f1ab8f01868804a4bfaad94ed2fae6 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 10 Apr 2023 22:01:45 +0100 Subject: [PATCH 20/22] docker --- .dockerignore | 5 - Dockerfile | 15 + Makefile | 11 +- .../openapi.yaml-asciidoc.sha256 | 2 +- doc/src/main/asciidoc/openapi/index.adoc | 2 +- docker-compose.yml | 32 ++ entrypoint.sh | 6 + .../commom/NotFoundExceptionMapper.java | 23 ++ .../src/main/resources/application.properties | 10 + .../openapi.yaml-jetbrains-http-client.sha256 | 2 +- web/.env.development | 1 + web/package.json | 2 +- web/src/http/HttpClient.ts | 13 +- .../openapi.yaml-axios.sha256 | 2 +- web/yarn.lock | 333 +++++++++--------- 15 files changed, 272 insertions(+), 187 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100755 entrypoint.sh create mode 100644 service/src/main/java/com/lopixlabs/app/fullstackdemo/commom/NotFoundExceptionMapper.java create mode 100644 web/.env.development diff --git a/.dockerignore b/.dockerignore index f3d88a8b..e69de29b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +0,0 @@ -* -!target/*-runner -!target/*-runner.jar -!target/lib/* -!target/quarkus-app/* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..4c5d2036 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM eclipse-temurin:17-jdk + +ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' +WORKDIR /app + +COPY entrypoint.sh ./ +COPY --chown=185 service/target/quarkus-app/lib /app/lib +COPY --chown=185 service/target/quarkus-app/app /app/app +COPY --chown=185 service/target/quarkus-app/quarkus /app/quarkus +COPY --chown=185 service/target/quarkus-app/quarkus-run.jar /app/app.jar + +EXPOSE 8080 +USER 185 + +CMD ["/app/entrypoint.sh"] diff --git a/Makefile b/Makefile index aa003851..c0c94631 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,9 @@ .EXPORT_ALL_VARIABLES: PROJECT_VERSION=0.0.0-SNAPSHOT +dev-dependencies: + docker compose up -d database + build-all: build-openapi mvn package -Pprod @@ -13,8 +16,10 @@ build: build-openapi: mvn package -Popen-api -DskipTests -DskipChecks -am -pl "service" +build-all:build-openapi web-build build-fast dev-dependencies + run: - java -jar service/target/quarkus-app/quarkus-run.jar + docker compose up -d service --build dev-service: mvn compile quarkus:dev -am -pl "service" @@ -24,8 +29,8 @@ dev:dev-service web-build: mvn clean package -pl web -DskipTests -web-dev: - yarn start --prefix ./web +dev-web: + yarn --cwd ./web dev generate-jwt: mvn exec:java -pl "service" -Dexec.mainClass=com.lopixlabs.app.fullstackdemo.GenerateToken -Dexec.classpathScope=test -Dsmallrye.jwt.sign.key.location=privateKey.pem diff --git a/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 b/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 index de4a5b6b..23e927b9 100644 --- a/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 +++ b/doc/src/main/asciidoc/openapi/.openapi-generator/openapi.yaml-asciidoc.sha256 @@ -1 +1 @@ -1af7d8aab950bf5156a990876f2a8b2e531a64498a566f8aefcbebf10b18858c \ No newline at end of file +6d5f8a8d60ea444cdfd2e044ca2a9febf4859bda239197eb81d54290bcfc9a2e \ No newline at end of file diff --git a/doc/src/main/asciidoc/openapi/index.adoc b/doc/src/main/asciidoc/openapi/index.adoc index 28ce761b..f4b25d0d 100644 --- a/doc/src/main/asciidoc/openapi/index.adoc +++ b/doc/src/main/asciidoc/openapi/index.adoc @@ -293,7 +293,7 @@ endif::internal-generation[] ===== Content Type -* text/plain +* application/json ===== Responses diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..9fd36757 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +version: '3' + + + +services: + service: + build: + context: . + dockerfile: Dockerfile + image: fullstackdemo + restart: on-failure + ports: + - "8081:8080" + environment: + - QUARKUS_DATASOURCE_USERNAME=user + - QUARKUS_DATASOURCE_PASSWORD=password + - QUARKUS_DATASOURCE_JDBC_URL=jdbc:postgresql://database:5432/db + depends_on: + - database + + database: + image: postgres:14.7 + hostname: database + restart: always + ports: + - "5432:5432" + environment: + - ALLOW_IP_RANGE='0.0.0.0/0' + - POSTGRES_DB=db + - POSTGRES_USER=user + - POSTGRES_PASSWORD=password + diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 00000000..61d5ce3f --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +exec java $JVM_ARGS -jar /app/app.jar + diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/commom/NotFoundExceptionMapper.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/commom/NotFoundExceptionMapper.java new file mode 100644 index 00000000..142ac36d --- /dev/null +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/commom/NotFoundExceptionMapper.java @@ -0,0 +1,23 @@ +package com.lopixlabs.app.fullstackdemo.commom; + +import static org.jboss.resteasy.reactive.RestResponse.StatusCode.NOT_FOUND; + +import java.io.InputStream; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +@Provider +public class NotFoundExceptionMapper implements ExceptionMapper { + @Override + @Produces(MediaType.TEXT_HTML) + public Response toResponse(NotFoundException exception) { + InputStream resource = ClassLoader.getSystemResourceAsStream("META-INF/resources/index.html"); + return null == resource + ? Response.status(NOT_FOUND).build() + : Response.ok().entity(resource).build(); + } +} diff --git a/service/src/main/resources/application.properties b/service/src/main/resources/application.properties index 5118dc8b..0fdb9901 100644 --- a/service/src/main/resources/application.properties +++ b/service/src/main/resources/application.properties @@ -17,3 +17,13 @@ quarkus.native.resources.includes=publicKey.pem %dev.jwt.expires=1 #DB quarkus.datasource.db-kind=postgresql +quarkus.hibernate-orm.database.globally-quoted-identifiers=true +quarkus.hibernate-orm.metrics.enabled=true +quarkus.hibernate-orm.jdbc.timezone=UTC +quarkus.hibernate-orm.statistics=true +quarkus.hibernate-orm.log-session-metrics=true +quarkus.datasource.username=user +quarkus.datasource.password=password +quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/db +quarkus.hibernate-orm.log.sql=true + diff --git a/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 b/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 index de4a5b6b..23e927b9 100644 --- a/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 +++ b/tools/api/.openapi-generator/openapi.yaml-jetbrains-http-client.sha256 @@ -1 +1 @@ -1af7d8aab950bf5156a990876f2a8b2e531a64498a566f8aefcbebf10b18858c \ No newline at end of file +6d5f8a8d60ea444cdfd2e044ca2a9febf4859bda239197eb81d54290bcfc9a2e \ No newline at end of file diff --git a/web/.env.development b/web/.env.development new file mode 100644 index 00000000..f7566fdd --- /dev/null +++ b/web/.env.development @@ -0,0 +1 @@ +VITE_BASE_URL=http://localhost:8080 diff --git a/web/package.json b/web/package.json index 6cec3702..67471564 100644 --- a/web/package.json +++ b/web/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite", + "dev": "vite --mode development", "build": "vite build", "preview": "vite preview", "check": "svelte-check --tsconfig ./tsconfig.json" diff --git a/web/src/http/HttpClient.ts b/web/src/http/HttpClient.ts index 897edf80..cefbfec5 100644 --- a/web/src/http/HttpClient.ts +++ b/web/src/http/HttpClient.ts @@ -96,10 +96,13 @@ const refreshToken = async () => { // } // ); -const getFactory = (baseUrl: string) => ({ - hello: GreetingResourceApiFactory(undefined, baseUrl, axiosInstance), - auth: AuthResourceApiFactory(undefined, baseUrl, axiosInstance) -}); +const getFactory = (baseUrl: string) => { + console.log("base url: " + baseUrl); + return { + hello: GreetingResourceApiFactory(undefined, baseUrl, axiosInstance), + auth: AuthResourceApiFactory(undefined, baseUrl, axiosInstance) + } +}; -export const httpClient = getFactory("http://localhost:8080") +export const httpClient = getFactory(import.meta.env.VITE_BASE_URL) diff --git a/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 b/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 index de4a5b6b..23e927b9 100644 --- a/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 +++ b/web/src/http/generated/.openapi-generator/openapi.yaml-axios.sha256 @@ -1 +1 @@ -1af7d8aab950bf5156a990876f2a8b2e531a64498a566f8aefcbebf10b18858c \ No newline at end of file +6d5f8a8d60ea444cdfd2e044ca2a9febf4859bda239197eb81d54290bcfc9a2e \ No newline at end of file diff --git a/web/yarn.lock b/web/yarn.lock index 0dee4658..e6a28c76 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -4,7 +4,7 @@ "@babel/runtime@^7.15.4": version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" @@ -26,7 +26,7 @@ "@esbuild/darwin-arm64@0.16.17": version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz" integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== "@esbuild/darwin-x64@0.16.17": @@ -121,17 +121,17 @@ "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.13": version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" @@ -139,7 +139,7 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -147,12 +147,12 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -160,12 +160,12 @@ "@popperjs/core@^2.9.0": version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== "@sveltejs/vite-plugin-svelte@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.3.tgz#3d276eab341638dd58691a3de610774e155a7578" + resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.0.3.tgz" integrity sha512-o+cguBFdwIGtRbNkYOyqTM7KvRUffxh5bfK4oJsWKG2obu+v/cbpT03tJrGl58C7tRXo/aEC0/axN5FVHBj0nA== dependencies: debug "^4.3.4" @@ -177,31 +177,31 @@ "@tailwindcss/forms@^0.5.3": version "0.5.3" - resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.3.tgz#e4d7989686cbcaf416c53f1523df5225332a86e7" + resolved "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz" integrity sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q== dependencies: mini-svg-data-uri "^1.2.3" "@tsconfig/svelte@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-3.0.0.tgz#b06e059209f04c414de0069f2f0e2796d979fc6f" + resolved "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz" integrity sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg== "@types/pug@^2.0.4": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" + resolved "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz" integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== "@types/sass@^1.16.0": version "1.45.0" - resolved "https://registry.yarnpkg.com/@types/sass/-/sass-1.45.0.tgz#a949eb1e080ff34715e6c2040357b940bffb89bb" + resolved "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz" integrity sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA== dependencies: sass "*" acorn-node@^1.8.2: version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== dependencies: acorn "^7.0.0" @@ -210,17 +210,17 @@ acorn-node@^1.8.2: acorn-walk@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn@^7.0.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -228,17 +228,17 @@ anymatch@~3.1.2: arg@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== autoprefixer@^10.4.7: version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== dependencies: browserslist "^4.21.4" @@ -250,7 +250,7 @@ autoprefixer@^10.4.7: axios-case-converter@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/axios-case-converter/-/axios-case-converter-1.0.1.tgz#e9c6fee32b37bad84051e080feb9711593a60a0c" + resolved "https://registry.npmjs.org/axios-case-converter/-/axios-case-converter-1.0.1.tgz" integrity sha512-Mk6JK13OwYd0pmWHtF2Kn3awIObRGvxdCjZwMOElrBk1DoyOjVHLdSthD6eSbNwPzxnhV4W2Fa7283iozqD1wQ== dependencies: camel-case "^4.1.1" @@ -260,7 +260,7 @@ axios-case-converter@^1.0.1: axios-retry@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.4.0.tgz#f464dbe9408e5aa78fa319afd38bb69b533d8854" + resolved "https://registry.npmjs.org/axios-retry/-/axios-retry-3.4.0.tgz" integrity sha512-VdgaP+gHH4iQYCCNUWF2pcqeciVOdGrBBAYUfTY+wPcO5Ltvp/37MLFNCmJKo7Gj3SHvCSdL8ouI1qLYJN3liA== dependencies: "@babel/runtime" "^7.15.4" @@ -268,7 +268,7 @@ axios-retry@^3.4.0: axios@^1.3.4: version "1.3.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz" integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== dependencies: follow-redirects "^1.15.0" @@ -277,17 +277,17 @@ axios@^1.3.4: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -295,14 +295,14 @@ brace-expansion@^1.1.7: braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browserslist@^4.21.4: version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: caniuse-lite "^1.0.30001449" @@ -312,17 +312,17 @@ browserslist@^4.21.4: buffer-crc32@^0.2.5: version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camel-case@^4.1.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: pascal-case "^3.1.2" @@ -330,17 +330,17 @@ camel-case@^4.1.1: camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: version "1.0.30001460" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz#31d2e26f0a2309860ed3eff154e03890d9d851a7" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz" integrity sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ== capital-case@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz" integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== dependencies: no-case "^3.0.4" @@ -349,7 +349,7 @@ capital-case@^1.0.4: "chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -364,61 +364,61 @@ capital-case@^1.0.4: color-name@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== dayjs@^1.11.7: version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" deepmerge@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz" integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== defined@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== detect-indent@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detective@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" + resolved "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== dependencies: acorn-node "^1.8.2" @@ -427,17 +427,17 @@ detective@^5.2.1: didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -445,17 +445,17 @@ dot-case@^3.0.4: electron-to-chromium@^1.4.284: version "1.4.317" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.317.tgz#9a3d38a1a37f26a417d3d95dafe198ff11ed072b" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.317.tgz" integrity sha512-JhCRm9v30FMNzQSsjl4kXaygU+qHBD0Yh7mKxyjmF0V8VwYVB6qpBRX28GyAucrM9wDCpSUctT6FpMUQxbyKuA== es6-promise@^3.1.2: version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== esbuild@^0.16.14: version "0.16.17" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz" integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== optionalDependencies: "@esbuild/android-arm" "0.16.17" @@ -483,12 +483,12 @@ esbuild@^0.16.14: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== fast-glob@^3.2.12, fast-glob@^3.2.7: version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -499,26 +499,26 @@ fast-glob@^3.2.12, fast-glob@^3.2.7: fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" follow-redirects@^1.15.0: version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -527,41 +527,41 @@ form-data@^4.0.0: fraction.js@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -573,19 +573,19 @@ glob@^7.1.3: graceful-fs@^4.1.3: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" header-case@^2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== dependencies: capital-case "^1.0.4" @@ -593,12 +593,12 @@ header-case@^2.0.3: immutable@^4.0.0: version "4.2.4" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz" integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -606,7 +606,7 @@ import-fresh@^3.2.1: inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -614,89 +614,89 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-retry-allowed@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" + resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz" integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== jwt-decode@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== kleur@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== lilconfig@^2.0.5, lilconfig@^2.0.6: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" magic-string@^0.25.7: version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: sourcemap-codec "^1.4.8" magic-string@^0.29.0: version "0.29.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.29.0.tgz#f034f79f8c43dba4ae1730ffb5e8c4e084b16cf3" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz" integrity sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q== dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -704,63 +704,63 @@ micromatch@^4.0.4, micromatch@^4.0.5: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-svg-data-uri@^1.2.3: version "1.4.4" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nanoid@^3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" @@ -768,41 +768,41 @@ no-case@^3.0.4: node-releases@^2.0.8: version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" pascal-case@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: no-case "^3.0.4" @@ -810,32 +810,32 @@ pascal-case@^3.1.2: path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== postcss-import@^14.1.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== dependencies: postcss-value-parser "^4.0.0" @@ -844,14 +844,14 @@ postcss-import@^14.1.0: postcss-js@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^3.1.4: version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== dependencies: lilconfig "^2.0.5" @@ -859,7 +859,7 @@ postcss-load-config@^3.1.4: postcss-load-config@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== dependencies: lilconfig "^2.0.5" @@ -867,14 +867,14 @@ postcss-load-config@^4.0.1: postcss-nested@6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== dependencies: postcss-selector-parser "^6.0.10" postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11: version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== dependencies: cssesc "^3.0.0" @@ -882,12 +882,12 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.0.9, postcss@^8.4.14, postcss@^8.4.21: version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: nanoid "^3.3.4" @@ -896,51 +896,51 @@ postcss@^8.0.9, postcss@^8.4.14, postcss@^8.4.21: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== radix-icons-svelte@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/radix-icons-svelte/-/radix-icons-svelte-1.2.1.tgz#532706b0cd838cb8a832b1d7098d06c7f7ab534f" + resolved "https://registry.npmjs.org/radix-icons-svelte/-/radix-icons-svelte-1.2.1.tgz" integrity sha512-svmiMd0ocpdTm9cvAz0klcZpnh639lVctj6psQiawd4pYalVzOG4cX+JizAgRckyTAsRVdzObP7D2EBrSfdghA== read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" regenerator-runtime@^0.13.11: version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.1.7, resolve@^1.22.1: version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -949,40 +949,40 @@ resolve@^1.1.7, resolve@^1.22.1: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.5.2: version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rollup@^3.10.0: version "3.18.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.18.0.tgz#2354ba63ba66d6a09c652c3ea0dbcd9dad72bbde" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz" integrity sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg== optionalDependencies: fsevents "~2.3.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" sade@^1.7.4: version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" sander@^0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + resolved "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz" integrity sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA== dependencies: es6-promise "^3.1.2" @@ -992,7 +992,7 @@ sander@^0.5.0: sass@*: version "1.58.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d" + resolved "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz" integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== dependencies: chokidar ">=3.0.0 <4.0.0" @@ -1001,7 +1001,7 @@ sass@*: snake-case@^3.0.3: version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== dependencies: dot-case "^3.0.4" @@ -1009,7 +1009,7 @@ snake-case@^3.0.3: sorcery@^0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" + resolved "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz" integrity sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g== dependencies: buffer-crc32 "^0.2.5" @@ -1019,24 +1019,24 @@ sorcery@^0.10.0: "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.8: version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" stwui@^0.0.36-next: version "0.0.36-next" - resolved "https://registry.yarnpkg.com/stwui/-/stwui-0.0.36-next.tgz#31344ac53ddccef86d3b682a3be2f49418f24432" + resolved "https://registry.npmjs.org/stwui/-/stwui-0.0.36-next.tgz" integrity sha512-OtvHtErRcjsSZqX3qm7QD6EqGoQPgBS20XQxRZFNVvxjYMAYvkNDLtbaEFwjyEozN/Ydp3JN2cyGfmc146gioA== dependencies: dayjs "^1.11.7" @@ -1045,12 +1045,12 @@ stwui@^0.0.36-next: supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svelte-check@^2.10.3: version "2.10.3" - resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-2.10.3.tgz#c16426c47630e024bf3cd5fab9b8c4f1702db34a" + resolved "https://registry.npmjs.org/svelte-check/-/svelte-check-2.10.3.tgz" integrity sha512-Nt1aWHTOKFReBpmJ1vPug0aGysqPwJh2seM1OvICfM2oeyaA62mOiy5EvkXhltGfhCcIQcq2LoE0l1CwcWPjlw== dependencies: "@jridgewell/trace-mapping" "^0.3.9" @@ -1064,12 +1064,12 @@ svelte-check@^2.10.3: svelte-hmr@^0.15.1: version "0.15.1" - resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.15.1.tgz#d11d878a0bbb12ec1cba030f580cd2049f4ec86b" + resolved "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz" integrity sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA== svelte-preprocess@^4.0.0, svelte-preprocess@^4.10.7: version "4.10.7" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz#3626de472f51ffe20c9bc71eff5a3da66797c362" + resolved "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.10.7.tgz" integrity sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw== dependencies: "@types/pug" "^2.0.4" @@ -1081,36 +1081,31 @@ svelte-preprocess@^4.0.0, svelte-preprocess@^4.10.7: svelte-router-spa@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/svelte-router-spa/-/svelte-router-spa-6.0.3.tgz#2f769f4b124ac5995dcdfd43b4e887b44ad6cb5a" + resolved "https://registry.npmjs.org/svelte-router-spa/-/svelte-router-spa-6.0.3.tgz" integrity sha512-aHgyUVVI/WjipQNmKcXpX0hFZtkW5Y6hwH5aXLr2P/aRQ/qlX8ZbKQJUwKjOD59p7tt/c+wqokiIt68N7aNuKQ== dependencies: url-params-parser "^1.0.3" svelte-use-form@^2.6.1: version "2.6.1" - resolved "https://registry.yarnpkg.com/svelte-use-form/-/svelte-use-form-2.6.1.tgz#bb6858ec18ba5858218dc8dc93aad8bf65d41ac2" + resolved "https://registry.npmjs.org/svelte-use-form/-/svelte-use-form-2.6.1.tgz" integrity sha512-+KSZIpel3S6JyqlIKRwDqO3I+L4AtOPkwo9kVzqsNJ8IjhhWRc1bXLSLBxCUlJa6LMbIHRLgO7CfqSVvgVlGgA== dependencies: svelte "^3.46.0" -svelte@^3.46.0: - version "3.57.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.57.0.tgz#a3969cfe51f25f2a55e75f7b98dbd02c3af0980b" - integrity sha512-WMXEvF+RtAaclw0t3bPDTUe19pplMlfyKDsixbHQYgCWi9+O9VN0kXU1OppzrB9gPAvz4NALuoca2LfW2bOjTQ== - -svelte@^3.55.1: +svelte@^3.46.0, svelte@^3.55.1: version "3.55.1" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.55.1.tgz#6f93b153e5248039906ce5fe196efdb9e05dfce8" + resolved "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz" integrity sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ== tailwind-merge@^1.9.1: version "1.10.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-1.10.0.tgz#535541c7373d8a31afa81a4267e2ab9b4afa9429" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.10.0.tgz" integrity sha512-WFnDXSS4kFTZwjKg5/oZSGzBRU/l+qcbv5NVTzLUQvJ9yovDAP05h0F2+ZFW0Lw9EcgRoc2AfURUdZvnEFrXKg== tailwindcss@^3.1.5: version "3.2.7" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.7.tgz#5936dd08c250b05180f0944500c01dce19188c07" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz" integrity sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ== dependencies: arg "^5.0.2" @@ -1139,31 +1134,31 @@ tailwindcss@^3.1.5: tippy.js@^6.3.7: version "6.3.7" - resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" + resolved "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz" integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== dependencies: "@popperjs/core" "^2.9.0" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tslib@^2.0.3, tslib@^2.3.0, tslib@^2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== typescript@*, typescript@^4.9.3: version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== update-browserslist-db@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" @@ -1171,24 +1166,24 @@ update-browserslist-db@^1.0.10: upper-case-first@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz" integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== dependencies: tslib "^2.0.3" url-params-parser@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/url-params-parser/-/url-params-parser-1.0.4.tgz#10003b232e9cd13e2ba2374a1abc6e1aa8ff1b67" + resolved "https://registry.npmjs.org/url-params-parser/-/url-params-parser-1.0.4.tgz" integrity sha512-0m6BqGpY2OetTZ3UPTLKkbTfUHigsX2YhrzORT9iYiyUJ/SP2WJ3cggg2YWtvMs36GPwK9Q44ffddyarniu2Tg== util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== vite@^4.1.4: version "4.1.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" + resolved "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz" integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== dependencies: esbuild "^0.16.14" @@ -1200,25 +1195,25 @@ vite@^4.1.4: vitefu@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.4.tgz#212dc1a9d0254afe65e579351bed4e25d81e0b35" + resolved "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz" integrity sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g== wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== xtend@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== yaml@^1.10.2: version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.1.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz" integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== From ac53f7f04ee82f06baf7db7695e96bb34a250b07 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 10 Apr 2023 22:15:09 +0100 Subject: [PATCH 21/22] tests --- pom.xml | 4 +-- .../app/fullstackdemo/auth/AuthResource.java | 4 +-- .../fullstackdemo/auth/AuthResourceTest.java | 29 +++++-------------- .../hello/NativeGreetingResourceIT.java | 9 ------ 4 files changed, 11 insertions(+), 35 deletions(-) delete mode 100644 service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/NativeGreetingResourceIT.java diff --git a/pom.xml b/pom.xml index 1cf169ff..53f66881 100644 --- a/pom.xml +++ b/pom.xml @@ -10,12 +10,12 @@ 3.11.0 false - 11 + 17 UTF-8 UTF-8 quarkus-bom io.quarkus.platform - 2.16.4.Final + 2.16.6.Final 3.0.0-M9 1.18.26 6.4.0 diff --git a/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java index c545c8ad..d387e1c8 100644 --- a/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java +++ b/service/src/main/java/com/lopixlabs/app/fullstackdemo/auth/AuthResource.java @@ -31,14 +31,14 @@ public AuthResource(final AuthService authService, final JsonWebToken jwt) { } @POST - @Path("/signin") + @Path("signin") @PermitAll public AuthResult login(final Login login) { return authService.login(login); } @GET - @Path("/refresh") + @Path("refresh") @RolesAllowed(REFRESH) public AuthResult refresh() { return authService.refresh(jwt); diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java index 762e7475..64fdbd68 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java @@ -14,39 +14,24 @@ @TestHTTPEndpoint(AuthResource.class) class AuthResourceTest { - @Test - void shouldNotAccessAdminWhenAnonymous() { - given(). - get("/api/me") - .then() - .statusCode(HttpStatus.SC_UNAUTHORIZED); - } @Test void shouldLogin() { final AuthResult loginResult = given() .when() - .auth().basic("user", "pass") + .body(""" + { + "username": "user", + "password": "password" + } + """) .accept(ContentType.JSON) .contentType(ContentType.JSON) - .get("/api/login") + .post("/api/auth/signin") .then() .statusCode(HttpStatus.SC_OK) .extract().body().as(AuthResult.class); - given() - .when() - .auth().oauth2(loginResult.getToken()) - .accept(ContentType.JSON) - .contentType(ContentType.JSON) - .post("/me") - .then() - .statusCode(HttpStatus.SC_OK) - .extract().body().as(AuthResult.class); } - private String getBasicAuthenticationHeader(String username, String password) { - String valueToEncode = username + ":" + password; - return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes()); - } } diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/NativeGreetingResourceIT.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/NativeGreetingResourceIT.java deleted file mode 100644 index 887a28ab..00000000 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/hello/NativeGreetingResourceIT.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.lopixlabs.app.fullstackdemo.hello; - -import io.quarkus.test.junit.NativeImageTest; - -@NativeImageTest -class NativeGreetingResourceIT extends GreetingResourceTest { - - // Execute the same tests but in native mode. -} From c13dc447068bf90a9e38f423d26b120a2755bfc9 Mon Sep 17 00:00:00 2001 From: Pedro Lopes Date: Mon, 10 Apr 2023 22:16:21 +0100 Subject: [PATCH 22/22] tests --- .../com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java b/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java index 64fdbd68..571f1f28 100644 --- a/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java +++ b/service/src/test/java/com/lopixlabs/app/fullstackdemo/auth/AuthResourceTest.java @@ -11,10 +11,8 @@ import org.junit.jupiter.api.Test; @QuarkusTest -@TestHTTPEndpoint(AuthResource.class) class AuthResourceTest { - @Test void shouldLogin() { final AuthResult loginResult = given()