this repo has no description
lustre frontent oat-ui gleam
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

:boom: remove all modules other than client

+22 -317
+5 -16
.dockerignore
··· 15 15 .sqruff 16 16 17 17 # client 18 - client/build 19 - client/dev 20 - cliend/test 21 - client/justfile 18 + /build 19 + /dist 20 + /dev 21 + /test 22 + justfile 22 23 23 - # server 24 - server/build 25 - server/dev 26 - server/test 27 - server/justfile 28 - server/priv/static/ 29 - 30 - # shared 31 - shared/build 32 - shared/dev 33 - shared/test 34 - shared/justfile
client/.gitignore .gitignore
+1 -3
client/gleam.toml gleam.toml
··· 10 10 lustre = ">= 5.6.0 and < 6.0.0" 11 11 modem = ">= 2.1.2 and < 3.0.0" 12 12 rsvp = ">= 1.2.0 and < 2.0.0" 13 - shared = { path = "../shared" } 14 13 youid = ">= 1.6.0 and < 2.0.0" 15 14 16 15 [dev_dependencies] ··· 19 18 20 19 [tools.lustre.build] 21 20 minify = true 22 - no_html = true 23 - outdir = "../server/priv/static" 21 + outdir = "dist" 24 22 25 23 [tools.lustre.bin] 26 24 timeout = 240
-6
client/justfile
··· 1 - @_default: 2 - just --list 3 - 4 - # Build CSS and JS runtime 5 - build: 6 - gleam run -m lustre/dev build
-2
client/manifest.toml manifest.toml
··· 38 38 { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, 39 39 { name = "polly", version = "3.1.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_erlang", "gleam_otp", "gleam_stdlib", "simplifile"], otp_app = "polly", source = "hex", outer_checksum = "51FB565D81FF6212FDF3306D44419601F2A7C4EDD1F00FC9DA5C376A00AED4FE" }, 40 40 { name = "rsvp", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_fetch", "gleam_http", "gleam_httpc", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "rsvp", source = "hex", outer_checksum = "40F9E0E662FF258E10C7041A9591261FE802D56625FB444B91510969644F7722" }, 41 - { name = "shared", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "youid"], source = "local", path = "../shared" }, 42 41 { name = "simplifile", version = "2.4.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "7C18AFA4FED0B4CE1FA5B0B4BAC1FA1744427054EA993565F6F3F82E5453170D" }, 43 42 { name = "snag", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "274F41D6C3ECF99F7686FDCE54183333E41D2C1CA5A3A673F9A8B2C7A4401077" }, 44 43 { name = "tom", version = "2.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_time"], otp_app = "tom", source = "hex", outer_checksum = "234A842F3D087D35737483F5DFB6DE9839E3366EF0CAF8726D2D094210227670" }, ··· 56 55 lustre_dev_tools = { version = ">= 2.3.6 and < 3.0.0" } 57 56 modem = { version = ">= 2.1.2 and < 3.0.0" } 58 57 rsvp = { version = ">= 1.2.0 and < 2.0.0" } 59 - shared = { path = "../shared" } 60 58 youid = { version = ">= 1.6.0 and < 2.0.0" }
client/src/client.css src/client.css
+2 -2
client/src/client.gleam src/client.gleam
··· 4 4 import client/page/navbar 5 5 import client/page/not_found 6 6 import client/page/sidebar 7 + import client/route 8 + import client/session 7 9 import gleam/bool 8 10 import gleam/http/response 9 11 import gleam/option ··· 12 14 import lustre/element 13 15 import modem 14 16 import rsvp 15 - import shared/route 16 - import shared/session 17 17 18 18 pub type Model { 19 19 Model(
+1 -1
client/src/client/page.gleam src/client/page.gleam
··· 1 1 import client/page/login 2 - import shared/route 2 + import client/route 3 3 4 4 pub type Page { 5 5 Home
+1 -1
client/src/client/page/home.gleam src/client/page/home.gleam
··· 1 1 import lustre/effect 2 2 import lustre/element 3 - import shared/session 3 + import client/session 4 4 5 5 pub type Model { 6 6 Model
+1 -1
client/src/client/page/login.gleam src/client/page/login.gleam
··· 3 3 import lustre/element 4 4 import lustre/element/html 5 5 import rsvp 6 - import shared/session 6 + import client/session 7 7 8 8 pub type Model { 9 9 Model(
+1 -1
client/src/client/page/navbar.gleam src/client/page/navbar.gleam
··· 1 1 import lustre/attribute 2 2 import lustre/element 3 3 import lustre/element/html 4 - import shared/session 4 + import client/session 5 5 6 6 pub type Msg 7 7
client/src/client/page/not_found.gleam src/client/page/not_found.gleam
+1 -1
client/src/client/page/sidebar.gleam src/client/page/sidebar.gleam
··· 1 1 import lustre/attribute 2 2 import lustre/element 3 3 import lustre/element/html 4 - import shared/session 4 + import client/session 5 5 6 6 pub type Msg 7 7
client/test/client_test.gleam test/client_test.gleam
+1 -1
client/test/dummy.gleam test/dummy.gleam
··· 1 - import shared/user.{type User, User} 1 + import client/user.{type User, User} 2 2 import youid/uuid 3 3 4 4 pub fn user() -> User {
+1 -1
client/test/page/login_test.gleam test/page/login_test.gleam
··· 3 3 import gleam/list 4 4 import lustre/effect 5 5 import rsvp 6 - import shared/session 6 + import client/session 7 7 8 8 pub fn submit_test() { 9 9 let user_email = "bfd@email.dev"
+5 -29
justfile
··· 1 - mod client 2 - mod server 3 - mod shared 4 - 5 - set quiet 6 - pod_name := "bfd-pod" 7 - 8 - # List available recipes 9 - _default: 10 - just --list 11 - 12 - # Build project abd start server 13 - dev: 14 - just client::build 15 - just server::run 16 - 17 - create-pod: 18 - podman pod exists {{ pod_name }} \ 19 - || podman pod create --name {{ pod_name }} -p 8000:8000 1 + @_default: 2 + just --list 20 3 21 - # Build and run app container 22 - up: create-pod 23 - just server::build-container 24 - just server::run-container {{ pod_name }} 25 - 26 - # Remove container 27 - down: 28 - podman pod exists {{ pod_name }} || (echo "Pod does not exist" && exit 1) 29 - podman pod stop {{ pod_name }} 30 - podman pod rm {{ pod_name }} 4 + # Build CSS and JS runtime 5 + build: 6 + gleam run -m lustre/dev build
-6
server/.gitignore
··· 1 - *.beam 2 - *.ez 3 - /build 4 - erl_crash.dump 5 - 6 - priv/static/*
-27
server/gleam.toml
··· 1 - name = "server" 2 - version = "1.0.0" 3 - 4 - # Fill out these fields if you intend to generate HTML documentation or publish 5 - # your project to the Hex package manager. 6 - # 7 - # description = "" 8 - # licences = ["Apache-2.0"] 9 - # repository = { type = "github", user = "", repo = "" } 10 - # links = [{ title = "Website", href = "" }] 11 - # 12 - # For a full reference of all the available options, you can have a look at 13 - # https://gleam.run/writing-gleam/gleam-toml/. 14 - 15 - [dependencies] 16 - gleam_stdlib = ">= 0.44.0 and < 2.0.0" 17 - lustre = ">= 5.6.0 and < 6.0.0" 18 - wisp = ">= 2.2.2 and < 3.0.0" 19 - mist = ">= 6.0.3 and < 7.0.0" 20 - gleam_otp = ">= 1.2.0 and < 2.0.0" 21 - gleam_erlang = ">= 1.3.0 and < 2.0.0" 22 - filepath = ">= 1.1.2 and < 2.0.0" 23 - envoy = ">= 1.2.0 and < 2.0.0" 24 - youid = ">= 1.6.0 and < 2.0.0" 25 - 26 - [dev_dependencies] 27 - gleeunit = ">= 1.0.0 and < 2.0.0"
-21
server/justfile
··· 1 - @_default: 2 - just --list 3 - 4 - container_name := "bfd-app" 5 - 6 - #  Start HTTP server 7 - run: 8 - gleam run 9 - 10 - # Build container 11 - [no-cd] 12 - build-container: 13 - podman build -t {{ container_name }} . 14 - 15 - # Run server container 16 - run-container pod_name: 17 - podman run -d \ 18 - --pod {{ pod_name }} \ 19 - --name {{ container_name }} \ 20 - -e SECRET_KEY -e API_URL \ 21 - {{ container_name }}
-41
server/manifest.toml
··· 1 - # This file was generated by Gleam 2 - # You typically do not need to edit this file 3 - 4 - packages = [ 5 - { name = "directories", version = "1.2.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "D13090CFCDF6759B87217E8DDD73A75903A700148A82C1D33799F333E249BF9E" }, 6 - { name = "envoy", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "9C6FBB6BFA02A52798BEEC5977A738CAD6E4A057F4B67FD0C8061AD2502C191A" }, 7 - { name = "exception", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "329D269D5C2A314F7364BD2711372B6F2C58FA6F39981572E5CA68624D291F8C" }, 8 - { name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "B06A9AF0BF10E51401D64B98E4B627F1D2E48C154967DA7AF4D0914780A6D40A" }, 9 - { name = "gleam_crypto", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "2DE9E4EF53CF6FEE049D4F765731F7178F7A11AEFAE00EEE63BF7536B354AD3F" }, 10 - { name = "gleam_erlang", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "1124AD3AA21143E5AF0FC5CF3D9529F6DB8CA03E43A55711B60B6B7B3874375C" }, 11 - { name = "gleam_http", version = "4.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "82EA6A717C842456188C190AFB372665EA56CE13D8559BF3B1DD9E40F619EE0C" }, 12 - { name = "gleam_json", version = "3.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "44FDAA8847BE8FC48CA7A1C089706BD54BADCC4C45B237A992EDDF9F2CDB2836" }, 13 - { name = "gleam_otp", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "BA6A294E295E428EC1562DC1C11EA7530DCB981E8359134BEABC8493B7B2258E" }, 14 - { name = "gleam_stdlib", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "960090C2FB391784BB34267B099DC9315CC1B1F6013E7415BC763CEF1905D7D3" }, 15 - { name = "gleam_time", version = "1.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_time", source = "hex", outer_checksum = "533D8723774D61AD4998324F5DD1DABDCDBFABAFB9E87CB5D03C6955448FC97D" }, 16 - { name = "gleeunit", version = "1.10.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "254B697FE72EEAD7BF82E941723918E421317813AC49923EE76A18C788C61E72" }, 17 - { name = "glisten", version = "9.0.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging"], otp_app = "glisten", source = "hex", outer_checksum = "7795AA50830656F3A0316A6B26595F893C83272DA901B3405E31339CAA31A10B" }, 18 - { name = "gramps", version = "6.0.1", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "D55636072DEE173F6586A5679D3C02EC7A0DE3F8646B78C351B72908FF223DF7" }, 19 - { name = "houdini", version = "1.2.1", build_tools = ["gleam"], requirements = [], otp_app = "houdini", source = "hex", outer_checksum = "6F8AC2F12974567FB744BEA66AC93CEB76AAEA19AD28564623F76CDA9BC26A85" }, 20 - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, 21 - { name = "logging", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "BC5F18CE5DD9686100229FE5409BDC3DD5C46D5A7DF2F804AD2D8F0DD6C5060E" }, 22 - { name = "lustre", version = "5.6.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib", "houdini"], otp_app = "lustre", source = "hex", outer_checksum = "EE558CD4DB9F09FCC16417ADF0183A3C2DAC3E4B21ED3AC0CAE859792AB810CA" }, 23 - { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, 24 - { name = "mist", version = "6.0.3", build_tools = ["gleam"], requirements = ["exception", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "1B07F321D5FA0CB162D81496F2DE96AEB6EF8980F4F38230A4CC3F849497E020" }, 25 - { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, 26 - { name = "simplifile", version = "2.4.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "7C18AFA4FED0B4CE1FA5B0B4BAC1FA1744427054EA993565F6F3F82E5453170D" }, 27 - { name = "wisp", version = "2.2.2", build_tools = ["gleam"], requirements = ["directories", "exception", "filepath", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "houdini", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "5FF5F1E288C3437252ABB93D8F9CF42FF652CE7AD54480CFE736038DC09C4F22" }, 28 - { name = "youid", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_stdlib", "gleam_time"], otp_app = "youid", source = "hex", outer_checksum = "7A3ABA44B1B38BC2BDCB5474C5317AA372BE58DFBC649815EE08B03526DDA18D" }, 29 - ] 30 - 31 - [requirements] 32 - envoy = { version = ">= 1.2.0 and < 2.0.0" } 33 - filepath = { version = ">= 1.1.2 and < 2.0.0" } 34 - gleam_erlang = { version = ">= 1.3.0 and < 2.0.0" } 35 - gleam_otp = { version = ">= 1.2.0 and < 2.0.0" } 36 - gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } 37 - gleeunit = { version = ">= 1.0.0 and < 2.0.0" } 38 - lustre = { version = ">= 5.6.0 and < 6.0.0" } 39 - mist = { version = ">= 6.0.3 and < 7.0.0" } 40 - wisp = { version = ">= 2.2.2 and < 3.0.0" } 41 - youid = { version = ">= 1.6.0 and < 2.0.0" }
-28
server/src/server.gleam
··· 1 - import envoy 2 - import filepath as path 3 - import gleam/erlang/process 4 - import gleam/result 5 - import server/context.{Context} 6 - import server/router 7 - import server/supervision_tree 8 - import wisp 9 - 10 - pub fn main() -> Nil { 11 - wisp.configure_logger() 12 - 13 - let assert Ok(static_directory) = static_directory() 14 - let assert Ok(secret_key) = envoy.get("SECRET_KEY") 15 - as "Missing `SECRET_KEY` enviroment variable" 16 - 17 - let ctx = Context(static_directory:, secret_key:) 18 - let handler = router.handle_request(_, ctx) 19 - let assert Ok(_) = supervision_tree.start(handler, secret_key) 20 - 21 - process.sleep_forever() 22 - } 23 - 24 - /// Path to the application priv directory 25 - pub fn static_directory() -> Result(String, Nil) { 26 - use priv <- result.map(wisp.priv_directory("server")) 27 - path.join(priv, "static") 28 - }
-8
server/src/server/context.gleam
··· 1 - pub type Context { 2 - Context( 3 - /// Path to the application's priv directory 4 - static_directory: String, 5 - /// Secret used for hashing cookies and passwords 6 - secret_key: String, 7 - ) 8 - }
-37
server/src/server/root.gleam
··· 1 - import lustre/attribute as attr 2 - import lustre/element 3 - import lustre/element/html 4 - import server/context.{type Context} 5 - import wisp.{type Request, type Response} 6 - 7 - pub fn handle_request(_req: Request, _ctx: Context) -> Response { 8 - let viewport_meta = 9 - html.meta([ 10 - attr.name("viewport"), 11 - attr.content("width=device-width, initial-scale=1"), 12 - ]) 13 - 14 - let oat_ui = [ 15 - html.script([attr.src("/static/client.js")], ""), 16 - html.link([ 17 - attr.rel("stylesheet"), 18 - attr.href("https://unpkg.com/@knadh/oat/oat.min.css"), 19 - ]), 20 - ] 21 - 22 - let html_head = 23 - html.head([], [ 24 - html.title([], "BFD"), 25 - viewport_meta, 26 - html.script([attr.type_("module"), attr.src("/static/client.js")], ""), 27 - html.link([attr.rel("stylesheet"), attr.href("/static/client.css")]), 28 - ..oat_ui 29 - ]) 30 - 31 - let html_body = 32 - html.body([attr.id("app"), attr.data("sidebar-layout", "")], []) 33 - 34 - html.html([], [html_head, html_body]) 35 - |> element.to_document_string() 36 - |> wisp.html_response(200) 37 - }
-23
server/src/server/router.gleam
··· 1 - import server/context.{type Context} 2 - import server/root 3 - import wisp.{type Request, type Response} 4 - 5 - pub fn handle_request(req: Request, ctx: Context) -> Response { 6 - use req <- middleware(req, ctx) 7 - root.handle_request(req, ctx) 8 - } 9 - 10 - fn middleware( 11 - req: Request, 12 - ctx: Context, 13 - next: fn(Request) -> Response, 14 - ) -> Response { 15 - let req = wisp.method_override(req) 16 - use <- wisp.log_request(req) 17 - use <- wisp.rescue_crashes() 18 - use req <- wisp.handle_head(req) 19 - use req <- wisp.csrf_known_header_protection(req) 20 - use <- wisp.serve_static(req, "/static", ctx.static_directory) 21 - 22 - next(req) 23 - }
-18
server/src/server/supervision_tree.gleam
··· 1 - import gleam/otp/static_supervisor as supervisor 2 - import mist 3 - import wisp.{type Request, type Response} 4 - import wisp/wisp_mist 5 - 6 - pub fn start(http_handler: fn(Request) -> Response, secret_key: String) { 7 - let handler = wisp_mist.handler(http_handler, secret_key) 8 - 9 - let mist_builder = 10 - handler 11 - |> mist.new() 12 - |> mist.bind("0.0.0.0") 13 - |> mist.port(8000) 14 - 15 - supervisor.new(supervisor.OneForOne) 16 - |> supervisor.add(mist.supervised(mist_builder)) 17 - |> supervisor.start 18 - }
-4
shared/.gitignore
··· 1 - *.beam 2 - *.ez 3 - /build 4 - erl_crash.dump
-20
shared/gleam.toml
··· 1 - name = "shared" 2 - version = "1.0.0" 3 - 4 - # Fill out these fields if you intend to generate HTML documentation or publish 5 - # your project to the Hex package manager. 6 - # 7 - # description = "" 8 - # licences = ["Apache-2.0"] 9 - # repository = { type = "github", user = "", repo = "" } 10 - # links = [{ title = "Website", href = "" }] 11 - # 12 - # For a full reference of all the available options, you can have a look at 13 - # https://gleam.run/writing-gleam/gleam-toml/. 14 - 15 - [dependencies] 16 - gleam_stdlib = ">= 0.44.0 and < 2.0.0" 17 - youid = ">= 1.6.0 and < 2.0.0" 18 - 19 - [dev_dependencies] 20 - gleeunit = ">= 1.0.0 and < 2.0.0"
-2
shared/justfile
··· 1 - _default: 2 - just --list
-15
shared/manifest.toml
··· 1 - # This file was generated by Gleam 2 - # You typically do not need to edit this file 3 - 4 - packages = [ 5 - { name = "gleam_crypto", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "2DE9E4EF53CF6FEE049D4F765731F7178F7A11AEFAE00EEE63BF7536B354AD3F" }, 6 - { name = "gleam_stdlib", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "960090C2FB391784BB34267B099DC9315CC1B1F6013E7415BC763CEF1905D7D3" }, 7 - { name = "gleam_time", version = "1.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_time", source = "hex", outer_checksum = "533D8723774D61AD4998324F5DD1DABDCDBFABAFB9E87CB5D03C6955448FC97D" }, 8 - { name = "gleeunit", version = "1.10.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "254B697FE72EEAD7BF82E941723918E421317813AC49923EE76A18C788C61E72" }, 9 - { name = "youid", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_stdlib", "gleam_time"], otp_app = "youid", source = "hex", outer_checksum = "7A3ABA44B1B38BC2BDCB5474C5317AA372BE58DFBC649815EE08B03526DDA18D" }, 10 - ] 11 - 12 - [requirements] 13 - gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } 14 - gleeunit = { version = ">= 1.0.0 and < 2.0.0" } 15 - youid = { version = ">= 1.6.0 and < 2.0.0" }
shared/src/shared/route.gleam src/client/route.gleam
+2 -2
shared/src/shared/session.gleam src/client/session.gleam
··· 1 1 import gleam/dynamic/decode 2 - import shared/route 3 - import shared/user 2 + import client/route 3 + import client/user 4 4 5 5 pub type Session { 6 6 /// User is sucessfully authenticated
shared/src/shared/user.gleam src/client/user.gleam