From 7cf586bc83197027a1d3662231ba1398b3279f22 Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sat, 30 Nov 2024 01:46:10 +0100 Subject: [PATCH 1/9] Upgrade backend --- .mise.toml | 2 +- apps/backend/gleam.toml | 18 +- apps/backend/manifest.toml | 66 +- apps/backend/src/api/github.gleam | 27 +- apps/backend/src/api/hex_repo.gleam | 8 +- apps/backend/src/{ => aws}/s3.gleam | 22 +- apps/backend/src/backend.gleam | 94 +- apps/backend/src/backend/config.gleam | 76 - apps/backend/src/backend/context.gleam | 57 + apps/backend/src/backend/error.gleam | 34 +- apps/backend/src/backend/gleam/context.gleam | 4 +- .../src/backend/gleam/generate/types.gleam | 107 +- .../src/backend/gleam/type_search.gleam | 18 +- .../src/backend/gleam/type_search/state.gleam | 16 +- .../src/backend/postgres/postgres.gleam | 27 +- .../src/backend/postgres/queries.gleam | 685 +++++---- apps/backend/src/backend/router.gleam | 18 +- apps/backend/src/{ => backend}/setup.gleam | 4 +- apps/backend/src/backend/web.gleam | 24 +- apps/backend/src/backend/workers.gleam | 35 + .../{gloogle_hex_ffi.erl => backend_ffi.erl} | 36 +- apps/backend/src/gleam/verl.gleam | 2 +- apps/backend/src/helpers.gleam | 12 +- .../src/{ => processes}/periodic.gleam | 0 apps/backend/src/processes/retrier.gleam | 75 + apps/backend/src/retrier.gleam | 84 -- apps/backend/src/tasks/hex.gleam | 168 +-- apps/backend/src/tasks/popularity.gleam | 6 +- apps/backend/src/tasks/ranking.gleam | 4 +- apps/backend/src/tasks/timeseries.gleam | 15 +- apps/backend/src/wisp/logger.gleam | 12 +- apps/backend/test/backend_test.gleam | 22 +- .../client/src/app.gleam | 2 +- packages/pgo/.gitignore | 22 - packages/pgo/CHANGELOG.md | 48 - packages/pgo/LICENSE | 191 --- packages/pgo/README.md | 58 - packages/pgo/gleam.toml | 18 - packages/pgo/manifest.toml | 17 - packages/pgo/src/gleam/pgo.gleam | 494 ------ packages/pgo/src/gleam_pgo_ffi.erl | 105 -- packages/pgo/test/README.md | 15 - packages/pgo/test/gleam/pgo_test.gleam | 376 ----- packages/pgo/test/gleam_pgo_test.gleam | 5 - packages/pgo/test/reset_db.sh | 26 - packages/tom/.github/workflows/test.yml | 23 - packages/tom/.gitignore | 4 - packages/tom/CHANGELOG.md | 22 - packages/tom/README.md | 44 - packages/tom/gleam.toml | 13 - packages/tom/manifest.toml | 11 - packages/tom/src/tom.gleam | 1330 ----------------- packages/tom/test/tom_test.gleam | 930 ------------ 53 files changed, 938 insertions(+), 4594 deletions(-) rename apps/backend/src/{ => aws}/s3.gleam (67%) delete mode 100644 apps/backend/src/backend/config.gleam create mode 100644 apps/backend/src/backend/context.gleam rename apps/backend/src/{ => backend}/setup.gleam (89%) create mode 100644 apps/backend/src/backend/workers.gleam rename apps/backend/src/{gloogle_hex_ffi.erl => backend_ffi.erl} (76%) rename apps/backend/src/{ => processes}/periodic.gleam (100%) create mode 100644 apps/backend/src/processes/retrier.gleam delete mode 100644 apps/backend/src/retrier.gleam delete mode 100644 packages/pgo/.gitignore delete mode 100644 packages/pgo/CHANGELOG.md delete mode 100644 packages/pgo/LICENSE delete mode 100644 packages/pgo/README.md delete mode 100644 packages/pgo/gleam.toml delete mode 100644 packages/pgo/manifest.toml delete mode 100644 packages/pgo/src/gleam/pgo.gleam delete mode 100644 packages/pgo/src/gleam_pgo_ffi.erl delete mode 100644 packages/pgo/test/README.md delete mode 100644 packages/pgo/test/gleam/pgo_test.gleam delete mode 100644 packages/pgo/test/gleam_pgo_test.gleam delete mode 100755 packages/pgo/test/reset_db.sh delete mode 100644 packages/tom/.github/workflows/test.yml delete mode 100644 packages/tom/.gitignore delete mode 100644 packages/tom/CHANGELOG.md delete mode 100644 packages/tom/README.md delete mode 100644 packages/tom/gleam.toml delete mode 100644 packages/tom/manifest.toml delete mode 100644 packages/tom/src/tom.gleam delete mode 100644 packages/tom/test/tom_test.gleam diff --git a/.mise.toml b/.mise.toml index a9ab64a..8e48dfe 100644 --- a/.mise.toml +++ b/.mise.toml @@ -1,6 +1,6 @@ # Runtimes used by the stack. [tools] -gleam = "1.4.1" +gleam = "1.6.2" erlang = "27" node = "22" deno = "latest" diff --git a/apps/backend/gleam.toml b/apps/backend/gleam.toml index 3a3c8df..019634a 100644 --- a/apps/backend/gleam.toml +++ b/apps/backend/gleam.toml @@ -2,11 +2,12 @@ name = "backend" version = "1.0.0" [dependencies] -aws4_request = ">= 0.1.1 and < 1.0.0" +aws4_request = ">= 1.2.0 and < 2.0.0" birl = "~> 1.6" chomp = ">= 0.1.0 and < 1.0.0" -cors_builder = ">= 2.0.0 and < 3.0.0" +cors_builder = ">= 2.0.2 and < 3.0.0" decipher = ">= 1.2.0 and < 2.0.0" +envoy = ">= 1.0.2 and < 2.0.0" gleam_erlang = "~> 0.25" gleam_hexpm = "~> 1.0" gleam_http = "~> 3.6" @@ -14,18 +15,19 @@ gleam_httpc = ">= 2.2.0 and < 3.0.0" gleam_json = "~> 1.0" gleam_otp = "~> 0.10" gleam_package_interface = ">= 1.0.0 and < 2.0.0" -gleam_pgo = {path = "../../packages/pgo"} -gleam_stdlib = "~> 0.34 or ~> 1.0" +gleam_regexp = ">= 1.0.0 and < 2.0.0" +gleam_stdlib = ">= 0.44.0 and < 1.0.0" +gleam_yielder = ">= 1.1.0 and < 2.0.0" glexer = ">= 1.0.1 and < 2.0.0" -mist = ">= 1.2.0 and < 2.0.0" -pgo = "~> 0.14" +mist = ">= 3.0.0 and < 4.0.0" +pog = ">= 1.0.1 and < 2.0.0" prng = ">= 3.0.3 and < 4.0.0" radiate = ">= 0.4.0 and < 1.0.0" ranger = ">= 1.2.0 and < 2.0.0" simplifile = ">= 2.1.0 and < 3.0.0" -tom = { path ="../../packages/tom" } +tom = ">= 1.1.0 and < 2.0.0" verl = ">= 1.1.1 and < 2.0.0" -wisp = ">= 1.1.0 and < 2.0.0" +wisp = ">= 1.3.0 and < 2.0.0" [dev-dependencies] gleeunit = "~> 1.0" diff --git a/apps/backend/manifest.toml b/apps/backend/manifest.toml index fe50b78..b6c8c5c 100644 --- a/apps/backend/manifest.toml +++ b/apps/backend/manifest.toml @@ -2,62 +2,65 @@ # You typically do not need to edit this file packages = [ - { name = "aws4_request", version = "0.1.1", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_http", "gleam_stdlib"], otp_app = "aws4_request", source = "hex", outer_checksum = "90B1DB6E2A7F0396CD4713850B14B3A910331B5BA76D051E411D1499AAA2EA9A" }, + { name = "aws4_request", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_http", "gleam_stdlib"], otp_app = "aws4_request", source = "hex", outer_checksum = "A73515D60E2D164B8B546778F9471ADE6089D33B2DC5D362C1B2CAF12FB6471B" }, { name = "backoff", version = "1.1.6", build_tools = ["rebar3"], requirements = [], otp_app = "backoff", source = "hex", outer_checksum = "CF0CFFF8995FB20562F822E5CC47D8CCF664C5ECDC26A684CBE85C225F9D7C39" }, { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "chomp", version = "0.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "chomp", source = "hex", outer_checksum = "C87304897B4D4DEA69420DB2FF88B087673AAE9EC09CA8A0FBF4675F605767C2" }, - { name = "cors_builder", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib", "mist", "wisp"], otp_app = "cors_builder", source = "hex", outer_checksum = "E4634D1CAD89BC26B4FE986B45D55268BA5369E9224C2FD7872C0DB5AC028E47" }, - { name = "decipher", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_json", "gleam_stdlib", "stoiridh_version"], otp_app = "decipher", source = "hex", outer_checksum = "9F1B5C6FF0D798046E4E0EF87D09DD729324CB72BD7F0D4152B797324D51223E" }, + { name = "chomp", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "chomp", source = "hex", outer_checksum = "6DDC9EE76C5364E80F43A90A238351C25F627E59135AEF2506629112A7C4FD4F" }, + { name = "cors_builder", version = "2.0.2", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib", "mist", "wisp"], otp_app = "cors_builder", source = "hex", outer_checksum = "8FB02BDB2F5E20B13C5A85B7B4F2A52E8C50A23F2AE798FA18A9CF2E2197CE7F" }, + { name = "decipher", version = "1.2.1", build_tools = ["gleam"], requirements = ["birl", "gleam_json", "gleam_stdlib", "stoiridh_version"], otp_app = "decipher", source = "hex", outer_checksum = "4F82516A5FF09BD7DF352DE38F1691C2254508066152F5DEA8665B216A9C9909" }, { name = "directories", version = "1.1.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "BDA521A4EB9EE3A7894F0DC863797878E91FF5C7826F7084B2E731E208BDB076" }, - { name = "envoy", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "CFAACCCFC47654F7E8B75E614746ED924C65BD08B1DE21101548AC314A8B6A41" }, + { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" }, { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, + { name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" }, { name = "filespy", version = "0.5.0", build_tools = ["gleam"], requirements = ["fs", "gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "filespy", source = "hex", outer_checksum = "F8E7A9C9CA86D68CCC25491125BFF36BEF7483892D7BEC24AA30D6B540504F06" }, { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, { name = "glam", version = "2.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glam", source = "hex", outer_checksum = "66EC3BCD632E51EED029678F8DF419659C1E57B1A93D874C5131FE220DFAD2B2" }, { name = "gleam_bitwise", version = "1.3.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_bitwise", source = "hex", outer_checksum = "B36E1D3188D7F594C7FD4F43D0D2CE17561DE896202017548578B16FE1FE9EFC" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, + { name = "gleam_crypto", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "8AE56026B3E05EBB1F076778478A762E9EB62B31AEEB4285755452F397029D22" }, + { name = "gleam_erlang", version = "0.32.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "B18643083A0117AC5CFD0C1AEEBE5469071895ECFA426DCC26517A07F6AD9948" }, { name = "gleam_hexpm", version = "1.1.0", build_tools = ["gleam"], requirements = ["birl", "gleam_stdlib"], otp_app = "gleam_hexpm", source = "hex", outer_checksum = "D32439FD6AD683FE1094922737904EC2091E2D7B1F236AD23815935694A5221A" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, + { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, + { name = "gleam_httpc", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF6CDD88830CC9853F7638ECC0BE7D7CD9522640DA5FAB4C08CFAC8DEBD08028" }, { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, + { name = "gleam_otp", version = "0.14.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "5A8CE8DBD01C29403390A7BD5C0A63D26F865C83173CF9708E6E827E53159C65" }, { name = "gleam_package_interface", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "CF3BFC5D0997750D9550D8D73A90F4B8D71C6C081B20ED4E70FFBE1E99AFC3C2" }, - { name = "gleam_pgo", version = "0.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "pgo"], source = "local", path = "../../packages/pgo" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, + { name = "gleam_regexp", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "A3655FDD288571E90EE9C4009B719FEF59FA16AFCDF3952A76A125AF23CF1592" }, + { name = "gleam_stdlib", version = "0.44.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "A6E55E309A6778206AAD4038D9C49E15DF71027A1DB13C6ADA06BFDB6CF1260E" }, + { name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" }, { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, { name = "glexer", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "BD477AD657C2B637FEF75F2405FAEFFA533F277A74EF1A5E17B55B1178C228FB" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, + { name = "glisten", version = "6.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "912132751031473CB38F454120124FFC96AF6B0EA33D92C9C90DB16327A2A972" }, { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "opentelemetry_api", version = "1.3.0", build_tools = ["rebar3", "mix"], requirements = ["opentelemetry_semantic_conventions"], otp_app = "opentelemetry_api", source = "hex", outer_checksum = "B9E5FF775FD064FA098DBA3C398490B77649A352B40B0B730A6B7DC0BDD68858" }, - { name = "opentelemetry_semantic_conventions", version = "0.2.0", build_tools = ["rebar3", "mix"], requirements = [], otp_app = "opentelemetry_semantic_conventions", source = "hex", outer_checksum = "D61FA1F5639EE8668D74B527E6806E0503EFC55A42DB7B5F39939D84C07D6895" }, + { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, + { name = "mist", version = "3.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "CDA1A74E768419235E16886463EC4722EFF4AB3F8D820A76EAD45D7C167D7282" }, + { name = "opentelemetry_api", version = "1.4.0", build_tools = ["rebar3", "mix"], requirements = [], otp_app = "opentelemetry_api", source = "hex", outer_checksum = "3DFBBFAA2C2ED3121C5C483162836C4F9027DEF469C41578AF5EF32589FCFC58" }, { name = "pg_types", version = "0.4.0", build_tools = ["rebar3"], requirements = [], otp_app = "pg_types", source = "hex", outer_checksum = "B02EFA785CAECECF9702C681C80A9CA12A39F9161A846CE17B01FB20AEEED7EB" }, { name = "pgo", version = "0.14.0", build_tools = ["rebar3"], requirements = ["backoff", "opentelemetry_api", "pg_types"], otp_app = "pgo", source = "hex", outer_checksum = "71016C22599936E042DC0012EE4589D24C71427D266292F775EBF201D97DF9C9" }, { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, - { name = "pprint", version = "1.0.3", build_tools = ["gleam"], requirements = ["glam", "gleam_stdlib"], otp_app = "pprint", source = "hex", outer_checksum = "76BBB92E23D12D954BD452686543F29EDE8EBEBB7FC0ACCBCA66EEF276EC3A06" }, + { name = "pog", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "pgo"], otp_app = "pog", source = "hex", outer_checksum = "48D6570C1E98F77A3C29E7ED4F1D81205DD0D870DCEC55F536EF3A57A28DF627" }, + { name = "pprint", version = "1.0.4", build_tools = ["gleam"], requirements = ["glam", "gleam_stdlib"], otp_app = "pprint", source = "hex", outer_checksum = "C310A98BDC0995644847C3C8702DE19656D6BCD638B2A8A358B97824379ECAA1" }, { name = "prng", version = "3.0.3", build_tools = ["gleam"], requirements = ["gleam_bitwise", "gleam_stdlib"], otp_app = "prng", source = "hex", outer_checksum = "53006736FE23A0F61828C95B505193E10905D8DB76E128F1642D3E571E08F589" }, { name = "radiate", version = "0.4.0", build_tools = ["gleam"], requirements = ["filespy", "gleam_otp", "gleam_stdlib", "shellout"], otp_app = "radiate", source = "hex", outer_checksum = "93A76A66EE4741DBFD3E79E27CBD11FE58EC3CB1C58F017FC165944E339D6293" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, + { name = "ranger", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "B8F3AFF23A3A5B5D9526B8D18E7C43A7DFD3902B151B97EC65397FE29192B695" }, { name = "shellout", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "shellout", source = "hex", outer_checksum = "E2FCD18957F0E9F67E1F497FC9FF57393392F8A9BAEAEA4779541DE7A68DD7E0" }, - { name = "simplifile", version = "2.1.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "BDD04F5D31D6D34E2EDFAEF0B68A6297AEC939888C3BFCE61133DE13857F6DA2" }, + { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, { name = "stoiridh_version", version = "0.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "stoiridh_version", source = "hex", outer_checksum = "EEF8ADAB9755BD33EB202F169376F1A7797AEF90823FDCA671D8590D04FBF56B" }, + { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], source = "local", path = "../../packages/tom" }, + { name = "tom", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "228E667239504B57AD05EC3C332C930391592F6C974D0EFECF32FFD0F3629A27" }, { name = "verl", version = "1.1.1", build_tools = ["rebar3"], requirements = [], otp_app = "verl", source = "hex", outer_checksum = "0925E51CD92A0A8BE271765B02430B2E2CFF8AC30EF24D123BD0D58511E8FB18" }, - { name = "wisp", version = "1.1.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "5B25E37E08A94039668D2ACF7B2D2A665BEAF4B48EFA8613010B4E3164137664" }, + { name = "wisp", version = "1.3.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "D12384EE63ADEE833B40A6D26EF8014A6E4BFC10EC2CDC8B57D325DD4B52740E" }, ] [requirements] -aws4_request = { version = ">= 0.1.1 and < 1.0.0" } +aws4_request = { version = ">= 1.2.0 and < 2.0.0" } birl = { version = "~> 1.6" } chomp = { version = ">= 0.1.0 and < 1.0.0" } -cors_builder = { version = ">= 2.0.0 and < 3.0.0" } +cors_builder = { version = ">= 2.0.2 and < 3.0.0" } decipher = { version = ">= 1.2.0 and < 2.0.0" } +envoy = { version = ">= 1.0.2 and < 2.0.0" } gleam_erlang = { version = "~> 0.25" } gleam_hexpm = { version = "~> 1.0" } gleam_http = { version = "~> 3.6" } @@ -65,17 +68,18 @@ gleam_httpc = { version = ">= 2.2.0 and < 3.0.0" } gleam_json = { version = "~> 1.0" } gleam_otp = { version = "~> 0.10" } gleam_package_interface = { version = ">= 1.0.0 and < 2.0.0" } -gleam_pgo = { path = "../../packages/pgo" } -gleam_stdlib = { version = "~> 0.34 or ~> 1.0" } +gleam_regexp = { version = ">= 1.0.0 and < 2.0.0" } +gleam_stdlib = { version = ">= 0.44.0 and < 1.0.0" } +gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" } gleeunit = { version = "~> 1.0" } glexer = { version = ">= 1.0.1 and < 2.0.0" } -mist = { version = ">= 1.2.0 and < 2.0.0" } -pgo = { version = "~> 0.14" } +mist = { version = ">= 3.0.0 and < 4.0.0" } +pog = { version = ">= 1.0.1 and < 2.0.0" } pprint = { version = ">= 1.0.3 and < 2.0.0" } prng = { version = ">= 3.0.3 and < 4.0.0" } radiate = { version = ">= 0.4.0 and < 1.0.0" } ranger = { version = ">= 1.2.0 and < 2.0.0" } simplifile = { version = ">= 2.1.0 and < 3.0.0" } -tom = { path = "../../packages/tom" } +tom = { version = ">= 1.1.0 and < 2.0.0" } verl = { version = ">= 1.1.1 and < 2.0.0" } -wisp = { version = ">= 1.1.0 and < 2.0.0" } +wisp = { version = ">= 1.3.0 and < 2.0.0" } diff --git a/apps/backend/src/api/github.gleam b/apps/backend/src/api/github.gleam index a00f0d8..6f01afa 100644 --- a/apps/backend/src/api/github.gleam +++ b/apps/backend/src/api/github.gleam @@ -8,7 +8,7 @@ import gleam/httpc import gleam/json import gleam/list import gleam/option.{type Option, Some} -import gleam/regex +import gleam/regexp import gleam/result fn query( @@ -17,12 +17,7 @@ fn query( variables: Option(json.Json), decoder: dynamic.Decoder(a), ) { - let body = - json.object([ - #("query", json.string(query)), - #("variables", json.nullable(variables, function.identity)), - ]) - use response <- result.try( + use response <- result.try({ request.new() |> request.set_header("authorization", "Bearer " <> token) |> request.set_header("user-agent", "gloogle / 1.0.0") @@ -30,19 +25,27 @@ fn query( |> request.set_scheme(http.Https) |> request.set_host("api.github.com") |> request.set_path("/graphql") - |> request.set_body(json.to_string(body)) + |> request.set_body(encode_body(query, variables)) |> httpc.send() - |> result.map_error(error.FetchError), - ) + |> result.map_error(error.FetchError) + }) response.body |> json.decode(using: decoder) |> result.map_error(error.JsonError) } +fn encode_body(query: String, variables: Option(json.Json)) -> String { + json.object([ + #("query", json.string(query)), + #("variables", json.nullable(variables, function.identity)), + ]) + |> json.to_string +} + fn match_repository_name(repo_url: String) { - let assert Ok(owner_name) = regex.from_string("https://github.com/(.+)/(.+)") - regex.scan(with: owner_name, content: repo_url) + let assert Ok(owner_name) = regexp.from_string("https://github.com/(.+)/(.+)") + regexp.scan(with: owner_name, content: repo_url) |> list.first() |> result.replace_error(error.UnknownError( "No repository match for " <> repo_url, diff --git a/apps/backend/src/api/hex_repo.gleam b/apps/backend/src/api/hex_repo.gleam index eea473f..25982b7 100644 --- a/apps/backend/src/api/hex_repo.gleam +++ b/apps/backend/src/api/hex_repo.gleam @@ -1,3 +1,4 @@ +import aws/s3 import backend/error import gleam/bit_array import gleam/erlang/process @@ -7,15 +8,14 @@ import gleam/httpc import gleam/json import gleam/package_interface import gleam/result -import s3 import simplifile import tom import wisp -@external(erlang, "gloogle_hex_ffi", "get_home") +@external(erlang, "backend_ffi", "get_home") pub fn get_home() -> Result(String, Nil) -@external(erlang, "gloogle_hex_ffi", "extract_tar") +@external(erlang, "backend_ffi", "extract_tar") fn extract_tar( tarbin: BitArray, base_name: String, @@ -23,7 +23,7 @@ fn extract_tar( slug: String, ) -> Result(#(String, String, String), Nil) -@external(erlang, "gloogle_hex_ffi", "remove_tar") +@external(erlang, "backend_ffi", "remove_tar") fn remove_tar(slug: String) -> Nil fn package_slug(name: String, version: String) { diff --git a/apps/backend/src/s3.gleam b/apps/backend/src/aws/s3.gleam similarity index 67% rename from apps/backend/src/s3.gleam rename to apps/backend/src/aws/s3.gleam index c8725a2..2d2405b 100644 --- a/apps/backend/src/s3.gleam +++ b/apps/backend/src/aws/s3.gleam @@ -1,6 +1,5 @@ import aws4_request -import backend/config -import birl +import backend/context import gleam/http import gleam/http/request import gleam/httpc @@ -8,9 +7,8 @@ import gleam/option.{type Option, None, Some} import gleam/result fn request(url: String, method: http.Method, body: Option(BitArray)) { - let date = birl.to_erlang_universal_datetime(birl.now()) - use bucket_uri <- result.try(config.bucket_uri()) - use #(access_key, secret_key) <- result.try(config.scaleway_keys()) + use bucket_uri <- result.try(context.bucket_uri()) + use #(access_key, secret_key) <- result.try(context.scaleway_keys()) request.new() |> request.set_method(method) |> request.set_path(url) @@ -18,9 +16,19 @@ fn request(url: String, method: http.Method, body: Option(BitArray)) { |> request.set_host(bucket_uri) |> request.set_scheme(http.Https) |> request.set_header("content-type", "application/octet-stream") - |> aws4_request.sign(date, access_key, secret_key, "fr-par", "s3") + |> sign(access_key, secret_key) |> httpc.send_bits() - |> result.nil_error() + |> result.replace_error(Nil) +} + +fn sign(request, access_key_id, secret_access_key) { + aws4_request.signer( + access_key_id:, + secret_access_key:, + region: "fr-par", + service: "s3", + ) + |> aws4_request.sign_bits(request) } pub fn get(name: String) { diff --git a/apps/backend/src/backend.gleam b/apps/backend/src/backend.gleam index a9f76dc..03f82a4 100644 --- a/apps/backend/src/backend.gleam +++ b/apps/backend/src/backend.gleam @@ -1,73 +1,57 @@ -import backend/config +import backend/context.{type Context, Context} import backend/gleam/type_search/state as type_search -import backend/postgres/postgres import backend/router +import backend/setup +import backend/workers +import envoy import gleam/erlang/process import gleam/function +import gleam/int +import gleam/option.{Some} import gleam/otp/supervisor +import gleam/result import mist -import periodic -import setup -import tasks/hex -import tasks/popularity -import tasks/ranking -import tasks/timeseries import wisp import wisp/logger import wisp/wisp_mist pub fn main() { - wisp.configure_logger() - - let secret_key_base = config.get_secret_key_base() - let cnf = config.read_config() - let ctx = postgres.connect(cnf) + configure_logger() + let assert Ok(ctx) = context.init() + let assert Ok(ctx) = start_type_search_worker(ctx) + let assert Ok(_) = start_http_server(ctx) + let assert Ok(_) = start_periodic_workers(ctx) + process.sleep_forever() +} - logger.set_level(cnf.level) +fn configure_logger() { + let level = logger.read_level() + wisp.configure_logger() + logger.set_level(level) setup.radiate() +} - let assert Ok(subject) = type_search.init(ctx.db) - - let ctx = ctx |> config.add_type_search_subject(subject) - - let assert Ok(_) = - router.handle_request(_, ctx) - |> wisp_mist.handler(secret_key_base) - |> mist.new() - |> mist.port(cnf.port) - |> mist.start_http() - - let assert Ok(_) = { - use periodic_children <- supervisor.start() - use periodic_children <- function.tap(periodic_children) - let assert Ok(_) = { - use children <- supervisor.start() - // Every 10 seconds - add_periodic_worker(periodic_children, waiting: 10 * 1000, do: fn() { - hex.sync_new_gleam_releases(ctx, children) - }) - // Every day - add_periodic_worker(periodic_children, waiting: 86_400_000, do: fn() { - ranking.compute_ranking(ctx) - }) - // Every day - add_periodic_worker(periodic_children, waiting: 86_400_000, do: fn() { - popularity.compute_popularity(ctx) - }) - // Every hour - add_periodic_worker(periodic_children, waiting: 3600 * 1000, do: fn() { - timeseries.store_timeseries(ctx) - }) - } - } +fn start_type_search_worker(ctx: Context) { + use subject <- result.map(type_search.init(ctx.db)) + Context(..ctx, type_search_subject: Some(subject)) +} - process.sleep_forever() +fn start_http_server(ctx) { + use port <- result.try(envoy.get("PORT")) + use port <- result.map(int.parse(port)) + let secret_key_base = context.get_secret_key_base() + router.handle_request(_, ctx) + |> wisp_mist.handler(secret_key_base) + |> mist.new() + |> mist.port(port) + |> mist.start_http() } -fn add_periodic_worker(children, waiting delay, do work) { - use _ <- function.tap(children) - supervisor.add(children, { - use _ <- supervisor.worker() - periodic.periodically(do: work, waiting: delay) - }) +fn start_periodic_workers(ctx) { + use children <- supervisor.start() + use children <- function.tap(children) + workers.sync_new_gleam_releases_ten_secondly(ctx, children) + workers.compute_ranking_daily(ctx, children) + workers.compute_popularity_daily(ctx, children) + workers.store_timeseries_hourly(ctx, children) } diff --git a/apps/backend/src/backend/config.gleam b/apps/backend/src/backend/config.gleam deleted file mode 100644 index 2a6cef2..0000000 --- a/apps/backend/src/backend/config.gleam +++ /dev/null @@ -1,76 +0,0 @@ -import backend/gleam/type_search/msg as type_search -import gleam/erlang/os -import gleam/erlang/process.{type Subject} -import gleam/int -import gleam/option.{type Option} -import gleam/pgo -import gleam/result -import gleam/string -import wisp -import wisp/logger - -pub type Environment { - Development - Production -} - -pub type Context { - Context( - db: pgo.Connection, - hex_api_key: String, - github_token: String, - env: Environment, - type_search_subject: Option(Subject(type_search.Msg)), - ) -} - -pub type Config { - Config( - database_url: String, - hex_api_key: String, - port: Int, - level: logger.Level, - github_token: String, - env: Environment, - ) -} - -pub fn read_config() { - let assert Ok(database_url) = os.get_env("DATABASE_URL") - let assert Ok(hex_api_key) = os.get_env("HEX_API_KEY") - let assert Ok(github_token) = os.get_env("GITHUB_TOKEN") - let env = case result.unwrap(os.get_env("GLEAM_ENV"), "") { - "development" -> Development - _ -> Production - } - let assert Ok(port) = - os.get_env("PORT") - |> result.try(int.parse) - let level = - os.get_env("LOG_LEVEL") - |> result.try(logger.parse) - |> result.unwrap(logger.Info) - Config(database_url, hex_api_key, port, level, github_token, env) -} - -pub fn get_secret_key_base() { - wisp.random_string(64) -} - -pub fn is_dev() { - os.get_env("GLEAM_ENV") == Ok("development") -} - -pub fn bucket_uri() { - os.get_env("BUCKET_URI") -} - -pub fn scaleway_keys() { - use access_key <- result.try(os.get_env("SCALEWAY_ACCESS_KEY")) - use secret_key <- result.map(os.get_env("SCALEWAY_SECRET_KEY")) - #(access_key, secret_key) -} - -pub fn add_type_search_subject(context, subject) { - Context(..context, type_search_subject: option.Some(subject)) -} diff --git a/apps/backend/src/backend/context.gleam b/apps/backend/src/backend/context.gleam new file mode 100644 index 0000000..43836f2 --- /dev/null +++ b/apps/backend/src/backend/context.gleam @@ -0,0 +1,57 @@ +import backend/gleam/type_search/msg as type_search +import backend/postgres/postgres +import envoy +import gleam/erlang/process.{type Subject} +import gleam/option.{type Option, None} +import gleam/result +import pog +import wisp + +pub type Environment { + Development + Production +} + +pub type Context { + Context( + db: pog.Connection, + hex_api_key: String, + github_token: String, + env: Environment, + type_search_subject: Option(Subject(type_search.Msg)), + ) +} + +pub fn init() { + let env = read_environment() + use database_url <- result.try(envoy.get("DATABASE_URL")) + use hex_api_key <- result.try(envoy.get("HEX_API_KEY")) + use github_token <- result.map(envoy.get("GITHUB_TOKEN")) + let db = postgres.connect(database_url) + Context(db:, hex_api_key:, github_token:, env:, type_search_subject: None) +} + +pub fn read_environment() { + case envoy.get("GLEAM_ENV") { + Ok("development") -> Development + _ -> Production + } +} + +pub fn get_secret_key_base() { + wisp.random_string(64) +} + +pub fn is_dev() { + envoy.get("GLEAM_ENV") == Ok("development") +} + +pub fn bucket_uri() { + envoy.get("BUCKET_URI") +} + +pub fn scaleway_keys() { + use access_key <- result.try(envoy.get("SCALEWAY_ACCESS_KEY")) + use secret_key <- result.map(envoy.get("SCALEWAY_SECRET_KEY")) + #(access_key, secret_key) +} diff --git a/apps/backend/src/backend/error.gleam b/apps/backend/src/backend/error.gleam index 2f436af..f4bb5c0 100644 --- a/apps/backend/src/backend/error.gleam +++ b/apps/backend/src/backend/error.gleam @@ -2,15 +2,15 @@ import gleam/dynamic import gleam/int import gleam/json import gleam/list -import gleam/pgo import gleam/result import gleam/string +import pog import simplifile import tom import wisp pub type Error { - DatabaseError(pgo.QueryError) + DatabaseError(pog.QueryError) FetchError(dynamic.Dynamic) JsonError(json.DecodeError) SimplifileError(simplifile.FileError, String) @@ -20,6 +20,18 @@ pub type Error { EmptyError } +pub fn empty() { + Error(EmptyError) +} + +pub fn new(message: String) { + Error(UnknownError(message)) +} + +pub fn replace_nil(res, message: String) { + result.replace_error(res, UnknownError(message)) +} + pub fn log_dynamic_error(error: dynamic.DecodeError) { wisp.log_warning("Dynamic Decode Error") wisp.log_warning(" expected: " <> error.expected) @@ -54,7 +66,7 @@ pub fn log_error(error: Error) { FetchError(_dyn) -> wisp.log_warning("Fetch error") DatabaseError(error) -> { wisp.log_warning("Query error") - log_pgo_error(error) + log_pog_error(error) } JsonError(error) -> { wisp.log_warning("JSON error") @@ -168,36 +180,36 @@ pub fn log_simplifile(error: simplifile.FileError) { } } -pub fn log_pgo_error(error: pgo.QueryError) { +pub fn log_pog_error(error: pog.QueryError) { case error { - pgo.ConstraintViolated(message, constraint, details) -> { + pog.ConstraintViolated(message, constraint, details) -> { wisp.log_warning("Constraint violated") wisp.log_warning(" message: " <> message) wisp.log_warning(" constraint: " <> constraint) wisp.log_warning(" details: " <> details) } - pgo.PostgresqlError(code, name, message) -> { - let code = result.unwrap(pgo.error_code_name(code), code) + pog.PostgresqlError(code, name, message) -> { + let code = result.unwrap(pog.error_code_name(code), code) wisp.log_warning("PostgreSQL error") wisp.log_warning(" error: " <> code) wisp.log_warning(" name: " <> name) wisp.log_warning(" message: " <> message) } - pgo.UnexpectedArgumentCount(expected, got) -> { + pog.UnexpectedArgumentCount(expected, got) -> { wisp.log_warning("Unexpected argument count") wisp.log_warning(" expected: " <> int.to_string(expected)) wisp.log_warning(" got: " <> int.to_string(got)) } - pgo.UnexpectedArgumentType(expected, got) -> { + pog.UnexpectedArgumentType(expected, got) -> { wisp.log_warning("Unexpected argument type") wisp.log_warning(" expected: " <> expected) wisp.log_warning(" got: " <> got) } - pgo.UnexpectedResultType(error) -> { + pog.UnexpectedResultType(error) -> { wisp.log_warning("Unexpected result type") list.map(error, log_dynamic_error) Nil } - pgo.ConnectionUnavailable -> wisp.log_warning("Connection unavailable") + pog.ConnectionUnavailable -> wisp.log_warning("Connection unavailable") } } diff --git a/apps/backend/src/backend/gleam/context.gleam b/apps/backend/src/backend/gleam/context.gleam index 0171d39..2ef8586 100644 --- a/apps/backend/src/backend/gleam/context.gleam +++ b/apps/backend/src/backend/gleam/context.gleam @@ -3,12 +3,12 @@ import gleam/dict.{type Dict} import gleam/erlang/process.{type Subject} import gleam/option.{type Option} import gleam/package_interface -import gleam/pgo +import pog import tom pub type Context { Context( - db: pgo.Connection, + db: pog.Connection, package_interface: package_interface.Package, gleam_toml: Dict(String, tom.Toml), /// Allow to bypass parameters relations if activated. diff --git a/apps/backend/src/backend/gleam/generate/types.gleam b/apps/backend/src/backend/gleam/generate/types.gleam index 35c4ff9..4c4f7d4 100644 --- a/apps/backend/src/backend/gleam/generate/types.gleam +++ b/apps/backend/src/backend/gleam/generate/types.gleam @@ -7,17 +7,17 @@ import gleam/dict import gleam/dynamic import gleam/json.{type Json} import gleam/list -import gleam/option +import gleam/option.{type Option, None, Some} import gleam/order import gleam/package_interface.{ type Constant, type Function, type Implementations, type Parameter, type Type, type TypeAlias, type TypeConstructor, type TypeDefinition, } import gleam/pair -import gleam/pgo import gleam/result import gleam/set.{type Set} import gleam/verl +import pog fn reduce_components( components: List(a), @@ -105,8 +105,8 @@ fn type_to_json(ctx: Context, type_: Type) { let res = extract_parameters_relation(ctx, name, package, module) use ref <- result.map(res) let new_ids = case ref { - option.None -> gen.1 - option.Some(ref) -> set.insert(gen.1, ref.1) + None -> gen.1 + Some(ref) -> set.insert(gen.1, ref.1) } json.object([ #("kind", json.string("named")), @@ -122,38 +122,47 @@ fn type_to_json(ctx: Context, type_: Type) { } fn find_package_release(ctx: Context, package: String, requirement: String) { - let decoder = dynamic.tuple2(dynamic.int, dynamic.string) - use response <- result.try({ - "SELECT package_release.id, package_release.version + "SELECT package_release.id, package_release.version FROM package JOIN package_release ON package.id = package_release.package_id WHERE package.name = $1" - |> pgo.execute(ctx.db, [pgo.text(package)], decoder) - |> result.map_error(error.DatabaseError) - }) - response.rows - |> keep_matching_releases(requirement) + |> pog.query + |> pog.parameter(pog.text(package)) + |> pog.returning(dynamic.tuple2(dynamic.int, dynamic.string)) + |> pog.execute(ctx.db) + |> result.map_error(error.DatabaseError) + |> result.map(fn(response) { response.rows }) + |> result.map(keep_matching_releases(_, requirement)) } fn keep_matching_releases(rows: List(#(Int, String)), requirement: String) { - let requirement = bit_array.from_string(requirement) rows - |> list.filter(fn(r) { - let version = bit_array.from_string(r.1) - let is_matching = verl.is_match(version: version, requirement: requirement) - result.unwrap(is_matching, False) - }) - |> list.sort(fn(a, b) { - let a = bit_array.from_string(a.1) - let b = bit_array.from_string(b.1) - case verl.gte(version: a, with: b) { - True -> order.Lt - False -> order.Gt - } - }) - |> list.map(fn(a) { a.0 }) - |> Ok() + |> list.filter(keep_matching_requirement(_, requirement)) + |> list.sort(by_decreasing_version) + |> list.map(pair.first) +} + +fn keep_matching_requirement(release: #(Int, String), requirement: String) { + let #(_release_id, release_version) = release + let requirement = bit_array.from_string(requirement) + let version = bit_array.from_string(release_version) + let is_matching = verl.is_match(version:, requirement:) + result.unwrap(is_matching, False) +} + +fn by_decreasing_version( + release_1: #(Int, String), + release_2: #(Int, String), +) -> order.Order { + let #(_, release_1_version) = release_1 + let #(_, release_2_version) = release_2 + let release_1_version = bit_array.from_string(release_1_version) + let release_2_version = bit_array.from_string(release_2_version) + case verl.gte(version: release_1_version, with: release_2_version) { + True -> order.Lt + False -> order.Gt + } } fn find_signature_from_release( @@ -162,11 +171,9 @@ fn find_signature_from_release( module: String, releases: List(Int), ) { - use acc, release <- list.fold(releases, Error(Nil)) + use acc, release <- list.fold(releases, error.empty()) use <- bool.guard(when: result.is_ok(acc), return: acc) - let args = [pgo.text(name), pgo.text(module), pgo.int(release)] - use t <- result.try({ - "SELECT release.version, signature.id + "SELECT release.version, signature.id FROM package_release release JOIN package_module module ON module.package_release_id = release.id @@ -175,11 +182,17 @@ fn find_signature_from_release( WHERE signature.name = $1 AND module.name = $2 AND module.package_release_id = $3" - |> pgo.execute(ctx.db, args, dynamic.tuple2(dynamic.string, dynamic.int)) - |> result.nil_error() + |> pog.query + |> pog.parameter(pog.text(name)) + |> pog.parameter(pog.text(module)) + |> pog.parameter(pog.int(release)) + |> pog.returning(dynamic.tuple2(dynamic.string, dynamic.int)) + |> pog.execute(ctx.db) + |> result.map_error(error.DatabaseError) + |> result.try(fn(response) { + list.first(response.rows) + |> error.replace_nil("[find_signature_from_release] No row") }) - list.first(t.rows) - |> result.nil_error() } fn find_type_signature( @@ -188,9 +201,9 @@ fn find_type_signature( package: String, module: String, releases: List(Int), -) -> Result(option.Option(#(String, Int)), error.Error) { +) -> Result(Option(#(String, Int)), error.Error) { case find_signature_from_release(ctx, name, module, releases) { - Ok(value) -> Ok(option.Some(value)) + Ok(value) -> Ok(Some(value)) Error(_) -> { let slug = package <> "/" <> module let package_name = ctx.package_interface.name @@ -205,7 +218,7 @@ fn find_type_signature( True -> case dict.get(ctx.package_interface.modules, module) { // Module is hidden, everything is correct, type is hidden. - Error(_) -> Ok(option.None) + Error(_) -> Ok(None) // Module is not hidden, checking if type is hidden by itself. Ok(mod) -> { let slug = slug <> "." <> name @@ -220,7 +233,7 @@ fn find_type_signature( Error(_) -> case dict.get(mod.types, name) { // Type is hidden, returning None because it can't be extracted. - Error(_) -> Ok(option.None) + Error(_) -> Ok(None) // Type is not hidden, returning an error to restart the extraction. Ok(_) -> { let id = package_name <> ", looking for " <> slug @@ -241,17 +254,15 @@ fn extract_parameters_relation( name: String, package: String, module: String, -) -> Result(option.Option(#(String, Int)), error.Error) { - use <- bool.guard(when: is_prelude(package, module), return: Ok(option.None)) +) -> Result(Option(#(String, Int)), error.Error) { + use <- bool.guard(when: is_prelude(package, module), return: Ok(None)) use requirement <- result.try(toml.find_package_requirement(ctx, package)) use releases <- result.try(find_package_release(ctx, package, requirement)) - use error <- result.try_recover({ - find_type_signature(ctx, name, package, module, releases) + find_type_signature(ctx, name, package, module, releases) + |> result.try_recover(fn(error) { + use <- bool.guard(when: ctx.ignore_parameters_errors, return: Ok(None)) + Error(error) }) - case ctx.ignore_parameters_errors { - False -> Error(error) - True -> Ok(option.None) - } } fn is_prelude(package: String, module: String) { diff --git a/apps/backend/src/backend/gleam/type_search.gleam b/apps/backend/src/backend/gleam/type_search.gleam index 2373e44..e4ddec2 100644 --- a/apps/backend/src/backend/gleam/type_search.gleam +++ b/apps/backend/src/backend/gleam/type_search.gleam @@ -5,8 +5,8 @@ import gleam/int import gleam/list import gleam/option.{type Option} import gleam/pair -import gleam/pgo import gleam/result +import pog pub type TypeSearch { TypeSearch(keys: Keys, rows: List(Int)) @@ -48,25 +48,25 @@ fn update_keys( parse.DiscardName -> panic as "No Discard name in add" parse.Index(_value, index) -> { let value = int.to_string(index) - dict.update(keys.keys, value, fn(k) { + dict.upsert(keys.keys, value, fn(k) { let k = option.unwrap(k, Keys(keys: dict.new(), next: next)) update_keys(k, rest, updater) }) } parse.Custom(value, kinds) -> - dict.update(keys.keys, value, fn(k) { + dict.upsert(keys.keys, value, fn(k) { let k = option.unwrap(k, Keys(keys: dict.new(), next: next)) update_keys(k, list.append(kinds, rest), updater) }) parse.Function(kinds, return) -> { let kinds = postpend(kinds, return) - dict.update(keys.keys, "fn", fn(k) { + dict.upsert(keys.keys, "fn", fn(k) { let k = option.unwrap(k, Keys(keys: dict.new(), next: next)) update_keys(k, list.append(kinds, rest), updater) }) } parse.Tuple(kinds) -> { - dict.update(keys.keys, "#()", fn(k) { + dict.upsert(keys.keys, "#()", fn(k) { let k = option.unwrap(k, Keys(keys: dict.new(), next: next)) update_keys(k, list.append(kinds, rest), updater) }) @@ -112,7 +112,7 @@ fn get_next_tree( keys: Keys, kind: Kind, env: Dict(Int, String), - db: pgo.Connection, + db: pog.Connection, ) -> List(#(Keys, Dict(Int, String))) { case kind { parse.DiscardName -> { @@ -182,7 +182,7 @@ fn find_next_tree( kind: Kind, kinds: List(Kind), env: Dict(Int, String), - db: pgo.Connection, + db: pog.Connection, ) -> List(Int) { case kind { parse.DiscardName -> { @@ -252,7 +252,7 @@ fn do_find( searches: TypeSearch, kinds: List(Kind), env: Dict(Int, String), - db: pgo.Connection, + db: pog.Connection, ) { case kinds { [] -> searches.rows @@ -260,7 +260,7 @@ fn do_find( } } -pub fn find(searches: TypeSearch, kind: Kind, db: pgo.Connection) { +pub fn find(searches: TypeSearch, kind: Kind, db: pog.Connection) { case kind { Function(kinds, return_value) -> kinds diff --git a/apps/backend/src/backend/gleam/type_search/state.gleam b/apps/backend/src/backend/gleam/type_search/state.gleam index 9930818..e8c057c 100644 --- a/apps/backend/src/backend/gleam/type_search/state.gleam +++ b/apps/backend/src/backend/gleam/type_search/state.gleam @@ -8,14 +8,14 @@ import gleam/function import gleam/list import gleam/option import gleam/otp/actor -import gleam/pgo import gleam/result +import pog pub type State { - State(db: pgo.Connection, search: TypeSearch) + State(db: pog.Connection, search: TypeSearch) } -pub fn init(db: pgo.Connection) { +pub fn init(db: pog.Connection) { let init = fn() { let search = compute_rows(0, db, #(0, type_search.empty()), { @@ -41,7 +41,7 @@ fn loop(msg: msg.Msg, state: State) -> actor.Next(msg.Msg, State) { msg.Find(subject, signature) -> { signature |> parse.parse_function - |> result.nil_error + |> result.replace_error(Nil) |> result.then(permutation_search(state, _)) |> option.from_result |> function.tap(fn(res) { process.send(subject, res) }) @@ -88,11 +88,10 @@ fn permutation_search(state: State, kind: parse.Kind) { fn compute_rows( offset: Int, - db: pgo.Connection, + db: pog.Connection, default: a, next: fn(a, #(String, Int)) -> a, ) { - let decoder = dynamic.tuple2(dynamic.string, dynamic.int) let rows = "SELECT signature_, id FROM package_type_fun_signature @@ -100,7 +99,10 @@ fn compute_rows( ORDER BY id ASC LIMIT 1000 OFFSET $1" - |> pgo.execute(db, [pgo.int(offset)], decoder) + |> pog.query + |> pog.parameter(pog.int(offset)) + |> pog.returning(dynamic.tuple2(dynamic.string, dynamic.int)) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.unwrap([]) use <- bool.guard(when: list.is_empty(rows), return: default) diff --git a/apps/backend/src/backend/postgres/postgres.gleam b/apps/backend/src/backend/postgres/postgres.gleam index 65a31b5..45170e1 100644 --- a/apps/backend/src/backend/postgres/postgres.gleam +++ b/apps/backend/src/backend/postgres/postgres.gleam @@ -1,26 +1,15 @@ -import backend/config.{type Config, type Context, Context} import backend/error import gleam/bool import gleam/list import gleam/option.{type Option, Some} -import gleam/pgo.{Config} import gleam/result import gleam/string import gleam/uri +import pog.{Config} -pub fn connect(cnf: Config) { - let assert Ok(config) = parse_database_url(cnf.database_url) - config - |> pgo.connect() - |> fn(db) { - Context( - db: db, - hex_api_key: cnf.hex_api_key, - github_token: cnf.github_token, - env: cnf.env, - type_search_subject: option.None, - ) - } +pub fn connect(database_url: String) { + let assert Ok(config) = parse_database_url(database_url) + pog.connect(config) } fn parse_database_url(database_url: String) { @@ -33,7 +22,7 @@ fn parse_database_url(database_url: String) { return: Error(error.UnknownError("No postgres protocol")), ) - pgo.default_config() + pog.default_config() |> fn(cnf) { Config(..cnf, database: string.replace(db_uri.path, "/", "")) } |> update_config(db_uri.userinfo, add_user_info) |> update_config(db_uri.host, fn(cnf, u) { Config(..cnf, host: u) }) @@ -51,15 +40,15 @@ fn parse_database_url(database_url: String) { } fn update_config( - cnf: pgo.Config, + cnf: pog.Config, field: Option(a), - mapper: fn(pgo.Config, a) -> pgo.Config, + mapper: fn(pog.Config, a) -> pog.Config, ) { option.map(field, fn(u) { mapper(cnf, u) }) |> option.unwrap(cnf) } -fn add_user_info(c: pgo.Config, u: String) { +fn add_user_info(c: pog.Config, u: String) { case string.split(u, ":") { [user, password] -> Config(..c, user: user, password: Some(password)) [user] -> Config(..c, user: user) diff --git a/apps/backend/src/backend/postgres/queries.gleam b/apps/backend/src/backend/postgres/queries.gleam index 1411fdb..edb7cab 100644 --- a/apps/backend/src/backend/postgres/queries.gleam +++ b/apps/backend/src/backend/postgres/queries.gleam @@ -13,10 +13,13 @@ import gleam/list import gleam/option.{type Option, None, Some} import gleam/package_interface import gleam/pair -import gleam/pgo import gleam/result import gleam/string import helpers +import pog + +@external(erlang, "backend_ffi", "coerce") +fn coerce(a: a) -> b pub type SignatureKind { TypeAlias @@ -25,9 +28,11 @@ pub type SignatureKind { Function } -pub fn get_last_hex_date(db: pgo.Connection) { +pub fn get_last_hex_date(db: pog.Connection) { "SELECT id, last_check FROM hex_read ORDER BY last_check DESC LIMIT 1" - |> pgo.execute(db, [], hex_read.decode) + |> pog.query + |> pog.returning(hex_read.decode) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(response) { response.rows @@ -37,15 +42,17 @@ pub fn get_last_hex_date(db: pgo.Connection) { }) } -pub fn upsert_most_recent_hex_timestamp(db: pgo.Connection, latest: Time) { - let timestamp = helpers.convert_time(latest) +pub fn upsert_most_recent_hex_timestamp(db: pog.Connection, latest: Time) { "INSERT INTO hex_read OVERRIDING SYSTEM VALUE VALUES (1, $1) ON CONFLICT (id) DO UPDATE SET last_check = $1 RETURNING *" - |> pgo.execute(db, [timestamp], hex_read.decode) + |> pog.query + |> pog.parameter(helpers.convert_time(latest)) + |> pog.returning(hex_read.decode) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.try(fn(response) { let err = "Upsert most recent hex timestamp failed" @@ -55,13 +62,16 @@ pub fn upsert_most_recent_hex_timestamp(db: pgo.Connection, latest: Time) { }) } -pub fn upsert_search_analytics(db: pgo.Connection, query: String) { +pub fn upsert_search_analytics(db: pog.Connection, query: String) { "INSERT INTO search_analytics (query) VALUES ($1) ON CONFLICT (query) DO UPDATE SET occurences = search_analytics.occurences + 1 RETURNING *" - |> pgo.execute(db, [pgo.text(query)], dynamic.dynamic) + |> pog.query + |> pog.parameter(pog.text(query)) + |> pog.returning(dynamic.dynamic) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.try(fn(response) { let err = "Upsert search analytics failed" @@ -71,20 +81,15 @@ pub fn upsert_search_analytics(db: pgo.Connection, query: String) { }) } -pub fn select_more_popular_packages(db: pgo.Connection) { - let decoder = - dynamic.tuple4( - dynamic.string, - dynamic.string, - dynamic.int, - dynamic.optional(dynamic.int), - ) +pub fn select_more_popular_packages(db: pog.Connection) { use ranked <- result.try({ "SELECT name, repository, rank, (popularity -> 'github')::int FROM package ORDER BY rank DESC LIMIT 22" - |> pgo.execute(db, [], decoder) + |> pog.query + |> pog.returning(decode_popular_package) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) }) @@ -96,49 +101,59 @@ pub fn select_more_popular_packages(db: pgo.Connection) { AND name != 'dew' ORDER BY popularity -> 'github' DESC LIMIT 23" - |> pgo.execute(db, [], decoder) + |> pog.query + |> pog.returning(decode_popular_package) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) }) Ok(#(ranked, popular)) } -pub fn select_last_day_search_analytics(db: pgo.Connection) { +fn decode_popular_package(dyn) { + dynamic.tuple4( + dynamic.string, + dynamic.string, + dynamic.int, + dynamic.optional(dynamic.int), + )(dyn) +} + +pub fn select_last_day_search_analytics(db: pog.Connection) { let #(date, _) = birl.to_erlang_universal_datetime(birl.now()) let now = birl.from_erlang_universal_datetime(#(date, #(0, 0, 0))) "SELECT query, occurences FROM search_analytics WHERE updated_at >= $1" - |> pgo.execute( - db, - [helpers.convert_time(now)], - dynamic.tuple2(dynamic.string, dynamic.int), - ) + |> pog.query + |> pog.parameter(helpers.convert_time(now)) + |> pog.returning(dynamic.tuple2(dynamic.string, dynamic.int)) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } pub fn upsert_search_analytics_timeseries( - db: pgo.Connection, + db: pog.Connection, analytic: #(String, Int), ) { let #(date, _) = birl.to_erlang_universal_datetime(birl.now()) let now = birl.from_erlang_universal_datetime(#(date, #(0, 0, 0))) - let timestamp = helpers.convert_time(now) let #(query, occurences) = analytic "INSERT INTO analytics_timeseries (query, occurences, date) VALUES ($1, $2, $3) ON CONFLICT (query, date) DO UPDATE SET occurences = $2" - |> pgo.execute( - db, - [pgo.text(query), pgo.int(occurences), timestamp], - dynamic.dynamic, - ) + |> pog.query + |> pog.parameter(pog.text(query)) + |> pog.parameter(pog.int(occurences)) + |> pog.parameter(helpers.convert_time(now)) + |> pog.returning(dynamic.dynamic) + |> pog.execute(db) |> result.map_error(error.DatabaseError) } -pub fn get_timeseries_count(db: pgo.Connection) { +pub fn get_timeseries_count(db: pog.Connection) { "SELECT SUM(at.occurences - COALESCE( (SELECT att.occurences @@ -154,65 +169,77 @@ pub fn get_timeseries_count(db: pgo.Connection) { WHERE at.date >= now() - INTERVAL '30 day' GROUP BY at.date ORDER BY date DESC" - |> pgo.execute(db, [], dynamic.tuple2(dynamic.int, helpers.decode_time)) + |> pog.query + |> pog.returning(dynamic.tuple2(dynamic.int, helpers.decode_time)) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn upsert_hex_user(db: pgo.Connection, owner: hexpm.PackageOwner) { - let username = pgo.text(owner.username) - let email = pgo.nullable(pgo.text, owner.email) - let url = pgo.text(owner.url) +pub fn upsert_hex_user(db: pog.Connection, owner: hexpm.PackageOwner) { "INSERT INTO hex_user (username, email, url) VALUES ($1, $2, $3) ON CONFLICT (username) DO UPDATE SET email = $2, url = $3 RETURNING id, username, email, url, created_at, updated_at" - |> pgo.execute(db, [username, email, url], hex_user.decode) + |> pog.query + |> pog.parameter(pog.text(owner.username)) + |> pog.parameter(pog.nullable(pog.text, owner.email)) + |> pog.parameter(pog.text(owner.url)) + |> pog.returning(hex_user.decode) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } -fn upsert_package_owners(db: pgo.Connection, owners: List(hexpm.PackageOwner)) { +fn upsert_package_owners(db: pog.Connection, owners: List(hexpm.PackageOwner)) { owners |> list.map(upsert_hex_user(db, _)) |> result.all() |> result.map(list.flatten) } -fn get_current_package_owners(db: pgo.Connection, package_id: Int) { - let pid = pgo.int(package_id) +fn get_current_package_owners(db: pog.Connection, package_id: Int) { "SELECT package_owner.hex_user_id FROM package_owner WHERE package_owner.package_id = $1" - |> pgo.execute(db, [pid], dynamic.element(0, dynamic.int)) + |> pog.query + |> pog.parameter(pog.int(package_id)) + |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } -pub fn get_total_searches(db: pgo.Connection) { +pub fn get_total_searches(db: pog.Connection) { "SELECT SUM(occurences) FROM search_analytics" - |> pgo.execute(db, [], dynamic.element(0, dynamic.int)) + |> pog.query + |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } -pub fn get_total_signatures(db: pgo.Connection) { +pub fn get_total_signatures(db: pog.Connection) { "SELECT COUNT(*) FROM package_type_fun_signature" - |> pgo.execute(db, [], dynamic.element(0, dynamic.int)) + |> pog.query + |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } -pub fn get_total_packages(db: pgo.Connection) { +pub fn get_total_packages(db: pog.Connection) { "SELECT COUNT(*) FROM package" - |> pgo.execute(db, [], dynamic.element(0, dynamic.int)) + |> pog.query + |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } fn add_new_package_owners( - db: pgo.Connection, + db: pog.Connection, owners: List(HexUser), current_owners: List(Int), package_id: Int, @@ -220,18 +247,20 @@ fn add_new_package_owners( owners |> list.filter(fn(o) { bool.negate(list.contains(current_owners, o.id)) }) |> list.map(fn(u) { - let hex_user_id = pgo.int(u.id) - let pid = pgo.int(package_id) "INSERT INTO package_owner (hex_user_id, package_id) VALUES ($1, $2)" - |> pgo.execute(db, [hex_user_id, pid], dynamic.dynamic) + |> pog.query + |> pog.parameter(pog.int(u.id)) + |> pog.parameter(pog.int(package_id)) + |> pog.returning(dynamic.dynamic) + |> pog.execute(db) }) |> result.all() |> result.map_error(error.DatabaseError) } fn remove_old_package_owners( - db: pgo.Connection, + db: pog.Connection, owners: List(HexUser), current_owners: List(Int), package_id: Int, @@ -240,19 +269,21 @@ fn remove_old_package_owners( current_owners |> list.filter(fn(id) { list.contains(curr, id) }) |> list.map(fn(u) { - let hex_user_id = pgo.int(u) - let pid = pgo.int(package_id) "DELETE FROM package_owner WHERE package_owner.hex_user_id = $1 AND package_owner.package_id = $2" - |> pgo.execute(db, [hex_user_id, pid], dynamic.dynamic) + |> pog.query + |> pog.parameter(pog.int(u)) + |> pog.parameter(pog.int(package_id)) + |> pog.returning(dynamic.dynamic) + |> pog.execute(db) }) |> result.all() |> result.map_error(error.DatabaseError) } pub fn sync_package_owners( - db: pgo.Connection, + db: pog.Connection, package_id: Int, owners: List(hexpm.PackageOwner), ) { @@ -263,24 +294,7 @@ pub fn sync_package_owners( Ok(Nil) } -pub fn upsert_package(db: pgo.Connection, package: hexpm.Package) { - let name = pgo.text(package.name) - let hex_url = pgo.nullable(pgo.text, package.html_url) - let docs = pgo.nullable(pgo.text, package.docs_html_url) - let repo = - package.meta.links - |> dict.get("Repository") - |> option.from_result() - |> pgo.nullable(pgo.text, _) - let links = - package.meta.links - |> helpers.json_dict() - |> pgo.text() - let licenses = - package.meta.licenses - |> helpers.json_list() - |> pgo.text() - let description = pgo.nullable(pgo.text, package.meta.description) +pub fn upsert_package(db: pog.Connection, package: hexpm.Package) { "INSERT INTO package (name, repository, documentation, hex_url, links, licenses, description) VALUES ($1, $2, $3, $4, $5, $6, $7) @@ -293,11 +307,21 @@ pub fn upsert_package(db: pgo.Connection, package: hexpm.Package) { licenses = $6, description = $7 RETURNING id" - |> pgo.execute( - db, - [name, repo, docs, hex_url, links, licenses, description], - dynamic.element(0, dynamic.int), - ) + |> pog.query + |> pog.parameter(pog.text(package.name)) + |> pog.parameter(pog.nullable(pog.text, package.html_url)) + |> pog.parameter(pog.nullable(pog.text, package.docs_html_url)) + |> pog.parameter({ + package.meta.links + |> dict.get("Repository") + |> option.from_result() + |> pog.nullable(pog.text, _) + }) + |> pog.parameter(package.meta.links |> helpers.json_dict() |> pog.text()) + |> pog.parameter(package.meta.licenses |> helpers.json_list() |> pog.text()) + |> pog.parameter(pog.nullable(pog.text, package.meta.description)) + |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.try(fn(response) { response.rows @@ -307,30 +331,12 @@ pub fn upsert_package(db: pgo.Connection, package: hexpm.Package) { } pub fn upsert_release( - db: pgo.Connection, + db: pog.Connection, package_id: Int, release: hexpm.Release, package_interface: Option(String), gleam_toml: Option(String), ) { - let package_id = pgo.int(package_id) - let version = pgo.text(release.version) - let url = pgo.text(release.url) - let package_interface = pgo.nullable(pgo.text, package_interface) - let gleam_toml = pgo.nullable(pgo.text, gleam_toml) - let inserted_at = - release.inserted_at - |> birl.to_erlang_universal_datetime - |> dynamic.from - |> dynamic.unsafe_coerce - let args = [ - package_id, - version, - url, - package_interface, - gleam_toml, - inserted_at, - ] "INSERT INTO package_release ( package_id, version, @@ -346,38 +352,43 @@ pub fn upsert_release( gleam_toml = $5, inserted_at = $6 RETURNING id, package_interface, gleam_toml" - |> pgo.execute( - db, - args, - dynamic.tuple3( - dynamic.int, - dynamic.optional(dynamic.string), - dynamic.optional(dynamic.string), - ), - ) + |> pog.query + |> pog.parameter(pog.int(package_id)) + |> pog.parameter(pog.text(release.version)) + |> pog.parameter(pog.text(release.url)) + |> pog.parameter(pog.nullable(pog.text, package_interface)) + |> pog.parameter(pog.nullable(pog.text, gleam_toml)) + |> pog.parameter({ + release.inserted_at + |> birl.to_erlang_universal_datetime + |> coerce + }) + |> pog.returning(dynamic.tuple3( + dynamic.int, + dynamic.optional(dynamic.string), + dynamic.optional(dynamic.string), + )) + |> pog.execute(db) |> result.map_error(error.DatabaseError) } pub fn lookup_release( - db: pgo.Connection, + db: pog.Connection, package_id: Int, release: hexpm.Release, ) { - let package_id = pgo.int(package_id) - let version = pgo.text(release.version) - let args = [package_id, version] "SELECT id, package_interface, gleam_toml - FROM package_release - WHERE package_id = $1 AND version = $2" - |> pgo.execute( - db, - args, - dynamic.tuple3( - dynamic.int, - dynamic.optional(dynamic.string), - dynamic.optional(dynamic.string), - ), - ) + FROM package_release + WHERE package_id = $1 AND version = $2" + |> pog.query + |> pog.parameter(pog.int(package_id)) + |> pog.parameter(pog.text(release.version)) + |> pog.returning(dynamic.tuple3( + dynamic.int, + dynamic.optional(dynamic.string), + dynamic.optional(dynamic.string), + )) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.try(fn(res) { res.rows @@ -387,84 +398,92 @@ pub fn lookup_release( } pub fn add_package_gleam_constraint( - db: pgo.Connection, + db: pog.Connection, constraint: String, release_id: Int, ) { - let constraint = pgo.text(constraint) - let release_id = pgo.int(release_id) "UPDATE package_release SET gleam_constraint = $1 WHERE id = $2" - |> pgo.execute(db, [constraint, release_id], dynamic.dynamic) + |> pog.query + |> pog.parameter(pog.text(constraint)) + |> pog.parameter(pog.int(release_id)) + |> pog.execute(db) |> result.replace(Nil) |> result.map_error(error.DatabaseError) } -pub fn add_package_gleam_retirement( - db: pgo.Connection, +pub fn add_package_retirement( + db: pog.Connection, retirement: hexpm.ReleaseRetirement, release_id: Int, ) { - let retirement = - json.object([ - #("message", json.nullable(retirement.message, json.string)), - #("reason", { - json.string(case retirement.reason { - hexpm.OtherReason -> "other-reason" - hexpm.Invalid -> "invalid" - hexpm.Security -> "security" - hexpm.Deprecated -> "deprecated" - hexpm.Renamed -> "renamed" - }) - }), - ]) - |> json.to_string() - |> pgo.text() - let release_id = pgo.int(release_id) "UPDATE package_release SET retirement = $1 WHERE id = $2" - |> pgo.execute(db, [retirement, release_id], dynamic.dynamic) + |> pog.query + |> pog.parameter(pog.text(encode_retirement(retirement))) + |> pog.parameter(pog.int(release_id)) + |> pog.execute(db) |> result.replace(Nil) |> result.map_error(error.DatabaseError) } +fn encode_retirement(retirement: hexpm.ReleaseRetirement) { + json.object([ + #("message", json.nullable(retirement.message, json.string)), + #("reason", { + json.string(case retirement.reason { + hexpm.OtherReason -> "other-reason" + hexpm.Invalid -> "invalid" + hexpm.Security -> "security" + hexpm.Deprecated -> "deprecated" + hexpm.Renamed -> "renamed" + }) + }), + ]) + |> json.to_string() +} + pub fn get_package_release_ids( - db: pgo.Connection, + db: pog.Connection, package: package_interface.Package, ) { - use response <- result.try({ - let args = [pgo.text(package.name), pgo.text(package.version)] - "SELECT - package.id package_id, - package_release.id package_release_id - FROM package - JOIN package_release - ON package_release.package_id = package.id - WHERE package.name = $1 - AND package_release.version = $2" - |> pgo.execute(db, args, dynamic.tuple2(dynamic.int, dynamic.int)) - |> result.map_error(error.DatabaseError) + "SELECT + package.id package_id, + package_release.id package_release_id + FROM package + JOIN package_release + ON package_release.package_id = package.id + WHERE package.name = $1 + AND package_release.version = $2" + |> pog.query + |> pog.parameter(pog.text(package.name)) + |> pog.parameter(pog.text(package.version)) + |> pog.returning(dynamic.tuple2(dynamic.int, dynamic.int)) + |> pog.execute(db) + |> result.map_error(error.DatabaseError) + |> result.try(fn(response) { + list.first(response.rows) + |> result.replace_error(error.UnknownError( + "No release found for " <> package.name <> "@" <> package.version, + )) }) - response.rows - |> list.first() - |> result.replace_error(error.UnknownError( - "No release found for " <> package.name <> "@" <> package.version, - )) } -pub fn upsert_package_module(db: pgo.Connection, module: context.Module) { +pub fn upsert_package_module(db: pog.Connection, module: context.Module) { use response <- result.try({ - let args = [ - pgo.text(module.name), - module.module.documentation - |> string.join("\n") - |> pgo.text(), - pgo.int(module.release_id), - ] "INSERT INTO package_module (name, documentation, package_release_id) VALUES ($1, $2, $3) ON CONFLICT (name, package_release_id) DO UPDATE SET documentation = $2 RETURNING id" - |> pgo.execute(db, args, dynamic.element(0, dynamic.int)) + |> pog.query + |> pog.parameter(pog.text(module.name)) + |> pog.parameter({ + module.module.documentation + |> string.join("\n") + |> pog.text() + }) + |> pog.parameter(pog.int(module.release_id)) + |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.execute(db) |> result.map_error(error.DatabaseError) }) response.rows @@ -486,7 +505,7 @@ fn implementations_pgo(implementations: package_interface.Implementations) { } pub fn upsert_package_type_fun_signature( - db db: pgo.Connection, + db db: pog.Connection, kind kind: SignatureKind, name name: String, documentation documentation: Option(String), @@ -498,12 +517,6 @@ pub fn upsert_package_type_fun_signature( deprecation deprecation: Option(package_interface.Deprecation), implementations implementations: Option(package_interface.Implementations), ) { - let kind = case kind { - Function -> "function" - TypeAlias -> "type_alias" - TypeDefinition -> "type_definition" - Constant -> "constant" - } "INSERT INTO package_type_fun_signature ( name, documentation, @@ -527,39 +540,47 @@ pub fn upsert_package_type_fun_signature( deprecation = $9, implementations = $10 RETURNING id" - |> pgo.execute( - db, - [ - pgo.text(name), - documentation - |> option.unwrap("") - |> string.trim() - |> pgo.text(), - pgo.text(signature), - json_signature - |> json.to_string() - |> pgo.text(), - pgo.text(kind), - dynamic.unsafe_coerce(dynamic.from(parameters)), - metadata - |> json.to_string() - |> pgo.text(), - pgo.int(module_id), - deprecation - |> option.map(fn(d) { d.message }) - |> pgo.nullable(pgo.text, _), - implementations - |> option.map(implementations_pgo) - |> option.map(pgo.text) - |> option.unwrap(pgo.null()), - ], - dynamic.element(0, dynamic.int), - ) + |> pog.query + |> pog.parameter(pog.text(name)) + |> pog.parameter({ + documentation + |> option.unwrap("") + |> string.trim() + |> pog.text() + }) + |> pog.parameter(pog.text(signature)) + |> pog.parameter(json_signature |> json.to_string() |> pog.text()) + |> pog.parameter(pog.text(kind_to_string(kind))) + |> pog.parameter(coerce(parameters)) + |> pog.parameter(metadata |> json.to_string() |> pog.text()) + |> pog.parameter(pog.int(module_id)) + |> pog.parameter({ + deprecation + |> option.map(fn(d) { d.message }) + |> pog.nullable(pog.text, _) + }) + |> pog.parameter({ + implementations + |> option.map(implementations_pgo) + |> option.map(pog.text) + |> option.unwrap(pog.null()) + }) + |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn find_similar_type_names(db: pgo.Connection, name: String) { +fn kind_to_string(kind: SignatureKind) -> String { + case kind { + Function -> "function" + TypeAlias -> "type_alias" + TypeDefinition -> "type_definition" + Constant -> "constant" + } +} + +pub fn find_similar_type_names(db: pog.Connection, name: String) { "SELECT * FROM (VALUES ('Int'), @@ -577,13 +598,15 @@ pub fn find_similar_type_names(db: pgo.Connection, name: String) { FROM package_type_fun_signature WHERE (kind = 'type_definition' OR kind = 'type_alias') AND levenshtein_less_equal(name, $1, 2) <= 2" - |> pgo.execute(db, [pgo.text(name)], dynamic.element(0, dynamic.string)) + |> pog.query + |> pog.parameter(pog.text(name)) + |> pog.returning(dynamic.element(0, dynamic.string)) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn name_search(db: pgo.Connection, query: String) { - let query = pgo.text(query) +pub fn name_search(db: pog.Connection, query: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, s.documentation, @@ -605,13 +628,15 @@ pub fn name_search(db: pgo.Connection, query: String) { WHERE s.name = $1 ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name LIMIT 100" - |> pgo.execute(db, [query], decode_type_search) + |> pog.query + |> pog.parameter(pog.text(query)) + |> pog.returning(decode_type_search) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn module_and_name_search(db: pgo.Connection, query: String) { - let query = pgo.text(query) +pub fn module_and_name_search(db: pog.Connection, query: String) { "WITH splitted_name AS (SELECT string_to_array($1, '.') AS full_name) SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, @@ -637,7 +662,10 @@ pub fn module_and_name_search(db: pgo.Connection, query: String) { AND m.name LIKE '%' || lower(s_n.full_name[1]) || '%' ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name LIMIT 100" - |> pgo.execute(db, [query], decode_type_search) + |> pog.query + |> pog.parameter(pog.text(query)) + |> pog.returning(decode_type_search) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } @@ -653,9 +681,7 @@ fn transform_query(q: String) { |> string.join(" ") } -pub fn content_search(db: pgo.Connection, query: String) { - let pattern = pgo.text(transform_query(query)) - let query = pgo.text(query) +pub fn content_search(db: pog.Connection, query: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, s.documentation, @@ -683,7 +709,11 @@ pub fn content_search(db: pgo.Connection, query: String) { ) ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name LIMIT 100" - |> pgo.execute(db, [query, pattern], decode_type_search) + |> pog.query + |> pog.parameter(pog.text(query)) + |> pog.parameter(pog.text(transform_query(query))) + |> pog.returning(decode_type_search) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } @@ -708,16 +738,15 @@ pub fn type_search_to_json(item) { #("name", json.string(a)), #("documentation", json.string(b)), #("kind", json.string(c)), - #("metadata", dynamic.unsafe_coerce(d)), - #("json_signature", dynamic.unsafe_coerce(e)), + #("metadata", coerce(d)), + #("json_signature", coerce(e)), #("module_name", json.string(f)), #("package_name", json.string(g)), #("version", json.string(h)), ]) } -pub fn signature_search(db: pgo.Connection, q: String) { - let query = pgo.text(q) +pub fn signature_search(db: pog.Connection, q: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, s.documentation, @@ -739,13 +768,15 @@ pub fn signature_search(db: pgo.Connection, q: String) { WHERE to_tsvector('english', s.signature_) @@ websearch_to_tsquery($1) ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name LIMIT 100" - |> pgo.execute(db, [query], decode_type_search) + |> pog.query + |> pog.parameter(pog.text(q)) + |> pog.returning(decode_type_search) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn documentation_search(db: pgo.Connection, q: String) { - let query = pgo.text(q) +pub fn documentation_search(db: pog.Connection, q: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, s.documentation, @@ -767,13 +798,15 @@ pub fn documentation_search(db: pgo.Connection, q: String) { WHERE to_tsvector('english', s.documentation) @@ websearch_to_tsquery($1) ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name LIMIT 100" - |> pgo.execute(db, [query], decode_type_search) + |> pog.query + |> pog.parameter(pog.text(q)) + |> pog.returning(decode_type_search) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn module_search(db: pgo.Connection, q: String) { - let query = pgo.text(q) +pub fn module_search(db: pog.Connection, q: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, s.documentation, @@ -804,12 +837,15 @@ pub fn module_search(db: pgo.Connection, q: String) { AND r.id = m.package_release_id ) ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name" - |> pgo.execute(db, [query], decode_type_search) + |> pog.query + |> pog.parameter(pog.text(q)) + |> pog.returning(decode_type_search) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn exact_type_search(db: pgo.Connection, q: List(Int)) { +pub fn exact_type_search(db: pog.Connection, q: List(Int)) { use <- bool.guard(when: list.is_empty(q), return: Ok([])) let ids = list.index_map(q, fn(_, idx) { "$" <> int.to_string(idx + 1) }) @@ -838,31 +874,44 @@ pub fn exact_type_search(db: pgo.Connection, q: List(Int)) { <> ") ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name" } - |> pgo.execute(db, list.map(q, pgo.int), decode_type_search) + |> pog.query + |> list.fold(q, _, fn(query, q) { pog.parameter(query, pog.int(q)) }) + |> pog.returning(decode_type_search) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn select_gleam_toml(db: pgo.Connection, offset: Int) { +pub fn select_gleam_toml(db: pog.Connection, offset: Int) { "SELECT gleam_toml FROM package_release WHERE gleam_toml IS NOT NULL ORDER BY id LIMIT 100 OFFSET $1" - |> pgo.execute(db, [pgo.int(offset)], dynamic.element(0, dynamic.string)) + |> pog.query + |> pog.parameter(pog.int(offset)) + |> pog.returning(dynamic.element(0, dynamic.string)) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -pub fn update_package_rank(db: pgo.Connection, package: String, rank: Int) { +pub fn update_package_rank(db: pog.Connection, package: String, rank: Int) { "UPDATE package SET rank = $2 WHERE name = $1" - |> pgo.execute(db, [pgo.text(package), pgo.int(rank)], dynamic.dynamic) + |> pog.query + |> pog.parameter(pog.text(package)) + |> pog.parameter(pog.int(rank)) + |> pog.returning(dynamic.dynamic) + |> pog.execute(db) |> result.map_error(error.DatabaseError) } -pub fn select_package_repository_address(db: pgo.Connection, offset: Int) { - let decoder = fn(dyn) { +pub fn select_package_repository_address(db: pog.Connection, offset: Int) { + "SELECT id, repository FROM package LIMIT 100 OFFSET $1" + |> pog.query + |> pog.parameter(pog.int(offset)) + |> pog.returning(fn(dyn) { dynamic.tuple2(dynamic.int, dynamic.optional(dynamic.string))(dyn) |> result.map(fn(content) { case content { @@ -870,30 +919,33 @@ pub fn select_package_repository_address(db: pgo.Connection, offset: Int) { #(_, None) -> None } }) - } - "SELECT id, repository FROM package LIMIT 100 OFFSET $1" - |> pgo.execute(db, [pgo.int(offset)], decoder) + }) + |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } pub fn update_package_popularity( - db: pgo.Connection, + db: pog.Connection, url: String, popularity: Dict(String, Int), ) { - let popularity = + "UPDATE package SET popularity = $2 WHERE repository = $1" + |> pog.query + |> pog.parameter(pog.text(url)) + |> pog.parameter({ dict.to_list(popularity) |> list.map(pair.map_second(_, json.int)) |> json.object() |> json.to_string() - |> pgo.text() - "UPDATE package SET popularity = $2 WHERE repository = $1" - |> pgo.execute(db, [pgo.text(url), popularity], dynamic.dynamic) + |> pog.text() + }) + |> pog.returning(dynamic.dynamic) + |> pog.execute(db) |> result.map_error(error.DatabaseError) } -pub fn select_package_by_popularity(db: pgo.Connection, page: Int) { +pub fn select_package_by_popularity(db: pog.Connection, page: Int) { let offset = 40 * page "SELECT name, @@ -909,37 +961,36 @@ pub fn select_package_by_popularity(db: pgo.Connection, page: Int) { ORDER BY popularity -> 'github' DESC LIMIT 40 OFFSET $1" - |> pgo.execute( - db, - [pgo.int(offset)], - dynamic.decode8( - fn(a, b, c, d, e, f, g, h) { - json.object([ - #("name", json.string(a)), - #("repository", json.nullable(b, json.string)), - #("documentation", json.nullable(c, json.string)), - #("hex-url", json.nullable(d, json.string)), - #("licenses", json.string(e)), - #("description", json.nullable(f, json.string)), - #("rank", json.int(g)), - #("popularity", json.nullable(h, json.string)), - ]) - }, - dynamic.element(0, dynamic.string), - dynamic.element(1, dynamic.optional(dynamic.string)), - dynamic.element(2, dynamic.optional(dynamic.string)), - dynamic.element(3, dynamic.optional(dynamic.string)), - dynamic.element(4, dynamic.string), - dynamic.element(5, dynamic.optional(dynamic.string)), - dynamic.element(6, dynamic.int), - dynamic.element(7, dynamic.optional(dynamic.string)), - ), - ) + |> pog.query + |> pog.parameter(pog.int(offset)) + |> pog.returning(dynamic.decode8( + fn(a, b, c, d, e, f, g, h) { + json.object([ + #("name", json.string(a)), + #("repository", json.nullable(b, json.string)), + #("documentation", json.nullable(c, json.string)), + #("hex-url", json.nullable(d, json.string)), + #("licenses", json.string(e)), + #("description", json.nullable(f, json.string)), + #("rank", json.int(g)), + #("popularity", json.nullable(h, json.string)), + ]) + }, + dynamic.element(0, dynamic.string), + dynamic.element(1, dynamic.optional(dynamic.string)), + dynamic.element(2, dynamic.optional(dynamic.string)), + dynamic.element(3, dynamic.optional(dynamic.string)), + dynamic.element(4, dynamic.string), + dynamic.element(5, dynamic.optional(dynamic.string)), + dynamic.element(6, dynamic.int), + dynamic.element(7, dynamic.optional(dynamic.string)), + )) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } -pub fn select_package_by_updated_at(db: pgo.Connection) { +pub fn select_package_by_updated_at(db: pog.Connection) { "SELECT name, repository, @@ -951,60 +1002,62 @@ pub fn select_package_by_updated_at(db: pgo.Connection) { popularity FROM package ORDER BY updated_at DESC" - |> pgo.execute( - db, - [], - dynamic.decode8( - fn(a, b, c, d, e, f, g, h) { - json.object([ - #("name", json.string(a)), - #("repository", json.nullable(b, json.string)), - #("documentation", json.nullable(c, json.string)), - #("hex-url", json.nullable(d, json.string)), - #("licenses", json.string(e)), - #("description", json.nullable(f, json.string)), - #("rank", json.int(g)), - #("popularity", json.nullable(h, json.string)), - ]) - }, - dynamic.element(0, dynamic.string), - dynamic.element(1, dynamic.optional(dynamic.string)), - dynamic.element(2, dynamic.optional(dynamic.string)), - dynamic.element(3, dynamic.optional(dynamic.string)), - dynamic.element(4, dynamic.string), - dynamic.element(5, dynamic.optional(dynamic.string)), - dynamic.element(6, dynamic.int), - dynamic.element(7, dynamic.optional(dynamic.string)), - ), - ) + |> pog.query + |> pog.returning(dynamic.decode8( + fn(a, b, c, d, e, f, g, h) { + json.object([ + #("name", json.string(a)), + #("repository", json.nullable(b, json.string)), + #("documentation", json.nullable(c, json.string)), + #("hex-url", json.nullable(d, json.string)), + #("licenses", json.string(e)), + #("description", json.nullable(f, json.string)), + #("rank", json.int(g)), + #("popularity", json.nullable(h, json.string)), + ]) + }, + dynamic.element(0, dynamic.string), + dynamic.element(1, dynamic.optional(dynamic.string)), + dynamic.element(2, dynamic.optional(dynamic.string)), + dynamic.element(3, dynamic.optional(dynamic.string)), + dynamic.element(4, dynamic.string), + dynamic.element(5, dynamic.optional(dynamic.string)), + dynamic.element(6, dynamic.int), + dynamic.element(7, dynamic.optional(dynamic.string)), + )) + |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } pub fn insert_analytics( - db: pgo.Connection, + db: pog.Connection, id: Int, table_name: String, content: Dict(String, Int), ) { - let day = - birl.now() - |> birl.to_erlang_universal_datetime() - |> pair.map_second(fn(_) { #(0, 0, 0) }) - |> dynamic.from() - |> dynamic.unsafe_coerce() - let content = + "INSERT INTO analytics (foreign_id, table_name, content, day) + VALUES ($1, $2, $3, $4) + ON CONFLICT (foreign_id, table_name, day) DO UPDATE + SET content = $3" + |> pog.query + |> pog.parameter(pog.int(id)) + |> pog.parameter(pog.text(table_name)) + |> pog.parameter({ content |> dict.to_list() |> list.map(pair.map_second(_, json.int)) |> json.object() |> json.to_string() - |> pgo.text() - let parameters = [pgo.int(id), pgo.text(table_name), content, day] - "INSERT INTO analytics (foreign_id, table_name, content, day) - VALUES ($1, $2, $3, $4) - ON CONFLICT (foreign_id, table_name, day) DO UPDATE - SET content = $3" - |> pgo.execute(db, parameters, dynamic.dynamic) + |> pog.text() + }) + |> pog.parameter({ + birl.now() + |> birl.to_erlang_universal_datetime() + |> pair.map_second(fn(_) { #(0, 0, 0) }) + |> coerce + }) + |> pog.returning(dynamic.dynamic) + |> pog.execute(db) |> result.map_error(error.DatabaseError) } diff --git a/apps/backend/src/backend/router.gleam b/apps/backend/src/backend/router.gleam index e3fdc0b..5c57d6e 100644 --- a/apps/backend/src/backend/router.gleam +++ b/apps/backend/src/backend/router.gleam @@ -1,5 +1,5 @@ import api/hex -import backend/config.{type Context} +import backend/context.{type Context} import backend/error import backend/gleam/type_search/msg as type_search import backend/postgres/queries @@ -13,14 +13,14 @@ import gleam/json import gleam/list import gleam/option import gleam/result -import gleam/string_builder +import gleam/string_tree import tasks/hex as syncing import wisp.{type Request, type Response} fn empty_json() { let content = "{}" content - |> string_builder.from_string() + |> string_tree.from_string() |> wisp.json_response(200) } @@ -50,18 +50,18 @@ fn search(query: String, ctx: Context) { |> result.map_error(error.debug_log) |> result.unwrap([]) |> list.filter(fn(i) { - !list.contains(list.concat([exact_type_searches, exact_name_matches]), i) + !list.contains(list.flatten([exact_type_searches, exact_name_matches]), i) }) let exact_matches = - list.concat([exact_name_matches, exact_module_and_name_matches]) + list.flatten([exact_name_matches, exact_module_and_name_matches]) let matches = queries.content_search(ctx.db, query) |> result.map_error(error.debug_log) |> result.unwrap([]) |> list.filter(fn(i) { - !list.contains(list.concat([exact_matches, exact_type_searches]), i) + !list.contains(list.flatten([exact_matches, exact_type_searches]), i) }) let signature_searches = @@ -70,7 +70,7 @@ fn search(query: String, ctx: Context) { |> result.unwrap([]) |> list.filter(fn(i) { !list.contains( - list.concat([exact_matches, exact_type_searches, matches]), + list.flatten([exact_matches, exact_type_searches, matches]), i, ) }) @@ -81,7 +81,7 @@ fn search(query: String, ctx: Context) { |> result.unwrap([]) |> list.filter(fn(i) { !list.contains( - list.concat([ + list.flatten([ exact_matches, exact_type_searches, matches, @@ -97,7 +97,7 @@ fn search(query: String, ctx: Context) { |> result.unwrap([]) |> list.filter(fn(i) { !list.contains( - list.concat([ + list.flatten([ exact_matches, exact_type_searches, matches, diff --git a/apps/backend/src/setup.gleam b/apps/backend/src/backend/setup.gleam similarity index 89% rename from apps/backend/src/setup.gleam rename to apps/backend/src/backend/setup.gleam index 661df93..2e94433 100644 --- a/apps/backend/src/setup.gleam +++ b/apps/backend/src/backend/setup.gleam @@ -1,4 +1,4 @@ -import backend/config +import backend/context import radiate import wisp @@ -7,7 +7,7 @@ fn print_radiate_update(_state: state, path: String) { } pub fn radiate() { - case config.is_dev() { + case context.is_dev() { False -> Nil True -> { let assert Ok(_) = diff --git a/apps/backend/src/backend/web.gleam b/apps/backend/src/backend/web.gleam index e7b117e..29aa89a 100644 --- a/apps/backend/src/backend/web.gleam +++ b/apps/backend/src/backend/web.gleam @@ -1,4 +1,4 @@ -import backend/config +import backend/context import cors_builder as cors_ import gleam/http import wisp.{type Request, type Response} @@ -14,14 +14,7 @@ pub fn foundations(req: Request, handler: Handler) -> Response { } pub fn cors() { - let origin = case config.is_dev() { - True -> cors_.allow_origin(_, "http://localhost:5173") - False -> fn(cors) { - cors - |> cors_.allow_origin("https://gloogle.run") - |> cors_.allow_origin("https://www.gloogle.run") - } - } + let origin = select_origin() cors_.new() |> origin() |> cors_.allow_method(http.Get) @@ -32,3 +25,16 @@ pub fn cors() { |> cors_.allow_header("sentry-trace") |> cors_.max_age(86_400) } + +fn select_origin() { + case context.read_environment() { + context.Development -> cors_.allow_origin(_, "http://localhost:5173") + context.Production -> allow_production + } +} + +fn allow_production(cors: cors_.Cors) -> cors_.Cors { + cors + |> cors_.allow_origin("https://gloogle.run") + |> cors_.allow_origin("https://www.gloogle.run") +} diff --git a/apps/backend/src/backend/workers.gleam b/apps/backend/src/backend/workers.gleam new file mode 100644 index 0000000..439a4f4 --- /dev/null +++ b/apps/backend/src/backend/workers.gleam @@ -0,0 +1,35 @@ +import gleam/function +import gleam/otp/supervisor +import processes/periodic +import tasks/hex +import tasks/popularity +import tasks/ranking +import tasks/timeseries + +pub fn sync_new_gleam_releases_ten_secondly(ctx, children) { + use <- add_periodic_worker(children, waiting: 10_000) + hex.sync_new_gleam_releases(ctx) +} + +pub fn compute_ranking_daily(ctx, children) { + use <- add_periodic_worker(children, waiting: 86_400_000) + ranking.compute_ranking(ctx) +} + +pub fn compute_popularity_daily(ctx, children) { + use <- add_periodic_worker(children, waiting: 86_400_000) + popularity.compute_popularity(ctx) +} + +pub fn store_timeseries_hourly(ctx, children) { + use <- add_periodic_worker(children, waiting: 3_600_000) + timeseries.store_timeseries(ctx) +} + +fn add_periodic_worker(children, waiting delay, do work) { + use _ <- function.tap(children) + supervisor.add(children, { + use _ <- supervisor.worker() + periodic.periodically(do: work, waiting: delay) + }) +} diff --git a/apps/backend/src/gloogle_hex_ffi.erl b/apps/backend/src/backend_ffi.erl similarity index 76% rename from apps/backend/src/gloogle_hex_ffi.erl rename to apps/backend/src/backend_ffi.erl index aed54c9..6c46943 100644 --- a/apps/backend/src/gloogle_hex_ffi.erl +++ b/apps/backend/src/backend_ffi.erl @@ -1,5 +1,6 @@ --module(gloogle_hex_ffi). --export([extract_tar/4, remove_tar/1, is_match/2, get_home/0, set_level/1]). +-module(backend_ffi). + +-export([extract_tar/4, remove_tar/1, is_match/2, get_home/0, set_level/1, coerce/1]). package_interface_path(ContentDest, BaseName) -> BuildFolder = <<"/build/dev/docs/">>, @@ -20,14 +21,22 @@ extract_tar(Binary, BaseName, Version, Slug) -> ContentDest = <>, Content = <>, case erl_tar:extract({binary, Binary}, [{cwd, PackagePath}]) of - {error, _} -> {error, nil}; + {error, _} -> + {error, nil}; _ -> - Url = <<"https://hexdocs.pm/", BaseName/binary, "/", Version/binary, "/package-interface.json">>, + Url = + <<"https://hexdocs.pm/", + BaseName/binary, + "/", + Version/binary, + "/package-interface.json">>, erl_tar:extract(Content, [{cwd, ContentDest}, compressed]), {PackageInterface, Result} = case httpc:request(Url) of - {ok, {{_, 200, _}, _, HttpBody}} -> save_file(ContentDest, HttpBody); - {ok, {200, HttpBody}} -> save_file(ContentDest, HttpBody); + {ok, {{_, 200, _}, _, HttpBody}} -> + save_file(ContentDest, HttpBody); + {ok, {200, HttpBody}} -> + save_file(ContentDest, HttpBody); {error, _} -> BuildCmd = <<"cd ", ContentDest/binary, " && gleam docs build">>, Res = os:cmd(binary_to_list(BuildCmd)), @@ -45,15 +54,22 @@ remove_tar(Slug) -> is_match(Version, Requirement) -> case verl:is_match(Version, Requirement) of - {error, _} -> {error, nil}; - Bool -> {ok, Bool} + {error, _} -> + {error, nil}; + Bool -> + {ok, Bool} end. get_home() -> case init:get_argument(home) of - {ok, Content} -> {ok, unicode:characters_to_binary(Content)}; - error -> {error, nil} + {ok, Content} -> + {ok, unicode:characters_to_binary(Content)}; + error -> + {error, nil} end. set_level(Level) -> logger:set_primary_config(level, Level). + +coerce(A) -> + A. diff --git a/apps/backend/src/gleam/verl.gleam b/apps/backend/src/gleam/verl.gleam index ca41040..250edda 100644 --- a/apps/backend/src/gleam/verl.gleam +++ b/apps/backend/src/gleam/verl.gleam @@ -1,4 +1,4 @@ -@external(erlang, "gloogle_hex_ffi", "is_match") +@external(erlang, "backend_ffi", "is_match") pub fn is_match( version version: BitArray, requirement requirement: BitArray, diff --git a/apps/backend/src/helpers.gleam b/apps/backend/src/helpers.gleam index ed4b920..a790c60 100644 --- a/apps/backend/src/helpers.gleam +++ b/apps/backend/src/helpers.gleam @@ -5,14 +5,16 @@ import gleam/float import gleam/json import gleam/list import gleam/pair -import gleam/pgo import gleam/result +import pog -pub fn convert_time(time: Time) -> pgo.Value { +@external(erlang, "backend_ffi", "coerce") +fn coerce(a: a) -> b + +pub fn convert_time(time: Time) -> pog.Value { time - |> birl.to_erlang_universal_datetime() - |> dynamic.from() - |> dynamic.unsafe_coerce() + |> birl.to_erlang_universal_datetime + |> coerce } pub fn decode_time(data: Dynamic) { diff --git a/apps/backend/src/periodic.gleam b/apps/backend/src/processes/periodic.gleam similarity index 100% rename from apps/backend/src/periodic.gleam rename to apps/backend/src/processes/periodic.gleam diff --git a/apps/backend/src/processes/retrier.gleam b/apps/backend/src/processes/retrier.gleam new file mode 100644 index 0000000..2ee1c0f --- /dev/null +++ b/apps/backend/src/processes/retrier.gleam @@ -0,0 +1,75 @@ +import backend/error.{type Error} +import gleam/bool +import gleam/erlang/process.{type Subject} +import gleam/function +import gleam/iterator.{type Iterator} +import gleam/otp/actor +import prng/random +import wisp + +pub opaque type Message { + Rerun +} + +type State(a) { + State( + self: Subject(Message), + work: fn(Int) -> Result(a, Error), + random_ints: Iterator(Int), + interval: Int, + iterations: Int, + ) +} + +pub const one_minute: Int = 60_000 + +fn enqueue_next_rerun(state: State(a)) { + let assert iterator.Next(cooldown, acc) = iterator.step(state.random_ints) + process.send_after(state.self, state.interval + cooldown, Rerun) + State(..state, random_ints: acc) +} + +/// Repeatedly call a function, leaving `interval` milliseconds between each call. +/// When the `work` function returns an error, it is printed. +pub fn retry(do work: fn(Int) -> Result(a, Error)) { + let _ = start_retrier(work) + Nil +} + +fn start_retrier(work: fn(Int) -> Result(a, Error)) { + fn() { init(every: one_minute, do: work) } + |> actor.Spec(loop:, init_timeout: 100) + |> actor.start_spec +} + +fn init( + every interval: Int, + do work: fn(Int) -> Result(a, Error), +) -> actor.InitResult(State(a), Message) { + let self = process.new_subject() + let random_ints = random.to_random_iterator(random.int(1000, 5000)) + let state = State(self:, work:, interval:, iterations: 10, random_ints:) + process.new_selector() + |> process.selecting(self, function.identity) + |> actor.Ready(state, _) + |> function.tap(fn(_) { process.send(state.self, Rerun) }) +} + +fn loop(message: Message, state: State(a)) -> actor.Next(Message, State(a)) { + case message, state.work(state.iterations) { + Rerun, Ok(_) -> actor.Stop(process.Normal) + Rerun, Error(error) -> { + wisp.log_notice("Process on error") + error.log_error(error) + use <- bool.lazy_guard(when: state.iterations == 0, return: stop_process) + State(..state, iterations: state.iterations - 1) + |> enqueue_next_rerun() + |> actor.continue() + } + } +} + +fn stop_process() { + wisp.log_notice("Stopping process after 10 iterations") + actor.Stop(process.Normal) +} diff --git a/apps/backend/src/retrier.gleam b/apps/backend/src/retrier.gleam deleted file mode 100644 index 1453bd6..0000000 --- a/apps/backend/src/retrier.gleam +++ /dev/null @@ -1,84 +0,0 @@ -import backend/error.{type Error} -import gleam/erlang/process.{type Subject} -import gleam/function -import gleam/iterator.{type Iterator} -import gleam/otp/actor -import prng/random -import wisp - -pub opaque type Message { - Rerun -} - -type State(a) { - State( - self: Subject(Message), - work: fn(Int) -> Result(a, Error), - random_ints: Iterator(Int), - interval: Int, - iterations: Int, - ) -} - -pub const one_minute: Int = 60_000 - -fn enqueue_next_rerun(state: State(a)) { - let assert iterator.Next(cooldown, acc) = iterator.step(state.random_ints) - process.send_after(state.self, state.interval + cooldown, Rerun) - State(..state, random_ints: acc) -} - -/// Repeatedly call a function, leaving `interval` milliseconds between each call. -/// When the `work` function returns an error it is printed. -pub fn retry( - do work: fn(Int) -> Result(a, Error), -) -> Result(Subject(Message), actor.StartError) { - fn() { init(one_minute, work) } - |> actor.Spec(loop: loop, init_timeout: 100) - |> actor.start_spec() -} - -fn init( - interval: Int, - work: fn(Int) -> Result(a, Error), -) -> actor.InitResult(State(a), Message) { - let subject = process.new_subject() - let random_ints = random.to_random_iterator(random.int(1000, 5000)) - let state = - State( - self: subject, - work: work, - interval: interval, - iterations: 10, - random_ints: random_ints, - ) - process.new_selector() - |> process.selecting(subject, function.identity) - |> actor.Ready(state, _) - |> function.tap(fn(_) { process.send(state.self, Rerun) }) -} - -fn loop(message: Message, state: State(a)) -> actor.Next(Message, State(a)) { - case message { - Rerun -> { - case state.work(state.iterations) { - Ok(_) -> actor.Stop(process.Normal) - Error(error) -> { - wisp.log_notice("Process on error") - error.log_error(error) - case state.iterations == 0 { - True -> { - wisp.log_notice("Stopping process after 10 iterations") - actor.Stop(process.Normal) - } - False -> { - State(..state, iterations: state.iterations - 1) - |> enqueue_next_rerun() - |> actor.continue() - } - } - } - } - } - } -} diff --git a/apps/backend/src/tasks/hex.gleam b/apps/backend/src/tasks/hex.gleam index 94ae811..5990189 100644 --- a/apps/backend/src/tasks/hex.gleam +++ b/apps/backend/src/tasks/hex.gleam @@ -1,14 +1,15 @@ import api/hex as api import api/hex_repo import api/signatures -import backend/config.{type Context} +import backend/context.{type Context} import backend/data/hex_read.{type HexRead} import backend/error.{type Error} -import backend/gleam/context +import backend/gleam/context as gcontext import backend/gleam/type_search/msg as type_search import backend/postgres/queries import birl.{type Time} import birl/duration +import gleam/bool import gleam/erlang/process.{type Subject} import gleam/function import gleam/hexpm.{type Package} @@ -16,11 +17,10 @@ import gleam/int import gleam/list import gleam/option.{type Option, None, Some} import gleam/order -import gleam/otp/supervisor -import gleam/pgo import gleam/result import gleam/string -import retrier +import pog +import processes/retrier import wisp type State { @@ -30,29 +30,30 @@ type State { newest: Time, hex_api_key: String, last_logged: Time, - db: pgo.Connection, + db: pog.Connection, type_search_subject: Option(Subject(type_search.Msg)), ) } -pub fn sync_new_gleam_releases( - ctx: Context, - children: supervisor.Children(Nil), -) -> Result(HexRead, Error) { +type WorkMode { + WorkAsync + WorkSync +} + +pub fn sync_new_gleam_releases(ctx: Context) -> Result(HexRead, Error) { wisp.log_info("Syncing new releases from Hex") use limit <- result.try(queries.get_last_hex_date(ctx.db)) - use latest <- result.try(sync_packages( - State( + use latest <- result.try({ + sync_packages(State( page: 1, - limit: limit, + limit:, newest: limit, hex_api_key: ctx.hex_api_key, last_logged: birl.now(), db: ctx.db, type_search_subject: ctx.type_search_subject, - ), - children, - )) + )) + }) let latest = queries.upsert_most_recent_hex_timestamp(ctx.db, latest) wisp.log_info("") wisp.log_info("Up to date!") @@ -73,10 +74,7 @@ fn first_timestamp(packages: List(hexpm.Package), state: State) -> Time { |> result.unwrap(state.newest) } -fn sync_packages( - state: State, - children: supervisor.Children(Nil), -) -> Result(Time, Error) { +fn sync_packages(state: State) -> Result(Time, Error) { let page = state.page let api_key = state.hex_api_key use all_packages <- result.try(api.get_api_packages_page(page, api_key)) @@ -84,56 +82,52 @@ fn sync_packages( let new_packages = take_fresh_packages(all_packages, state.limit) use state <- result.try({ list.try_fold(new_packages, state, { - do_sync_package(Some(children), force: False) + do_sync_package(WorkAsync, force: False) }) }) case list.length(all_packages) == list.length(new_packages) { _ if all_packages == [] -> Ok(state.newest) False -> Ok(state.newest) - True -> sync_packages(State(..state, page: state.page + 1), children) + True -> sync_packages(State(..state, page: state.page + 1)) } } +pub fn sync_package(ctx: Context, package: hexpm.Package) { + State( + page: -1, + limit: birl.now(), + newest: birl.now(), + hex_api_key: ctx.hex_api_key, + last_logged: birl.now(), + db: ctx.db, + type_search_subject: ctx.type_search_subject, + ) + |> do_sync_package(WorkSync, force: True)(package) + |> result.replace_error(error.EmptyError) + |> result.replace(Nil) +} + fn do_sync_package( - children: Option(supervisor.Children(Nil)), + work_mode work_mode: WorkMode, force force_old_release_update: Bool, ) { fn(state: State, package: hexpm.Package) -> Result(State, Error) { let secret = state.hex_api_key - use releases <- result.try(lookup_gleam_releases(package, secret: secret)) - case releases { - [] -> Ok(log_if_needed(state, package.updated_at)) - _ -> { - use _ <- result.map(insert_package_and_releases( - package, - releases, - state, - children, - force_old_release_update, - )) - State(..state, last_logged: birl.now()) - } - } + use releases <- result.try(lookup_gleam_releases(package, secret:)) + use <- bool.lazy_guard(when: list.is_empty(releases), return: fn() { + Ok(log_if_needed(state, package.updated_at)) + }) + use _ <- result.map(insert_package_and_releases( + package, + releases, + state, + work_mode, + force_old_release_update, + )) + State(..state, last_logged: birl.now()) } } -pub fn sync_package(ctx: Context, package: hexpm.Package) { - do_sync_package(None, force: True)( - State( - page: -1, - limit: birl.now(), - newest: birl.now(), - hex_api_key: ctx.hex_api_key, - last_logged: birl.now(), - db: ctx.db, - type_search_subject: ctx.type_search_subject, - ), - package, - ) - |> result.replace_error(error.EmptyError) - |> result.replace(Nil) -} - fn log_retirement_data(release: String, retirement: hexpm.ReleaseRetirement) { wisp.log_info("Release " <> release <> " is retired.") case retirement.message { @@ -169,9 +163,8 @@ fn extract_release_interfaces_from_hex( use data <- result.map({ hex_repo.get_package_infos(package.name, release.version) }) - let interface = Some(data.2) - let toml = Some(data.3) - let _ = queries.upsert_release(state.db, id, release, interface, toml) + let _ = + queries.upsert_release(state.db, id, release, Some(data.2), Some(data.3)) #(data.0, data.1) } @@ -204,8 +197,7 @@ fn save_retirement_data( option.Some(retirement) -> { let release = package.name <> " v" <> release.version log_retirement_data(release, retirement) - let _ = - queries.add_package_gleam_retirement(state.db, retirement, release_id) + let _ = queries.add_package_retirement(state.db, retirement, release_id) Nil } } @@ -215,7 +207,7 @@ fn insert_package_and_releases( package: hexpm.Package, releases: List(hexpm.Release), state: State, - children: Option(supervisor.Children(Nil)), + work_async: WorkMode, force_old_release_update: Bool, ) { let secret = state.hex_api_key @@ -246,23 +238,18 @@ fn insert_package_and_releases( wisp.log_debug("Handling release " <> r.version) use interfaces <- result.map(extract_release_interfaces_from_db(state, id, r)) save_retirement_data(state, interfaces.0, package, r) - let _ = case children { - None -> { + case work_async { + WorkSync -> { let _ = do_extract_package(state, id, r, package, interfaces, False) Nil } - Some(children) -> { - supervisor.add(children, { - use _ <- supervisor.worker() - use iterations <- retrier.retry() - let it = int.to_string(iterations) - wisp.log_notice("Trying iteration " <> it <> " for " <> release) - do_extract_package(state, id, r, package, interfaces, iterations == 0) - }) - Nil + WorkAsync -> { + use iterations <- retrier.retry + let it = int.to_string(iterations) + wisp.log_notice("Trying iteration " <> it <> " for " <> release) + do_extract_package(state, id, r, package, interfaces, iterations == 0) } } - Nil } fn do_extract_package( @@ -271,17 +258,17 @@ fn do_extract_package( release: hexpm.Release, package: hexpm.Package, interfaces: #(Int, Option(String), Option(String)), - ignore_errors: Bool, + ignore_parameters_errors: Bool, ) { - use #(package, gleam_toml) <- result.try({ + use #(package_interface, gleam_toml) <- result.try({ extract_release_interfaces(state, id, package, release, interfaces) }) - context.Context( - state.db, - package, - gleam_toml, - ignore_errors, - state.type_search_subject, + gcontext.Context( + db: state.db, + package_interface:, + gleam_toml:, + ignore_parameters_errors:, + type_search_subject: state.type_search_subject, ) |> signatures.extract_signatures() |> result.map(fn(content) { @@ -295,22 +282,21 @@ fn lookup_gleam_releases( package: hexpm.Package, secret hex_api_key: String, ) -> Result(List(hexpm.Release), Error) { - let lookup = - list.try_map(package.releases, api.lookup_release(_, hex_api_key)) - use releases <- result.map(lookup) - list.filter(releases, fn(r) { list.contains(r.meta.build_tools, "gleam") }) + package.releases + |> list.try_map(api.lookup_release(_, hex_api_key)) + |> result.map(fn(releases) { + use release <- list.filter(releases) + list.contains(release.meta.build_tools, "gleam") + }) } fn log_if_needed(state: State, time: Time) -> State { let interval = duration.new([#(5, duration.Second)]) let print_deadline = birl.add(state.last_logged, interval) - case birl.compare(print_deadline, birl.now()) == order.Lt { - False -> state - True -> { - wisp.log_info("Still syncing, up to " <> birl.to_iso8601(time)) - State(..state, last_logged: birl.now()) - } - } + let should_log = birl.compare(print_deadline, birl.now()) == order.Lt + use <- bool.guard(when: !should_log, return: state) + wisp.log_info("Still syncing, up to " <> birl.to_iso8601(time)) + State(..state, last_logged: birl.now()) } pub fn take_fresh_packages(packages: List(Package), limit: Time) { diff --git a/apps/backend/src/tasks/popularity.gleam b/apps/backend/src/tasks/popularity.gleam index 86fdd49..c2d3bb1 100644 --- a/apps/backend/src/tasks/popularity.gleam +++ b/apps/backend/src/tasks/popularity.gleam @@ -1,5 +1,5 @@ import api/github -import backend/config.{type Context} +import backend/context.{type Context} import backend/postgres/queries import gleam/bool import gleam/dict @@ -11,8 +11,8 @@ import wisp pub fn compute_popularity(ctx: Context) { case ctx.env { - config.Development -> Ok(Nil) - config.Production -> { + context.Development -> Ok(Nil) + context.Production -> { wisp.log_info("Syncing popularity") do_compute_popularity(ctx, offset: 0) |> function.tap(fn(_) { wisp.log_info("Syncing popularity finished!") }) diff --git a/apps/backend/src/tasks/ranking.gleam b/apps/backend/src/tasks/ranking.gleam index a06f06e..22fbe40 100644 --- a/apps/backend/src/tasks/ranking.gleam +++ b/apps/backend/src/tasks/ranking.gleam @@ -1,4 +1,4 @@ -import backend/config.{type Context} +import backend/context.{type Context} import backend/error.{type Error} import backend/postgres/queries import gleam/dict.{type Dict} @@ -52,7 +52,7 @@ fn get_dependencies(toml: Dict(String, tom.Toml)) { fn add_dependencies(in usages: Usages, from toml: Dict(String, tom.Toml)) { use usages, dep <- list.fold(from: usages, over: get_dependencies(toml)) - dict.update(usages, dep, fn(value) { option.unwrap(value, 0) + 1 }) + dict.upsert(usages, dep, fn(value) { option.unwrap(value, 0) + 1 }) } fn save_packages_rank(ctx: Context, usages: Usages) { diff --git a/apps/backend/src/tasks/timeseries.gleam b/apps/backend/src/tasks/timeseries.gleam index 252bed4..aaf2c5f 100644 --- a/apps/backend/src/tasks/timeseries.gleam +++ b/apps/backend/src/tasks/timeseries.gleam @@ -1,4 +1,4 @@ -import backend/config.{type Context} +import backend/context.{type Context} import backend/error import backend/postgres/queries import gleam/function @@ -10,12 +10,9 @@ pub fn store_timeseries(ctx: Context) { wisp.log_info("Storing analytics timeseries") let query = queries.select_last_day_search_analytics(ctx.db) use analytics <- result.try(query) - use _ <- function.tap({ - result.all({ - use analytic <- list.map(analytics) - queries.upsert_search_analytics_timeseries(ctx.db, analytic) - }) - |> result.map_error(error.debug_log) - }) - wisp.log_info("Storing analytics finished!") + analytics + |> list.map(queries.upsert_search_analytics_timeseries(ctx.db, _)) + |> result.all + |> result.map_error(error.debug_log) + |> function.tap(fn(_) { wisp.log_info("Storing analytics finished!") }) } diff --git a/apps/backend/src/wisp/logger.gleam b/apps/backend/src/wisp/logger.gleam index c9325a1..3208016 100644 --- a/apps/backend/src/wisp/logger.gleam +++ b/apps/backend/src/wisp/logger.gleam @@ -1,4 +1,6 @@ +import envoy import gleam +import gleam/result import gleam/string pub type Level { @@ -12,10 +14,16 @@ pub type Level { Debug } -@external(erlang, "gloogle_hex_ffi", "set_level") +@external(erlang, "backend_ffi", "set_level") pub fn set_level(level: Level) -> Nil -pub fn parse(level: String) -> Result(Level, Nil) { +pub fn read_level() { + envoy.get("LOG_LEVEL") + |> result.try(parse) + |> result.unwrap(Info) +} + +fn parse(level: String) -> Result(Level, Nil) { case string.lowercase(level) { "emergency" -> Ok(Emergency) "alert" -> Ok(Alert) diff --git a/apps/backend/test/backend_test.gleam b/apps/backend/test/backend_test.gleam index 4ad1a9e..4f2f121 100644 --- a/apps/backend/test/backend_test.gleam +++ b/apps/backend/test/backend_test.gleam @@ -1,13 +1,13 @@ import backend/gleam/parse import backend/gleam/type_search -import gleam/erlang/os +import envoy import gleam/function import gleam/int import gleam/option -import gleam/pgo import gleam/result import gleeunit import gleeunit/should +import pog const signature = "fn use_callback(a, b) -> c" @@ -18,24 +18,30 @@ pub fn main() { } fn postgres_connect() { - let host = os.get_env("POSTGRES_HOST") |> result.unwrap("localhost") - pgo.Config( - ..pgo.default_config(), + let host = envoy.get("POSTGRES_HOST") |> result.unwrap("localhost") + pog.Config( + ..pog.default_config(), host: host, database: "gloogle", user: "gloogle", password: option.Some("gloogle"), ssl: False, ) - |> pgo.connect + |> pog.connect } // gleeunit test functions end in `_test` pub fn type_search_test() { let db = postgres_connect() let index = int.random(1000) - use kind <- result.try(parse.parse_function(signature) |> result.nil_error) - use skind <- result.try(parse.parse_function(search_test) |> result.nil_error) + use kind <- result.try({ + parse.parse_function(signature) + |> result.replace_error(Nil) + }) + use skind <- result.try({ + parse.parse_function(search_test) + |> result.replace_error(Nil) + }) let search = type_search.add(type_search.empty(), kind, index) type_search.find(search, skind, db) |> function.tap(should.equal(_, Ok([index]))) diff --git a/packages/lustre/examples/99-full-stack-applications/client/src/app.gleam b/packages/lustre/examples/99-full-stack-applications/client/src/app.gleam index aae4530..9f1dc27 100644 --- a/packages/lustre/examples/99-full-stack-applications/client/src/app.gleam +++ b/packages/lustre/examples/99-full-stack-applications/client/src/app.gleam @@ -108,7 +108,7 @@ fn view_grocery_list(model: Model) -> Element(Msg) { fn view_grocery_item(name: String, quantity: Int) -> Element(Msg) { let handle_input = fn(e) { event.value(e) - |> result.nil_error + |> result.replace_error(Nil) |> result.then(int.parse) |> result.map(UserUpdatedQuantity(name, _)) |> result.replace_error([]) diff --git a/packages/pgo/.gitignore b/packages/pgo/.gitignore deleted file mode 100644 index 4fa557d..0000000 --- a/packages/pgo/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -*.beam -*.iml -*.o -*.plt -*.swo -*.swp -*~ -.erlang.cookie -.eunit -.idea -.rebar -.rebar3 -_* -_build -ebin -erl_crash.dump -gen -log -logs -rebar3.crashdump -doc -build diff --git a/packages/pgo/CHANGELOG.md b/packages/pgo/CHANGELOG.md deleted file mode 100644 index af70bf3..0000000 --- a/packages/pgo/CHANGELOG.md +++ /dev/null @@ -1,48 +0,0 @@ -# Changelog - -## v0.8.0 - 2024-05-11 - -- Added `array` column handling, accepting a `List` as value. -- Added support for `ssl_options` when an SSL connection is setuped. - -## v0.7.0 - 2024-04-05 - -- The password is now optional in the `url_config` function, defaulting to no - password if none is given. - -## v0.6.1 - 2024-01-16 - -- Relaxed the stdlib version constraint. - -## v0.6.0 - 2023-11-06 - -- Updated for Gleam v0.32.0. - -## v0.5.0 - 2023-08-03 - -- Updated for Gleam v0.30.0. - -## v0.4.1 - 2023-03-02 - -- Updated for Gleam v0.27.0. - -## v0.4.0 - 2022-06-12 - -- IPv6 is now supported through a config option. - -## v0.3.0 - 2022-02-17 - -- Added the `ConnectionUnavailable` error variant. - -## v0.2.0 - 2022-01-26 - -- Migrate to the Gleam build tool. -- API redesigned. - -## v0.1.1 - 2020-11-26 - -- Dependencies updates and versions relaxed. - -## v0.1.0 - 2020-08-24 - -- Initial release. diff --git a/packages/pgo/LICENSE b/packages/pgo/LICENSE deleted file mode 100644 index 59e1345..0000000 --- a/packages/pgo/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright {{copyright_year}}, {{author_name}} <{{author_email}}>. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/packages/pgo/README.md b/packages/pgo/README.md deleted file mode 100644 index d776483..0000000 --- a/packages/pgo/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Gleam PGO - -A PostgreSQL database client for Gleam, based on [PGO][erlang-pgo]. - -[erlang-pgo]: https://github.com/erleans/pgo - -```gleam -import gleam/pgo -import gleam/dynamic -import gleeunit/should - -pub fn main() { - // Start a database connection pool. - // Typically you will want to create one pool for use in your program - let db = pgo.connect(pgo.Config( - ..pgo.default_config(), - host: "localhost", - database: "my_database", - pool_size: 15, - )) - - // An SQL statement to run. It takes one int as a parameter - let sql = " - select - name, age, colour, friends - from - cats - where - id = $1" - - // This is the decoder for the value returned by the query - let return_type = dynamic.tuple4( - dynamic.string, - dynamic.int, - dynamic.string, - dynamic.list(dynamic.string), - ) - - // Run the query against the PostgreSQL database - // The int `1` is given as a parameter - let assert Ok(response) = - pgo.execute(sql, db, [pgo.int(1)], return_type) - - // And then do something with the returned results - response.count - |> should.equal(2) - response.rows - |> should.equal([ - #("Nubi", 3, "black", ["Al", "Cutlass"]), - ]) -} -``` - -## Installation - -```sh -gleam add gleam_pgo -``` diff --git a/packages/pgo/gleam.toml b/packages/pgo/gleam.toml deleted file mode 100644 index 94aa5d8..0000000 --- a/packages/pgo/gleam.toml +++ /dev/null @@ -1,18 +0,0 @@ -name = "gleam_pgo" -version = "0.7.0" -gleam = ">= 0.32.0" -licences = ["Apache-2.0"] -description = "Gleam bindings to the PGO PostgreSQL client" - -repository = { type = "github", user = "gleam-experiments", repo = "pgo" } -links = [ - { title = "Website", href = "https://gleam.run" }, - { title = "Sponsor", href = "https://github.com/sponsors/lpil" }, -] - -[dependencies] -gleam_stdlib = "~> 0.20 or ~> 1.0" -pgo = "~> 0.12" - -[dev-dependencies] -gleeunit = "~> 1.0" diff --git a/packages/pgo/manifest.toml b/packages/pgo/manifest.toml deleted file mode 100644 index 048eefe..0000000 --- a/packages/pgo/manifest.toml +++ /dev/null @@ -1,17 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "backoff", version = "1.1.6", build_tools = ["rebar3"], requirements = [], otp_app = "backoff", source = "hex", outer_checksum = "CF0CFFF8995FB20562F822E5CC47D8CCF664C5ECDC26A684CBE85C225F9D7C39" }, - { name = "gleam_stdlib", version = "0.37.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5398BD6C2ABA17338F676F42F404B9B7BABE1C8DC7380031ACB05BBE1BCF3742" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "opentelemetry_api", version = "1.3.0", build_tools = ["rebar3", "mix"], requirements = ["opentelemetry_semantic_conventions"], otp_app = "opentelemetry_api", source = "hex", outer_checksum = "B9E5FF775FD064FA098DBA3C398490B77649A352B40B0B730A6B7DC0BDD68858" }, - { name = "opentelemetry_semantic_conventions", version = "0.2.0", build_tools = ["rebar3", "mix"], requirements = [], otp_app = "opentelemetry_semantic_conventions", source = "hex", outer_checksum = "D61FA1F5639EE8668D74B527E6806E0503EFC55A42DB7B5F39939D84C07D6895" }, - { name = "pg_types", version = "0.4.0", build_tools = ["rebar3"], requirements = [], otp_app = "pg_types", source = "hex", outer_checksum = "B02EFA785CAECECF9702C681C80A9CA12A39F9161A846CE17B01FB20AEEED7EB" }, - { name = "pgo", version = "0.14.0", build_tools = ["rebar3"], requirements = ["backoff", "opentelemetry_api", "pg_types"], otp_app = "pgo", source = "hex", outer_checksum = "71016C22599936E042DC0012EE4589D24C71427D266292F775EBF201D97DF9C9" }, -] - -[requirements] -gleam_stdlib = { version = "~> 0.20 or ~> 1.0" } -gleeunit = { version = "~> 1.0" } -pgo = { version = "~> 0.12" } diff --git a/packages/pgo/src/gleam/pgo.gleam b/packages/pgo/src/gleam/pgo.gleam deleted file mode 100644 index 24fdb66..0000000 --- a/packages/pgo/src/gleam/pgo.gleam +++ /dev/null @@ -1,494 +0,0 @@ -//// Postgresql client -//// -//// Gleam wrapper around pgo library - -// TODO: transactions -// TODO: JSON support -import gleam/dynamic.{type DecodeErrors, type Decoder, type Dynamic} -import gleam/list -import gleam/option.{type Option, None, Some} -import gleam/result -import gleam/string -import gleam/uri.{Uri} - -/// The configuration for a pool of connections. -pub type Config { - Config( - /// (default: 127.0.0.1): Database server hostname. - host: String, - /// (default: 5432): Port the server is listening on. - port: Int, - /// Name of database to use. - database: String, - /// Username to connect to database as. - user: String, - /// Password for the user. - password: Option(String), - /// (default: false): Whether to use SSL or not. - ssl: Bool, - /// (default: []): List of 2-tuples, where key and value must be binary - /// strings. You can include any Postgres connection parameter here, such as - /// `#("application_name", "myappname")` and `#("timezone", "GMT")`. - connection_parameters: List(#(String, String)), - /// (default: 1): Number of connections to keep open with the database - pool_size: Int, - /// (default: 50) Checking out connections is handled through a queue. If it - /// takes longer than queue_target to get out of the queue for longer than - /// queue_interval then the queue_target will be doubled and checkouts will - /// start to be dropped if that target is surpassed. - queue_target: Int, - /// (default: 1000) - queue_interval: Int, - /// (default: 1000): The database is pinged every idle_interval when the - /// connection is idle. - idle_interval: Int, - /// trace (default: false): pgo is instrumented with [OpenCensus][1] and - /// when this option is true a span will be created (if sampled). - /// - /// [1]: https://opencensus.io/ - trace: Bool, - /// Which internet protocol to use for this connection - ip_version: IpVersion, - ) -} - -/// The internet protocol version to use. -pub type IpVersion { - /// Internet Protocol version 6 (IPv6) - Ipv4 - /// Internet Protocol version 4 (IPv4) - Ipv6 -} - -/// The default configuration for a connection pool, with a single connection. -/// You will likely want to increase the size of the pool for your application. -/// -pub fn default_config() -> Config { - Config( - host: "127.0.0.1", - port: 5432, - database: "postgres", - user: "postgres", - password: None, - ssl: False, - connection_parameters: [], - pool_size: 1, - queue_target: 50, - queue_interval: 1000, - idle_interval: 1000, - trace: False, - ip_version: Ipv4, - ) -} - -/// Parse a database url into configuration that can be used to start a pool. -pub fn url_config(database_url: String) -> Result(Config, Nil) { - use uri <- result.then(uri.parse(database_url)) - use #(userinfo, host, path, db_port) <- result.then(case uri { - Uri( - scheme: Some("postgres"), - userinfo: Some(userinfo), - host: Some(host), - port: Some(db_port), - path: path, - .., - ) -> Ok(#(userinfo, host, path, db_port)) - _ -> Error(Nil) - }) - use #(user, password) <- result.then(case string.split(userinfo, ":") { - [user] -> Ok(#(user, None)) - [user, password] -> Ok(#(user, Some(password))) - _ -> Error(Nil) - }) - case string.split(path, "/") { - ["", database] -> - Ok( - Config( - ..default_config(), - host: host, - port: db_port, - database: database, - user: user, - password: password, - ), - ) - _ -> Error(Nil) - } -} - -/// A pool of one or more database connections against which queries can be -/// made. -/// -/// Created using the `connect` function and shut-down with the `disconnect` -/// function. -pub type Connection - -/// Start a database connection pool. -/// -/// The pool is started in a new process and will asynchronously connect to the -/// PostgreSQL instance specified in the config. If the configuration is invalid -/// or it cannot connect for another reason it will continue to attempt to -/// connect, and any queries made using the connection pool will fail. -@external(erlang, "gleam_pgo_ffi", "connect") -pub fn connect(a: Config) -> Connection - -/// Shut down a connection pool. -@external(erlang, "gleam_pgo_ffi", "disconnect") -pub fn disconnect(a: Connection) -> Nil - -/// A value that can be sent to PostgreSQL as one of the arguments to a -/// parameterised SQL query. -pub type Value - -@external(erlang, "gleam_pgo_ffi", "null") -pub fn null() -> Value - -@external(erlang, "gleam_pgo_ffi", "coerce") -pub fn bool(a: Bool) -> Value - -@external(erlang, "gleam_pgo_ffi", "coerce") -pub fn int(a: Int) -> Value - -@external(erlang, "gleam_pgo_ffi", "coerce") -pub fn float(a: Float) -> Value - -@external(erlang, "gleam_pgo_ffi", "coerce") -pub fn text(a: String) -> Value - -@external(erlang, "gleam_pgo_ffi", "coerce") -pub fn bytea(a: BitArray) -> Value - -@external(erlang, "gleam_pgo_ffi", "coerce") -pub fn array(a: List(a)) -> Value - -pub fn nullable(inner_type: fn(a) -> Value, value: Option(a)) -> Value { - case value { - Some(term) -> inner_type(term) - None -> null() - } -} - -/// The rows and number of rows that are returned by a database query. -pub type Returned(t) { - Returned(count: Int, rows: List(t)) -} - -@external(erlang, "gleam_pgo_ffi", "query") -fn run_query( - a: Connection, - b: String, - c: List(Value), -) -> Result(#(Int, List(Dynamic)), QueryError) - -pub type QueryError { - /// The query failed as a database constraint would have been violated by the - /// change. - ConstraintViolated(message: String, constraint: String, detail: String) - /// The query failed within the database. - /// https://www.postgresql.org/docs/current/errcodes-appendix.html - PostgresqlError(code: String, name: String, message: String) - // The number of arguments supplied did not match the number of parameters - // that the query has. - UnexpectedArgumentCount(expected: Int, got: Int) - /// One of the arguments supplied was not of the type that the query required. - UnexpectedArgumentType(expected: String, got: String) - /// The rows returned by the database could not be decoded using the supplied - /// dynamic decoder. - UnexpectedResultType(DecodeErrors) - /// No connection was available to execute the query. This may be due to - /// invalid connection details such as an invalid username or password. - ConnectionUnavailable -} - -/// Run a query against a PostgreSQL database. -/// -/// The provided dynamic decoder is used to decode the rows returned by -/// PostgreSQL. If you are not interested in any returned rows you may want to -/// use the `dynamic.dynamic` decoder. -/// -pub fn execute( - query sql: String, - on pool: Connection, - with arguments: List(Value), - expecting decoder: Decoder(t), -) -> Result(Returned(t), QueryError) { - use #(count, rows) <- result.then(run_query(pool, sql, arguments)) - use rows <- result.then( - list.try_map(over: rows, with: decoder) - |> result.map_error(UnexpectedResultType), - ) - Ok(Returned(count, rows)) -} - -/// Get the name for a PostgreSQL error code. -/// -/// ```gleam -/// > error_code_name("01007") -/// Ok("privilege_not_granted") -/// ``` -/// -/// https://www.postgresql.org/docs/current/errcodes-appendix.html -pub fn error_code_name(error_code: String) -> Result(String, Nil) { - case error_code { - "00000" -> Ok("successful_completion") - "01000" -> Ok("warning") - "0100C" -> Ok("dynamic_result_sets_returned") - "01008" -> Ok("implicit_zero_bit_padding") - "01003" -> Ok("null_value_eliminated_in_set_function") - "01007" -> Ok("privilege_not_granted") - "01006" -> Ok("privilege_not_revoked") - "01004" -> Ok("string_data_right_truncation") - "01P01" -> Ok("deprecated_feature") - "02000" -> Ok("no_data") - "02001" -> Ok("no_additional_dynamic_result_sets_returned") - "03000" -> Ok("sql_statement_not_yet_complete") - "08000" -> Ok("connection_exception") - "08003" -> Ok("connection_does_not_exist") - "08006" -> Ok("connection_failure") - "08001" -> Ok("sqlclient_unable_to_establish_sqlconnection") - "08004" -> Ok("sqlserver_rejected_establishment_of_sqlconnection") - "08007" -> Ok("transaction_resolution_unknown") - "08P01" -> Ok("protocol_violation") - "09000" -> Ok("triggered_action_exception") - "0A000" -> Ok("feature_not_supported") - "0B000" -> Ok("invalid_transaction_initiation") - "0F000" -> Ok("locator_exception") - "0F001" -> Ok("invalid_locator_specification") - "0L000" -> Ok("invalid_grantor") - "0LP01" -> Ok("invalid_grant_operation") - "0P000" -> Ok("invalid_role_specification") - "0Z000" -> Ok("diagnostics_exception") - "0Z002" -> Ok("stacked_diagnostics_accessed_without_active_handler") - "20000" -> Ok("case_not_found") - "21000" -> Ok("cardinality_violation") - "22000" -> Ok("data_exception") - "2202E" -> Ok("array_subscript_error") - "22021" -> Ok("character_not_in_repertoire") - "22008" -> Ok("datetime_field_overflow") - "22012" -> Ok("division_by_zero") - "22005" -> Ok("error_in_assignment") - "2200B" -> Ok("escape_character_conflict") - "22022" -> Ok("indicator_overflow") - "22015" -> Ok("interval_field_overflow") - "2201E" -> Ok("invalid_argument_for_logarithm") - "22014" -> Ok("invalid_argument_for_ntile_function") - "22016" -> Ok("invalid_argument_for_nth_value_function") - "2201F" -> Ok("invalid_argument_for_power_function") - "2201G" -> Ok("invalid_argument_for_width_bucket_function") - "22018" -> Ok("invalid_character_value_for_cast") - "22007" -> Ok("invalid_datetime_format") - "22019" -> Ok("invalid_escape_character") - "2200D" -> Ok("invalid_escape_octet") - "22025" -> Ok("invalid_escape_sequence") - "22P06" -> Ok("nonstandard_use_of_escape_character") - "22010" -> Ok("invalid_indicator_parameter_value") - "22023" -> Ok("invalid_parameter_value") - "22013" -> Ok("invalid_preceding_or_following_size") - "2201B" -> Ok("invalid_regular_expression") - "2201W" -> Ok("invalid_row_count_in_limit_clause") - "2201X" -> Ok("invalid_row_count_in_result_offset_clause") - "2202H" -> Ok("invalid_tablesample_argument") - "2202G" -> Ok("invalid_tablesample_repeat") - "22009" -> Ok("invalid_time_zone_displacement_value") - "2200C" -> Ok("invalid_use_of_escape_character") - "2200G" -> Ok("most_specific_type_mismatch") - "22004" -> Ok("null_value_not_allowed") - "22002" -> Ok("null_value_no_indicator_parameter") - "22003" -> Ok("numeric_value_out_of_range") - "2200H" -> Ok("sequence_generator_limit_exceeded") - "22026" -> Ok("string_data_length_mismatch") - "22001" -> Ok("string_data_right_truncation") - "22011" -> Ok("substring_error") - "22027" -> Ok("trim_error") - "22024" -> Ok("unterminated_c_string") - "2200F" -> Ok("zero_length_character_string") - "22P01" -> Ok("floating_point_exception") - "22P02" -> Ok("invalid_text_representation") - "22P03" -> Ok("invalid_binary_representation") - "22P04" -> Ok("bad_copy_file_format") - "22P05" -> Ok("untranslatable_character") - "2200L" -> Ok("not_an_xml_document") - "2200M" -> Ok("invalid_xml_document") - "2200N" -> Ok("invalid_xml_content") - "2200S" -> Ok("invalid_xml_comment") - "2200T" -> Ok("invalid_xml_processing_instruction") - "22030" -> Ok("duplicate_json_object_key_value") - "22031" -> Ok("invalid_argument_for_sql_json_datetime_function") - "22032" -> Ok("invalid_json_text") - "22033" -> Ok("invalid_sql_json_subscript") - "22034" -> Ok("more_than_one_sql_json_item") - "22035" -> Ok("no_sql_json_item") - "22036" -> Ok("non_numeric_sql_json_item") - "22037" -> Ok("non_unique_keys_in_a_json_object") - "22038" -> Ok("singleton_sql_json_item_required") - "22039" -> Ok("sql_json_array_not_found") - "2203A" -> Ok("sql_json_member_not_found") - "2203B" -> Ok("sql_json_number_not_found") - "2203C" -> Ok("sql_json_object_not_found") - "2203D" -> Ok("too_many_json_array_elements") - "2203E" -> Ok("too_many_json_object_members") - "2203F" -> Ok("sql_json_scalar_required") - "23000" -> Ok("integrity_constraint_violation") - "23001" -> Ok("restrict_violation") - "23502" -> Ok("not_null_violation") - "23503" -> Ok("foreign_key_violation") - "23505" -> Ok("unique_violation") - "23514" -> Ok("check_violation") - "23P01" -> Ok("exclusion_violation") - "24000" -> Ok("invalid_cursor_state") - "25000" -> Ok("invalid_transaction_state") - "25001" -> Ok("active_sql_transaction") - "25002" -> Ok("branch_transaction_already_active") - "25008" -> Ok("held_cursor_requires_same_isolation_level") - "25003" -> Ok("inappropriate_access_mode_for_branch_transaction") - "25004" -> Ok("inappropriate_isolation_level_for_branch_transaction") - "25005" -> Ok("no_active_sql_transaction_for_branch_transaction") - "25006" -> Ok("read_only_sql_transaction") - "25007" -> Ok("schema_and_data_statement_mixing_not_supported") - "25P01" -> Ok("no_active_sql_transaction") - "25P02" -> Ok("in_failed_sql_transaction") - "25P03" -> Ok("idle_in_transaction_session_timeout") - "26000" -> Ok("invalid_sql_statement_name") - "27000" -> Ok("triggered_data_change_violation") - "28000" -> Ok("invalid_authorization_specification") - "28P01" -> Ok("invalid_password") - "2B000" -> Ok("dependent_privilege_descriptors_still_exist") - "2BP01" -> Ok("dependent_objects_still_exist") - "2D000" -> Ok("invalid_transaction_termination") - "2F000" -> Ok("sql_routine_exception") - "2F005" -> Ok("function_executed_no_return_statement") - "2F002" -> Ok("modifying_sql_data_not_permitted") - "2F003" -> Ok("prohibited_sql_statement_attempted") - "2F004" -> Ok("reading_sql_data_not_permitted") - "34000" -> Ok("invalid_cursor_name") - "38000" -> Ok("external_routine_exception") - "38001" -> Ok("containing_sql_not_permitted") - "38002" -> Ok("modifying_sql_data_not_permitted") - "38003" -> Ok("prohibited_sql_statement_attempted") - "38004" -> Ok("reading_sql_data_not_permitted") - "39000" -> Ok("external_routine_invocation_exception") - "39001" -> Ok("invalid_sqlstate_returned") - "39004" -> Ok("null_value_not_allowed") - "39P01" -> Ok("trigger_protocol_violated") - "39P02" -> Ok("srf_protocol_violated") - "39P03" -> Ok("event_trigger_protocol_violated") - "3B000" -> Ok("savepoint_exception") - "3B001" -> Ok("invalid_savepoint_specification") - "3D000" -> Ok("invalid_catalog_name") - "3F000" -> Ok("invalid_schema_name") - "40000" -> Ok("transaction_rollback") - "40002" -> Ok("transaction_integrity_constraint_violation") - "40001" -> Ok("serialization_failure") - "40003" -> Ok("statement_completion_unknown") - "40P01" -> Ok("deadlock_detected") - "42000" -> Ok("syntax_error_or_access_rule_violation") - "42601" -> Ok("syntax_error") - "42501" -> Ok("insufficient_privilege") - "42846" -> Ok("cannot_coerce") - "42803" -> Ok("grouping_error") - "42P20" -> Ok("windowing_error") - "42P19" -> Ok("invalid_recursion") - "42830" -> Ok("invalid_foreign_key") - "42602" -> Ok("invalid_name") - "42622" -> Ok("name_too_long") - "42939" -> Ok("reserved_name") - "42804" -> Ok("datatype_mismatch") - "42P18" -> Ok("indeterminate_datatype") - "42P21" -> Ok("collation_mismatch") - "42P22" -> Ok("indeterminate_collation") - "42809" -> Ok("wrong_object_type") - "428C9" -> Ok("generated_always") - "42703" -> Ok("undefined_column") - "42883" -> Ok("undefined_function") - "42P01" -> Ok("undefined_table") - "42P02" -> Ok("undefined_parameter") - "42704" -> Ok("undefined_object") - "42701" -> Ok("duplicate_column") - "42P03" -> Ok("duplicate_cursor") - "42P04" -> Ok("duplicate_database") - "42723" -> Ok("duplicate_function") - "42P05" -> Ok("duplicate_prepared_statement") - "42P06" -> Ok("duplicate_schema") - "42P07" -> Ok("duplicate_table") - "42712" -> Ok("duplicate_alias") - "42710" -> Ok("duplicate_object") - "42702" -> Ok("ambiguous_column") - "42725" -> Ok("ambiguous_function") - "42P08" -> Ok("ambiguous_parameter") - "42P09" -> Ok("ambiguous_alias") - "42P10" -> Ok("invalid_column_reference") - "42611" -> Ok("invalid_column_definition") - "42P11" -> Ok("invalid_cursor_definition") - "42P12" -> Ok("invalid_database_definition") - "42P13" -> Ok("invalid_function_definition") - "42P14" -> Ok("invalid_prepared_statement_definition") - "42P15" -> Ok("invalid_schema_definition") - "42P16" -> Ok("invalid_table_definition") - "42P17" -> Ok("invalid_object_definition") - "44000" -> Ok("with_check_option_violation") - "53000" -> Ok("insufficient_resources") - "53100" -> Ok("disk_full") - "53200" -> Ok("out_of_memory") - "53300" -> Ok("too_many_connections") - "53400" -> Ok("configuration_limit_exceeded") - "54000" -> Ok("program_limit_exceeded") - "54001" -> Ok("statement_too_complex") - "54011" -> Ok("too_many_columns") - "54023" -> Ok("too_many_arguments") - "55000" -> Ok("object_not_in_prerequisite_state") - "55006" -> Ok("object_in_use") - "55P02" -> Ok("cant_change_runtime_param") - "55P03" -> Ok("lock_not_available") - "55P04" -> Ok("unsafe_new_enum_value_usage") - "57000" -> Ok("operator_intervention") - "57014" -> Ok("query_canceled") - "57P01" -> Ok("admin_shutdown") - "57P02" -> Ok("crash_shutdown") - "57P03" -> Ok("cannot_connect_now") - "57P04" -> Ok("database_dropped") - "57P05" -> Ok("idle_session_timeout") - "58000" -> Ok("system_error") - "58030" -> Ok("io_error") - "58P01" -> Ok("undefined_file") - "58P02" -> Ok("duplicate_file") - "72000" -> Ok("snapshot_too_old") - "F0000" -> Ok("config_file_error") - "F0001" -> Ok("lock_file_exists") - "HV000" -> Ok("fdw_error") - "HV005" -> Ok("fdw_column_name_not_found") - "HV002" -> Ok("fdw_dynamic_parameter_value_needed") - "HV010" -> Ok("fdw_function_sequence_error") - "HV021" -> Ok("fdw_inconsistent_descriptor_information") - "HV024" -> Ok("fdw_invalid_attribute_value") - "HV007" -> Ok("fdw_invalid_column_name") - "HV008" -> Ok("fdw_invalid_column_number") - "HV004" -> Ok("fdw_invalid_data_type") - "HV006" -> Ok("fdw_invalid_data_type_descriptors") - "HV091" -> Ok("fdw_invalid_descriptor_field_identifier") - "HV00B" -> Ok("fdw_invalid_handle") - "HV00C" -> Ok("fdw_invalid_option_index") - "HV00D" -> Ok("fdw_invalid_option_name") - "HV090" -> Ok("fdw_invalid_string_length_or_buffer_length") - "HV00A" -> Ok("fdw_invalid_string_format") - "HV009" -> Ok("fdw_invalid_use_of_null_pointer") - "HV014" -> Ok("fdw_too_many_handles") - "HV001" -> Ok("fdw_out_of_memory") - "HV00P" -> Ok("fdw_no_schemas") - "HV00J" -> Ok("fdw_option_name_not_found") - "HV00K" -> Ok("fdw_reply_handle") - "HV00Q" -> Ok("fdw_schema_not_found") - "HV00R" -> Ok("fdw_table_not_found") - "HV00L" -> Ok("fdw_unable_to_create_execution") - "HV00M" -> Ok("fdw_unable_to_create_reply") - "HV00N" -> Ok("fdw_unable_to_establish_connection") - "P0000" -> Ok("plpgsql_error") - "P0001" -> Ok("raise_exception") - "P0002" -> Ok("no_data_found") - "P0003" -> Ok("too_many_rows") - "P0004" -> Ok("assert_failure") - "XX000" -> Ok("internal_error") - "XX001" -> Ok("data_corrupted") - "XX002" -> Ok("index_corrupted") - _ -> Error(Nil) - } -} diff --git a/packages/pgo/src/gleam_pgo_ffi.erl b/packages/pgo/src/gleam_pgo_ffi.erl deleted file mode 100644 index 4d88c80..0000000 --- a/packages/pgo/src/gleam_pgo_ffi.erl +++ /dev/null @@ -1,105 +0,0 @@ --module(gleam_pgo_ffi). - --export([query/3, connect/1, disconnect/1, coerce/1, null/0]). - --record(pgo_pool, {name, pid}). - --include_lib("gleam_pgo/include/gleam@pgo_Config.hrl"). --include_lib("pg_types/include/pg_types.hrl"). - -null() -> - null. - -coerce(Value) -> - Value. - -connect(Config) -> - Id = integer_to_list(erlang:unique_integer([positive])), - PoolName = list_to_atom("gleam_pgo_pool_" ++ Id), - #config{ - host = Host, - port = Port, - database = Database, - user = User, - password = Password, - ssl = Ssl, - connection_parameters = ConnectionParameters, - pool_size = PoolSize, - queue_target = QueueTarget, - queue_interval = QueueInterval, - idle_interval = IdleInterval, - trace = Trace, - ip_version = IpVersion - } = Config, - SslOptions = case Ssl of - false -> []; - true -> [ - {verify, verify_peer}, - {cacerts, public_key:cacerts_get()}, - {server_name_indication, binary_to_list(Host)}, - {customize_hostname_check, [ - {match_fun, public_key:pkix_verify_hostname_match_fun(https)} - ]} - ] - end, - Options1 = #{ - host => Host, - port => Port, - database => Database, - user => User, - ssl => Ssl, - ssl_options => SslOptions, - connection_parameters => ConnectionParameters, - pool_size => PoolSize, - queue_target => QueueTarget, - queue_interval => QueueInterval, - idle_interval => IdleInterval, - trace => Trace, - socket_options => case IpVersion of - ipv4 -> []; - ipv6 -> [inet6] - end - }, - Options2 = case Password of - {some, Pw} -> maps:put(password, Pw, Options1); - none -> Options1 - end, - {ok, Pid} = pgo_pool:start_link(PoolName, Options2), - #pgo_pool{name = PoolName, pid = Pid}. - -disconnect(#pgo_pool{pid = Pid}) -> - erlang:exit(Pid, normal), - nil. - -query(#pgo_pool{name = Name}, Sql, Arguments) -> - case pgo:query(Sql, Arguments, #{pool => Name}) of - #{rows := Rows, num_rows := NumRows} -> - {ok, {NumRows, Rows}}; - - {error, Error} -> - {error, convert_error(Error)} - end. - -convert_error(none_available) -> - connection_unavailable; -convert_error({pgo_protocol, {parameters, Expected, Got}}) -> - {unexpected_argument_count, Expected, Got}; -convert_error({pgsql_error, #{ - message := Message, - constraint := Constraint, - detail := Detail -}}) -> - {constraint_violated, Message, Constraint, Detail}; -convert_error({pgsql_error, #{code := Code, message := Message}}) -> - Constant = case gleam@pgo:error_code_name(Code) of - {ok, X} -> X; - {error, nil} -> <<"unknown">> - end, - {postgresql_error, Code, Constant, Message}; -convert_error(#{ - error := badarg_encoding, - type_info := #type_info{name = Expected}, - value := Value -}) -> - Got = list_to_binary(io_lib:format("~p", [Value])), - {unexpected_argument_type, Expected, Got}. diff --git a/packages/pgo/test/README.md b/packages/pgo/test/README.md deleted file mode 100644 index 683d62d..0000000 --- a/packages/pgo/test/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Test - -### Running tests - -Initialize a Postgres Database, and use as environment variables: - -```sh -export PGUSER="postgres" -export PGHOST="localhost" -export PGPASSWORD="postgres" -export PGUSER="postgres" -export PGPORT=5432 -``` - -You can then run `reset_db.sh` and `gleam test`. diff --git a/packages/pgo/test/gleam/pgo_test.gleam b/packages/pgo/test/gleam/pgo_test.gleam deleted file mode 100644 index 8bb59d1..0000000 --- a/packages/pgo/test/gleam/pgo_test.gleam +++ /dev/null @@ -1,376 +0,0 @@ -import gleam/dynamic.{type Decoder} -import gleam/option.{None, Some} -import gleam/pgo -import gleam/string -import gleeunit/should - -pub fn url_config_everything_test() { - pgo.url_config("postgres://u:p@db.test:1234/my_db") - |> should.equal(Ok( - pgo.Config( - ..pgo.default_config(), - host: "db.test", - port: 1234, - database: "my_db", - user: "u", - password: Some("p"), - ), - )) -} - -pub fn url_config_not_postgres_protocol_test() { - pgo.url_config("foo://u:p@db.test:1234/my_db") - |> should.equal(Error(Nil)) -} - -pub fn url_config_no_password_test() { - pgo.url_config("postgres://u@db.test:1234/my_db") - |> should.equal(Ok( - pgo.Config( - ..pgo.default_config(), - host: "db.test", - port: 1234, - database: "my_db", - user: "u", - password: None, - ), - )) -} - -pub fn url_config_path_slash_test() { - pgo.url_config("postgres://u:p@db.test:1234/my_db/foo") - |> should.equal(Error(Nil)) -} - -fn start_default() { - pgo.Config( - ..pgo.default_config(), - database: "gleam_pgo_test", - password: Some("postgres"), - pool_size: 1, - ) - |> pgo.connect -} - -pub fn inserting_new_rows_test() { - let db = start_default() - let sql = - " - INSERT INTO - cats - VALUES - (DEFAULT, 'bill', true, ARRAY ['black']), (DEFAULT, 'felix', false, ARRAY ['grey'])" - let assert Ok(returned) = pgo.execute(sql, db, [], dynamic.dynamic) - - returned.count - |> should.equal(2) - returned.rows - |> should.equal([]) - - pgo.disconnect(db) -} - -pub fn inserting_new_rows_and_returning_test() { - let db = start_default() - let sql = - " - INSERT INTO - cats - VALUES - (DEFAULT, 'bill', true, ARRAY ['black']), (DEFAULT, 'felix', false, ARRAY ['grey']) - RETURNING - name" - let assert Ok(returned) = - pgo.execute(sql, db, [], dynamic.element(0, dynamic.string)) - - returned.count - |> should.equal(2) - returned.rows - |> should.equal(["bill", "felix"]) - - pgo.disconnect(db) -} - -pub fn selecting_rows_test() { - let db = start_default() - let sql = - " - INSERT INTO - cats - VALUES - (DEFAULT, 'neo', true, ARRAY ['black']) - RETURNING - id" - - let assert Ok(pgo.Returned(rows: [id], ..)) = - pgo.execute(sql, db, [], dynamic.element(0, dynamic.int)) - - let assert Ok(returned) = - pgo.execute( - "SELECT * FROM cats WHERE id = $1", - db, - [pgo.int(id)], - dynamic.tuple4( - dynamic.int, - dynamic.string, - dynamic.bool, - dynamic.list(dynamic.string), - ), - ) - - returned.count - |> should.equal(1) - returned.rows - |> should.equal([#(id, "neo", True, ["black"])]) - - pgo.disconnect(db) -} - -pub fn invalid_sql_test() { - let db = start_default() - let sql = "select select" - - let assert Error(pgo.PostgresqlError(code, name, message)) = - pgo.execute(sql, db, [], dynamic.dynamic) - - code - |> should.equal("42601") - name - |> should.equal("syntax_error") - message - |> should.equal("syntax error at or near \"select\"") - - pgo.disconnect(db) -} - -pub fn insert_constraint_error_test() { - let db = start_default() - let sql = - " - INSERT INTO - cats - VALUES - (900, 'bill', true, ARRAY ['black']), (900, 'felix', false, ARRAY ['black'])" - - let assert Error(pgo.ConstraintViolated(message, constraint, detail)) = - pgo.execute(sql, db, [], dynamic.dynamic) - - constraint - |> should.equal("cats_pkey") - - detail - |> should.equal("Key (id)=(900) already exists.") - - message - |> should.equal( - "duplicate key value violates unique constraint \"cats_pkey\"", - ) - - pgo.disconnect(db) -} - -pub fn select_from_unknown_table_test() { - let db = start_default() - let sql = "SELECT * FROM unknown" - - let assert Error(pgo.PostgresqlError(code, name, message)) = - pgo.execute(on: db, query: sql, with: [], expecting: dynamic.dynamic) - - code - |> should.equal("42P01") - name - |> should.equal("undefined_table") - message - |> should.equal("relation \"unknown\" does not exist") - - pgo.disconnect(db) -} - -pub fn insert_with_incorrect_type_test() { - let db = start_default() - let sql = - " - INSERT INTO - cats - VALUES - (true, true, true, true)" - let assert Error(pgo.PostgresqlError(code, name, message)) = - pgo.execute(sql, db, [], dynamic.dynamic) - - code - |> should.equal("42804") - name - |> should.equal("datatype_mismatch") - message - |> should.equal( - "column \"id\" is of type integer but expression is of type boolean", - ) - - pgo.disconnect(db) -} - -pub fn execute_with_wrong_number_of_arguments_test() { - let db = start_default() - let sql = "SELECT * FROM cats WHERE id = $1" - - pgo.execute(sql, db, [], dynamic.dynamic) - |> should.equal(Error(pgo.UnexpectedArgumentCount(expected: 1, got: 0))) - - pgo.disconnect(db) -} - -fn assert_roundtrip( - db: pgo.Connection, - value: a, - type_name: String, - encoder: fn(a) -> pgo.Value, - decoder: Decoder(a), -) -> pgo.Connection { - pgo.execute( - string.append("select $1::", type_name), - db, - [encoder(value)], - dynamic.element(0, decoder), - ) - |> should.equal(Ok(pgo.Returned(count: 1, rows: [value]))) - db -} - -pub fn null_test() { - let db = start_default() - pgo.execute( - "select $1", - db, - [pgo.null()], - dynamic.element(0, dynamic.optional(dynamic.int)), - ) - |> should.equal(Ok(pgo.Returned(count: 1, rows: [None]))) - - pgo.disconnect(db) -} - -pub fn bool_test() { - start_default() - |> assert_roundtrip(True, "bool", pgo.bool, dynamic.bool) - |> assert_roundtrip(False, "bool", pgo.bool, dynamic.bool) - |> pgo.disconnect -} - -pub fn int_test() { - start_default() - |> assert_roundtrip(0, "int", pgo.int, dynamic.int) - |> assert_roundtrip(1, "int", pgo.int, dynamic.int) - |> assert_roundtrip(2, "int", pgo.int, dynamic.int) - |> assert_roundtrip(3, "int", pgo.int, dynamic.int) - |> assert_roundtrip(4, "int", pgo.int, dynamic.int) - |> assert_roundtrip(5, "int", pgo.int, dynamic.int) - |> assert_roundtrip(-0, "int", pgo.int, dynamic.int) - |> assert_roundtrip(-1, "int", pgo.int, dynamic.int) - |> assert_roundtrip(-2, "int", pgo.int, dynamic.int) - |> assert_roundtrip(-3, "int", pgo.int, dynamic.int) - |> assert_roundtrip(-4, "int", pgo.int, dynamic.int) - |> assert_roundtrip(-5, "int", pgo.int, dynamic.int) - |> assert_roundtrip(10_000_000, "int", pgo.int, dynamic.int) - |> pgo.disconnect -} - -pub fn float_test() { - start_default() - |> assert_roundtrip(0.123, "float", pgo.float, dynamic.float) - |> assert_roundtrip(1.123, "float", pgo.float, dynamic.float) - |> assert_roundtrip(2.123, "float", pgo.float, dynamic.float) - |> assert_roundtrip(3.123, "float", pgo.float, dynamic.float) - |> assert_roundtrip(4.123, "float", pgo.float, dynamic.float) - |> assert_roundtrip(5.123, "float", pgo.float, dynamic.float) - |> assert_roundtrip(-0.654, "float", pgo.float, dynamic.float) - |> assert_roundtrip(-1.654, "float", pgo.float, dynamic.float) - |> assert_roundtrip(-2.654, "float", pgo.float, dynamic.float) - |> assert_roundtrip(-3.654, "float", pgo.float, dynamic.float) - |> assert_roundtrip(-4.654, "float", pgo.float, dynamic.float) - |> assert_roundtrip(-5.654, "float", pgo.float, dynamic.float) - |> assert_roundtrip(10_000_000.0, "float", pgo.float, dynamic.float) - |> pgo.disconnect -} - -pub fn text_test() { - start_default() - |> assert_roundtrip("", "text", pgo.text, dynamic.string) - |> assert_roundtrip("✨", "text", pgo.text, dynamic.string) - |> assert_roundtrip("Hello, Joe!", "text", pgo.text, dynamic.string) - |> pgo.disconnect -} - -pub fn bytea_test() { - start_default() - |> assert_roundtrip(<<"":utf8>>, "bytea", pgo.bytea, dynamic.bit_array) - |> assert_roundtrip(<<"✨":utf8>>, "bytea", pgo.bytea, dynamic.bit_array) - |> assert_roundtrip( - <<"Hello, Joe!":utf8>>, - "bytea", - pgo.bytea, - dynamic.bit_array, - ) - |> assert_roundtrip(<<1>>, "bytea", pgo.bytea, dynamic.bit_array) - |> assert_roundtrip(<<1, 2, 3>>, "bytea", pgo.bytea, dynamic.bit_array) - |> pgo.disconnect -} - -pub fn array_test() { - let decoder = dynamic.list(dynamic.string) - start_default() - |> assert_roundtrip(["black"], "text[]", pgo.array, decoder) - |> assert_roundtrip(["gray"], "text[]", pgo.array, decoder) - |> assert_roundtrip(["gray", "black"], "text[]", pgo.array, decoder) - |> pgo.disconnect -} - -pub fn nullable_test() { - start_default() - |> assert_roundtrip( - Some("Hello, Joe"), - "text", - pgo.nullable(pgo.text, _), - dynamic.optional(dynamic.string), - ) - |> assert_roundtrip( - None, - "text", - pgo.nullable(pgo.text, _), - dynamic.optional(dynamic.string), - ) - |> assert_roundtrip( - Some(123), - "int", - pgo.nullable(pgo.int, _), - dynamic.optional(dynamic.int), - ) - |> assert_roundtrip( - None, - "int", - pgo.nullable(pgo.int, _), - dynamic.optional(dynamic.int), - ) - |> pgo.disconnect -} - -pub fn expected_argument_type_test() { - let db = start_default() - pgo.execute("select $1::int", db, [pgo.float(1.2)], dynamic.int) - |> should.equal(Error(pgo.UnexpectedArgumentType("int4", "1.2"))) - - pgo.disconnect(db) -} - -pub fn expected_return_type_test() { - let db = start_default() - pgo.execute("select 1", db, [], dynamic.element(0, dynamic.string)) - |> should.equal( - Error( - pgo.UnexpectedResultType([ - dynamic.DecodeError(expected: "String", found: "Int", path: ["0"]), - ]), - ), - ) - - pgo.disconnect(db) -} diff --git a/packages/pgo/test/gleam_pgo_test.gleam b/packages/pgo/test/gleam_pgo_test.gleam deleted file mode 100644 index ecd12ad..0000000 --- a/packages/pgo/test/gleam_pgo_test.gleam +++ /dev/null @@ -1,5 +0,0 @@ -import gleeunit - -pub fn main() { - gleeunit.main() -} diff --git a/packages/pgo/test/reset_db.sh b/packages/pgo/test/reset_db.sh deleted file mode 100755 index 1c7c389..0000000 --- a/packages/pgo/test/reset_db.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -set -eu - -echo -echo Resetting database - -psql < Ok("Lucy") - - let is_cool = tom.get_bool(parsed, ["person", "is_cool"]) - // -> Ok(True) -} -``` - -Further documentation can be found at . - -## Status - -The following string escape sequences are not supported yet: - -- `\xHH` -- `\uHHHH` -- `\UHHHHHHHH` diff --git a/packages/tom/gleam.toml b/packages/tom/gleam.toml deleted file mode 100644 index 3bfe267..0000000 --- a/packages/tom/gleam.toml +++ /dev/null @@ -1,13 +0,0 @@ -name = "tom" -version = "0.3.0" - -description = "A pure Gleam TOML parser!" -licences = ["Apache-2.0"] -repository = { type = "github", user = "lpil", repo = "tom" } -links = [{ title = "TOML website", href = "https://toml.io/en/" }] - -[dependencies] -gleam_stdlib = "~> 0.33" - -[dev-dependencies] -gleeunit = "~> 1.0" diff --git a/packages/tom/manifest.toml b/packages/tom/manifest.toml deleted file mode 100644 index 2a00d86..0000000 --- a/packages/tom/manifest.toml +++ /dev/null @@ -1,11 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "gleam_stdlib", version = "0.33.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "3CEAD7B153D896499C78390B22CC968620C27500C922AED3A5DD7B536F922B25" }, - { name = "gleeunit", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "D3682ED8C5F9CAE1C928F2506DE91625588CC752495988CBE0F5653A42A6F334" }, -] - -[requirements] -gleam_stdlib = { version = "~> 0.33" } -gleeunit = { version = "~> 1.0" } diff --git a/packages/tom/src/tom.gleam b/packages/tom/src/tom.gleam deleted file mode 100644 index 3bd7e82..0000000 --- a/packages/tom/src/tom.gleam +++ /dev/null @@ -1,1330 +0,0 @@ -//// A pure Gleam TOML parser! -//// -//// ```gleam -//// import tom -//// -//// const config = " -//// [person] -//// name = \"Lucy\" -//// is_cool = true -//// " -//// -//// pub fn main() { -//// // Parse a string of TOML -//// let assert Ok(parsed) = tom.parse(config) -//// -//// // Now you can work with the data directly, or you can use the `get_*` -//// // functions to retrieve values. -//// -//// tom.get_string(parsed, ["person", "name"]) -//// // -> Ok("Lucy") -//// -//// let is_cool = tom.get_bool(parsed, ["person", "is_cool"]) -//// // -> Ok(True) -//// } -//// ``` - -import gleam/dict.{type Dict} -import gleam/float -import gleam/int -import gleam/list -import gleam/result -import gleam/string - -/// A TOML document. -pub type Toml { - Int(Int) - Float(Float) - /// Infinity is a valid number in TOML but Gleam does not support it, so this - /// variant represents the infinity values. - Infinity(Sign) - /// NaN is a valid number in TOML but Gleam does not support it, so this - /// variant represents the NaN values. - Nan(Sign) - Bool(Bool) - String(String) - Date(Date) - Time(Time) - DateTime(DateTime) - Array(List(Toml)) - ArrayOfTables(List(Dict(String, Toml))) - Table(Dict(String, Toml)) - InlineTable(Dict(String, Toml)) -} - -pub type DateTime { - DateTimeValue(date: Date, time: Time, offset: Offset) -} - -pub type Date { - DateValue(year: Int, month: Int, day: Int) -} - -pub type Time { - TimeValue(hour: Int, minute: Int, second: Int, millisecond: Int) -} - -pub type Offset { - Local - Offset(direction: Sign, hours: Int, minutes: Int) -} - -pub type Sign { - Positive - Negative -} - -/// An error that can occur when parsing a TOML document. -pub type ParseError { - /// An unexpected character was encountered when parsing the document. - Unexpected(got: String, expected: String) - /// More than one items have the same key in the document. - KeyAlreadyInUse(key: List(String)) -} - -type Tokens = - List(String) - -type Parsed(a) = - Result(#(a, Tokens), ParseError) - -/// A number of any kind, returned by the `get_number` function. -pub type Number { - NumberInt(Int) - NumberFloat(Float) - NumberInfinity(Sign) - NumberNan(Sign) -} - -/// An error that can occur when retrieving a value from a TOML document with -/// one of the `get_*` functions. -pub type GetError { - /// There was no value at the given key. - NotFound(key: List(String)) - /// The value at the given key was not of the expected type. - WrongType(key: List(String), expected: String, got: String) -} - -// TODO: test -/// Get a value of any type from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = 1") -/// get(parsed, ["a", "b", "c"]) -/// // -> Ok(Int(1)) -/// ``` -/// -pub fn get( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Toml, GetError) { - case key { - [] -> Error(NotFound([])) - [k] -> result.replace_error(dict.get(toml, k), NotFound([k])) - [k, ..key] -> { - case dict.get(toml, k) { - Ok(Table(t)) -> push_key(get(t, key), k) - Ok(InlineTable(t)) -> push_key(get(t, key), k) - Ok(other) -> Error(WrongType([k], "Table", classify(other))) - Error(_) -> Error(NotFound([k])) - } - } - } -} - -// TODO: test -/// Get an int from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = 1") -/// get_int(parsed, ["a", "b", "c"]) -/// // -> Ok(1) -/// ``` -/// -pub fn get_int( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Int, GetError) { - case get(toml, key) { - Ok(Int(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "Int", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a float from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = 1.1") -/// get_float(parsed, ["a", "b", "c"]) -/// // -> Ok(1.1) -/// ``` -/// -pub fn get_float( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Float, GetError) { - case get(toml, key) { - Ok(Float(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "Float", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a bool from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = true") -/// get_bool(parsed, ["a", "b", "c"]) -/// // -> Ok(True) -/// ``` -/// -pub fn get_bool( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Bool, GetError) { - case get(toml, key) { - Ok(Bool(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "Bool", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a string from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = \"ok\"") -/// get_string(parsed, ["a", "b", "c"]) -/// // -> Ok("ok") -/// ``` -/// -pub fn get_string( - toml: Dict(String, Toml), - key: List(String), -) -> Result(String, GetError) { - case get(toml, key) { - Ok(String(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "String", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a date from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = 1979-05-27") -/// get_date(parsed, ["a", "b", "c"]) -/// // -> Ok("1979-05-27") -/// ``` -/// -pub fn get_date( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Date, GetError) { - case get(toml, key) { - Ok(Date(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "Date", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a time from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = 07:32:00") -/// get_time(parsed, ["a", "b", "c"]) -/// // -> Ok("07:32:00") -/// ``` -/// -pub fn get_time( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Time, GetError) { - case get(toml, key) { - Ok(Time(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "Time", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a date-time from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = 1979-05-27T07:32:00") -/// get_date_time(parsed, ["a", "b", "c"]) -/// // -> Ok("1979-05-27T07:32:00") -/// ``` -/// -pub fn get_date_time( - toml: Dict(String, Toml), - key: List(String), -) -> Result(DateTime, GetError) { - case get(toml, key) { - Ok(DateTime(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "DateTime", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get an array from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = [1, 2]") -/// get_array(parsed, ["a", "b", "c"]) -/// // -> Ok([Int(1), Int(2)]) -/// ``` -/// -pub fn get_array( - toml: Dict(String, Toml), - key: List(String), -) -> Result(List(Toml), GetError) { - case get(toml, key) { - Ok(Array(i)) -> Ok(i) - Ok(ArrayOfTables(i)) -> Ok(list.map(i, Table)) - Ok(other) -> Error(WrongType(key, "Array", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a table from a TOML document. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = { d = 1 }") -/// get_table(parsed, ["a", "b", "c"]) -/// // -> Ok(dict.from_list([#("d", Int(1))])) -/// ``` -/// -pub fn get_table( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Dict(String, Toml), GetError) { - case get(toml, key) { - Ok(Table(i)) -> Ok(i) - Ok(InlineTable(i)) -> Ok(i) - Ok(other) -> Error(WrongType(key, "Table", classify(other))) - Error(e) -> Error(e) - } -} - -// TODO: test -/// Get a number of any kind from a TOML document. -/// This could be an int, a float, a NaN, or an infinity. -/// -/// ## Examples -/// -/// ```gleam -/// let assert Ok(parsed) = parse("a.b.c = { d = inf }") -/// get_number(parsed, ["a", "b", "c"]) -/// // -> Ok(NumberInfinity(Positive))) -/// ``` -/// -pub fn get_number( - toml: Dict(String, Toml), - key: List(String), -) -> Result(Number, GetError) { - case get(toml, key) { - Ok(Int(x)) -> Ok(NumberInt(x)) - Ok(Float(x)) -> Ok(NumberFloat(x)) - Ok(Nan(x)) -> Ok(NumberNan(x)) - Ok(Infinity(x)) -> Ok(NumberInfinity(x)) - Ok(other) -> Error(WrongType(key, "Number", classify(other))) - Error(e) -> Error(e) - } -} - -fn classify(toml: Toml) -> String { - case toml { - Int(_) -> "Int" - Float(_) -> "Float" - Nan(Positive) -> "NaN" - Nan(Negative) -> "Negative NaN" - Infinity(Positive) -> "Infinity" - Infinity(Negative) -> "Negative Infinity" - Bool(_) -> "Bool" - String(_) -> "String" - Date(_) -> "Date" - Time(_) -> "Time" - DateTime(_) -> "DateTime" - Array(_) -> "Array" - ArrayOfTables(_) -> "Array" - Table(_) -> "Table" - InlineTable(_) -> "Table" - } -} - -fn push_key(result: Result(t, GetError), key: String) -> Result(t, GetError) { - case result { - Ok(t) -> Ok(t) - Error(NotFound(path)) -> Error(NotFound([key, ..path])) - Error(WrongType(path, expected, got)) -> - Error(WrongType([key, ..path], expected, got)) - } -} - -pub fn parse(input: String) -> Result(Dict(String, Toml), ParseError) { - let input = string.to_graphemes(input) - let input = drop_comments(input, [], False) - let input = skip_whitespace(input) - use toml, input <- do(parse_table(input, dict.new())) - case parse_tables(input, toml) { - Ok(toml) -> Ok(reverse_arrays_of_tables_table(toml)) - Error(e) -> Error(e) - } -} - -fn parse_tables( - input: Tokens, - toml: Dict(String, Toml), -) -> Result(Dict(String, Toml), ParseError) { - case input { - ["[", "[", ..input] -> { - case parse_array_of_tables(input) { - Error(e) -> Error(e) - Ok(#(#(key, table), input)) -> { - case insert(toml, key, ArrayOfTables([table])) { - Ok(toml) -> parse_tables(input, toml) - Error(e) -> Error(e) - } - } - } - } - ["[", ..input] -> { - case parse_table_and_header(input) { - Error(e) -> Error(e) - Ok(#(#(key, table), input)) -> { - case insert(toml, key, Table(table)) { - Ok(toml) -> parse_tables(input, toml) - Error(e) -> Error(e) - } - } - } - } - [g, ..] -> Error(Unexpected(g, "[")) - [] -> Ok(toml) - } -} - -fn parse_array_of_tables( - input: Tokens, -) -> Parsed(#(List(String), Dict(String, Toml))) { - let input = skip_line_whitespace(input) - use key, input <- do(parse_key(input, [])) - use input <- expect(input, "]") - use input <- expect(input, "]") - use table, input <- do(parse_table(input, dict.new())) - Ok(#(#(key, table), input)) -} - -fn parse_table_header(input: Tokens) -> Parsed(List(String)) { - let input = skip_line_whitespace(input) - use key, input <- do(parse_key(input, [])) - use input <- expect(input, "]") - let input = skip_line_whitespace(input) - use input <- expect_end_of_line(input) - Ok(#(key, input)) -} - -fn parse_table_and_header( - input: Tokens, -) -> Parsed(#(List(String), Dict(String, Toml))) { - use key, input <- do(parse_table_header(input)) - use table, input <- do(parse_table(input, dict.new())) - Ok(#(#(key, table), input)) -} - -fn parse_table( - input: Tokens, - toml: Dict(String, Toml), -) -> Parsed(Dict(String, Toml)) { - let input = skip_whitespace(input) - case input { - ["[", ..] | [] -> Ok(#(toml, input)) - _ -> - case parse_key_value(input, toml) { - Ok(#(toml, input)) -> - case skip_line_whitespace(input) { - [] -> Ok(#(toml, [])) - ["\n", ..in] | ["\r\n", ..in] -> parse_table(in, toml) - [g, ..] -> Error(Unexpected(g, "\n")) - } - e -> e - } - } -} - -fn parse_key_value( - input: Tokens, - toml: Dict(String, Toml), -) -> Parsed(Dict(String, Toml)) { - use key, input <- do(parse_key(input, [])) - let input = skip_line_whitespace(input) - use input <- expect(input, "=") - let input = skip_line_whitespace(input) - use value, input <- do(parse_value(input)) - case insert(toml, key, value) { - Ok(toml) -> Ok(#(toml, input)) - Error(e) -> Error(e) - } -} - -fn insert( - table: Dict(String, Toml), - key: List(String), - value: Toml, -) -> Result(Dict(String, Toml), ParseError) { - case insert_loop(table, key, value) { - Ok(table) -> Ok(table) - Error(path) -> Error(KeyAlreadyInUse(path)) - } -} - -fn insert_loop( - table: Dict(String, Toml), - key: List(String), - value: Toml, -) -> Result(Dict(String, Toml), List(String)) { - case key { - [] -> panic as "unreachable" - [k] -> { - case dict.get(table, k) { - Error(Nil) -> Ok(dict.insert(table, k, value)) - Ok(old) -> merge(table, k, old, value) - } - } - [k, ..key] -> { - case dict.get(table, k) { - Error(Nil) -> { - case insert_loop(dict.new(), key, value) { - Ok(inner) -> Ok(dict.insert(table, k, Table(inner))) - Error(path) -> Error([k, ..path]) - } - } - Ok(ArrayOfTables([inner, ..rest])) -> { - case insert_loop(inner, key, value) { - Ok(inner) -> - Ok(dict.insert(table, k, ArrayOfTables([inner, ..rest]))) - Error(path) -> Error([k, ..path]) - } - } - Ok(Table(inner)) -> { - case insert_loop(inner, key, value) { - Ok(inner) -> Ok(dict.insert(table, k, Table(inner))) - Error(path) -> Error([k, ..path]) - } - } - Ok(_) -> Error([k]) - } - } - } -} - -fn merge( - table: Dict(String, Toml), - key: String, - old: Toml, - new: Toml, -) -> Result(Dict(String, Toml), List(String)) { - case old, new { - // When both are arrays of tables then they are merged together - ArrayOfTables(tables), ArrayOfTables(new) -> - Ok(dict.insert(table, key, ArrayOfTables(list.append(new, tables)))) - - _, _ -> Error([key]) - } -} - -fn expect_end_of_line(input: Tokens, next: fn(Tokens) -> Parsed(a)) -> Parsed(a) { - case input { - ["\n", ..input] -> next(input) - ["\r\n", ..input] -> next(input) - [g, ..] -> Error(Unexpected(g, "\n")) - [] -> Error(Unexpected("EOF", "\n")) - } -} - -fn parse_value(input) -> Parsed(Toml) { - case input { - ["t", "r", "u", "e", ..input] -> Ok(#(Bool(True), input)) - ["f", "a", "l", "s", "e", ..input] -> Ok(#(Bool(False), input)) - - ["n", "a", "n", ..input] -> Ok(#(Nan(Positive), input)) - ["+", "n", "a", "n", ..input] -> Ok(#(Nan(Positive), input)) - ["-", "n", "a", "n", ..input] -> Ok(#(Nan(Negative), input)) - - ["i", "n", "f", ..input] -> Ok(#(Infinity(Positive), input)) - ["+", "i", "n", "f", ..input] -> Ok(#(Infinity(Positive), input)) - ["-", "i", "n", "f", ..input] -> Ok(#(Infinity(Negative), input)) - - ["[", ..input] -> parse_array(input, []) - ["{", ..input] -> parse_inline_table(input, dict.new()) - - ["0", "x", ..input] -> parse_hex(input, 0, Positive) - ["+", "0", "x", ..input] -> parse_hex(input, 0, Positive) - ["-", "0", "x", ..input] -> parse_hex(input, 0, Negative) - - ["0", "o", ..input] -> parse_octal(input, 0, Positive) - ["+", "0", "o", ..input] -> parse_octal(input, 0, Positive) - ["-", "0", "o", ..input] -> parse_octal(input, 0, Negative) - - ["0", "b", ..input] -> parse_binary(input, 0, Positive) - ["+", "0", "b", ..input] -> parse_binary(input, 0, Positive) - ["-", "0", "b", ..input] -> parse_binary(input, 0, Negative) - - ["+", ..input] -> parse_number(input, 0, Positive) - ["-", ..input] -> parse_number(input, 0, Negative) - ["0", ..] - | ["1", ..] - | ["2", ..] - | ["3", ..] - | ["4", ..] - | ["5", ..] - | ["6", ..] - | ["7", ..] - | ["8", ..] - | ["9", ..] -> parse_number(input, 0, Positive) - - ["\"", "\"", "\"", ..input] -> parse_multi_line_string(input, "") - ["\"", ..input] -> parse_string(input, "") - - ["'", "'", "'", ..input] -> parse_multi_line_literal_string(input, "") - ["'", ..input] -> parse_literal_string(input, "") - - [g, ..] -> Error(Unexpected(g, "value")) - [] -> Error(Unexpected("EOF", "value")) - } -} - -fn parse_key(input: Tokens, segments: List(String)) -> Parsed(List(String)) { - use segment, input <- do(parse_key_segment(input)) - let segments = [segment, ..segments] - let input = skip_line_whitespace(input) - - case input { - [".", ..input] -> parse_key(input, segments) - _ -> Ok(#(list.reverse(segments), input)) - } -} - -fn parse_key_segment(input: Tokens) -> Parsed(String) { - let input = skip_line_whitespace(input) - case input { - ["=", ..] -> Error(Unexpected("=", "Key")) - ["\n", ..] -> Error(Unexpected("\n", "Key")) - ["\r\n", ..] -> Error(Unexpected("\r\n", "Key")) - ["[", ..] -> Error(Unexpected("[", "Key")) - ["\"", ..input] -> parse_key_quoted(input, "\"", "") - ["'", ..input] -> parse_key_quoted(input, "'", "") - _ -> parse_key_bare(input, "") - } -} - -fn parse_key_quoted( - input: Tokens, - close: String, - name: String, -) -> Parsed(String) { - case input { - [g, ..input] if g == close -> Ok(#(name, input)) - [g, ..input] -> parse_key_quoted(input, close, name <> g) - [] -> Error(Unexpected("EOF", close)) - } -} - -fn parse_key_bare(input: Tokens, name: String) -> Parsed(String) { - case input { - [" ", ..input] if name != "" -> Ok(#(name, input)) - ["=", ..] if name != "" -> Ok(#(name, input)) - [".", ..] if name != "" -> Ok(#(name, input)) - ["]", ..] if name != "" -> Ok(#(name, input)) - [",", ..] if name != "" -> Error(Unexpected(",", "=")) - ["\n", ..] if name != "" -> Error(Unexpected("\n", "=")) - ["\r\n", ..] if name != "" -> Error(Unexpected("\r\n", "=")) - ["\n", ..] -> Error(Unexpected("\n", "key")) - ["\r\n", ..] -> Error(Unexpected("\r\n", "key")) - ["]", ..] -> Error(Unexpected("]", "key")) - [",", ..] -> Error(Unexpected(",", "key")) - [g, ..input] -> parse_key_bare(input, name <> g) - [] -> Error(Unexpected("EOF", "key")) - } -} - -fn skip_line_whitespace(input: Tokens) -> Tokens { - list.drop_while(input, fn(g) { g == " " || g == "\t" }) -} - -fn skip_whitespace(input: Tokens) -> Tokens { - case input { - [" ", ..input] -> skip_whitespace(input) - ["\t", ..input] -> skip_whitespace(input) - ["\n", ..input] -> skip_whitespace(input) - ["\r\n", ..input] -> skip_whitespace(input) - input -> input - } -} - -fn drop_comments(input: Tokens, acc: Tokens, in_string: Bool) -> Tokens { - case input { - ["\\", "\"", ..input] if in_string -> - drop_comments(input, ["\"", "\\", ..acc], in_string) - ["\"", ..input] -> drop_comments(input, ["\"", ..acc], !in_string) - ["#", ..input] if in_string -> drop_comments(input, ["#", ..acc], in_string) - ["#", ..input] if !in_string -> - input - |> list.drop_while(fn(g) { g != "\n" }) - |> drop_comments(acc, in_string) - [g, ..input] -> drop_comments(input, [g, ..acc], in_string) - [] -> list.reverse(acc) - } -} - -fn do( - result: Result(#(a, Tokens), ParseError), - next: fn(a, Tokens) -> Result(b, ParseError), -) -> Result(b, ParseError) { - case result { - Ok(#(a, input)) -> next(a, input) - Error(e) -> Error(e) - } -} - -fn expect( - input: Tokens, - expected: String, - next: fn(Tokens) -> Parsed(a), -) -> Parsed(a) { - case input { - [g, ..input] if g == expected -> next(input) - [g, ..] -> Error(Unexpected(g, expected)) - [] -> Error(Unexpected("EOF", expected)) - } -} - -fn parse_inline_table( - input: Tokens, - properties: Dict(String, Toml), -) -> Parsed(Toml) { - let input = skip_whitespace(input) - case input { - ["}", ..input] -> Ok(#(InlineTable(properties), input)) - _ -> - case parse_inline_table_property(input, properties) { - Ok(#(properties, input)) -> { - let input = skip_whitespace(input) - case input { - ["}", ..input] -> Ok(#(InlineTable(properties), input)) - [",", ..input] -> { - let input = skip_whitespace(input) - parse_inline_table(input, properties) - } - [g, ..] -> Error(Unexpected(g, "}")) - [] -> Error(Unexpected("EOF", "}")) - } - } - Error(e) -> Error(e) - } - } -} - -fn parse_inline_table_property( - input: Tokens, - properties: Dict(String, Toml), -) -> Parsed(Dict(String, Toml)) { - let input = skip_whitespace(input) - use key, input <- do(parse_key(input, [])) - let input = skip_line_whitespace(input) - use input <- expect(input, "=") - let input = skip_line_whitespace(input) - use value, input <- do(parse_value(input)) - case insert(properties, key, value) { - Ok(properties) -> Ok(#(properties, input)) - Error(e) -> Error(e) - } -} - -fn parse_array(input: Tokens, elements: List(Toml)) -> Parsed(Toml) { - let input = skip_whitespace(input) - case input { - ["]", ..input] -> Ok(#(Array(list.reverse(elements)), input)) - _ -> { - use element, input <- do(parse_value(input)) - let elements = [element, ..elements] - let input = skip_whitespace(input) - case input { - ["]", ..input] -> Ok(#(Array(list.reverse(elements)), input)) - [",", ..input] -> { - let input = skip_whitespace(input) - parse_array(input, elements) - } - [g, ..] -> Error(Unexpected(g, "]")) - [] -> Error(Unexpected("EOF", "]")) - } - } - } -} - -fn parse_hex(input: Tokens, number: Int, sign: Sign) -> Parsed(Toml) { - case input { - ["_", ..input] -> parse_hex(input, number, sign) - ["0", ..input] -> parse_hex(input, number * 16 + 0, sign) - ["1", ..input] -> parse_hex(input, number * 16 + 1, sign) - ["2", ..input] -> parse_hex(input, number * 16 + 2, sign) - ["3", ..input] -> parse_hex(input, number * 16 + 3, sign) - ["4", ..input] -> parse_hex(input, number * 16 + 4, sign) - ["5", ..input] -> parse_hex(input, number * 16 + 5, sign) - ["6", ..input] -> parse_hex(input, number * 16 + 6, sign) - ["7", ..input] -> parse_hex(input, number * 16 + 7, sign) - ["8", ..input] -> parse_hex(input, number * 16 + 8, sign) - ["9", ..input] -> parse_hex(input, number * 16 + 9, sign) - ["a", ..input] -> parse_hex(input, number * 16 + 10, sign) - ["b", ..input] -> parse_hex(input, number * 16 + 11, sign) - ["c", ..input] -> parse_hex(input, number * 16 + 12, sign) - ["d", ..input] -> parse_hex(input, number * 16 + 13, sign) - ["e", ..input] -> parse_hex(input, number * 16 + 14, sign) - ["f", ..input] -> parse_hex(input, number * 16 + 15, sign) - ["A", ..input] -> parse_hex(input, number * 16 + 10, sign) - ["B", ..input] -> parse_hex(input, number * 16 + 11, sign) - ["C", ..input] -> parse_hex(input, number * 16 + 12, sign) - ["D", ..input] -> parse_hex(input, number * 16 + 13, sign) - ["E", ..input] -> parse_hex(input, number * 16 + 14, sign) - ["F", ..input] -> parse_hex(input, number * 16 + 15, sign) - - // Anything else and the number is terminated - input -> { - let number = case sign { - Positive -> number - Negative -> -number - } - Ok(#(Int(number), input)) - } - } -} - -fn parse_octal(input: Tokens, number: Int, sign: Sign) -> Parsed(Toml) { - case input { - ["_", ..input] -> parse_octal(input, number, sign) - ["0", ..input] -> parse_octal(input, number * 8 + 0, sign) - ["1", ..input] -> parse_octal(input, number * 8 + 1, sign) - ["2", ..input] -> parse_octal(input, number * 8 + 2, sign) - ["3", ..input] -> parse_octal(input, number * 8 + 3, sign) - ["4", ..input] -> parse_octal(input, number * 8 + 4, sign) - ["5", ..input] -> parse_octal(input, number * 8 + 5, sign) - ["6", ..input] -> parse_octal(input, number * 8 + 6, sign) - ["7", ..input] -> parse_octal(input, number * 8 + 7, sign) - - // Anything else and the number is terminated - input -> { - let number = case sign { - Positive -> number - Negative -> -number - } - Ok(#(Int(number), input)) - } - } -} - -fn parse_binary(input: Tokens, number: Int, sign: Sign) -> Parsed(Toml) { - case input { - ["_", ..input] -> parse_binary(input, number, sign) - ["0", ..input] -> parse_binary(input, number * 2 + 0, sign) - ["1", ..input] -> parse_binary(input, number * 2 + 1, sign) - - // Anything else and the number is terminated - input -> { - let number = case sign { - Positive -> number - Negative -> -number - } - Ok(#(Int(number), input)) - } - } -} - -fn parse_number(input: Tokens, number: Int, sign: Sign) -> Parsed(Toml) { - case input { - ["_", ..input] -> parse_number(input, number, sign) - ["0", ..input] -> parse_number(input, number * 10 + 0, sign) - ["1", ..input] -> parse_number(input, number * 10 + 1, sign) - ["2", ..input] -> parse_number(input, number * 10 + 2, sign) - ["3", ..input] -> parse_number(input, number * 10 + 3, sign) - ["4", ..input] -> parse_number(input, number * 10 + 4, sign) - ["5", ..input] -> parse_number(input, number * 10 + 5, sign) - ["6", ..input] -> parse_number(input, number * 10 + 6, sign) - ["7", ..input] -> parse_number(input, number * 10 + 7, sign) - ["8", ..input] -> parse_number(input, number * 10 + 8, sign) - ["9", ..input] -> parse_number(input, number * 10 + 9, sign) - - ["-", ..input] -> parse_date(input, number) - [":", ..input] if number < 24 -> parse_time_minute(input, number) - - [".", ..input] -> parse_float(input, int.to_float(number), sign, 0.1) - - ["e", "+", ..input] -> - parse_exponent(input, int.to_float(number), sign, 0, Positive) - ["e", "-", ..input] -> - parse_exponent(input, int.to_float(number), sign, 0, Negative) - ["e", ..input] -> - parse_exponent(input, int.to_float(number), sign, 0, Positive) - ["E", "+", ..input] -> - parse_exponent(input, int.to_float(number), sign, 0, Positive) - ["E", "-", ..input] -> - parse_exponent(input, int.to_float(number), sign, 0, Negative) - ["E", ..input] -> - parse_exponent(input, int.to_float(number), sign, 0, Positive) - - // Anything else and the number is terminated - input -> { - let number = case sign { - Positive -> number - Negative -> -number - } - Ok(#(Int(number), input)) - } - } -} - -fn parse_exponent( - input: Tokens, - n: Float, - n_sign: Sign, - ex: Int, - ex_sign: Sign, -) -> Parsed(Toml) { - case input { - ["_", ..input] -> parse_exponent(input, n, n_sign, ex, ex_sign) - ["0", ..input] -> parse_exponent(input, n, n_sign, ex * 10, ex_sign) - ["1", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 1, ex_sign) - ["2", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 2, ex_sign) - ["3", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 3, ex_sign) - ["4", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 4, ex_sign) - ["5", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 5, ex_sign) - ["6", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 6, ex_sign) - ["7", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 7, ex_sign) - ["8", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 8, ex_sign) - ["9", ..input] -> parse_exponent(input, n, n_sign, ex * 10 + 9, ex_sign) - - // Anything else and the number is terminated - input -> { - let number = case n_sign { - Positive -> n - Negative -> n *. -1.0 - } - let exponent = - int.to_float(case ex_sign { - Positive -> ex - Negative -> -ex - }) - let multiplier = case float.power(10.0, exponent) { - Ok(multiplier) -> multiplier - Error(_) -> 1.0 - } - Ok(#(Float(number *. multiplier), input)) - } - } -} - -fn parse_float( - input: Tokens, - number: Float, - sign: Sign, - unit: Float, -) -> Parsed(Toml) { - case input { - ["_", ..input] -> parse_float(input, number, sign, unit) - ["0", ..input] -> parse_float(input, number, sign, unit *. 0.1) - ["1", ..input] -> - parse_float(input, number +. 1.0 *. unit, sign, unit *. 0.1) - ["2", ..input] -> - parse_float(input, number +. 2.0 *. unit, sign, unit *. 0.1) - ["3", ..input] -> - parse_float(input, number +. 3.0 *. unit, sign, unit *. 0.1) - ["4", ..input] -> - parse_float(input, number +. 4.0 *. unit, sign, unit *. 0.1) - ["5", ..input] -> - parse_float(input, number +. 5.0 *. unit, sign, unit *. 0.1) - ["6", ..input] -> - parse_float(input, number +. 6.0 *. unit, sign, unit *. 0.1) - ["7", ..input] -> - parse_float(input, number +. 7.0 *. unit, sign, unit *. 0.1) - ["8", ..input] -> - parse_float(input, number +. 8.0 *. unit, sign, unit *. 0.1) - ["9", ..input] -> - parse_float(input, number +. 9.0 *. unit, sign, unit *. 0.1) - - ["e", "+", ..input] -> parse_exponent(input, number, sign, 0, Positive) - ["e", "-", ..input] -> parse_exponent(input, number, sign, 0, Negative) - ["e", ..input] -> parse_exponent(input, number, sign, 0, Positive) - ["E", "+", ..input] -> parse_exponent(input, number, sign, 0, Positive) - ["E", "-", ..input] -> parse_exponent(input, number, sign, 0, Negative) - ["E", ..input] -> parse_exponent(input, number, sign, 0, Positive) - - // Anything else and the number is terminated - input -> { - let number = case sign { - Positive -> number - Negative -> number *. -1.0 - } - Ok(#(Float(number), input)) - } - } -} - -fn parse_string(input: Tokens, string: String) -> Parsed(Toml) { - case input { - ["\"", ..input] -> Ok(#(String(string), input)) - ["\\", "t", ..input] -> parse_string(input, string <> "\t") - ["\\", "e", ..input] -> parse_string(input, string <> "\u{001b}") - ["\\", "b", ..input] -> parse_string(input, string <> "\u{0008}") - ["\\", "n", ..input] -> parse_string(input, string <> "\n") - ["\\", "r", ..input] -> parse_string(input, string <> "\r") - ["\\", "f", ..input] -> parse_string(input, string <> "\f") - ["\\", "\"", ..input] -> parse_string(input, string <> "\"") - ["\\", "\\", ..input] -> parse_string(input, string <> "\\") - [] -> Error(Unexpected("EOF", "\"")) - ["\n", ..] -> Error(Unexpected("\n", "\"")) - ["\r\n", ..] -> Error(Unexpected("\r\n", "\"")) - [g, ..input] -> parse_string(input, string <> g) - } -} - -fn parse_multi_line_string(input: Tokens, string: String) -> Parsed(Toml) { - case input { - ["\"", "\"", "\"", ..input] -> Ok(#(String(string), input)) - ["\\", "\n", ..input] -> - parse_multi_line_string(skip_whitespace(input), string) - ["\\", "\r\n", ..input] -> - parse_multi_line_string(skip_whitespace(input), string) - ["\r\n", ..input] if string == "" -> parse_multi_line_string(input, string) - ["\n", ..input] if string == "" -> parse_multi_line_string(input, string) - ["\r\n", ..input] if string == "" -> parse_multi_line_string(input, string) - ["\\", "t", ..input] -> parse_multi_line_string(input, string <> "\t") - ["\\", "n", ..input] -> parse_multi_line_string(input, string <> "\n") - ["\\", "r", ..input] -> parse_multi_line_string(input, string <> "\r") - ["\\", "\"", ..input] -> parse_multi_line_string(input, string <> "\"") - ["\\", "\\", ..input] -> parse_multi_line_string(input, string <> "\\") - [] -> Error(Unexpected("EOF", "\"")) - [g, ..input] -> parse_multi_line_string(input, string <> g) - } -} - -fn parse_multi_line_literal_string( - input: Tokens, - string: String, -) -> Parsed(Toml) { - case input { - [] -> Error(Unexpected("EOF", "\"")) - ["'", "'", "'", "'", ..] -> Error(Unexpected("''''", "'''")) - ["'", "'", "'", ..input] -> Ok(#(String(string), input)) - ["\n", ..input] if string == "" -> - parse_multi_line_literal_string(input, string) - ["\r\n", ..input] if string == "" -> - parse_multi_line_literal_string(input, string) - [g, ..input] -> parse_multi_line_literal_string(input, string <> g) - } -} - -fn parse_literal_string(input: Tokens, string: String) -> Parsed(Toml) { - case input { - [] -> Error(Unexpected("EOF", "\"")) - ["\n", ..] -> Error(Unexpected("\n", "'")) - ["\r\n", ..] -> Error(Unexpected("\r\n", "'")) - ["'", ..input] -> Ok(#(String(string), input)) - [g, ..input] -> parse_literal_string(input, string <> g) - } -} - -fn reverse_arrays_of_tables(toml: Toml) -> Toml { - case toml { - ArrayOfTables(tables) -> - ArrayOfTables(reverse_arrays_of_tables_array(tables, [])) - - Table(table) -> Table(reverse_arrays_of_tables_table(table)) - - _ -> toml - } -} - -fn reverse_arrays_of_tables_table( - table: Dict(String, Toml), -) -> Dict(String, Toml) { - dict.map_values(table, fn(_, v) { reverse_arrays_of_tables(v) }) -} - -fn reverse_arrays_of_tables_array( - array: List(Dict(String, Toml)), - acc: List(Dict(String, Toml)), -) -> List(Dict(String, Toml)) { - case array { - [] -> acc - [first, ..rest] -> { - let first = reverse_arrays_of_tables_table(first) - reverse_arrays_of_tables_array(rest, [first, ..acc]) - } - } -} - -fn parse_time_minute(input: Tokens, hours: Int) -> Parsed(Toml) { - use minutes, input <- do(parse_number_under_60(input, "minutes")) - use #(seconds, ms), input <- do(parse_time_s_ms(input)) - let time = TimeValue(hours, minutes, seconds, ms) - Ok(#(Time(time), input)) -} - -fn parse_hour_minute(input: Tokens) -> Parsed(#(Int, Int)) { - use hours, input <- do(case input { - ["0", "0", ":", ..input] -> Ok(#(0, input)) - ["0", "1", ":", ..input] -> Ok(#(1, input)) - ["0", "2", ":", ..input] -> Ok(#(2, input)) - ["0", "3", ":", ..input] -> Ok(#(3, input)) - ["0", "4", ":", ..input] -> Ok(#(4, input)) - ["0", "5", ":", ..input] -> Ok(#(5, input)) - ["0", "6", ":", ..input] -> Ok(#(6, input)) - ["0", "7", ":", ..input] -> Ok(#(7, input)) - ["0", "8", ":", ..input] -> Ok(#(8, input)) - ["0", "9", ":", ..input] -> Ok(#(9, input)) - ["1", "0", ":", ..input] -> Ok(#(10, input)) - ["1", "1", ":", ..input] -> Ok(#(11, input)) - ["1", "2", ":", ..input] -> Ok(#(12, input)) - ["1", "3", ":", ..input] -> Ok(#(13, input)) - ["1", "4", ":", ..input] -> Ok(#(14, input)) - ["1", "5", ":", ..input] -> Ok(#(15, input)) - ["1", "6", ":", ..input] -> Ok(#(16, input)) - ["1", "7", ":", ..input] -> Ok(#(17, input)) - ["1", "8", ":", ..input] -> Ok(#(18, input)) - ["1", "9", ":", ..input] -> Ok(#(19, input)) - ["2", "0", ":", ..input] -> Ok(#(20, input)) - ["2", "1", ":", ..input] -> Ok(#(21, input)) - ["2", "2", ":", ..input] -> Ok(#(22, input)) - ["2", "3", ":", ..input] -> Ok(#(23, input)) - [g, ..] -> Error(Unexpected(g, "time")) - [] -> Error(Unexpected("EOF", "time")) - }) - - use minutes, input <- do(parse_number_under_60(input, "minutes")) - Ok(#(#(hours, minutes), input)) -} - -fn parse_time_value(input: Tokens) -> Parsed(Time) { - use #(hours, minutes), input <- do(parse_hour_minute(input)) - use #(seconds, ms), input <- do(parse_time_s_ms(input)) - let time = TimeValue(hours, minutes, seconds, ms) - Ok(#(time, input)) -} - -fn parse_time_s_ms(input: Tokens) -> Parsed(#(Int, Int)) { - case input { - [":", ..input] -> { - use seconds, input <- do(parse_number_under_60(input, "seconds")) - case input { - [".", ..input] -> parse_time_ms(input, seconds, 0) - _ -> Ok(#(#(seconds, 0), input)) - } - } - - _ -> Ok(#(#(0, 0), input)) - } -} - -fn parse_time_ms(input: Tokens, seconds: Int, ms: Int) -> Parsed(#(Int, Int)) { - case input { - ["0", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 0) - ["1", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 1) - ["2", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 2) - ["3", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 3) - ["4", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 4) - ["5", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 5) - ["6", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 6) - ["7", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 7) - ["8", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 8) - ["9", ..input] if ms < 100_000 -> parse_time_ms(input, seconds, ms * 10 + 9) - - // Anything else and the number is terminated - _ -> Ok(#(#(seconds, ms), input)) - } -} - -fn parse_number_under_60(input: Tokens, expected: String) -> Parsed(Int) { - case input { - ["0", "0", ..input] -> Ok(#(0, input)) - ["0", "1", ..input] -> Ok(#(1, input)) - ["0", "2", ..input] -> Ok(#(2, input)) - ["0", "3", ..input] -> Ok(#(3, input)) - ["0", "4", ..input] -> Ok(#(4, input)) - ["0", "5", ..input] -> Ok(#(5, input)) - ["0", "6", ..input] -> Ok(#(6, input)) - ["0", "7", ..input] -> Ok(#(7, input)) - ["0", "8", ..input] -> Ok(#(8, input)) - ["0", "9", ..input] -> Ok(#(9, input)) - ["1", "0", ..input] -> Ok(#(10, input)) - ["1", "1", ..input] -> Ok(#(11, input)) - ["1", "2", ..input] -> Ok(#(12, input)) - ["1", "3", ..input] -> Ok(#(13, input)) - ["1", "4", ..input] -> Ok(#(14, input)) - ["1", "5", ..input] -> Ok(#(15, input)) - ["1", "6", ..input] -> Ok(#(16, input)) - ["1", "7", ..input] -> Ok(#(17, input)) - ["1", "8", ..input] -> Ok(#(18, input)) - ["1", "9", ..input] -> Ok(#(19, input)) - ["2", "0", ..input] -> Ok(#(20, input)) - ["2", "1", ..input] -> Ok(#(21, input)) - ["2", "2", ..input] -> Ok(#(22, input)) - ["2", "3", ..input] -> Ok(#(23, input)) - ["2", "4", ..input] -> Ok(#(24, input)) - ["2", "5", ..input] -> Ok(#(25, input)) - ["2", "6", ..input] -> Ok(#(26, input)) - ["2", "7", ..input] -> Ok(#(27, input)) - ["2", "8", ..input] -> Ok(#(28, input)) - ["2", "9", ..input] -> Ok(#(29, input)) - ["3", "0", ..input] -> Ok(#(30, input)) - ["3", "1", ..input] -> Ok(#(31, input)) - ["3", "2", ..input] -> Ok(#(32, input)) - ["3", "3", ..input] -> Ok(#(33, input)) - ["3", "4", ..input] -> Ok(#(34, input)) - ["3", "5", ..input] -> Ok(#(35, input)) - ["3", "6", ..input] -> Ok(#(36, input)) - ["3", "7", ..input] -> Ok(#(37, input)) - ["3", "8", ..input] -> Ok(#(38, input)) - ["3", "9", ..input] -> Ok(#(39, input)) - ["4", "0", ..input] -> Ok(#(40, input)) - ["4", "1", ..input] -> Ok(#(41, input)) - ["4", "2", ..input] -> Ok(#(42, input)) - ["4", "3", ..input] -> Ok(#(43, input)) - ["4", "4", ..input] -> Ok(#(44, input)) - ["4", "5", ..input] -> Ok(#(45, input)) - ["4", "6", ..input] -> Ok(#(46, input)) - ["4", "7", ..input] -> Ok(#(47, input)) - ["4", "8", ..input] -> Ok(#(48, input)) - ["4", "9", ..input] -> Ok(#(49, input)) - ["5", "0", ..input] -> Ok(#(50, input)) - ["5", "1", ..input] -> Ok(#(51, input)) - ["5", "2", ..input] -> Ok(#(52, input)) - ["5", "3", ..input] -> Ok(#(53, input)) - ["5", "4", ..input] -> Ok(#(54, input)) - ["5", "5", ..input] -> Ok(#(55, input)) - ["5", "6", ..input] -> Ok(#(56, input)) - ["5", "7", ..input] -> Ok(#(57, input)) - ["5", "8", ..input] -> Ok(#(58, input)) - ["5", "9", ..input] -> Ok(#(59, input)) - - [g, ..] -> Error(Unexpected(g, expected)) - [] -> Error(Unexpected("EOF", expected)) - } -} - -fn parse_date(input: Tokens, year: Int) -> Parsed(Toml) { - case input { - ["0", "1", "-", ..input] -> parse_date_day(input, year, 1) - ["0", "2", "-", ..input] -> parse_date_day(input, year, 2) - ["0", "3", "-", ..input] -> parse_date_day(input, year, 3) - ["0", "4", "-", ..input] -> parse_date_day(input, year, 4) - ["0", "5", "-", ..input] -> parse_date_day(input, year, 5) - ["0", "6", "-", ..input] -> parse_date_day(input, year, 6) - ["0", "7", "-", ..input] -> parse_date_day(input, year, 7) - ["0", "8", "-", ..input] -> parse_date_day(input, year, 8) - ["0", "9", "-", ..input] -> parse_date_day(input, year, 9) - ["1", "0", "-", ..input] -> parse_date_day(input, year, 10) - ["1", "1", "-", ..input] -> parse_date_day(input, year, 11) - ["1", "2", "-", ..input] -> parse_date_day(input, year, 12) - - [g, ..] -> Error(Unexpected(g, "date month")) - [] -> Error(Unexpected("EOF", "date month")) - } -} - -fn parse_date_day(input: Tokens, year: Int, month: Int) -> Parsed(Toml) { - case input { - ["0", "1", ..input] -> parse_date_end(input, year, month, 1) - ["0", "2", ..input] -> parse_date_end(input, year, month, 2) - ["0", "3", ..input] -> parse_date_end(input, year, month, 3) - ["0", "4", ..input] -> parse_date_end(input, year, month, 4) - ["0", "5", ..input] -> parse_date_end(input, year, month, 5) - ["0", "6", ..input] -> parse_date_end(input, year, month, 6) - ["0", "7", ..input] -> parse_date_end(input, year, month, 7) - ["0", "8", ..input] -> parse_date_end(input, year, month, 8) - ["0", "9", ..input] -> parse_date_end(input, year, month, 9) - ["1", "0", ..input] -> parse_date_end(input, year, month, 10) - ["1", "1", ..input] -> parse_date_end(input, year, month, 11) - ["1", "2", ..input] -> parse_date_end(input, year, month, 12) - ["1", "3", ..input] -> parse_date_end(input, year, month, 13) - ["1", "4", ..input] -> parse_date_end(input, year, month, 14) - ["1", "5", ..input] -> parse_date_end(input, year, month, 15) - ["1", "6", ..input] -> parse_date_end(input, year, month, 16) - ["1", "7", ..input] -> parse_date_end(input, year, month, 17) - ["1", "8", ..input] -> parse_date_end(input, year, month, 18) - ["1", "9", ..input] -> parse_date_end(input, year, month, 19) - ["2", "0", ..input] -> parse_date_end(input, year, month, 20) - ["2", "1", ..input] -> parse_date_end(input, year, month, 21) - ["2", "2", ..input] -> parse_date_end(input, year, month, 22) - ["2", "3", ..input] -> parse_date_end(input, year, month, 23) - ["2", "4", ..input] -> parse_date_end(input, year, month, 24) - ["2", "5", ..input] -> parse_date_end(input, year, month, 25) - ["2", "6", ..input] -> parse_date_end(input, year, month, 26) - ["2", "7", ..input] -> parse_date_end(input, year, month, 27) - ["2", "8", ..input] -> parse_date_end(input, year, month, 28) - ["2", "9", ..input] -> parse_date_end(input, year, month, 29) - ["3", "0", ..input] -> parse_date_end(input, year, month, 30) - ["3", "1", ..input] -> parse_date_end(input, year, month, 31) - - [g, ..] -> Error(Unexpected(g, "date day")) - [] -> Error(Unexpected("EOF", "date day")) - } -} - -fn parse_date_end( - input: Tokens, - year: Int, - month: Int, - day: Int, -) -> Parsed(Toml) { - let date = DateValue(year, month, day) - case input { - [" ", ..input] | ["T", ..input] -> { - use time, input <- do(parse_time_value(input)) - use offset, input <- do(parse_offset(input)) - Ok(#(DateTime(DateTimeValue(date, time, offset)), input)) - } - - _ -> Ok(#(Date(date), input)) - } -} - -fn parse_offset(input: Tokens) -> Parsed(Offset) { - case input { - ["Z", ..input] -> Ok(#(Offset(Positive, 0, 0), input)) - ["+", ..input] -> parse_offset_hours(input, Positive) - ["-", ..input] -> parse_offset_hours(input, Negative) - _ -> Ok(#(Local, input)) - } -} - -fn parse_offset_hours(input: Tokens, sign: Sign) -> Parsed(Offset) { - use #(hours, minutes), input <- do(parse_hour_minute(input)) - Ok(#(Offset(sign, hours, minutes), input)) -} diff --git a/packages/tom/test/tom_test.gleam b/packages/tom/test/tom_test.gleam deleted file mode 100644 index ce51743..0000000 --- a/packages/tom/test/tom_test.gleam +++ /dev/null @@ -1,930 +0,0 @@ -import gleam/dict -import gleeunit -import gleeunit/should -import tom - -pub fn main() { - gleeunit.main() -} - -pub fn parse_empty_test() { - "" - |> tom.parse - |> should.equal(Ok(dict.from_list([]))) -} - -pub fn parse_spaces_test() { - " " - |> tom.parse - |> should.equal(Ok(dict.from_list([]))) -} - -pub fn parse_newline_test() { - "\n" - |> tom.parse - |> should.equal(Ok(dict.from_list([]))) -} - -pub fn parse_crlf_test() { - "\r\n" - |> tom.parse - |> should.equal(Ok(dict.from_list([]))) -} - -pub fn parse_quoted_key_test() { - let expected = dict.from_list([#(" ", tom.Bool(True))]) - "\" \" = true\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_single_key_test() { - let expected = dict.from_list([#("", tom.Bool(True))]) - "'' = true\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_true_test() { - let expected = dict.from_list([#("cool", tom.Bool(True))]) - "cool = true\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_false_test() { - let expected = dict.from_list([#("cool", tom.Bool(False))]) - "cool = false\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_unicode_key_test() { - let expected = dict.from_list([#("பெண்", tom.Bool(False))]) - "பெண் = false\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_int_test() { - let expected = dict.from_list([#("it", tom.Int(1))]) - "it = 1\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_int_underscored_test() { - let expected = dict.from_list([#("it", tom.Int(1_000_009))]) - "it = 1_000_0__0_9\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_int_positive_test() { - let expected = dict.from_list([#("it", tom.Int(234))]) - "it = +234\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_int_negative_test() { - let expected = dict.from_list([#("it", tom.Int(-234))]) - "it = -234\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_string_test() { - let expected = dict.from_list([#("hello", tom.String("Joe"))]) - "hello = \"Joe\"\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_string_escaped_quote_test() { - let expected = dict.from_list([#("hello", tom.String("\""))]) - "hello = \"\\\"\"\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_string_tab_test() { - let expected = dict.from_list([#("hello", tom.String("\t"))]) - "hello = \"\\t\"\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_string_newline_test() { - let expected = dict.from_list([#("hello", tom.String("\n"))]) - "hello = \"\\n\"\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_string_linefeed_test() { - let expected = dict.from_list([#("hello", tom.String("\r"))]) - "hello = \"\\r\"\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_escaped_slash_test() { - let expected = dict.from_list([#("hello", tom.String("\\"))]) - "hello = \"\\\\\"\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_test() { - let expected = dict.from_list([#("it", tom.Float(1.0))]) - "it = 1.0\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_bigger_float_test() { - let expected = dict.from_list([#("it", tom.Float(123_456_789.9876))]) - "it = 123456789.9876\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_segment_key_test() { - let expected = - dict.from_list([ - #( - "one", - tom.Table( - dict.from_list([ - #("two", tom.Table(dict.from_list([#("three", tom.Bool(True))]))), - ]), - ), - ), - ]) - "one.two.three = true\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_segment_key_with_spaeces_test() { - let expected = - dict.from_list([ - #( - "one", - tom.Table( - dict.from_list([ - #("two", tom.Table(dict.from_list([#("three", tom.Bool(True))]))), - ]), - ), - ), - ]) - "one . two . three = true\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_segment_key_quotes_test() { - let expected = - dict.from_list([ - #( - "1", - tom.Table( - dict.from_list([ - #("two", tom.Table(dict.from_list([#("3", tom.Bool(True))]))), - ]), - ), - ), - ]) - "\"1\".two.\"3\" = true\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multiple_keys_test() { - let expected = dict.from_list([#("a", tom.Int(1)), #("b", tom.Int(2))]) - "a = 1\nb = 2\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_duplicate_key_test() { - "a = 1\na = 2\n" - |> tom.parse - |> should.equal(Error(tom.KeyAlreadyInUse(["a"]))) -} - -pub fn parse_conflicting_keys_test() { - "a = 1\na.b = 2\n" - |> tom.parse - |> should.equal(Error(tom.KeyAlreadyInUse(["a"]))) -} - -pub fn parse_empty_array_test() { - let expected = dict.from_list([#("a", tom.Array([]))]) - "a = []\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_array_test() { - let expected = dict.from_list([#("a", tom.Array([tom.Int(1), tom.Int(2)]))]) - "a = [1, 2]\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_line_array_test() { - let expected = dict.from_list([#("a", tom.Array([tom.Int(1), tom.Int(2)]))]) - "a = [\n 1 \n ,\n 2,\n]\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_table_test() { - let expected = dict.from_list([#("a", tom.Table(dict.from_list([])))]) - "[a]\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_table_with_values_test() { - let expected = - dict.from_list([ - #( - "a", - tom.Table( - dict.from_list([ - #("a", tom.Int(1)), - #("b", tom.Table(dict.from_list([#("c", tom.Int(2))]))), - ]), - ), - ), - ]) - "[a] -a = 1 -b.c = 2 -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_table_with_values_before_test() { - let expected = - dict.from_list([ - #("name", tom.String("Joe")), - #("size", tom.Int(123)), - #( - "a", - tom.Table( - dict.from_list([ - #("a", tom.Int(1)), - #("b", tom.Table(dict.from_list([#("c", tom.Int(2))]))), - ]), - ), - ), - ]) - "name = \"Joe\" -size = 123 - -[a] -a = 1 -b.c = 2 -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multiple_tables_test() { - let expected = - dict.from_list([ - #("name", tom.String("Joe")), - #("size", tom.Int(123)), - #( - "a", - tom.Table( - dict.from_list([ - #("a", tom.Int(1)), - #("b", tom.Table(dict.from_list([#("c", tom.Int(2))]))), - ]), - ), - ), - #("b", tom.Table(dict.from_list([#("a", tom.Int(1))]))), - ]) - "name = \"Joe\" -size = 123 - -[a] -a = 1 -b.c = 2 - -[b] -a = 1 -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_inline_table_empty_test() { - let expected = dict.from_list([#("a", tom.InlineTable(dict.from_list([])))]) - "a = {}\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_inline_table_test() { - let expected = - dict.from_list([ - #( - "a", - tom.InlineTable( - dict.from_list([ - #("a", tom.Int(1)), - #("b", tom.Table(dict.from_list([#("c", tom.Int(2))]))), - ]), - ), - ), - ]) - "a = { - a = 1, - b.c = 2 -} -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_inline_trailing_comma_table_test() { - let expected = - dict.from_list([ - #( - "a", - tom.InlineTable( - dict.from_list([ - #("a", tom.Int(1)), - #("b", tom.Table(dict.from_list([#("c", tom.Int(2))]))), - ]), - ), - ), - ]) - "a = { - a = 1, - b.c = 2, -} -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_invalid_newline_in_string_test() { - "a = \"\n\"" - |> tom.parse - |> should.equal(Error(tom.Unexpected("\n", "\""))) -} - -pub fn parse_invalid_newline_windows_in_string_test() { - "a = \"\r\n\"" - |> tom.parse - |> should.equal(Error(tom.Unexpected("\r\n", "\""))) -} - -pub fn parse_array_of_tables_empty_test() { - let expected = - dict.from_list([ - #( - "a", - tom.ArrayOfTables([ - dict.from_list([]), - dict.from_list([]), - dict.from_list([]), - ]), - ), - ]) - "[[a]] -[[a]] -[[a]] -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_array_of_tables_nonempty_test() { - let expected = - dict.from_list([ - #( - "a", - tom.ArrayOfTables([ - dict.from_list([#("a", tom.Int(1))]), - dict.from_list([#("a", tom.Int(2))]), - dict.from_list([#("a", tom.Int(3))]), - ]), - ), - ]) - "[[a]] -a = 1 - -[[a]] -a = 2 - -[[a]] -a = 3 -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_array_of_tables_with_subtable_test() { - let expected = - dict.from_list([ - #( - "fruits", - tom.ArrayOfTables([ - dict.from_list([]), - dict.from_list([ - #("name", tom.String("apple")), - #( - "physical", - tom.Table( - dict.from_list([ - #("color", tom.String("red")), - #("shape", tom.String("round")), - ]), - ), - ), - ]), - ]), - ), - ]) - "[[fruits]] - -[[fruits]] -name = \"apple\" - -[fruits.physical] # subtable -color = \"red\" -shape = \"round\" -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_single_quote_string_test() { - let expected = dict.from_list([#("a", tom.String("\\n"))]) - "a = '\\n'\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_line_string_test() { - let expected = dict.from_list([#("a", tom.String("hello\nworld"))]) - "a = \"\"\" -hello -world\"\"\" -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_line_single_quote_string_test() { - let expected = dict.from_list([#("a", tom.String("hello\\n\nworld"))]) - "a = ''' -hello\\n -world''' -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_line_single_quote_string_too_many_quotes_test() { - "a = ''' -'''' -''' -" - |> tom.parse - |> should.equal(Error(tom.Unexpected("''''", "'''"))) -} - -pub fn parse_multi_line_string_escape_newline_test() { - let expected = - dict.from_list([ - #("a", tom.String("The quick brown fox jumps over the lazy dog.")), - ]) - "a = \"\"\" -The quick brown \\ - - - fox jumps over \\ - the lazy dog.\"\"\" -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_multi_line_string_escape_newline_windows_test() { - let expected = - dict.from_list([ - #("a", tom.String("The quick brown fox jumps over the lazy dog.")), - ]) - "a = \"\"\" -The quick brown \\\r\n - - - fox jumps over \\\r\n - the lazy dog.\"\"\" -" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_nan_test() { - let expected = dict.from_list([#("a", tom.Nan(tom.Positive))]) - "a = nan\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_positive_nan_test() { - let expected = dict.from_list([#("a", tom.Nan(tom.Positive))]) - "a = +nan\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_negative_nan_test() { - let expected = dict.from_list([#("a", tom.Nan(tom.Negative))]) - "a = -nan\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_infinity_test() { - let expected = dict.from_list([#("a", tom.Infinity(tom.Positive))]) - "a = inf\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_positive_infinity_test() { - let expected = dict.from_list([#("a", tom.Infinity(tom.Positive))]) - "a = +inf\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_negative_infinity_test() { - let expected = dict.from_list([#("a", tom.Infinity(tom.Negative))]) - "a = -inf\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_write_to_key_that_does_not_exist_test() { - let expected = - dict.from_list([ - #("apple", tom.Table(dict.from_list([#("smooth", tom.Bool(True))]))), - ]) - "apple.smooth = true\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_binary_test() { - let expected = dict.from_list([#("a", tom.Int(0b101010))]) - "a = 0b101010\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_binary_positive_test() { - let expected = dict.from_list([#("a", tom.Int(0b101010))]) - "a = +0b101010\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_binary_negative_test() { - let expected = dict.from_list([#("a", tom.Int(0b101010 * -1))]) - "a = -0b101010\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_binary_underscores_test() { - let expected = dict.from_list([#("a", tom.Int(0b101010))]) - "a = 0b1__010___1_0\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_octal_test() { - let expected = dict.from_list([#("a", tom.Int(0o1234567))]) - "a = 0o1234567\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_octal_positive_test() { - let expected = dict.from_list([#("a", tom.Int(0o1234567))]) - "a = +0o1234567\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_octal_negative_test() { - let expected = dict.from_list([#("a", tom.Int(0o1234567 * -1))]) - "a = -0o1234567\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_octal_underscores_test() { - let expected = dict.from_list([#("a", tom.Int(0o1234567))]) - "a = 0o1_23_45__6_7\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_hex_test() { - let expected = dict.from_list([#("a", tom.Int(0xdeadbeef))]) - "a = 0xdeadbeef\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_hex_positive_test() { - let expected = dict.from_list([#("a", tom.Int(0xdeadbeef))]) - "a = +0xdeadbeef\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_hex_negative_test() { - let expected = dict.from_list([#("a", tom.Int(0xdeadbeef * -1))]) - "a = -0xdeadbeef\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_hex_underscores_test() { - let expected = dict.from_list([#("a", tom.Int(0xdeadbeef))]) - "a = 0xd_e_a_d__b___e____e______f\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_hex_uppercase_test() { - let expected = dict.from_list([#("a", tom.Int(0xdeadbeef))]) - "a = +0xDEADBEEF\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_exponent_test() { - let expected = dict.from_list([#("a", tom.Float(1.0e6))]) - "a = 1e6\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_exponent_uppercase_test() { - let expected = dict.from_list([#("a", tom.Float(1.0e6))]) - "a = 1E6\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_exponent_postive_test() { - let expected = dict.from_list([#("a", tom.Float(5.0e22))]) - "a = 5e+22\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_exponent_negative_test() { - let expected = dict.from_list([#("a", tom.Float(-2.0e-22))]) - "a = -2e-22\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_decimal_and_exponent_test() { - let expected = dict.from_list([#("a", tom.Float(6.626e25))]) - "a = 6.626e25\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_decimal_and_exponent_positive_test() { - let expected = dict.from_list([#("a", tom.Float(6.626e25))]) - "a = 6.626e+25\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_float_decimal_and_exponent_negative_test() { - let expected = dict.from_list([#("a", tom.Float(6.626e-25))]) - "a = 6.626e-25\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_date_test() { - let expected = dict.from_list([#("a", tom.Date(tom.DateValue(1979, 5, 27)))]) - "a = 1979-05-27\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_time_test() { - let expected = dict.from_list([#("a", tom.Time(tom.TimeValue(7, 32, 1, 0)))]) - "a = 07:32:01\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_time_zero_minute_test() { - let expected = dict.from_list([#("a", tom.Time(tom.TimeValue(7, 0, 1, 0)))]) - "a = 07:00:01\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_time_milliseconds_test() { - let expected = - dict.from_list([#("a", tom.Time(tom.TimeValue(7, 32, 1, 999_999)))]) - "a = 07:32:01.999999\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_time_milliseconds_1_test() { - let expected = - dict.from_list([#("a", tom.Time(tom.TimeValue(7, 32, 1, 9179)))]) - "a = 07:32:01.09179\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_time_no_seconds_test() { - let expected = dict.from_list([#("a", tom.Time(tom.TimeValue(7, 32, 0, 0)))]) - "a = 07:32\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_date_time_test() { - let expected = - dict.from_list([ - #( - "a", - tom.DateTime(tom.DateTimeValue( - tom.DateValue(1979, 5, 27), - tom.TimeValue(7, 32, 0, 0), - offset: tom.Local, - )), - ), - ]) - "a = 1979-05-27T07:32:00\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_date_time_space_test() { - let expected = - dict.from_list([ - #( - "a", - tom.DateTime(tom.DateTimeValue( - tom.DateValue(1979, 5, 27), - tom.TimeValue(7, 0, 1, 0), - offset: tom.Local, - )), - ), - ]) - "a = 1979-05-27 07:00:01\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_offset_z_date_time_test() { - let expected = - dict.from_list([ - #( - "a", - tom.DateTime(tom.DateTimeValue( - tom.DateValue(1979, 5, 27), - tom.TimeValue(7, 32, 0, 0), - offset: tom.Offset(tom.Positive, 0, 0), - )), - ), - ]) - "a = 1979-05-27T07:32:00Z\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_offset_z_date_time_space_test() { - let expected = - dict.from_list([ - #( - "a", - tom.DateTime(tom.DateTimeValue( - tom.DateValue(1979, 5, 27), - tom.TimeValue(7, 0, 1, 0), - offset: tom.Offset(tom.Positive, 0, 0), - )), - ), - ]) - "a = 1979-05-27 07:00:01Z\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_offset_positive_date_time_space_test() { - let expected = - dict.from_list([ - #( - "a", - tom.DateTime(tom.DateTimeValue( - tom.DateValue(1979, 5, 27), - tom.TimeValue(7, 0, 1, 0), - offset: tom.Offset(tom.Positive, 7, 40), - )), - ), - ]) - "a = 1979-05-27 07:00:01+07:40\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_offset_negative_date_time_space_test() { - let expected = - dict.from_list([ - #( - "a", - tom.DateTime(tom.DateTimeValue( - tom.DateValue(1979, 5, 27), - tom.TimeValue(7, 0, 1, 0), - offset: tom.Offset(tom.Negative, 7, 1), - )), - ), - ]) - "a = 1979-05-27 07:00:01-07:01\n" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_no_trailing_newline_test() { - let expected = dict.from_list([#("a", tom.Int(1))]) - "a = 1" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_trailing_whitespace_test() { - let expected = dict.from_list([#("a", tom.Int(1))]) - "a = 1 " - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_trailing_other_test() { - "a = 1 b" - |> tom.parse - |> should.equal(Error(tom.Unexpected("b", "\n"))) -} - -pub fn parse_sequence_e_test() { - "a = \"\\e\"" - |> tom.parse - |> should.equal(Ok(dict.from_list([#("a", tom.String("\u{001b}"))]))) -} - -pub fn parse_sequence_f_test() { - "a = \"\\f\"" - |> tom.parse - |> should.equal(Ok(dict.from_list([#("a", tom.String("\f"))]))) -} - -pub fn parse_sequence_b_test() { - "a = \"\\b\"" - |> tom.parse - |> should.equal(Ok(dict.from_list([#("a", tom.String("\u{0008}"))]))) -} - -pub fn parse_ignore_comments_test() { - let expected = dict.from_list([#("field", tom.String("#"))]) - "# This should be ignored -field = \"#\"" - |> tom.parse - |> should.equal(Ok(expected)) -} - -pub fn parse_not_remove_hash_in_string_test() { - let content = tom.Table(dict.from_list([#("field", tom.String("#"))])) - let expected = dict.from_list([#("section", content)]) - "[section] -field = \"#\"" - |> tom.parse - |> should.equal(Ok(expected)) -} From c02fcf3dfb927970399462c982720367851854f9 Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 15:49:09 +0100 Subject: [PATCH 2/9] Update frontend --- apps/frontend/gleam.toml | 13 +- apps/frontend/index.html | 2 +- apps/frontend/manifest.toml | 63 +- apps/frontend/package.json | 4 - apps/frontend/src/chart.gleam | 14 +- apps/frontend/src/data/metadata.gleam | 2 +- apps/frontend/src/data/model.gleam | 11 +- apps/frontend/src/data/msg.gleam | 4 +- apps/frontend/src/data/package.gleam | 1 - .../src/{ => elements}/bar_chart.element.mjs | 14 +- .../src/{ => elements}/line_chart.element.mjs | 14 +- apps/frontend/src/frontend.gleam | 51 +- .../src/{frontend.ts => frontend.mjs} | 19 +- apps/frontend/src/frontend/ffi.gleam | 11 +- apps/frontend/src/frontend/view.gleam | 31 +- .../src/frontend/view/body/body.gleam | 2 +- .../src/frontend/view/body/signature.gleam | 47 +- .../src/frontend/view/body/styles.gleam | 318 +- .../src/frontend/view/documentation.gleam | 2 +- .../src/frontend/view/footer/styles.gleam | 31 +- .../src/frontend/view/navbar/styles.gleam | 36 +- .../frontend/view/search_input/styles.gleam | 21 +- .../src/{ => gleam}/decoder_extra.gleam | 0 apps/frontend/src/gloogle.ffi.mjs | 39 +- apps/frontend/src/lustre/effect/extra.gleam | 10 - apps/frontend/src/stylesheets/all.css | 2 - apps/frontend/tsconfig.json | 25 - apps/frontend/vite.config.js | 1 - packages/lustre/.github/FUNDING.yml | 13 - packages/lustre/.github/workflows/release.yml | 32 - packages/lustre/.gitignore | 8 - packages/lustre/LICENSE | 18 - packages/lustre/README.md | 199 -- ..._diff_from_one_render_to_the_next.accepted | 5 - ...render_to_the_next_with_fragments.accepted | 5 - ...er_an_application's_initial_state.accepted | 5 - ...nitial_state_when_using_fragments.accepted | 5 - ...cation's_state_after_some_updates.accepted | 5 - .../can_render_static_html.accepted | 5 - ...render_static_html_with_unescaped_html.new | 6 - ...e_dangerous_symbols_in_attributes.accepted | 5 - .../lustre/examples/01-hello-world/README.md | 67 - .../lustre/examples/01-hello-world/gleam.toml | 13 - .../lustre/examples/01-hello-world/header.png | Bin 327828 -> 0 bytes .../lustre/examples/01-hello-world/index.html | 19 - .../examples/01-hello-world/manifest.toml | 49 - .../examples/01-hello-world/src/app.gleam | 20 - .../examples/02-interactivity/README.md | 149 - .../examples/02-interactivity/gleam.toml | 13 - .../examples/02-interactivity/header.png | Bin 320493 -> 0 bytes .../examples/02-interactivity/index.html | 19 - .../examples/02-interactivity/manifest.toml | 49 - .../examples/02-interactivity/src/app.gleam | 60 - .../examples/03-controlled-inputs/README.md | 70 - .../examples/03-controlled-inputs/gleam.toml | 13 - .../examples/03-controlled-inputs/header.png | Bin 330067 -> 0 bytes .../examples/03-controlled-inputs/index.html | 19 - .../03-controlled-inputs/manifest.toml | 49 - .../03-controlled-inputs/src/app.gleam | 71 - .../04-custom-event-handlers/README.md | 76 - .../04-custom-event-handlers/gleam.toml | 13 - .../04-custom-event-handlers/header.png | Bin 99692 -> 0 bytes .../04-custom-event-handlers/index.html | 19 - .../04-custom-event-handlers/manifest.toml | 49 - .../04-custom-event-handlers/src/app.gleam | 77 - .../examples/05-http-requests/README.md | 137 - .../examples/05-http-requests/gleam.toml | 14 - .../examples/05-http-requests/header.png | Bin 369241 -> 0 bytes .../examples/05-http-requests/index.html | 19 - .../examples/05-http-requests/manifest.toml | 53 - .../examples/05-http-requests/src/app.gleam | 93 - .../examples/06-custom-effects/README.md | 88 - .../examples/06-custom-effects/gleam.toml | 14 - .../examples/06-custom-effects/header.png | Bin 219045 -> 0 bytes .../examples/06-custom-effects/index.html | 19 - .../examples/06-custom-effects/manifest.toml | 53 - .../06-custom-effects/src/app.ffi.mjs | 11 - .../examples/06-custom-effects/src/app.gleam | 84 - packages/lustre/examples/07-routing/README.md | 65 - .../lustre/examples/07-routing/gleam.toml | 15 - .../lustre/examples/07-routing/header.png | Bin 317512 -> 0 bytes .../lustre/examples/07-routing/index.html | 19 - .../lustre/examples/07-routing/manifest.toml | 55 - .../lustre/examples/07-routing/src/app.gleam | 169 - .../99-full-stack-applications/README.md | 25 - .../client/gleam.toml | 24 - .../client/index.html | 15 - .../client/manifest.toml | 54 - .../client/src/app.gleam | 127 - .../server/manifest.toml | 11 - .../server/src/app.gleam | 5 - .../shared/gleam.toml | 19 - .../shared/manifest.toml | 11 - .../shared/src/shared.gleam | 5 - .../examples/99-server-components/README.md | 0 .../examples/99-server-components/gleam.toml | 27 - .../99-server-components/manifest.toml | 37 - .../99-server-components/src/app.gleam | 168 - .../99-server-components/src/counter.gleam | 58 - packages/lustre/examples/README.md | 47 - packages/lustre/gleam.toml | 49 - packages/lustre/manifest.toml | 33 - packages/lustre/package-lock.json | 3170 ----------------- packages/lustre/package.json | 31 - packages/lustre/pages/guide/01-quickstart.md | 422 --- .../lustre/pages/guide/02-state-management.md | 244 -- .../lustre/pages/guide/03-side-effects.md | 268 -- .../pages/guide/04-server-side-rendering.md | 216 -- .../pages/hints/attributes-vs-properties.md | 69 - packages/lustre/pages/hints/pure-functions.md | 55 - packages/lustre/pages/reference/examples.md | 45 - .../lustre/pages/reference/for-elm-devs.md | 245 -- .../pages/reference/for-liveview-devs.md | 252 -- .../lustre/pages/reference/for-react-devs.md | 118 - packages/lustre/src/client-component.ffi.mjs | 114 - packages/lustre/src/client-runtime.ffi.mjs | 176 - packages/lustre/src/lustre-escape.ffi.mjs | 11 - packages/lustre/src/lustre.gleam | 525 --- packages/lustre/src/lustre/attribute.gleam | 355 -- packages/lustre/src/lustre/effect.gleam | 143 - packages/lustre/src/lustre/element.gleam | 378 -- packages/lustre/src/lustre/element/html.gleam | 890 ----- packages/lustre/src/lustre/element/svg.gleam | 413 --- packages/lustre/src/lustre/event.gleam | 217 -- .../src/lustre/internals/constants.gleam | 26 - .../lustre/src/lustre/internals/escape.gleam | 291 -- .../lustre/src/lustre/internals/patch.gleam | 439 --- .../lustre/src/lustre/internals/runtime.gleam | 237 -- .../lustre/src/lustre/internals/vdom.gleam | 399 --- .../lustre/src/lustre/server_component.gleam | 293 -- packages/lustre/src/lustre_escape_ffi.erl | 4 - packages/lustre/src/server-component.mjs | 210 -- packages/lustre/src/server-runtime.ffi.mjs | 143 - packages/lustre/src/vdom.ffi.mjs | 572 --- .../test-apps/bool-property-toggle/README.md | 2 - .../test-apps/bool-property-toggle/gleam.toml | 12 - .../bool-property-toggle/manifest.toml | 33 - .../bool-property-toggle/src/app.gleam | 45 - .../lustre/test-apps/change-tag/README.md | 3 - .../lustre/test-apps/change-tag/gleam.toml | 12 - .../lustre/test-apps/change-tag/manifest.toml | 33 - .../lustre/test-apps/change-tag/src/app.gleam | 66 - .../test-apps/nested-element-map/README.md | 1 - .../test-apps/nested-element-map/gleam.toml | 11 - .../nested-element-map/manifest.toml | 31 - .../nested-element-map/src/app.gleam | 51 - .../lustre/test-apps/no-keyed-diff/README.md | 2 - .../lustre/test-apps/no-keyed-diff/gleam.toml | 12 - .../test-apps/no-keyed-diff/manifest.toml | 33 - .../test-apps/no-keyed-diff/src/app.gleam | 68 - .../lustre/test-apps/options-list/README.md | 3 - .../lustre/test-apps/options-list/gleam.toml | 12 - .../lustre/test-apps/options-list/index.html | 15 - .../test-apps/options-list/manifest.toml | 46 - .../test-apps/options-list/src/app.gleam | 49 - .../README.md | 5 - .../gleam.toml | 27 - .../manifest.toml | 31 - .../src/app.gleam | 167 - .../src/counter.gleam | 88 - packages/lustre/test-apps/svg/README.md | 3 - packages/lustre/test-apps/svg/gleam.toml | 12 - packages/lustre/test-apps/svg/manifest.toml | 33 - packages/lustre/test-apps/svg/src/app.gleam | 35 - .../test-apps/vdom-test-templates/gleam.toml | 7 - .../vdom-test-templates/manifest.toml | 15 - .../vdom-test-templates/src/client_test.gleam | 64 - packages/lustre/test/02-interactivity.test.js | 88 - packages/lustre/test/README.md | 29 - packages/lustre/test/apps/counter.gleam | 41 - packages/lustre/test/apps/fragment.gleam | 45 - packages/lustre/test/apps/static.gleam | 29 - packages/lustre/test/build.gleam | 122 - packages/lustre/test/lustre_test.gleam | 175 - packages/lustre/test/utils.js | 29 - packages/lustre/test/vdom.ffi.bench.js | 27 - packages/lustre/test/vdom.ffi.test.js | 150 - packages/lustre/vitest.config.js | 18 - .../02-interactivity.test.js.snap | 19 - .../vitest_snapshots/vdom.ffi.test.js.snap | 55 - packages/sketch_magic/.gitignore | 4 + packages/sketch_magic/README.md | 24 + .../server => sketch_magic}/gleam.toml | 8 +- packages/sketch_magic/manifest.toml | 18 + packages/sketch_magic/package.json | 10 + .../src/sketch/internals/ffi.gleam | 27 + packages/sketch_magic/src/sketch/magic.gleam | 69 + .../src/sketch/magic/element.gleam | 53 + .../src/sketch/magic/element/html.gleam | 1583 ++++++++ .../sketch_magic/src/sketch_magic.ffi.mjs | 28 + .../sketch_magic/test/sketch_magic_test.gleam | 12 + 191 files changed, 2180 insertions(+), 16117 deletions(-) rename apps/frontend/src/{ => elements}/bar_chart.element.mjs (91%) rename apps/frontend/src/{ => elements}/line_chart.element.mjs (90%) rename apps/frontend/src/{frontend.ts => frontend.mjs} (55%) rename apps/frontend/src/{ => gleam}/decoder_extra.gleam (100%) delete mode 100644 apps/frontend/tsconfig.json delete mode 100644 packages/lustre/.github/FUNDING.yml delete mode 100644 packages/lustre/.github/workflows/release.yml delete mode 100644 packages/lustre/.gitignore delete mode 100644 packages/lustre/LICENSE delete mode 100644 packages/lustre/README.md delete mode 100644 packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next.accepted delete mode 100644 packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next_with_fragments.accepted delete mode 100644 packages/lustre/birdie_snapshots/can_render_an_application's_initial_state.accepted delete mode 100644 packages/lustre/birdie_snapshots/can_render_an_application's_initial_state_when_using_fragments.accepted delete mode 100644 packages/lustre/birdie_snapshots/can_render_an_application's_state_after_some_updates.accepted delete mode 100644 packages/lustre/birdie_snapshots/can_render_static_html.accepted delete mode 100644 packages/lustre/birdie_snapshots/can_render_static_html_with_unescaped_html.new delete mode 100644 packages/lustre/birdie_snapshots/can_safely_escape_dangerous_symbols_in_attributes.accepted delete mode 100644 packages/lustre/examples/01-hello-world/README.md delete mode 100644 packages/lustre/examples/01-hello-world/gleam.toml delete mode 100644 packages/lustre/examples/01-hello-world/header.png delete mode 100644 packages/lustre/examples/01-hello-world/index.html delete mode 100644 packages/lustre/examples/01-hello-world/manifest.toml delete mode 100644 packages/lustre/examples/01-hello-world/src/app.gleam delete mode 100644 packages/lustre/examples/02-interactivity/README.md delete mode 100644 packages/lustre/examples/02-interactivity/gleam.toml delete mode 100644 packages/lustre/examples/02-interactivity/header.png delete mode 100644 packages/lustre/examples/02-interactivity/index.html delete mode 100644 packages/lustre/examples/02-interactivity/manifest.toml delete mode 100644 packages/lustre/examples/02-interactivity/src/app.gleam delete mode 100644 packages/lustre/examples/03-controlled-inputs/README.md delete mode 100644 packages/lustre/examples/03-controlled-inputs/gleam.toml delete mode 100644 packages/lustre/examples/03-controlled-inputs/header.png delete mode 100644 packages/lustre/examples/03-controlled-inputs/index.html delete mode 100644 packages/lustre/examples/03-controlled-inputs/manifest.toml delete mode 100644 packages/lustre/examples/03-controlled-inputs/src/app.gleam delete mode 100644 packages/lustre/examples/04-custom-event-handlers/README.md delete mode 100644 packages/lustre/examples/04-custom-event-handlers/gleam.toml delete mode 100644 packages/lustre/examples/04-custom-event-handlers/header.png delete mode 100644 packages/lustre/examples/04-custom-event-handlers/index.html delete mode 100644 packages/lustre/examples/04-custom-event-handlers/manifest.toml delete mode 100644 packages/lustre/examples/04-custom-event-handlers/src/app.gleam delete mode 100644 packages/lustre/examples/05-http-requests/README.md delete mode 100644 packages/lustre/examples/05-http-requests/gleam.toml delete mode 100644 packages/lustre/examples/05-http-requests/header.png delete mode 100644 packages/lustre/examples/05-http-requests/index.html delete mode 100644 packages/lustre/examples/05-http-requests/manifest.toml delete mode 100644 packages/lustre/examples/05-http-requests/src/app.gleam delete mode 100644 packages/lustre/examples/06-custom-effects/README.md delete mode 100644 packages/lustre/examples/06-custom-effects/gleam.toml delete mode 100644 packages/lustre/examples/06-custom-effects/header.png delete mode 100644 packages/lustre/examples/06-custom-effects/index.html delete mode 100644 packages/lustre/examples/06-custom-effects/manifest.toml delete mode 100644 packages/lustre/examples/06-custom-effects/src/app.ffi.mjs delete mode 100644 packages/lustre/examples/06-custom-effects/src/app.gleam delete mode 100644 packages/lustre/examples/07-routing/README.md delete mode 100644 packages/lustre/examples/07-routing/gleam.toml delete mode 100644 packages/lustre/examples/07-routing/header.png delete mode 100644 packages/lustre/examples/07-routing/index.html delete mode 100644 packages/lustre/examples/07-routing/manifest.toml delete mode 100644 packages/lustre/examples/07-routing/src/app.gleam delete mode 100644 packages/lustre/examples/99-full-stack-applications/README.md delete mode 100644 packages/lustre/examples/99-full-stack-applications/client/gleam.toml delete mode 100644 packages/lustre/examples/99-full-stack-applications/client/index.html delete mode 100644 packages/lustre/examples/99-full-stack-applications/client/manifest.toml delete mode 100644 packages/lustre/examples/99-full-stack-applications/client/src/app.gleam delete mode 100644 packages/lustre/examples/99-full-stack-applications/server/manifest.toml delete mode 100644 packages/lustre/examples/99-full-stack-applications/server/src/app.gleam delete mode 100644 packages/lustre/examples/99-full-stack-applications/shared/gleam.toml delete mode 100644 packages/lustre/examples/99-full-stack-applications/shared/manifest.toml delete mode 100644 packages/lustre/examples/99-full-stack-applications/shared/src/shared.gleam delete mode 100644 packages/lustre/examples/99-server-components/README.md delete mode 100644 packages/lustre/examples/99-server-components/gleam.toml delete mode 100644 packages/lustre/examples/99-server-components/manifest.toml delete mode 100644 packages/lustre/examples/99-server-components/src/app.gleam delete mode 100644 packages/lustre/examples/99-server-components/src/counter.gleam delete mode 100644 packages/lustre/examples/README.md delete mode 100644 packages/lustre/gleam.toml delete mode 100644 packages/lustre/manifest.toml delete mode 100644 packages/lustre/package-lock.json delete mode 100644 packages/lustre/package.json delete mode 100644 packages/lustre/pages/guide/01-quickstart.md delete mode 100644 packages/lustre/pages/guide/02-state-management.md delete mode 100644 packages/lustre/pages/guide/03-side-effects.md delete mode 100644 packages/lustre/pages/guide/04-server-side-rendering.md delete mode 100644 packages/lustre/pages/hints/attributes-vs-properties.md delete mode 100644 packages/lustre/pages/hints/pure-functions.md delete mode 100644 packages/lustre/pages/reference/examples.md delete mode 100644 packages/lustre/pages/reference/for-elm-devs.md delete mode 100644 packages/lustre/pages/reference/for-liveview-devs.md delete mode 100644 packages/lustre/pages/reference/for-react-devs.md delete mode 100644 packages/lustre/src/client-component.ffi.mjs delete mode 100644 packages/lustre/src/client-runtime.ffi.mjs delete mode 100644 packages/lustre/src/lustre-escape.ffi.mjs delete mode 100644 packages/lustre/src/lustre.gleam delete mode 100644 packages/lustre/src/lustre/attribute.gleam delete mode 100644 packages/lustre/src/lustre/effect.gleam delete mode 100644 packages/lustre/src/lustre/element.gleam delete mode 100644 packages/lustre/src/lustre/element/html.gleam delete mode 100644 packages/lustre/src/lustre/element/svg.gleam delete mode 100644 packages/lustre/src/lustre/event.gleam delete mode 100644 packages/lustre/src/lustre/internals/constants.gleam delete mode 100644 packages/lustre/src/lustre/internals/escape.gleam delete mode 100644 packages/lustre/src/lustre/internals/patch.gleam delete mode 100644 packages/lustre/src/lustre/internals/runtime.gleam delete mode 100644 packages/lustre/src/lustre/internals/vdom.gleam delete mode 100644 packages/lustre/src/lustre/server_component.gleam delete mode 100644 packages/lustre/src/lustre_escape_ffi.erl delete mode 100644 packages/lustre/src/server-component.mjs delete mode 100644 packages/lustre/src/server-runtime.ffi.mjs delete mode 100644 packages/lustre/src/vdom.ffi.mjs delete mode 100644 packages/lustre/test-apps/bool-property-toggle/README.md delete mode 100644 packages/lustre/test-apps/bool-property-toggle/gleam.toml delete mode 100644 packages/lustre/test-apps/bool-property-toggle/manifest.toml delete mode 100644 packages/lustre/test-apps/bool-property-toggle/src/app.gleam delete mode 100644 packages/lustre/test-apps/change-tag/README.md delete mode 100644 packages/lustre/test-apps/change-tag/gleam.toml delete mode 100644 packages/lustre/test-apps/change-tag/manifest.toml delete mode 100644 packages/lustre/test-apps/change-tag/src/app.gleam delete mode 100644 packages/lustre/test-apps/nested-element-map/README.md delete mode 100644 packages/lustre/test-apps/nested-element-map/gleam.toml delete mode 100644 packages/lustre/test-apps/nested-element-map/manifest.toml delete mode 100644 packages/lustre/test-apps/nested-element-map/src/app.gleam delete mode 100644 packages/lustre/test-apps/no-keyed-diff/README.md delete mode 100644 packages/lustre/test-apps/no-keyed-diff/gleam.toml delete mode 100644 packages/lustre/test-apps/no-keyed-diff/manifest.toml delete mode 100644 packages/lustre/test-apps/no-keyed-diff/src/app.gleam delete mode 100644 packages/lustre/test-apps/options-list/README.md delete mode 100644 packages/lustre/test-apps/options-list/gleam.toml delete mode 100644 packages/lustre/test-apps/options-list/index.html delete mode 100644 packages/lustre/test-apps/options-list/manifest.toml delete mode 100644 packages/lustre/test-apps/options-list/src/app.gleam delete mode 100644 packages/lustre/test-apps/server-component-change-children/README.md delete mode 100644 packages/lustre/test-apps/server-component-change-children/gleam.toml delete mode 100644 packages/lustre/test-apps/server-component-change-children/manifest.toml delete mode 100644 packages/lustre/test-apps/server-component-change-children/src/app.gleam delete mode 100644 packages/lustre/test-apps/server-component-change-children/src/counter.gleam delete mode 100644 packages/lustre/test-apps/svg/README.md delete mode 100644 packages/lustre/test-apps/svg/gleam.toml delete mode 100644 packages/lustre/test-apps/svg/manifest.toml delete mode 100644 packages/lustre/test-apps/svg/src/app.gleam delete mode 100644 packages/lustre/test-apps/vdom-test-templates/gleam.toml delete mode 100644 packages/lustre/test-apps/vdom-test-templates/manifest.toml delete mode 100644 packages/lustre/test-apps/vdom-test-templates/src/client_test.gleam delete mode 100644 packages/lustre/test/02-interactivity.test.js delete mode 100644 packages/lustre/test/README.md delete mode 100644 packages/lustre/test/apps/counter.gleam delete mode 100644 packages/lustre/test/apps/fragment.gleam delete mode 100644 packages/lustre/test/apps/static.gleam delete mode 100644 packages/lustre/test/build.gleam delete mode 100644 packages/lustre/test/lustre_test.gleam delete mode 100644 packages/lustre/test/utils.js delete mode 100644 packages/lustre/test/vdom.ffi.bench.js delete mode 100644 packages/lustre/test/vdom.ffi.test.js delete mode 100644 packages/lustre/vitest.config.js delete mode 100644 packages/lustre/vitest_snapshots/02-interactivity.test.js.snap delete mode 100644 packages/lustre/vitest_snapshots/vdom.ffi.test.js.snap create mode 100644 packages/sketch_magic/.gitignore create mode 100644 packages/sketch_magic/README.md rename packages/{lustre/examples/99-full-stack-applications/server => sketch_magic}/gleam.toml (69%) create mode 100644 packages/sketch_magic/manifest.toml create mode 100644 packages/sketch_magic/package.json create mode 100644 packages/sketch_magic/src/sketch/internals/ffi.gleam create mode 100644 packages/sketch_magic/src/sketch/magic.gleam create mode 100644 packages/sketch_magic/src/sketch/magic/element.gleam create mode 100644 packages/sketch_magic/src/sketch/magic/element/html.gleam create mode 100644 packages/sketch_magic/src/sketch_magic.ffi.mjs create mode 100644 packages/sketch_magic/test/sketch_magic_test.gleam diff --git a/apps/frontend/gleam.toml b/apps/frontend/gleam.toml index 0e45249..86b4dfb 100644 --- a/apps/frontend/gleam.toml +++ b/apps/frontend/gleam.toml @@ -9,16 +9,19 @@ version = "1.0.0" typescript_declarations = true [dependencies] +birl = ">= 1.7.1 and < 2.0.0" +bright = ">= 0.1.0 and < 1.0.0" gleam_javascript = "~> 0.8" gleam_json = ">= 1.0.1 and < 2.0.0" +gleam_regexp = ">= 1.0.0 and < 2.0.0" gleam_stdlib = "~> 0.34 or ~> 1.0" +lustre = ">= 4.6.1 and < 5.0.0" lustre_http = "~> 0.5" -plinth = ">= 0.2.0 and < 1.0.0" -sketch = ">= 2.2.2 and < 3.0.0" -lustre = { path = "../../packages/lustre" } -vitools = { path = "../../packages/vitools" } modem = ">= 2.0.0 and < 3.0.0" -birl = ">= 1.7.1 and < 2.0.0" +sketch = ">= 3.0.0 and < 4.0.0" +sketch_magic = {path = "../../packages/sketch_magic"} +vitools = {path = "../../packages/vitools"} +grille_pain = ">= 1.1.0 and < 2.0.0" [dev-dependencies] gleeunit = "~> 1.0" diff --git a/apps/frontend/index.html b/apps/frontend/index.html index 076e761..e13e627 100644 --- a/apps/frontend/index.html +++ b/apps/frontend/index.html @@ -56,6 +56,6 @@
- + diff --git a/apps/frontend/manifest.toml b/apps/frontend/manifest.toml index bf2483b..138bc09 100644 --- a/apps/frontend/manifest.toml +++ b/apps/frontend/manifest.toml @@ -2,35 +2,72 @@ # You typically do not need to edit this file packages = [ + { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, + { name = "bright", version = "0.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "lustre_dev_tools"], otp_app = "bright", source = "hex", outer_checksum = "4E3044561BDDC3349E2D8A4B08D43C1D50EEC86EF686F2A141F2E06CFD3D3544" }, { name = "conversation", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "conversation", source = "hex", outer_checksum = "908B46F60444442785A495197D482558AD8B849C3714A38FAA1940358CC8CCCD" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, + { name = "directories", version = "1.1.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "BDA521A4EB9EE3A7894F0DC863797878E91FF5C7826F7084B2E731E208BDB076" }, + { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" }, + { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, + { name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" }, + { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, + { name = "gleam_community_ansi", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "4CD513FC62523053E62ED7BAC2F36136EC17D6A8942728250A9A00A15E340E4B" }, + { name = "gleam_community_colour", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "386CB9B01B33371538672EEA8A6375A0A0ADEF41F17C86DDCB81C92AD00DA610" }, + { name = "gleam_crypto", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "8AE56026B3E05EBB1F076778478A762E9EB62B31AEEB4285755452F397029D22" }, + { name = "gleam_erlang", version = "0.32.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "B18643083A0117AC5CFD0C1AEEBE5469071895ECFA426DCC26517A07F6AD9948" }, { name = "gleam_fetch", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "gleam_fetch", source = "hex", outer_checksum = "7446410A44A1D1328F5BC1FF4FC9CBD1570479EA69349237B3F82E34521CCC10" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_javascript", version = "0.11.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "483631D3001FCE8EB12ADEAD5E1B808440038E96F93DA7A32D326C82F480C0B2" }, + { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, + { name = "gleam_httpc", version = "4.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "76FEEC99473E568EBA34336A37CF3D54629ACE77712950DC9BB097B5FD664664" }, + { name = "gleam_javascript", version = "0.13.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "F98328FCF573DA6F3A35D7F6CB3F9FF19FD5224CCBA9151FCBEAA0B983AF2F58" }, { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_stdlib", version = "0.39.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "2D7DE885A6EA7F1D5015D1698920C9BAF7241102836CE0C3837A4F160128A9C4" }, + { name = "gleam_otp", version = "0.14.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "5A8CE8DBD01C29403390A7BD5C0A63D26F865C83173CF9708E6E827E53159C65" }, + { name = "gleam_package_interface", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "CF3BFC5D0997750D9550D8D73A90F4B8D71C6C081B20ED4E70FFBE1E99AFC3C2" }, + { name = "gleam_regexp", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "A3655FDD288571E90EE9C4009B719FEF59FA16AFCDF3952A76A125AF23CF1592" }, + { name = "gleam_stdlib", version = "0.45.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "206FCE1A76974AECFC55AEBCD0217D59EDE4E408C016E2CFCCC8FF51278F186E" }, + { name = "glearray", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "B99767A9BC63EF9CC8809F66C7276042E5EFEACAA5B25188B552D3691B91AC6D" }, { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, - { name = "lustre", version = "4.3.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], source = "local", path = "../../packages/lustre" }, + { name = "glint", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5F6720081150AED8023131B0F3A35F9B0D6426A96CE02BEC52AD7018DF70566A" }, + { name = "glisten", version = "6.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "912132751031473CB38F454120124FFC96AF6B0EA33D92C9C90DB16327A2A972" }, + { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, + { name = "grille_pain", version = "1.1.0", build_tools = ["gleam"], requirements = ["birl", "gleam_stdlib", "lustre", "plinth", "sketch", "sketch_lustre"], otp_app = "grille_pain", source = "hex", outer_checksum = "718CB2468EF77EDECE148A98948EF8CC376D3CB96ACCE4983BC6C2F43A254D45" }, + { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, + { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, + { name = "lustre", version = "4.6.3", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "BDF833368F6C8F152F948D5B6A79866E9881CB80CB66C0685B3327E7DCBFB12F" }, + { name = "lustre_dev_tools", version = "1.6.2", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_regexp", "gleam_stdlib", "glint", "glisten", "lustre", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "A0CBC323AA7E03EC91D785CEB644776082D76BE46F1624FB920BB92BD79853F7" }, { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, - { name = "modem", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre"], otp_app = "modem", source = "hex", outer_checksum = "FF07984B15D553B15A45722F64BC440CA22B6139930E95E16EB956F1E24886AD" }, - { name = "plinth", version = "0.4.9", build_tools = ["gleam"], requirements = ["conversation", "gleam_javascript", "gleam_json", "gleam_stdlib"], otp_app = "plinth", source = "hex", outer_checksum = "663C788C00FF908662B47B78B1CEBE1260AB814B45531AA42EBAEE974CDC7E27" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "sketch", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "lustre", "plinth"], otp_app = "sketch", source = "hex", outer_checksum = "C4BDDB207A3CC94AC83BFB4D1300C51A9D0048569213ED4B35C9D982B305AF9D" }, + { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, + { name = "mist", version = "3.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "CDA1A74E768419235E16886463EC4722EFF4AB3F8D820A76EAD45D7C167D7282" }, + { name = "modem", version = "2.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre"], otp_app = "modem", source = "hex", outer_checksum = "B446119A85DC9C31FEA0DCB204072E40356CB246C9D091CBBF2E4678CDB05A2D" }, + { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, + { name = "plinth", version = "0.5.4", build_tools = ["gleam"], requirements = ["conversation", "gleam_javascript", "gleam_json", "gleam_stdlib"], otp_app = "plinth", source = "hex", outer_checksum = "C2BC6A3D1F9741014D7FD18625A9258DF60CF3132ED299C63BB88F15FFDCEE53" }, + { name = "ranger", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "B8F3AFF23A3A5B5D9526B8D18E7C43A7DFD3902B151B97EC65397FE29192B695" }, + { name = "repeatedly", version = "2.1.2", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "93AE1938DDE0DC0F7034F32C1BF0D4E89ACEBA82198A1FE21F604E849DA5F589" }, + { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, + { name = "sketch", version = "3.1.2", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "sketch", source = "hex", outer_checksum = "85E41BC0BE2E5D8985EF34F0D2FD7315329A463FC845570EC5D399F20F8AFA08" }, + { name = "sketch_lustre", version = "1.0.3", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "plinth", "sketch"], otp_app = "sketch_lustre", source = "hex", outer_checksum = "DD5437B10D4BB8AB45A19820B17883188B8568B6ED7885D7D073A983F4984E79" }, + { name = "sketch_magic", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "plinth", "sketch"], source = "local", path = "../../packages/sketch_magic" }, + { name = "snag", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "08E9EB87C413457DB1DD66CD704C6878DACC9C93B418600F63873D0CD224E756" }, + { name = "spinner", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "9EE43AA33BE2DA5731B8F3F170AAB59AF1A815AFA5BF615F12C1B91F3B03F157" }, + { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, + { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, + { name = "tom", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "228E667239504B57AD05EC3C332C930391592F6C974D0EFECF32FFD0F3629A27" }, { name = "vitools", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], source = "local", path = "../../packages/vitools" }, + { name = "wisp", version = "1.3.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "D12384EE63ADEE833B40A6D26EF8014A6E4BFC10EC2CDC8B57D325DD4B52740E" }, ] [requirements] birl = { version = ">= 1.7.1 and < 2.0.0" } +bright = { version = ">= 0.1.0 and < 1.0.0" } gleam_javascript = { version = "~> 0.8" } gleam_json = { version = ">= 1.0.1 and < 2.0.0" } +gleam_regexp = { version = ">= 1.0.0 and < 2.0.0" } gleam_stdlib = { version = "~> 0.34 or ~> 1.0" } gleeunit = { version = "~> 1.0" } -lustre = { path = "../../packages/lustre" } +grille_pain = { version = ">= 1.1.0 and < 2.0.0" } +lustre = { version = ">= 4.6.1 and < 5.0.0" } lustre_http = { version = "~> 0.5" } modem = { version = ">= 2.0.0 and < 3.0.0" } -plinth = { version = ">= 0.2.0 and < 1.0.0" } -sketch = { version = ">= 2.2.2 and < 3.0.0" } +sketch = { version = ">= 3.0.0 and < 4.0.0" } +sketch_magic = { path = "../../packages/sketch_magic" } vitools = { path = "../../packages/vitools" } diff --git a/apps/frontend/package.json b/apps/frontend/package.json index e9c6a5f..53a1e1d 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -21,11 +21,7 @@ "devDependencies": { "@sentry/vite-plugin": "^2.16.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", - "@types/dompurify": "^3.0.5", - "dotenv": "^16.4.5", "prettier": "^3.2.5", - "ts-gleam": "^1.0.1", - "typescript": "^5.4.2", "vite": "^5.1.6", "vite-gleam": "^0.4.0" } diff --git a/apps/frontend/src/chart.gleam b/apps/frontend/src/chart.gleam index 182c76f..d2ca603 100644 --- a/apps/frontend/src/chart.gleam +++ b/apps/frontend/src/chart.gleam @@ -7,19 +7,13 @@ pub type Dataset { pub fn line_chart(datasets: Dataset) { let datasets = attribute.property("datasets", datasets) - element.element( - "line-chart", - [attribute.style([#("display", "block")]), datasets], - [], - ) + let attributes = [attribute.style([#("display", "block")]), datasets] + element.element("line-chart", attributes, []) } pub fn bar_chart(color: String, datasets: Dataset) { let datasets = attribute.property("datasets", datasets) let color = attribute.property("color", color) - element.element( - "bar-chart", - [attribute.style([#("display", "block")]), datasets, color], - [], - ) + let attributes = [attribute.style([#("display", "block")]), datasets, color] + element.element("bar-chart", attributes, []) } diff --git a/apps/frontend/src/data/metadata.gleam b/apps/frontend/src/data/metadata.gleam index ee2bc91..ebff845 100644 --- a/apps/frontend/src/data/metadata.gleam +++ b/apps/frontend/src/data/metadata.gleam @@ -1,5 +1,5 @@ import data/implementations.{type Implementations, Implementations} -import decoder_extra +import gleam/decoder_extra import gleam/dynamic import gleam/option.{type Option} diff --git a/apps/frontend/src/data/model.gleam b/apps/frontend/src/data/model.gleam index 4b7e742..791067b 100644 --- a/apps/frontend/src/data/model.gleam +++ b/apps/frontend/src/data/model.gleam @@ -6,12 +6,11 @@ import data/search_result.{type SearchResult, type SearchResults} import frontend/router import frontend/view/body/cache import gleam/dict.{type Dict} -import gleam/function import gleam/int import gleam/list import gleam/option.{type Option} import gleam/pair -import gleam/regex +import gleam/regexp import gleam/result import gleam/string import lustre/element.{type Element} @@ -189,8 +188,8 @@ fn extract_package_version( acc: Dict(String, String), search_result: search_result.SearchResult, ) -> Dict(String, String) { - let assert Ok(re) = regex.from_string("^[0-9]*.[0-9]*.[0-9]*$") - case regex.check(re, search_result.version) { + let assert Ok(re) = regexp.from_string("^[0-9]*.[0-9]*.[0-9]*$") + case regexp.check(re, search_result.version) { False -> acc True -> case dict.get(acc, search_result.package_name) { @@ -275,11 +274,11 @@ pub fn update_search_results_filter(model: Model) { let filter = fn(s) { case list.is_empty(or_filters) { True -> True - False -> list.any(or_filters, function.apply1(_, s)) + False -> list.any(or_filters, fn(f) { f(s) }) } && case list.is_empty(and_filters) { True -> True - False -> list.any(and_filters, function.apply1(_, s)) + False -> list.any(and_filters, fn(f) { f(s) }) } && show_old(s) } diff --git a/apps/frontend/src/data/msg.gleam b/apps/frontend/src/data/msg.gleam index 26229e5..11142ab 100644 --- a/apps/frontend/src/data/msg.gleam +++ b/apps/frontend/src/data/msg.gleam @@ -2,9 +2,9 @@ import birl import data/package import data/search_result.{type SearchResults} import frontend/router +import gleam/dynamic.{type Dynamic} import gleam/option import lustre_http as http -import plinth/browser/event.{type Event} pub type Filter { Functions @@ -39,7 +39,7 @@ pub type Analytics { pub type Msg { None Packages(packages: Result(List(package.Package), http.HttpError)) - OnSearchFocus(event: Event) + OnSearchFocus(event: Dynamic) SubmitSearch UpdateIsMobile(is_mobile: Bool) SearchResults(input: String, result: Result(SearchResults, http.HttpError)) diff --git a/apps/frontend/src/data/package.gleam b/apps/frontend/src/data/package.gleam index 7c60a96..cc14763 100644 --- a/apps/frontend/src/data/package.gleam +++ b/apps/frontend/src/data/package.gleam @@ -1,5 +1,4 @@ import gleam/dynamic -import gleam/io import gleam/json import gleam/option.{type Option} import gleam/result diff --git a/apps/frontend/src/bar_chart.element.mjs b/apps/frontend/src/elements/bar_chart.element.mjs similarity index 91% rename from apps/frontend/src/bar_chart.element.mjs rename to apps/frontend/src/elements/bar_chart.element.mjs index c4c0fec..de691fd 100644 --- a/apps/frontend/src/bar_chart.element.mjs +++ b/apps/frontend/src/elements/bar_chart.element.mjs @@ -1,5 +1,9 @@ import { Chart } from 'chart.js/auto' +export function register() { + customElements.define('bar-chart', BarChart) +} + export class BarChart extends HTMLElement { static observedAttributes = ['datasets'] @@ -87,14 +91,4 @@ export class BarChart extends HTMLElement { }, }) } - - // Lifecycle functions. - disconnectedCallback() {} - adoptedCallback() {} - - attributeChangedCallback() {} - - static register() { - customElements.define('bar-chart', BarChart) - } } diff --git a/apps/frontend/src/line_chart.element.mjs b/apps/frontend/src/elements/line_chart.element.mjs similarity index 90% rename from apps/frontend/src/line_chart.element.mjs rename to apps/frontend/src/elements/line_chart.element.mjs index e27fb9a..4c6f322 100644 --- a/apps/frontend/src/line_chart.element.mjs +++ b/apps/frontend/src/elements/line_chart.element.mjs @@ -1,5 +1,9 @@ import { Chart } from 'chart.js/auto' +export function register() { + customElements.define('line-chart', LineChart) +} + export class LineChart extends HTMLElement { static observedAttributes = ['datasets'] @@ -76,14 +80,4 @@ export class LineChart extends HTMLElement { }, }) } - - // Lifecycle functions. - disconnectedCallback() {} - adoptedCallback() {} - - attributeChangedCallback() {} - - static register() { - customElements.define('line-chart', LineChart) - } } diff --git a/apps/frontend/src/frontend.gleam b/apps/frontend/src/frontend.gleam index 7c44d5a..cef7323 100644 --- a/apps/frontend/src/frontend.gleam +++ b/apps/frontend/src/frontend.gleam @@ -11,44 +11,42 @@ import frontend/view import frontend/view/body/search_result as sr import gleam/bool import gleam/dict -import gleam/dynamic -import gleam/io +import gleam/dynamic.{type Dynamic} import gleam/option.{None, Some} import gleam/pair import gleam/result import gleam/uri.{type Uri} - -// import grille_pain -// import grille_pain/lustre/toast -// import grille_pain/options +import grille_pain +import grille_pain/lustre/toast +import grille_pain/options import lustre import lustre/effect +import lustre/event import lustre/lazy import lustre/update import lustre_http as http import modem -import plinth/browser/event.{type Event} -import sketch/lustre as sketch -import sketch/options as sketch_options +import sketch +import sketch/magic import toast/error as toast_error -fn focus(on id: String, event event: Event) { +fn focus(on id: String, event event: Dynamic) { use _ <- effect.from() use <- bool.guard(when: ffi.is_active(id), return: Nil) event.prevent_default(event) ffi.focus(on: id, event: event) } -fn unfocus() { +fn blur() { use _ <- effect.from() - ffi.unfocus() + ffi.blur() } fn subscribe_focus() { use dispatch <- effect.from() use event <- ffi.subscribe_focus() - case event.key(event) { - "Escape" -> dispatch(msg.OnEscape) + case ffi.key(event) { + Ok("Escape") -> dispatch(msg.OnEscape) _ -> dispatch(msg.OnSearchFocus(event)) } } @@ -60,18 +58,17 @@ fn subscribe_is_mobile() { } pub fn main() { - let assert Ok(cache) = sketch.setup(sketch_options.node()) + let assert Ok(cache) = sketch.cache(strategy: sketch.Ephemeral) + let assert Ok(_) = magic.setup(cache) let assert Ok(_) = lazy.setup() let assert Ok(_) = sr.setup() - // let assert Ok(_) = - // options.default() - // |> options.timeout(5000) - // |> grille_pain.setup() + let assert Ok(_) = + options.default() + |> options.timeout(5000) + |> grille_pain.setup() let assert Ok(_) = - view.view - |> sketch.compose(cache) - |> lustre.application(init, update, _) + lustre.application(init, update, view.view) |> lustre.start("#app", Nil) } @@ -140,7 +137,7 @@ fn on_url_change(uri: Uri) -> Msg { } fn update(model: Model, msg: Msg) { - case io.debug(msg) { + case msg { msg.UpdateInput(content) -> update_input(model, content) msg.SubmitSearch -> submit_search(model) msg.Reset -> reset(model) @@ -152,7 +149,7 @@ fn update(model: Model, msg: Msg) { msg.Trendings(trendings) -> handle_trendings(model, trendings) msg.OnSearchFocus(event) -> update.effect(model, focus(on: "search-input", event: event)) - msg.OnEscape -> update.effect(model, unfocus()) + msg.OnEscape -> update.effect(model, blur()) msg.UpdateIsMobile(is_mobile) -> model |> model.update_is_mobile(is_mobile) @@ -214,14 +211,14 @@ fn submit_search(model: Model) { Some("q=" <> new_model.submitted_input) |> modem.push("search", _, None) }) - |> update.add_effect(unfocus()) + |> update.add_effect(blur()) } Error(_) -> msg.SearchResults(input: model.input, result: _) |> http.expect_json(search_result.decode_search_results, _) |> http.get(config.api_endpoint() <> "/search?q=" <> model.input, _) |> update.effect(model.toggle_loading(new_model), _) - |> update.add_effect(unfocus()) + |> update.add_effect(blur()) } } @@ -266,7 +263,7 @@ fn display_toast( |> result.map_error(fn(error) { toast_error.describe_http_error(error) |> option.map(errors.capture_message) - // |> option.map(toast.error) + |> option.map(toast.error) |> option.map(fn(_) { effect.none() }) }) |> result.unwrap_error(option.None) diff --git a/apps/frontend/src/frontend.ts b/apps/frontend/src/frontend.mjs similarity index 55% rename from apps/frontend/src/frontend.ts rename to apps/frontend/src/frontend.mjs index 173bd1f..91cd215 100644 --- a/apps/frontend/src/frontend.ts +++ b/apps/frontend/src/frontend.mjs @@ -1,27 +1,18 @@ -// @ts-ignore import gleamHljs from '@gleam-lang/highlight.js-gleam' import hljs from 'highlight.js/lib/core' import plaintext from 'highlight.js/lib/languages/plaintext' -// @ts-ignore -import { BarChart } from './bar_chart.element.mjs' -// @ts-ignore +import * as barChart from './elements/bar_chart.element.mjs' +import * as lineChart from './elements/line_chart.element.mjs' import { main } from './frontend.gleam' -// @ts-ignore -import { LineChart } from './line_chart.element.mjs' import './stylesheets/all.css' import './stylesheets/hljs-theme.css' import './stylesheets/main.css' import './stylesheets/normalize.css' -LineChart.register() -BarChart.register() -// @ts-ignore -Element.prototype._attachShadow = Element.prototype.attachShadow -Element.prototype.attachShadow = function () { - // @ts-ignore - return this._attachShadow({ mode: 'open' }) -} +lineChart.register() +barChart.register() hljs.registerLanguage('gleam', gleamHljs) hljs.registerLanguage('plaintext', plaintext) + document.addEventListener('DOMContentLoaded', main) diff --git a/apps/frontend/src/frontend/ffi.gleam b/apps/frontend/src/frontend/ffi.gleam index d8f2118..0a567a5 100644 --- a/apps/frontend/src/frontend/ffi.gleam +++ b/apps/frontend/src/frontend/ffi.gleam @@ -1,4 +1,4 @@ -import plinth/browser/event.{type Event} +import gleam/dynamic.{type Dynamic} @external(javascript, "../gloogle.ffi.mjs", "scrollTo") pub fn scroll_to(element id: String) -> fn(dispatch) -> Nil @@ -7,7 +7,7 @@ pub fn scroll_to(element id: String) -> fn(dispatch) -> Nil pub fn suscribe_is_mobile(callback: fn(Bool) -> Nil) -> Nil @external(javascript, "../gloogle.ffi.mjs", "subscribeFocus") -pub fn subscribe_focus(callback: fn(Event) -> Nil) -> Nil +pub fn subscribe_focus(callback: fn(Dynamic) -> Nil) -> Nil @external(javascript, "../gloogle.ffi.mjs", "focus") pub fn focus(on id: String, event event: a) -> Nil @@ -15,8 +15,11 @@ pub fn focus(on id: String, event event: a) -> Nil @external(javascript, "../gloogle.ffi.mjs", "isActive") pub fn is_active(element id: String) -> Bool -@external(javascript, "../gloogle.ffi.mjs", "unfocus") -pub fn unfocus() -> Nil +@external(javascript, "../gloogle.ffi.mjs", "blur") +pub fn blur() -> Nil @external(javascript, "../gloogle.ffi.mjs", "updateTitle") pub fn update_title(title: String) -> Nil + +@external(javascript, "../gloogle.ffi.mjs", "eventKey") +pub fn key(event: Dynamic) -> Result(String, Nil) diff --git a/apps/frontend/src/frontend/view.gleam b/apps/frontend/src/frontend/view.gleam index 1989f1a..4c01fc3 100644 --- a/apps/frontend/src/frontend/view.gleam +++ b/apps/frontend/src/frontend/view.gleam @@ -5,31 +5,30 @@ import frontend/view/body/body import frontend/view/footer/footer import frontend/view/navbar/navbar import lustre/element as el -import sketch -import sketch/lustre/element as l +import sketch as s +import sketch/magic +import sketch/magic/element/html as h import sketch/media import sketch/size.{px} fn layout(attributes, children) { - l.memo("div", attributes, children, [ - sketch.display("grid"), - sketch.grid_template_areas( - "\"sidebar navbar\" - \"sidebar main\" - \"sidebar footer\"", - ), - sketch.property("--a-color", palette.dark.faff_pink), - sketch.grid_template_columns("auto 1fr"), - sketch.grid_template_rows("auto 1fr auto"), - sketch.min_height(size.vh(100)), - sketch.media(media.max_width(px(700)), [ - sketch.grid_template_areas("\"navbar\" \"main\" \"footer\""), - sketch.grid_template_columns("1fr"), + s.class([ + s.display("grid"), + s.grid_template_areas(["sidebar navbar", "sidebar main", "sidebar footer"]), + s.property("--a-color", palette.dark.faff_pink), + s.grid_template_columns("auto 1fr"), + s.grid_template_rows("auto 1fr auto"), + s.min_height(size.vh(100)), + s.media(media.max_width(px(700)), [ + s.grid_template_areas(["navbar", "main", "footer"]), + s.grid_template_columns("1fr"), ]), ]) + |> h.div(attributes, children) } pub fn view(model: Model) { + use <- magic.render([magic.node()]) layout([], [ navbar.navbar(model), body.body(model), diff --git a/apps/frontend/src/frontend/view/body/body.gleam b/apps/frontend/src/frontend/view/body/body.gleam index 59b192f..7bde2f1 100644 --- a/apps/frontend/src/frontend/view/body/body.gleam +++ b/apps/frontend/src/frontend/view/body/body.gleam @@ -67,7 +67,7 @@ fn empty_state( ]) } -pub fn view_trending(model: Model) { +pub fn view_trending(_model: Model) { el.none() // case model.trendings { // None -> diff --git a/apps/frontend/src/frontend/view/body/signature.gleam b/apps/frontend/src/frontend/view/body/signature.gleam index 5e17df1..82b36f4 100644 --- a/apps/frontend/src/frontend/view/body/signature.gleam +++ b/apps/frontend/src/frontend/view/body/signature.gleam @@ -1,4 +1,3 @@ -import data/msg import data/search_result import data/signature.{type Parameter, type Type, Parameter} import frontend/view/helpers @@ -33,7 +32,7 @@ fn render_parameters(count: Int) { do_render_parameters(0, int.max(count - 1, 0), []) |> list.reverse() |> list.intersperse(h.text(", ")) - |> fn(t) { list.concat([[h.text("(")], t, [h.text(")")]]) } + |> fn(t) { list.flatten([[h.text("(")], t, [h.text(")")]]) } } } @@ -41,7 +40,7 @@ fn view_type(type_: Type, indent: Int) -> List(el.Element(msg)) { case type_ { signature.Tuple(width, elements) -> { let inline = width + indent <= 80 - list.concat([ + list.flatten([ [helpers.idt(indent), h.text("#(")], case inline { False -> [ @@ -49,13 +48,13 @@ fn view_type(type_: Type, indent: Int) -> List(el.Element(msg)) { ..{ list.map(elements, view_type(_, indent + 2)) |> list.intersperse([h.text(","), helpers.newline()]) - |> list.concat() + |> list.flatten() } ] True -> list.map(elements, view_type(_, 0)) |> list.intersperse([h.text(", ")]) - |> list.concat() + |> list.flatten() }, [ bool.guard(inline, h.text(""), fn() { helpers.idt(indent) }), @@ -65,19 +64,19 @@ fn view_type(type_: Type, indent: Int) -> List(el.Element(msg)) { } signature.Fn(width, parameters, return) -> { let inline = width + indent <= 80 - list.concat([ + list.flatten([ [helpers.idt(indent), t.keyword("fn"), h.text("(")], case inline { True -> list.map(parameters, view_type(_, 0)) |> list.intersperse([h.text(", ")]) - |> list.concat() + |> list.flatten() False -> [ helpers.newline(), ..{ list.map(parameters, view_type(_, indent + 2)) |> list.intersperse([h.text(","), helpers.newline()]) - |> list.concat() + |> list.flatten() } ] }, @@ -113,7 +112,7 @@ fn view_type(type_: Type, indent: Int) -> List(el.Element(msg)) { signature.Named(width, name, package, module, parameters, version) -> { let inline = width + indent <= 80 let is_params = !list.is_empty(parameters) - list.concat([ + list.flatten([ [ helpers.idt(indent), case version { @@ -143,13 +142,13 @@ fn view_type(type_: Type, indent: Int) -> List(el.Element(msg)) { True -> list.map(parameters, view_type(_, 0)) |> list.intersperse([h.text(", ")]) - |> list.concat() + |> list.flatten() False -> [ helpers.newline(), ..{ list.map(parameters, view_type(_, indent + 2)) |> list.intersperse([h.text(","), helpers.newline()]) - |> list.concat() + |> list.flatten() } ] }, @@ -167,7 +166,7 @@ fn view_type(type_: Type, indent: Int) -> List(el.Element(msg)) { fn view_parameter(parameter: Parameter, indent: Int) { let Parameter(width, label, type_) = parameter - list.concat([ + list.flatten([ case label { None -> [el.none()] Some(label) -> [helpers.idt(indent), t.label(label), h.text(": ")] @@ -183,7 +182,7 @@ fn view_parameter(parameter: Parameter, indent: Int) { fn view_type_constructor(constructor: signature.TypeConstructor, indent: Int) { let inline = constructor.params_width <= 70 let has_params = !list.is_empty(constructor.parameters) - list.concat([ + list.flatten([ [ helpers.idt(indent), t.type_(constructor.name), @@ -194,17 +193,17 @@ fn view_type_constructor(constructor: signature.TypeConstructor, indent: Int) { ], case inline { False -> - list.concat([ + list.flatten([ [helpers.newline()], list.map(constructor.parameters, view_parameter(_, { indent + 2 })) |> list.intersperse([h.text(","), helpers.newline()]) - |> list.concat(), + |> list.flatten(), [h.text(","), helpers.newline()], ]) True -> list.map(constructor.parameters, view_parameter(_, 0)) |> list.intersperse([h.text(", ")]) - |> list.concat() + |> list.flatten() }, case has_params, inline { False, _ -> [] @@ -217,7 +216,7 @@ fn view_type_constructor(constructor: signature.TypeConstructor, indent: Int) { pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) { case item.json_signature { signature.TypeDefinition(parameters, constructors) -> - list.concat([ + list.flatten([ [t.keyword("type "), t.fun(item.name), ..render_parameters(parameters)], case constructors { [] -> [] @@ -229,7 +228,7 @@ pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) constructors |> list.map(view_type_constructor(_, 2)) |> list.intersperse([helpers.newline()]) - |> list.concat() + |> list.flatten() }, case constructors { [] -> [] @@ -237,7 +236,7 @@ pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) }, ]) signature.Constant(width, type_) -> - list.concat([ + list.flatten([ [t.keyword("const "), t.fun(item.name), h.text(" = ")], case width > 80 { True -> [helpers.newline(), ..view_type(type_, 2)] @@ -245,7 +244,7 @@ pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) }, ]) signature.TypeAlias(width, parameters, alias) -> { - list.concat([ + list.flatten([ [ t.keyword("type "), t.type_(item.name), @@ -259,11 +258,11 @@ pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) ]) } signature.Function(_width, params_width, name, return, parameters) -> { - list.concat([ + list.flatten([ [t.keyword("fn "), t.fun(name), h.text("(")], case params_width > 70 { True -> - list.concat([ + list.flatten([ [helpers.newline(), helpers.idt(2)], list.map(parameters, view_parameter(_, 2)) |> list.intersperse([ @@ -271,13 +270,13 @@ pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) helpers.newline(), helpers.idt(2), ]) - |> list.concat(), + |> list.flatten(), [h.text(","), helpers.newline()], ]) False -> list.map(parameters, view_parameter(_, 0)) |> list.intersperse([h.text(", ")]) - |> list.concat() + |> list.flatten() }, [ h.text(") -> "), diff --git a/apps/frontend/src/frontend/view/body/styles.gleam b/apps/frontend/src/frontend/view/body/styles.gleam index f4bd558..2567b99 100644 --- a/apps/frontend/src/frontend/view/body/styles.gleam +++ b/apps/frontend/src/frontend/view/body/styles.gleam @@ -1,62 +1,54 @@ import frontend/colors/palette -import gleam/bool -import gleam/int -import gleam/list import lustre/attribute as a import lustre/element import sketch as s -import sketch/lustre/element as el +import sketch/magic/element/html as h import sketch/media -import sketch/size.{percent, px, vh, vw} +import sketch/size.{px, vh, vw} pub fn implementations_pill_container(attrs, children) { - let id = "implementations_pill_container" - el.memo_dynamic("div", attrs, children, id, [ + s.class([ s.display("flex"), s.align_items("center"), s.font_size(px(14)), s.font_weight("300"), s.gap(px(6)), ]) + |> h.div(attrs, children) } -pub fn implementations_pill(background, color, attributes, children) { - let id = "implementations-pill-" <> background - s.dynamic(id, [ +pub fn implementations_pill(background, attributes, children) { + s.class([ s.background(background), s.border_radius(px(6)), s.width(px(8)), s.height(px(8)), ]) - |> s.memo() - |> s.to_lustre() - |> list.prepend(attributes, _) - |> element.element("div", _, children) + |> h.div(attributes, children) } pub fn implementations_pill_wrapper(attributes, children) { - let id = "implementations_pill_wrapper" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.display("flex"), s.align_items("center"), s.gap(px(12)), s.justify_content("end"), ]) + |> h.div(attributes, children) } pub fn search_result(attributes, children) { - let id = "search_result" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.overflow("hidden"), s.display("flex"), s.flex_direction("column"), s.gap(px(12)), ]) + |> h.div(attributes, children) } pub fn search_results_wrapper(attributes, children) { - let id = "search_results_wrapper" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.display("grid"), s.padding_right(px(48)), s.gap(px(36)), @@ -67,103 +59,89 @@ pub fn search_results_wrapper(attributes, children) { s.padding_("0 24px"), ]), ]) + |> h.div(attributes, children) } pub fn external_icon_wrapper(attrs, children) { - let id = "external_icon_wrapper" - el.memo_dynamic("div", attrs, children, id, [ - s.width(px(16)), - s.height(px(16)), - ]) + s.class([s.width(px(16)), s.height(px(16))]) + |> h.div(attrs, children) } pub fn search_details(attributes, children) { - let id = "search_details" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.display("flex"), s.gap(px(12)), s.align_items("center"), s.media(media.max_width(px(700)), [s.flex_direction("column")]), ]) + |> h.div(attributes, children) } pub fn search_details_title(attributes, children) { - let id = "search_details_title" - el.memo_dynamic("div", attributes, children, id, [ - s.display("flex"), - s.align_items("center"), - s.gap(px(12)), - ]) + s.class([s.display("flex"), s.align_items("center"), s.gap(px(12))]) + |> h.div(attributes, children) } pub fn qualified_name(attributes, children) { - let id = "qualified_name" - el.memo_dynamic("a", attributes, children, id, [ + s.class([ s.overflow("hidden"), s.text_overflow("ellipsis"), - s.direction("rtl"), s.text_decoration("none"), s.hover([s.text_decoration("underline")]), ]) + |> h.a(attributes, children) } pub fn search_body(attributes, children) { - let id = "search_body" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.background("rgba(254, 254, 252, 0.05)"), s.border_radius(px(12)), s.padding_("12px 24px"), s.border("1px solid rgba(254, 254, 252, .1)"), ]) + |> h.div(attributes, children) } pub fn signature(attributes, children) { - let id = "signature" - el.memo_dynamic("code", attributes, children, id, [ + s.class([ s.white_space("pre-wrap"), s.display("block"), s.line_height("1.6"), s.overflow("auto"), ]) + |> h.code(attributes, children) } pub fn documentation(attributes, children) { - let id = "documentation" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.display("flex"), s.flex_direction("column"), s.gap(px(12)), s.padding_top(px(6)), ]) + |> h.div(attributes, children) } pub fn search_result_separator() { - let id = "search_result_separator" - el.memo_dynamic("div", [], [], id, [ + s.class([ s.height(px(1)), s.background("rgba(254, 254, 252, 0.1)"), s.margin_("6px 0"), ]) + |> h.div([], []) } pub fn documentation_title(attributes, children) { - let id = "documentation_title" - el.memo_dynamic("div", attributes, children, id, [ - s.color(palette.dark.dark_white), - ]) + s.class([s.color(palette.dark.dark_white)]) + |> h.div(attributes, children) } pub fn search_wrapper(attributes, children) { - let id = "search_wrapper" - el.memo_dynamic("form", attributes, children, id, [ + s.class([ s.display("grid"), s.grid_template_rows("auto auto auto"), s.grid_template_columns("auto auto auto"), - s.grid_template_areas( - "\"title . .\" - \"input input input\" - \". . submit\"", - ), + s.grid_template_areas(["title . .", "input input input", ". . submit"]), s.padding(px(48)), s.gap(px(24)), s.max_width(px(700)), @@ -172,13 +150,12 @@ pub fn search_wrapper(attributes, children) { s.media(media.max_width(px(700)), [ s.max_width(vw(100)), s.padding(px(24)), - s.grid_template_areas( - "\"title title title\" - \"input input input\" - \". . submit\"", - ), + s.grid_template_areas([ + "title title title", "input input input", ". . submit", + ]), ]), ]) + |> h.form(attributes, children) } pub fn search_title_() { @@ -192,38 +169,30 @@ pub fn search_title_() { } pub fn search_title(attributes, children) { - let id = "search_title" - el.memo_dynamic("div", attributes, children, id, [ - s.compose(search_title_()), - s.font_size(size.rem_(2.5)), - ]) + s.class([s.compose(search_title_()), s.font_size(size.rem(2.5))]) + |> h.div(attributes, children) } pub fn search_title_wrapper(attributes, children) { - let id = "search_title_wrapper" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.grid_area("title"), s.display("flex"), s.flex_direction("column"), s.gap(px(9)), - s.font_size(size.rem_(0.9)), + s.font_size(size.rem(0.9)), s.color(palette.dark.dark_white), s.line_height("1.3"), ]) + |> h.div(attributes, children) } pub fn search_lucy(size, attributes) { - let id = "search-lucy-" <> int.to_string(size) - s.dynamic(id, [s.width(px(size))]) - |> s.memo() - |> s.to_lustre() - |> list.prepend(attributes, _) - |> element.element("img", _, []) + s.class([s.width(px(size))]) + |> h.img(attributes) } pub fn search_submit(attributes) { - let id = "search_submit" - el.memo_dynamic("input", attributes, [], id, [ + s.class([ s.grid_area("submit"), s.appearance("none"), s.border("none"), @@ -234,18 +203,18 @@ pub fn search_submit(attributes) { s.padding_right(px(24)), s.padding_left(px(24)), s.color(palette.dark.charcoal), - s.font_size(size.rem(1)), + s.font_size(size.rem(1.0)), s.outline("none"), s.transition("background .3s"), s.active([s.background(palette.dark.dark_faff_pink)]), s.focus([s.background(palette.dark.dark_faff_pink)]), s.disabled([s.background(palette.dark.unexpected_aubergine)]), ]) + |> h.input(attributes) } pub fn matches_titles(attributes, children) { - let id = "matches_titles" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.line_height("1.3"), s.color(palette.dark.dark_white), s.display("flex"), @@ -254,19 +223,16 @@ pub fn matches_titles(attributes, children) { s.font_size(px(12)), s.media(media.max_width(px(700)), [s.flex_direction("column")]), ]) + |> h.div(attributes, children) } pub fn matches_title(attributes, children) { - let id = "matches_title" - el.memo_dynamic("div", attributes, children, id, [ - s.color(palette.dark.white), - s.font_size(px(18)), - ]) + s.class([s.color(palette.dark.white), s.font_size(px(18))]) + |> h.div(attributes, children) } pub fn empty_state(attributes, children) { - let id = "empty_state" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.grid_row("span 3"), s.display("flex"), s.align_items("center"), @@ -277,16 +243,16 @@ pub fn empty_state(attributes, children) { s.margin_("auto"), s.padding(px(24)), ]) + |> h.div(attributes, children) } pub fn empty_state_lucy(attributes) { - let id = "empty_state_lucy" - el.memo_dynamic("img", attributes, [], id, [s.width(px(100))]) + s.class([s.width(px(100))]) + |> h.img(attributes) } pub fn empty_state_titles(attributes, children) { - let id = "empty_state_titles" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.font_size(px(20)), s.display("flex"), s.flex_direction("column"), @@ -294,19 +260,16 @@ pub fn empty_state_titles(attributes, children) { s.line_height("1.3"), s.max_width(px(400)), ]) + |> h.div(attributes, children) } pub fn empty_state_subtitle(attributes, children) { - let id = "empty_state_subtitle" - el.memo_dynamic("div", attributes, children, id, [ - s.font_size(px(16)), - s.color(palette.dark.dark_white), - ]) + s.class([s.font_size(px(16)), s.color(palette.dark.dark_white)]) + |> h.div(attributes, children) } pub fn sidebar_wrapper(attributes, children) { - let id = "sidebar_wrapper" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.position("sticky"), s.top(px(0)), s.display("flex"), @@ -326,32 +289,28 @@ pub fn sidebar_wrapper(attributes, children) { }), s.media(media.max_width(px(700)), [s.display("none")]), ]) + |> h.div(attributes, children) } pub fn sidebar_wrapper_title(attrs, children) { - let id = "sidebar_wrapper_title" - el.memo_dynamic("div", attrs, children, id, [ - s.padding_("4px 4px"), - s.color("#ffffff99"), - ]) + s.class([s.padding_("4px 4px"), s.color("#ffffff99")]) + |> h.div(attrs, children) } pub fn sidebar_package_name(attributes, children) { - let id = "sidebar_package_name" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.padding_left(px(8)), s.border_radius(px(6)), s.overflow("hidden"), s.text_overflow("ellipsis"), ]) + |> h.div(attributes, children) } pub fn sidebar_module_name(attributes, children) { - let id = "sidebar_module_name" - el.memo_dynamic("button", attributes, children, id, [ + s.class([ s.text_overflow("ellipsis"), s.overflow("hidden"), - s.direction("rtl"), s.text_align("left"), s.cursor("pointer"), s.hover([s.text_decoration("underline")]), @@ -366,75 +325,71 @@ pub fn sidebar_module_name(attributes, children) { s.property("padding-inline", "0"), s.padding_left(px(16)), ]) + |> h.button(attributes, children) } pub fn sidebar_package_wrapper(attributes, children) { - let id = "sidebar_package_wrapper" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.display("flex"), s.flex_direction("column"), s.gap(px(9)), s.font_size(px(14)), s.max_width(px(250)), ]) + |> h.div(attributes, children) } pub fn main(attributes, children) { - let id = "main" - el.memo_dynamic("main", attributes, children, id, [ + s.class([ s.grid_area("main"), s.display("flex"), s.flex_direction("column"), s.gap(px(24)), ]) + |> h.main(attributes, children) } pub fn sidebar_title(attrs, children) { - let id = "sidebar_title" - el.memo_dynamic("a", attrs, children, id, [ + s.class([ s.display("flex"), s.align_items("center"), s.gap(px(16)), s.color("inherit"), s.text_decoration("none"), ]) + |> h.a(attrs, children) } pub fn sidebar_title_inside(attrs, children) { - let id = "sidebar_title_inside" - el.memo_dynamic("div", attrs, children, id, []) + s.class([]) |> h.div(attrs, children) } pub fn form_wrapper(attrs, children) { - let id = "form_wrapper" - el.memo_dynamic("form", attrs, children, id, []) + s.class([]) |> h.form(attrs, children) } pub fn sidebar_filter(attrs, children) { - let id = "sidebar_filter" - el.memo_dynamic("div", attrs, children, id, [ + s.class([ s.padding_top(px(12)), s.padding_left(px(12)), s.color("rgba(254, 254, 252, .6)"), ]) + |> h.div(attrs, children) } pub fn sidebar_filters(attrs, children) { - let id = "sidebar_filters" - el.memo_dynamic("div", attrs, children, id, [ + s.class([ s.display("flex"), s.flex_direction("column"), s.gap(px(18)), s.padding_("0 12px"), ]) + |> h.div(attrs, children) } pub fn sidebar_checkbox(active, attrs) { - let val = bool.to_string(active) - let id1 = "sidebar-checkbox-div-" <> val - let id2 = "sidebar-checkbox-input-" <> val element.fragment([ - el.memo_dynamic("div", [], [], id1, [ + s.class([ s.width(px(16)), s.height(px(16)), s.background(case active { @@ -443,85 +398,75 @@ pub fn sidebar_checkbox(active, attrs) { }), s.border("1px solid rgba(254, 254, 252, .1)"), s.border_radius(px(4)), - ]), - el.memo_dynamic( - "input", - [a.type_("checkbox"), a.checked(active), ..attrs], - [], - id2, - [s.position("fixed"), s.top(px(-1000)), s.width(px(1)), s.height(px(1))], - ), + ]) + |> h.div([], []), + s.class([ + s.position("fixed"), + s.top(px(-1000)), + s.width(px(1)), + s.height(px(1)), + ]) + |> h.input([a.type_("checkbox"), a.checked(active), ..attrs]), ]) } pub fn sidebar_spacer(attrs, children) { - let id = "sidebar_spacer" - el.memo_dynamic("div", attrs, children, id, [s.flex("1")]) + s.class([s.flex("1")]) |> h.div(attrs, children) } pub fn filter_separator(attrs, children) { - let id = "filter_separator" - el.memo_dynamic("div", attrs, children, id, [ - s.height(px(1)), - s.background("rgba(254, 254, 252, .1)"), - ]) + s.class([s.height(px(1)), s.background("rgba(254, 254, 252, .1)")]) + |> h.div(attrs, children) } pub fn sidebar_filter_line(attrs, children) { - let id = "sidebar_filter_line" - el.memo_dynamic("label", attrs, children, id, [ + s.class([ s.display("flex"), s.gap(px(9)), s.cursor("pointer"), s.align_items("center"), ]) + |> h.label(attrs, children) } pub fn sidebar_filter_name(attrs, children) { - let id = "sidebar_filter_name" - el.memo_dynamic("div", attrs, children, id, [s.color("white")]) + s.class([s.color("white")]) + |> h.div(attrs, children) } pub fn sidebar_links(attrs, children) { - let id = "sidebar_links" - el.memo_dynamic("div", attrs, children, id, [ + s.class([ s.display("flex"), s.flex_direction("column"), s.gap(px(24)), s.padding(px(12)), ]) + |> h.div(attrs, children) } pub fn sidebar_link_wrapper(attrs, children) { - let id = "sidebar_link_wrapper" - el.memo_dynamic("a", attrs, children, id, [ + s.class([ s.display("flex"), s.align_items("baseline"), s.gap(px(9)), s.text_decoration("none"), s.color("inherit"), ]) + |> h.a(attrs, children) } pub fn sidebar_icon(attrs, children) { - let id = "sidebar_icon" - el.memo_dynamic("div", attrs, children, id, [ - s.width(px(12)), - s.height(px(12)), - ]) + s.class([s.width(px(12)), s.height(px(12))]) + |> h.div(attrs, children) } pub fn sidebar_link(attrs, children) { - let id = "sidebar_link" - el.memo_dynamic("div", attrs, children, id, [ - s.font_size(px(14)), - s.color("rgba(254, 254, 252, 0.6)"), - ]) + s.class([s.font_size(px(14)), s.color("rgba(254, 254, 252, 0.6)")]) + |> h.div(attrs, children) } pub fn items_wrapper(attributes, children) { - let id = "items_wrapper" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.display("flex"), s.flex_direction("column"), s.gap(px(24)), @@ -530,75 +475,62 @@ pub fn items_wrapper(attributes, children) { s.width(size.percent(100)), s.overflow("hidden"), ]) + |> h.div(attributes, children) } pub fn named_type_button(attributes, children) { - let id = "named_type_button" - el.memo_dynamic("a", attributes, children, id, [s.color("#e5c07b")]) + s.class([s.color("#e5c07b")]) + |> h.a(attributes, children) } pub fn search_title_with_hint(attributes, children) { - let id = "search_title_with_hint" - el.memo_dynamic("div", attributes, children, id, [ - s.display("flex"), - s.gap(px(12)), - ]) + s.class([s.display("flex"), s.gap(px(12))]) + |> h.div(attributes, children) } pub fn pre_alpha_title(attributes, children) { - let id = "pre_alpha_title" - el.memo_dynamic("div", attributes, children, id, [s.font_size(px(16))]) + s.class([s.font_size(px(16))]) + |> h.div(attributes, children) } pub fn loading_trending(attributes, children) { - let id = "loading_trending" - el.memo_dynamic("div", attributes, children, id, []) + s.class([]) + |> h.div(attributes, children) } pub fn no_trendings(attributes, children) { - let id = "no_trendings" - el.memo_dynamic("div", attributes, children, id, []) + s.class([]) |> h.div(attributes, children) } pub fn trendings_wrapper(attributes, children) { - let id = "trendings_wrapper" - el.memo_dynamic("div", attributes, children, id, [s.padding_("12px 48px")]) + s.class([s.padding_("12px 48px")]) |> h.div(attributes, children) } pub fn trendings_title(attributes, children) { - let id = "trendings_title" - el.memo_dynamic("div", attributes, children, id, [s.margin_bottom(px(24))]) + s.class([s.margin_bottom(px(24))]) |> h.div(attributes, children) } pub fn trendings_grid(attributes, children) { - let id = "trendings_grid" - el.memo_dynamic("div", attributes, children, id, [ + s.class([ s.display("grid"), // s.grid_template_columns("repeat(auto-fill, minmax(350px, 1fr))"), s.align_items("start"), s.gap(px(24)), ]) + |> h.div(attributes, children) } pub fn trendings_card(attributes, children) { - let id = "trendings_card" - el.memo_dynamic("div", attributes, children, id, [ - s.background(palette.dark.unexpected_aubergine), - ]) + s.class([s.background(palette.dark.unexpected_aubergine)]) + |> h.div(attributes, children) } pub fn documentation_links(attributes, children) { - let id = "documentation_links" - el.memo_dynamic("div", attributes, children, id, [ - s.display("flex"), - s.justify_content("space-between"), - ]) + s.class([s.display("flex"), s.justify_content("space-between")]) + |> h.div(attributes, children) } pub fn licenses(attributes, children) { - let id = "licenses" - el.memo_dynamic("div", attributes, children, id, [ - s.display("flex"), - s.gap(px(6)), - ]) + s.class([s.display("flex"), s.gap(px(6))]) + |> h.div(attributes, children) } diff --git a/apps/frontend/src/frontend/view/documentation.gleam b/apps/frontend/src/frontend/view/documentation.gleam index f7515e8..f071971 100644 --- a/apps/frontend/src/frontend/view/documentation.gleam +++ b/apps/frontend/src/frontend/view/documentation.gleam @@ -19,7 +19,7 @@ pub fn view(document: String) { |> string.split("\n") |> list.map(remove_leading_space) |> string.join("\n") - |> converter() + |> converter |> a.attribute("dangerous-unescaped-html", _) h.div([content, a.class("documentation")], []) } diff --git a/apps/frontend/src/frontend/view/footer/styles.gleam b/apps/frontend/src/frontend/view/footer/styles.gleam index 5f8bf7f..1e2b30d 100644 --- a/apps/frontend/src/frontend/view/footer/styles.gleam +++ b/apps/frontend/src/frontend/view/footer/styles.gleam @@ -1,10 +1,10 @@ import frontend/colors/palette import sketch as s -import sketch/lustre/element as l +import sketch/magic/element/html as h import sketch/size.{px} pub fn footer(attributes, children) { - l.memo("footer", attributes, children, [ + s.class([ s.background("var(--sidebar-background)"), s.display("flex"), s.flex_direction("column"), @@ -14,28 +14,27 @@ pub fn footer(attributes, children) { s.margin_top(px(48)), s.grid_area("footer"), ]) + |> h.footer(attributes, children) } pub fn footer_built(attributes, children) { - l.memo("div", attributes, children, [ + s.class([ s.align_items("center"), s.justify_content("center"), - s.font_size(size.rem_(0.8)), + s.font_size(size.rem(0.8)), s.line_height("1.3"), s.text_align("center"), ]) + |> h.div(attributes, children) } pub fn footer_subtitles(attributes, children) { - l.memo("div", attributes, children, [ - s.display("flex"), - s.flex_direction("column"), - s.gap(px(4)), - ]) + s.class([s.display("flex"), s.flex_direction("column"), s.gap(px(4))]) + |> h.div(attributes, children) } pub fn footer_links(attributes, children) { - l.memo("div", attributes, children, [ + s.class([ s.display("grid"), s.grid_template_columns("repeat(3, 1fr)"), s.grid_template_rows("repeat(6, auto)"), @@ -43,29 +42,33 @@ pub fn footer_links(attributes, children) { s.max_width(px(700)), s.width(size.percent(100)), ]) + |> h.div(attributes, children) } pub fn footer_section(attributes, children) { - l.memo("div", attributes, children, [ + s.class([ s.display("grid"), s.grid_template_columns("1fr"), s.grid_template_rows("subgrid"), s.grid_row("1 / 7"), ]) + |> h.div(attributes, children) } pub fn foot_title(attributes, children) { - l.memo("div", attributes, children, [ + s.class([ s.color("var(--input-text-color)"), s.font_weight("500"), s.padding_("6px 0px"), ]) + |> h.div(attributes, children) } pub fn foot_lk(attributes, children) { - l.memo("a", attributes, children, [ - s.font_size(size.rem_(0.9)), + s.class([ + s.font_size(size.rem(0.9)), s.color(palette.dark.dark_white), s.text_decoration("none"), ]) + |> h.a(attributes, children) } diff --git a/apps/frontend/src/frontend/view/navbar/styles.gleam b/apps/frontend/src/frontend/view/navbar/styles.gleam index 9a28011..df54e98 100644 --- a/apps/frontend/src/frontend/view/navbar/styles.gleam +++ b/apps/frontend/src/frontend/view/navbar/styles.gleam @@ -1,42 +1,44 @@ -import frontend/colors/palette import frontend/view/body/styles as body_styles -import gleam/bool import sketch as s -import sketch/lustre/element as l +import sketch/magic/element/html as h import sketch/media import sketch/size.{px, vw} pub const search_lucy = body_styles.search_lucy pub fn search_input_wrapper(attributes, children) { - l.memo("form", attributes, children, [s.width_("100%")]) + s.class([s.width_("100%")]) + |> h.form(attributes, children) } pub fn navbar_search_title(attributes, children) { - l.memo("a", attributes, children, [ - s.font_size(size.rem_(1.2)), + s.class([ + s.font_size(size.rem(1.2)), s.compose(body_styles.search_title_()), s.text_decoration("none"), s.cursor("pointer"), ]) + |> h.a(attributes, children) } pub fn nav_links(attributes, children) { - l.memo("div", attributes, children, [ + s.class([ s.display("flex"), s.align_items("baseline"), s.gap(px(48)), s.padding(px(48)), s.media(media.max_width(px(700)), [s.padding(px(12)), s.gap(px(24))]), ]) + |> h.div(attributes, children) } pub fn coming_soon(attributes, children) { - l.memo("span", attributes, children, [s.font_size(size.rem_(0.7))]) + s.class([s.font_size(size.rem(0.7))]) + |> h.span(attributes, children) } pub fn trending(attributes, children) { - l.memo("div", attributes, children, [ + s.class([ s.display("flex"), s.flex_direction("column"), s.gap(px(3)), @@ -45,18 +47,16 @@ pub fn trending(attributes, children) { s.white_space("nowrap"), s.opacity(0.3), ]) + |> h.div(attributes, children) } pub fn nav_link(attributes, children) { - l.memo("a", attributes, children, [ - s.color("var(--text-color)"), - s.text_decoration("none"), - ]) + s.class([s.color("var(--text-color)"), s.text_decoration("none")]) + |> h.a(attributes, children) } pub fn navbar(transparent: Bool, attributes, children) { - let id = "navbar-transparent-" <> bool.to_string(transparent) - l.dynamic("nav", attributes, children, id, [ + s.class([ s.position("sticky"), s.top(px(0)), s.justify_content("end"), @@ -88,18 +88,20 @@ pub fn navbar(transparent: Bool, attributes, children) { s.padding_("18px 24px"), ]), ]) + |> h.nav(attributes, children) } pub fn navbar_search(attributes, children) { - l.memo("div", attributes, children, [ + s.class([ s.display("flex"), s.gap(px(48)), s.align_items("center"), s.flex("1"), s.media(media.max_width(px(700)), [s.gap(px(24))]), ]) + |> h.div(attributes, children) } pub fn title(a, c) { - l.memo("div", a, c, []) + h.div_(a, c) } diff --git a/apps/frontend/src/frontend/view/search_input/styles.gleam b/apps/frontend/src/frontend/view/search_input/styles.gleam index a739886..9369423 100644 --- a/apps/frontend/src/frontend/view/search_input/styles.gleam +++ b/apps/frontend/src/frontend/view/search_input/styles.gleam @@ -1,21 +1,20 @@ -import gleam/bool import sketch as s -import sketch/lustre/element as l +import sketch/magic/element/html as h import sketch/media import sketch/size.{px} pub fn search_with_filters(attributes, children) { - l.element("div", attributes, children, [ + s.class([ s.grid_area("input"), s.display("flex"), s.flex_direction("column"), s.gap(px(12)), ]) + |> h.div(attributes, children) } pub fn search_input_wrapper(loading: Bool, children) { - let id = "search-input-wrapper-" <> bool.to_string(loading) - l.dynamic("div", [], children, id, [ + s.class([ s.border_radius(px(12)), s.overflow("hidden"), s.padding( @@ -34,12 +33,11 @@ pub fn search_input_wrapper(loading: Bool, children) { False -> "paused" }), ]) + |> h.div([], children) } pub fn search_input(loading, small, children) { - let id_ = - "search-input-" <> bool.to_string(loading) <> "-" <> bool.to_string(small) - l.dynamic("div", [], children, id_, [ + s.class([ s.display("flex"), s.gap(px(6)), s.border_radius(px(8)), @@ -59,10 +57,11 @@ pub fn search_input(loading, small, children) { }), ), ]) + |> h.div([], children) } pub fn search_input_content(attributes) { - l.element("input", attributes, [], [ + s.class([ s.appearance("none"), s.border("none"), s.outline("none"), @@ -71,10 +70,11 @@ pub fn search_input_content(attributes) { s.background("transparent"), s.color("inherit"), ]) + |> h.input(attributes) } pub fn shortcut_hint(attrs, children) { - l.element("div", attrs, children, [ + s.class([ s.white_space("nowrap"), s.font_size(px(11)), s.border("1px solid var(--text-color)"), @@ -83,4 +83,5 @@ pub fn shortcut_hint(attrs, children) { s.opacity(0.4), s.media(media.max_width(px(700)), [s.display("none")]), ]) + |> h.div(attrs, children) } diff --git a/apps/frontend/src/decoder_extra.gleam b/apps/frontend/src/gleam/decoder_extra.gleam similarity index 100% rename from apps/frontend/src/decoder_extra.gleam rename to apps/frontend/src/gleam/decoder_extra.gleam diff --git a/apps/frontend/src/gloogle.ffi.mjs b/apps/frontend/src/gloogle.ffi.mjs index 9a6644c..4d73501 100644 --- a/apps/frontend/src/gloogle.ffi.mjs +++ b/apps/frontend/src/gloogle.ffi.mjs @@ -1,4 +1,6 @@ -function findChild(shadowRoot, id) { +import * as gleam from './gleam.mjs' + +function findSearchResultChild(shadowRoot, id) { for (const node of shadowRoot.querySelectorAll('search-result')) { const elem = node.shadowRoot.getElementById(id) if (elem) return elem @@ -9,26 +11,24 @@ export function scrollTo(id) { return function (_) { const cache = document.getElementsByTagName('lazy-node') if (!cache?.[0]) return - const elem = findChild(cache[0].shadowRoot, id) + const elem = findSearchResultChild(cache[0].shadowRoot, id) if (!elem) return const elemRect = elem.getBoundingClientRect() const navbarRect = document .getElementsByClassName('navbar')?.[0] ?.getBoundingClientRect() const bodyRect = document.body.getBoundingClientRect() - const offset = elemRect.top - bodyRect.top - (navbarRect?.height ?? 0) - 12 - window.scrollTo({ top: offset, behavior: 'smooth' }) + const top = elemRect.top - bodyRect.top - (navbarRect?.height ?? 0) - 12 + window.scrollTo({ top, behavior: 'smooth' }) } } export function captureMessage(content) { - if (is_dev()) return content - if ( - typeof Sentry !== 'undefined' && - Sentry?.captureMessage && - typeof Sentry.captureMessage === 'function' - ) - Sentry.captureMessage(content) + const isDev = !!import.meta.env.DEV + if (isDev) return content + const isSentryDefined = typeof Sentry !== 'undefined' + const canCaptureMessage = Sentry?.captureMessage === 'function' + if (isSentryDefined && canCaptureMessage) Sentry.captureMessage(content) return content } @@ -66,7 +66,7 @@ export function focus(id, event) { } } -export function unfocus() { +export function blur() { const element = document.activeElement if (element) { element.blur() @@ -78,11 +78,12 @@ export function isMobile() { } export function subscribeIsMobile(callback) { - window.matchMedia('(max-width: 700px)').addEventListener('change', event => { - if (event.matches) { - callback(true) - } else { - callback(false) - } - }) + window + .matchMedia('(max-width: 700px)') + .addEventListener('change', event => callback(!!event.matches)) +} + +export function eventKey(event) { + if (event.key) return new gleam.Ok(event.key) + return new gleam.Error() } diff --git a/apps/frontend/src/lustre/effect/extra.gleam b/apps/frontend/src/lustre/effect/extra.gleam index 7203431..6cff119 100644 --- a/apps/frontend/src/lustre/effect/extra.gleam +++ b/apps/frontend/src/lustre/effect/extra.gleam @@ -2,16 +2,6 @@ import gleam/dynamic.{type Dynamic} import gleam/javascript/promise.{type Promise} import lustre/effect.{type Effect} -pub fn then(effect: Effect(a), next: fn(a) -> Effect(b)) -> Effect(b) { - // This is necessary because `perform` needs an implementation for - // `effect.emit` but we can't handle that. If you're not using components - // this will never come up. - let dummy_emit = fn(_, _) { Nil } - use dispatch <- effect.from() - let run_next = fn(a) { effect.perform(next(a), dispatch, dummy_emit) } - effect.perform(effect, run_next, dummy_emit) -} - pub fn from_promise(promise promise: Promise(a)) { use dispatch <- effect.from() promise.tap(promise, fn(content) { dispatch(content) }) diff --git a/apps/frontend/src/stylesheets/all.css b/apps/frontend/src/stylesheets/all.css index 36e4a1a..608ba60 100644 --- a/apps/frontend/src/stylesheets/all.css +++ b/apps/frontend/src/stylesheets/all.css @@ -114,7 +114,6 @@ lazy-node:has(:not(:defined)) { .qualified-name { overflow: hidden; text-overflow: ellipsis; - direction: rtl; text-decoration: none; } @@ -335,7 +334,6 @@ lazy-node:has(:not(:defined)) { .sidebar-module-name { text-overflow: ellipsis; overflow: hidden; - direction: rtl; text-align: left; cursor: pointer; appearance: none; diff --git a/apps/frontend/tsconfig.json b/apps/frontend/tsconfig.json deleted file mode 100644 index e96e887..0000000 --- a/apps/frontend/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "plugins": [{ "name": "ts-gleam" }], - "allowArbitraryExtensions": true - }, - "include": ["src"] -} diff --git a/apps/frontend/vite.config.js b/apps/frontend/vite.config.js index fedf98b..14b50eb 100644 --- a/apps/frontend/vite.config.js +++ b/apps/frontend/vite.config.js @@ -1,5 +1,4 @@ import { sentryVitePlugin } from '@sentry/vite-plugin' -import 'dotenv/config' import { defineConfig } from 'vite' import gleam from 'vite-gleam' diff --git a/packages/lustre/.github/FUNDING.yml b/packages/lustre/.github/FUNDING.yml deleted file mode 100644 index b873a5a..0000000 --- a/packages/lustre/.github/FUNDING.yml +++ /dev/null @@ -1,13 +0,0 @@ -# These are supported funding model platforms - -github: [hayleigh-dot-dev] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/packages/lustre/.github/workflows/release.yml b/packages/lustre/.github/workflows/release.yml deleted file mode 100644 index d6612fa..0000000 --- a/packages/lustre/.github/workflows/release.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: release - -on: - push: - tags: ["v*"] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3.1.0 - - uses: erlef/setup-beam@v1.16.0 - with: - otp-version: "26.0.2" - rebar3-version: "3" - gleam-version: "1.2.1" - - - run: cargo install tomlq - - run: | - if [ "v$(tomlq version -f gleam.toml)" == "${{ github.ref_name }}" ]; then - exit 0 - fi - echo "tag does not match version in gleam.toml, refusing to publish" - exit 1 - - run: gleam format --check src test - - run: gleam test - - run: gleam publish -y - env: - HEXPM_USER: ${{ secrets.HEX_USERNAME }} - HEXPM_PASS: ${{ secrets.HEX_PASSWORD }} - - - uses: softprops/action-gh-release@v1 diff --git a/packages/lustre/.gitignore b/packages/lustre/.gitignore deleted file mode 100644 index 992d05f..0000000 --- a/packages/lustre/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.beam -*.ez -build -erl_crash.dump - -.vscode - -node_modules \ No newline at end of file diff --git a/packages/lustre/LICENSE b/packages/lustre/LICENSE deleted file mode 100644 index b8320fd..0000000 --- a/packages/lustre/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright 2022 Hayleigh Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in the -Software without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the -Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/lustre/README.md b/packages/lustre/README.md deleted file mode 100644 index 29eabfc..0000000 --- a/packages/lustre/README.md +++ /dev/null @@ -1,199 +0,0 @@ -

Lustre

- -
- ✨ Make your frontend shine ✨ -
- -
- A framework for building Web apps in Gleam! -
- -
- - - - - -
- Built with ❤︎ by - Hayleigh Thompson and - - contributors - -
- ---- - -## Table of contents - -- [Features](#features) -- [Example](#example) -- [Philosophy](#philosophy) -- [Installation](#installation) -- [Where next](#where-next) -- [Support](#support) - -## Features - -- A **declarative**, functional API for constructing HTML. No templates, no macros, - just Gleam. - -- An Erlang and Elm-inspired architecture for **managing state**. - -- **Managed side effects** for predictable, testable code. - -- Universal components. **Write once, run anywhere**. Elm meets Phoenix LiveView. - -- A **batteries-included CLI** that makes scaffolding and building apps a breeze. - -- **Server-side rendering** for static HTML templating. - -## Example - -```gleam -import gleam/int -import lustre -import lustre/element.{text} -import lustre/element/html.{div, button, p} -import lustre/event.{on_click} - -pub fn main() { - let app = lustre.simple(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) - - Nil -} - -fn init(_flags) { - 0 -} - -type Msg { - Incr - Decr -} - -fn update(model, msg) { - case msg { - Incr -> model + 1 - Decr -> model - 1 - } -} - -fn view(model) { - let count = int.to_string(model) - - div([], [ - button([on_click(Incr)], [text(" + ")]), - p([], [text(count)]), - button([on_click(Decr)], [text(" - ")]) - ]) -} -``` - -## Philosophy - -Lustre is an _opinionated_ framework for building small-to-medium-sized Web -applications. Modern frontend development is hard and complex. Some of that -complexity is necessary, but a lot of it is accidental or comes from having far -too many options. Lustre has the same design philosophy as Gleam: where possible, -there should be only one way to do things. - -That means shipping with a single state management system out of the box, modelled -after Elm and Erlang/OTP. Open any Lustre application and you should feel -right at home. - -It also means we encourage simple approaches to constructing views over complex -ones. Lustre _does_ have a way to create encapsulated stateful components (something -we sorely missed in Elm) but it shouldn't be the default. Prefer simple functions -to stateful components. - -Where components _are_ necessary, lean into the fact that Lustre components can -run _anywhere_. Lustre gives you the tools to write components that can run inside -an existing Lustre application, export them as a standalone Web Component, or run -them on the server with a minimal runtime for patching the DOM. Lustre calls these -**universal components** and they're written with Gleam's multiple targets in mind. - -## Installation - -Lustre is published on [Hex](https://hex.pm/packages/lustre)! You can add it to -your Gleam projects from the command line: - -```sh -gleam add lustre -``` - -Lustre also has a companion package containing development tooling that you might -like to install: - -> **Note**: the lustre_dev_tools development server watches your filesystem for -> changes to your gleam code and can automatically reload the browser. For linux -> users this requires [inotify-tools]() be installed - -```sh -gleam add --dev lustre_dev_tools -``` - -If you're using a different build tool, like Rebar3 or Mix, you can add Lustre -to your `rebar.config` or `mix.exs` file respectively. - -```erlang -{deps, [ - {lustre, "4.0.0"} -]} -``` - -```elixir -defp deps do - [ - {:lustre, "~> 4.0"} - ] -end -``` - -## Where next - -To get up to speed with Lustre, check out the [quickstart guide](https://hexdocs.pm/lustre/guide/01-quickstart.html). -If you prefer to see some code, the [examples](https://github.com/lustre-labs/lustre/tree/main/examples) -directory contains a handful of small applications that demonstrate different -aspects of the framework. - -You can also read through the documentation and API reference on -[HexDocs](https://hexdocs.pm/lustre). - -## Support - -Lustre is mostly built by just me, [Hayleigh](https://github.com/hayleigh-dot-dev), -around two jobs. If you'd like to support my work, you can [sponsor me on GitHub](https://github.com/sponsors/hayleigh-dot-dev). - -Contributions are also very welcome! If you've spotted a bug, or would like to -suggest a feature, please open an issue or a pull request. diff --git a/packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next.accepted b/packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next.accepted deleted file mode 100644 index 4d6e333..0000000 --- a/packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next.accepted +++ /dev/null @@ -1,5 +0,0 @@ ---- -version: 1.1.0 -title: Can compute a diff from one render to the next ---- -[[["0-0-0",{"content":"3"}]],[],[]] \ No newline at end of file diff --git a/packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next_with_fragments.accepted b/packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next_with_fragments.accepted deleted file mode 100644 index 10e6efc..0000000 --- a/packages/lustre/birdie_snapshots/can_compute_a_diff_from_one_render_to_the_next_with_fragments.accepted +++ /dev/null @@ -1,5 +0,0 @@ ---- -version: 1.1.0 -title: Can compute a diff from one render to the next with fragments ---- -[[["0-2-0",{"content":"3"}]],[],[]] \ No newline at end of file diff --git a/packages/lustre/birdie_snapshots/can_render_an_application's_initial_state.accepted b/packages/lustre/birdie_snapshots/can_render_an_application's_initial_state.accepted deleted file mode 100644 index 4545fcb..0000000 --- a/packages/lustre/birdie_snapshots/can_render_an_application's_initial_state.accepted +++ /dev/null @@ -1,5 +0,0 @@ ---- -version: 1.0.1 -title: Can render an application's initial state. ---- -

0

\ No newline at end of file diff --git a/packages/lustre/birdie_snapshots/can_render_an_application's_initial_state_when_using_fragments.accepted b/packages/lustre/birdie_snapshots/can_render_an_application's_initial_state_when_using_fragments.accepted deleted file mode 100644 index d89dc7b..0000000 --- a/packages/lustre/birdie_snapshots/can_render_an_application's_initial_state_when_using_fragments.accepted +++ /dev/null @@ -1,5 +0,0 @@ ---- -version: 1.1.0 -title: Can render an application's initial state when using fragments ---- -

start fragment

middle fragment

0

order check, last element

\ No newline at end of file diff --git a/packages/lustre/birdie_snapshots/can_render_an_application's_state_after_some_updates.accepted b/packages/lustre/birdie_snapshots/can_render_an_application's_state_after_some_updates.accepted deleted file mode 100644 index 0922d44..0000000 --- a/packages/lustre/birdie_snapshots/can_render_an_application's_state_after_some_updates.accepted +++ /dev/null @@ -1,5 +0,0 @@ ---- -version: 1.0.1 -title: Can render an application's state after some updates. ---- -

3

\ No newline at end of file diff --git a/packages/lustre/birdie_snapshots/can_render_static_html.accepted b/packages/lustre/birdie_snapshots/can_render_static_html.accepted deleted file mode 100644 index 907c6a5..0000000 --- a/packages/lustre/birdie_snapshots/can_render_static_html.accepted +++ /dev/null @@ -1,5 +0,0 @@ ---- -version: 1.0.4 -title: Can render static HTML ---- -Hello, World!

Hello, World!

\ No newline at end of file diff --git a/packages/lustre/birdie_snapshots/can_render_static_html_with_unescaped_html.new b/packages/lustre/birdie_snapshots/can_render_static_html_with_unescaped_html.new deleted file mode 100644 index 9ffc59d..0000000 --- a/packages/lustre/birdie_snapshots/can_render_static_html_with_unescaped_html.new +++ /dev/null @@ -1,6 +0,0 @@ ---- -version: 1.1.2 -title: Can render static HTML with unescaped HTML ---- - -
hello!
\ No newline at end of file diff --git a/packages/lustre/birdie_snapshots/can_safely_escape_dangerous_symbols_in_attributes.accepted b/packages/lustre/birdie_snapshots/can_safely_escape_dangerous_symbols_in_attributes.accepted deleted file mode 100644 index cbb7f9d..0000000 --- a/packages/lustre/birdie_snapshots/can_safely_escape_dangerous_symbols_in_attributes.accepted +++ /dev/null @@ -1,5 +0,0 @@ ---- -version: 1.1.2 -title: Can safely escape dangerous symbols in attributes ---- -
\ No newline at end of file diff --git a/packages/lustre/examples/01-hello-world/README.md b/packages/lustre/examples/01-hello-world/README.md deleted file mode 100644 index 71df563..0000000 --- a/packages/lustre/examples/01-hello-world/README.md +++ /dev/null @@ -1,67 +0,0 @@ -![](./header.png) - -# 01 Hello World - -This hello world example is a tiny example of what you need to put together to -get a Lustre application running. In later examples we'll touch on server-side -rendering and Lustre Universal Components but for these first examples we'll -be looking at rendering on the client _only_. - -## Configuring the Gleam project - -It's important to remember to add `target = "javascript"` to your `gleam.toml`! -If you forget to do this you might end up confused when it looks like your project -is successfully building but you have no JavaScript output! - -## Creating a `lustre.element` application - -The simplest kind of Lustre application is the `element`. This sets up a static -application that does not have its own update loop and cannot dynamically render -any content. Instead, we provide a static Lustre `Element` to render once. - -### HTML attributes and inline styles - -In Lustre, HTML attributes are modelled as a `List` of attributes. This is a bit -different from many other frameworks that use an object or record for attributes. -Lustre takes the list-of-attributes approach for a couple of reasons: - -- Gleam doesn't have a way to construct an anonymous record: we'd have to have - an infinite number of types to cover every possible varation! - -- Working with lists makes it convenient to merge different sets of attributes - together (like an element that defines some local attributes and merges them - with any passed in as an argument). - -In a similar fashion, inline styles are lists of property/value tuples. In this -example we're setting inline styles for the `width` and `height` properties. - -### Why `element.text`? - -In frameworks like React, it's enough to just return a `String` if you want to -render some text. Gleam's type system works a little differently though, a string -literal isn't compatible with Lustre's `Element` type on its own, so we need to -wrap any text to render in `element.text`. - -You won't see us do it in any of the examples we share, but it's common for folks -to import `text` and any html elements they're using unqualified to cut down on -some of the noise: - -```gleam -import lustre/element.{text} -import lustre/element/html.{div, p} -... -``` - -## Seeing the result - -Lustre has a companion package containing development tooling called -[lustre_dev_tools](https://hexdocs.pm/lustre_dev_tools/). It's already included -in this and all the other example. You can run `gleam run -m lustre/dev start` -in any of these examples to start a development server and head over to -`localhost:1234` to see what it produces. - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/examples/01-hello-world/gleam.toml b/packages/lustre/examples/01-hello-world/gleam.toml deleted file mode 100644 index 6b9e4db..0000000 --- a/packages/lustre/examples/01-hello-world/gleam.toml +++ /dev/null @@ -1,13 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_json = "1.0.1" -gleam_stdlib = "~> 0.36" -lustre = "~> 4.0" -lustre_ui = "~> 0.4" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.0" diff --git a/packages/lustre/examples/01-hello-world/header.png b/packages/lustre/examples/01-hello-world/header.png deleted file mode 100644 index dd76b409d70acaa0bd8ff7e7e516381bb14c2f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327828 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 ry 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
  • n_LLF^cSRnU@lE}j4KxY(0or{? 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

    )? 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 - - - - - - 🚧 app - - - - - - -

    - - diff --git a/packages/lustre/examples/01-hello-world/manifest.toml b/packages/lustre/examples/01-hello-world/manifest.toml deleted file mode 100644 index ee55acd..0000000 --- a/packages/lustre/examples/01-hello-world/manifest.toml +++ /dev/null @@ -1,49 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "9ABD71D63F4B8F362CB824DED2C4CA64895DEFACD8F22B0FF055BF15241B1AE2" }, - { name = "lustre_dev_tools", version = "1.3.3", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "67B4E62DAD9B8323487AAA697A6F3FA72348B6DEA6674D65D4F7A1407CF377ED" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_json = { version = "1.0.1" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { version = "~> 4.0" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/examples/01-hello-world/src/app.gleam b/packages/lustre/examples/01-hello-world/src/app.gleam deleted file mode 100644 index 57b9492..0000000 --- a/packages/lustre/examples/01-hello-world/src/app.gleam +++ /dev/null @@ -1,20 +0,0 @@ -import lustre -import lustre/attribute -import lustre/element -import lustre/element/html -import lustre/ui - -pub fn main() { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - let app = - lustre.element(ui.centre( - [attribute.style(styles)], - html.div([], [ - html.h1([], [element.text("Hello, world.")]), - html.h2([], [element.text("Welcome to Lustre.")]), - ]), - )) - let assert Ok(_) = lustre.start(app, "#app", Nil) - - Nil -} diff --git a/packages/lustre/examples/02-interactivity/README.md b/packages/lustre/examples/02-interactivity/README.md deleted file mode 100644 index 37ebde7..0000000 --- a/packages/lustre/examples/02-interactivity/README.md +++ /dev/null @@ -1,149 +0,0 @@ -![](./header.png) - -# 02 Interactivity - -In this example we show the basic structure of all Lustre applications with a -classic counter example. - -## The Model-View-Update architecture - -All Lustre applications are built around the Model-View-Update (MVU) architecture. -This is a pattern that's been popularised by the Elm programming language and -has since been adopted by many other frameworks and languages. - -MVU applications are built around three main concepts: - -- A `Model` and a function to initialise it. -- A `Msg` type and a function to update the model based on messages. -- A `View` function to render the model as a Lustre `Element`. - -These three pieces come together to form a self-contained update loop. You produce -an initial model, render it as HTML, and convert any user interactions into -messages to handle in the update function. - -```text - +--------+ - | | - | update | - | | - +--------+ - ^ | - | | - Msg | | Model - | | - | v -+------+ +------------------------+ -| | Model | | -| init |------------------------>| Lustre Runtime | -| | | | -+------+ +------------------------+ - ^ | - | | - Msg | | Model - | | - | v - +--------+ - | | - | view | - | | - +--------+ -``` - -### Model - -The model represents the entire state of your application. For most Lustre -applications this will be a record, but for this example we're aliasing `Int` to -our `Model` type to keep things simple. - -We also need to write an `init` function that returns the initial state of our -application. It takes one argument, known as "flags" which is provided when the -application is first started. - -```gleam -fn init(initial_count: Int) -> Model { - case initial_count < 0 { - True -> 0 - False -> initial_count - } -} -``` - -Our `init` function takes a starting count, but ensures it cannot be below `0`. - -### Update - -In many other frameworks, it's common to update state directly in an event handler. -MVU applications take a different approach: instead of state updates being scattered -around your codebase, they are handled in a single `update` function. - -To achieve this, we define a `Msg` type that represents all the different kinds of -messages our application can receive. If you're familiar with Erlang this approach -to state management will be familiar to you. If you're coming from a JavaScript -background, this approach is most-similar to state management solutions like Redux -or Vuex. - -```gleam -pub opaque type Msg { - Incr - Decr -} -``` - -This approach means it is easy to quickly get an idea of all the ways your app -can change state, and makes it easy to add new state changes over time. By pattern -matching on an incoming message in our `update` function, we can lean on Gleam's -_exhaustiveness checking_ to ensure we handle all possible messages. - -### View - -Because state management is handled in our `update` function, our `view` becomes -a simple function that takes a model and returns some HTML in the form of a -Lustre `Element`. - -```gleam -fn view(model: Model) -> Element(Msg) { - ... -} -``` - -In Lustre we call _all_ functions that return an `Element` "view functions": there's -nothing special about the `view` that takes your model. - -Folks coming from frameworks like React might notice the absence of components -with local encapsulated state. Lustre _does_ have components like this, but unlike -other frameworks these are a fairly advanced use of the library and are typically -used for larger pieces of UI like an entire form or a table. We'll cover how -components fit into Lustre in later examples, but for now resist the urge to think -in terms of "components" and "state" and try to think of your UI as a composition -of _view functions_. - -## Creating a dynamic Lustre application - -In the previous example we used the `lustre.element` function to construct a -static Lustre app. To introduce the basic MVU loop, we can use `lustre.simple` -instead. From now on we'll see that all the different ways to construct a Lustre -application all take the same three `init`, `update`, and `view` functions. - -Starting a Lustre application with `lustre.start` requires three things: - -- A configured `Application` (that's what we used `lustre.element` for). - -- A [CSS selector](https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors) - to locate the DOM node to mount the application on to. As in other frameworks, - it's common to use an element with the id "app": for that you'd write the - selector as `#app`. - -- Some initial data to pass to the application's `init` function. Because applications - constructed with `lustre.element` are not dynamic there's nothing meaningful - to pass in here, so we just use `Nil`. - -Starting an application could fail for a number of reasons, so this function -returns a `Result`. The `Ok` value is a function you can use to send messages to -your running application from the outside world: we'll see more of that in later -examples! - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/examples/02-interactivity/gleam.toml b/packages/lustre/examples/02-interactivity/gleam.toml deleted file mode 100644 index 6b9e4db..0000000 --- a/packages/lustre/examples/02-interactivity/gleam.toml +++ /dev/null @@ -1,13 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_json = "1.0.1" -gleam_stdlib = "~> 0.36" -lustre = "~> 4.0" -lustre_ui = "~> 0.4" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.0" diff --git a/packages/lustre/examples/02-interactivity/header.png b/packages/lustre/examples/02-interactivity/header.png deleted file mode 100644 index 6cca8a23db7e3967d541664e79e44bbeb622dde4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320493 zcmeFYXIN8B*EWn56$KO(kP?a-xl|BPN+2fOL=&5fo6WG^r6m5a}Ih z0qHd&y#@$9K!89fDf`>e>wcd5_`aXtpZCX`eI(hLJu`dHnwhoEb*_~V9WBJE6BkY} zF)^J|Q@x|h#KauR#B{jn*io<~60=*t#B@^GRz*ceO+`gO$Jx=^*4~PVNi`(afZ0&5 z{d}s)$4I5;2M%WhP9BcBpmhJ(_19ZM!^hNK>)bwh_?%qvw<%+tqSvP$pL?+Kdib>5 z2lK|d&tE?0emGLSdHIOzgh8D&PI`yFgO&tjUDmo%{psVRQ3&_- z(UnN)Kg9m|B-8rgd0vOqVD5A0Skd*rXvDdR>(5Vhx_M_0!p8u+-l+{zC6mAd_N>j# zN?CTuL8gM4_f30D>|bj}N`0cvHl8SLx}g-zspeG0YoO-zotGFr($rii;BY`m?QP@f ztV5q)o!i_x=m6{2Sq&O~(8h7>fKIx~N_2E|XMoHRbGzrlZw$Xi)>#)7c!Qai~UEaG)W_ z4BNrfE`IZvkAlZT;>XgDj?16#;{N479MyXKSimsTjKDMZJC$#=H8~C!3BHp&oFdw0 z)2f`yvLWR6k=91d($j=+8iaHPS6h`u92>8Z|i(Khkdw+>6t1yxBuzIvwNmO zO=p9jR&7O06B{KdTPi7&v$)|?*T*ar=%`-NVRCpUXk5W3fi{9LH(h2=pcN6OP zyk>a*+c{%o^0O>f&s0c9^`i+86D3v+w~CH+)`(9()N&#%e*DSh@?F=R92g5><# z6X@89h}vlu`Lc55t%5@bmNjlOlf8QOT+=`MGspK{-tO4mxcR{EVY0kd&5dY|3zs68 z%~*dPU^&bLi>yyP;jDa_y>$E5Rs+;aoqdW)T$S19X~ENXuP$~N2d-aWInjV--%y@> z2}c=Sg`8EQ6K-6^j0W5^vh&YHocBE8#Cq(|$hwgb;Sw)7jww~?-Z~qR*YL-UNqfVu zt3WEm93!dG7I>AbJrYqh8hJ@Pl1u5N;L+2_m%ii7J3kwz2iP7#ll{F`~k|ce2hNrxY&JP zGGW1xFihCJI~j*Xi_-2LdX)eCond5Zl(x-JK7VZ+mLII?i(27YqD-ngoO=rd%~E@u zlB+Ssg@w*kPnn&Xn(8H*E~+t+s~hJ~vvM}wuT7Z8(?ofv?>8NBW{rPxZ2fB5QG-PO z8waiHFNC)quRI_&#e7itO7LMPf#VwQdTr{xM345>U%LT`c`Z@Mn|qYdaJlf@%3<&N z1HYKU{rjePD^KRXNt)tMR+yMNvdB!Vw>hk=dhA@9;HzM9bN^vMtz(Baln+L|ym(aY zwr-^BonX~Sqqc(?Cq)p0!X}XyEaA?FWy4JGj7G_+a{m5Mb5Aji>-(D*Y45&Wf?crs zta0;XmNRfl z#-?H3+_O3L--}?m$LkgdhS0$v-=+|mQ(1WO%cDV48#0{e_t=K`DZ)mIr^4hLv)1Z$ zKPr#^{Tl+qr{#~^|Ma{Kdv+l$P)B)KOGZP6Wk^?gnlDPVU(opU#I&)7ko6gxGx6-w z>^o<)PmhH}gdDnfMlHe;v3dFKN0|&C-Q%`=w$e)%mo8){Z7Hi6wHvmpiKvPgseOBx z@i47aeJSwwt*Iy>X7;M4Zz+XL2sC9ZIXZIR z-0$XTr{p?h_vkKs!#*f@2>&vfrubR8k1PFjc2s)N9gFyuyJ7sAA2YvNf4;0;V(5}H z&)wa6Gt~N?MQ>&4ky2!7NvXs2FLANwO|I(YXxK$ON_vDT&n*Ao{)X(jdVdu^ngaV2 z{*~1PYGRYnb0Eb8hQ7xY{xp0l!chK;LsQvlq8nm)e`(WA-EC)ivY(cL7-H$~{B4pp z^m#`KGE^}TF^JB@JOFb2aH@GxPlSI6t0VZiyoQ)=72XOK|72S@@Oj{A{jatg!#b9g zJ?o**&{5%0=m(j-|DD}!*L>jv={)gz-ZhTv zoW@dyWWy!nqP!D%FY?w*^zwZ3vWyK(aD{@SH|&e;rG`z*?jj!}CGD>w3x?C&9o!FA zpK@PKKb9_k?>Is~V!6Knr| z=@>fy>6iFji^P^1_hPphm_BUcWhRVS7VGBV>NjV;@Y7>t(RnO(9@gWQW>-QmkoJ%+ zGD$HhsQ%&o-aFQtS>?m&X2YMAQ_Ab>JD&(nUHJ5@B%8X016WMWN^NnCyVrJT*@aF> zHFCwmQO_}a=R8phQlQp6paT1MOAL zppc3ML9gh|3#78C2%nrLDe(18teJ>@+yF98;djS!{&byj6aS>29)d zwvob0B-}zh8nT~Xx$Y7vo9&Xgkl1}abxc9bbFybIX3vO(5_7)xkJzhf0Vid>qGua5 zGp(4zfUe0GV;sg|jzsh{0j;`@}j3v+MhA`HS!j4L4d^{G%YB(WT>7r~UU8-i za(A@FZJrQUKq*$VpmpB|I%@Tg>VL?Ybeuv~miIbZOk8f%v`SJ$p0}^7z2vFxTW00f z{AgzIO`dkeC3`u52Var6x-ME&-dNiBbz7Adx=()>`mU!XqlGM- zhDc1RNo0k%$yDJ#wHI~ZM_c1lJ||yM6!$D%pRE_^&93WP%7RF1+tztlQxkZu_g+WZ zH1<4^;dEW=@|xd^=ByFptzPunXuH(%^vpFKYL7NB3a`UZVs{6o2$vkUCRaQOo8?{tFQ%relReP5c)wqi zLXt2Zzo#97PW4SCzumH0HApJZ#Qm(BfOK*5o^@*C9VuWsdNncbXgz_CNhg}=a|4On z>J60&y&6pI`bT97{%nu?!J~1eZvg zT$q^7Ut+uusOer@2m2qkeQ4-vsHp+7a72nevvf4K67@vBWc0%%?+F7>kyftH1U!-U z4lXcH1))DRVBk5USWHOZPZd`?1tCLC9RU?bXDb0I(Ho*SgcMH*2nfhKTUx_(@7(*h zIrvLK=((%wOPH9Lhlhu#hoq>ZvyGUztgNiq4GA#`iR)mE>n>gnuFpKLJGcn{?c_iG z+_7@8aJGHvYU}7A!07jxxuct_f{+m7M*s8r`P z^TjTw>y&;N+pkB_qPpU?&6i(vJiHi}C+=REd4yWBdLkwNeAolqTgW>% z4`0*$`U}av&6a-V+IxeBuLpS8e>mgB9I#kp4E71WtD20LC(BZjNqp@vmmcv}UW*>$ z1(&WLgX7-lW}&l(-zc#kJE$yh?6AK8`~Us%e`WB0?mC#N5m*l#?9I7vW0xS$`H)mb zZMy2Vo-ulK;z_?Af(NN9g)3I6oqJI-AFIb{d#N*HG#_Sx`e_>4R1nwhqI}D&^9R6j z?~sl`;hFSZ+)d`@izG2pL5l@xKWOfP%Zn$no+0oM_^vY8G6chM^yzGJwo6ydc3f1R zVWNT7<5&1SS`h-V!WICW--frpBk)a{Guyhs}NgKpg41{ z9NJ<%p6RplIs9%{U%o?Mb{Ax82&)v!oR-eHx zO1BI(;d0?_sZ)GLs1o3YVrZ}V`|J^v6_7ylAmehmbuegW^jxBDXB&BQ1eJ`YwZ3d5 zL65CmJ$Ur1@2c6pTM_%qD2g*r97~e0PnU*zyKtv@&^69GJaei8%9F)jqtOLtDZ=>; zs7*dv`u>T%U9&&Ja2!PEVn$G*IhJIzzSNHjx5?;qv)6AuKVj+Ko3W?AE;Z|uaed>b zd8qe<(2OS;LD>K)e@`N=T7cJ5J7|~NDi_W|cGxmvH|f$u)Q10uDj>fu)rX^V4b5{(E)ba7v z12z$rNtjnm0K84ZGvL%=sWV>Ul3#mjiZh<{t8_$GXz|ZYu}N@DK0V|gcIQc#Mz&opDM;$r1on&wHH`ziKsvMj@}j0)~VpzLlnduU!S$Bb?>*6+bbJS zY@we!S%3SWaEMQ{^lmF40kn9=>_+b)}g zDBff<#y*Ip8IaAInpfZ@Ko^}fwf~8>P@1)}ljNK5_z@W`e6%lIl0uY6X-q~gLw6Z7m)egotf@8o(}3eeFO_0wmaOv9pF0GF(KS9}pNtL0`odp{jwQ4x1|LCD zl_9^eTWJSAlM#wmv{tFi!I8L|^!U9X)XOF5%n*3jrzQxsfy+GEKMVaj%4c&EY4IWj zsm6gigIZ@3rM2AL2;z?34S;j0gi5Y&aoqT*{iF`5kymov7F0WI^oFmvPnYR8EWp~# z7Qs$OQ~eI!+idTw2+MXWzobc3qc*@Rw|M%RAl4dS?WZTjd+PhN>s1xK_R7V}ddf5Y zs6^&?Ka0fO#!#>}Bvi14+jIXoS36V;_vc}^E7c!9btAm{@4LN;+a!>zfZ*~&0u+)FzrJWt-1w{ z;N9Z_DE<%qEWYg9XWW)AvJEhCQaJcQg?Wy85nKfEyDm3Gp>%6n`+gFQ*;|BcvQ~So z#K9UkazfZ&os8x`Uqhm(eT+li%ph!wN&`Mli$rOK^1O8MvtJXa9wnl(SQXS zG{-s>zDd2ce*i_I-dYuDI9RoUH4{Fu$8-2i{S)D-Lxm|9U#cA~%HdI|6C2Idi;Jo1 zAdcxoh<@w%&QXW#8oO6lJiuD4GobdvF+Kmuqm;5Rud%HvbCmH`{fQIw4FD##FN-%_ z_Ps=M{G`|j5l4f}zl3t9JGBwA_5g zp6nOfI_Il`5zJG(`@>PichD?SHaPavPfkga`DL?_DR}ek!Z-DqGruh^$JOS3`dI-! zahpN;sPg$Q`I{7}9BbR`AM^Ed4KgYo zq2Qycka0`<@d`7__dc!xF|~AcbA!{Wy)y{G@8xx!2RIaXZ${Oa)bAhv={=uB1M25} z(|YyXwoV4fm}cqX@jVFCi+zSIyhw%3Zi|drgUDlwWB|CR8L`_Xx7;xaW zu+zmnujP7mjb_#a(B;1*I(6yM>>NY!t{<5XQ}jnoaq57;NSkkSKL#lYfQsq3?_Es2 z+19zu&FLt_lP8@m08?6&%*R1_x2a2+=0O_k=)yCc>u0WRZsJi1sNI94d+2)jI?K17 zABkD4UcMdW2`CV^1=f8rn-beU;kCEkCM;H9g-5;qrOK;jmkL`yqgSMIc~{#ogvB%D zoY!788E*d;^m}A39X|Q~lQ5UA)XSd%vpk3Yab&ODY<0h-+W+d%b&-t8y4=(UFFt2`INmnl9HjY<@NmD>$7&B}<23LNG3rZ@F+IRPbrq ztFibn;g&}h$U(^Igu&U6=xqe1eLs2|O2D3F3q1|uEpS(N)6;Q|+g3vl@b}1O_*aRv zEdD53mW%mqOJm1B7U$XydH@=YvpBr});*&7Rd)6KPb{D*puJp60z#Q|XlBAOv6r?h zwry=p0By}!s|}?=p!Zj2jvikT9Jv?(%mxf(&44lk%}B5~`GOp{&%CCqK7vo-NQN*B zoGj)E7xb}8G0;OF<6QKjw~>Mrm9}m?n%%P-wILHF>sij^Fm_rKv>4#ZY+ld*ReSW4 zjP|U*{vi7FRSQRm-We1JYC9wsE{nS1K2O7)_<i8pYAIXvc z+BfM^MO?JK z7-)M(hI5lDt~l16$GLw@b#Bk@l>rmK7yaPdrN{SEfh?~W2KaT^xJki^TQgL9miLDh zOs1PfG9TV-$7J(b^lfMn@C`=s)JH}Z6qkj&Z#8e5{gCyYbQ$|>GeFDg5&vi)CSsXV zCHjTtl(FZXd2I2y&1eXh8UH_nOiGiQvHna?Vh_OP#yzj7tf%q8zTuznWJIQEC}h|V zC4WPgeUv64J$c25`!SxfR=ljtTHq+-gwfRqKSllHW{ zu^T;-w$r|fX+DD!W}D8LHJC0qneFUG%Yljg-ishbI|cPH9pII8bwAc$KNT2c0DWim z#kg}_vS=nH+Z+&lzz{|TwY1M@hTCSw}9o6b%4u~Q#_pxxZn$mNW z2KXQQ8of(M{1x}b|5||wP)yel%c)m$#!dO9Z#L-L|JkDZN!!u{;#rQc*p{|jIER#? z^qW&LV3C+&)B><{SBfM=DX@L=Iw)obZgI^G*$xhp_;&X%&6zu!Le`KAq;E*S?-#lx|_^B-H^c_eML(ib69N2A_|W$zvV z7>-sFdss5W;d~gx0y)FB`&te3LE%Grn0>ZN<$X@u86uZQ3EdI|7LtKMRz7X}l6hrM z1+D%74Fnkkzgm>m6*%IWq3|+&wCrbDX#tioedH8|jzFZsgTwWxH?8;S=D8{4StHbr zBh5;IFa)Pw;OBfuh+3F=VgMLu$0CIewF_GdA*$Ud5syb8uxNNSLaBA6_NyV2-R1Mj zoX*8j1<_qFU8q2Dxv&h$_6CtpB>LQU4*oh$WIMXlciRq4f6;jNXo5bOFZw`M2nG^xm}Wo<3v^+eCNI)8#LwP2gUa%J!3z#;|L!1;vEw`F zAWnA*Ya_LmdbE+uQb7omu%MlKbwZj0LZaJ@%gIR_$~L|ANrh+Kx?`_OqB|xcyy#sd zsJJi|=S5dsBS|k@+C8&z&ODEN@~woMP8g={>SPuPy02=sN4!&NGyC=2&zRhsNan4973Ii#Eme|>^j3$04sP1NT4fQL4LInv+DX{vZtAbL zrFNtR`K&MlyErZu2_RS|1m0p?s7gKZwjBy`1*X^%dbnq0K^xt|=U5I!ZC-;2UH^Ab zE0~ZYx1Lx6;`?_3E>Xmko@Zz?_ME|l_7>&+3Z@wN30;1rOKbLp)%^8hBq`eF%3+*q zw=T#rs$abPR3D#Rnc!fIisf*b?T)_PrrNKv89D7dA+1k*uqs*iE1Z43Wlfd#^%3E) zlhBq3N28iJ^Vv;yiE$_tCg0Y6uQs}gqBe#fHjs8NFT!TwK7$O*fI(k0FN!fDa3zMx z-ZI07JIQR=Y;g`Hh`-T5%>@YW=9z#l3}XB{cEE?~NN->Y-6}cVuv9?(Uy?wal}qrk zUT}mF3h{6`(S&5K-?su31C5Ar8<_%)Ibnu11vPsvyy-xDS>SHuw#S{X`9E%nJ-XEm z?pjWWQ;OS@gbu_}j2cyew%e&Nd=#~Is>%0_y-i(@_wp6=EEQc6vHI({@YE^AXJzqE z_@YCPAE@)$Y(I6x>+(rA_POPiqhJs?SGufDpYK@da@oYQl`+o!?|$2#SaYsua3bZ&N zF6Uv}q&A$8P|T^SyMQ23;}>x9sD(W_#%k*!d8A?{Acbaaqy<-{xE&mx6i8{2M`@E9 z6-u!@84G)R(RC`JDx)nxl)e^UjI;vkL4j!)d~CG9c}vjsJU!4%9~lRxAV4Qo9dr~msR|!x2!^;BW|g5iqPJ~KS+q!daDw9?E*JAJreTQw zu$D96FBlf z9zvxG^zgrYZXZ-s4%8<6gU?t_NquG2ufqM^hcJ~?usvI*T@~hgS+=;Aze8v4Dhtjh z4_e^6i70bK73yu6u*FMMvz|LNr~ffi1(PFleJ z9Y3$BjUl4)b5&jCd_ChnHh<&+C9o9<5Qy_T0K@b(B#soM$E0<5biZ}18;pjp>{s8% zmXnuQY#yW{_y+4%_no>%3?3!5ZLQ9)2t!~(2PcDtr7->7FYg7b9Sw)sU|Wj>&ud6) zA4;cXYnky)hNvs-mnwfxozyCe5FN`cDM-1j80zodR{e6DJWV3q;q~cbJH}uB;~!Lt z?~0O*6{?h<(tz4Bp{Dg<9#c?M$2$UaPQZn)lbR$|69UK6%?&6KO}HjA_O`#!l#8Vp zgr&{QTKGNGRwZK%|DEdt{{K!d;Pi=$GA5$jmry|#Ddcj}YMzIrz03%quDWHYp<>h_YC$L3vbMT&$z zzbp{}m;IKL!9UllQnxIZ>pN!7{8&SgEod(4whMVWC%~zXd;?!`{gu{Fx={q2>;m9{ zuKCp&vw48apyBEUahISy;|LyNy%#s)%Z@nXU==_QI3i}uYsPpK)<}QgE~q72`f@SC ztRTPRgIG-c;APIA!Kl!^?_IM)96_0`(Sop*O?|$Gs4!yYt@&zgp*59^_4Q{nO4|A9 z9ddQwy-fh3TUO1{0|(56KYoAnn$;94>~+j0kCml7PED{=@TBgHtMUfdi<%=krufYg{mAg%9STCM7@|E@jwAx(u0YI<{)$!98JA8yoX3rdQ z9yN~(%p+-DyWR?14mFM6-`4J$LG>9Y?n$rN4z9w_pfZ10)i{Y7X;Bky+@~hY#~4N~ zOETP#CKhvWgWBf5K2FL|L^XEq_ks2R`#PxTB0)P9zQOEs$eDGTa|D3+01L^dv;NL+ z3H`#=u#^#$h7*TIF<{<2><2VgVMPbc=EE1DvuQ8T-bcivS+PY*S$)Bmu2|TaP{PMz==>hk zpdvB9B9t?olUlI@8vaF(1km$=mi;00?W+M*P~l!$`>SSyvI=_Hfy{W;)xkOx~@!!%Fa++_y(eCT~d4LnEy z?&8*PzzrOEnifHtyh(!pIZ#7H39ep-z>ZpfMEC--F1-{Kr62;%iVFe72MDIhx5NJe)|J5MJ*| zmT!9HmApgrqE~*xLUxZR{-jNisX>O`$ut8y#o<1P_GsP0gW+ttcB)?=s>SX{NBzPZ zQ9Y)fNV@09 z{L6nGxzrymQK_^0@!K|`vi~vcEC>HObbp9NYoOgYatEFcDTH@`4gqG9D%*32{Jtk- ze?_V0a~J;`7Kywf%RUN`VM9d6_8a9#wn_0p)zyipt}*019DnD$`S`7O^?E^0^~K_M zxVMG}WmG1lF zwYpU`Ye2ETH#kzUc7?peHf#8bvhHDv>f6onT??S)`YQJ9vRPmztB28Rch?~c+Yjc= zs1XS__s)3UX#MdS2I`f|$xTOVBtUNJ6Hf>niUICZN6<908Pp7%RD_eXqIH52_@h`x zfaEPo1p|JL#qXd;0BazLMqDEUHF_3o2U<*j)wQ4~swj^QY9s7K%GPdkMdqkK)Qp-v zHc#y?&lyCu2Gpr*GM&4SasrwY-f%GIkUsN8GsunW(f=&W*gwuOUY5{)FR229MGtwu zVeQ~|EniXEI?nGrd)083zsbGK&3<6OlP?(@8t5K9?rXw1g;}In)J9)}xP$W~Df9{S%Kre-?LA>i#0q@e zHjuw%gpGP=+2_l}zj5eM=Ov7q-5K?t|~52CG_OdX&fs;>3}nx@N~ zuv;=4SdyUYHbKk{Aq$*2L~MPq1MjA8{`x^aMT;TqM%9*HtdBp(l&t)F?@BZ?k93mE z$-o+C7>CbhTsNVqUw!>oLz9ZfrBOAl?{4I%=}SC!Oj4>Uv`6ZmCQ*}VEl+-fZbMO+ zZ;XQlP>9D3(#!F1B*h%Mn1uu?=^m3C*xl_K@i0KsGue_lHnhtDpx2~->;i!ZDr!6{ zZwzHc8*>2ScjIY}WT1~U{e7X}-}!SKG@Bd%u}cdI zLd!o~O=>-#!Md4c3#rywiP&Mj_6AtmLs8ix{(2(MGy@r|qqZG5hc?MB4CE7n!JGbz zVYf7X`mEOmi4fk}y<2)PiTZV3mwE56*|F8K1kEd#hh|88iw3xW8ZjtlIn|TxX7k%Y zHm`lTFmMkfYRg-1Eq7MsTkgB>=p)LaY%XmSu^Fe?i@>R+ zeaCI;I2qBIx~zm-O;Zk}YMnwKuRp48ljav|(K(cGMWuA(0@o^=#2II;(iad#bn=EC zm%bS7fz4cF&fFu@jwp0``tT5$S9EL`ac{ImQRZRoD6w@cz9=o1tjcDGnS|`;^h`c6 zYl$nK{W{DU;-skWlY$~p%{07gC=!oiQm)O@L6GP;e3||b=%S+MAHs3_&LDgom~~AZdbA#t)bsV*6e!lV~yNQyG%ee)fN`*BqmENNl4=Yv<#GA&xX%*>JE%<$y) zJI*>W$gh+d!M{7oLgV72K^k*qR|>$TN7*hHlkAMSB(}Ygm5P5z33?3lMmX3@6r>?n zyn!fqI1T34v-(++yhI$|o$f0@Vu8}3L{p!G{hfEhD_|U~`6Yxq>yf=7Zr6%#vwk!i zBiLsw-^z-Y|2Rqc`0K$ZjLOV?#ezxt?ruJ5RFD>r;K!UA1BiWn-#BObv- zD2pL9Tl!+_WcvFGuisPfp1t%gc+sV~_kbpYejZ+YHSHrD`^VB<4T1L=H~EZ|0uu98 zAkORtJtb*Efs+73X`1qY{CI_IOHlUBydR)bVE8X%(Kmg9Xfk0k;1*jp$VI5KGoAxU zwqO>;*ee10AnYlqi`-t=Ah5Y)&ZwjkuFXUgtyhxy8XwHVk>M}U?jL>EHM%P`m(#Ys z?-u03n!ajFH>36?JRm8|ndH5nnM@u=!ATvSvQP8ymvJOFCSFa%z|s{Jne;m;ux>jx zZhPY=R%o<<&OOTT%e2WBMc>b-va5{U(|s+=BB&2m`i{ch`|ek_D^@i;<)Bv=V@}bx z#K~+#)Yu>X0!!5f84R0PqgsHWBNhrNm|RQ}XvIMv{a^F*)MVIq|LB z!7}L1*32D%leR~gE_e5Q=NvJhnM{tiIS92hH$W^-_snH5-(u!O-j6OP)>Ac9iU(Stj9vk&YhFXCJBZ9U;KML5= z1K#>M83GYNn2a?Ya-CiRG8+F?9oL#z^#OqhDn# ze9+mWy&hM$CxJh)4014eUV~vPtO4Jb+TE{as!!~2XEcSSE22CdTw}I_q=L#EF-wxG z14ZqM+o2G2VVI}A9DUH$t7T}+Kw2dJ4r;YTB56er_3Zc!QJDBWzPw4-mN2}M2CvoB zl1%BqfhoC$Z=7;&iI3`fzB+Wku5S8xbD95)u1E!w_Mb(ALFwD9k7LvX=VtRtBD#`& z6(@>&6y0A@23Yqr$=M!088LjoWl9_WfT9fYCn}!YaGBidjXJ*r|C7}L(xwU_aD)jE zQSv9-iIMSi8Ps85;dx7(oc5#&$}$O)f59lu11d@p4_dw%ps^uPisVEE85%YA_ZR z6q&AB7NI~`Sjnj-BgQgI^@4m8OV}KH6s11PQfm3#o{zb&3vR59J+K)=wup%`N^l$X zL0TPt%{&ujrbv+Rmu^741YM?MjW>n}HU63-do#Swsd}iG-SoO$$g#_yt&8xh_i3Xh z4I*{aKnl;T7UcQ&Zx7ph78ycm(|hA!2h4SI!N`XH%YyeZ0NpJ+Uu+>~U0@W*D%nG+#(UOGOeo46Bq- zN45{1TB_Ii-bgs6#e3LEYp-KjzF)bv#yNxC*-!W2aEV%9Pv|rBhGQ|xkUF3SR2n3$ z<18`RGJPAZe(UhgJw|d#Gmz=_qHiC)z3`HP&c#^xj118XKo@{mEh7QN;N-S&Dkw58`suOT70> zsxp`?!T+l$(ewSLT{(8jGuS}=8MaA@d{S4MU!FUy)ka|5SwT`0BqcPdDdz7<87d-YuqKZE| zqV-F32fc`!BSESnmVvEPqwdtUWs^(-Xh+JscY8q|R?JtK2&1$OYm?g4`;`|HO2o>` zmGAjxmd0!Ie>s`S`Ht(?U17%y(gx7q4+w@%_f?^SY!Ol}o91`FKhbT2xrwNZXd7J# zkYA-fd=q`vuMF2YW;XkZGPq6d?S@(}d#;RKrVJOcjRr6qU49$W$m-kMlI%NcTXB^# ztSCa+I_F$tVfzm@4E_gQBn!8u0Dq(Y!a}<|rJ7WP!`SYJYcadh`F6q=IQTa(r=xap z!7B5(O0o^;j3Dg0_JQ36F(EMiw3-UEe1qjx_{tK9!K&a63u17o2`vAyK7Tas2pXiY zhj(bwekLLGS1pHd5+bDzz`|bN6bnUoOrg|5_o)i^tlPsrahZX_Y&>^AHA#mo6zsMqf zz&V+-l@aC!T`_v2BG13-mvv3L7=VF38906`;8uQo)4LT+i|-*P|IXUO!}hO$_`eBE zS}vC<#EBJ5SZ`C(E4uUVji65+{kt~Qad#k$T28>0;|(AprEAo=E9BnJ$p%**YE;Ad zS(!(x@EF0br<_Y|cw>I>M!SW%(T_hBJ>eCdq8iE)v~hXRsYmvmG_L|o0{Q(3!S!fI zB+@M=N=`PMJe!U#Uly)hr)*_x8oLX04&NkNem==JM8BmOgo!8!Q+A?QaDybCYqT$P zr5tZ#Iw}V)nC*;}v5LmfKkEfMBA=NvgUj4Q?@8y`njia;GXs}k!0`~c#rQ^nORMJ$ z{pyAdjjmo(3~=Lbcq)Zp`d|T$sz#{GrcHr2H*7*BTcVr5m4j)%y5W(i(gjkrB0U%B zGpB{EXbIHY8mf%Y?X&An3JmM!k+cKstCJymCoiS)djJjILD4_a-WQS8bfg`mcG>lm z|4;;ON3+BD-udsycE|VdW!xZ8TG3v&Um9W7nU0Q}GajN~@C~AFx{f$MBh;F1edV#h zMio!!7LGUD1D@AYgvr#hkc zEpPm4yNcUP!39(^j%-1|k7Yr~Vq|TA{wH>b<7zzvh6z8h~rt-}&`SlJpL4@fYh-ISK6!y7(Abl@hVG&qIFEzs*J)cE041 zZM_{rl#^{X-}Unly3I{zFPW{kmE=XY_LF5e>vvWfd5^HQ=e<$;@RPIy+lN@lsB z*<3|g!F9I>aR%F~9rWbMVK|j4w@hQBk97mG$y43kK#Srg75gW+sZJ&AKtkXV5q%+` zaxSKaW6iqWR+-`40XV0@-)N`HOU3T)Xa>i^_&rUt8N>x_NKhh{YQ-ob&y#jAUO@B? zoKgvZOrXoh$7?9hxNNLs&y?@49qpuPp!$Ib(E})XPhM0oRL;S)E^gU6^5jS4`+?bxCs~> zS7=j#y$P3ch6a6^R8!(Nwn6VNTaNm}5jiW3L#$*lpmB;fFciO}=XUbV1Y|6)xIlEd z88cb{Vu5UvAo%0coR+o~Cr~Z2(sVa+uZJ$Vh=Xz}@ZLF6;!fSr&E0}<_|qSG03&Y? z+<)R=veo>cPgr$6fkC$H1{1n&_;*0|+NR(+WV3!KJ+yv6)_|0Nia@b4kmj>+E}Ita zo3z*n4KSPvCj2|`%cz*@eS-W~ET19D_0vP#3$fWgmVad&y&WVY@FR{L!dgNvUi(G9 zI0$jGw?o%)3`vb3to5jRL*F+(#FF=8_DV(R5>n6gsLef6cuo(BpnJH>jYstQg;7iN ztCoWU;*CM2Ls{XDF)%2KZ%TG)tvG2biATWcx$4M=q^|+}hwjeR7{w5}^QE~Tmv3h! zXAkA?^VsddU57@p))KF-+IHUciuSGZD@dl<<<9N4$%#^=r2Uq;m|b}(iw6K0{RMje z1+HM-4h=Gu%RdCR$oL8e6UwB@XfNmQ7ijsWPc@jfmnrXPbh@3~9}KYrhB69{RNeb` z%evui$uM}BACV=Ato-;oPJo5w%H&GSbOG@3Vo#HY4P!O9a>`)H$z){MB^e z3b?nnsYm#Dzr8U*(UraWb|Eh$wyD{zIJfuxIipZahvF-RmB(ek1PFFL$A4&+nYC)C zD!w_rB!$mHl^%j_{brT8RPe;p)P&4~~$ z-YQTS(~Il(*BV`p(LXw(Po7S1EUhr37_ZuKPW(#tb<@?JBrgZD{8BT{iTZK!MA+Pp?L+YGI4F<(URA}X7O8IhfHBiI`>!U$Y;~;Gf#SCJ~ zQ@}V8n3J`$tNC;W1xB=hu~iHsI_rjemPl)*lF+-ed-x43+FT`(k$>e^*iAw)RMsu` zU5%t2F?`AO;Ts46rw&Ho7xH?Oie3QxPIdqB@tnwfj&$y^FhZsa)~w$MBTDacpP*HQ zpI!E4=5ZlMy#=4&5mMGm1Y{})CX;=)3yO)mtA|92moq{^Pt-E9%%P`lUo94l5uM83 zE(N2PnRL@gJ~(Ge?Qb>5LTS!&uNIX_iDKTHKU)tt!K`Ysmjen8iKH{~6!Z`#&-LYy zzZ_C%%4!r9v#1>RHoL6NobJQ|yvOhEk*pr~QvdJ19fTHb6IZ3>Y+4D9e@m#E6}81X zSXXIZjEjJnO!EBxv0=b#%QmoK%Sdz3=AQ@+p*{nnYhV=O+YZFu1%P700O_FT5AoXb zX7dn5rIq1l$`;_F8v6&M$?ZI*>TWjGB2E=Ws*Ff;I`5wo@`e6+{6{AP@6@5;Mt1ZLdHq}&1e*UjSf|y4`V?L>j(kWo^idst1c)J=%2%8 zjAp}#?}5U=fd5@0p7Qj|BOd7)BYBWfBY+hMSIx+%92`(QxJSQ50j;#Q3y_od0ZcPV z0FlSKDo+?C`VEHtvA75jDCh|x-5wRvkC5NaIaGbP9Q2IyHs^V~e}M@y<*Ti1kYZdAH=OpG_o~-+ zJ^l+Z(n2PbHp;olzVv;=B;q>76%4p|eE4M9#52L9J}lGK}2f(=Ykj_vL1$_Y=WC(Us3Agr z^`hYq3Q{KlFrUJz^f*>No4hdND26~yDeHTHo^6}o(1u0MC_;+@Zl)wZDmjmQ$d^nk zB(urUUtq$)teB$DXm9O@Dj5q3p}!q3qwb6-8xhvt&;tWh-SjLzJ{l5t3|4 zvQE})V@Ofivn9+VBKy9D8IdK*kbNe`J`9sFW5zHu=Dpm%_r9O!dH;Ft_bRZm$r#(wSjlY85tDb2tsAsYjRed${Jwg?UnVniJzG6!JLBQ&<%3k?*auC3 zw_EEiLw7Sa?D^^=wl-s10t~F^&&(3Es0+Ikf1hT(Z~@@RmnxX{SkGDbk8%HHybg2a zq#nn>B%8Cm661{CHoFq7;|_=&mF@Q@a3;~sX;Kudxu|D-(Do&?XHl8OhD?x$VeGDt zs`Rckpl(*OS!I|mEl(ci1`F|g2q(oIpMS1^e!lwCWB9tl=q6x#d{k;=*Ft`J{FR=u zl%|MH&j6x|UR>4*ad+kwT04o|oMY{gFjOMdU~JCxwowmcI< zngl-rdJQ$*-~8pd9*09hVt4Gks2hO!b+9Xgv(hvc1DNyM`tsS)=l@WbsROfucKwIPRf|5tu=Z0G5S&@j4nkjVi?KDF>9ALd99xwQt$G-rf=LBZy!Xu{Rh|Y zrTY5Ts_rmow~FRl2`-rr(@Q@lV>|Cpo`&-4QR;F9M58MgjjT@kXPB9U^@aKK(Gsx` ztRZ>Ds1`CA&}~=~;bIe{gPQ#?xsBU9?uM@$235tw`#_!*131xgZRTPQ{B~`EAoH>A zqgp7(RY9&CX2v&phE-|R<^7gkDUh84>-2rMCe-N!W@yT2?E{L6oqkdeG$4V*^F3l; z2c!XY((<^|d4=C-uO^_N*zrOG@?vN!!S$i($(jA$&+qp9{Y(7W|3DbzIACOS(t~P| z2&x+{3NPX4QFBfa8%bMU85C)GP$F70P1$T`8>2aSc5G!`VZC|B_2mS1MSNA=!iqV# zo>PlnUNN^Kxp#Rdy2-${_WJa+71NWFyX8lzlIY-}QYFP9T(paXna7|dj4rV~`8E=V z6ReB(HrmXKbQrWUe961`{AQ!hzR*XeskOiFaVMPD{3!t`Qd+u5nmJ1+J{kWcKy-!3 z$n~_q6kh5mj&2h#w7_UNP1te`jqy=&)7sTQMP08>z5(7>+er!&ouFV@X09?;ebNo@ zlUgscF3?n`FpSc95-mtDl`@M7@V^`t z|M%Q@1TYMlh9M?%RPZJ4`9tDIb~NPbhfTFmcd8l zcfg_sjAazBF;r;Il5n>Mq>QyeRDdF8yj-IOpTLWv516#*(Q>=!>-J3YM%p47l&rZs zQLe{V(*Sio9J9w;Jy?O3KhU@D)8Uy9lg-*poj`vsj}OTKlcALE+apnWU1~1Kb{kR% z+znpLKBW^|S}!CcCG1}-Fx&p8mh=T>JCywJ0FEpr;j>^9@WjgBG4i|)p%XvG+X)ee z`RhH5lqR0pPLb=n1YcO$m^GQy7;@#FJj0~B0_AGm>&=%Sb+uI{O&w!pt<5@u!ABPkj3E>_Zt2F7AGk*F(Z{Y<%R z9A`Y*62=AZ8OrGexhI4rMgvBb&s~Co#)5kupi9iC| z4yOej0dFnlUYGXozSR9|?{lF-?u;T6smR+*bKKhm_Eh=mUG!J`bt&Rb%ND?Vp})QS z61C%Ii-9ym{iU`|m^4JUntV8>TLtvi>h9D!Pf4G>Bkwt`>@*kvexeKlMi0KQS&cVZ z*i^?L881R!{q^%7`3a*L`F?80MHR_FBzST0NdVayj(Hhc3k?E-pLi}I zZW827EO#F@M^Li}p`=VaYrzUe)r3>g9{A&^pWziZKX{UMx+VY3tP4@eU6?p6lP{cY zCYt=`8Jf8fHlq+W!`b?#09q^5SXZr$K^88o#8#i_%lQzTwjfvO;xyzN|1y>`Bu5yx z>=n$D#-R0t*fG?5Hu7*hX4+#FUgCglehIJ7p(jUtfrmX=}cp>ik zp$gb?7IMGvQ|Md4ldW`I)odYUk#glW1R-%*8YUdzcSFdg&^)0~Fi#(QDa}9pOu5~B z5sV_N$gYv0-_)lpGh7ucm~%^AKS^6}M$y|e{NyPrx^X_u1~IJ}l}*;Tb?o1cdI{#i zVl3gro6z7v&K4ESp~8O=8I5jXMek#(PxqC|_T}qwJ}Tj{SpQIb9{l@(K$_1Y8x zw=Sb(pi+RtL zr=DL!?ip=%HdCS9hN5)1znmT4i_omChlp#x%KRy(ns;+~_|r-j3>SYaA7oxeAGp(1 z4m@`WzhAuDLTiKgZF)VYI33NJ2mkIFv)_h0QgZ(7M3)M|T`14rs6@s+X5AVz6u$w( zbG-4e4L1BH0xCg0Je=tAFzd2+K!^6xIdSWo%bTJ>LYB*$GI$W3|EKzSzvJb~W>n$| zNi)fCuePZ*?dP~je*D+-g&M`T{G2kcv&ng9+(XvY`A(2zW%epQ3nwwFDnGKgx|C)gDzwhlt%^uCL1$E@+ zBXwpO#=e?RA6M%o%p+eA?n8OBgC^ozEc)12Ef1& zvNl&48fgc83bk*_uZdn*Nw_#`PcpycQVYL%7Fq?>UGGm@Hr1RAoE_X|VK^*NyY-Kv zEpL$@0uISb0@DWm_dDDfY!rPtoO-GZy}gXy-oR6o@e}}Gdb5`DXD0)K>hiDkNY?~! zcVt-U!)I?4BZ`9%Cigc>84c(4=D!=&Oh4Cyn+w$iGi%}9MvE(?jd?@zo2(!+&&={! zd7)F?>jY%2lqV)O*Z@-^-=Ws(?Yo#MyT9b&?$gLBO@Rvky-+Tn)I|T4?laJ9y4a^* z2X6t%048-!+)OaDSo)D`c?(cp(RW!ZB#;2sF`GVcc4F+jJpt3Rn_J(OrVEo6fk6W`aI?Wcwr$?YYH3b_&(RP?a%6J)zkWAX$4q0iLYZ zx0i$rt6st2tMj>{Fd8eiS{oa@JyOMcm04r$f=7Mm0==_j&Jk9e?%K@B^-!Kff_n0Z zIX9%4Aw~hgGCDk3iJDGIH=T)vncV3*y9j#&6PE=RadI(P8aE}Dz3J0Se2bM*K`VDEZ@WUnNY(lwr!UxLD95{lV&Nf>*v|;2oEiU_GN; z4@3&UoR%Kt{RlfrVnSU2qt)+C`&xTy3;RAjR=A0LmNtL?88Ijv$9pJ{$sHapa8GA{ zP_MG?Q1T_Rr@OQirTKfx_g)1WC7D02R&U-UJ^m6RX1hOX+Z3Au0g`YFn<(33$s98P zi_&udQmbW2923}i07Q-uVj=5)`}C?a6p6S0w`2M5lS#{!M=SaZ^G_3)JtK-{pgBVY zAlg7a5}6Eo#^0fdV?qQkW-ASKlh zaek|@2sT#1&VC_AC;)t9%&v_ywN8I2Z+yGaX{k%OI$yu?tFXihT&R;Yh;ovh|2T1mIpjUDz5?LP zmols=UVJdAc69PR_iWVFe;Kk41$@6lR$J^t2V(5j@e@IWY)+&27qqQph0orFO$oeC z83Bq&2-?1qLDj^1FI*n?)#&@)-JW|3 z6rkKsi4YnPeHAv|6%2CKeKaNiEdN9U(DMDb`8m($L!qsEZnSblWy9I@$ZeLflb9D3UrxKVMX<%<=_qo@IEg+pPmwT;) zYguGWr|G|iQicwqe2hJv_099jXhu7j)ed#l0FA2jRcUQJ*W(Y_led^{C|g4V61x(yLcckD6v&jtKR^~#Dbnsq9Kkmu9cuH()&E9*L+ zH&_rRxi3X>C?jCzjkm$B8($CKi@3s%@S#h6a5ZXtu7cM{$!W|iRJzqFr!+qa+A8c4 zDGW}eChy0}S|})1jf|I7rfH;PSL1u#k?UIl`XnQnt$tPTMk9t@zPT^_Uq|iO#oarl z(#)(3hk=AojKU_+UUi_sGG1IqhNz26KJCGEyJG3?Y7l1PM&SwIj)tr;L&VL@FHdZo zlkNac5Bgxc2JS;b0PT{9ME8zgNC+EU&hJ^owv!%Lm)8xml{hsv2M@X^C_vtfWB9&?t+(a4RNk9lu5iJ>eG{G6`yh-h$x3!r>71pN`Xlg{_UiC z{I-D1HaQyaO&hkd?_KSP21a54!?XVPgSFLF78tRSptl}}XT;&DNeQ8ItM6Nw*p7^} zxgasUzPi&P?=B;thexUPmU^<0B?MPu(fJ{ojw`p&d7452)3<37L?Oz5!Via?70lz` zGyemp(3?ju1SkM$Puamrzc+C4Z`KF744xa?-JYV|WfFfL^jjXfoT1aB^?oZQR}geJ z+piDxWkuD~1F~PP{h|vJ0{$_+VSdn;K8$;>V#=fwu$I2P5|iX84xJG8hp=60&$hp& zaQNS%-hfwJ1amYa2F*x*_S?G)mzkkj*Q>4~JdNPolW3-3U1tY`T}t7s$4_eg znd_6(3mE({_o*BsCRuhago!vRxZ7&`2|6Ai|BpWg*8n!pp>bS6S-sHeP+`DKO`MhN zuKkHT=B@feNAD7g`C<97=7F<{^5tP>%gv_U4($@TCC*UE(D{{Q`tW6m>|X(6vjwFj z6DZn3nFip&%3Q=Gs0xcNn@4WZ>(T5k`!xVEXn;)wF8td(J7_%R2@Sz?{ zNT?`pM^=m>qB01`s}clz1VPa#qgVYr2Co;GFW7=8Omgc|*L~D)wYfN5^u_hSS7bF* ziU1!5QCeVFoC`^w_v@&J^P{9CQv0lq`bQ@h)1zWu(yd<)U)_4#II>So@sUky3a^ZQ zEx*w71UrAUx}v+GtrVC6y2bexBlVF>=n0bU`0( z)VHOw7aLm8c0LSiia-a&e-`kUEs$FFaBsvG2!dXC5i5!XNf$>9()8hX zT}ZiAx{#$G)_3+8OmPW?37w|xwqnLAwR*R^o_#kdi+fTmy3fCI6}bBJ(T$f-F>o%MGh_dSO~;{?@oIZf{~xyq)Z;4qYvqUNgo_Q^>KKxWpWH2qc z9ysM5wGiOlzc_9(w%v-?TX-1-17p$(^hvI&9-II2W`TJ<7Cazo28Km&0lt)bT>+1)pd5c_ zAN$rQ=HjXUm8uupe!rWliRr$otuPBXJ0d5rY0U&^x7mWE0FhK&jo{>%OCdM|me!P> zkVz9MQD@xSQ4mGgC6s*PksPg%8$m$ML9$oI3MIVuR{lI0m>3V(W z6M=~GVP8GWN@BG%41xYyp!`Uef?cHfpgLcw(12%x2qhKJ2h3@sdRrfQis=bH+uCk= z9cVvB&A!YBzxfP??%bzyeK*;=Dg7j{`*wnp!Q_$6o|0>X75M`e%x=#rh%RYxvKc04 zp{Y2#al64e-G8BW)liE*Y}%t4iyS;Pjf3ux3ce2f9{(Rn2NCjTvn#-o*79>f0qc)H zip%m18rjp^9NPCqOO+~t>S;CV)M3oYF>1_tLxsXT&3j9OWr-)KHSmkT~S8&pVw&VJR@7!js&rfsn7~2zX?&Vv)S!!b0Y7-DdJ`-*c zU-$bqk+tN4HCwRx0>HxilYF={Ry0c{@v_2;ELzyh2O&UYbj~tt0$h=Gp=>rbU;wgy zsha|hMTT(L8yseFIcjTxCFJC=Z%@R(;uW$)c4t9qxo4Z8sLh2{FAeZWSqN@^Tx^2O zUxG;R-tL50g#c5=T|Ba)??maPS9|KiFDi4bZBKq5`m1s-6vr z)$k!#nGmcM9BMCBD=pP+!5l*BXip7Zh`mYj@eLOKTj|UDVe-DpdlBSUR6^%TSlKYzk(?QOcnx8lHoJ5 zyN~k;z6bF|ov*#o!ajNedx`7HWB|FleHpSY09Wf$ikWvNAyaIQk z|MPx3Yjck$_I6GJu$;aF(tbeMi4S|T#aY;x{_m*uGoK!d+#bU#6Z&+m-$+QgyFQLN zGhj0A_Tu^fz(lP9e0poIArER)&nT5OF1)`Svah)Th|nljK&kxEf6&DP5gx4zUib@P z))K2-Seijo;J%JV5#DU3nfK<=ukmO&k4cFT*2i#N273p;wrsEXKj|J%t1##au;0YIu(dLBHXi^8zW(g z+I;{Y>9TIPXdD&8ZOvFDLZbl5tR~mf%;V!>T|iG0a+P8G(s^^}fb_tF0sTS({<%pI z`?hq`5dL==p{{*qV~!)LdE(MP_^&nGfJsa00NC_;+4)4R|EDm&wSSjjLOFVSt0PWx zQY%m4lVxPS6wjb;@UMeuF-3#Vl4Au!66&o}4j6nDt@el1VDhwgLX^>)zGS$0R6I*-;s=1&s#ZHzenBY@1;~x z+s!)U6|%aH!3u*1%0jU7UzG@c4`>e(bo#z)y_om-QLRDgsa-LkWeI8b)BsGeM0d3o zW^~AcbT)b-c-zH>2q;BGFk%hljQ|OEOPoQkcTRUovFb8t$&)5oN%X9o7@oS7^6Xk= zM=MWERghVBfpfZSNQIltt{SPWDZ{x&!^uauw`L0CKzQVb>2O*5C;jR~Eq4Q^V>`l1 z`(T(9x2Gb`qzhuL{fOa$Z-Mpf99{MGH<=s&Q$!j6UCp+hyb=yQ3}3o#e+*^u!|^|J9krk)^yDYdaO47JU#f&;u zN>8F@#U0VcVeJ{@3ZwhDz_cgG!pN(YpZeZgmHTw->?O&UOX|o5CeByZu{uU(C@%kb#w{avCpK+ zpB7!0^oKUCi_b45z;XfU!4Y|$?m@Wc<<^YD6=+OmBlEnj{*xgdnDGQUJ{z@tCcr6p zCmNuM52Zf67iv1)T@m@;bI7e-yXYUD0mL#n;_^0n%^X2VSuup{+IaVO=~aQ@tFf02 zvR=k3U^^ntxmY8*lCB~AcQCm)ttN+G&P5y%fnl+YyG-(Rp z38eJ=&X|PsE|{L2t0)w3b_*dUM$B1BZ;>QONq266miqSP7MKdAq(lHR;_F&fec|0F z5>xj4qSr+5CbiXP>-9Xq5*$Y8-M4vN;YxAvX~hIdScFLkWmvohDwAXs6+lj$pRxG{ zOiPGJG@Ptcn-6OE5wS+aX~uH20OX4J2i^2WbK%KT74MLIb2c5JO_8Dj|IeXP;m#u+ z#+aVA@?xZ)W*s;p7`Msg^!G+H5N^ogtKpvIS4ut@)9hl;gP}glbBv)>SA*`S^63f{yp!k78I|fa!@@V>t zW>|V5jO2=@-x<%&^INRp`yj3sIat;@`~?N(Dl!_o)#?_49nPE+xFjOg-Ig0GX?zVH z%YdifnczYHsh$jMzA?n9cZTx46{u2pW$~@Ar^?_;bSjl6)_d=IT>lfh1kRpsq zpjvIcb#RIsyD9wRmRvmLz$=3gRT>6c0U9U+ifwHX7dx5C(Ad$Cj zZh2FRmW4JX=B)Ip1=2!q>0(XN13b%NkAj(XR`A2(>+J>lo;3;>pW^%R$#iU#{dX!D z>ucD3iTEwPIp?7je5JK)-Ku5sh)1ybnGb?u;aoQ2ez&7icpbj}l1rTa*caL>IDaM= z=I1>fTC;Y=k~w5Vzo~6TtT58W${LN+=PE65t+`TFc@M@4Zr0-8^seFT&2Yz8A!ZzJ z!Ptnif1e{$K60&^F`MWPz1FY}tI*3R>(E9o_!VFp?LX1dVi*oR1_zW}NlLl5) z^RK0w(gVh5JVW`eAvT&_)@b$|T8zwAj!X}g9)!wRViq3n7mT%^;|b z96JW#*G!el|gz*J(%`KnVh7oRfixq|fH|!{#KM3AQMC ztLQ+61lB(Umx5;QgH#m99sVzQLq%_Q=&wzg?P-}P@5un1=O)}+bUWT9{O_X$SgbK9 z4?ywTGulL>Zh>fpke~GwIy2zYGvJaEgAeTYgc%_YSx6L4cY)WX1Wr;B^?^U#?W%WR zOIq_I;19ernF8QEc-(E%)UB@-kSb|6Vu7lnX-i#yPS(6{C}o2@wpGMEA(>K$q330l ze~s4jmAG!sIh`AMpsK|sxW*_t+B^QTb#G0vXH7Y1o}^3aH_gx!eS}>;=KgGb^cD$t zZPK-L(=u}o zU|S7&<8YMKsWA4 zV094wy3 zfjtVbB?mLR1I2FQ2V(e*rGh-Mb@}n5+qYeG2RrXmJPtq=UPRa)j*JrX``KQtB)r>6 z%30|Cv>}Bj`n={Iu147i4Myz;q6L*r7HZ zpk5{69;=0Z5|oaf(yUw7CYeJvO^JJfYUqF*Ax_`DD*g zoJo3g-;lRs44qsoO}a>bn`jd4Z-D~q<(FYU28H zEL*=^>y>z<`+NlL!fVL$%8WT-LIZMtZ^WAGWaHTW-2~oUDC-}Q%Ygr;g3(jX>Y)y< zt^bdGJk=)Os#z8&ji!y*L_?3+Gj{!z3$j9Z7@do&tiDyHZ90?_AlAD9=WM8gw$~Db zoVOKpqXW^Dv*;>=KkjI{yC|6M1g>jX%Fpa$H>iiV%aH*YIe0B!v&EGh*p>r4VWjcS8VhCIFrDnmn*hpyj?XtDbxLwQI8s9X4~9(B zOmlQ5lYB41FFw6Q6#VQhoVqWec=E#XS+3m#$3iYHgwLcg>0UnKy0!oJ$kjNH@rWVA z96F}mj%0I1P@0`w1F^QrOWblT4+EU;I^Fbmdwr}6|7hLv9^e8_1Vn!awu>E{nqC*$ zo)QuPdR9!LAY6!}Dy*#T>-Jl}I-bEspDAO3u{=X@l43IZ>YOy)I1*tD*Ng%{U~ix1 zR380Pxm&}Bvku{0&|7@qD}c1wpUum|(sq-6fMm@nAfr_Z68=d>JEvDVPlPIL>3U4l zpD$;@*I}lAo<)iC^y%)F+>M@BhFY^G@aze-lvPIj>b<9IY&jeI9GXn|l(^&6Fk(Zu z7odXZb=pOH>ctot&YBD+$J;1YmG~fyLt@#WX*MzF%}lg7>jk`}HN+ky>7P|CjvDW4 zS^>CDSPZXpphG{~6HoVyS!GYIN>K=FkPxA5sZzX*t0;Pu)Od_wW2fAtcXvMPfOy}s zEM_3F)FrSxaQg}|NLnT^jaKLGEh=vC+g_r zJ*j7O@7lG2p|E8eQTUoDypj=%^Y;YhUm<=y6QqJ!xgT)4 zm+FvO^#U{}M?rvtqg-r(^4;yic?Rg)0wLoqE@3hLY^xBPC}X>_fA$MW}6>=2xlA?l=69E?0 zp)wGMo74zBen5$#{X|1)$6(k43HEMXQD{eSSOnF3i3!(*^w;~zq`P7H#=#_adtDat za4#-jTWwOLFga;9v(BTB@d&xD4yLLreA#t(6_vLNTMZFqfgikrw)sB!VHorTeNYy~ zFu!NQ-V@1|b_^E%Z^%)$;yTZtW@_KGbq4fm_JvA_Gtd#0iu4j-b5^o>!zV7+auixN zUWi<(+O_Y+ZJyB2;p?Yb_Q>oqUMqy`F~-X%Qn+?0CJ+uQF>Y79K-`vYQIwVXlzdhA z(*73)!Q&opZ&q=r86oKO@yw>oiI7#g?|Qwu@4^pl7Zkd8;m;~FQ{1HW;8ULa>br%* zg^}`CV)=L_TL+586^+FP+kL-@+J~N#^y!wntiRm*1xnp>*2(&joZZax11e88Fv)!& z=1N0b=;!Q^ptYBX20h_VH`r$&=7fh138(Y1iz%x9#;DUr zO=iErKe}vxgHVmi87apUVA#4p`AMvOsp|V3e7O@@TJN=BH|`~W;yK}$vinYJ#+m&A zue?65DDKKMTboz^X}G3Xc@nbuOY2&P6|!*V!Tye}z4j|hitw7sPeOMD85V+LPZgtB z4o0>pa_%|HxU;eKHL5cS{ZGAlBqM}X&@4)Y!`J70dkC*RT4*D*wzi-X=&j-Mk3W-4 zq{ZpKeKEl#iNWvV3gyj|Ymz?whP=aDzs7HaZ;5FhDf~qeQNDkq3`nsJSj)-II0?~P z`n0!F!bs5_u^2T=@4>fWn|CEw4tAv5 zW5;eEvJZR5>s{F^+Tp@4s*%#88&|G1B6Zm}2~p=W#3*qMI&jj~u3Q}Y-XO=c5OPxE zP(;q}C%(IQocDVL`_5he;GQ*u>zDjoWg+8y3{sauF;W`7cuO-HwD~P6?8O&KeyLbh zs_iiuUE{i;jKjt?Gl$EgZIP9{okG+r5Sx@DSMzp?rk%jqk_Q(tKHH}s+xtbnM1kT3onhBh0jYztXuT;R;820(NgaWSla8mebTSM4Twpu`2LmA|1 znpzls%i1y4!0s#jtEb%Y>R%cuJ9Nc=y2FMj_K<_Okij7t+jvJ7vE)@LOFQy00#Ze8=Z>6#3=h^!4ra95e7q z(T{rOu}5UkKVql~Q zc@aQ5q%$n0ScsI7R-+&g!hLuNxgRtvyefHq}_rKm36g;Z!fQu zypc}JorqGgv|nkiSJ^ve256sk2HWfBO;Lu3jxI zbP=W#E!`6QLS>>!ymI*GkF}3(of%9@3B3FbcRk zhR2xsR_2E~S!-;dWa`5$oug*8)4Icap&|vv{rIn zZZ|;b3u~!f{-``L{RnP>ONk7E%xunz4O$cT<0sfS9u&U{vB`B{PgFwSs&?} zvv@1quY#|>{yaK@yOoXv0<_G`okz`j$*N3Jy?wuL;-weoV(L!ae4heV@*`m{qQa|x zYT*3dl`^u`$}-i$*tF5vvSgM-liP3+4W#O?Xcn&kJ2l=CvZ3ZNRuLF0iFp_Fc=Y~D z&Xq6z%bjUM>MQphMIU5HS5zId^1rtAE%PgEAb*Hw$*BLeL~fkaab4ol8|RJzv5u6u zho?~tlMYeNX9mNCKkRg6?yb-zGcQ#sms10KbvsPD?yZnb^sd>yDG$1DwbIV}+&203 z^9$BozCY$JY7=+w%5J?}0J{0^w_i?jT<5zpbnXuzo~6(WQDJd+_(43IYg8zI9b-_8 z^*!BhefGL$rbfV-()SXPx6T~_*8*96@>~B)!8;E;exm0QMkosY%$Sx1&9E4nl0U5YPTDcgvoiRI|6znX1NG)nOLRj3j~ zD64qdlc)BX@Ug!dzUuKXU|Gl7XX{7@zmmyWcO^_}uhomosoZTJDrehUJ>xxpv7|#c z`kvxzblZN}rRF@tgK~T|n>NNFCO^L%>n-e5TaomYPx4hROgr*r$LnEtI2lV;%=z(Ee9sZeJB(T zTpuu*z5d+BvvzoI!qk%@$)4%@vLLb)3Gf1$@OzWL^41fhkI%Q}JOGWkM)O`>;?DQk z3;+X1QUA7Z_yvTP_rrI(&%92=X~!49Ior+|pW*h(2V(zx19DW)t5$P}{!wW_sterf zY3qdsApgrdxmP;=0J{-iJ2p`Pay;0^SewPMJ;;YKa7kK`*}zEpb6-x{cOoux}r$% zysDJ*G5g@oGeSh?!@Dn}<|Ui!XJ7EnQ2Hpu$8{}Qd2{J;!MBn^Cz($xbD8(}JST)h z&C=mp4dmBP+b_?U0WWil&GEeM;QOt@!hPb#^i_|JuBggi(~)&E_b!fz_wpiAe-OJw z?t~I`B*fv1%(0IBv(ba~kQ<|J^U1oWq7tB+Mq-uY)dgf2s-ldZx;&s-7Qe{q7OVSVTvxQ?YU^WyF< z(2S=i6RiHK5qG#r&3$1;?NPyCTOtYK`j&NyJ)1CHSMSBoZNe{L+k}gsqaSGK++OC= zrp&ZQ-cE4s_$6Ee`9UNOJFfi*nzpY8D@&qDR!gqwX0OyxD^JbUnHiQ3%!wK5oeykKAqyz$$&R{E_J(2e6b*PTTBGzHt) z)UkXO)rVBym{slP3!;2iXzxiqJDYTYm06X8mk=-=MVD*voUGr$gA11&ur;o`b_W`n z3AVixiCR6y&y}YmouAvOg74j$4(5)|5(T_ZTF@}yJ4~2BN*u8-$qAh>^+@rH~^_~pLdKVy=_g?$$udKccjf!%#e_LBpj@x;^3Zm7EwXkN(Xg~rFqt=rd3 zz%o}hKMdVlpS!MiZS!{MwQ;xR!kM21LWT+58noQXALbteYmVA$IV8xaIPteXVa~Ij z+5|>srFQs+g?NggHedCBmwsq`+ateDOk`3$26Yf=ZR~bj;yUgKopVg=QAo^kyU^q4 zo9NA!s`3kV=SgMcwV2Tt%2$NyvXsC!rJ1HbeB|}rJ0Hlpsw+DC)Tzhi-W&hEJ@#H3 z7B=>zelaRCJ}K@MNPDjqIM+G%ed60*9YdXD%LtBM2U6~P3UCvQ(%LS2FtAi zH5XsA-qH+E1}H~!eNz*vv=3hT)bPFmbz{tSafek{R(HLPgxh-x-|*V08GgRt!h{EE zOHVTgcJxjAx8LFUphw+_twv<1T27(gSM(QistNbPLAZl@Igrc%n8;eZPZ>`A%&=#2 zECGGc#xeARHquel#!OyKbf*5Zujy3dH;-3J`9ja-J*kO@bW;_P`QXP@c~`x56=j$> z#?H8h)}1AGh~|fpQ|rVFV)V!bfju#GorRdY-jejCKw2(jw%3Fh{iXB%#W#L#>80Pi z&EI%wolL&;s<2`A;TDg}lfR<#=-~yKG5XJ?oKEacFw;C92hoqiXpPSxHTTU$f;^7K zggsOgD(+;&CaH7wKUK3Y6twA=gE#PdRN~o^{~6Z zmMsQ_>HmN&R8=gg=~6Y{R$7b2U5KBn=%~-mc9Oo&zM=B_hULa%kCK;dmd5}t*=o!$ z!Pf{A7ogP3ey78sJtZ9g3k2%T7ms0*(hUD`&+RZXrFj zr;VX+xP(vzH!|MZ_!|h}5R~ZD>%Hw zefzY%x4?|ALT`d+k|0ZQB@73*k)!Q(pG1_Ia_u*eYuKR$>~FR+;SP) z~Om4BefHJe4X05At86P+|g3skuyx@n~coV zVO_Xe*F$~f(G8E4+Q$kuUnO2!t3PP;GriYDCA5xdw&zk`SsI42ZL#vg3@`` zwpq?mv-@@5ry-AK$Rx$q^2C*#R6Uf7l)0F1*XS2?@8VN@#To(g*!Vl87;P(#u&0mq zyYz?OuI}V}c&PFKzw(oBif2j$VLzhf7u>XyERQgA6Tc`U1banQ571x0fUDp=}BGlV#?~Ck$bB$Ip zLi|iVT$J6}y~ljqZwLZ;IQL+uhfr_dh1He~yB7&ZTRiMdnpD~tlwMUK)n@Xg6Fzdz zU2ziWkqF*vl5v;7ZIJ^Q*dO1KygF7+d)2p)ELj**>~UIz*|c4?raq zIIpI{CWlSHC#n4aILj-Aa61gyNVb{^U;0_8h{uNE>EJ(2tEj*QecX*5_sM>oXT9xJ zE8WujwP%2q8s&)9^k!KK(ARvi?917Uh8)!WGtWVjJBaypD~Ac^sG<_Po+%Lpk~$A{ zGUkBSmas|C0k*hH)<78&spZ%Va{SSo)!h7jBd~kIr}yIMgTq=6g{GT8su8ss5d~Gv zf_2T0$2!u6uI8ONKYVrUt=8Q=b5UDU9meh-4wpswPQ*RC?1wsWq!ee`@; zHA7OIW^-5x6&dWv-`~Stcciwdq4%2VeAha;{3Ee#{Pi~t;{vbZCAoOgu1*sfjKI-! z*0aTnk3CGQ?X;oS7*lK2ZNO_TAFjN!KM`x16xxt2f)1!!+v{-sWo_rhE63G~wM;T` zCE~qp-P~~LV18U*O-FCd9_Y&$gwEM@DMuS;8-) zppgd^j@2l4t|mmsY@klXiksaJ>%f$_UJ*GS3v{cG1fI$~PSKd&sm!b#F3j(rO`CkX z)hQHTVtqMB-{b!x-@YOX1iRuePm0&|kkOdTbF>i@@f&)RT9U>dL~cLQ#Zle0 zsrcP4L~pOk>l1wB%jvu~+XSxH6_kAb{5d3X6fW1TV$`xZSH?`^YZbNGwhgIe#6Hket7`P!`kFhSDsdB3CXJ!!M;c~!XL zRWYN*Tkq85%2K9d_4;tVqLxR)Hk$BpL{<1^Z*8C9Wmp5F5x72zybn-Kx=6JeO zcX&+%>d^`fM5s;Cc;ERGF|ViaR^X0t_Z{p`;ad!vesxg3EyJY@vVOFuLadDe#9^PO zL>40YK{woHRNJw6oAAn_V`ZcrU0C9#TF(O7)cDk0`eMCsT#hW%$uB)B4XVyqV8XfE43_pzQU*+F-mf9BDglh@CT!JJrMK>55=*#he;;~|6|!yVLRnxGSL z>$HnBeiN!@qa3O`2{KY-d}n>@K^Hul9|8<$guNW>Qu8)4LUs&V*JXMI3=*FEY<7os z5!xdw4yKDeO{CqPNc!}IywrzIfpI`PF3rNi0alEZ}U?=^$uuv;>R5r3I{C9gc_WNltcZlq9uuXp@)cNA~E z`t9YX^$tA?y4i8{Or-pw$HrKIeWU;prq zMurvzhdsvp?EO;*e7J(;rsmD}Iy5JT7|$`e^o3PYJlNhW;(d?J(1xNS({SkF&5KKx zIh$myu9ZkI(*X6(v4%xj7J#B$d@9RTV~%f}v&%l(cMFnfqys6Y6G)uHSrq&ht|JvL ztOOpWRa1O*1bRvJXV&1qy*VAftKGr@!K*~G)$J$dVInrd_8`%kWF2{_z4pHccXRo6 zZdo2L0Vch*7pPr)`qxk3(z|89RoPD|_F?v@F<`_pJIpMpf(LG9+OOL01zl|gts1>m zIM=h2VB?B=GSy4zV1e%&y(ZCt)w(br_BjcMFRgUA2dW(Z4V&q!;@>RJ@`wiD9#GOj zAFg?Y1b+ZYTeVt=y^#EP*zxIp(tC8n;= zNPHK#AGNoKvl>#YUGmvmurF}q`>HrBC^@zsmZ)|q%bUR za+DggBf1sl`0I+&@9Y3VUeHf?yeM91HqqL7owIsZh9Pb1e)t~X+CYbx27I}kodz}E{q^PlVGNMyT=CfzKCi1=a;JFdUha(-&wx2X&kCtgcXC`r>Ybz4sc zx1aMu{asp|a>6>i3dbZ;JZCMeHk_^`Q?$_7qQ4hY6<23?Bnd(oNP00@+_%1Ve=F zdWGvcEqrZL1=&e^ME^YQqNJdBl*6a(YE`QdFW`!WI~i*?f%LU7+|pSngT z1d)IPF;>Zmy*=o|O2q{Y9Bxkv^rw7k)bFMEfn=^NxLEm8U4wT z9O2Q$ggsi+RP}AEVX%H;{*h%4C1FiORR0Y4<%@S5lOR@|2{rvX$&InvVgXZZGC680 z9jx#P=^$LS~)V;{ZF zIvMdu%r|`EndrHP!ysdba;3!`&av z&kCmCm*Hb^T{deeY&)5mFm{>!5Rw4edJ^}c!C6cWCmHg?qnQJTFBJhQUdwO?|oSdUY49+D63$wH7dc8S&7RS1R7O~LK^ zyznp8v(u|hK^@m&wNBgf<0HqW&e*3Es_a}35;F#r_`Pja|LDZ4kwXaA9?euLHe$`Y z-N;(ZH}?ys6&AH=2xLSdj!l>Ffqah_wim5Fzvf4nCYcz;2VAA({LcthfH7jk_0i(M zPrN-aDna4f=-l>{pgeI_&r^{3^I!QAm9Kpk-BrB(=LqqAw@01oy^2LD8>U3Z=~hOy zG#+-z6wq`Qi|FF_d=YOBSZtX5Wc|r|ujNE2kyd zk~{P;Z`MKxn4$t;_I5L_>IdI&`-PMF+NYk^7dS7uXG7tc8PeWP!yDU$31p=o{G6&z zLibBq_%g}aiSYjjw(LDx#CXVA0yeu zVT4CAiK6}3%RZ-?e5C1%_M?`ZB}y$soeARNZ$;wKB+z?a-oo><*bZ~Qd=r|^`q@DD zGOhT}aib~(KExwuy~8AaD&^5N>p=PU$|~p&qm#o}t%loSmm>?s{b?(no8WL^aj+yUKr!Aeay;?WWz+P>10A$@&yt_Z^X`-;h)ck!JR~od`@c;~ zbw-zx-??l+C!+3oJb@9?53+QG_2%2exi;@<-S5+7-9|jU zXDPqUCVyq+&ATUXMNkF({BR@VR`+Xv-^9!$y_&Nd@6?n7r+D8(KR<)BB574TX!vO7 zyNjEmBzA>w!08sG9gS$-d|%@jxy+L|q(_#~+zWx1m3&bi%QU4ors=~xBkAjTC=nU* zUeoAhnkm)w38LKZ2rcm`q-h?cQo%d->C8PMEe5nf zU`eD`<3*eh+|*SFc3t>-3sWlZJxS(t9x1~ShnqfpIg?BJ6wCm@<<@HVSc#d{;-o!| z=+bTC2N46w2V{H|6|1GlY!@!6zzdQ0>>p&YObga_-WPl1wT4oC*&js3=d)`CSlvc7 zn*OZyC5&Ahyq_Gp!y*iDUoRJ0oSmmG>c{EUhvU^1aoY?(kK6};{x)8Clu?uhWoZ@b z)!bO1QEZOwDpcxl#j`LuF@ z_&Nzh)!v9E+5hV9nwY|j220$WezxZnW`VfQoG*AorX!4y0K`P0ohL6xwK6OGfI&Y= zfpI9no`cQz=k42?B~RkN5GbQ<3D>!k^TXpJaEv4P0%Y)QXtRs#3qH zK2V(fQMR~{G`OLBEt$Spngi5n9Xg&+v{p;mpF%fAvv=Q8p8I5fd?lHlCn&|tk$>;* zjwa*pl;fw+-KbR&BWZODL-3FJ#-hMq+n3!(l%}&J0s$u0f^33onLXkm!_%3orOdjq zJr9+vbr`6epc}3z_!R}w+Wui6zq6hhdQ^+HOY+&6E0%Ll`tD>YD0B zb~AGdqBpEAhx=l3gu|q46y}JR^5{9i*EXM8sS65N`U-+r#J z-DnlnJBH1bq5xLK8m20;aw0xs^x>zrx7K{IsJz#j*>Vc(+65oL!+8YDIbT`l97}WW zx{j0t3Vm0(k+l5d&C-bX(dupTZDJSuEYV~2WSoK^i{#~-J;DZB{JTK!3EuE0?;@iI zRMPg}v&mbOA2%pk)G219c2V`eBE&}u+kWO>qCeT_1zD2hxDRV6VZ%JytLGD&q1SP* z`Fn8DL=}9ldLtD-FATeQtjwaCdT&;~V0mW35rDITz^(v6bd(gFR+RINtm-FGQ>zVu z%3l=7l+6{EBx^#{pp4JAlR}m-k#4L!>hP$#@nt&eapQM?N-va;x zeCdnya1!-c@AtI>@)A5cPQoSQAoRz#$RwFRiKWF;qZGR|R6b%UF+d;`IB4w1-#e1g z$KeXUj`H%aQ|yz&5Jo`!a^qi3;pXe(=d#H)hZ(e)^+V&gL1rKAE?Np$#-e;b^vpc4 zRmuZSJECu9u6!hWoJ9AnHJp@T%p5^BU2}TJPac;BGMN_|)4RqaQQHYrzac`FM)5u= zSm`~AR37_CZTAAbZ}5!CO2N%Y%=SG?u*2XqSiG*@X-^|yz~bcVv$K?#LchQZF9ygE zD?VSNgFfEf#3Bt1PIldX76lNB1^d{hA@6)Wv@7z4-f#mP+^Ywhcf1hud6^F01K{7t z_`U6^$V9)2(hsOou-b2@%4y%vwB5y+(gAhcEVI3Q1HeW#5Pa^N z^@$42J}7Cx8>?!1C$_oLgkP5|z(p)~BQ-vq7TS`sEARVU}wz6ekdR+B|)dLz8XS6Vt-Umtv1!k{FMBYVY# zo*)KkLQWU$^8&0HJ^oG`=!`ISbjHj9P?l(tV0R?>*hK)9fb+Ejx0RXy^UG>$LI`pt zg5OT#<4C;+6t#c7TPsN>xVB@UTBdH=x;wQXukOSXQnyPy$uimHsAv*e-?nhfB-=A z#Yf?cwx{}=5gtH1QA>CIm^}T6BoZ=RrbkaVY4`UnS-!YZhDg)T|@DLL8`170jA<$|vC!wQ9hnJ*Rwg za6>pZELe@md{^^X^2ZSy+P>6xak(hEY*1g>QWm1x{dkBbUSo~=mRz8XQjkPT3URx> z!nfhxJ~HrbUz+=RXur^JG5O2W=xM&2j6Sl@(-Tv03H349L$z}_YwMJa*EIsna?B+y%epc+h~fXsqe~gk$fA> zYbB$~bob4Eh2_XDTA%P}sed?AbS92G??t)rtIpt@QNED`9HkvNELXrbK2O1|+;ANH zu0G78^=c<0yIf(JKz2u5JONIPqu9;b>w?(iM~RdrCB(ob|{+?aP8l z8Wm-ldO2h}ISvITt%3`%L)%E6j4p9t@ufVQR%7^Bu{m%?$=9!D0VaMmvoEo%yx~q4 zO&vYeo3p(+kdUS{S0i7xoRd}{+_I7{O`GQX zyKZ{;<9gOkjVH2ft8e`Lv;z=oudmJl=na%0yj(mH5d$#c-1@FtI3_$KxE(AWAsm4T zzp?4B+pMG=fR(mdYzGxVw>{Ux5R?{~0_Eh5*V-iuy`e4`es@o!_zMs_B`D>NENJ0X zS5UO@)3I<;MMecWB_fW3z;oslTNO3U^S9fTm^c=TT@{FJX`tv3wiKT0QJ}fM&GzOL z^R+{8^C^sIt#+yy5u*b?W#KL7Ye(_OpB;yo54`L4h=#pyphCT=FgBGA?l$T&Ip@wS zbLI4&8$><-75_9c*EP=Lz0Nss{VQnpl%;M)OEDd6DOH%xE!0~&k~+Vft+6%(T;!QL zBoJTI4AVQSixnt8bQw1NfbXD+aI0R<6qL z?fMu)A`r&qeXeAJd=J!oVP?%e?iBwve&00?mMhJ>V&gXwS<9WqZm z-O=wGd*g70byBT%Qk@Q4?bCM)wKleIxQ5)yb6xz0H>tbO5RIWR)&|}Q+({hNE&vXc z>>K5T@q2x~&qV;22pG=g%dg4COXMKhdY%@FesO_#HkVi8SPyHUm@ zT^MW<$?sa>Im&Prfg`o);Hjq4c>DK5&I#98lp@0D-C7Z&2Jjy%=|CpKCW zq|XFd>>z5+kyCdnlUNcs1hi;s%)UJQ#2JB6IUXxD`VcQ5)OI?#*tX``EoW;AK)Qby z(EaIJ5qG|`<*C$GaW}WDppqt$ny7LY-aYEKZYooUgWJbVxYBB2-OKiEya{`$I$ zW*7CK5&)_1u4VclI6kYsg76fSh0O)`P)t-v7ei@obcYC}pT3Sbf~0KIu+dk3qk>Kb z?op_pu7V9qd$`;wKbP~}x$G%@4y!~3sw?AGT1r;(X0W#RZ%0}5j>_c25e?+-m)z*D8?bIq$*+nE?)MQ$2XIeGLmZuR3=7927}CHg)9B(P#Pka*+4-OIO+o>|R?S8n zhEpXGJD>{{8dp=6nc2y2!*}O2V?^BStUDaAwn_Q1@gyTjU9~y6ub!>_*oJCp1(;_* zOpD^L24?cVXCOF6-fXn;Sbbx&k9c2ro*hJNV^bwh`smj~G{h`wKBF>3$5Bx{&CtjS zx!#vHopw@{In)((>x%1?L0oYD!C%PyyT-0?odAW?1(*YS;66t#O`h1m4OnMWa{R*T~T z%1NUlby_LMA8*T4Lo0f9#!WMv7vZl_K2 zJo(_NX6`Tw-9JasyWx+@;nco`L_sZ@Ig%ocq@Eg7s6`njZJx#p&jR9+=>5{SH|8si zYy1*2a3^0}x;BORV@3BO0-@w5CkSy2mY zetOXE_WeA>al!|2jt-P~%fhjnw}ZO=NbV{D8-_Wctx$j^K8 z<{cE`e=Rl_5phq^3JPymIu!qKBt(8dGFq~~bV+q5VK5l5xxpBl^kCYDR3lnIA&_Vi zviML9_4c`d1!V=nKE3!k%+6Hd7mr%t?>~IqCmMNV0R(4bA0P}YLloPI^P9QD55G+G zJ79YB*@W)r?vbo*#HNP{oh^vM{&?nn5TzuY|4RPPLS3ywtW&ug%`L1+@TLF>h3FOjZj_oSwuJJOx!d0Jc*w{!qV22iE zGVF|1ei;t?_QJl`u&GMk*4Fb%k30?wKvz@ys*kF6s#i4 za1Uy9JQT;RCKKL!jat60+XU851~ zH?#4&rBzP1jy5{r8f(FlkZie-D8q6r?icb7n`QP(au%}^~PaZkw)R# zKbq&ijTPmSl-Xw&IY{*w_KJ8E!9}qPgVqPPup^mEqR{5QU-G}BWKuag%1B>P}ww-#kOtOC@Nta}fOx=ATsq$&|R0Krmauo?=uIIYk{++culfUq8bR{lGN+FKX zi0NYR;lM+w3D9G%xFLK88K3S7I;M9X&uYRVOQ48Zy=Xlqd~|2_Nh3#9a|FL&AJ+bO z$94xtB~OZYk;5OGssL4*glIVCp$*%@k1Zf*^@Z#0s?EQE=aUnc_K(Qya1p`hRp#yT z8KLH!mOl^wA;k=tyYdAVZv57T_0V1OE4gshBM zNV-BvZ-se0zm@bM7X~Qn`dl&~DnAowMeV}M4N4<~0GyM4kr&Alh6Zk0s5}Cg0Tg#6 zIM5e3-nPF7Azq&VR5e^#q;1h4su*T<|KY-c-tqA)U=ZlT1O)qM1qKa*RsQ0jC+wE! zz@UxA!+wRoU&c+oO955ik?@E)o8TLRPABE9Vp+}2Hxk!&P~@B)+O`m7vk7#E(6j|y zcQ9ZBx`Q@NI{6MJFLK8rx9vO!=q@k+iRP{|ZbGHn#?T z?>4{sJB9udfLOS8&3O7sF{=vqMS(71&76W!UDMEcQRmQAEIG-3JC5obz9T4$;<9dr zAe8Fs2Q|-b?o_U`8|Cgs@e&aa8E^GBTVZrzdtwjr>eSZw+)&)|5C@0~EWX~UsuZG6 zkNv2*^_V`d+|q;7Vwbo}`jVMPkRuGxG;P3woVnrz#%hm3TDo(Vt{y_$=Qi_Es%zTM z=t3P_&8sdShRoWWAzt}A__0Ca<{QpluZEJ#6J`gToC;%xR92ACI^TKol{HWx(=!(- zcGq03CT-*-4c>!;3=A68vz}BtIEM85B*N`ZCkqVOG^rK=M?Yk`Noy>q z@5C=kdhJY(M4j9iy-Tom2qz{$LX5qUM&hTE^X}at+b|W1SI7fN<&%KNX zMPmN00$@EUE+&K(F~Ga>_pn1D5Y+d!x%mMr8bI!2MBWa45U74jL*VE;CiiFkXII}x zDZ;h4C!4*Zz0A@rUOQAcu|w_2s7&9<8y5YHNO(!VCFunaw$Jf+nzgD#4!fRwi!T-X z<~Y^ZBDyjOCqoK&A{ZO>!diye(N<`QC4-Bdhn=`cEXj3a_zx-aZS~<{6DcKX$I1Re z>Ehc4x!j*;SV7Bn*>yuDxi8y*vnvWpyiQ&O1dgN8_-Wg9KKZJ`pKhz z_mjkfs4$Uj^q-#ff#kKJQmlit6_g?7@`qKB=Mn0_t3|S#<_u3hp33^cBtggtm6dvQ z)Y}lQZZbKa*H))`TLn6N!3au#5;Rlrv-S{)&=0JpyR^Cm<}&Ry&UOcIODPJ44Y1=> zq%Q9pYyGjYx#tsPZ5S0Ot%lk^3))~(=sGKTJ|${Uvob1=U6*ViPnJjnKhc#z4KnsL zS0lh^WM|^0EZ%E6uFjN}8=xp``y>XVxo_Yex%KK!^;T2LY%X!&Z`*QUUrVBa-t}zBp8zW2MA*Lk6KbrptPtMk@ zTn`Efa&SIru`bB;vzL)+_WM0p>+p?hrN@1VurJ}#>GV5O&^9si0&)Gkty0%6p^+VP zmHZq4J4lEXeZ7S444s)1k`GAgd_vR#D2-&1rGkP45;6N|`h!rD?2#?K-N1Oh5}V`j z*+a%BzM@Gkzf3YYt-NV$5P84&m0ud~0CMc_mq$>BkhI4i1-mlLd^@i(YYE>oztviG zuZp8`c(R3Ba|XV7P>^~Pv5N^AN9WiKW4H3a%7U8-p;0hE&r{GWMF_z|7}B4-y6;~VD!*l4&Ru}?D!aC66TLfY^ zFdigARXINMj=ypdvx!x{lu_y7l7}A({ZG5plu*`yQIS3-WdYY3JaGpCT*=>utJ8!s z2Z^=<$Bht>;cq<7a{x+3cDt#OlATQ+SQ!o1#frwQH1=$LegE|(^Xd?D;6$`RA-T3T z18u-+|M&o?81^+n_!*3@eZpOD%bLG946#iEI8{q&W($%Pu)0jAY&}+So6P>FbT#tx zlZ9;ZistB(K4(ojh1}R*Fk&qJ8Gluy(HUe#!v*xyH>hKx9nJw*b! zn~Qy3h5P9zKjN`#KTr*2wUfSA0m({1!0li5U>VWb(dn5Uv55?3_A>A3s%oN2zVvX8 zXNhD|tFyxE<0a;_Etq|o?t=2}DJK7!*um})Kw@<72L!EdO>2^&-U zx;I$ZriHpISVSv(DfIB?{eytN$l9tmw%ac3td*RrxA=!@sLAU{8c04Ey|mqL{+woM zyKOqh#ef*`HGN_BGj&Yh+=`bXXGZWsX(X*H=SO4ywRjeQIX5Kw4S8=C=9kH5aW9Ut4ZIJOoH4+E7ST>`^@Z{*{;l_eD;m->Cre9`q6 z6T>mPTpxT{Rhmk}MAjd%i+6PY0W=RccFgjkFp)}H{lM`FY#^yLuZ1Y3TNCe#S<Sar*6*gb|-We z7m+hw4iW@8!p`q6Rfv%H_7R+!m6P}Cfv@hxiZo1NoU*0uOR;OjUqSEk#M+Nh1Yz#s z@58VAK<7yIRG$*`Di;%R?De@X&3Iu;^{ZdDe0K2}wW9Df+EyR3qpX=3tC@;atMd0j zx6T$NNEQJ@w|xuBCFD6jr(s?zQ(F7AgUQ)Xh|j@7^LV9w!g#gH_wn+|_kC%v;;U87 zT=-%tD~!Tzhg!ng@BfXsSxC;ikl9N==s(!{y(?K1Or$dg;}2^$SNvlkN7~_f2MlKW z`}$Kg*-RyWUqx!Z=SFkw-v@sq+ZrXgp^X#T^d3Jp|4LQrn3CWSLn}aIR+BE~$_vQn zq!N3fa#6MSO+?5Sa)e#m6WBXca52M2^UgIJ?~Y%GS4&BG*0kN_%b#>9lL|`O-<&_m zS?F#%C3wBRB6!Zg5K^KN9JIiEGhNV}?oC`Ue?J$=uOYm5$&H(o{qG_!7CJ-O+G7z^ zF2F7^Pw1%@vM~7V$VBmNkEyHUklwFc_lxiupud9y%%7Nq4TF0{MFp$c2+|9yXxTg| z(a}*n-)h$BPj12Si{ZRR``-`A96{2^COooaUnbxA1s%G7A{7&Yzu+h zfxe|Tt*66h=e<#Yyz|Z@@EU-hYlR0Bu0U&0xqPOGpLm7knGFMW>}mS5bI9};x=!!Afl zr2#t9jU)(_S*v1b62gaThKabKAfZhD=ZOtk3Izy^eg}#VxmpqSTy1SFQiKp)tFcx| ze%+I=6)hk=KmGm!J@^Ef(gV64puv|>_UVd1Uhv5y9bxgdu)^>g8x&OftUzEB@lDN; z2zbVuODxZf;@c-6g#gk%A!J7~pY&WSn=Y*b{nA9lMcqWo z`B|C8k(zRTi(K4}i1qVrIXmcf{iSyPAMu6H{SCOpiL{_o4-+Xjr!tF&-A2+u4B!hd z;NHG%`Pa|4A3>qpZD_&#t=hB!HyqrU4ep@&`9kc`@XOOcliFkIzbeg~B){s_XdJNt z|IM4|y$t!z`Z1j*rTU7=Z#zE+#N<2kNB4DVwb%F1@te2qq-?~J^5wjh9O_mKQ|OoK zj+dnaOsWzO5R-c^s>gUsaP|@@l?y$@0B834{C@Q@FcfUbSHcjH{0CV9*rK+P&vGMu z;LgvbEjylo_x0b=6F9&cuz=eU+!;+#@pUJ}YXX$fA9_b)ALr-+u2pbvHD(T;x1~Wb zy!Q$*V`O?iHv?Erbkg8$+-eFA_F-R_Vo|mT5E@INx&rP5a5-?G_Q_hgJ$S~yr-}xK zj@}hG+@a~3I5@qI=>#P@6f4v&dDSv9s*W>nRffy7bon-O^ruZn^^XsC zAL~c~@iO>K@y!^qCNYdSew(k1I&^v1Mu*)Urw3{Vk?2o?Bvm8j=4A z^N*I_^byE1a3eGcla;VKKn9*=9yAs)ut=02p*7tdHt;lb#ri?%1=PzXZYAHuhqc`FdZezxAp8gbf_{vv_C#of^tb zpQiIr01}_OE&TTlpYsAF$!*htP@KgG=s7}R0O%#InIWA2q%vBaY+jMfSJWL9N9*2u z|HQklDcn_=t=nS>1IZsxD~tEq*!*vb3@%J&pXMgvD>%(^NMOL$)UBK3O*p4TEij1n zb&#uv-0q?YVz6Jv*-dfQz{CU9emL=-s>#9DjzNiLv`WQMqn`mqgg|_L-;yw%#Nulu z+1=Y3aISS4hW;P=;bYT4Wny9iEY{mG;Q}uoSymjD(71WZcU_Dk0ji3UvX<3srL~Oh zwe^wZYI|8>^3Mtcxj*VjdkOMeT+(@(LVW&6ysl<%>2n5HiHq~*@hg6L3fOi@0feLg zgHc7u z^y)wcxqJpgr4_H@^s?(p&F>>)&`f+d#)diehA9hx%>gNkK7Hes1vOrO0y5_R zF^V18yqt5M>G%KYSquZ4(TLB+2-Q15D~og#b460jUfZ%JO~m?7(YQOuXv95_WOPyQ zO(!>a`d(I-D4WJ6bTx-WANVO(B^KidYZQ+8)9XhMYp z#{^x}Nb|yV6{}dMS94^#3w2k zKz)u%&Qlmd9x~Sg0VKYzq;AT84wpJen0|x<;Kcu~TwNx76Wc~#^y&@AhrUP4$CBPc z|19g2s2fEHpwQ>cdEjct-OxLvcNd`bTC+e#-sRyb)uEv&6Pe=$FinI5wVY$y_F8}I zmeepAGXwosMC6a==x4k$p4h&6)_Hh~%%JR8UFD!4;malgwAX8kBU8eFNrM8F$j;(u zaBK{eK42Fp9s_BC*gB_CaC3@fHykmj!r^nu(({D-z69@{ijxqNuFtLk3F;$TJ9L}v zfnR*7a^!lS0bo;<+s zKtw+sFxv4Z^(LYO|64J}-6?88+;GHPyFF-28Sp{MXlP)hR0S}CyJn}|{*EMJpD-d` zX1k?=Oj?VX=hb}Y-9`c1+bZLZt*cW;Fm*u>eOUZ^o%tx}KsX?{grEgvDmQnxQ~1QE zza&m8_%u-NI#qtkm;kPnP88fnHkNlX#FyXoQD3{`lk#1Cjt!+If>yh zWOw;Y=MWG2Od|)&iVco2|MO(x2x)L+;+&5_BXOWc>qo=F&RCY+&|gW~$WxYW112pW zgy@0_;{nOL7Yuar8ydys9+!0*0aFRpK>Egd2r2BtZrs!L(B@UWKEYh-HN;FY@?xMd zbA3}iH&9SnYC?Oh^fIf|%l#E3sQ)dbulOvhEXlSj>NL}6(>{yeJ0zs~v90V9_m{7y zY^TJkb0uhelXgZI!D!UD5rbEpF>JnvU|FmkWer@0g;wHGNC6IK%5VD#Ty~EW7`?3v z>@9EZu0N6aE!2VAmL@Q+e=QtbP9IJxu*Uq+rTp*jU!cbJT}jbDnZQi{zmLWU9~U>5 zCSba`px5|~e*G-~xcuvNt+>Z$Bx{)u0KttQ@fAr3^_2MdYb$AclU6V+1K%`WDGxaj zOQED=?gBJl$<=-ZEUq)B zO3nQ$8PwR=P5Ms-97|Rr@S}Vio~N*i9{WIs`5R%vR)PV(VsM|ALSlN*aZg8C3Hl&9 zXMjB2(Bqari_;je#uh1y$xjUe%3%YY0gDTkIQuHpRGJQoTkyA7yGK$rOjnU60Vx`H z*f5E!^#2}1r77_Ej6ad&w1kn+K4f>*`4LibXyE;Sum1BU2V25g(%`!+N^=cvD>}a`@H9Kc~6A2d>Q1HJ!jDN z#6;vPz6q0aTbySO6}wC%G(C!;=D5|JQHCl^e!;Pq6$G)!{u?VJUnv| zgq}Itrczuy>a;?o__DK9n>sycqX-G3)DWS~`}RnuSI_KpyD9O4DsPxlFW2p7p^G;< z7pnG8EXcpV6C-g*Z!9RXSR)-3>5i+qKbm(c)%&`>+W-3R7YE)uUPt)c*qFcwbfOQr zzPjx047p`0&XREO-!}=od+ZaA<|iJ#3&B5Dhk+I!xTq_;P=0JEhY02N8yYiz-JSUF?3t}m);F0~Q`(=e>jd-2`}L|A zbIbd!#&#C>kc-^cIVm6q#Ds6ok3!0{vo(-Tdu{3-#*k> zB+hR3@72N(LKbnup0@tcBl6Aj(;aH?@EqubEaIKc_y4Xa-1g$2tj#^d6MAT5WP}3I z5|A_P*@GI_Nzt?ae!TF<#4Md%&rFA3H-zWee!tt&Q~sXP^l`Uyeqk6_Xr;y%VR!pk z-O}ggz@^)rl`N;FIbhlBFnJWqwxP~icO%b(Vx}q{c)5oevv;pPY-id?!H)`0e`W`&SQs@DzRB$DXXoz_f!H}93Y6p6 zD6B+M1nsR(Bd^JjMX2L$``QK&!1j^lufO9nV1O2PC#>pPtAGQ6yspj;wHm*d54F+7 z_BkFUmhJ$ru&&6BfW)CzG|~Y)S288endG`6L%a&D*y%wSm~oFfY0PUis|=bV#?I3f zmg#$!!4Gy*e9gp>Pi8&_GGmhNX3f%oR>8$mmcVTuas)n|olNKlqbXNQ!R)>HI$wm- zn&$_p+m7`Z40MVEsM(_b(#6MbG)!tGPWG`AA|m9vT4K_ZmPt&*w`rdf0_ zE=M!4#J%r=8&d@c(EnYmfl*T&A4Ap*ovUkFAQj>Vu1>G9Xv-34C-C@BoeKFD{&;IN zSE*Dx7hYfWvyr%qCXjg4`7=8Sc8mBAo&Thf)#4QcE*%U^yRGyy4Gp_y4XC5d#juokDn#{A5Pv zPu8Hpx9_{xgtdb4IWVbij~^Eexru6rIZ3PSd7nh(XA9|0im!RScmy9xNQW1~xm5yQ zuPZ@PL1*jn7J&|xt}}}Sanftkkvd`G=@L;kK4ww*d428JtX5s?irW` z`M5XjBM@6eI~}!TPssO|9J?&#*3y{{>y12QW-PnmvorD=drdV zlTG;g&3}qk10{YPU)+>H`G8sL0}fE@2mDVOvS1rWb+2NV_;48j?SCcf7oQrmQw!>d z&_+-mQG5Trn29@lq-0;|0Le^=3Ke7g7>OCnz+@oZ-* z4AHAn_xcLaN!Cm40hcm%g?hhl{@(_D{8zcN9bDVxn`Un4^W=k~h5J|ci3j9&zHA;WI;KWnzGr~v4g%~EN*BLnm{zxV2|XT0rDhf?JB1WS4R9(Qqiwfcy`_09e?Y`)UC-l5C) z2WQ0rbv45OQ?P+UHfv`^!hJrYo*9(v;{OYO!tJlY@Ebxbby-bs4u7^+G?{&D2LIm! z`^dysia_&@Nd0HHtI3^nf}mx6`LVR<+ZXQ&JMWH z9>OqMz}tEwK`F9&50Na_-qf=Om|Uy)&JC|(($i*_$-#i`i-Ic(SOcCPmB%Y}_8WA( z&tsCN-|CS;b+d{%gSD3*VilufZroSx0R-yDp=3`~z^qGkBMAu>;+P3~;%$9B7*y<; z$Ry@CJYZJ|x$QLo3do8y;?L%_SIKRqK=r=?;!$`x<)<5zBXCQb z<1jCUQK)XDtlb9UKb7eJ!hv=1P1H!#hNXJ-1XO``9KC{fzUuY@<=P`yPSaHK?M~&Tqc8*7hP5<3R|1<~``Q2Gcw%>W@z}PDEQnlc@o^=+5 zi`v~PuaqodNG;{ErkV6ciFjbSsCay|;B5_NfE20p-Cj@74`hDxn$!Kve7dLCZyhHXrlk!uk_dhuS0O;B_;K$uJEkrLO-OegF4&{m(r7-#>nQ zO40uT2sODKDI78M?$5i03Z%v&t@L>l#r$gb^HSyY&_H(&x>!>Ai6LVrx7}Gl3v;CJ zKew#n-Ag4=nsX#@CHUD8>NSnd8!e@{E*FX6fQqT~_LN@m$V)3DkHZD4r(9DKHKp)B zs_C~E)LS|}2dM3>#MJVPQ9x?fk3NzWdxh$^m#gP(${=0ntf4=5_ zmNxKOh@DF3s1O;l3GGWPJ0zG3WLSrHCOb}WO1t|`TCwS8%A=ijBW0-FRLarQ9J5`y zUyC>XILiVbI`_hWtG!9P@|nVEY(1M>ys?5bYA}6u>rXPddvB0a;I`PaE86TcKCU?@ z*B<3k%(Mm-Ln^Q4Ga~)F!W?Qm;~6yG_%bt(R%Wdf#Efo?Z=!S+KkSA=X12NF{~ylY zJu1nxZ6BUCGuAwrZKkv`sjO_PIcDy08k?*vEv?9LL)s*zCMhZ@yJ>8+w4|~mMP$m# z+>$YAh(H^W5`j`lO@UGoMFjzojey_X^S~4h5~AhPh+ZVZk<4=&W8AFHmn@j9dgKc^;%7T*aO1pa%?{r z9~(t+jw6Jo>5*DXn+#=UlezX7_$bEl`X-uY0}$s1`Z z#N->p`iYpT@jsm2IK0aD-jr#|4FH(FupbM-*W~I=xJfSA^mb)!uu2NdTAw}^Z~sVr zaG;EnUpFj$Q|aZqo7`!odNp_L&lPod+Wt%)PTL9ydublgKm4t7^j~{_{#I4_Z*_k; z-v`|ao;rLxd0UY^X0EHY9KE&f&E^`n;HhESvD|=b56#2#pB*wB89xy+t_mRLdDEVd zyU#~=j+AwJjvQVweY_HcyQ)4kJ~EmF`4cb!?EBw9#Q&9c`hWgw=byh{IEblcm!2im zKg?GCd^|VuPvsxef8Yb2I6e!&TfeqbovmP?uLYFd$xps&s=NbLW#$s^3> zH3ZFhkk352b=Rs0!h!{Jw)(Iikk@1lKVG`MW_y0i(Yf|}TDg@pQwMq#_mN(GdGRq& zn(2}GJjrw9-rqN(ERUKd-o2O%*h}15(eR|UwzN4EH~R(uwN+WN>-DLKP)OXsn}kJjZ~#KcO}=cJvmyH6p?A0KEF;VRdKT8c zgA(k-9R$`y@($2<^)YeRjWxvyVFai=H>5(}{8vp4S@p{rR^!rVzu@1N>Z^xNpp8q6 z@2qY?Z)^hflp_w0KfMb@f6hy;I8APW_}BZ5uRag63z>4e9`?5Bf9pN}VcEZrT<}}N zLkGAjuKRhPvwp{my{fp27dyZ3o5^)%H($H-iRj_FrSJn$XkyEk9Pih5E$uDAXI4=L zqH0!ex&cJ(zet+DRDjN?vVlLl&#oLB+no$f9- z*!fuXU0{BscU|5}`@(G-b8hbVx#G(C?b*ijqp_h|7j(Z5+*wzrB;jaUHHJ z0ItX&gj5ZEdUnDxxxNC9UJuOY>%MqjU@Hy2wgvn6?)ji{+SZV}-9O^kwkvZ3-+h0k z{vngMcv(Z`|NT(^f3EcZ^SgQ9wBTh}PtuDeE!3}Lx%W8_-n~@&_Z7#WYtaWFsn0HN z=YsO`v19vMbL~4kM{_qs7%N5}ERXQq(_cpL@2PAP1cFxup>G_)YzK|od4raWkTrI_lRT-hiY@AEejEJHn+^-gRU;jq^4q&Nr`=+9s)EpWPu}QO&3P59`Vc02jjV+I znfxc?d2&w8kM;lQV{g2oT9ntes%0XoU$Cxj-8pvhtBU0H-B$;1m)3PZAb_e`(!GNp z?ym1#YCNA{4<58)q`c10+-9hs+-fVAm)F{Lewn_L*I(6XXF6T3AFkMLb*Set?NPd% za}wZknJ4mWH-$Fkw7uQ!b$j3L^_zdc`7~+Cg_Z@oo_~nJJD}wHg0%zdkI#vIDUVxd zKe^zH6u*p-@+`haKZ)3iWWUO3dB-ZewVjz##`7GxORsovvmx=?pKn>QG7jfEoSJ>9 zKWyqbpo776J1hRfQ*Ir=j{Q2ZjlS=%*YJa%>)*fm^M1~nEJ#4}bls;@P502J3Hcp% z=&SxgX^(5!f$c3;syZ&-Wu_k#R+|t01k@uhNv;caNkr;`y1|@!<5fJvxOF6e41!|x z$HXUZ08dii55Sp=rz&qg`R4tNm}SMgEJBxvyA=%i;2oRAU^~YTmqrH3*wkj*y+oVh z{-cl65?bnVT|j;F=d&i)w;eeng<@K7=z-4pdO&F6U{L0mYH#GNj`m|Iz_h=Xvcw>H zFXlglGd)XBJN4B@(VuP7CepW!|1t1~;K2{7g|O_uvetAMSi{3XUhX4y#3|R4_N({E z1Is<{L_Q0PvaBb6>AC6x40tlXkK6H}PQ8h7sO8a~PHE7Y3CF|j`r(bM9ZBj#=12Br zM)zRs>Zom}%d9rfJ1}>B#qJn%Rm~OQO3&hN9*G^^dnSH!Jv1Y>+-6?p{L@R&hz}om zg*NPl+CJ;owuF>+tK+H<%gLcCfI??;_CIjVrPLd@sxE_XxUlr0I}-mcwu_kW!&~_J z(v_tx1*Bcyt)6|AzdW>m9sRX_exA=8=aY7h6X!2RFQN9+KEG(D9@{YdG%ErydV0$* zo{bzn$0ZoIp3Slu+d>;8xb_bX{tFyjufE&Dab8;h4~Qrsoj^2^(YLEwwlK%um#eNl z%BX5C^nPG?=Y;66JGAfY;}gvxC4~VKW&42If8m>D7dP%i$+tckroBHS;O%|lIQivY z2raA`VV=_Zj};$LHBO~W7L~~X>-R9LH*I`26QkcDVf!H+iLg9(~>QFYJ9ULvsdxe)1-5?}J?3&sP4M zf9$UOuoxWNR3rz+K|oh$fs+&U$9GIFWB+EKrr*ORxB$$c1GzG6Lj}li(>mk4FDBQ; z&pUQ~zj+ui?fKefvLWXyxBLyLaNV{$=Wjc4=daD%$cK(+_8;xq^mO0#SV~>@_Y003 z#m;xWAfNo#KDoL~e`kiwnC3lWKjH6ofz~B161x8}_si71#_x#^rAuo|!w7SZxxG9c zc2%w?p~xFktL5p@6?dUx#>wCIjm@Y^056eKfw+Grk_DY^+pln7D%u1&&XivoAz6wk zgy3YPpGZ4e(SGgsj7wW}icTXKBHX-OhhnbTfhRW->2|uIxRi7OIbS4RCQD?E((}SPihfWYcEVw& z!~{kDqve$S&qwK^#0eXiHXDH+{F_j46> zxz}nP7A>c^;b?l;X!Maip%_EuUXbTBiL&~;zoq?W&Q^tZv6pE@h9$5KIj3~!;la<_ zEqsEaRuGtoA7I9|C|$F*0ju|=FV_)zB8`qh)aFAicl0zb&MKDXM`tgi?@sJnVvxB>n|Nf|XS*{Wt`y zp~}hW9mSZ+pIrGR0^eYXL66%U!G(P|il-*rJ6CI(Y$h=SX;k-%X(2GDvG^aBUsY4n z7C-Jzl_DrzbO#Km-3u)DWo0q2tz1H_(HQ10k*^h&*`k=^jEePj=#i2dV_8TE3-=K= zGk`PUXGTTz-aFi>e|)W9e?UJ&ewhQen;AN8lmX)^i+g%R*AT!1e-}BFveMrtW*}ho z&`UV;9Ie=Vj3CNF%F(}zDj02+)nd`rCtzNu)S_+D`~2P9*k!0fh1 zgM4|TSvUbO+K zTwy|5nOyA2M4FPn(T*hKe+)2mE+^WwX3a~<$NQ!t4`&Ha|1h99JgC?~F`dLr9Kq$= zNPMzui`7?GAi6FNg^>_wFYcp|DfvW|#f!OXTcB2SknZd6JL*3Uw|n#Bs(;?BOD}Do z3&L*F;(WB`L-Cp&ZqBjkA0^w8^5c%i^ILNG@#&jC(x%75q8sDlQi>WxX~kdGY6Ap0 zI4yTPxKh%WA7!nhV>3od4$?}d-TQjvgb?#H8e!TV6zWHaKS=>AQSNfK(`bkrBAxHesGAjS}>Ww=giV>G}Wo5np*}NEvXFOpA3E z%~lJMip3SqsVOQnmllvl17P5fC2f5Cy&`we@{m5_qZJ%zBy)_{$5$n<41r)Q`>J2` z^P~!6e`S=v(3Zdw`6UlQTqX_N^62_WV?nvNM_HnX9Ut^^mdJp#E=3=H8FIz624b^F zj8QB_eiLlD~j zg_}OfK@GFjn*>9JPH3|FWKOMdWSm_x5Ck%`*L8&;eQvpI#g{abMAIE2xVJpV zCSqzzTo_`0>d%a6f*!Qy{r1mqb^qs@1tphNIIrg{&ni|-->$z4+q$nZii)T`ka`4~ z)=`urN{8KMttwf6!Oa(?c{^2>d7y4eUXEgR5i+7>x^PP*HwqVfEmEY!cK7x4N_XhI z!0}g)WI~lLg$#Q>k|F+iCjQnWG1uN5rd&FrH0iSbxWz9U-ZAg<;|bvBt&eI;mB6_9 z;lXum_j5xq!%>5N=&7-RVKg-Ql>2iyQ8Q{8#AWOu-P5p;q=}Mvq0(AMKp%7h<2$lt zvRr@>;%0*+cFl$F{rm=4^1_M>rxO)tqxYBa`q~(64MrapuVb~|p(7x7AY}C)?g1zY zW~N{~%Qq~0mr?e(BP&<*< zpdW8P>G0Jf~;#PEXGV zHfzph6(t0CvD`jxb@i7-Dl_{{+;6(i-PP3@MI!rZdo-JPS7hiWQb_~cm%B;#JU*ZnxTMLq}*yd2s*Az@0u@r_AGb{oU0U zuC}1=456+L0l-f;H4xCMvP@ZEKP?LN$yyKI0)80VVfEO^k+O3XQw2G9-UNR#oP>(y z9)oF0>oJl*^(DbcT2(Ip)bmW%8x^d*Mr~xqm^}V{S7)BT=@li5Je%|8`b%WcXB1GI zoPep^xL(Rb%Xp4FE@3Eg=+{D&41w;mK1!syzr64yeoL?Yk;EzW+wsISFo)7d^a ziy~1*2(ImaX3OO?qN**&{KfE)iO=xUrU8j%s$u35c4u1s_&>v905?yNmg(^`D*rvZ zETXMwn_6^1_u(Be37d!dew_X>;Edy>V(_B}w9Kt{R8jKu1Qq^cc@;J*Hq)C*KK$p_J zgrRR9G-!g_H3Kt!Wp=FFMyfw>JMzpW<`6D_c4b(fw9q7&F#v-EbP7>Oh;Rm52)85l z7NzxA*EJHI#MIrImvMih4e zmtPc}dg>@?M!f@@aw`)C6ot`p`<_=xzjHrQG71T$!RCFX;2qlO9CkE_uia4ZF!-!b z>2YG_2}sMXlz0@KdF@<}J3f|K!2*?P@B-YGnM<>TQB4akv-Ei^Jv~fMfSEPnJhnw! z!ebQAD@KH0;TJLB>tQ~Xw*HMn7kT0~{sM*@$jzND+`*HirtzJ{ML)nS9~*w}sT9&q z8R<-vyR>pKS0o2nm6U*N`Y?8!CzPhZ#!J{aD>y`kLW*KF622o zACT$we?7CRv+9UYNZ&z9GnWvQ2=h7zLZE{y_r{ z&iDUd#n2lYy`Iw6oW`YN*J}MsXBG&OXIG>pJ1^S+MOsiUw}qK4JE*lo7t*F5H^+liM{G-IN#Jx8aVR}iO29}pHzO-P)gn235wtpkSF6p02gPkAc#b zkd^GU9Rcd(54H!p%#5kK{+kSYn%`V)iBMz{S10Z|1R3Ca41V6daXiM*yO&ETF&Q5} z{q)dbFtgUB7AbRj+++>s-euX*)YRozA#MxUbO5^OxxHG5a_^Quk4$X9X$PoqyRtpA z0*hgDK|pz9pMU-G1>DA?jLwQl{D>5AN_u$wPb0+(y}1Q^e#71>`Y&zmNi4a9Rw?kP zV97f)37a7|jJq6v>k8asXbrcn&)i9{-w1_Skip(q_VG8tgJTy)K7kff%*h^_Pu-@3 zR&(|TMvnjV`6lDIpQ1-+IXZaO_Kn1u@C$qsvXpPidk37a;5#n?B*>2dqqJ-qH>7VA zxOt6lsMo9rGowe$W$RMM{5?kl0SLtE_PB0yZC1#ixWtpX4fjUh1v4wEhvG7m_gr8Rg@1Ik|~vr9J~;9DQc`Xw-F zMpvxM7`e83&=7#|I9KBWHf|wPjoNn0%n+^*6iP`s4vm&6gypg>Zw_J3E)cD|awg4U zxKjq4ul>zO{t*Lz{ejO%7NG6yX4F6EkXbzD>SZ392MMQwU>}N5X)FxsT9mziXcEFL zGlfI^AadoW_U}N(A_ZgxliIZgqa7jcY%lOBXR5a%Q5O7PnzBq0TNc1-wH$0ooYifI2t>CrvjU1Gr8;OK>XZLTeg%9pQCTzJ-xL zdgVlCWR!R!8s!?~V=f-Amuo79yuc|ZSU%*T-`O3{D=94q3|O}&w;W+PH!|mIWApJ| zr2DVT-#-JaC_((ffdf3Q0aifxfmQ`~l1oSVEOGZ>B4x2plv^Xh zl#54swDZ$@G|o+QGgK^hwV9$>Lr=3sr}|R3*=tR?&&?07nw0O)ls$Cula-ZRTtcwq-X9Hz!|>j+n56DwwHO$(WfnO&8I|NQyQOMPA#@N0>We`%wY5G&k0 z5^l=Hr}g&G@5sFQY!45r#wn%v(XA9Om@Ft4!n%~K_MmKMc8?7qQnk?FDY=iWvScES z!Zb(`Xe}3-Xds5?4xn@pOZ*Sh$EHR4z)hZeky)$LSj4eolcz83KB(-w*?|2tZ(TiZ z$LGoQxxB6-f7EGqU6;Td^HdlF@|2*iEf0Y3<>fHPDY+C9s|N9ns{f2ZBrX4XQdHSf^Fq$*rK@TS>skCpaMZp@x| zM8Re@#*Q=oWS%f*`aH%jU&yNH{3{BK-vI~xvATGZyX1^-JB{;M#H1 zKb!i*OqeTc_<~g{MD&>yIX1cQa$QehhV6Oyu1`C7i*8H+9dWAe_o*qC6DjF8>0VuN=1IGUzQ?ulMI7hXPmsU3p6s?d(;lM2{*FX?QLKU8;>us=%6`sYWou z5C}TiWO#z$ywI$VErnoIOCcB-6X06{Wiy}jYy*D6-f4E=SF}vOYZt&GyYK;8c<59d zGA?SSik)Nk@V2Rh*W7KLea#JJoIV^ld_dEzegqe=j66F@AZz9wfgx6}=sl`X{Bqn? zkhv$+Jf-ebqA32XyJi}*yT7taOmEdxGOU=}h7(Gx-Q7Fe6MyQ?yb1rJj-k?Zdxxc7 zA$8`}aT#pY&KWPT`gkwHnC{j2MC`@vbfKWpJ6{v}w8AQX3tHc$^TKX&M!{1dc+Uu2 z#!2OqE}(a|SkAl+!Dy?MWGQgy4D`(Mc}dGXabRu1*TMD5kT1~Ev!@gH#4*o){H3_c zo#M7!Gg@vaTK~+$CoySDA(>Q@@oV~?x=D3+Pc>=}vKH?C(&X8 z4kL|7VuE&VnjW6-bTr@L0}W;K$YX3QfCbW;&i$qE9aC&%AVAj<26Ywoy>vK$QaViv zsJ1ykMwZGuR-p3n#oBFn%>^Vg!Bb~52-M5hll!n4oh~+{yCFWJ0k|FcE1W2q<(u6+ zAH3)~E-iOvG@Lh&$G!^hC{8Ytgab6c&wXn1y{r!s#PhL0^HW0a;Uj*p0~3=KNQe4V znLdAri$q^Qfk9Mq>L(y`H2l8+G@UBXF-@eZw>d}q|;t% zub#HMGB>5G2^6*1Vlw8Oak0f@3?F1-JjWjP?Ue}{ES=o)Pui1f>$JCU+VPRW9V}Ax zSX7>+mJnh=Yh+zM?NViL%h=49Y7qIdN(P%{b52|W>{g3*t7V$H+Kvcwm;C5a=Ak`;Wuq8+@h77H@HA24Z==0^o(00mDG=RLB80Ay{&z+w0a zmakf#!;8kGhf;bB1@h59CuGw%_T7SSTU}iNw&TU`IyD(DO@PtOq^$P?uSRYmDW=wp ze3#ICIbE`>&3IbbCJ0{}lrJx@$}zUhC?26>;fzyzLT8{zeux>nBF&q=N%!?7LJyh^ z0JD4FbvDTUD`s->_*!;-0Nmm6wONZp4TYy`oMmz8x{ID9M$u~AZGQA(L))j~we8dn z5twhd+raqpbbadU{R-dI5hXef4cy2+oh$J7&t$r~$~poY5$Lz$fv?2dkXmXl)eCp$ z+!!%;^IOClj}nJO%K0h&6!S!2GpTh$XW94e-mS7vL~C4}pfdFy*+3wiU&t^j*eb+k z_Pq}klIq$L!;=%We6*tIQ6&27sq2VK8)qC`+wMo~)54s_m2i+MtQ{UOSn**>-Do8# z+tKJS=n&aBnQ9)mICW|dtxxl>LuuT!NC&XM*eeOgfUdiJQ67ev$E4399-_6U(C`ZK z^c!5h3+tY`U5ghMJryc#_=dpgH7!qP$9Lzx1k_4G*t7?1l^qctKJ@EU+(q63>u4h7 z!>za!exjnEXkAZTLB!khI{B&?3V01Jh2!P%<_uR-RD*(_gE?u#@=YVczn_r?0xB!u z8=RtOnJy%~f;4{6d_15nFz-8N#km7nDcUVw3A-`g$e`=O(|-p7cwG_MP@BVDpFO$$ zEhkvP?30#N<)gGp&x`{8_#~1g43*GUn?|V)c=<76DTyMKYz!8hWW>Tr#(tobqyQbJ z2B?~|2ESkX?fxHh+bgX1@fc&e!)<8p;rwpmT`%G_QPy#)M-bWvr&H%{pRxzN1|%_n zh@MBZPY(?-v6s1yDfr`PI(Z-{+B-DbqVv6VWJjHbDruBc-*GmFFw;ZLlc~BMvoKT* zu>ybFw@xuMGUs`OpJEDTwSL!>L!8Ia@$Ey}?JZvZs%Af;?~}5X@ii?uuV=%Her?_KYg&Ns zMpwQNQ5|=F=r=y^^CunyVD~dtE$w)Dk6#o*r6%_CxWytsIjQ!vOv$_QJdNoz9%y8l z>%&XngL@2>0zmXs$Ra^$a$o@UM{>_!I*(}|PM|;?Zpx#OBCV6-HxRwZHuoF(YJ2LjCF< zqQFRuN}+8lk7jp8Xh%Ao&>~bh;}qC@NG=d$%o^h-0NNY$y9@7ouXEe3-^=pq<-Jr~ z-cHgFor_D3i%ZXY0m<^;s=E;61aT)a-krc;(F>w9-1wEaEO~+TQYt$r>aILu=Eh1 zSVJCCnY3Ipn-_X|K6A}npu6n|8}Wb{?smpOt$!L6l$(t|cq(fzow_#(ts_C`H`|>*ZpUYvx9g53#erZFr)) zsDKV$yM`1!O84%m6qI9oa=kc#`En&Bbat%6C4d{VWY=9*&0s#Vu;*G9-ME+LZg(MH zmgLa#vAU+GDEuA*2{yRHx8tLn-P~cU2gUe4#YVEO!C$ZlxNe~HX3lXp5Hdwqz4!x6 zi-PQ-_o0`0&-(EIBjIY5#rl~s#i^|ZP?dA?j4u>UK%LzoybqFuLKaDI<3)m zfF)Z8h^c-L_e-0IXLK)9b$)&k8R|0$=Q8tMK;Qcu!+&GD#p?jAq-WZS?Glkz86}>Q zbN4n+t(OLn`G#60A0JhlsAFKepEXdm_|Q^0bw(TR51#32ap8k!gOKbl|J%R=95UpP zc|+mW0i&Ff>)pg2FIlhs4)RcZdfvpQ^q}kO>qz)0z#xS#8Sml3KAtR1G`06=XyXkw zD6RfQ??Km0+H?V-Cj5&RSP@&0`IZy4I2P%IG^Z+eQcU4$NH&HYm0wJ?+JNC3Qf>C* z7j0myuduOO5Gqbl?^KMYyQ1|4Q@RG7KU-uVVV+FNeP9%iX;K%>DAPZs74$YRM|^aA zwD7@lC6O!l*ijqoWms*8O9!k+7iX_d0MKzd>?_$jwS&6L&80tasH=}hsoJA#4aNl_ z>L(kZd%Q@jq!Zg0f`?~} zk0{MgK;W^4J}unLnl_b8NY-BR67v!k41yQ=d_ijPbjKqJRgHYWTM;Qkm=5KGN~S{qSD9?l zth&&zJ^)~^LQ6ie{JDwTYTm_8Uw)55jIMTrY5=e+(@$)*ni)z*g46dTKQx=i1zO%G z#U)p5EFq^eizJSgObz7#Xt89ug~6j)h}sn}C0gf#_k10lk5(X`gmmAIrL*E$%Ng4y z-h~gi+poJ3?sw<_c&Zm~^Uh+Kl9ADvC9f7L7`72dK0pCVwV_e#viVB^*)Hoe%4=MA zu_3YtZ&;ssSY3w-+XJkg^!nvqLMNfw;x)tjuEl2awCg{)?7qs0`{&m}4+2oC*?z2) zN+Tve@3RIIwO*QXkH7>^biR$~0>M!t?_S6nx;P~l`S@E3jfw1@kw!^cYlJyv2%$_g z6&OeP*e;|q&^m6EO#A7=qrjk@%g|vJ*HVNx_ji2TCGui?;uqR5bFAi=30Hb{-+f24J+4m4r`aV@-HuuiL>(VBl$zlQ#8vl#sYG@ zDlHi1LWpwk?&mi+3?E?hp|m5_uoy}({BU_RZTNO3nxCPY0pRLa(~7_U%+i$&m|6Ha zfHLbgSH`_TZbIq!z@sW*hV0}wz26lN{Z>fNh`L=`dl^RccKh*-_=-z}4=Sx>q?emE z+I*7b(CXw&ycd_NdrD&}jO^oGFZ2Bv2&x|}k76pMH?cct5SH$d|6@XUoa?_K{ezbc z>)k&&N*DdO2BSMo^Vq2U{QGmOji;FBxgpLeI&7DKAGo78it0u;j)5;43>_6m2G#d( zvwW+-B6j%0s3ccK$|;48*eZCu8Ja;Fi3Lnsr~H;`wHpZcK&8(CzvO~h?av0si$I$$ z2-X4)9|5fBMp1_O%MQd&%}#GO%20IN8J=`?TcgJru8YW((IzeysnUiVS=2_Jbg+g= zf*LyE&ay}m0=-~O9X0%+Jzq!khLEE$2$u28b|~Xnl?%Ani&>Ia115_vcKx9F5UR!p zU!05j{ksC##YxlfoF}zWk)S>=rf<6!qr1Pk53qCjT`hCki^@kdEWm9Lw|>ld8x6=J z5?Ui?a!Ilf_;Al>9hqinh|>NY%JZfDu}{Bzcy3RWXw+c$e!A4J{j zHqPJ5O38(P{#7)E9#0h}QTBTcDv8VnoZr(bA#rePJD8xfC>b4Kq~B(gq{??M-vN0( z*_ss6g*{Fotj1vm$&T^4`^63c@Tp|Z)%WA#9S^__LTwh-_ zD*60$l|s5X339`Q|B~E`kwx z-4lz%ARjOhX#l_plqFdHL&*tJu4k2=of1kmCGC%!I-4X5?(>o8hJNcAvyLRyd{=`6 zXL=Fc_iTJj=&+2D$L~2zDW)PSp>T!#3E^rT&{q_dl9c1PT09D@=m)lsq`!nN)0HS+ zpi2&zE?nj4E*=rz5Z62K0OfSy4}J@?yG=<84Bc!y%SiyELzJu>Gzl&g)XT&B$d0z8AtvY@(9u>Cl5g6vJgp6 z?aGP}l@M90OQD`%UBX_8E)^G%?FacgKlTSSUmEq(^DTYEd-0_MqmKevV6|YW-=0%` zS8}pN^Y#S}8zO-D@i*HyNgHI6oMVfZR4yMxk1Y2Ng(@;fL4eEP8l&IIaDQ{#kwNVW>t+p%+QlWH=R^5zC3YA6B$PD7fHOpv90gQ-PRn0ZQfdciMGIp z#L#$Qn+~XtZ2C!k?r*EEhm4%5n294w`w8QD-Kjmur{kaJTkN6Wbui1Ae1+5Ib3OU; zr5rp7-Y=H>iSJM@U(gz~SeONKX;S+a6II`z!esY9UkDi23D zm(kwWGX0XY1w=QfiZlXg96SluIs3J+KYgD|n;O!g%f zKKO7R>xI0RRckrMirzT=I5aEW5PwqqlXuoH@l304-#S~-Mc@C7`NZOfTsQS_ty3`1 zA*|`-jOORM^+LD~U|b@2eDDF8(T78@iA*%#r5L3bT$n~tPhQ=OFx>`2c-2wFjWDYrER>g; zP@YkO&@_%Am2x2z17S6dOQj(YXi8^66jaC(2xU0V$(fI;jJutaRezM0TyEdBm7MeO z^txxru1iO|52*O2tEM@vNe%j^S%>G|18iyDCr}KMG}3 zcLw>eQcki;CjUn_HJJk6B4@`5O156MnRn(Z-&-vyJ)3_v{oKl_CdI4GtZY^Tv&f!! z3Hxx)wkV6iLQx29ah!MO-G|Qxl~_wUorLAeNKvY&SBXwZg~MOSjz|Y(Z8;1BY-*A- z`TEa%hK|bkb=!peW%)N*q1MlRH>|Th{-=JWGiVQe+Ak5y537dG!^}7ie@P$B_vy0Q zXP{n7Bgkr%4nO(nzD%sgn0qOghX{a1AoS$eez3vOg=>V4YKi&1YP%##;-4+o91|EV z;T9k~G}}I0S@P0w;RP8DTyy5{^CvE&@N%-|`A`&3*v2m=n@7Ef#8s`uc=wO%SnE<9G6LTEpYp5C8H(Vg zCnGTyh4w)y;(4!7;6aX`{E|Bw$w;qjxZ{XJGSl1rNJjK%N3_4xvyxy;lk&8gdx>jgXCbQY=AgA0u(aL1Iu zo#0*$d0mhisTAW*7+F&(y`j{V3V7_Lg1W~gpO^y>Q|4TBBpW%iNMKzn+ z7FFLLt4Y|y;Y1!@L=u_7d&M#Ry_`NE6LQSvC~+CE8kAMgC_$*ZS#?_wl~@y=Gb&%W<_qMeQE z_XR0WM(4#iy-H$fo>n>4`}U94cn4~KcMhDeP93G#C#ruSlmfA#O2`yi4h#-e+YA3? z<=#B4?Hrrw1$ZQY`2Ej3I$h;@v-KIbXU*5S_JXGEek3Z*)_eh(lr$9acIcdGXK1yj z>S2>279K;_c$5#kfm+5!^lzc&2q>t(QV`t7z9oLi^3JS)r)O$@)=C|vZ==B(!eD-}w7=qDvv}R0;x5!{gmlnrFzKi1U1pyZ3+ZS zlwyWvdj$?r2w0L@erbDA0zir8tM{Mu++(dj+^%tR++HZAk!mhiHUS}s3dfdAFrbuG z!WW>q2#5O2I!GCb^-KG6iADN+^q^8q!2=Tc5>*4Ab|T5`wK3MQM=SyNm$v|l+aJCj zJ3K_@7Yc{h;(243pJe*01M}|P^Rd18>hwTBN#0h1k0e4-tc`PlKOc14RhUKkAp+AV z_vs3u4OhCjB+Hz-x}=ZJP_WEE?XvA0062XBgu;RETHeo2SN!8;(FyZdr&$^f@JWZ; zs`*K~ddIkJ;|}+p(Wx?-IFWz7+K%cP5QlP2|K%(|2Lya@zc~Lo3hcp z3Wp2jfGJz|leg~vpzR&Gn3g{s1eHDk|IjEs2Ma4>4!#&Y zK_=gOsFzoTnPc^)iE0p#jLNw%{m&7w>n|ggcmm74w2|e-ec8RE=1cs%?y}5bUSoH0 zLmlx?_gw&!v(t}=NFE!yFe$t_I;Bi1-B0!h3<=#Mib$DpA_Q>lr1l@c+;s$HV!!@@ z2i&zs25TF9N`rk-hLVxn#>)Mevp8YxTaUY|?^Ff83kOEN(;{BQ?`kE3X$VoH10S+z zVeG_+{sSQl?2Y7-X3QSf1X{Kv++y6apVi+db(DKb+!d$5S8OnQGK|D#-BJA$&})1r z6(Pw4jP>sf*(!g)S2s(=_>Zq$IW9RKDA&C4Mf-`AqWkW|vVnlM)?)UfGvzK!bZQ*T zI#SdDs4#s7;=3LIB|$3$_)bET5T0KioasYDvCdFW%#`AusWvg5cc%hkFKZe?=oFZ1 zr%mF~yZ%9z)~C1u%c6>w;px8=9Fb*g-Ta~NHsR--pMmT(=O)+YU+ORAMXlY1*}`t@ zz(qBky6xg$XW9GY*kSi>Es;msiJ7q*OTFSZBTsdKXS#}^7-Sw`<$wXo#r<8gVIRIK z7l5qz^?b?Myt=;ld=anbAa$3qq;Tqpt3g}ViAIgSe6G6R8pL(DL&UW?N-s0#r> zQJz=V&0d1UW*+WN!cgh4N^J90NIm9l4l-51~CKC4;0a7%~qyyMEdq5vtKxIVA+8a*~iJ`Pbcf;?gL!e3*XE-E*ph4)_X-oBs7k-twOT$3kD@zqc$ozI=-BmmT!exX#f#3o~!z&7CTaZcbxf z0xKaMJVfwDPw#4FyChHTtqbR4zENlo3mWXFjDIOh%ugI%pTy7>fB=j2Ne>)gf0slp zB3@PjjLYTOEnuI2oA5_FUissOA3$|upFV3#b$|*rqE2>-gOljCA@I1ko4wULLCIHm zzBjHSoW06-&YxwF(3x@o4|vWBDgAfgt*62) z;Ts9mHfkIDD&y5Tgs)~7SYc3|7q=u8-LI1&@?BinwoVY%1MdjT1T9UP#CLLu(pFVi zL}$$J-v#EDg_YAl5$=YKW9&X9(0Y{8d!?JTK(Mx(G!EM7H&nK~koIJT^_=exiX?+YR)rfbDh3>=?9#KwmS!@?ql;AC-b1J>5IvgJp?RzdUpQ z7gdu`_z~Skdf^nyd$+nxoXk%NAM0nU8;G1+au0GsH0NXp{~+cCA+V-@1T`;8J7OSC zYwJz&AP2LEA<@b?!KDLz2eDrrNz}QZrN(9bs^SI(wNF>Z*T$6Fd=vG$0qc9z`Q|X{ zqJjJ2qC3da>?fIS!*bL$kKK}OUYPhP@3{wCW8RLnC83w_;{yW_GBiK#(wLM`=9`{5&l{%N$IrxV;p1g?Omwrxi6H>Uwc}27 zlsjlK2#Y2u>Su7JteS%Zh_de`ygL7^Q8Az8%YNp*8}I`x25Z+2ex_3kQoN{HrL_!i zp);J0#%xJ7CJV6nHt#sUBu%YcOFy-zUz{W7H#8yb$(Cd7NTlUexWD)RA2qcBw0hSi z1{=^)YlfmlJy*j|c_W?!NfxRHEKJsuejHC*hj~rDLkW-3s?*@oFj3$iPISW=?I;22 zn%FZgOh~^+>3(Q5yvW-my|^+A14vVwX8!E}EvC-?3}-3#)GnmEeN|FDs+pr+NVv-k#zmHl8x(MoPOwn!24sDK`jhrN zV5IW*nKyv@53-s7el%|dNR~y{d39|)SH12Pk?E@lEVsVH&JhSV6r!b{-n$drTrxho z5~S7CWKT!=)4ioY@8s$i-)#WK7&vLa@Ix@(*t(;fK8gXR(!OeFnwr#MJ8eKy5ej32 zMS{Tw>y?X}?3F|AojHB{yMm}uChEzGrvAQ~-t=1N()8PS5#`$AMn)-MJ-5>4ofSaQ zZ+^ve=K0Yix1vj^k#dPnt{aMn%)IcI+d^j4;nIFcHIRIo83a6Midh9q>@GK~n}|6L z5c>d#B;Htc{nw$Gp^NFdxTx=<4x+qWh0lpJV1mdI zhtLaj<`@#Kd6T(PRx$yh8?};ZiYH2jR@(E&)FSwua%A^4{gs(OE@`-|pya0;x+mY9 zZ<8OB>HFXOPcZfWLraaMpNR4s;V~k6#``fQI9tgX}uwZ{$UtH6kE(7j~m)`clz|tEPyn)Kz zQV`V5!zlkW(g>s#(dm{+DOV=$DgGMYpW$CI1L0r_lQf88$-rG)l=5p}{A&i4@c7z) zsj6l#Fkb=IJ2mOVNq+1ClL0QX|2JJV1f~<0G2NmV$64SGP2FIfVy}t@ z*bJ<%6<6YfwJ}0l-~JYloCmJ{r}+XU89=3*7o1FcBy?85v@W! zkg8ScLZOrba!RyR(PD{5P&q`Ql8Oj&4CGj=1r;SKm530cf^vuuF#?8=M1_bNNJI!B zLWlw(5JDn^B;>p&uJvE<+Ix&WHr-ztgE4q`o;l||@9X+qcZe%{S>LAiL}$_NOB5!H zaTw)?FQZEqUfxo)`69h|srQcvi%RH2F*PBI+sqS}Q zof^%VibER9Qne#$BTC9OGg0mM{S&vo{(L8&Ir014meM(EpZhKz=);`$nBt53xKI(S z%JKdF&20WCaDeiHg8K~Jb5>W9Ff=H6`@o)d#nkiogRT8XBX=A9%Ym2)1C6Aa!LKu_ zTf!_$qtO3Yd;#Fbp~zM~&nCqs+WpYZ+Js7dF#KBsoW29!vZ?KX&xsll-z|Gf?#ZM~ z^jOtFTr#Q#4dy_87zyEs|JDgtBT|&SK`$ngh*$GQi%P(L8v7k zAym823-jjPCr2ebSa`tja=WTuZ4?_m*Vl*(qj0q|(yC7z*paKPdo41C$ff8p`ZtpQ zT%${ZzDQ-}n}sBVWo|1dmOC6WSm)Qk0!~W5!{6#5&PLa00J_GEwmSY%TlLB{HRsR` z1z9%=NyjtdyyFUu(Ud+XycXx7kXz1`(Szb9nW zJ`wLCriH4XaxXB{pEh9@2g6_KSIHBvLLaC6Iu`V+JF!Wqj#Q^Oe3Vrk!|j-6-Q=(N zAShv=c$|>ljr=H3{cZSkw9?2uj9>5NA@US_??~_4mFgaJBqK-|_p2@&{3DmRMn`Hq zkp|_EZ(itbO&$6c4R7(<6z2+0uj+L}yunPeG#@JSBm)9c7YQ_M`%ua8E{4bDa8aN% zeEb@A<&s;@r(7&S4_v%d&PT0JPwaf#+|uo`({O$NeW!i@t*oy6m$JIvEvi zI)bNI3LUt3J;x1Uz~%QyjDEHhYfh{b@R{dkRX6lHOn(5>Oz6D1&xfPJG(R+V#br#D z`8q-TJZm$&<--{48*#gM@;GLBeav)~6ieKEVn;Aa{;MNsB}T@VyJx#yB|hkgNO>$x z@)fmW#=pV%j&_}hJ5m!rdR(^X8IQ1(;(L04 z?bY@u$th@7rwmAB0hUlyxz2IM5?UrM%nFyXz1%$)tefJu_uee8mBqpZv|_`HZU0eI z6O;MvLoE|7!e8P4f8a|33txNJx_UnZWl>bBBcs6X*U3)WrX52@h& z3RyVC?z)Bs^PTQm3agc&-0F>H^2|LyBR4=QtJneMf@UD>%6RLnnnn&=IClDvppz{? z3)V0w=gU1c-*=|exApXm7Lk2BBO2f+{9Mk!$imz0{OOxTU?8xLdCwoG6->BlHRbAr z@Z7HQY0$94FvL}e0N9W2aCIAeQHp%|$%!>FO78{`=7002lf4>s^SATn3%^KVPkphv(jCRp5cd2H~n5md-xLGQ>Q&7yM zri%c=;m@{CcT?!*goY?Qb-Mrb0b--dtbN@Ex(^<*q0Yj~WuEz8Ml?m9BlG(Wt6El>eGj!L)A9(jsmQ-4j+0gYA=@4j5dRG

    U5bUuW(>`KX5xuEDWcs2y=MA!Vtc=H$(DtGB)iw@lW9){;ue?E!`cO2W~<5flYvH{d^0m6uODBDJoS z?HxPm&*qj6N5vr|;?bMZyRfPpVxiM}m%JZ_(j7xuuBv3!Ah}J-T4msM2JjhKQ933{ ztDv!|h<@GVWI5H{SMjojrjW`N8cr;gFgD%vbG-53HaLIli5q_jf=+(7Sj;>b@NGg_ zCKCUX^^@Zb5!jw>8$R6)mq(IyF_L_Lef40hcH04en}R8#P7hR3Y65Xtio0ZlFBK7L zgp_DYf$;&0x2_xVpG_0g>5Td>kg!ub)9&p~5`5qKz5fpjFwy#>`G{s|gmib_F9EPO zpImpdVQt}hMJ{J>=+TO)hwJ&-Ns4?$C#oi~Q8kW&`ZhNB^l9#;Or{Pu_nQH*8jF7a zV{5-j9KCs2X8ODRU?^4g5od=hbE|&DE+E+#Ni5FZF!{!A+8MUZVd^w9y_GyR=Z;z2 z(#T5{q3my!m`+b$VOz&VTQ$6BoIbvIFc(-QC5p=m2ZI_vGJRcLqlN@&4HZb7Z4;yABSug%tVs3FFfAfdh>2w?p^nLk*agQ z+-IUQY9%Y{orSSA8%o;0Pts5y2<0;f-_UFK+wL{^uA|7MAqdMPQ=f+wPajc?1#%Rt zgryvXhB>InCs+IUg{xN~+?QczTv|T_2VChn*<<+#p*H<5gvxx(gc9`Vy#mJDafQ4H z?qxj9O|OY&_C&n8%JD}47BUpa)}EkIQdS8=aP=wXcg3KRAoNJT%l>UPdN~jp`S+{9 z6<5`j#1=j13{}Scsw`lL0>AT~bFu{0`i4R81rb$MwDWzkSLHnl-fe5(cW&9l#~7Kr zPatBTxNLC$qI#?{zMwREax7M+{RH z@?f7YuQ$gy23<^_`%Nz{&NYu^f7kxjD%F5e%L}In{aafZehutHjePSGG^2_@F&v<< z@dhL3E0rH;%Yn`)*kEQf3%T2@wx)kOn>l`UHrXbPTMRyKZucHtw^z|%tlNfcz6wtf zXkAe{cGSs?ZcxYj2W#79I|F^gTT7zvuNs2#Vz0(u%x^F%g$;5a6V&`|4K$J9HZ^%TWs1oIeJl;Rl@;AX z7bk7ZbAu#n4_`)Cu=U83jy4gfBW5mNpr16$@D;F3v5bj)FhK+qzCd-G={~HDi{uYS z#KpAi=}KsmF5WO|D7?BXMBT^l-g>ZqN;lBu5F1DVrcI&G=WLm;eFUqA+QFBu9etZ* z1I?^5lv*@{p`M?PkoWzw;j3e~+N%j4+00n!fgiS&tSl%};UiJ@$JC#GWKmltKHc3$ zUhv}RgNZeK?q58zdNZmWO(!)Rnf%I$_cZikH8e^~9xIPb6Ou@eHTh#>lW%InVbW6c zh3kW$#WJ$+k}Y{o>~FJeZ?{$9GZfaz8N1zvxG<#8jZ?bg!x{Fw#S*b5HOU*fBkYp+ z#u_@ysXi`V_7KI^IBP@P=z+e|2SYgKQCUKXe7C#=?vcejZx0{`9b20@znVMueZ_BsIM_iIUU-sQN;SryY@|(ugRu8lK@0jN48q-f_NDU z=a4J7#F$5otv||lcil%I_gPXN(JS{NQu?%20{HHISgo)U?}5cz2)Hjx5y`4a zhxB6g3e+aZvm9tqfaR9~%(vJs`}e^LF(WB(C1?_2o2MZH zF}Ji`)b{#jd&k6@xZ~{uZ)!Uo5l}xmeQu3v6p;TabNi4IR7tchd9We`M9a1AcVUtH zSkhW?6+r+KPhaallF-PMDx?-_h(eAR;qYqhE6RGp@g7bxA^Sk=6mE}xFp-e4__Nfr z*IIvnWTW1~bGL*C2P6xIYZl#r{uLt`<+w#}dP$-jvVGn4?Y$LBWBV|_fK6DK;rFbB zklsl0VL7R3Y$jLmWSS0)v9q?E*%O){&zvtoOYI`sAGHlD%MRbjA{ihajy(14EwG#N z!e$43+yygFutVLCy`0A}L}c;yZ>%;h z>y3Y$AAg`cQ=c$Uv}}2VoiFs~_;;m$&~B|LP3gX|J>dB|Rq#LlOxkLAJO}Woj(??M zdkhn|1@J^)NiHZi`?MQhl@}aL0z|4SksDgfWoSS?DpbX4Ctn6*1g27cbwy0XPe1p- zKv|t7lt}QFD3nepF+=O?Fy63_3>tM(r2Y!12;EOh@mV9v@*b2j!j zWspr*{A%*<<$alM4RBox1|tgEFeLou@hFg7GsgyqhCQiU!AAZ(&J8)dJ*klNRsY2` zO1q<6e@%z_t0Ral$JYtNIB2a;#Qt(8Uw-@G&2Z<=<_$Hz(H5RVb9ktQJ9Af zLSGEJWz@A?xJr#i`a3j7(=wYLBV2ge$y|NBx-+i1{|q=V`TqMy$# z#oQtOKiYjOIftlh9W$?3ksgdey+^rav&=@4ychx57mXVeS&H*jhX@Qa|ED}H5osAH zN@5$vnJ7ly@!8ZK-+e~8@}v_$F0}Hyl(G%_Cy#s&Hw$_NNSWulG;i~(uxf0pwzxU$ zzNGL6&qq{beHg10It7&2Xn#s(mKLVaEZqM~tv;$~Vi{0kSqX}}Od5R!P+|{pwvp(KX7o#&dzJ*7;vlSnxmj_4r(Y?yf^)A-CvFIwsPX4AVRG=Iq^^{Dov5 z7ujL@q?qZ+?1}GT&cmRsvFP~-i*RjB&r5QIbbxz(KLP0r`p2eSiaEz-^N1fZJ}&{* zubkAg1VZC>m|od4BgA%852tarETuP0@n!U)LSV8z>AJ)Dy(fI#K^8OeX;j8{a^>JHot8MSTX5!Drt*7lrztc(7QJtnUqmUhmRnXnKRsK^&&-<~>onPlwIEpvS(xj9IomOu zIeaXpICp7h(`D)RL4zQwT;MAsm50Ihf(YdEj8noyez{wOWvtSMYgIMhbKXe&g))rC zYQN0?KuYE0)(}vtgz%y?2-5F;c`pL!u)=?Y-dPd&7#%o(Kb;)a=ld@m*3bfUSnc#@ zDP6WV6i$;-`t=xXE@8qlqr-Nvl&Uq+(H2>Kp7DXdG)v)2C$)wVnEu)%$FX$<)$H*E z85DmFJ!dfJ*IB*N4WE|)f)IPtHgO+DIet3+p0GGCQMY{(=&-pTb=bl!E-4>%*sQd= zO?X2Jx3_(8r=>{XMH?IoohrkCeU~;V#>|PZh`BR5>_8*QPlb|NR3e;m=y-|eMwMlB z8KL{#vP!{5XZ2)vH5CU_tb*WmpFCI}!z9kD`o|KCeGT4gMa}YcC0iUZV`fxM5Bkl8 z)F;An>eHGHmDy`N$EAo5Zn9V%u#Mv#X$| zr#>&iUo+bL$+naNahRqqqkiU|YnNzfe?C3mpWxMFP-A_UZ=~Sm7hTMwC;}RU0}lv) z%Wg&BysBc6KDSDFF7X-qocHF5?}P6<83uN#OX-??;}EJwzV6*9(O#Trv+cLt-f-F7 zy=nsIYbCw&YsjUAGO%{P5RDaU?qTNnPV>!WN7C@G>2;#=e&MNbn*E>cxMB@NyN0`^ zqFov@Na6(-oA!{oVS4`3PQ=eT{uHG|J7e`X>y)#5PT=}M9_{nFWE&s-Y%Z)fBj~12C!HxM*YEsE6aP@Rodqm+O5*Ex$TOVfyyNvn1;wo65Cj72B*c zdiie(OWbFRDVAM}e=X}mv{CO4(A-Wh5ssu}e6mxgFXwR6mZR)L&%Q|9`PTN2ui1^l zFIN`ZkEgVp2dN-%we7ER*!%LcuWDedV_FHZpTRQf88=iQ#M5!-6czTyd25jl-Gz`j5p;`qEbnLYWY z)nZwP@Qn>B;`oS|Ru^*zr%6RCIk-7l_6C$3B+&D|+dLb8Fh~df<4Na}>9NjUV72s) z`!2pPr?6Q}E=vDumE2zu>%2j*Bo?}X*gvDf`kAo(9_Xlp5OY zne+hk+GwE8+2U|Aac3^;>T!DTBzcGSX4oS5R-kYksglyCSj z-XO*6404JIl+4gEIMQn{WtsGU5)0ydh$lB};EVhF?t2z(xt8b?v@VUlJ!^U3`*ljK zI+CDa*b8OwsqoUr=;KSrpnQp}f;b%`E;5OQkBs}O-WHgy^zTN(-;4olgQJe(OIb{% zewqFM{P=rUle_cl-!s#;4!xeUM!=XyY7Q01H|dYtV$sVzv`az+akPS{)!qY}>ir*F zRi&u4NczrIio=xtLo{R0%1gYLc+r6dtgaOtiXx6xOVvQuNN4xyLN}fPBLxKgEQ}oV zIz%&A%7-^?)o1Q8NV0@Q-K)m)PIP~pcjM2mbQ{{WZw<1=jZM1j@`mbYEeR!3B&M`D zu_euMwdW``;lA4I%@i^}41%ncysz0#46$Gkx}}p9$7%8qiJ^4+S;&u#zY!16TQ#+) zMFsSy8z%tYs^QrcoT=JU_X4M967U{RS(tm8F?Z3t8uoNHBN#WOa2LXgQ}sjnqSbGO zd1p*Z*`{AmxW-J2P{esUu@?gMex`Oyc_H8fI1uu!ZnlyLY?lR84=AL?bhv%Ms@dfu z{odYF^RSKI_Pp&)i?`FM`nV)$Sko#$1l`};k7=BWf2-X?Vfi0~!##!*)9Q-z)BGvh zha!gX`x`S^=dB79jIBr)8F>O!7n0Ry%srOM#>|jq12ozP>-T{V{1joP?B{d0LYa~8 zlx4wh=$O-4DXP>@)c!AGU4)oIc>>U2TDV#j?~tVhKi))h&d`nvUzRV5 zu*f>bVbHN$z_!x(gmb~E)$qVrIZ5K7p!C07x<`}l3tDHTqSkEf&VdmX1_H3Sr*`-h6N0UvP z;Oa6bxl-)sXxhtM3p@9DMR4yff`f9GBWlru>5uupDNL80+=KgTR_&AOV#X7+iL_v^ zF7-+_3X6It3W=^yVGbq-o?|6#9)q{Ma1CEwA0yQN5`!EInh=_kS~-6MSe|)8n!pa& zeVF%$Ph?lND|>dOe&>-87c-8X8pgyt1RCr`8D=9^c3#LaI3wO%${VkF>CQ1k*G+*8 zv4}g)?_(RfPP3%|nbyDEWsQG0+S&H#h&Cl0kEz$i8Z$=+AQVHxB{%M!{-}J_v!Ua~ zxsE`DRUJYDyfvaOS5_Kvj&oyblDtc&Ggfq1rd9UbLTR+1f25g@>T1mqgok>m{g)?+ zq&aX->=>cV9>SR^d2!87*JhqiQHv!7xKzZa>7pJ(V>TmonLskDf#dL<~QPD>HCo@TMqQ|GU1gS*yIMR+cL` zXv>^(A_!_6mvRw{V7QCt^aSt~6DaqL=7Vo?wh?@zkkkUdhN(~4Ncrx z9cZvDbLB@37CKOjr?fvyq}-TWlSbV(7DbGTra#YaQO3VTJeT{|r~ni?Sr%n>_?c477o@1OBMjajE0_^82(uPJ(S)y)-i=WD-6sa1Zlax|K+ z>PEORv{Vpp(tsDe=CEh7y%n~H&i*Sq5P^*4tjuK9i|EZpINvw`XjU1}VDtQDC+NW8 z@7k)YvNVh2@Z9Guw>krOR~mrTT zvF|=jdG7{9Smo0i^*AZE5{R&{m4OxRnons2l*4{@f0~7Q9pMa2!P;YKNbRVxGZ*P9 zpQ%Ig``4qn_-(d;{kNdE`U# zd~xcYOSdxjLw?*J?iwjZD%$OMGA|=HI=+A=l5mVEDznO^-qazKgWS*vnLaxfJ(a#( zy{O%sXM9n4??xK*TKjHbe~)*-dt;1y5$<4xesRUm?d@6SN1F9~d#HV;9?+~%ztf|U-zw2~DG zTx)ZOmSFxy3q+3a8DwErVN26PpR*0aMFRX(DFpl?ggVcS!@N~;N9IiwOs+xRX+S4I6fT{!>n{l$Igd#0~PC7}9*JnmD4vy9;l zpudC~c5k%~((#Nlv*$JBqSG*-#!6_R8k#`i^51eS*&x0tJr27Ue5ugM!G#Fq*n*Iu zt9)TK7;*qo2D#MEfV}=DHyaLRX+-F22XWd~WQI%tcaai;wntPQ`k1@9tR zE6N<7Ze@H|S(20SbnB2>Ik4^hI$0;zK|AL!Y2twE-ffd$%U0e!wl6!S-MFQ8+MDQ0OtmN{0!doQw+bh|laD|{GTAD!aRioq6 z5@*O(;g`W6E8px%&<&!8pFNkF4A3L-A383$FIo6=RE5mp(-XJ;$!$2z{U9c*k7;;* zGUHbxCiiXj4H2k*U+C9W6nG8Y4@HoF(wGX#0~9;QvhdMkvldm;x|hPmwe(i^S3vgK z*!D$_6%vc(cm>DFa-UKx1NH3qY~z4meo>5QwkS0Mm`!`a%mi1~BAS;vz9ufC+pKgC z_VMxj%L@YfEp8-MalG$RD1&bl%Q6ys(7TC@n^-8XsU3c7%)JI0jO#j$corS4?>I|= zyJ0L;b)Wx5+0v7vY86)~zu~N>avuBBFq0bX4zwlDI00H}V6V>RIoN-rb5oih=A?QP zo7Q~!F%>ws8p&*8ax&$rI}ld?xY03UccAgK?5>CwrP?g~w*T;bavJ|0r$=={4Ha&= zC%0mS)1w`hZ?s7|VD0*0HoNr4^id(`LZlgeq$hh$xMX;KkLUG`IXe}d@e(jo#l?p4 zQ897U|4v5T#f=Tt_z{BrC7#1Nbu^dS?pE+RKOv^-Y51imL3|o1hNs>Xj#x`#rPd0U zYvL<=s0)gJ@``+3($C0wxbpWuqIVO~hLP+$@rTSQI~i$PCnbJ}EHmy~+$X}*1xPhJ zMncC2<3_ZMaoNMWxgkBmDqD4KC0J+6#%ytqO%;c2x>z(&JxCyQ9N{~wKH&}^^aKDC zE&*+8{a>>6)Jbob=aIV?6-f-;f(d`5bw-aZs437ym0E{W%KSUVVg+vDb}3_uLuDnC zUDYsxWt;C9?GNsCbHLe&qquJWX zI-(RFa}mB4&3gv_LxLB*7r_(Lhfod1Rh@GhS3LE3J&qT?+h5+KOwgies#l2J`ej8d zzt*X?ZT1Fy$xR!FqRj;XCV%hzffWzy!NvT=5>Gb(q|_)A(o)@Zz3`-efvp3Z_tgX# z${P78N$;6sKIKc-MO%Q;p#ov+?GGFhQYc$^>sZ^cxW2m>4ZX-wL36I$VO3N%cSpdw z5Z2%ee@Me4AB1SPlG2|ZtsOgfpRCR+pLe_U?40=w^*?KFD$@X?zVbD66`b&wC{UHT zMyWU)Kh-PaW6$A5$tpLqLD}$EYuKeG)nTG)4?!&ux!E8BP*Z%PC4v6-EN54ORSGhJ zbs!TM+}~R1=9SOmB3mxyCbExj*s*YX`*ZWkXWuZlcs@)KkB(#Q4hY*5-Qf`5?hwlj z=Y52rcM;Lu@5kJ9=tsE?JL`4+?8XdK3QCP4CIsWon|pU89qhgI05fqFtA^92JGpGy z1CMp;!9CTm$e_T&i^JXZ%LFxXngG9|R1et) z2TYv;ajBTOoN3Ki+rZAq@b)cB1vY?MkZD&QZmt}$U!zFt&?)@phzA2NRnPOqJR)z# zyd%%qr4HKY_N|t6lKerAIaq2PkR36ALmfHhzF;MJM2s6PvkHHcca~x*lfmA$#dnuM zD=N3j&KtysVN%YqRkItu1i-49%xB-BIG`F`u!4ll{+=mUlmyuCPaB zK+##|;ZsWOp0PZ2Ldo;!08Dz%v{-cn@Wui+wl!gLr@m^3hjQRPHW;@vP*PMOk*KiV z2D7k~zFtCgmblu2$8Tam;SjI=){FU@E`cBRV8x}2NVw`qLv>E>^`JkTu-?f^;Q?a1 zIAuA(1_asZRd5hT@z)@GvRJsz_*(6Zs&QJI9Z2!Bd_-GsK-T7^A<-YvRv9RSlKze$ zI|{ZjNM9VKK`ZYzZYK zmtiU+Y{QwxUmNmGDpVrdDAmBBwPg(jMdR!wi`q06(g@Jj2m%D;jfa`nby`EFLv}`8 zV%aP3eX9lbKORloqj0*SBP>fp_)ZyLxbO|d+D|)k_SJZrawcWhVz@80jz1Dp6i?M` zL$TqZp7fNzV>*`xmn-5(gBC5SzU3(PX_~e+L-2D;1$R~-$D@<6BcIshc1nT=+2U`bR(z5si3PM*a zqrq2mb#janbr~ykMc7NX47=Y$z0KWEow*H+%<7RHW_aFdpGzyVZ_WW*v8Q*cucteD z25k*ncr57?*Zx8xUhvxZY~#wxdZUoa5#RLVzDNdmN7LjDXYb_p2?Zk0iJbyqmn2t& z<>th))E}Kuwbb>Ymm;-(y%(HxXzt+MC}nW&J+LEJw2GrHJwB}!e*v)^4~1OIq@qCu z!ua%{&(|oo-}t*M+#}jLY5LFsn*Uqo0#2%jQYPXA$j!zplZptAN?x4SYUIgK8&d8Q z0>*$PUDKWzk+SGgHT^goCC}$g(+ z0mJcf`{%vuBa69V&HaHrof=4I(6oZK+@U#C)n{DpUQ=xJ=e_s*t{=W{)=_vfoh4ZD zO3;_sY-Au?=hE~|#6+)h*XM;dSa(rw6iHj#*A0gwJSOK;vQ}ITcBj;2r+Pw>b#IBr z)lq${DOzHntW3^483wLks-1rN<^GjnIzHCjB!yau*H+*UyqWh0W+#auNc-#$-qI^m zd{NMx_1W;^Pvg^p8r8fZIDpcaF;+8ne^EqTp3zMBY-rF0mzf5dNsgs)mN7AN=)xFu z3SDuq1R66vncI%ebGG+@lNB}&jCrxMk{OqOe3M{5vdQn;w(tUYk(WSU*}K)# ze(7Lj@r~hA=7O(Q5Ill${EeJ|I^zWeRua^9ikguMO&2Q=aEsbM1LCdSnU!GtK|e?> zzj2OJY>G;=FjJAtw`Ha+onOEt*7#A6e+g4hg<}r-v$0GtcjSah`I*ziRm{hnoq<7^=4E+6qLRLV%u~$+_U><_hCTLF~ zUG)?BT`Qd+YiISiDJ9;}blRYk#71utJKh$y$v--2svm!w-F3(7&=rA#m&OqctoOvAU8uU^nKdVqM%d z#k-Pc>IeE<+D=^PL?)>rF>2fdn7I%1dB1OV=*0!>*?gr3b6QL7I9=y7(ZcA7kaJSG z-T9%#b84Vbb{Sr~ycQOYnhU1S1tPMHox)Atltb4L_iw~&Py{1UV5CU#rg0Kztj)Ur z>+)eLzsn{aH3MR~{wA%C?&SooHm7+>-p_-34AiH5f}B^o(=g>99`GK{F?DLZiom36 z&j71}x_7ld^V8K)(7kjf3~bgU-x%%-M>rZnCR4gxIH`e1XmQc8~zq`j7*&Y`#Z-Jj1nSeB@dugw^+Y-eG?ut=kcBV&$U#!vCbX9BAN-V=@7o@yhirhGchzp_RWI1aS5nJT}1ws+KzliLxYU^@b) zwY=l}9c@qBz;K?&X8-2)p-C?v0Pb$$&?QTP+QiUDEhC78z+$!4pskFv^b*H9n%$u9 zMgF7C{DCRtQpW|jHp@*yfi$osOjKg&CmI}@2|S6d-X<~f{veEa8^)sb9DeYYMD-hLy$W z*TUWtt+I52_I~^YSCR@0iVB!B=)QVZcD0#AB4B#}+mY2SmhN$OFE5~N6<^hNpZ9Ky zbT35nT~>jU#v^NLIMc33_+Gvg{+9l-k|t>zS4kyZYqa%Dl7*jy?;*=NmQJ8ShOEz+ zE9glmqt5ba{gxf+=p6D3cnjx<>PMPe%95z2;D5Z}-gi##k~`I+ik2?I#YX z@xcVqMK5PHzZ}rJU}=KK1PH_P;}s`-1|PO{z9AYvNP)ZmvE2#(+-1nC@s;F2GNn3I z^VnGL=+fPGnZ?ei=L?rmOQHfW+KUVnJB|>HW5dWFq!zVN+mIil*7u=NSrE%b*s^K% zoAp()H!a)g{}2_HSSsu#;(5|$*=Il;JyOR#FJG6Yi@)dSvf+iIn=`G-B78_t9Lj#S zOK$AltW%Wv>zys536i^3i6_%3Wc8Tymz2T5O`<2j=zi3^Y?i5pP_Hw<0-~dX)=D4H zC$)zOe$=l>)akI(GhxAzo*v13-EbUP+;TOI`PGWsMVnvIN4|g@qY>oBA_1<#jc|vv zf-7__I;02p$Y5Lx2&L{5)Z7!2_6h6z0M+V;xfTu6F>N??id7{!&Y@-QS^QbqFz(+} zYmW2$EPmkQRT*d~lHqQGbkfgPk`AH0F?CAC0|y{gp1GU`s8(1JpjrjSspn|n4AmM6 z0H{V87_DkI2=r7Mf^3^_nB}Lt>pz!NTlNH}p4M^!)v72BCsbPB7c*Tb zO{&*584LR;A0$bQW1ZYF8ry1@2fn>p2R!O(5I&X4IRO^QNe^adkve$;2lG+Zjuspo8Cda6hRHD%rJy4}oS#epfVbfaaT7A(Q z?%4Jz5K1_4kjCsr;Mrh}$+{5>i!>6=48cIa{i!F7o)PYCcLV8y<0gVdJeL zln`KY1R>qJE4)6V38Y(l>2<6S9`?y38#koA6IFC|sR zJBi;BE(nbtu6=oe-MzYJOln!NTywA-sy!9%J{rjFPjBgJO}yY3(nw0xDf*CEXcz7l zq@bJ8Lwvi;u;!bsfp0^NxkurRk5hl=&MRMY!alz@a2sg0q{yy-t>7e*ioyg|-Ns8l zum+iPIMI_2ulKGdj;&FGxM0HC9nlQMgJo29(h~m&$VJ*P!QToLxvjIyZd^U{galmT z(W43d$Gza5yHCZnhTc4T;h5*rlk!p@>C*i6M1I&NX~=um;QL@S?DVy`v;@>Ictg9s z>Mlx`(z8T6AHuwwt+5oOVw*&vli~TlP~z?ht4PerUV0s*vo*xgHr>WKp0;thR&_JY zafAC{WK)mM889Gogt6kPs7(;bS~Itdq~86oK@@yh)rtba8fG0@w*!&^z6dCmol=!0 zt<7Xwp;+VU2wNCmj>&rchqVd^wCf>PKoOCh3Yw}jja+6-q<-dw(>a)1e(|se@m8< zQich>Jmr`S{!0`=SCa=k5Fcihrr#!L)8%U1;OgbJ|5a-DE-a{`!&we=BP>b$oN=?8Lhvv zwKo6gi_NO+J(r^L-X~eaBbGG!iZf;TCcL7X_E;s}!@bVd4mu6*_dtxj^BiYKOm-lMdO7`O|qY~CztkxZ|>R5O=YI*rw#z|gX z%VOVtv^`tHX(}p4J8K8;1{1Ku((lm;576i5J7z3eyz-c1lEgl7>#KqT(r7GXhu78$ z_?6t_@SdIel#B*z%FAj*UG96PmYHqUZdQTjqm85mx|mh*vTlT%n;NW(?;xafJIZ0t z+y%C}UnHFa5jY;jjF+{a_a-__jW?$-0g^MWB0TI3*>yWAC$?hkGh{(nx zfNCADK|o46s zYdn;nII{d{%Xq(&(9}--c0L!J%H!k15Q}bLt1mmo~j|>>JuJF*; zldC(|!B=s5S{Oo1Q{|yKy~f-zOWFi3Qz_X-kYi<%$e#0C(Aut}t~y9wjcw4SQUJ_j zz>{Quc~&pi#pOf0j})sbg;-tyIp*}tMD|#(mGmOY;TBNnKeK91_$=`JDG{2{6bnFJ-;jCKlE0Aod!4M3=CCJIB&m3 z(LkOObPcgd2Q5?eGHwnGb$d$Y?NS4!#`;8-!BGe~jpLxFfQTv*yoz z_2({az@r6o*AkG9_WuLfNO8-nfZQ@?ge-);_~v)9ctm@`UF6F+DfRXUgZ#wGrEyYG z*AdYcdL5D$iaOyK-fj%fw;+)gvl+2+rWoYTGSVe~3HXqKt_~);^v;Y`&51kaE(+}V zQuIMz?~^~6@1FO=*5hCZu&tM2om2;SRnKK%zmRO zwlq3fhbaa+MC9q{ZS5E6JNBI=hGMTC-J|$%GjaaTIR`hg|8&h3sIc}$i0+Ld!B#2Z z3-n`2qlQ26>0S#qg)C&4{O7$Un@+dPP_4*YTp4)Kz&zt7)w=#f?GDR%qaN4Oa!{>O zy9ZggBS_28CQ!pB%@zxU1FH4kHWwOvP)a_2v=3XI6`txvrw=0uzKx8++xHEJ=#MfO zO4$Kk;fI&$-2%6U)aLG3benKUb9nd^{(nH5OzW#C%{DCoV+x7RW^9Uh41tsP@7+W> z6hc4&iM4g=F~Y)?WJ&TVG@mzPs4gOD1%76Kj-1H{Mjexr0*mQcLw2{Pk7^$~A4v%8 zl}RjIf0UzTM4Kq$^u#DSa$Mb6`0_XyO>sn6j=l}jao zPH1+zGplbI{f+PtZgkYUZ>rvZ zubbir{w4Y3%c&T27Y|Ua2b%{-L9g!4xu)(myc$#ojn1jarU%Sur6pQ_MG#GJ%AK@1 zD)L!Pm?bG{w?)jP9kTf}OM=^t4Uo>knaem($6w8gD*5g+pw4`BW|?68@6~IEk#R@u zjweOXeLaR_QhJp927I2>SEC<4LZ<^`qSu=&@YW^hSb07uMX`{H?T#)UCp5_n}c z8@d?3M5$vg;^0%L>p09A8U3|zKKo3fo;sJ}Cp(U$axm%P)|f_Gk5cG+54i~aLa*sE z+bs7Hfbt{#tux2={s#^)aqlR&kz6=fh&qleEyC1F@#s`f>5tyQOOvjq$X>b#(+e;Q zq){ASveSe@F4(ZcVwCDsYiL$;%VFnHyMeJmH%Spi(zJ)5-RU(M4qsj0Z@g`tg#G-b znLY4FRMou3`wQmgM$v#d5fuWXpYXVS@s zix8+@ui&#Al6s@5Z{yBMa*0D20-8&4)8V-5U+@-C+cRJ_ z^qdd+PcV?zdm&jdpX8^CKKtGY8#8~#Pm#-#sl*bcu$qLP`#k?;jBKE5con|I-Ve&qh7TW4f#2F zTctW`>>Nx=U7>Y!7rg>CNdTZ1dPaT{s6t${v>pBwXK;cs!QS?A*DD$as&x-;6Yz}& z(1Lhy3UcQEJ6&qV%yHCA?bH)z2CUxoiahlRW;d8B;E2$8F7{9wx<;knuydZZninUR`FEPS>1QU~LDfV68Fm(r(qfcw6 z3zOW3;-qSXARl=00>}sMOVH!S2vP*%4NirU7)=#KGkpM3s6#wM{HTag&S0&oO#BSi zy6<0DtLfEkQ7|-_FTZaOu+|i^81|Pt=}Xtp8qQ+$U;FLx`gVC6iN#r%;r$GO#rcK% zFjuK*9Qt}NEG_r%V6ElN^wiubLy757xi$lr!^;g#+?9)fJ=>@SFBQEvY(;KuEa0A~k1OkE^oa38*ZhS($ zMk{lB{uAo|1O#8~`Tb(@+=?6qVo#p&L+;Y%=;F8Wek1}&J+ypPRZbF08uLG`_FE3S z%}ZS#ZYzcIS?z_yzYsQM{17$TfCgAA!GqNqU3>)G??}P3pK$$zbFA;Xu2omSR$N=i zE6nPM7(Sle5HlY$=gJMLBj z(Q-Vm###msbEb!jlJF)~R88!xf>tj*artIOBe#v67@0on4vz{%U9Gypc^bi>eUcC&0DnjvWYz z{87Jc;_wvo6S=C*t$u}0^|YkKcEkBuILMiE%1DuSH)JNux}=8}fgKpg7k{UlWP9KD zPD)Aa5Cr;rXR_qDG^%fu2fszRnU!i##>LHLw7kmglfG~r7X;=9x% z1FE}(^s$XDfzl}YTO+tVzhQuQ;JSyXVT{;mg8udJNd0Y5 zQ1#@LLo*4H0NVO`Qqc6~XTvU)wiC8&k5#ieS!de$;7uB*tT3bn7|sq4$F%exedJq` zb;C(M(DFmlU_;yM>0Dn$YN$b0DTE)8k2%LAM${E)DtTcxw1Ob5H9e>deihpZ;(-x? z+;7aXKJ}e3DcQeQxIxld7&<+w3lAY?eH5eYYodvdA(4>)x44p{U6XkLTAN*p3S|Gj zO3Rs&yVI;bFO1Zu2&^q*!g4IloryV53MVkCOQA|Wssznf%4&sDRVaW~jpvV3ll&tX zM9SZa2QEJ|0Rye20C1>&RebY=S9xg>?kcwZnR4LfT`x%L2L6S})Q5BFDCelnxd?XT zM22R|KHG3=``C2j(m)_X2|K7*UH_9XLdL`}o>l!=bvMr>L2*p!5dW+~`Rj$sQ z?TXZkt<0wMv3M!buQi7f_({Tr9@XHP_%kj2XQ_zG*;MX%7e2S&&qj8wFG(9%by_e!3j@`e@{rQua4r6#V{&~nWj!#z+0^i2Y`+h*1QE;Rt81JAbS8+fK1ctC8S za!&E_dLg!&T>Z2nEBtH(p6&sC#z)v?Sp5-s+h3JS83SJsj1o!-O~*`wO;&0v29PWkCmb=XY0 zWL=qyUHu?whFOJKlQ=hdSdscjF8eTTIfcP0;lPrt)Y0NaiNf*ApKf#|s{09M5hE&4 zEhEJjdSmtP@cK5J4=tRb6B4?b|+33)9q88fO^BMOh z41VA>>9@O8sz$isz=rbL9$bNJ9%<)ksc6GYX&<$~Mwsak$e~Em!+quvzwseb1Qs;8 z$9N)>uFX{EdWSp)WlYe~d$z>0vcO?S4)RyZDPh?s;lLp30FFoh4hL4a;lLomcQNk? zv-x7-lggl$gWWgghS3hcsMr=s98FHcxwKd3UT>6gG&qv+p>|ba#R<@lmGWXyIpbrA zy2V)}lQyWP9j@6x`q(MX^vuovrD$Xz^z(Io$);cffI0*(V;x%(vrIvJn9F44cy5VOpJhV!KuB5WW&?Y=*}yfcH-oM$m?5Tjx8( zpVc7&*{l$QgQV9=sGy46;K7yjnq1iKQ<(67`RNT~fg~)U*m*Qty6+Ie6)N?EzTX zQ6Pm&Dh)j413D(0%@_`r1Uu%(;PfkhpvO4m(%VgCUjE0^%{OCL^;fI+L=xq%(bY_G zOKd9c&cWw{J6(Mg$FYzUiQ2jo=lt&ZtGu&*FMY%sJwZb~Do;K1kC3(BjM_7g9=P;* z(9@14P?KXkw2p!7Z4@egr+ZL0DqBqn!l%0pYo%G6iOh;-@p!p%mCR6$$ zFqkbo^O~LSWnePhlFn0(DG7t4-x5acbe|riu`W_H^Nx$~0w{YPw%%RE3}E^*zp9_J zv8+~7R=5C~2TIfhXM}YKPAN9D1Fee`x9>X5T9U9@@rhK3o@ZUilAZTMLVxAiq=k%J z>20UMxYQI2ZFDAfm+LANmfY(W^~$@vtsXZDn#A18_0!IZ{5;pfmA{N>yyGj%C%o=W z%r$gxHX(;$aaA65i>M?0InZv)Z+{#ZcIOCaL24c8w=lXJ2rKrU$jFdjg? zq<_a0KhWR569R5PG1clWv~_bzVja5TfL}7KXc&3?H~aCLw#S+|g@v~Al_;b!peYw? z__Az2xvT1@9C zwY}QI@c_UTC$P=;H$2^wSG(5)(7+Pgc0!=5N3UD*Xy${dEQ()^&T{{RYRvTMNk%_< zPU-%X066xA*Vfr(C41ozjZL2H9HLG#*b$hxPbcn}Ng@08&I65wN5jCRZT z8*2)gxpry3^w5Q|{m)R5U6PtB!qvndp%cumEu&X;nM^fMbFs>EfoJtCYFJZx;Hg?3 z$7}#q4&I{=czb{!D=Pt{yyprnfh6Nl1gHa0*T1~Km(ryXka@)0}JftK679@-;D;Ql*-lF zW(Kz$&YL(nO3E@>(|ERME2saWH<8L`hX?Q~5t%hBmQxGA4JbMv$K7{~)>c94=*kD* z&^N0J^2cBKeXqMrT$IRcpWa7&8Cop*FcrS`2;gST+~6rLL4Iz;2-AwhhudOaIDgz{&1{TA_kiOAOlw-Hb5Rkc&-eif{F!klY<{?x`9|y zj}zH?1oPWj&Q!aZGv*^bQ&(qxzdp0|J)IfEc}{}6^h6$bUbf^X0%pmj1dbm)?IYzk zzxcVyz%fTaN?Zl*Eq3< z;S~P>W=d46px$Ma>5tyS>f!%+bx@{Ss5D~Z^#?t5-k7?+$!A2h{Cgk zPZA~?PS)E#QY8=^R5smiP|<2b@!3sV*mqJod8L{#xLToby|jSC;AhyWWYYn-?L5Hi zbWg%qWWqntz%1?kt9O88l~dwHBV+){YMh?$lnG4~vf?_Btjf2H98b3u*_hQ`L2-(4 zcEw_9&k}9Uu0Z~C{_7xDE6s7If^}1GCUFak7Zb7u^4~hT(=#P!!@9-S{-IwT?@z!g z@ZI)Xku1^-n{&&vhd?fcEATj>QWU9g2&FREkJ{cmpW|bu^swox{m2fgI->)f0nuaW zL8^!jo(_=la&ctxhbrjCFtsn*3Z~ll@hNR9W)U*q{AaXu3edpq01XVl0_nzG-L`zXXa^*)mvWQRMI3vjC=wuD zD!92I(b~Mv#>Rsc>(v&A3aS;VE9?Z$FGwE126Vi3KcD+Eo2Q@TybI@P`pesV(r58! z(pyZ=64eqvofg{1Vvj^HaBL@k;jThNe2&s|kb>V5cnY`hpf8oFgf`$`vZDeEl&mmR zASpKsl=R8~)9t-&Q_-IQhEmBM6DV6yL7r?e_T@?G>C>_=%}p~OC4bXq)W)wtlkm9! z#ZhoAp*HbpEpM?+HhnO&`7t|2pTf-lbnFwL@&*p%F6LtCm2LxEAf`M%po>qv&A+?v z^KsRizB}en>Z@_u%bFRNE_t?BA`wlOuPp`@qn&vWLkG-uTs}ohCJ|f?Z21bC-F=!OJFXN!|6*G5Avq3i+7(fDKv_4lxagL{d zSitmypW%B-+fMp>7ClVHaZMPzu!NW1RZ6`=mlL|K@mOBU$T3?tQ?Tb~Z&UEX>(wFI zY7vTz*Nd-1;GwKh&XGbPZbE6gBy))L*}p#XSZ0>T|KV80_Z8M1Km01>Y#L)BXvu93 z95Wqx?Ir_fTTDf9ORdscutxu}ZXI{A7mEKNRyUoJ*@7 zcIg0U5zv$V+&jmk+WPN~RrnHVZ@y!^y{yc-@D{A}aQ^v~QHbkx%-%SQ*5)xNc=Asc zK${Zy3&Y53{8e492AoHZN#QFrY)XF*1;Hu%?3&@9ZS;tmUwFByo2E_=6UDXT*H`8R zo|>JZ&kiJfu~(D3;Glv%s9ZmyfAz-Swd_;$<#6im@X;B+d9<`c@nQ#- z6#%&`%PwcXOGZqrme()vVc3g!7J%aX#0@Kd0t9c!=_bkPf zY)ex<$9r^O^|@L{0i#Yz?UhbQeR_64K6W)cj}x!)(I5$*$R^rXg7JuMrQdoaa_(k3&~I2{3BL?5M{k0UqO+SyUJ zyHyOojD^*md8%7_kcCLf748}I1v5f`2{!*Z;i_#6fIY~F{}iqo;6_hHuUok4H7Q($ z5!yOx4n*5`B_;c)y`7@-+iYxDF`)bZVW<`Tk z=zzo~c(Bno7mEtMP7Zu&9UDQW^n&MHWaLhg!*rbtO9ZiIk@?RFS5Z_h835Y<5UwWW zcDFTIN*nc)!d2Bn3bhdF&C6MW5AA3ggqKye|6x?mk593;jo%UukF=bHR-nl>?F@cIOZ3 z{zUoNk7m%edEo=aNtlLmzRa~;4@0!Hi*?@eJB$#t=>%eo-9lY?{KS4ybtL%9&<_y9 zc|fIJ($`o4s_!}AAXEk@L&Z~i`^3F>*apH%)s3{Ov^4Y=F9~h4Yb9P~ixQ(dSNSao z!&}8k0q}#bROO@BJTexhFGo-EX;5BDBC7w4LA z+RkY)Jawlm0?_9dxE}xJdf)l}PR}IW(IyD4#d!3+i%ZT2&!}>s-j>G9Q?7v0;_6oMyBKEXO-o-ui5DcG*{y|aFaRDIiPN5HA&=$!RvQ5AQPg1S2k~I zH}h??Lcn_oT+XASDBpFbTs^P`?c4UCmEGz(!P=Vv+%uIq6)>-iwBpaWHiAaj*45oy z#@o{vY*MtN3i!}Gph9gqrfUdduQYQDy{x&{wlEk>FJ^dHeQjRA^$6lqoY0pSyPsv+ zKDg(_+sF%qPqY1(H|57RCxr}g?~t^_F)MDwuZwA0>(g!V!q)u0FQEZ<7ld~&xpxXTTqz6qjeF?n#+q7^NtNDkHPSz` zysRaV5pp$eTRi5jjpB2hQEtm`?|B--1KY;(vn>gll#}y)VmLzV$HzHH{o(IDC!YVR z1W#mD2G-NZFP?~f5J4_!&-Fs^-|i=U0R znxG;W4^eg3*2$QF`AX}ZnO5paFEwBU@Ifxp*n`t$E)`7eCq*nf0`}z=RMZxb&etCK z9&_tBt&t{rirzSqYPnDg`s->K80xSCzEA!xMwD6$DzhVIFUDOg0%Rk}9f}XHmL}@h zYX(;e35;Ax#}*t49k}X+^H%ZR2js4A=rbI9cHWQqH0;ytcksD|^WNV+;W&|XGyNmt z#T1hTu@0RxiW7|ulC(Yz9+mqB-f!|aCHmDoZ7mLstry?Kd5n+QTgKkw+UQ?5-zL;c;c(p4=h*KK}W~vyYc7UDVuKbF)Og z%%5&};{p6;PR2+4AssgK%5IkLalaM2QBL2F;Q=B%qS2%r>C={v3S-kuR^=~Qy4Bd7 zbz@QqvXl3N2J-0w`?X6Re?r%4oPw?u(e=Bo^)KyXI{??vnOU4u%vw|*wCINdwD+Ty z&@cpGy{``VYMda{!>(EehE%>aOz})wT#R;@V0f{ISE`bQc6v|=RcnK@ODF306h%Ei zwmSUKCN+zlkhU{SD?BEZOqNj$nu_bd5T$5uLw%9MCM>0H$+WW??>`r`&FP6YZM`~u$s6C9|| z_Y}xLsTJtRK&dq@6b5XUNblRHs&#X+#MO#)ZC8(h4$T?EnMqxAu#Wvu5oy4a@qF5X z!(WeJPP82CYZ7IGb!=B274b&aJ2IPo9c$gMy8Ciy#6vN`GT%(l1xzdzG?ogRLtlZT z_vbiW`Xg#2QnTq)U{eTyAq?0-Ghl9$!!aN(U?fC*l*$C6gy`1Fo;)GpYy zDlWVoNLOC%l7W3J9KM1Q03T7lr0*IvGzhx#{$33+YZR8Vg!rN4^yl^Y2Yj@|Yg&Q; z-=bGSKPBQ6e;E_(xIXP@S6u6p6Veo|n0n^o&sPFs)UCX=027>zd|9CK_pFMt6d3>} z7|GSv5^5$ky?&79-0QH(V`j%;@ut$H!z`58XN%}ph8XS-?llF}aU@4NZqx-TPP|*Z}+3o{2F2^{8&@`YSOq)_zlhh=s>nb$D3egbx{k zrQ4+RCp;$gd{u2nfRk__>6K0$8bS zZJM?Z^L1&BmiI6X9;*>5Mcf=Sn}p4N8tVW!ppKiysBUqj>LHb8%d#h4E^uRl2h>N? zb4Haq$2AB-)7WcDcgTpOlGnQbqpVf-J{HJY-TPQ%l)}<`)W*N10DGQVgvwoN-2@fJ zg5@3FgvZ>blY1eid@$*}k*QzVDFN5|9N_n4PiZ>!2aE{R=fT+{IcY{E&_2S-rJPvG z{fq_-q4i;NETOff8Rp){uJV8{A-|}I+?ws)$2xM0@^<&sK_`~V>^Cd;Fkid4j^qHP zR$(7Z2G0v%6U6~4!J%Ssrwleu9qH97Sg zuXCeQ*;RtHF!*YMACvg7`?O$td)lJ|CDqx8mORHF`&cS8EdTr#?HE;}Yziu*r{PJ2 zw%!r?!D=aVmQ#&`^S{lZ)5yd=NC-8g`0}9_92+*D8$y-h z3vI$I(@uwNtElB%OVdog!geP=@Czp&?AF)ArnaDjl-}z?ksVK}X(Sbx1Q>3F{TWy5 zcI5a5BFsRK4(8f27!(Y_qSzwq75PWEIgMPKzzZ<9m6@;xM)W(}?$s)mS}udgpeDYC{hCGyKYT7vpWL5F}7Llb_S zaV2kxiZ2^un_KU#?bntCjlit=9h!U9CA- z*LOQ!O`Kgk`b*~c;Wakx{mh`XpL%=U#A563f4N=m>&e3N)M&;0UUo7XYvSAP$pN<5 z>;<_!xsXNDQU_F*6SRv)Xg5Kt)d)Anph%`AUO?xvF{0b_@o~H61~~N}NhD7NoqKn| z5o1vY4{@7}>m-+pS82m&!2C13KN(ppDUn=^T`U74l}=4ti@|fSwNq0dEJ2bKnJ>j> zY21pZ)ypB6AT+DDNQhmNf1>fR<0=rxeykFp$f7qQLqb{e8K{>~p zlB@Mgq4ZJ6Rib*08dAuYXn3sP(0?Mv6R>`B)Z2NO$Fa6SF10DN(Jz z=>2zDW3kwm(7a%!M*`O{vAmvbS_WLLjepA3>b~7ls{efu#em{w{p8 z47n7hDjaog?*%S(%^8FyRbjEbmYiClkR~~?CZa{ym~JYx?N0*Nf`+fZMvh!GNoJ{qIyIK8T%!j+9{70Hst?0vRVVV_#-GJ_=3MCeBC!T=g8Q?a*JPPPaYVfC0H&_MF%Iui*l=5ky(W4!7n2RXkdvI? z@;}E3-eq^YTK~xj{-0c}O4{f}?{V#TTn#E+tGY%xQC}mfE~%jEM#*)Bc!YL9N=L~C z%GnC@m$Hl;>Lxq!M2q>*w!Slc4c={aSdVu;2z}>xw>@o^wVS`l8BG(iXj5{v-n}c> zafWb87Ug!ePT3CqhpUxLweiB-g@yK#oRaThfD^18YZI0$YkR8UVMkFJS;wCxqX}(o z-6sMj656R;o5E6Sv$o?J=wGXL5r7hm)0--WRzNOOssVdtCJU2)+wz{jyVlC&X(nB* zleN~Npn0Kd_J$tIJ1(8RA!5WDXFj^*?2Aw3jS5-bj=AsE%pW2s=LhdZX>-+3O1J6) z9MUjBP;BQlS(l2#Yg}JKLYMA9A?k}UPW#v5Hm{2#rdmRmQkr4g{2%mtHRQe zAM9VnpixW`jF-TKC>w?rQ zrP@NP_&>N>1r~Fs83s3kfYaBjVfiuYIuywtM{wwC!_Zbq8rvSN=k#Cm&X!u$mrGvY)d5R3qnEE}ILw*_r*e!iE^xKh{g19z(O+`4dbnM!zt>v9DsGCkR*%S6bOzTp z6cJ|o1%$x*-8rt7lr_mgVayX$U=?sE+S3*$pXeoMfN{p&_PAAGYj_PqY*_kWxHX1= zwy9`?;WZ*rO|n&af`g!^LkptJs`h#r@p^=+Ef%T!l)%5ZtWQ@tzkL8&XB+nrhp7rZ zpK$3NmlC+87lO_Tzxkz9w|?3!!Tq$xpSIJ+J*+2x3B$A2*D=NcvEQ%o4yd)-Mv;-E zM7l&W6L=&P7WTApDK?=E0|^5A&?zfx;`GFfXqMb7yzwN_zdm)*~?Bb3nEJS!{% z)LPkl0YDI%ZV~`3to$*mVi~E%$&M&2agPfTLvt;SbHueM zDyy!BeLnJY!1l$<<;G`=XKxtSF827_k`;X=kYB>qNk$h!uxB^F(cTV=spjl84+)8C z%UzPx351?2l5|3M*hT@1X5FU!c>Hz!x}KKfyhX|qWQj|oaJkHcwR z(#eG^%nCE^Pj{Atf_Dt&a+1!G3R%6tGIGyz+KelUe_zP{4J>34saP{u$bK1B|F4DY zQe2(K2?Kh*+E0`q3;i)y`>;RUW^1G!8K!V-TJhQz^m7j~Tf9WH+rtTM;#OfP%`qic>#lBEuyYBOjw^sb7uYS2(?9;F ztM$MfbC!2b_~Wp>p>=t~ac$TP9MP#Y{aS&!-6IwS(Nf0xPpRWM*!srvK4csh`y!NT zBdFVvVe+*#3R|k&qJ#m^s!a2zU9HOh+0~kU^3S?j=~up;oIE@`&B2(x|B?R2-*OS5 zDtYCSQ&0ET=P%<2Pd_(`U@mCs%X=|%`&?YcxJ^zMsi=d4@zglfssuFY9ZozzY7uIp zP&|S|HX96*=`zypLhyhw06y@$lqsz`X1R02NA$X=QIP2G`?^)sdT;U5zNTbw6X!QS zlSp+&7D+AaYdqK{3>L^qifde!*L7cos=Gb^!chQgS+#Rph9R29v5kYNP-w1VsM9=S z4Z5L68$UQ0 zLTJ5w9x7c7tC^Vv`zifW99jNNQT3g%EOA#1=aym@kI+t0T&sXxTh=Gq#dMjOB(UtD z{Ruxf=n>>_(24v@Q&@q#?ale z3Fhs5u!BXo5x>?c?_lk(-V#!lgyopER4{-V1YdBF1y6h=PyKf^aA;V-twbfYN3!_Z z)3QEfd2r$lilQ=ilWES8^qi8sTBHV`Y}0?q8f_%!jOM;zo7Fy2@G`R3V$v=EG%&Y& zQ-iq?*7IS+Ohr?6XgOmMD7CihE1}hdENwB|t%i>OD797&PL^7)BvnJXge-Td zRoV`A2ffy^ClWfjKvp9v?4aBgrx#R5=EA{@B#F5Plv;1;L8-Mn3&#`lCSoWZfD8=o zaB3gdDr>}Xho_lxHsv(eO$Htn&2^K34U=Tx4#pyd>V&UW(kph8fp5Sac?0}&1nWsa z20jCD?{%_NZK`rY@J+Rk#u`(N&uP!sJ5}sBkRb>IX0R#qKMvc1P6ILqt)le*v4SOe z@c&rBrWZfv*;B`~ZCxXlGTw#85HWfe>NMZ)_#I<=(gUozOu7JX_StxMu^~97E8(={ zGOauMA$50UFrST{FS~KGJLR$d^Xo@q-bSqt+$g{C&ra*#WIq}*W?suvLO)YjZW;%} zX|&$VCQovK2TQ%{eAH@spX$kv(cbw~u<2FAI531>d>MSn3a(8le;myn5WhZ?G)~B^ z4h>`3HmgLUoT=s5{u|Y*yw|;gm4}Zkxo5zkFe1LTedAMHL19SHCBuxNg16g3uOm?Org3=TMT58!*s`U@%TTV3&qBxK zeGns6iD~$qgu@LdD-~VF#Z#11^GN%=p8mf3x9b``5AcRV-WS*S9<=22 zNN%JiAJZO3DW6^#y;zYnVgTfT`Ux7{mPOhakAd@!=LFBk`{==+@vj2M_zma}-CBK|JZOWS7Ym8XQYq*JZZEe=EU zuC0nxoG_CviYlzar`H!{UeO81Z#jQRa(#CFRm9uGd#t>URw8csN8f=`E4BfYS`n%C z+1mwp@T<&9v@o9>Y}DS>8lGKHd%0b!shTPeQLK=yAPn6g1>z}dNv6U0IjmE=@;u_O zT%}0Q;x2lSHZK^wS)+j4u767DCigK3Y}31{$9WYdK#&EjyAz!I-vPzI7YMCY|9#)1 zw35s93QU2>pYQ1#16-@M2up7hP!1MR>TKfOE^R$&WXOmA{CazDVQnel{qaOC4n{|b zq@#ecnt@xc5&m9k{b~MZ5gvXhP--nlong;>{LuDZ$mdH?51+#!aqEP7UI!Xn@q!+! z1otb*lcm-UN&>{r--Ak3dqF^!HWGoe4UE*JckOav>w^i(nx4oQ4Y;ueeSz38C3GYB zdV-^psM-QT2gcYL)yezXl;v&QO%2KWv81*arG>2d<_$Msu}39vuo22nxVzWsF10$` zrPglM6WDbRv*FsF5MufzIwF*e;q?`xh)*hcY%?3_=zbzti#sQq=vnE!ac||{Y2hJA zV<)kAg4Dr6XvU^p+G6P}ocZ+a_lX{UWZ2@m;fJ(43Or4s+shSaE!R$?fXa0)Y%^?j z301P%`3|vRpaWMNAWJ1|#&QWy+kof>h~dZ}FX4$Djvt`z|(s0 zz-$y^z*^L&*eZ&wDUxzZJ@Tr-+KD~tk{Qha4J^6#0Ef{)?`NkgP!)-i#ibR4J~L^y zxtXt}lFh7g$@-`+BsGQ7n7~DR5bU^v2G;DM!H~4StCO)8@2WViEAv;~ZOB(T$ zC)U`a>VonTyKnW-yEI>*>NlH=8J=67_OH5XBOq6QO3rqFaN8u)K2pkLT)k4L^Ddw9 zOW)bwT<`u!&JjEbS_^r}f88JTQYPzjt%xK((9ZsxV-o^2aIR3=1Jc)moL-34SRW_W zA-6fHqg8jY#Fv1SfCem&GG^3NqO%*p{vUK;dF2ntYe7)WOHh91;?WW-t1QEcJ6`tW zz`?ZSbm3kCj?K@z$RvKJ-w`HDxg#?%>AQp~fCH*LP9;C6!|sG=?H$#Fp6_P6(ZCB) z5Q5-f6j>MHc)gz|uOq8nTBG0?8TU$lIEZl>F@&unX!n_=;kB<8DAJ@27)SBVB7%mr zJa}Y0H@HRN-2p8QCF|!LH0^-8ORc#X!p!Sr8C_OJPjC!6uc6`{0`!G^;Ist+H33)w z_fFB`{X2|EejTvQ*DMKGbQ=`p`Ze0Nrr8Bd>L75f3I~8|Rmg%NA13E?ODsj>S&20V zgD`*;Ru)qA5=)fmEW>%GRYF)l18Y))QftPz(Aozpm&n<&&!T{9RsW7FMnD}AZ;rh5 z2*3NsuRy64Lm2PJPw1C{tl7kH6!-U1Ykuw35f7@;P@Cq+-)tH3eFRFadt#z;G0+$+ z+XA+dgsVx6y3jEHDw~iXj_R0r66;EuK6o~DiYyoRR}=i0ZpX>-Qfz>qAf(m^Lukx5 zZca-Jf2k!{W2@pbt97lBU7Vcw>>lIb!QqXl1bBiuQ-47uq;Uz>UU(dnhaqTXB{yXz zon72mL;z@DMQ)A`pn*TN)a{%vfAQ7x@0wmU!K;BXPa*|qVE!Z;m}Py9_7RTBHRTZ6 zM}jzqU2Sx}QV!M6{<%miZj2j~D>Z%i4%}5bMb(AQMHGj0hJJ?VYDu^O5H6q)_U_ZE zUBT_o-r_oK>L`R`Y!_H7QqT_NjpX=!`r22?-(!t;k`wK{qitTX!3W>lGGjL z^75PWY$_asYwgW5-11ckenH)Sp%)k8Ipu>7!%#NRYK4JT>*tMEATP?O$|9k-lBbpt zJwdCr)KNFEe*LVo<+#CVb52Ce+;AH6Q8UZ@DshC$WaSfMUDqmpj=F6Lu4YmMejZCR z6mcF|RY)zzmbLI?cp$xf34PB}{Lu`5rLNqtFv9x=n|^KIEw_KBzOc}%ui zi`?iX_vz^0Tdl0gRx7bI(D1KTE7rd`HXi@5JuaqJmCweA%N8Nrt=1Cgeq1#DqUsdj zd2EeY3XHFx=(1O! zwY(0Wl^!2VB)#>&Kb>CH&T^~tOxGQ3rgQK{a)!&AwMO=DvQ^6;vejb1 z3TQ~iWeLX&a7ugKar>BQHzLq_kqr~bE3z7xu^aAwtqsZ^W-Q!+a@vwsqBzkg0=Uj0 zJmZLnEG@1LL*$&dn?CFdYM(CfNoS>hm-WWC%>1{7k-1fvTo1pCv^hJGqn$ z?Ly_zl@Sey4daH#aSox$&vRZ32mJ9s&3=juS&?dZwg*+tbhMy}SnjZk4>lTJQ>?W< z1Sj9)dPbxe>TX0f$BTeUp*7RDjWhdu$(%i9zetvN(*`j&4rjE9%H_-=N=8;e#GlTiVEj|d#6O6-B4b9!Q_hDwx!}3gHJ!b0;KhQtLXbPOac|#1^!wE9 z%^5LVkOiHT)_PbeM&8m1P_p`HN->tcf_v?tiW9PQ(V{Y3Y+L*6U1gHzMZ@0^Mp~O+ zO3KT0`pxJdw16^t<>rEiF^*w;>gIspCb%!#GK`n+gcJR0|rR@D?Cjjou2=c^ez)x`#L}kxuULSmKT){b||i zZC=QKk*z+12c;jZcvM^%8p_KY_L+HEN6^Wmc{%YcJ}jtcehY1PQ7ExNE5FVd8?Rc# z6{eVGm}e;Y&tk>81ZAOene|Su!rU2SU-1NYf&IjLox;rqKKOi+4XmKFXE$X&!EAxN z64=JX=h#Yi_n4}EeyHcJGZRZas*MqjVjr2R2M;a7WNR8_EFdmVQVrIjLQPcqKiR+o zf07M6Ko0%C*}(Pl%tEttm8L=e{VP>!;CCG3^ZbLI-DfW%BPX`FQUO^B*C^ZR$i>7& za5kLYLqxQVX~2>mL+k}7A|29UTL>!gJc_kIpx!W`3lHJu9Wa%5dA8JR~RwJhW-jrT{ve;3J`AiY1H_gldWbs4vKX|dBSEmdAr=GsE)8@!dydOuSh;da~m6{{M`Ay*1G3^ zs_3r$_%7WKeYR(7Aw%N1-?!~8)FWOaS0pK6z+SFSc@lefA860! zvj)|L=?<7cgzb?xp3=>UFkMp%Q66n}p?==3NCZ`~DL7zrJzwy3w^BnD=}jMlZ|ECO zDxZ7D7ma(r%)1}N!Q4|L(+wMVtPpweqK2Yb70e6Gb$MeZy?e3&DQF z18qHC4~u5{v#ljxYqFYGX~Jk&<`>~Z!%4t0Gx&#XRit00dT$MyI{%15*HBnb85LUM+c*2z#qXzMf zyGOESlUgs`^2#)p8QlTBZE=ffp@@jsg~T zXoS=7RUsw~NpWZsI5xUYMQP;RwJTLy3UY6$={7UVX4iGAWWfl?r-6!IaGUVO2F zme={sN4IcYhqrfw$gur{ecDryIK6pv>zfxVgsk9Eev>aw8`shT1glu57{`dw^Y?@$ z;BAJEEpT3DG_QQ@pRHCPNq&r*+B7iiGq8UGDm8LWCy#cZ-~jf!h2xphquWSx$mzrY z*c!ck)AZds zfOkyEyG!vp^u%}9??uey&idjr@pggFn=jVwIg#FP*w19k9u8A-PMHFpnNdG^r!{Kt zV2JC^hn4Nc#tfONb@hl297i%A8Mfo?^GKfFZsLkzA7X1D_KfIK3i?XF+5G>bZH%l zYu#Px5fiUa-OlG+@v^dww~MsO4n-Vo+_s`+M`#y%WlNMu0y=)l013BYO2Ns-j}9g8 zaTkrMNk-0bDmF35C#kWOqdijp;a=lic(ITw?SnaX5Vs8Z#US|6sJSNHkqm!Avvehy zrL?}U_+%+9^QJs0hUsNGm#&xcYqm7Mz=;}r-IE8rd-9N%tf8{a+jFOHe`ZwffI_6( zchAjFn7yL&!?UU8lG?T7i1UaaGwBk~$2ad;QeW|O-G ztLn!fQC;~j!RnnU9R~j;SWR)sR~h{hNy#%hw~u!QmJKHPEk7>Ql4v4R9B$k#SnZ7U zGs7cHZSqZ_u$Yz#;l7RBpqntJ6st&CD>I2q*&jbQ zFT-I`}RJL{9n{W2$LNuzAs|zi;bm5NBOM-cX z=~COunPnmTE7f!^S9KwjW|Nn3Ln2JA>*wf!VAa9CO z!eQiCqm;!eNnci0sc+m=KhRuc08P%HM}@NT0uQp4Sv}}OHl-7ZC+G-xhG#_XbeC%6 z3Rj|Rdsj>;Jnw_I4qaB)LTaGS$_)>6pD(^~-TPYXoEiDZTEb{*BMqGaBcwM~R(F*;Cn+15v^O|XYm zfGieRPk;bnUh|Y{Br|;vaeFQ9^a?1SKt$jRUY0R0zz_ZJXkewa6$;V9mjkh>F z0Lwi?jCuZ6j^t)#qj=u_bFO`WPwq4J+2m1Bv@rx7Y$lxA?=zmcCk*0`^UF1jZb;1@9m`7G zWKK1BCi#x)(ixUrFLdEU*PjEV`J`X9ZYB%(RsD#sq|=qXdFN2uYw(I-t%!J`(q`xH zlL+rU@!SBN5oyZrH!_(dF8Sfw)SifM{`YG* zDAxnoiK+ttN@qMu{(er(l6&6b@bpf8=iM{XRbXlZL!>GJ<2WfOy^?V}zLAVGer2;O z1>r4`I0fkWkaL~l>iH2Wx|j8tk$DSj9&4_re~jZu^;rWFfnqDABPLL_aw1~%6d~sN zdRFfF^1xCAmF+IF+LcA{u3A9Rm~!A`<)C-;;)T~2+0r)*UbfF;6$l1>;q`=kRa*?@4b`{cFn;$ zk}>ElGSm$C()}V{uvAcnJZ+AVNe95xR{~CkpH1oU3p$CT-%RUUjjyYO#1lUuc;n`DcD~ctOnOId?y|{H@0SbM%>i_E;@5&KJVh zg>D6rdtSLHb#&3qb8sI^O^T1kfu&<|AvPmzFf<`nL z7BG&ddodO5@KNg%u{%U5ESk5yY=PsSEPyF#VE!A`s-ifjq<=N!@3J?FdGIo0Xt?^_ z>a40>1BGErK4=*7c?71V#-|`cU-NyZr7%Y4?d!ZGIGWeDftjcy&=1C zK4MIKs%1;4tZ?DiJoFNO+3*}+wJRM8A)Z&B_I?p`eJ<43j@CP^=jK{>{y?5z<2Q>>eu zb^oUA>D5)Vs^#W;zrkW3ih6{}2LgPug6#i@sRNgDuW$-OO8qL}HvzgK8vNhNbueVc zXe!u{xx9dCHPgVs|L}-Hvm&i8o^-|Xw3&OW90&Zk#~i}-F>@6$o8Lh#uz#={?0G_u zZ*i+ugO3uYD<7Vxx0t6j5mkCF%vM7x>bh+NBz>oU^E+397iPOej>%^Q_rs?;uFXDhNPd3Et12ugnQ z+ay3{5@z;=Dtyo;x`f@Vr$ZDekN1=Z6S{91w~-4(CjNWa{Ab`TOMc1QKf7g0Z`sw8 z?Q_s8ahYy_>>1$RZPWm?-(X3eK0{O(Wn6<5%svxJ16_+1+_fy=T1_?GS9D%r!)SN2 z#Eh#pT%jr47qX%tk~&OE6%Q5N^u+K4v5s7A8l|kGkR7le*TCDC+e)8bz7Cdq$eP>i zcx4A=i*??ed9QXzEQ<^Jtle*B7Pzh;@EKy>dT{6*w@)pUvC8rv(dWKE1ySe~(E z83tCnXG9E6B)q=83F*NSsU1%5~)ZX|N2(o zyG-N3;!Z*<^^R{Mum-pGf$dPNW`J*KENl5i6+}CTY>AE%ZYJKLMAQx_@zWDbN^9AK zsll$=;_Z-fWF}QhB=Qlf$lfPI>d|i_=h?gl^rekjX0N$YXxd-x@kYXfMpDRjzq2Fw zLsr4_LxB)ybEs^hmDFOWy&90=amOyqd?wiZbpK;bYnnc4gt?%a%PhAh4{o_-lo*8)hO?an)}2 z-BE+-@-t;i=mZS$3B;2niObR?N>1P*HE@}sFN0v)vRNjz{$)%sIpy9f(?ZObiH)WB zY&2M1C|kwBMyL>Af~k~-N`MJg&UaQ3+WtnTFz_pBD#ZJDZ~fBuiNcZ0uf94lb{ya#-mnYeBDwdi&-{*i zkY6~RQP2o6lcdxuk-y;@sE($fN7K<`$+I7|Q@^JswGvl`J{J{q21XtPE?bkxxj zs9+cX&_ID2`+V%}BHJNFHDW1m@3l!xu*LQ&4vDwn!&G@56RUBKI2VqFT5e}ghqkbD z=9rc>V&s^vCY^W6+l;k1bpuu1c#JxfWDa<~zOkzvh~O@f>NVE<^u6@L+FA3eRYA-VjsX=4L65he$_Bw~RK*d!!f#49)IY#P(5N2(w?=aD{)uPoc+(7EnAU z8%*op^1Wk5rUrgZ9@$Ds2ZXY%4}8P?XRxsJrrZ~0c-E~RKG;wy0+!;lN3AE9iE+bp z(yx6{LK|esqP%Y>{&z_5>3eRp$z~P!G2OnCFFSrK%ZMHR9!&c7^Uy!fIke;jRv{35 zEI$V)qOncdw!xa73J5A7$fkO!Y@*~d2w3NsT%hQalsc&HHpnqY9a+KPQilL07||ub z>%dI^KJG&4XOycaH@3gsC51VFGEeKq1TS=Bf}ghKg)Par3PmgImbYU2R0+|=9DH#q{q3MFOaSwkKd4AcPwS)>K$NLL;XcCT{DD=9V`rYl@bIQK1>!s< zbO)-yUUQ* zvQ_JoueE(To5cEmarfqNNvC`Nf7?`ZTFf@BOe!ma%(aDsQjB-PuT(UADQ&Mw5K}11CKopSWd)b`xz0Y0uoYVRK_50ob z@OYH|;l=g&T-SSfy!IN2| zIxq>Ef!5D$0Mf%|(DF3ZUOzDVXM!| z{|;N#)jQE07IQ>=QM2)Y!71>+5@zMR?!9loQ%g> z0nkt=E5WqFopAQKT&Waz1aQY#nU*IlV;W=K^JcHhLT$Sk^~Nfv1%ENre-uAMW?9#q zreLOomwQ5doFA&zKg{sxkzh-(l?fFR@ZV<0MGW19;`_At60IP61gMngz~y0j@L25h ziIH#mbia`lSwxIU2eIz}ZW^nQ4h2Tgo{bmoy-Ru3Gp4qn1k@*=BMxk%q_ftTAIemmqT`6a|#4m77$eT$bx3D*N4j*yvD8BzH0|YCp^5^TXt_ zG{c7WwAEOX9md|B8%O;7rOWblFSndnSa<=?imD1KN9I{5CKvHL*_Q3Rr5PpdIAD$Q zdb0Qj)#s4V`j;U5*0J^vUxge+EoY#MKt{MQoV{7Ww!ajcvm}oEfCIOho4cJmfHBV2jCVuHcMkMh1&^m& zj81xURB~VF3tunbSdy7eJ&pUJyx<(X2msQI)1xFoN&8sP0(#tw1MsWj&K}_fw0O7b zWL22BaUj@qg5Y8%^LkT`^hnhPFyPCvQFsS@o(Z(m8NgP{{9ndQ-ejX9 z-v0jrTP@VTA1(f8*lJH@jJI-U8DV%x^P4@yd48-IZ(FWy629Edsm#oFGUVSH9->Fu zB4Yn2x2_+HJVAA=06xKSoFby^Thc+37Y!m9==KN@`&rbkLlZMxrhS4@$vx9P!A|V# zl9t~N+d2dxr3EAgMd%4Qx05GZlO8B@4>XN*f!>X0 zGW6+^wk(E=WRw4WiSq1Sj2J&fkqUFkjOa;88<@=<)i7USeSEE#k{|-Pn@<`xue{iU zPVIJ|wHNX8`d#cbdtgy^aco{e_-H|vXnwwZ_~C3Fy;aF#k3rE;j^@SJqh0>n zVc(>b_gt0@+v1lUYXTMfq2~A9fAXReCVhAOCTBF8;tX%~y>s&;_G?BolYYO>z9O09 zjMiRBZOvfxXd5?`;Y6JH5g6aOm3D#Xp}Hnvzw$tMv}Pdgi?ZQxw>KG$8f(yFG+60$ zfZq7Y=T0v0qtrJRY8mu}DT!Yf#H6neQEpf6w72zlG_jhCTC{Hs;bBXuLs}yRp@pKg z0mOxen}81ASi%+OHk1x2IY$sYvtxY4cT<1#pi;DpNEc4h-sTWjJBp#J9yC z;VPh1SvDMH2dqli_Cwosz5_)tHYZHg^kWs2Bp(ijyMaSCt@S?~5fW`N6co&T)tbKqLMqJ+yrFYEEw4`W-g-3o8n%!%lr!5G zK4RH8u()h(_7fobp4b11f?^8l=4|gg;wDg+Di3veGaIrL4iAc9>>k-Gwh5VK*^1?! z=xX{Ubu8S5ViBP+)H+j*>irTW7)AtfuY16!^xnom16M+&!8FZeV*i?FKs4!?(o}lu zYDW`yn|}dFVvL$cS--5>;0S>>#6w7br>&-%9EpG6tX#p*oF2BmCQ;IhP7z)FX<8v|V7rFo}20BN8&IR?hti0=izf32muUJ*|76;u+v9{nbVqk#H!?e|NcfVK(mtnFL3 z%5czx1+dk}N*W8#Oaf(xp?57A1-|bzztOd#d}GHcINaFw3_z0ius$u30Ujkl833AX zjdX*4TlhA*JN-e1)G}CcPK}ply(mo-d#t|wMnsVrrM|IpYbx|i6t$&5Q%LMxpZmJW3G<)3=rfYE9ITeYSTwL>&S--obOH%z#_`zd8< z;Mo!Xq2w(YP`_o;l3Y~qWL&X_>LxW2Lx0t&TVAFGJ=0XOg?7_;J&(M4IM{!PiY89> zT(@0=J`l?kBXja_3RcHf2wadf)bMuEbAApjCjwCb<7*$aA)Hesl`wB- zB8~&ZAC6!gVg0R75mAD11beCkytFQ=ESbabqh*X$s~A6wMw+BFJ-H?BE{zx+p5Op= zfcFM$rD98&HtZhBBqh1eYSdTLc!-1LJuENj zuz-Zy*+oQ6P7zA@RrL3;RZdtX-?=En#zXR=(gl!tMC&F`StcJpmR-%m&{%Fp#c^_v zbES%TsVQ@$42rDPl#ohj%Mw{8m02wthfJUTcm~&24M8n7Jc+qYXZnnb?pTWsx6P~Z z`nj7Z_Cq3qW9r(x!C>-CRBG>tJQgasWISJ``$R#@l$+6JDTV60&vf}n1s zxUGd~s3fV>-AC1t$Z&eIMve5aRW*5q_}*g?@+~?VtxZrN`opnu$fl)4Wb>Irs@+XN zJ5G)ViOyjd`kc$Jg->T*>0&CjS~Kmp#CI+F5fWDbPok1LDGQi{bPHe&3|$k-QdYDr z!0(#cUf(RTDuGdtnD8bI!6O2r{7=6J79}6H@smbMrf0`R&!&|ufYEA<1}}JfO7hK6 z=YO^a-p}Qx+&_sEN0rSjQrs;!D@Zk$iZnnN7V8cQMgx9SGd!@e_1=h@8bSLqa>qyY zT2J6bZc377dy95i-M8I!V?;l)f)q5&NZS0oF-~-s0cq=YZ^!?{G#Rvjgc4>f3l{^{ zYA_)o97rp~_(l}HXINC6PMG^F>_M786@iQuYqyx8RH99zx_<3pUzZ7q7=N5w8utIn zTCMsYSgTRk30>DTYjwq+tkt;U%+r;_IkIXGeRg9oVlk2T#+HP0&JsJfREm!+TvM7s z)oKzd!<(rg*8ad8tYDdY6()^s4n0enwj#Vigls@uEz4+IJIz{+aC_dJHxe;4TW0AA z${4zzk9I@bLP?`k3!d2a?aL_8jIT00eC@o2bYE2qIH$bwM__p2Sd4xFoaH)GoQ0%fw=}2n9 zGOjNSQ`2JU-M_e8$0CgrIa)UO<_Mx5mw}Q%C3q8@E7m z7$T0*;F!o&b?{Fav|sFF3%W#B5+}aH=tMMutN#HxHZ({IO|ZP`!lyFfeqeeJI%$lGAZ&HgYmTtX_gO z1cpt3hF`fvX{Fi}qRJ8$ruBG%8cBOFk1eKvv89mhySlqWR5Al^lL|Nk!`PGB=kNoD z>wd<1{igiYdGDQpr|9pUfnDD_1FN<^t8@`0;&)*qfiv)Osh9Cibm>Mk(O>_|;k=tc z52TJ+P;VekY9E@9H}Hmhd&d2%f#JnU_-r9}Ix_s!Kq(h^Lx6O=pkVXrvRh{}n>zN> zcPMR?aDSV0zI&+Q$6U-}kFKmu3S0OZCSK{_Vi*V!ZAYj&TFnB0dBLb|{N{shZ6LP3 zN1tFyi>v1FBF)~TR(Th#dH1~JqaAeswOY11toqxa-tV3w4_`gveD2i-OQGpx-p@6T zw+US{C4SlkFTtdTPW@VJU7kH!4@^)-waZ1v8jH$tU)}z#!QYxA=+c0;9%Qm-fU_@& zM#MQk{EZgvKoH(^qx78RB1)zOmEpOca-pU?$y%cR5Vh)D{;F|dh-Qg)?gL$SN49L$ zX|&THR-$w^f#>L*W(~0e71CQsAR%a=Ir{=NLhXrzDox?}AE>_eEJA8yo*BbOr%w2d z#>g4FLp$N>E71@ieW69|b$8>G*!|w8Xj!&PoM9L1sVi0h%?EeUz3Q2j0bhqBinwh> zC3=q4U4rUInpxB&VKA9S3?1#@t*`&C9H$cJwg#x`A2OENy#?ZyWZ*0#DVO#9;PPo8 z==r*z=1lJ{3A#zY(V=qQUC?8c)bwA2*iCYn0CvimtSSxAk?#AF&}O(oK?@!bWFbq+xI@(Sx>m zvEpG5)siwv<6iaaG-z3sM!EH_cGSQ9|G^o!;Ic7V@;e0|b$$%ToysmAh|p9lqnC5K zlMDWI22LkC)dc45t8+G!ZHvd-!?2a_xN>g{aq=j;nzy{gxig2}B~i9m4fS{r=lcvX z=*;`1&UQFJ$sYL{a&dIMLpVR@^ZB=|*A?az$IneNSp%QlssJN>COPJYV8y#)D2?G7 zAp&z?fVH{?I#e5;t{ioSfU(b}o=vG}y%W;CM9|t-o1PP*4JVY?#y#-9GHssU0(={s zKIvwic9{ev8ZcKv!{~wbY+JaUf5?t^7F^d9GBA_`<^bM-KMrevb<;t4JrEci$52gR z^}II$zB#>f zUN&EDY_l4jCq{x{3&jK29P-O&Z5PKm4J)sO>ugmW$yCFlhuW|QVm=#1AepOvXqyLg zv}T5cwow(0C{*VN-|jgQi$3>OB>QJJnm zD-irOgGC4~zl&BbLZTIevQd2r5)NGaI63{3hKVHj*0H45;w9v^>PU)+1&J&%fyT}l zT*^`jFNIzDhJU#cAW0j0j7mvv4hGoOtk{0^SC=23cr84Vzj~Q=(W|<-!_V>qZZ2JO z^F;x=?%)OX<ZIQI?c)Ac0-5xY$v-j5y!TDIrQZEH%VVn-$|9(%5I;>k&m*( z#}i!(V!NNbllo2?BlS_AF-ny9+~++1x@BVjkQ^gtg*U<_bn!p1u9v>QtMnEun;-x_ zD3abz@ZV1?^)G7T>&8PUDg;}nXhd+&89Z_pURu9nPTZ3v=Cj<-%>P&a;KOFo;5W4V zTn^iHLHP>yTh2h3Ut@II$b@m8DkSMF0e0`%g>i+3V(0MI!x)KUByFBU4CA9KhU?rS1jds20 z*D)3}BxnSqVnfO<>_HRXYi_29A~WPkwttRyee2|r-b{$`q;X&caxt2S*9$%*yK;`o zu{IZ%@_uxJ&hVT-7N7w$47;r0((}}fBj~@AT{&4%&i-|2;HStx$*#M9Xrox3`fIZ5 zz@sToi40Ps=5k@H{@ot_W0mY>a~AvQFa>f1caOQSbS!v|Nt`nLS*Rwr`i51fd8 zrhs;Cx0}PAxcgUZ*Knug7Rn)?lY^Hhla1Th&UGi+a`ioAjcF~ZvD;W?e5O_Y%nlW- zh&BniZ5hTmY=@;y4gY?k_cw8HH!ED1G?wN+4BPDTdZa0$wP4k_Z3a79bN%tak1O$E zd@F`))oCpsxF3pfZN@8bZAP0;a*DSUY16&t8QkfLykK$KKi2YZ9^3U}jNQEsemc$2 z2s9-$AmPXYNL)M}+7P)u6_EX&PQzV$8~U4t@(o$MKJhZdJNk=4+FEhcWXP^aPv*$L zL%v2H-}HC3YZIgmnd`=EXUxq(GpAA|5hl>TJwfqS|153wh>Nik3bArTT`A~ z%^%rzB71MqA5jw##4?UNRCV6gYa8b(lND9Q;Vq@+qFnK+q)IHS0?^Bv5Y{@ZkwMgt zq$kwlHo*iwdN)!O$m1skXQN83D#m?(f4xslN z9pHUEu`!?-S8_-t`I343Y_m@ibx~QI?&RhVZq2L|r>~z?v|bGpdb{YpFC+o%{#{ zwyP#&rE|Xt=N*`X{bC~E(~jU?>@QC=o)Sn-5Af5bag&m#I@?@`;JsBoyojl=^SRZY z&|Kkw*PWDy4H81J!4XlaA>JeD9T?vJI|RZm+Og_1XMa@=cY|Vk7=H_@+V>lhDhu#k zn@*E70O*{b;Z3p&=3u$u1Z<(2fsA%IX!f4(`gOqU-7tpFlaBov`50`UqQ6T#qZ)Iq z!K-M}mD{nwtsT`;olO6@cYDi|pGZOL zHoA&POeg1Wj&>ug^nDe!S?=q3nwTGCk?E#T-$PU?MD>(r9z9JQ6C5UJyLE|aXfiwX z3YnvAEk`l)r1P2UY>s@#LdTtY?mVH zo^M62E%WD1ZZ4&(?y7?feR3IS+}3>Jt=fx?pI#yyzHD8J9Cd=Q`YQ)cYEIqdM8Dd^ z$I52mWZn04VMme(Z$l6z@ZdzUZQ`GZS2CZP-qX?Occ9gZFr2=cGl>F+7aIBkeP~y# z;2`xoTe_l?{ut8IdEhcTc7SHTI%zMHvAO$6e@yn%^8UCRolEDCyVmDudr{9 zD{}TvOla>l69|)k5?-OWcJNF@s|ljx%G}auhQSi1Pc1gu!3jFp4J~;h&dzi5CvGHr z>-4Q!P%tURXgq_KV&i0z5pTjOo0JDF!cM_Qj8~zsXgk@`+8W_nXib_R!`km_v9#d^)ir;M3;N$C*Al-}M2ajQE_hIx%@fIdho67qojX$i9%Nwb)dIUY0#jG1Z13;bNJ7 zI;QfL5rd)ptGMsK-Lw49XVE?vvYnbpF)K%<8jnLl)>ssw&RGu=)?A?6oR6$p(L4=# zHET29|ElD!K8C;&;?&U2kU|pOS(=C5&``v_>Ey;}hZ?|yjeoWX+QzOFHABrNt9w3= zaXg~VT9P3X#8uB@#-eVaWj0F>4{zMjzY=@-a0+U%qTCQX4y!tK^{4zaJSyCo9y7`6%REPj-RCY{LUPEkA+7WwFPV*15smTdD9)!;*HI0(LjqRKNC*>7y z&YQ6(c2?!di7QukX3#sdq8r}qAhTMm6uU?-_3pBB%QtYPrF2t0FYR1&vKeOIL{Kw3 z{Ou$cjKk)V9*4Gm`VBK;b+Mud4n>i|R@U5H=ORDl*`wZ0Sj|apm;23WUSYRd{(}1q zI2Kjk9L6$-8}#cA%R^LVq)D@IWhh~w`rOWAdeKf$bRb^9rst8IzNe=RG}9Tcv-TgP z4=#%vZci2xgEW|h8u{01AD9uXyh!Ag}k}Yu}bv`{`Qf)qW`rNo(jr z(80x6RXkwFGKDqQp34I~V(StcuJ<+Kyw&$in&Zcs>t7PJE(q*o!fNwKK2yBWAe)C;@cT-v*u zwcxXBs6|A^iup}vNyoA+R7&KU=S@6d#bn)oy{*SRsORsXSIdn|a1xI{5$!^&BmlCi zkOD^yiz#rWKAkVT{OLE%&rdWvyT~wuS_sJ(mRHwLhZUa`xb|@)^N-c_(B#Ky zoQ`p`&g_YS!e@4FDlzpLmON@zXe99c7XJRJ`z)JvsrEZnoSX}cbePY*pryj+>h0BS zhs=df1ph>PP5Lj|>y=Pv|Nd@j^y7~DrMMfw!XCiorKhe2ZYcv=e$}S14yc*;c{|y* z6?pM9?X|YO1&TcqHRp@h$wNoEwrjT(#Q}2PuLtINvb@Dx$?W(yv+u>xUGd5!2aG;d z`&t^_+4#c&vy2DS?~LAN$4C@Ylysa4y@f9m>{s8Q>{b8JX% znF`_5U`=(a7H>N`QC8oS_%!*2A05iqIuk{&_??d{=n;>zWvf*Ujn@NzZ)?a!m8|Z6 z%PaMC6BT-s4BF0QnwP$P=*4;2VnPI~6G5A&A0?&AHvcVlS(pjN^UbDNRyE_JG3ct* zf|=rdN^3+h@=DD zYqdWeDZZI|5#V0Q0QU-1CGzzt|M}%(9N)?2?|627lar0BC2K2m&01MKacW2&*t6$Z zUShdtrJ_Gg;?l_cMOFeqSnsRWYUqha*oJbZb3czlacZ>c{+bZ`>P?q!SiMKjv*JBR zyG6EFNwc(#q^(EBq)9W^6fIc&_NPnrCCJh!7Bts#KFZQ*#`?+of}$5**1W^epC|gF z^?B6;6~bR0P%(wgm<*`WREuh;Jf&84glr)fo5wVrA_v}MPl?ZE7^g6?M#4r_0jM!u zuKOs~H(7Z}8Ht4GCAw2OQHIfwXUjqFHuj*uHJUcUT}U0VVTPh9wU9L4T+TsXflRgy zkm|5KybqIoHQDTvGEAsp3*;htyj^N?Z^fXx*zm?ZN$`viKaGV&dx##kbZRyn z=QUlhML?Y2hJyiuqoj>v+qu#)hyR9!Js5~3g?|r~xcBpS;i&JNY6b*W8sD6rzJjN$ z67!#3A=6aYupHDC_JVf&Zot}1oHPW7{#M*W0=s{{>;{UlO}XVnyyEt z&m$ALnEi)7{1VJ(LB5z3Pt`WB(pv+R@V0F85>D#Pt5Y?V-B-4-?Mb1W&~U@aZSx%C zzAwwDwSHEV?xrunzd}5|h!0AjX2bwmtQo}v6K-?Y0(O)%@mI81-Vn$mw1*O07QORD zVRlEwm<34paBQY&v16Q>`(<~Qn|+~Tp3504s4O}{l7|%&Kwv;uy{Eu^IkOvnThqqm^v)LZzFl*wbWt5K@ny`iqkK2$!){gxk&dX>ZhXl~# zPh$xf!fL#Hmy*UDzY$L3p zAi7H1bR;!K_qUV^MYDY8umWyP2)auW^^+^`%|o__UVDYn;r z&zX>w#_od0j#rH~o9Q2BTw{Lg#*>&p{RVAu)+SO4Ar~N`pp_VQxRPfafNSb*jGn$whVRkxmC^&Z z#H_Yrb`q|UvVzq3h`r2Ukv}&;_H}m#L#Vm5WQXHn$vV#|`f7|ZAAeWyy|`tdIcEOi4-;#V0=FowIP&z1$tp=O~{r`q@(OXGJK3_UwwUmX1K zc~;+EGL};hH&(*`*vvImk7A9@tQNKN7f_Q+|1G0jKjv#SriG^90o{fce>J%NY~R3e zUFy7AY@ab9e3~(9N@;_TIS~g4KpptNxq()i*zn&Ov-SZs*iPZ-OQ!g`71|_nNOhjr zb%)&k)_u`Yvi4V5HiGE$9xolB5+IKa; z;9ph1bb74ylpx6eLj|6&W4=x?eKs0HjNZMMGqvURgGPaFuXZG4N*VIiN5x(B#U;_T zSaXj!!OYK77c|6WC_PM=zt}2~znj-s&fMCQNhXH>7$)dW)gJfOOL&m-yIy);Xev4R zPyVc{ufEZ=7P%N|T2THQXbHdP&u)u)T$gyA>WhI6<*NQh7Ed6XLo~-)Xj|t>!lEvl z&PGyl#+oVO@oRP7Jg6j(v*>W-?0(K?{|ul#w+~MrgPPU)67`MY9Gb}%8cTH!CeB|4 za5wzS=cPpBeYio8Y)jP18!A(O_;_8>T+=bYTu8Adnaw2i#56{K{445fOQQADMb5y9 z>#hBp4+>vwfQP^-zj4vYoaeM)-b<_x!a2D9-PAdI&g+s~_@g3htM#6A4%!#W@~W-| z0N}*hZQ@*qRGO2{SM^Xe55kDa;XUx2Ql9qz+=#kdym}ma<8Q2E3Tb}ag97ZT^)rLm zw$~RAueoM<_cV$%Z*Ut;KblGGLd4ch>?qn~b7yk5ddO{tI55!6dl5eTL4g>6$j5l- z?Hl59x++!MeSMr&*!0@?9X%dLAxl205)n?$*YVJrWkHI`^<(j*c1j8fT{rx3EopMW zr8dxQ8b7FNqggBCLP%ZTRQC`d-AM&opJl3R?U>=3VJG`7TxcM_4HaMJ>FG zslxCRRQ)}4bA9&#qvY)|FC2>z_*ex>0dFc9?fV};#17zlj1zM9Z>?j+H+q(I?Oi

    ^AVK9bY3_b7;FYVqJfblc^E1)Fmr9zRfdn^R4TF-JiZ5$ ze{qJtUv$@U4mTI3kR$@=){`|;k2i7S!X&AZCQQk>D(NT&=2%r>-ywStF^L|i?b6s_ z!Jy8-j}2Wj0@%s#$KPGF`cm&_+vdq@zyEOPn_ll{xV90gqEvM{H$ba5rA_}MzP%VK z^?|Gq@j%Zqm(Ij4l6S<{#!tz^;5r;Dth|#Fp3M6bG8;{?f8^TFnz`49VA4U9hA+;` zmD6Z|u*ZTfkeft^{8HR{9D;pp=VJ5VG%wv?3kUs`b}1f?ST;E z1IUAw9ZLahSUwU!w-0rB)Zp`rbN1=3fr3&#(5V8L)my83RwabyQz)YYNbMwDk&F{4 zPfCVeSQ0a^*_X)ZeUemCvAq*w%na`Ly>fneK9hXm+p^Zu8TK0Kkn?2RO=4-Rj{&D5 zYqVFY)^ra4Xa_-$$b=Fz&=-Lc>b- zU5_$;`W`Lzl#d=HT=52ZE|yv6=+;nR1|S&xZLW-dZycsfva)QdQ?}inj5zT6V+P^g zYOGl5a;Iz2*HgIIX11&S*LQ1yMelml;*IV2psmRagZl=5m`Qs_vv@u`0ky(_FG$^G`~xgsy?;Pjx)Wo=(onIHK%yukE;;l1PE zm1O*7%gL>A&mSE!Y)w0B|74SC`I5uw#hnjd*9F`wzqBFx;+>OU@vmPy^!?^cx3mMl zB)zjvP0B12i(_-gv^is=GH#=+x^L#uFy^@`ry)i&vsOG-B^_o;6&I*8K~!WJ5Wbqa za>mFFo#KD;UaO6AY}c4t}#o z{qP+VKeq8{&4ZY9sLW99+feDJlnKJNq!gRP$XD-kxiU7Z`XD0KdXb%2x79P#TMG@0 zQvaiS`S%M}kS@x4UK-$)wGi-o#Qtr-1(lST5&jMght*xX_fU|*T7U3yBIt9ble)OA zyN-8`Oiy;dD$5-P4vz78^Q&Jx)o;ZANn*wRr_)eoRkX`cr&fMz^r68mV*6lmaJFHK zG32$PcWTvK@CXBBWMy&uAi7nn;3p;hcZTlZ!xU%hC8_AvAAkLIJYoG*#3RwR=`>SX z*9c$#fQwF`tOCoIo`wn#iswi@(>hRw!`3!MHFjDV?BomUAZz z$-X#c=;VI<@jR30a8G6)Y~w+^QTgyF7nRCGx;S|sLHai%X6-**tVR^>F0ZKozW z>+1vBWQ9#1<*yBz72)~0L%rQ5CPcRC$^= zPm6*=gF@;ueSPelu&R-upwQ{XC0s$WdWCo(dV1V33>TiyY}O}pms`+D9r&(FRSoFt z;sO#Fx#vuo5_>Rk{t7&Rr2tQAn)oGhS&aLU8)b@Jo$2&G)vfNw#gn6pt3LL0&Z88Kv2ZR zNeYiMCRKW8_+`qaB;IOwr7J#1l(-%To?jZ}Fr&S|5`sHIP&{cZ$RKQzE0*Ri@Rd!v zXmIHwidcJM8Qui6b${sF35?69rheK@s^jZTT-=N@cku0CnP-CKl9^l(=WL`uFk zZ>T)kTW4e!&iQMtm8%}oab&NLQdM)5jV;Z_80U%~)J$G4hZ@0TwsdEkXOgw@d)e)Vvy&fGb?gu& zw%OGOy{jyuHvK4*5z~DbQnNYzt?2lHweM%E(@xY7TTf9IYm4(Qh27QcEZjUYnx%hY}AV4;6 z+zWmbAvcwpRevt??$vN{zAUr+R?w{;8b!2?iN^CQG9tqjmyn%1Qicozd6?Fsbsg!!(~=jdlx_y=d^vP+K(ijaQMzgDC1xP-D5d)RWc}rg*sqYw57%D$ zZOJI&$lRn>zpu9D*99)bI{w{&;XljOnN@JrL+QU{pbTl$#d)DYzWQiYR=F*-uK=^^ zsF|>seVl#pMi=$rxm?fcjCRk_(v+Et1lqG=de#@!KS_>WXNPoEMU{^oAoVqs+J4!#vP|B0DR_MXV;KUOvu6Kti`&UV z$f5hra;Z<5|N8`Vd2<2AK(&;-TDeY}*tbG%8?&;>Z{yf@5Dy-*# zG1|(mJgeeeZ4uMNHcK&qV4V!8K_spNnR#4 z^z8q9-uh$J{u_^C>>I`|38d&~rsV5}*0)m+Jq*5rUv!P_b)f8i^pn^%_UZKbnv!!^ zW$+3)_U3he-agg@seXcTcMR5QgPe_K=H8K9;mwuNm@2?!Bg1AE_$Z&!!+oolb1@uz z$9DYo+?nEkMw^jph_!*nmT_KO|E(mb;@XLTihh&v5A|*QbKrZSLQKu|@{XEJU&v+HaIEGQV`JA}fH6?X+}Fy6}Fscd8c|gTYtn-dziZ0T_a@s;Ti5^|&LL zH(?5z=%}*Nw*Hy^otn7%o?}NxTFLV5px=uEGsz1(@0jR7mgs=rSgWgy=c&c0%&VC( zhE^lZ9@?&aVobY31Xb&TjkEqpsDYHc>h4s+Wu1>CGyp>OUS6+Z$P_u{YJ&9wuB7RVHo}4H!&ip zcg2{QaJ?qq1k7Y#MSAo~UieuO4Q}HMJhkyui*PxK>)!tjx{qeWjHm?~%V&{Ferh_Q z8Phy&pTv@b^lVDt&VPNL`-eAn$^07&N0$=S+i2TqcD09Tc2%8~suNWwWMu=VUGa6t z_TbQT`Z_q-dH&D-m9S_#j-C@+M%g2I!9B;4WkDv(*m)McbW;X^5Z^_4ux1dh>w2jB ztUL33&5%dViS0j({TOyfx$Q)st=aB1w5mII0!A=7Cb#G6hxn`jmld~+Dgk^l<1w;; z_KoQ|E!(YbV?=jqa8Oe=?9pB1ww?pm%hDSx7W-ukk@!Dc+uQ@2jhk5f(rUkewV<;r zxR-i5R>Vzm)bc716C?Bvv?Y2w+mS(g5kh0eRrWT%TeBP@zlEIww8XV2%Trn3PHTr!jAjo*Os28t zx3#SFmfj%$vR3QRG`ew{INQ8Tazg)lih6~zS3e0J1rD%trBd<&Pj%MgFq`rFR`{Vk z5Y;PJjeZ|5N3Nn}^$gWff1hU&8-#4$TylE)wB>F9rz_j=WGsP9^6AsJe5GCKOt zl<}b!bk7*9(;8P^mH2F9k=T|^gM<6Zn;qd1=2RQDh0QGV%zi;=;s80Pc^ePc_|Na2 zxRXo!;wtoi;Jn@@4hnU}x3vk@T!^+aw+VG`sS)9XfdA{V2Ct$l|KnS6C|FDQlgm=1W z&nK(jimHt1%2+1}bX|8!E?OA@i*AAWYUcU0 z)tRbQ*^Ze%HNMPZ%eVC7G>W(7jyYKv{pj#eNkMk`RSyG}CJ4>dj1Q|G8XP{FV?zJw zoMy&-sJAooA%&owIPT#QIXggBB@b;W=@_qXZojcbTztPb%(r{vzCRYHitEY}16_AL zi;mGhmZFYyi;b=ny{_ch6I@;eTHM;qizTG>z4$hg(l$QolG$9m+(nZIa|4B3gdYlK zw-QETorp%sV}BfXH2sz+!8Oh`i4(^kF7()AJwCg0eA4KpF!~T2n+A5rPx(IVbD6YT zARDdKI}jFrj_FAX{sCcRMJ8XPF3(0Q`Ac|$9F7-bvj13vdtDl`t2TW0mWN+@gCEYe zMjRrwu*XJ8(QOg?ts@oY0w-1}vxjvZx4o`@fBI9Sy^7zR^~B^gn1QVp5o>NoTiZ&E z-0J1|H-*n_JAxlm%q@^N>z6M2Un~H5v)RS70~TMB<*kqvp?!05y4BY0$~E)#)@< z25oh=BjQJ~RY{DgH~MLCIpu!x39yIS%C)q^!D8HKRT_SOL9K=4SnE1wE-5uOolR(X z6J8<=NEx~q)%vSZtCn)w0z9c2oF;4=#wILBv-92qGd?}!JzXhtxMAGhC6bOhVp}W~DGJHkq=( z6UtUB{gj<@;K!217jq+CgiYnEz0r2`i$$t5{to#=kIMn*(p~|yeS1uQiMQSi+E?Ri zg+n_kmuhomSM$~tTF&^U`mI&3#q>=YmQ9II=s#i`9%V!`M_lpyVe#I?9(*G4n;2?@ zeZozy<*6u@X=3Nw)TvW%P47(aDt%2!M*nGvy)ZJ_#tuKHCN#(Qhb&qKv84OFcNrYX zuM)Mg&=i8y2_K*;F<%ZdEgGkIktDe{3o=4s{u<8A73<*53%r$(uXU_+U&3+Y+RgwP zHSP(gx~;K4$D7mV2PC_bw}Z23$5TA?nL&{~GTW3sW7nE~`dN}-@GtI8bXsO^ted_2KCEDTXQFKM)UpZ-a(BO)wwwpw=ET(uMxM|<^=~jZgep%IR^B^(kAmioFWqG zZVm$$Uy7#kA2R*gl+D-n&q}Vu9857O!}v`1j=Dw3Uff|!q+rtsw83kw5b&?9LEvmHl(9}TxT*ak|a=b`wQ<{X(k137vx9Ha7UQc zX(k&AX3{MlWKH~G|8z%+dSK;HSgz{(yq6o;jtQkpsz!T@XKE~Si`yjavh}-jZ7Rbz zWV-YYy4gx&{&1ghI09G=lP>hfaJN99d#-TaWJqRaE2^ zArXZ2^4u4A-g)_ah6i}X_?g|>d-H|1$5|w8VqSKXp&cyI!M^|Jiqzn7d!ucLq^uGC z_kf#S17>huna-}YdRR5oE6I!PX{-I7ipEY$Y{$=fz9K(ECzOa0BOROKgoBnbvk=)m`CB8z#HEtsuS1F?Wq@<8%&sUGauU8|& zGuJ%9_?LV8el3WsN$=9}gO6IW#UmGK=3+v3qRW7;qo(Jl$o#^eEO0$+x8{&eC0~!l ztYVod3~ITkt5){fO6{}U^Qx6qCtbp4ewge-93gv{5M#+Zk{^vO@Le6V&_QZ?jp0*h z0+$DRCcrgr^m6gTpdb!6i(~8Y1G>*VAi*nxMf6$j9m5&S`erf#y_xgw5t-qYlOfi= zs;IHA&7*DNUxvhG)khlGIrS_oF88moRL~HX z2YYs|+g}yr#=&GRc}#f`R~7s80y{MHC9zm+5Mp&)MJE?FIt~m@WS*L9dShuVXzi5J6^GNgqI7hwXT}t zNbYP*$_Sr`8ZZyd{~|b+RtD`lg;-k|^jrS=(Zr@@5MN(wO~jx)m2l9b{CZ#r*Odxa zcLw6G9p`P3xA=ATj>XFT5e2X?2KFIde0@{J=v9&aZ1Ir&eih$c$Xaa9g~68<8p@b0++xhNRRIPdWR8bK45*Kh1;wE~&X2BDET&RX=2j&dZ`uaM_b zrQf!EMYe3QNMil%D2u%EDW~>y@E`}ySB$;LP_`L+gj+<3YHlc^&`bhe?t9$CsZ-8O zS&`r~#VDH5vwETJP`-n;rxKUY*6wN%VfyB(cV|RyJ0w9&h9(y~$-T|Cm1*Rw2+?Id z-WBT66 zy)(XF$v|Mds$3cCn)WC~y(JDxxmxb302sFJ zk%e!dm^SALrqX!Wu_+^XHw72e;_ zldM&$N#D}vy*2Aes4Wettz%Dle>??kYTX@&frX;?Rv4WYwBp!=X!&^6P=rI!5+di@Q%`})++;6;&=|&fWnFwNcOVoY zG~;yxwb_+ILUfGe7%1y2W1}|rR68)PQLW@dlDM#Vs=Jc^&|_jF&i2}cvN5;cs}X=< z9JQMh{MNnA|CIB&Tamf=*}BT;4JBCywQS-eL#Ax|t<^B3%iU$|M|21q69X;e zpz^~6pr8-5b~a_M_tZqZKZ-v0G6EJJ3VSaocJOGxO-1*$ZcA+a2X!O`n)XA4;E~8X;o9l`i8`-B?%m4${ zjOv(8DxENH$Suy{Vv@|FZ?m$_3u^4yN7*X_xt`my9mJDuVCgv#{JbLGB02IY@>NJ}hbnU=~ zs~+3My>AREPFnOE%FN&^MMf%@9ihGTr7uv+SSPvl2@GDOT?~KOWo=BgO;JSircf8h zp)1sr5NH+BjluFy%3SCht6TGYwF$BPi;w5I0dG&Vt<8>rm-Rv8Z(2HrAEspH*ci4Z zH5QG=6bA+4f1i4}6~2wR@nFnQbVOg-)unS$qkE%Q*Erli@B zMq?P+ls-bQr%PEx*U8_Rh{6|^hkluURs7oW`+YLc%kOZYdB5cQ3bk*C*K%UMK(&;N zjuF)Kq%LFO%KBA=_8LUP1`(x!sPNn#juTxK3O8DM;2im^v+ApXr!>W4usBtCeA*gp z1^3rv>PQhs>|d2bke+a9YJf>RO>klDp;sLObOG$ zSBzjpm^^l8+nA4b#naxLq5Kn2oX1<~iU$`b3b^3Q2_zqkh z@EHh-g#Ko)P}g`3`0aJq@fJ^JlN_72I|lFzD1yohPsfKm%Utn|&XY@a$uc7TOx%~UX~0cC*fl=47#_J|Jnc0C<%1^V7L$S^&|{m}z| z;gx+GFIAn;c24xx?fn@AnzIFo7sqz9{ir;={p?a=^UA=hLf>XdE{+@hqs4fAhvSIo zDpA2h?K=3z7$f{^vWZS#SQj-Pwr#=fo*j$9pJ=|_^VUnN9|(E*gJNf%`M~KQpMik7 zk;E>&gE`892vYs4kgm;LE8BHp+3(6Jhnb8_pA7IE#`YA%Te)}L@S4Nr(@#^w=*J04 z&KCJA56}%MS%t*M5f2(TPmjx9Ge!f1CxQoW7*Vf?_nt{QQ=)d+g_{yP>ig7t+k4du zjaQ+KR<@vb4vStIn-a7p&*QvCBNAD>fZMUuG?}ltuXBe)AZqJruMeU@hZD)?3}@_f zTF5G=1)gtBbjIMID==d85)On~et+8kZYvI6-1>X-!ELPZfVQE!ams}~ ztplil{kC<+Acp9 z(3)Mj&Sje|JCGPySZMEFy)w8amtfDoYhU|#Hx|gT&{aKw#v!Mwk#6`;DKGx5 zJ*zt#XFV~5wAoI%7)E}2+6IC?_n>9GDVL>cvv%oKWo2h(9;ZIT^=6O08_VKK67PCA zH3^`I3R!2MtRV;=u-|c9b*&njOz6Wb7snKj@I9NfwWnBkP1wdSn1|noT%rS>G0JIo z+<=?G5vJt_oy~C`Ic8DA$CGqlWOk`G=j8yp+2t3OJfmG&^*y!$Qm@@Ndwb(}Z4q~A zOx>$rYK|pxb;-HZ3)WNPeB(VeD4Q#@N-q`;6oE^3Ebx}j4}7WYle9leSQt;%?GMh0 z8F<^av&&m@xRqYswLEA;(!qn_oT2`=qnwUG?V3>L-jWY{8(j+e%txkzB1Knt9yQz2 zMx}J@)iA23oe2l7S{aMp6N|zsBZgLy#+ydNw%aON{_6hcnzVsOt($U@&*DY{#&jRP z7#yV}Gu#;e4`pu})zrC$4WFL24pmGQ6_p{i4%8|{M2rkcYPC`iN~%^68B(B11tc;C z$gpc25K*EAyT0$o_rv#3cCuDh zR@T1v{XExwUDtg-K5jP>d&?3H6wKurN`OZXed@3u_3xT{=;Q&S#UiY&cb>ixDD+ll zKS3w=uHv6sbWq{^Da&hSRFauy`Oo|~H~&3k4qM;aU|D8h$H6BjUvSm=KB_yd#QjDdxV>Qt_XS+Qzk1Em3PNR@KfO`w!+kpNI^}@&5#F~X zJbJ}}<%2>+z1S}Jsx`Yb>&$WTSkn^G_1X|m?NQG0BO=A#K>Xw3{=>*W39$z4>Zk~8 zdOu+GBbeTm@mnp(Omo!7Deth!Km_{?ZuJ7n4>a+%#O+ls@_zfP1tgE%aSH+*yn(vu zuI|Z=NDR)}y=t$*!4Q3npFdoMt(l0APFi;KaY46a@QJt10l9*+m;DHjAmB(`aYhc* z;j06rMM2yk9=}rS?ja^ zE=CMY2i)n#k6x4Bn{m4mR%G4dy8{xR4)r@c3BkS#@@Fio*v}!mZYc{fU*qd7k1y@k zG|ZW*GVb8&_BAA8S;rHkSH{YBajS;+9n`*K2v*qBv>m`0dz4s|y6M5;4Z6#(X&14W zH9U{q$=Umi3tsA>&tKB7N59X+tk8Ii;z^I!90@yrYT(AVEzTKY5h%+l-;6OIW++|~ z4yCIjygK0VZWy;l{b%R#jSue+FmdwW?p6zz@bcq@XV|%SPEEwUz)^C~RSpU;sGW)K z`W+&fa;Y@RPSh|{0~3~T_u}o~A_nuUB5ge-%8;a~v52S6U5GaudpFJ71`M_9{Ke%P zYC_!jQby}suWuz^U2eNSKEc*aa*|vc`d0sKbnj!w!5iwh@wBfRQ}&eK`ORqK+xM5~ z-96qr7q=T{nB9kw9F@X7*f6T3Xdi{+73Nb2Jkn{JmF-hKUS0I0+0ouVk6ClOq z+Gq%dOPd~tj|ISPsy*9P3BOqK|1sH~$)|c0o#~ejKi(R;trD%VJ$fz4y-GI7gE>(c z$S$#*ogr}=qAzY?hCPx~#ze{E9&%PCFUMrJH-mtSor86z>#|=-{wQwf_s8cFreK2q z4%(lyBINO<(Dy-+{ZH(AO8EZIxbS@mwDF+I(4jts;%~p7k?c=5TrSOtXh#HgCN2+d zpscyziV99098jjCX{o%F)wUyt8A-cV1XwTY7sLIw$S*&3sr}yrYe6E1`6b%A`B4Y_ z6^X7<miDc)CNMY35t;^GlQ?mtH z&m7%QVCM|*8TYE)lCg>)nwiR%WpcF<*~XcD=k(ut9DcIs?Qb+#`S35a#;z zHpI^!Gw{gKu?P6{&n}@B+;2$YT!_;)+m0>ms9(sF8nUa7`-OP)h$}A+)`8h_v2COf zbA_#L+C9Y(HW=}K2;Rg!m~iKH0Q1ritKqB{8S(G$#|Jk2A*x#<@+iO6 z73B2&z_Z%&d)!4!xC_@icn4zybgzUTsd-H)V?Df_lzOmzDqCEhrr%ids~yx3KsDUz zWtavT)7!anw+g}>bj%8piVgy{%Sl?Dr8efRdXgm{lXk2s?aWJ;!8#)`C zSH$lt3Xf@w%OolSvME^4*Z_~ho?ESPH)OX09bujId?Q|^3(W1nZU zELi7s*&eDu5FR@h5z<^hCkIX6R&H4D*WninXKJb*svR^HZOSlf`^@f#ag_=L!Nn8l zEkA0$pbiiJNZW+!oZCM@|HJ8*FbUD#SqJN{bpaX=cT`Hmu8COJQ~o6Wc(?jA*7*{O zOM#uP=^A%d>g~@srfKcZ7(=wWr;ilJ#IuH*gD~;aGNHlJWg7NFX`7?kZXMlbF?q}O zUa8Wwt?w4Dr_|^-t^!a$)V~y7t?%pK*`~8>Lj*}k2Rv^KTr3Y)zPgteQ|t5P^hQRN zmqfj)$F_`;QqF0t4fJIc(@hul!ndJ7GAxbd4INNhWV=N^FOznC2lm==R2QKpzO@dg zmuG)G`J&u9PZNV#aHX#M)HGOy1#$-i5_hsrVtot9o`o0J=8hyFh~-DGO(aau&O~2l zaoicHb-b*5g;kkS1kAjg=vy9K;ZWZYz1ulfQn_jaXI%<>aHB# zwx9X05_?TRL0rHDUmMzxiJF&TE4`ftN7KJ7U+=uQtU#wKmmF;Tvh-3t^n|1Uh5^mBXw)Iigb zNb>+R`4vs~n1Sth({r$6$IFCWTN8I>#b8e@+b>1A7Qzkneb2J&ItbI6^zaMHr344e z7RHl;l=uY6_3jkErGODOZ>Ah!@E!r8AFd9=YVM$9#1P)Gm>V`|5S{opRsL`1%KN=P zDJu^6evwuY#e(}$Fw8XDpoVl;g79);&5v%(o~l(uLn>3QKx*BP?(XijV=6w6vVGAP+F~*f=P(!k;KN;bXHPt~vX7;fXU(+WT74;NNJ?1lI={ZwBo=X0Gy7<% zS{Kf4H`xlEs+hNC4U~a1mEufX(>?B79*Bl*@Nai~B$!Oatu@?1n(jc#TAI8TEL*7Y z<(u-Wmi}CrmY*NgOzDX2?99S>7asG+YTVr<+RWkT-8r(#tS52l)rDOid6CYlD>wEQ zHKFjKH53(3W1AA?9iErS2p1Yg2TzFYoC(Di?Gd7wB(;T=+sVQxPWyvO*YTpS{_^{^ zigh#9@9L}H5DD7ssr9@Usp)RvKjdDB{uxQ2A0gs;$EC}c+F`ds^ZF1D?-W-Kw_(f<5|2n8_I-LCYLP}c%dVV+-9)@$ z_8Z|3+lt4P76%4A1AMj*oDAZQqpWbu$+RY-!G@d6*p7|;*xh>sy#O|eaV>e!EM!Dm z?~CS~5tBGCxXJnU>E(&8>4_DmQf(r6JAa<=D_GoKTQIn)DR;Q~*{f~7vF^1}L&Q2+ zdl!nEf6}UvAP6+JlXkthChJ(a!yfI%`=)7#&{tiCb0C`OUn`G&8FF5?hE=*BN-AuB?pu5m7IxWQ+Ev-dzotLo1j-3Aq5&O0{a8gC@hL1U2}M>RFiD5hIFNyC2GVo$*SaA# zOoZGGCsu8bpPC^#gdVJ_WQ}NE#igYjVUrOAO!Xt@lAVayn%4`sX~n79=2eM&RekO4 z(Kw6ZPiDHa#Zf)_X#M^C4~}?zi6+N-E#-GO)X6!2jU4*vGj1Gdu@2?T-0(exts(#N zBch<7*2&*9#f@2o)Ob6saSK4~^BB0yUPz~ziJ{X}4!N^c)PDbdGHy%rnxB9s6v*Qm zxN1EFilC#?z$4~WeIK9L%;Ha)M(24x0z5$oXJqjo%OKLfa6mv)NTN&CQSvsjuiKp~j>q3kHSk^?Xp9f2^@)m?$xFRwSqtxw zRxb>m)|e9F7ZO5f>Tx;WbPtddtxs@sF|;nGk!U4DVG|id=%f7`z?r3%Vy=b+61b*7 zNQR^Q3j|?T*~AIBU$=PeFZqc10mi zvDUCS_XZ0usX`$nCH}xs_1)-juBqExctSPVmuHVpn1%hcL}zi{R)4BTd3K$CWZV7*ZlpyC-N4QIf@DC20AE3EZ$I8s zM-Bf#=19q)0Qi8goP*?_n4P26{!tL0Kb0Tp5fw9X5JUvS8FJqb-0PEp)TMRt!$_pB9uq z(MaTt?6BSl(CCu7-m-SG7yh*->cS6=hZ)@wKPG$C!sC!~!(3?T2DsFz(~r?EFC09( z%VB^0@gvJHS5><4N^nOiVs64x$Q^FCZ_K$IbHJGi-r9`*|$fFUDTsXk55_pB9xKiaHs5L z&F`-_3~oSKRLwu*V!i9sl4BhsAM~F7+8NI@Zv za}2OYr1l1+N(<6NRokya?*CYc6?(tMAVL~LxpI;fiFk?g>0n0fYK`s|Jbqj(bl}JO zg(Nadu{KG4zqxJ>xOyzC8um{16!Ak)TlPD8E%po1#rB~|=ZT8_jVl?UY$-d7tLCe> zT&mz`8&JvReIYwK$I@pr%aubT!mtdK;@ZCR%41&#ICdrPv8jho?v5Bz8j{qeKjp9X zEPEJ8HYUM^)!CU^c0(jh<`!CXFV3S$xu@H??ET<)`v&cOy=ssMyW-?%_HKhsYt^8O z=Vz;}kqkpKe7HRcQi!Z2RnRk=tB2h`689MduU;B|Rs-s-fP`sbfX#SIGlF5V&P2Fx zgGI>-smTq~Jj{>n_)=F=>JgLUR}>7d4mSRU!pbc1k{()XSs;?uBre68#y6z9cGH-u zLb)Wzjz;$QrDrhHB*rm-**sMC>rH(>p)7F!@Fa25C!Axm9d}(H4zk2QN&w--0k|3X z9}`4^&o8ckKz8ohuWtK%3KOdbzKr6=BxV0h_T*(AE*~hxMyIXFZC#DUz!sn@oBEOi zs?0ru?aO_8cWigfbs3IUWmbY#C8$t>T40)Pt%L^Gt_d8w{qZY8Ov_8Ir9x?{fOrgp zEiekvz6G0u2&qAXv01l|=934_y-)L3bNfQ3AJD6ICwf)6r$tO&=-ym*qT3Q(6L+w_ zL8YuK2yyrE=32Z1OEzT;OR=XrS99Q@zU6(G=`JMQba@H)cpb?H7rsHrH>NE^o(AI6 zvj7ik^>tU|9^GBPuX96tcs+ygax(Qw{mc3rbKkWuIqxd^WBFlz%tdC&uu5T(A@!x% z1!CCF(U)+_S)4%@e2eZhttt(OI-aD4j|+b`k=Ggk_ZFmCkT|(L)X6Zqi@;)$u~_uV z?IWLxHJ=jv7SKK{q`}LLb%<-_mlQyfpi8`ow65pbrk!+{dWAhE8=Ef%Q8mZy;ykX)dPbxK|0&ErG#1J^qKa{y(RivPkbtK z@lxGinPPm29L+Idu8V6#YqZ}4HYBnuU!jx_@Rm0nZ1Y(_O%e756%!4UzBm&Syv3aj zr16=MmJ6b3hNgQ+{>RsY3m1Sgg0&owpurZAp_Qw;h_akNI*}N)_W4NSHuu_zIGgaU zrW2=5+%0C;1y=XMbJH-pDlZY>S+ktb1(nq1;lU$&*@`mXcXgB(LOOkS4{v}- z@!HZ~QR7S_T_*{yZ`l7hj0@U#j)7{2` z8y8#c_9wR!{acB!wZF2v)Vn;gy%e}N}3b+MzHF_5+ zsiIcZCr0%fpZsuxdGWUg`zH&k7wri7+Pl;B)#^K;EB8nQqR>Jb?q9IXUn0%Acmp#! ztrA~>t-h1#V^tDcq*L+hz{27Sd-LQD*kF(8cw4MJhatOY-!EZl?e?rZ$Tj`St_()}kxl zU0ZGw$nDr&C7^izSRV;H(~v1^B+qUv+LDLN@7`$HUL@};LFTT15*oXEYC760XEv-T z%penlF)e7jVo7C%08$w-nogX7wFkGqLQjfD_Kq{rFg=lFZ zq;!8g9zVHu@+c3di^SueoiPNRK5(#9ZHZP4wbMn^_s?fAG-QiB!hxF)M&bhjda=&(R>E7(gDjDB)Ac@P9NZIF4uFRcTXwYi@y^0hm#b4y9VGxpWm5^$9%S+aJL8fr-3F^*}z!( z^@&#-oHn|_hKfh`DtHsyTo)g8OuxOJi=g`wkQq=U;s5opGAzuXEtmg>V-HhkT6)s}pzBsi$Hu#3ds<9(Tj- zQ4jIy`fptik{&v<5-~{adcKANo zFD1wKouapgMd+AdMM5!qb-*z`05T~M*Ns(Mxhh-u|U$swDTNwY8t8;zF_kO;`h=Zhn0ckl8sPO(*3EpSczC1B;h_m>1=vu|j zHD_{9F8iU@793T2u4TNC4SOTc{SZd!NsEuuZE`v%76`84rOv!^UJ1U$%gB==pxaJI zD%d{iS>^Hc#Cp|Wfkw!YJ(rIq8)C&s?P4xRVjDk&XetCtUy@hZ^*&CPhmKb81A0)L zufx(L&aU?Y@PE4oQ9Z7|Vq894<%OnsLGlDm`47whZ4vCDDP6CO$0W#{T?aB#S8&pK zvl7^VaPIREsje~ivQsR_eRnqz>=2aREigpzAShJLsqvgK4 z()BEA_)~S(F-F`C)sz!t$Ri6L2e4n>NU>r3n5f&lp^tCQzB9(@1IHoG2<&+DrrA^9feH(Hzws4Ao9a@lY4I zl?_Rp2@0c9K57IY;&sE1w0!3N(P}Md?8twrWgEb?VR2Dl^dK=5d3Rta&?z`|R2#h} zHVVqGf^|27_o0CkT0!y5>bCuMs2XsZcM%Eoor>D3n7DpuSko#`3pENKN@Z>s46T+n zmeF>9^Er_m$z25sW71(*dg4iB`XfI&Lv|4v6){kh=@kGzRlujJ!kGE^|LgGZ{k~?j zICOZV9@Qb;Gc|f+WA4*n-c55uKYXxP-H92ADiCUkO4NPzXG9z&rTTz3dm+a`nqHk% zJ)74-8pGg_`n~C+0e;2Nix%O6J(R^I+)#FOxyC`1-;8ri>BxT|wAI+!5 zTgD-fmJz7+$CQ1!ttn$d>2$2*xjr>xECg;C2u}gx6ApMxCY0cyrZaW~e{*0KAR@Rv zTtGF90eo&C!ItA>s*llY-w6(yIbc{r3UE)rWrGc-un%>6)0e%~n^*!78|0V@2INW( zG)Ju!%1<)$XUrf=$z|87sJ(C}80@0VJl07A)72gq7@SL!WT;Y)BtvRhOoS4r155Re zGxMM1rAkLKq?NHRDof$dM7BA`56pPXCl|L7GljTqxB zfxXwe14SiJ#rjqT7`Am9&i!O$S=0X7Oo2X zzF59Ky9h3S;~Z+b^|Vd|+2henT*7N1JrOgE1D@Je_kE>4lxIum7H6Vb!G@H|gvHz+ zWN(AuJA<(dwSX;0)brN5-UrLc8&7h-XSlweNLcPt&{XVbRcexA&wH2FvMVpRT)vt z{q^J(@wp`9HmBl}M1vYDJ+RADAbX$r?rq{U9 zcu~va^3_4CGEP%el}dTEPn{^D`}f|>s?9(mc#eXc@yNeKbd&uYThz#f! zD&Qgi!Le>J#xgsjV$q8)`~WM+EZk$oa@a3|{TgR&DHG`{NR_-k0OKIoAZ_^upUsOx zXkb%GviMySv&0IEbQuly91EHk2>g?ZRO^gZS}cMO1!B$bh2~N6SQg0%1q$I1bz^TpgIG!=y@~xIMNIzz^uo+zFkl7fF zBbqc!14<9p>Ri7 z)ANqX43x5E{?9Tm9Ut8mI4mUHmX($79kJn>A05T8Qd3jjd4`5!lJaE3dcJc;ub)ow zz@G{9o%40p{*{8c$W*eji=qcQFfwn|;1d}yl9kFCugIAxA5nf!NPZXd@6ZRASV?wM z&-C}M*bolR)-QQDb?!r{Z`|F1rp55KsqS0GaEwbH;PrOE)M~!y54@s*MOX2j4YfV7 zOH}e+R*l~yopQgtX>L{vQ-Bwco9mLJv_Bdpm-($oZ1IC0E0L0>GPX03@f)vt(`T|1 zT?rwk!^jnvK4nv0aDJ2%6xR~vt=b2{R@qA1`x=*S*k&xU5-qH_>Y3G7b>9B$3(#sQ zDg&~Bq|mzPp(kSQsCeSEh2h-lr}nAirSZ8W8dS#x^;&(mKxCG;Cq^-GWUJQasm>~0 zh0qJyI8f35`LYPmSzF20k|p!ujcMe=iy^#DnvI%1a+cZrNRY*bhRt~Xr!h(#L46h| zp0-NU5*k+WbApTXaNu!zP$Rmg7jbf_$kZMIPFb1mk}BjQTdm8u$IF$TwXV7ryPT)a zeZR2ON{|f+@VhF*FNFtYjiZ?Ej5SdSkyWp1^8_PjbuUK5b}<-b*0r02gQ?6R9><=R z+Vv5!u;5jRFu=Ni))u$S>w1-G#$LaiB;ND!j#Q%aCpioNf9CV5fO#)EZ2=80HzZPKm? zB6~=q6sp7<#ooBqC^DMDVXj7A>a%9h*>*cX0;WuFA;0>80F|sao5)(Lm}YJ23IoE< zs&0ir|4T#G{5~dOwPfk*P|xj{OE~oFY-qrY;9q1z>1rR9N2Q*@EJ2VVqbyBaSE(1F zb`O}9c7zQjwpKk#1Za861SaA|LHR*Qo6wxJga=v+Oer(51{Cf}C-xsp52Zf7JeR;12Wn`)G>)F%^Jo*(E5(3WT*UArNji|U z-O=#C+*z1`9cVwDC$P$@*+uCbwIr&H1bFr>!wpgGcI}=`f0mWk5yy+5XmuOP*`azA%3cLe1`;qz`YOjS1oDfC6ppH?vRtG=ncXl#2Chg|brPX$u`^dU z(iviIy8j1?g=^NpAm^Wzm6!OJ;3UD8ed;N-nhBAu)K`5RXxdC?7P6r1JipO;FjMcrrB*IF&r3@+u#w3H9j0-z5H^D z1b~vw9X6wO)8fcN0Mb)Up0sL{v6f>>W9rkWbY@0$8aU!{N%}_Cx2+xjoU0VV%O3~? z-F%2)Tq9i~e$9az3@0YF;UYk96(qjYccZPwNF}b}?}k*+kpA9GXG5yQI_dXJrj8B0 zH#6Cg7h#dF4vbN9DK2xS7kUPq%*u8%o=H?{&0J;{b4~>DUZ#Pd`S!>;0*Vbi)tlsO zn#M+}&_f(-As~^<=U$XdtV(!RE{$!AUnUCbQi(6|?G|)KO!axm_8KmGQN~+Hrvihw zS>{ySv$4!3+ytq4^dV?`Emu`FoeSj);Rn~AbHenL_34(HR>Bj-drUbK?RB^*p&JmC zv2auBsH0;QOBi#8@>N)Jy|sn34A(s{l9N=YKQhkwCHd>Npq`Dv(pcBGwo=YUfZ((J z%Rn1e;%9AHOIZyOOIgQR0eiB6$pH}_2<*%l zRLmdRJ!O2C_}hOov^B6bOK<~T2e|?fT=`d53H39aOFAp0zV}?oMKNsI#OD7n;Vn}y z^Y~SX3uC8DTcJSESkAl?MxKEaTI=v$k7Pba8B`&Ia%H)6Kf(JSu7FL0^SPW!r$RzK zfq($*i6V5vsS%NHy3LF{N{IuzXi(o9jn7r$oF*_$sWXsE<{VzY=yv3~xALN76^Pk8 znYQ^7TPnK7C$+w^5iP?lhJ@V-O?O0UjB-Y0ORD3G1?N*|8=QjmA2tY?>xfsFb{>rt zPGpa!M@ouB=Y?_&n;PWx*;$RomOCu&nj-|h#xT%W8T?QE-+FGQA}7oh*XEyrf0j%O zr#1nrj3<7?zgbsnYd7;rXTX@{#(}_3gKQ441`c6?_(7hB%13s7&h!g{LBBu*vI$RS zc^MlxpzJ(hn**pw?REApT(_95aTMkBKy5GM9;S^62!`-WKqF%xmK8c9=!@LI3&0gx z6==W!E3Txjvn--^?##nL3OzCbgMWE36{5>wvhKXXpEx7hr-0@{{|G!N0`z{tsB;h_MX>&1;d$NSqCrIoA<*3-)n2jj6UsCXV-U`T zSbLL`b}H)o^y=wRR?fP4V#GqCRI;NkKp~@Sc8Mv!udV>id5`AMMqF0YlHrL(K)Pkp zC9IdNE{{>ViXD57I)zrei0HH7(j=F7qR?lz$RYUZfgdY%u`~4F(N^a-=q}b+%#|5V zh}1kx>l4@|K1o@ zR?g=O5)d^dJ8Rj<_G~lZ6_?D8p?Ol0AEB~ea+M4Q+gx?=6Tx5{4`*Me&Whv{iIpTE zO_(VfLxP7Hu!k;#K!|v>_0n!pdJP#6YLv+a(u_P%I7E^4GH-H|OSpEmQ$8JX1LRG8YUrsAM!DT58AYBAN!9CPw`zaAW06-b7}gU{yo zP#ETNGN!EpKsy4MXok%MC=A6N24I3uZp8#rN6j|CJ7Wts(*Ec6hw}raPBB;Gmcuhc zr(-uV*n1wYBgGm>E_J-80zX3^>b^nMESmMQM94b^zb4U@mw?vS%LBXYxh2~F=(SJ- zQInU@{H1hz?~GL{9Aky|XL!NJNa8k~)R54~jVwPVgm7eijicwXm?=}V-i#yayZY@O z;r<=a=FfVUA5^`1`=x^`$_{+Da`8pk_LJH+aQPuA^!inJvoGz7m&d>V&!}+UCc7Jb zf@j7bp)YY(S!pJYxDJQiIf25gq5eK|%HgrpXR<7KoAF*ofo9r{SR)?WV6j}pmm!`Q z8)Q{BIMLKP0YY?~p#-l9OU-CXP0}pJdXQ>Onmb&tWpY%K)!3!I!`iHTe@=B5S@sTr z;O?&eX05|)tg%E7t-&tFenEgR7S-fmE#eHcx@|MfYY!A+#j#R78{MuAjB1yi6wtDdqt1)|P8sRCap?D}>aSP&=L!#H3K zT;1&z>>ASl`Z10!&e2&0HBo$qCVpW4(%p{%_=%;W7_aS*&=rxC=Tc>U1{LxaH1;Ed zfiu=RxNDsPJssgBLNl>dRr0_Mo$=Cfq0u+x8jkT^ro>*F9pbd@3Z+=LUv2Ahrug*U zuE0`un<(QwYecvGIc36EwD$)oR9%ubbU9%;4OuW&hEq>bR^#9`-eCOWu*DYo1vdfM z0iGw9e0nkH%o>y>;~fEL_wy2u;ddy&p3`R}nn%QCffmmaH@VcARnFZjVI2Mr>NK6) zWcW8@v8&s!Pye&jaqQpWOwo&9Z~kma?E$cql}n*Xtcm)~!To4J9P_rBp=prybhS_# z^@mqtsR^2knJdV{S~K~p#Z~mH#sb5%GYxq~{dxc`Ej4ekY%j3$UP+^B zmVSzNHT~o>hQI+QE-?8Ezs**uc?FzYn|F*gsj5O-WQ)W&iH&V9b|Y+WO#W z&oc2TJU*72M7w~OvQ)4tLBH$t+$hr4@0*co=EwsnXSYpvD_`U$~6+jm^#pl$u5d#`D8=AM2=Fz^U{!aW#>vl?-g z;L4n8s?};`Oar<;ehGK(mpRs8b8DetMkIkFp(T#J-#cdsbq%h^bcAcg`Ahjl@7(uy z(UJQqL?M$G{aP~IXkI;=^EG7%ZmMRl8?xmxqIqEf=a-%Qr`Yo%pD2r|I8&_gRBM^3 z*H}n#({KKx?yiuys>>fqOK+JjI|MG%oyTWj|6aHd+lWUZ*OtyTqEkHVu$ws`?*4aB z<@xZ}fwtE|8&%F8-Szd&bw;!w=J!~a#~}{Nol8xk7h7_?QsrEyU!@08BCWIy{Ho7E0*UWtK}f&b|4U2 zp_bBJ3k+IuZQIVWq@Gv!UBT%{Ay7X72V6ef0n}}vZw9BO=feyp)z@C))}B*^I0Fv} zlTVgT8g}v`s+*U0BWD-H0(C}jJ-1}>8M3drO@U)U3Zv#xu@CYv|8)sB80f5i;}l&S zYt=q-uK{DFsqDOm9nRG$C-7uYVPr{_C0v}@+{A&DN+cQN_@9tY!|%;dKY&be@XCwmsz_|(L&@1F#Bqb73 zzL+dHYDjw9%fz{LVT#rgy<*=q<2;@Fn_J5mahkW?;N03}gXJ4N>mBX;xV)q`9B^*XP3_1%ZpV zcV`s#;B58)n=fMtJ=s1(zb=&Dc-hvPHSm|^5C!QQ{359l<)j(2TOC9>gXn)tececW z^)^4yxNU)paJAws)$sOfQ}~;iKXT68Zqee-i<)$|47>#1;+)4cJrZ&2d>XRHg+^O0 zbo#}Gkkkh6QP0j>ufyS|^!jY(7}R3uH|rtFE?ZwDPXMi@(5`T`^#-PyP*P3O0~)TJ z$lwZ`M$=S}|Kd->p=p5G9%T%D#v-(m_|Oxe8Y(&$&G7S9U2ta!j)}QD{F@%$(#oj6@|Csa*WmFVO}0RU2Ys~6+v?a91(Y zAowSVhLz9^s~QFq-Q4*+dQ$R0Xc~LGWX3Mxh_x2pm>7xNY0p6uS+0D-tp!KmH^it{ zkL^s>!!u8n$Y*CuR?YSv69x^{)z5!97~l%=KJEhPXGA%j!Nk3<#Z^HLTL4i(|y&M+w%9Nh!;q?zxB`N#^lUR+WbI z6x>DFaeGc)hLh4R10@L-O^H9kX#3mZZ`TWIz8WJ)f2S)}oI_+~+xLCFNb?K(RV%_b z#sPdwJ)!}2Wc#E3E&Opu`qbxrPF`=K=P|r3v8Twl zIr&jK!)3q(?F2_ZY!#hQuY_*)MP>Yw!H+Zjl`{?Fl=rho7>6_u*rPqg`w(gorKyGQ zY)rOR@_faiLyD-~WjZ<0qGGk4-Uj9mbwL$eD%c$wuJEi9g}Dt0;oPaG)=;Z=feNlP zs8-4^*FD{zp8G$bmnbNT>Ymm=?o8n`Fu>y*-Ghmrv%!|KNa3`xN=i@uvO4cLk_D9n z<&zcDdF6u&kY#3iyu%J99+?V8l#g?YMEP3-IqZ%w(d1XO`R<^QT4G}Q(&7k6{l%oaY0pWXi2a3EtC2&=pJ5<%Iwuu{9-!WjG8Zkcc*F$qbT zc@7&a#Ors|x0o!eTHjJlZlbMNV>2V=S4(%=Y`8+~D0HU9s}F;1S!2r>S7|QP^hNy7 zAy;tjltn4Q;rjjc56y{B!Q9%X)lW(jnigU$bDitCzWU`yQ>HHO1zGsEDUxWegOoD& zXHKZPjdKNs&jLoc8&>h>cQS(f{kmbT{shu&nE~OuKcpef2d)-0ocM3L1p`Fu6V84e zUYYls2&c1_k{~MdUeBjOv>Cb?WGhAgyma$u0E7m?zp~3Y%5AkItr-%Uk@iV}kT!Iz z9$H0Kib`yH(Q7Q35I~O?Z80gn$3aO={M-`k7ot>IB?a~;D2R^gn_FP9~8(p!t;s#G;cEk5~t2@3TnoWz4yd7WFkHdRZn>U z31i#UJfjmWr8;(sq}&X?qP=NGm3`KQK8P*IqNNyPi_V`^~b^zw_;Te4;{BG^|y$AMvAE-BKDK}M=kF!$En9W zxKFD#b)W`U;aDnolotI@agVR@jx8Q||AF-mQ%{_TIM}^lKf=qQuzT*<((t$U^89J* zV$>mnPQoalT`OveB3MpD?o>C4TQA;+c(}xGP?CrVUqAzJL6UVwQ)}kOhz6_z*Lo>j z4lzwpaymS{QY)y#b($U(WZeaC65+y1+Aj(QL~KC$Klmpf9@f*VI0N(h84VE5QXQKjnfq<4cBp?|+ zLdu7Hc{3kTya*MFecO!B#zl?`xThVRf>Ok5#>&p)DxHCL8QvIfvhH-&SVsuwG%n$B zuba31lt5`~l($Urn@7!p7t+T6}$iVdm>n;mg+MxWz&3h0alz7dX(7IBdO zX=SLU?j*fK`?ok#6P;13H7>M-UE&^Fz!K4sGFr9QD9CVxV4h>AQl%W_BcVYt5A93) z(g`_nlV57CwP<>%r}pL*mmBB`k<rDfCRyaP%oN)GgI3sGMc5Z z*M$Xpi@F&;0Ot=SnrhOpzT;nA9mKbSDA#>0t}^pp+7+C)3+`xk>%w4|nCZya%G$oH zUo-T%CpIFFZ!mr#%HWsqw-4fJyQ(G56i(YZ-~uAA;YE|rasKU`rZ#jPC#D67qeS+G zG=^v7InhLn_Qbj`kjtXGDSvInhS9Wx8HAF-#x^@DtTmMFxk#T(r>jZ#x0USb z9E=L4oRtD&K9pI@T?8}a0>Pq2+$syzbyd}kIoz%6|?;d|-1ZKAF% z{6m+S;gYuI|KaLQ!bXWAIZoQ?Co(TrlWJaURT{O;3o=6 zb=+D=T>wS#Aa`6V`z7YpZRvFrq+T?Y?kpZ0nQ@(^+c! z2OL1EcVy3utW@7wH?#9+YAehAa*=5nr6%?+(_Qz{4{1Dgg4amU7a@+MlpZVC2j%h4 z|M4j`z32AwFs3Y`Z1)Z#JEhW3|LhzYfToKnl?lc*M4@7oDUw?6DED6+UhC_PDKQDJuMnWGLh{2@3n=I@f@RfNxVlI)=x!PD663^A9w}pb z)q%xeAXnM^R$x^d>w|L_X6LI79|ddut57snA5nNc;VQyBqR^j2`CrXQmxobfG01BhVt{CSi5d0)Nn*LZR)Zrfh!qMT~ir? zhras>CxV%zbM#O*3~qF#Jp$uW0=3u~`oJS34;O2n0JgyiQ)>AlNfrDSuoaS%v3qG= zw1+HTh`K2vvDdP7hM-EYM_Ro{x?x2PI*YEG_N|%w#rJu_gi5>|Ov~z~7N)(q40s9A zg-?rW|7QFOFKP{zMz-CcBH<=y%umzr;T2SI#jxM6PIfmN5D|ipI$3_dJKL^55u&?P z<;6i-esI@xHnRp9<-N!9o?s0&yOGEetloQ@h`u$l1R1r0;g5(%HDyuJhTG}!EOOX! zQam!LTkN{^t82k%_{eWnMiHqQ?54BNqT3_dJsvnQ zV-~<$nLQW6d^9be^`BIRYEpbYW&1N<3E6Xj!xVlzGIst!;*FvO^d=fp+Ho{K7S`m< zcYfh_YN@uNg>6kHPHO5EE73{8tpyQ%O-?S4!RHB+(o8EENgeT0?btz-t%9n=(HNg@ zRvG&hbUi!>S-1g3kud^r2_L>CRcnR-x!PxpnBYDH?9ba5F`o{YG5w#sIX(Q4`~*X} zU9dS*`;2S3Y3~a@PiGp=uB;Lz~=d;TjU^63_Pq?=8wBwT)mORV$Kq%4}BK%_ZCe26KEV zyl8pdNzKgOP(xARfH5J^7fl%ZvL+EHR5*6<1u85%wK1^zU<20wjY2YwxUyFL81%0X z{5}xvU-Hj;pqtut48K&f{zY?nGpkcL`QaEDZqofw>y3`aZ0U%v_?OO5bgo`puaakV zZjaO~uA5ZW{7`+6SRV9JShMW8pd)@&I(;G6a}_6@g@k-ou|$@u3y zP0L+_tz#>Hy=T3fy953UozaNODp7X?PwyACnj3uojMYkuNyLKS&bhr}pt z;8LVqSB>{2j1V8pfA%qzj2?Wyg{YTP^nuNCnk2r(d(O?uyvYWPUIycu{YS(S5|BYC%G}1Grlr@ zD|t}Op0-8N&uw8BWR^W`MP_2<>LA<3{n!`Uy^%4zK!#U5a#CR@0Xci>uhh%(CkR~} zQ`L*Y5n*D9!46VrC13o#jpFerdhWZm>al%GrWU+(I28*S&ERkoCyxMtT~VPBO_(8( z#20M3L2&53-C#*wAK`x(_X!77==6#WSf(+DFG4X2YkDaetH5;YAJhLCF60|wV#>ye z3iMvkV|wODL`(g;9i7w-o;Q%Lt&!sq0&xH%%*(|bnK>P1_o1gZZ}DKb`ij|uN@&us zz!_&%KQRg0=T4p=+(+{6XCzyXYuTOsfwK zj1Z-cAsRzF9T5*4%?=F<=zR$zosRb5p~sqD3DT(xQ8g`}?tbVP4OOxzB#q!<0dHDO z(9WM@t4D59e--Ja5CiwX*<+y6e1EP&T_D2WQQH6o_`O?^=YMrW$yhW10DxdqBn}@y zdiDP!41-wEvKae6+V9}NUOVD-f&WqB{2G0744;6Ys5LP?ooTthKBdrLgx8x)vl zKuZe@s=R*$ky?J^IZ+dos|8ylgXPyU=e&q zFJu~HTggLhx$Ao)!P8lbM;1k92wVe&rOWb6mtlKDgU2GWZPFvTnc&zzDZg${dJ!1s zhV7Ht;{PyoeSI@JeCPQC{5-dL(|1294D~2Gr7aPP?N}Yc>y^64RW29rbJ+DZ3u^9X zyVe^0^gFGH*#SwBtFbN*pKUCEZHHgRY_|5-di8pr%c!GiA<0%hFJ(0|Nw|g2I@NbK z%wcfClheITa}{q=o>*x{Mk3PTho{_U4Xa}|<)l&QQd(g0MVP5lE6n_|kKrk9Jt0gZ z;p2ID2xLO*=C+8oCd)>A?RQmmgWvn5oZAk9vwOw}(X(X~POvXamfOmAWj33`Ipuv8=2AyJI*0zLoC%}?2jHnjUCr@8yM8)JXtsa)o+ zhx_Tb^nSgP?s~%~X@o-TjhM)`As6z@{AG%P2}keOg{3JUKz&MI1y0M z`*KT01Z6rcjdhfyYlZY1>eeBJdVX?SpnL4zr)7<-b2btr=d=G%xBG{_{QhMbTfBL2 z$=085n_gaIjSu_h#qJ7DbMNL%G`-wveIEl_O**Ts=j_CXYAaF|=>P&gQHR$5h2@_#YBZ3l33X~S?WT5%d&=^aK0KvH z_MIk6u+x$8SYE_#7>Hkzf`awAMTDKbwKHASixKps{K_^0zKXmVMp>cmPl6+B(>Tr z@Ij*$?C=RS{RTa*kNPYAo;Mb(5p1Grt`jz}q^>(q-E2C0>hd`_!cMmr89NuM=cAnq zVh#^?y5jq;!F|(#rygww#fYoXZd%_X%T=^}`ru>){tYQvw--(41EpI(*E?BNJg86& zZ0%FEhm19w069jx8;ARf%6;*6S`+iE5AlD3X$<|rG!Pd+d%3Bho2oc4GP!MRYr0(f zO7$T!8m?U~Xztg>Tk4C1Wb5l!VSx!@fE25Uzuk0jqqudNPa}EX2Rea~GvQq}U2=;<9< zD&;P_difHH2dVdUYanu{-BUZVa^+X?9e$lTOzk2!e8fZC)LVWrV=p$FP7d;FDHBcC zsA*^*+H}a>HRd4|jW=*?G#?Zr8H-J*w!`dLl${@NJ$%;i8gw<8^$H3Zoq2v#Dga;J zsz-*8_)o{ppD-{R+-%|-p3DUF&Bl|QBnDJv;mRz>6E6?~$V*u^3y^Cv=H*n0ZPx!o zG%qWAu7%43JLYd6LX`OoZVEL0nG!d_en)6d@PCBn@^~q2U39DrcT{7$&6zsVG+{Nj-Cs3bm7ZBrFO~5C?|4Y!-O$mSrVH;yE%?H;8F`4Dz!ZBa; zQJHBun&xSezb^?k{+1jIulJZ=D-R~6!zoD#DNwx=u_e9tY3(2=uk$<7OOU2Dj1*(j znzqqS@qLXy^ubK=y%sIk^_JVIReuaW&+>5fiazMov`RTny13Tf9H~;vj%&ModREaL zIz2+&4{hW+=_-p3EY$*(W2o2qQ$3!9{eWdU69H zF9IFuz7eD?Hb&f3c(bSzCGrvC1s6aQZ7853bTE)0k{J`|xHGgN^P>3nNXm;`wsxE1YkdYP6 zK^s%F>2k(p>)OQ4O7}wNwh5m+f$r2jU(_Ex zd{iX~E<_An?N3Wcw!{;ZI<7R`Z(t1Oq9;P+>tuz?$d~YSDW4^;SJ0Zsnrv;*WDKb# zLU~KxH=rKh1{OmFf0xVTh@7CzLw9To-5HOacs-+b{882+>F^ z{fk9$vskR+Eo>MS|9rZl{oaRFGm8BwR|=WsvwpcfprHh%LtzqH_++}dZdU)l7hKf* z(^4M5U3_ekgk?(jU90OlLpAd24!iVr1wfgeTjV1qDl4#Ae0kxlW-07@Il@~*&}7#a zBI`2poPu)99w^F!E)ESh!AY?{BzEwnWmZJ*aF@cwFoxNae{#_rM}5ezallSJvIo~4 z+Jged5T-;W3jDvy%q5=LC6x^+^9VS=j(=4 zpnZJ1G{y1(qv>k;2^Z7%X3$K=zoxdQPaEKBy#4OIs)2|6Iqtz~E$YVe#>d;V>_wrH zuX<90fzwHQ4hde}SO&|&z2l60i&%DX<6zCJUgc-h&?-@LmM@}S_9|F<_ znMtbX?KH)mcm;a>lh2>LH+^>3&$}IOq~-dgeVOMmU$j4uJ8Gzs68|I&-ft!yZWe!C zZT*kxzS-Z-i%5HnjqV2J>dw&hie+~RrHnmfH*8%tcx#AP!WuXpX;FsGsvEdxQXBO& zDec_q=}l}-lM?uXD&4TjayN|ONH1xm=V!*f5uzUAtz%n8Y@j&c2;RZVW>HI+=b_sL znr^WRmdJI-xfQ?oPZ^W#Gyf}8nh$}(3#xfxB0#SdenVYQSMbcnJYm-< z9To9XTN}MSDP$W#xIWY%f{+ZYeZZ+P)fP3jiW=CW>7e7Q-vrs?V|%{qsJ(Br3Y2Uze6aQ#=O0r7N!&D{BacLMiEU(4 zu0`WtzwfY+8LZxmWC(U%qo9vu&lFZa#|h)5HbF=ublq275lBwB2&2HBux}=|w_{VG zXMLE~0b7yO?nfLeLvA?sHW20$Q}Ml+aNhCO#qdWiJnK~IB6a=R_ShDktZYl8NKEUN zBqJk?51}SLqDUD4`XrE11|*Z~<4v&ngdR4TAw9KN7Nd|9k`-01R13B$o_ovQTk6L> zU?G}NsU+>K7NYAxciho8#kZtWDk7Khe0w4&e>{!l*h)V7@~sz&2cb1X`~kM88}b!Q zX|-sXsF}l2&A|WRk?_e96;Zhn-a2*w%B3pk%oauOE5lZsO*x*fwcW7F+0btn2;)nydx>vs$~=#EE*$S9!gqv5B_!nV$ zXRyOr8KFR}R4?T*4PrVY7C!Yx#`*(qUGp3D!;_m`5|*vnw&d&XBa6=Nai6z34`m!F z8Y|BG4FAQKF*Ek-?n2kvG%lIACyZ%`xh4Pp8gWCMb7c$gp0;GMDDBM+k<4i&Ziy%e>+`*5AfPjshJa;GAG zmRl7UA|lTv^f8VPsv^H2K5+b5^CagB0WHvcCYDGlXS~eS7BdNC>OmjlWH6)VGiE~g z^JS&lQq!M#uBWk%hUV6sN@O-95RENACQT=n=AKSL#(;5XDU{SFx97Qs&S@5P*y4eV zxJHX@)i(*}bXmYx zOD?RuzKc{?Z2LNRQMYX6t?sj+ZMtg(>@&y)4<05ubs&Lp>*SlxL*C#RUDx@{@9=Ff z{e-o9zj`lDA5Ifp6Rm5>A_9M|X8hS0zK9$gv)%AVF=T_=lR_DlBNH|CihXbiBJ*Ga zKs-i1u({%qZgGK5Er9j^u)bk%gewOj1E`aqZcT1v9VfxhT(P%uezI?%2`#AVG1Dxz z!1l6oH~r>=demIpWZ5L#hh#}N9`sHPo-!$T5RT~CX7fl}2ZlZ7^CwlVT>YPB^AQNr z_@H#$++sj_CDcChP%=KAdqYChX}AhPTQ1H!qbpds(Cbb9^XvRKAkB}mxNHXg(os=l zAP%xzn0hi}!{^LONByX51&Lgb^I420QM=tQOD!L|bE`6YB`LV6q^awyP9<$#*;*N# zN@Xs(IzP2|Rr+1_I>Wc3QN~y6n?w*(IPXfCD<<7TF|~g4lDa7Ny}wRheeZhHKc-eI zMSty!j#8 z^we1fhPuWBlWcdpr3p!Lc6knwDf>m_wERQhQ)or zSYhb}-)dlgJEddex}(jrUR(La*vwv0^~9f<>s?e8GsM9W$JRarn#93ndgF8f?w(`0xa8o>i2|9z&OKTe%zLvLy%km}?qvoRM7HHwvt z$H&Fj+3E^iMM(r|MUI@h4E4Rq!HY~y#G2()?M-5(`?s$0oRFC7GIg2hh_hO<{m{~N z1JRF|>0zr0A2OX(eWE~(B_jpU)BPVnBip*h*jqz zVj4N(&E{A~lEV$-NJO4^DePa_Xz$Rgvmr50Erm#TnaJS$xP-_b+zkat0^`gdBBM$qF%|lLVkWI z6=ur^p2m@!v_37am+zYvlj(^DBeBQ7(Qj@&q6+N>8T}rn9eQlmH+lOfc zT3O~PjqOSwcf+}<`uOd}*q4)K{y;4xpP3cV&W$U!E?5Z}b~&QDMO_}187-}N0~-e% zc_uTqF+XO#BsRhZuefluWT*x-hniWeW`4`G(ZVMB##aEyq@@ugX8cTavU?nE4mMXQ z@QFQD-Z6??odG(qgZKARkEfljEN`AtsZ=iC{7*4tVHX zy1a5tGXOsyj6qph_#fjM^0{Xjr zvqo0B#vuw#g99Gl2M%&)^zij+jiDt_^IBR~w}jj=so-2|--J!76<9jq$+GeiIcSJ~ z4_G!LYcA^94551l8D(2^+7Q!c=o|81*ym?rc4s9H@7&c=pZ?0@Zg$D3Q@`&I^NKDf zJhYN6BZXVP_hJY6GI4~nVBXJ&_!NTdjhTRV9b2FEWQ~H+>G9;`xO-pQ!z886TpZ(2!$$e+53hGHmykezzpB>1txL+ zlG(sAU=<=4X55>-x&0lERRu4wNb5)FZy^*D@{E73|Hsh~C4dQjAGhSxrCAMH-KhW)(&lS@%^; z{C$4;i0JyO=B<6|+0MH5Y=1`;l;u$vPOsdpfaAUS}O`4=` zn6;4k`3|p`2kg5A%&@186xYKn_W0*PQw`7>dkDGQ!%6pxqivmgxY1GbFq5AD?8Z)b zi&V7zJNN8e-NBmOJsl}M6>DZxt97@fP0Pwut4m>I@O4(SkET;x{loqyKsBdQBtJz~ z%%4cqre}vTTV^>-W_GHi*6?gMce}v>yG(4SskKY5xqByIZe0n6cGa__-`0D+nD(-s zSMSPPzry|E14J9ssKRLbNZbT*X;qOE$;7B*(F4L6j1S?G1xuTyu;I6yM4)b1!WPNC zw(%Bv&=RyLQ>ZM|Y?L{%o87fAeirWrrp8hgmF8cig1M4_@NfxPZw6aoGyE}4@wPPo zxVzU@uV+0WGGF(bOs)6>2{kjw*rO-a;2;DV$BX$IL(h_aC=CEvt8dcCcFs3qd_5JC7Q)0Oa!g)k;zpaO^=dCoOV3Tu=Ij_u zSXl)Kk=2P_2GCmwa`j~2xe-C$j|@X$UQn&hR^b5~ZpJr?+y_O&R56ugjh`XXTtHW+ zh!jgE9?j+N0HVjtzXQsBy?rTD_*_?l(qqW1x@udshBZ?zl0+0tX~o%EuP1XTG`5XP zPgjltyn<6r!F zksmIPZh5)u#K*4hYbuoOwr3qXtnGs00u8mE(Q8BEjv3pAgn90$EVb*lduFp^wLlU7 zM(z~qKB7I-NN*Q@&|U6GQ&l$+NzCo1yug*`)r4TJVC$&-RlZ8CVW^K}PnV0xRB|3Z zNeCoJt(Y3gh$z^a?ENDnqfC4owSne1x>Yc8+FORN#o8oNc=-?tPb348_Q8}^|LvbX zD}0H7{%8kOh{f-qKf|=t@$9)5?Szy&&g3Ad?v4H-nb;~z41nlrq&UX%f{s7rH@$d~C|uh)^8A5c@mr(-bV z_jzbFZtF-li`akm=5=0%g+7p$4X1eZ&D~IU(KSG?WvUmio!Qw1MFtxJ9H~ezCk8Z2 zW-ij|IVcy!&qUsUc*>jdJLHrj67(@&s=zOahz{U%FT?(@0&Usz*}Xo_3~?L8c<5x2 zK{Rc-Dr&%ckj=9jzb;*iMr7sX{PXJY5~=J?>N)oKu8p@PpNcZ`AG-H;qztW1L3fVC z&&vp!wDv=g5_Lu6J^!H$o>W%k#4H6Q;&qJzE+j#6zZ~}IlPt>50YU2d6P`4)H=}y& z>>{%6Q!0~f9{T-Oi<^IiMBLDGeDU8Y?x^H{w#9*G4temsCt z`q#0ckz?8RgRGF4s&u$r%Ae^mTTH~DNoTn9`NiQ^(qj0L>_M~MCu|NiXe^n(;tLwP z18&DGRC=G^6U+++mF0;gmNY>zeRcZhXtVkI#-dPQNQLlT2|x6Vj0a7baumDtS2pUT>CoYt{Cceq4!m}t0)v4#kVv*wm zr;(1l>PEKBPxxOW>5?H^?~JQTY#yicXs$U32s6Jd#Q+ zslgxBWKO$b5y64Lf}w6v06QeiKd4DB-p}EK_Kzyw8PRQg8^9cJjl(_l9kPyuNlsrP z)@IfjgQu|M>53R%A>&NI6sG;t63sNnlU!?X-du?38_=`NPOsN@g08VPwq(*!qu|mG zPjj@1$3Y6Pbe2`|=q;}`tM501CjKG0xF+HWhE*ABl180oSzhuYlqlt=1l}Y#`FM4a zjaHHvl8AizwU(^WAj%hH`;F$Gp@OW=)n&yA5CYAj|?OXQ#g0YK>0ZqS&6xg{(r!wPnJ!F8`Q5>lyVP8xb5AI&*`HZq@4 zxg>M^rE5n*lZ)4=_4}{=QHJ{$pZ{c%GcX-i~N>0c+-v*f9{t01Q!KyjnvlBgN zbBmvA?TQ4>6Rr3QW&TtZ`1hKtdjUU8o%r&EYbgn6j%6G41HG<+Wfp@mHR4W6rQ%O_ zlKsR{J+QH26GOVSHDq!hzUXRmO8X9P7@yu$x5gnvT#Lse31VLsHx^`iv4hZ|Kd5<> zxWlh+GrF_>*c}=<+v|@aYRyX0ZCE^~r|PxTH66(hrlRrFMY82%g^ zG*dikBa#cmx?&=4Gl-1AcCKj6z)M5ixA*Ar=&ypR?-|2R`(tuFf;VJ|S95~u+0$Bq zV_w$x0dUlUK7PA@z};EcgC_;KuFLrk8xbfoeaH`CAsHdsh-vhhUw8>B1#T9ZT3DAj zlS-Do-9j_yZ?oJ-Wir3y47f1e{#xafY@hjg>WAu-!_ zEFRGCMB)@)gJX4A?!+U}@Fg$|SVGN5FUw7qCGZ3^#RJ2ricX zlX5;@H{|NId(IpqA)Cy&1VFZwI9_5Lc_02t<(3{4h7Nw34e7e1OzF!vYpM*pYTX8ekQ8koU;Q>t*4l=r@!+}s>lV`&0ZmS zH#p{pCn(!l;0pTKmtEFuuGFJ_2hqHixn8p=#YWJ;rFa;Y!t8L}B}fi6QJx@W!V4*$ zQ*~_<+X^5nDC=KStYaJ6~Eq?atrT zW*4*05I%T08vT8ObxZP(?;V!|DkReDm{fKoT~dF?hFKae_NOU|I3HXmJf6&)J~!OC zd;UHsRJbYVvC)bu>H5wUi!E^`H^K|Ak(U2yjzlAc8H4srtqXOev$;mVhMfm{DVYRV zBpN235Fw5{-U5H-b!3(kOlCxBIQyc@<(H?W9MyNduLxF_KnRP=N5B&j;t_+BATIPa zc~V6Q)$a}4Xqc+9{6*mL;lunfupz|YND}XRi;!#ZKRf$ZPAxFHY%~;jzI~fzSxQv= zhgX2eC=wR(5ci3W(SCuc5b>r=hFCv&>&-oDp@7nn5jA?Jg6T|$1CSx6gko8Wu$ z0-+JAd1Fbz^)kxzf!ZcQ42DUxe+nJ#^(Ul`6b`V_S^>G;=3Cr2GLh}rd9>4z7r-3e zu`kEDy1newveag{g#p2EWsoj_zw?k_S;QmR1Io?Ne>NjEuGy4=a&nx|fGV|uIK z->(*KvE}Bi_$DiQ&)us?)uV|{?UrkHM+EcxCv`>Wa#_u|RwzwV5j>cT zAdLhzd3XEG-4wZ+VX%rs^@ktXN{HfPd%X`5fVYg%4FCJ{}4LM$rLNhn`i1 zZ{+CTNYIxxOla7#s^H;f<)B9J6(z?WJQ+E)?l&0e%9?Z}c{)gdiY6=F-aB$Dw&y}N zbFKm6V`Hcsj zSzRJ)l?$_W{F2CeZ0o>C*=}YdY@9V5l3^kc!$*hxal>_l^}@9g2G)^^!fM=&Josed zMhyRjy_q|JE6K!UoGOyEiR5@iyZlDp+j0N^ltCLm4Zzd1LEOtz;Ki6e_@?FST#!5( zBJp}#!$my&pzD-tjPH~sbgKX2wXw%Cl%&dUVD@3oyHiLJ!zYW(XGmbI!Vt`FzcaL$ z#(M)YLt(13np{*OT*Z(S44JU^1dNLB`NciM$rnCb{=x;AL9ucWjrJ!ST5+AthbfHD zxp8mA9Q|U_+BxCQWENxtJ*_bO=OLRoI7J@W!!T;nx0pK2Hj;+de#jcb<&od>p*(!l ze2r;^I{#wxS&B|McY5*y^Tz+^;*gj1JyoY+9X1Qah4}=6y^3^vc$G$rWQY ziC0pgSQzn*RE;Rg5Fq=8CpU5eBN^wRif^us_O00yWln>K?3u<2^v23pqSdGrT7&+P z{V;B>Y^MjcPnu^$8k<+6%Xgo4ekBhZf@;%X*HZIBQjpdVfKKByspZ6f=ST2#AK}l9 z01GEbfEL{9zH0v9%+YpmSb$UHZHFy_#ST@#lw0s;Fk{RNEbzWikcWlN0`z?>Y`z1(QnYA26m2YRj2(Qmu#l$HvT4$2*j~jE%9#A~e?oN{H z*}95AM(u>kwfkG&J7Z38xM2aDSzN`*i!xf_C){K(!kC@38>E2_s+pt6f;KmDKP4Bm z&YHZr3QElV9-# zU|`CuW~C+`Z|VHF`Ds;Y8q`Q}mqDN$jMu0S<@QTq(T^bC+v~+0MB(KsDac);w3+Ye`*<<~ z^3MGWzPn`QH`%*h?zzk~%0s_eReDF^=QJ|-pU8}m$YArng*r`98j(zN{=z*WW7ZL? zt!k-XAuxSJ##w!Cnbw7#s}#GbyEDJ&JSY3gEfb8IpIp?vudvX1>>OBJDLpjdIdTKq zU=u_d5|FnM9_ZCtZ_Px+756%6vrM~)T(cFuqYnEVV)hO%pGbEk_vx^YNqLQAZSo!I zmOT84sO$go-TW6m^7UpJBd|x$wFnX_G5w<!t00HQo6|xg^5_U-pnbR{KfZPRa=~N z-wWVYI`nd-jJUj}zS|w}G`H_l;XPC^q)FcvBIDRF_iHYPM7FI!4}0z>+@??_zUzy? zG$oqO0>to9(1K)e9cS8F6g0O(^eF#v$-kn{hJP=;I`Go^d#ykB{H{t~>vz`~VVJCR zNNhR=!hmJqaJDKtbjJ2CYV)bOuE%P1!J z84I*rpg7WDP!~f@_%u0AVxf%^ld)pzOW@ zdcgFZh?+PA;a(8Aa>Lu$a*~Hc&wawj1NYVHP2lPvb0->dFF6vuYGzM^`4sy~%EiXr zh12R{ah6bnVqMKbfiQ-D!(s&p*P`IKXal~9W>^9}FR2{kg0K?rtjJ*qHFM~xkC07; z8V~+C^F_Xa6*6>!t0@D{Oy*;?0##pP!&26jg;17>x<^Sd(5LeL;{Q6ZKW*ERA7^e* zAM47)m5t>6A~rw#x$s!W@Da|DoCmg3^NuiqF|XpinXqW&V4U%olm@t_9xEc7qA6-J z8g7eh3iRq$>V7v&FnK6P^-X$w1uc6mBW~<&&-j-cdW5~33*^7^(eb@@O8q3TlU`7@%*A8KPOMnju3?{|9=WH+- zAxj$k?RUD*^2L7R@u$Jk7=iCEn+g3_e8US=aI;9ymYDDsv+7AZ`;91eI2ghY)9BUH zWZg6m(z*J)qUEU4xQlKms9y6;zlyGru%(g&4Eq89g>PtjHvcQu*o|57dWP04S~lj& zSbv+?ND1(`>_mdX4Fwv2?u~1FNlIxe>r~8Zn$^!pq~>v_oMO8}BDt)*8Lk*7U{T*e zCqE&KFNt1fbz*JHl1pTIL+y%Hfvq-g4ybH3AQYXq-)?!rzr60{E01{fk>><-&W@Bv!9gZ(Om4zGc=0m+NT2YYuM1O07KTK zoPN7J?|!L5=F2cPg1VYyY`mtDx7|fvrGZ)wixKENSw=O_*ahGT9Skaq^50)4@zWGsK;8S`Mk9C|gw7xK06%_(@POC^?-`jCIrS;yOPp(P;>n@q9;6fhgeuy)cUu5!SfRK%mEE+abwA@$+fzMUu+97F>RzEjlpv=P390KfrgeGftpxN?JeYF7-*A(i)3(_gT^G^9iK?on zHGilqtCEH^18+(1qtuRNgiS1Uiz723Rsy~2vsLk8=$Ui0fF}8Ot|&-EsEqSXTOw)bb=~4z;J)w9QsN)sKO`DY zxJ3Te-K<_$zsFrOTVvA*HPY=et-+mG4XSn5D?9I20mQxTh5{tL4uIqkUOh|Aj5pWu z@hM~ftiHG%24_sgc}1j%?~8k-CjqU~LcU01V02m!7nT-QS#sV{&gK98#UNx3s8omy z-dp&~`&RA^OFm+9WSWtt@4X?&-*vfp5E9jbIb0GjhfNHfHuu-?F43pV$IKeTkXFKM znO~>Ya7FmDq|fY)g}4*5R?YZmN5*U!AS-QGdZ|rM67m8!JZ;fw_bs46(@;yjxLdIm zUi8Wp3qSa~a4C6@SEIM4EW)8Pa9OO>bhL>?4Fmvqf<@2w*VsKE@Ak(;?b6vpr&r%? zxLPhBKRSGMxapvHPb?UP^z?YN!<%1^wOxn?u6_NL&k4Cj+n4b)KXE*@%RiKqQJPa< z5%|mQ3hyVf>7+-&_YBLlLW%AV9LSW&zZzRZ`KQ2CpY^`K7cvRQW5Txb5#?_}PuVT> zk>L|ew@G6_7xSvN8)r-oB;Oc*6CQ$)FF~4j%2~fz5j?N(1JG3#V@U4Xc_H`{tk+1N zkeKuYn$Yr%w)lf{Ha(i<*q?fL(y*CeekwPH8c9cAsJJE!2x}4pro4<@onX^-xn>FP zHy&-JZOmn9N1lYN>&#OT4Xv5*Nx8PUFu)kD8};J%8PE=TKB$=B)ULl7#5cRHbvDU? za9K@lR0uv$^zoZ0ic3_~@VsgBx2r3SZkTR0b6KyZi2cG((@eSM&x{~8K~l;y^y5jV zqdTW}R3BIpzV?)Lv`6_rL85Mxi$k0;qGs{v;6Kgi$ZW?MX|q_)4%rN3fTnfX{wZ;T z$4+lp=7N00#p7ohTr<(*f{)lKNMy%rSd*O%fM2=PucghI7uQ7LTnDr;QU2>)62ED@ z2;mxN*_QZ%hLrCB-4NMh09Z|kP>^7SvYjdd!<7m}{t97L(j58?5!3~z!z9;tf8{3rZ}Ujl zk%^~sG(F@w98tJlQ=(9@)ve!{s&K@`P0_Cv>u-Z`A0w%voZSxs$&J7!%)pPg0VA(> z5aTq-@k3IbdhElIRBmH)tF>!=o}}n;k;r9G?f4;abOgvPR39BT0b~|XQi5cpGj(xp z_OkMpFKF;IF=Bz5?LYjF0mi`r=eZ?6|2y|;n=zx}qH9W^InfQt%<{P4m$S&^&G6{= z3;jL7m|$2)1gx~)#}DC5=WMMkY(#=urFw<_cAlc=cuR-1WNjkX<8dBL3p+WwJ@1@ zvhOKw%2K)*EC#WFZ?RM8%Vx#XWbVR9v;IY+rMgZUv>H%n0VJO`Bo{6RnlK<0C(cNx zO%gDKuj`S;c^3rLQK4QZCOH2kJ5^KUlRoT={z)UYHRHj2X!y#k^VfSSwWi%9FxjxD zw2BF}5dKiEMCBgqwW;weHv4Gn1sAjixO#CQr@Iq3<*7{X;JP;^r<#l|H#Z3{3YyR zDRZXJ`q_%4AF4A1@nN&jc}f0iCP*37fw3biO;smBX?T-P4n-;s(ehN>;k^0P#=r75 z>*P=K-B~lYz&z64nY7Cx@dnoqldN2cjL!S!gIR%vzR*-bhvhLIoChc3z}kDJB-*S=QVm#i z!xN%6?R_A&o?Pq}|1R+Pr*S~Sw-{ASl7BgMypjXPnNOu8x#psu{9|q|aQZ`%vq1 z*CM6bXYRLUyBzz!5yP5SxkwYZB<6lWHQ^7kne(+-nRuRhd*DCO0Un2jdUWL)jsp~~ zl}pdW=oE)<+OFn7r^}#ER`4rgLo$?tTv-_6LISfodutl(c+3S?{5M;{pJMs!#GAVE zj^9(}lO)24GL45#+)V!9CTxa6&R@PSPK?-cT1nqB!;;+isuAj`ndC9idR*Bh#=c?n z9Mgz=5R%C@0vkITvqk2`C zGjzWq5VIpnf&5Z#qUZKl3Z}S&vdM ztWQ-V8q{+R;G+@U+Zi4ubf5bJ!$Q=S3gdXZT8>?hN_4&^UwYS2RO}Gy-lzJD^*+Ux z#GlnTE}b{jKrdm8NXE$dv4WfU0fze(UcQ2Z+O~Svj&@G}f_ql4)`^6pscUx*p3mAZ zef90Hn%%}daXV>S>HqeyCtP!)_AalHXE;#<8FQ26*0y=5-Cz(ZZ&+>i#MO!c5=@AsR1$o?NCVtMg*GJwkO#U@pN`=gu9{8DVrwfKOEf7qN%HB6dZ>xg5L zTz#n7X;FgodIP<|dWXd8L^?lM*WQ@<>FrLF4UEKq)Qlpmi2z*9YvkbT0jSb(TM8p( zPRNgYV=tW##v#ggLVa5OVr&KWImtI6y9AN%zub7p4l6eonIpc0VmHiVv=^s-m1vA_ zS>-h1TpjCt-l#mraWLsGI)@OxV~&d&KPd8~@O9dU0C`0#?Y@PI)(K#&SN~{mB&I2z z^r|D&{BnEj-s+}Ufd?<0oUim46pW7KP-;cPWn17z5ojEVBi*lRTFHj5Wy>L~3^q`n z1TPaYV``fyjt9{Vrz*$FXP+4O5Oy$V%x@^}-RLBPU4nJe4lqwR8B-awz-W}cvuWE=pVK*a%@>jsR=rE%0giftJ@?!)QsIVTv>R^z&|ni~KCrqy?tgs^>QM&; z@`L&O@<3sHVK2WJ@|xd23jnn8F1Jof@g$e1TX<(BKIM^PkWtK%Gvtw@W z=7MvxFV`1-F0aKW1+awr%302kjL15QKh-WGa_QTZ5nKbuL-q-E;)X_4nz#+=m~1u` zJ$w&)_~YrCy;+J4JEHfWr>wi(~?;f{R2Asu`r%={+{M3e$R4*`)_&iK-zL9Rc zB=He&Tz6m~{!~69c-jOt{-5^VJgTXr{Tg*f+ab0SqCm81RGiX?icC2wDk=&hDj-8t zw4;rRh{zOjR8&Ne$P6MxM8yF?1eqb)%wq(UQHVf7fB=C6lAPq^oLj;7{e9p4|E|04 zTKDT(3+aF{Rj2A1_TJA^sjIDI^+yH2L7l6L9c|!<4)Y%}6L*>kA&}lGy8ngkI20h~eLY{MM=uJ7 zJQg)B6^|-Ix;|k))tv>5NQEnn9Mb&bZxq3fpmsERO?dt?mMSiayayqdAK_jndNHr1 z3b(zwS*sf#4fkK%@^i&mTL0y**^QOdzWcd(pIX%dM^$X(T2`sM_SsJ>W&7;ViR`W7 z(+vLG&_d@(vO*W8F3W0?3hc{>$CFXm7r~FSL>3@si zDMMkuv=m~enL~XP&`U}s%)?`c+*u=zSpW>e?ONc;YP&JML%-slFW;gz7Uz7RqbZ7h zsc;mSR6+sog_%LIWP3SrR7K05eAoX>t@>KpyV>4X$9=Z63_54%_-q zgUqLWWn}Pvbc1ui^{Ar(s0O^Vev645H{R9`Z;DT-UAWh?$17`0;HFy~7h0I#wY}(S zObH{PY9S*-*PP~HUx6L9^XqEsw|JG2D61R;Z3FIUl&F=!5r3fQ$NbWudri$Biz}?z z<<_#(6B@MfltP(xbpYDm{9|;i`e%YW07@?T*TYD>M>mg2z^cfg?vSDQXDjmy|6N{N z3qW6d16JUhfFa$)Pr&WA{^z)l0{^~ic|(8)o5TJNIl@mr4Ya^~le?#%7f4P6`-s#W zRn)NoHzLkub5z=2sVc;pP_!hms3V{=hl4wSecS~53Wd0;wg-PJqKL5!D|}Q+WRKVl z;oUp>1HxLx>{P+1lwd65wu0LOIts->m=_M>VNZD#N7H1#4)1o?OWp;h>U1Azb*Ub5fVQ)cPfz1{x zqTYBxrY)!UD1q20wuYY3zUTZrz4%7@`1x4Q7_!@zNcJWCj#$XVfr1G`K0VP5@N|$8 zEML|hCWZ^;0bPL zK;dg8BG9-=`ASPNE9}bPOrnNrBX(o;Vgm*Hd+PWPyhmcz_g3IK)FoBlIq=Zkisl4r z+g(~Ar5lzy`U9S9{8qWtatl(%ZY@gnDTjj~FJuSR^ya`rj&aY@#!_>n=?~+jM0dGP z;ZPIO8c~gR4yL@Y%v+g#u{*TF_7rRO3G~yJvcFOpD~=aka~p5xZ7L3SV20g`*lKd4 ze7$%5y(1(|tm+dQ?@DHjf?E1b^t|>X=!$LaW$akVLpBAxx)kq7HRxlNGCl8c4#Z>t z@I1PE!ay;W;I`8Mdt=ha7JB~-ax9eb%{(YO@lzeh0#!90mv^4YQYdqaUzpbOFG^Si zI5vQ~LC&;z=*^CQZj69d*-xWZkEph#kwS`c-$b{4YgXtnxbmB&$qY|5lYXox{I_Gt3wpd^Ry;hkpaa|D{w&Af#2< z(8aEr&KC?)CsHo|%MNpb&`V6KE%E%8U58tIIt(cvFUzg1U97!%l|7k39Z;TipF{ffp z3E02u{R#MDv-78yVMcx-kP`ieCcb6o)QSdKyEi$b++GWwKvQYf-3yBT@C|q~MVf_1 z7RTaauL25uma=Fc^squ7aKl1B;4eoVZM_BeHvePR{T^WCd~u$tn`a?j@*e8PfRrU3 zfQAxu@UlwI@+lX)m}=TN^gizqQ0*Cf6hc&OQ$Vk|E3YgBSmA$o-tMf-yi`vOw7@AxXUj8^xRgl2biFtAU2V??e(K+B z^friS6s`+j?PgQZ)%M}^x7LIwaL)OMcY=x5fdBkJlyNWi8d|Sh$};Mqj4Rh?t}mhE z2S&B%5^q`1;7sX5NE~g}b#5V%gi3qam>GI55!gAVko{9ET@K=VSPT`wA-G+S`me^0 z#S)PK%VKjf+HsY#4kRnTIyq7%*K~;aLLtO@j&-Xj#)j_y{7A)9g0{AJr%5v}&*O|U zW-P=%uOI#Q@~-kFsp>gDA}$zhy7TD$tv|>ubB-tJ;Tv(|5}1TL8Q;G0!w<)Y6+&hb zoMP~EHj)nd->P|jwc`={KUUEXkl8cOHJB;+gWi$B>r*F=U&N55$07D^OuM8w4q!s%rvl`ey8p&FLN zb6v@vZKtB(hgBPEp<1ZAxRwR3hnk%T8N*Kl@PCf%xWCw@2C9Lo3aheeSRWqj?>LO4 zJ{ZoU9l+LhAI?(Rpz+kOyDn_`4m`EUU*yo7pKjPk^3;gs+LV;E?D&}w&^qj%uEz3o zNXWM>5&bO8h5NtE*CWz-h1MP4)+a`@HHG|c%-Ow$x>ecA^@q}qb}?!kC;cOD!NNis z>@7|Th?}-(tWu4;ie?}inaZkyi!YOdu2F#2hV`abL13|xUwiVt>t#V{2Q~2B>-nNOT<^| z^E&_!F2>qdbCvbVca~wqac@$kM+bZyV|K$Le{2vBz~A9zcDpkspmvHR7F6^}MJ$xv z#NY*pS>;SGvfqA;f^NZ9z#%|6%2Vq{D!kY6h&jfbDjR2qZe$}iE!^i`}ue5kg-kXx+y0b zH9HHs^+M)YKsTb;t1OUi1Kt)SG_z#~5*j>P%3I|)xh=?7DiL-tBtqk;TnTQ2bib3* z7s6a^sWnrX=5ds)WJm}Ef$1iWuXHSEJyMue@)GZ1Vi#ba5FTkFvl${PiA4xYF>Y;I zu8(Kks6f@6o}um-fT%C`T*lsXMd4e1)UdpX&#xYf!DI1QI88GJeTRlPWuczM@Me77 z-kZQxed1g3I0}=S;yE1gG5OVlg@fqyB}5o!=S#DO8K0Q-xNj1<&!5dvlt@uxHI?)A zlQQyMR|I=ySy2k@{ND6{ACN1f7rO2sjiFUE48yJp0yeRh;}j+N0SW$yRlMTNkN+01 z({ZxtzA)pDo#Td0~7BAm{Ocdg7qONytjX8|Tr?oN#lTT;G#mpn{qaMZU#Kx~hEEfc zBDUZ&qTRf)0y;J$kyFnqmxSWFxn`bNU&$zs6-pFy^_b(1m~}#)7k0gS3sUnb${HDF z6bP=7&h6_`HmfmX1r7zHp?FhyIKz|C1{MYO-E1^1&;p zqez1(;@Ope{WoTP-C8=vR8U8wGKyT^pn7gCJwas0lItmNxF zxKmd^uEk$d2RZ(;%5)XA*hdy>jd>%}i@ELSYG|Wyb3HtnmF{*420JbRgyH?Lm?fKD zZNHZ`fEFK{KL0_Rk>K2p+Fs$mRi=G2e#kOeXbL*BP!BBe*O`YX^6%potOtWla^Eg`+uEQ>%*tI79jv-GW17llrYc#*(2KF^R@+}r;5{f z^3ZD768pgt7&E*yS?h=;7K$L1-6bwaAK{FGzB zcrDI_L*Q~|uP}Wkk0=!jMH#<_1s@l&JB5@FOn)IoQ>ZNU!w=AV{h#+*kEhCPQ9bMj z9cQpMV_1>QZP@=F-q%IEAyG1D-KAi0&~R+LYsdxblf6fS#vMiB;9{CaSQyzP=s=j0 ze`C{0BaR%-N~%^xKH+f3gn7)j@@O)DE!*8Tw*=ZI&G>^Tqj)v<{T*=Z1~QF5GlgSj zY}HBD9mmz?MrSd$)YbMM>K0@pt4~_sD;O*LcJBsKd_Nk9K#cmDu9* z4p^+-2s{e4F44*|2S#2$tw zpYsuJy+-H`VRtG%)IX`Z|I~62)6=4k>L3l~V2xj-wH$cM67UO*GJZbd*wmgyB^D8b&gy72*V5&onD(1oywi^8O!m9csaAnV!$E< z#3#3A#$8(u+-upfgU)gCJ;i8WzLZeT>2)8^mHAJkWGA<0uwQcInyE?PILjNBvzib% zH@N{Xp7^JlRp<;2}j{;q#HQ? zMx#uL0mk;qx#Z4wYWaDmU;ZOd*}~s7={6qgg`K`$3Xja8cgbkGO#gfkB%Jx;(I0P3 zv)2;0d-?F}JXTVZ-1M1*w;Ls=0t{9xoI$Vpq?ha_icY!A(@~@Me@qwY0av7Xy5T{vIlR&CL!tsq;$k~ zDA+g;XORKEErR-iKafbjBQUlekHpt1w&0t9nR*Bb5>tfZG^oGuZZ~TJ;{mZkH}u}; zZ9NEw7ug|vPCP7P4W3|+2Xh}gi3`8JW8yg|udvQyn4ra_=i8lodgCZQ0E)=!6Nn?s z$!Gqee3k*CE=%fS`3JOMc@&ScTNN+rl{N(gsc_|$%(l1go?#*lh1;c#Y)WD9NJUpA z?X#)9_ByV4U$Rw_LlE05tVX}`bzvBq4z-$N!%T4;yZ9)5sP4ACIk`}q||J--c-(n=|+ z;7q7w_?NP z3<~SpxJmcno_Sv?Up9p_b8V}C-u`K4<5VlT*Q3tZ=Fn{X5>D(5Fo-2oL`k%G?&h)n zFP@5=1z9|uNdLQ|)zk&gZ?K0C(fAn8BnxgSypIcqaRV-=gJn;XfD#N_Wd?Q+7m)@z zqwx1gJ2`V$c#e*b<6w&fCGu3eu7_2)?p*i56vAInxebsr&i_i6GPjMCLW8hUwX{qKtL z+xeu9jUNxpVG>U4KfmB3alfl}*{U)9Im9c-EUGo=TY0;NeLwp^<1|nUP_@c?c z!gW`JT{`bVuOx+bA&=7sTys8dAqr1+;{AvKbyy&B2q@Z%IiP$jk|o&2o@V+=X(mQX z;Y;HNl345|EEf%vz){%(j)~o(N0iODJ$d{HM!`;EvuE&_3Iy*!5>~o(U&-H|3f}wI zD3#vfQFxTHyCQb9?HNMH9HYRzuXfnNKX4c9ja5-El48xS;83{o zmc#vKS+HcVBdRINnq}G%e}&)1PFEewAR?u=BWJ0Rj*4?L7IR0_*t8d!;N%yaep8ZXR0jJRBRQf&~`Abmr-f!*1y&ZbGLtK2!ph8pr!C+|A<6TJ>B<~62 zH)7EizLq67-`81)90V~mwn5sC!8DqzjVV1mFH>7OnNn4+e0}sv!g$Y{V^I?1TDw6& zw#_OcdMdyIv!wXsuW5}F52n7~_U>7>15;mq+5P)FQBQd65(Kkuxny4R3{*B+cj|X+ z9I+uQzj~0}x*|yT>ul!)Hr1QZj;X;!#Q=B%_gK zz=qIR)1}+JVO@5A^}l*2wtlmg{wxI)Uj;#@E*?Ckd&m#_IO15 z_N%TSVzM6R?-*Cp%)eTUPYh?DJ~IcDra#`3K)+an z&&ATdn6?Djv;F;}VA<0|Ax4`2i0R0|&+JLMe%TtCP;NLro&N3BqJ%y1Cz{^;IqZDz z)jp4B$oO%ZW+bCYzvaLj(=_YEi22X!Dd*eRrapT7xQ90nki~I~Pz%vXnVYCRNV=2f z-sLX6n7D+_>xvL6neF%%q;9zm_cWx#2`D*DmWHF1VD9Wr+(52M)j$lxP62|%dOSiA zg)i3U@Y~L86AOEVlPK|NUH+HH#wUP*T?WTk=X+tla$m3nlugvnM0r>yNY=7YfA)J5 zc(~*&9hRxH!A-%=EN0OVy2ESO0WUO_dGaCd+MxMGg;fa%eWUhTtRv+EaYvQQ~yc3I=1yVvU1+_HHr;u%FT+&V;iNz z)?^eI4EiXzk`8C-Faxr3xp+JXPXD(6!yu8$`xm1tR26`WLL3v zRQjJoWAJ3+6Sq97{C(k^04SpECu_Iy+QSEDe|Y~#8-e{aWqOl!qJDJgPF;0nXy>Up z_rC<$JSd=LM`w(Gtu*C-h$%B`Af)B2XX_v<*O+!Epxx>p2mB9^J&V*@Q{FFVy(8QJ zk1~yKM7gsRFOPQZ{7AONa?pEGv8XERfs}i|d3Qt|^hE}}c*dAwg;0g&Og-YlhQMD3 zoJU-94EsczE*X0(wYJQX_&8z?VB~k2gC(#)DjzN(2D4-lKpZEk!esru(o_ZwK1;0{ zE1Eolx^{!+zz=jq$yA;vbFsK?_G|N;9uN1}+Z5M^vqzpcm`dFfu8XSil*3<8n}mW) z4atzX>&2_hFs&ShPmxjV!g}fW z!4kAaZT{%d{1~c~gm2E}UF{_hrSE7`&<}pStJB!w9KE&tqiAAf+c*N>qm736AEe7t z;o21wa65;uP^HPaAcs>$N~*DDMHC#q{C(V5JKvhS?Ekjq!B79#B-cRHJ+u<;zg86Y z>ToC%3)5YLOa7|x5-QYa8IOg=?3y6vN<+STeKSHTsymsk8$gwiSj6f}=5;UWp{&qG zZxlP&t5IF>zZ!O#9`7^cQW!-!EDdznd!apy3l^#aKF0W|9F8{ps_$my@;4DFGZH@UI zCN{Fh@BoD+-UKbK!cJYD8G_>Zz_i!nPv$oOW2Hv=Xp8W}02)QY?b}pSl?RI$A_C{^ zv!${sHzB2lr5dMxY`~pzb`NjBU5uhx6(>7*Oo21Oc*Y7I=i+`Ls~-tuBxf{0*p6*q)WUm1bI$B>2k3~7n5L3|p%d+L7PE&hb z4_j>VQpDt~e)Rj#Jz>-1-Hxec*>O2jAm>?|5D|nBZ>+%!Ss@#+&75Os7yF9J#PgW` zR$*q3E&FsfzY!R0)-cGq{JooXb!8O%d|n9sAFO(`t&=K%uDhIt2VSsebl%H8JH+T^ zq79j773MJi`obY8*ORjt{Qvp7;xFb2`qlY4FwMvi?=v*n`Fii`1=%MzM%`Mo{}!_^ zcR?*ZI(TQcJ>D z7NBG$BGefx?!Cfi@LX%B9=n7Vcp7O9Qyp<|$T6)_A=Fl$A|%Pa$GdBF+Q*N3%bz;n z|0v8Qn|Pl1aAU-$EAHPxSQi^6;(MoY$~lT>cgx^UEy5^kCtLik6PEjha)c^_S>Xe&Row$Zs(atnRiD z_2lQm(n$w^FM!m#)lP_OAY<#`cJTa2C|mH~9HoM5SB3+MKzbQFITd%R!m;HB4_OKY zgHZzi@>h9E%!Z=S>Sjgbzs6uB{WO+U+|8nq&cc8dQC`K=P0%A~m%>8IHtoF^D`@O5 z(c|T-oVmPO^% zyuV#z4wXGwEO`6D0twxNTDs!Dna58!dXIpthKP)1tt+F%9!tfa(0p)eVM7&_xY#pH z;jLsx!R~l9g>8sJ)_5~31fk*x3&mf}l+Eme0emWMN9@2KGiUHPiO>T>5Mj9^m7>|I z)RRZ4T|pKoDF}6Hc=H)T59~8&{DU`lhl_v5+1|Q+qEABWG;5p+!v@ek@BFs;0ga?t zw7lupwWdd}G(YC>CDbkFxsnO715A^c{r|K;9@@aoQ^-Rh1VAwJBh?5yiTP(^277B5-&BN?`V~uTrKW zWWG`n+bbL;K4fhoCJ5h;#Tzib20dY2vYs#(D_fsd#(92eM+PbK)Y0>BI}uxhXE7Z= zJQ}o^OqR3ZM*O)Br5NvnPud}!@0})2g1c>Gd{5c|Jbd9Boo@`$mD*HIA#+>7?OTM& zifdh~XISt`eN%3nOZ|6xi_IYS<%!=Jf_73yb;`q|tdBnJUv}v#7t=7y9zCY~$gU{Q zqh!~#F9lKA(GUXJmMD5D+wemO?1xtikyIRRz`;jSQGCibs0vQ2#*Bh$k2^V^U+M8ZFnnlEJ)hMU$yaL zK>C$xzdFw?$g4UB0NV$BUR7B~3*snWGtXs4EJND8T};M^$O8yiGp0ThyEP(p4LYR6C; zSZ(3r9_rTf)p;BWb^}e6%9l$B+QS-~Kc4}?bHLc{v1`?kZ~5^Oqn(1*G4H4Ojmu}P z%d@*LST*-Z+OeFJ8Kn>Z{ZcubL2F$Wjy(2!UD&?^(}P9Fz3TvdwAuo8Vkn*yn-1Bq zbYW2`zhpzQqsSqFW$$~BHomvpJA&Pf^OR!K4rs%0&I0X$0oF5oxR6iy%?x)%58*H! zH5X>V$EvU_{KEWlT*MTyL>%yy$;7b0qEwWytOi$&vDrKpkHy)6^GfoPl-Rg43%cy+ zdkCE!>Cb^d=F|J7SZH0f{qM`)6GR#YmCwjRudw_W%z`XuaOqD=ccG11v--{RN?X2? zW}Vpg=3<9aMyq-#q?R}C2eK6wov zkcs^+!1eDzvUr~CY8VIL6KoTXZRy(82b0eMG!8^xfCNA+z*!HpUb9mbZ^{Bi3@LRT z`|9fLv02Mcu{n%{SCG0yF-#Jrsm^|61?= zTdOn8Ku~j+S~G4wn#s)JI<@NL|Afyqlnh6FlO zk>AP6lbb!7_IW=m=<|uMZ^kz2>E1sae9kuLqT5Q(g_Ro^6^EJd!Uo!d<1_PhDJf<( zQkU&{wRc!8FUY*5Y2o)!yld;I#uHJG-JHHqkFE~jOVcV>!G}u}2Qj}z6eU^;DcKl! z9vqZJeVU=5iFInJhF8`+J9}yKf=i3PX#@>7$K6;Q z)6n|hvO%m7IAcG350rf5`=y6?WVYxaqRcs7&~Ss|`?1`fTxBQUY(s047i9}m5m<7Z z+z=eFJEofAhb{-;ly|Wu9;5X)+|DcsYRYp(YGf)CJ>b0sxFY~prO%W**P=pEylnno z@%%R$8D+ubp;ndc>t%RUew1Y?k}g>z%zGhpUHljR3z%}skK<|HLe6BQDzULue^ngk zmTUt5fy;kGh98+_L6^^tG7GraNTBpI#zO(nL93zt$x*yU7tWey; zkF6^IWO9qxwD{F{Gq?|N4q_Vbe+s+M8_fhb$GI6#wo$wM6M37YpmC&%V;%JTJ3y|b zyoON+L+Eth$I4dvwOK6x@%4D&wFF~B!5{~Q>Zrg!?tIR4Sdoo)Fu_b$zzG7}ww}t`4ASx47Ig+Ob4FN_QWXiS!mCu2_8oWww)Mo{fJMxFa$#I5 z3}sd9XX>&M?-D3K>E?w?kU&R}gcq+TnuWOBoksXWZaV98EDPQF>{#XE6X!Z?+w~V! z6l><*pt<_S4iuz|f0|cV@CwO->q3+|Esw1S8l;WZYDXUhy;Bkm3v{Fz;4^=LYf78r5O@79^x$pTqK@8?pgBA07)i>Y)6x0%j|It@2_z zDZI2GtSgeeO62}MmJSnM%Y6Fyu9voLAIim67`=|a+(G-=h+C`hLKJ~?Y zY8flw;BDm`4a)cB*D}eKQ`nerQueOcUZk8`FsU{81do<>7g5K(>r=Ft;c)wIh#7K= z(Chg!TfXnix%AtASwZRn&5!ksJ3?(De8TTG5sY4WXe%5D*Sqbiz1^kULhDiYQ6`{A z>Jk;H9D*>^{M>XRv1~*=mK)eKsiKUvUc!ZV^?!}CimPyAX9A>=WdavLR6xz@KNs`; zi-CxPnQ9D6vD@NhCD%(}fznb)d9eDJka-hsSEP1Blh~lN8`5wa4ZzRT`D|A*JO*W0 z5WO#sUTez8q27KkmpBgre@Bwfm~|qCv^e^~%o%5(g%M|&YP{`M73U2YU#$iJnx#F;0#-hgDiu1lP`kK6usqjg#-*iE$0Wd6 zCg8rf=vM;P4dBrid75gdtwAPr1C&DTX-mmfCfq&Xd7jS}3 zVxKzqA?sa|(N2RhDihkpEb72~=t-#?x@P*0g_BEhojwgDX(UW~O0o3!vFQQNAHtb@)!!RZ|-`e|m!>Ng*PX|&-$m+SPgB@hToG5IIVz=R%D+d#r!t}COxI6+Jcss|& zo1x9X-ja-Mus!GX@ZIWlhOZdAp_PFXYvoZuP?H88+B;Ot%6tI`f@b@(!*QASN<<9H zizCX)Ip#>^$Dm6(Dof1c6f!32JWy;bqn{%G&GPYHO6YrOFRAF~JR@qaCGpDPsvNf( zOT@6sn;2U^A)cIjCc9C(_cNjR&s8h+Uo;xL%B&6g-G*5~V7xFmV89pVz-M$z*dZe;6F}cfZ1$q|AxfX4v>XJDc_E zg-sy?=p@1?om&PrTmbj4BzTMhI6#&!lUH#)*%i~lpF;dLwt+Q9TD)oRnpvYdxB5PZ zAM?|nX)&YGLQDI>&Oe1*M;*5X^a^e)1M}6l>YNNivm=Svz}y$~*QB9nrRXyg8}SKl z&NdrqIDX{IF}nP9>CE7)qDXg-&Dt`JND5ibFW+^g)kM^6MVF=MJeDVyytb3n&IG%& zPuHqhl5JwCKieDu*d*c429Z@sd8W@#>Jd6Jz*O(cb{1Ayn;<=mu-!vJ^5-t?Bmz3f z35(rzw6l41bNR9byi|s<>Em6sCdi7)-rG!lgqH%lgf`zS)`3R2L6Gr`H^iY3zY8qW zu~gW^rFZ)k>%y#Mwtq!2$wOnidpCp0X@;o%e`s>l2?DlZ*503ibIq=oq3`%|T3`|V^yy5lIC`l^(EK|)o^ZC=AG0G8aR?)hh+3R`mid6`w zi~X8-W(N3v4#Ig!uqAzC47vg)g`(7x>wCFg`icS8!Tv$4(Zb^9hB}WhWww^*RgiWF4LVfLymw!+ z&0{0B`SRzx^Pw3>oi3WJyBQj?z7GUPjDp+beQOubAnp4(a4R*_ruD4O@%2|(MPqgP zK5LiEl6wt^4E|2MZtSbz9U>px{A6W_o({fHKQQBLPBK}8K&>>RgU7A}=N1YFC`WBU5crM8E+ zW@i8Ie+Qs~@A7U%wgv0y#@cs)t{uZ!BdZ$1L2LO^xbmda=R?C~Q4yA#M}k^?CG9sC z@~Z^9&>mLb#;rg9ym{_$wQh{0RA8#OTzKD;>!pc}aXgl*Ut40L|B}1JQqkj;6p-Uw zY9umV1j~eZ59jX+PK-N#J@}<^%$QB?Oz+Y3)d~U;tW){yr)5@0^zzG^=st-6g=xJO zRuooB#7zGGF&$VJOC#RfJ(o6f*7ob}v(1CTthfW3H~xqT75uq%{$(iLtk%KqJ{na` zx%glqFU{b$`xAR&Chp;3YHdfHv&Nv%D`Py@3ZmdH;q7$ z@qrZLDxsq+vkt#iHELewIvE3a-k5cDaRvfg@7L<^3YT&Y^LMzld01+(=Gua*&^g;H zy;?KoJi`ko8;pT`_mRu4xG@E@_b1k~z2Y z>)+X%4!kyqQK>Ijg=Q<=Km0yinxlWf@thOXXRiVUN?xlE%q>W6_-maFbu)+;_Cw#) z4o}Wfet6HYiOoqiH1pgHQkXpy5oBNa$7S<`#`KlR4fa!V)~=B+K7o(U5OW^scP#0X zYg7WHlsK`!c(=vZgYFy2*#2+1SxFUBj*uI>oE zSw7dRq9hCFky94Wy-mC`ZBZo)y>4l|R*v8Ye?DF#UyBUJ#>y`@!(3`NxATd*c5BMQ z{J%w0ar2nQ*GA?M*g*MEX@P;TzhIts`rTCL8^u=)@88bZ1?5ihURa8IRt!mCs=dn+@W)NiRF5y~b5*%T?y z&X=W(oWOME{#=u?c-rkZ^U>uYUm{u8$4T(P3KU$e(R4xJCv81HVM1~7S<}K5k*EWa z>oUaix~mEJguBBbu!9<{kNfRv+UKf(TDKZ+EiI53=6B|bJ`HL#%^uF4sG)aPrSv6n< z7w0{k7WBtbvz2MKhecm+{vdZ?J7PUeFSg%I^4vU_yOs1(z3;KpZ=n1^DceG#UQ9^*e7t|tes1|^s~;_6%<9egqn+vdDoFUdI;N0 zy3fqK{b-+a-DZuf|NRYRfpuYqZM)Ct*r*#=R;1Nh4wmowli*c3oT7!T$?9A9fBvce zCl+udH)GqZ?zMj{@9*0EXz{M#X~tzdO1Z4HO~Sqq2Ja6HyskZoi{Cv8OeI%3wC-St z!bToVK8h`fqJ{h5>R*1UtAfqk;XlB+R!P%pAqkoW@*6z{(w})WW!L$9pR*6uz>o_S1dbMcy;)(gU!5(zKduyJi zZrBs^wXu7;BJ>~Z>{}d=T|5vtoH|P5+Z*>g)u^JGFE6|8U%~cu|L$Mi)R3KA9U1E>R$<4Co8t$f#u*^wSWio`{c=4p~I_U-2s<@Dc6e{W9Q7ys*xt~#(zZezO*C80xcS8DZ0 zN=y6|`G{5~{oM)ahMsu!0yU!pU0$z>CP<(N=r6A_`TGc87x2#p1g?Y{m?FUOxeo;v zTtDirnRT}^q{R11{d{M~Ao7E4zuu_pBmLd^q}Fd{$anqD81N~j3b|T?&0Lz}tnH|~ ze_)sWT$<;s4{I?4LPrE%t#;>40LG8LXqyYaE71+gV&TO6sA*9kv>c%XCC2gCuW%a$J4VyROZJv)r884Uen1!I&BnJM6 z08%#RpL)PRE_mf~V+ss?CywPWJe<*uzehicTmQXHxsf7e%_n@gRhRpkD0Y|s=dt~I pc>m|?|5<_mmsUXbYAy;t@7_LVrKMBGH1OY{{Z{+Z_nx`)e*v@^YZU+h diff --git a/packages/lustre/examples/02-interactivity/index.html b/packages/lustre/examples/02-interactivity/index.html deleted file mode 100644 index 36ddf10..0000000 --- a/packages/lustre/examples/02-interactivity/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - 🚧 app - - - - - - -

    - - diff --git a/packages/lustre/examples/02-interactivity/manifest.toml b/packages/lustre/examples/02-interactivity/manifest.toml deleted file mode 100644 index ee55acd..0000000 --- a/packages/lustre/examples/02-interactivity/manifest.toml +++ /dev/null @@ -1,49 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "9ABD71D63F4B8F362CB824DED2C4CA64895DEFACD8F22B0FF055BF15241B1AE2" }, - { name = "lustre_dev_tools", version = "1.3.3", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "67B4E62DAD9B8323487AAA697A6F3FA72348B6DEA6674D65D4F7A1407CF377ED" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_json = { version = "1.0.1" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { version = "~> 4.0" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/examples/02-interactivity/src/app.gleam b/packages/lustre/examples/02-interactivity/src/app.gleam deleted file mode 100644 index 6e69048..0000000 --- a/packages/lustre/examples/02-interactivity/src/app.gleam +++ /dev/null @@ -1,60 +0,0 @@ -import gleam/int -import lustre -import lustre/attribute -import lustre/element.{type Element} -import lustre/element/html -import lustre/event -import lustre/ui - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.simple(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", 0) - - Nil -} - -// MODEL ----------------------------------------------------------------------- - -type Model = - Int - -fn init(initial_count: Int) -> Model { - case initial_count < 0 { - True -> 0 - False -> initial_count - } -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - Incr - Decr -} - -fn update(model: Model, msg: Msg) -> Model { - case msg { - Incr -> model + 1 - Decr -> model - 1 - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - let count = int.to_string(model) - - ui.centre( - [attribute.style(styles)], - ui.stack([], [ - ui.button([event.on_click(Incr)], [element.text("+")]), - html.p([attribute.style([#("text-align", "center")])], [ - element.text(count), - ]), - ui.button([event.on_click(Decr)], [element.text("-")]), - ]), - ) -} diff --git a/packages/lustre/examples/03-controlled-inputs/README.md b/packages/lustre/examples/03-controlled-inputs/README.md deleted file mode 100644 index 95ca620..0000000 --- a/packages/lustre/examples/03-controlled-inputs/README.md +++ /dev/null @@ -1,70 +0,0 @@ -![](./header.png) - -# 03 Controlled Inputs - -The most common way to handle inputs and other state-holding elements is in a -_controlled_ way. This means your app's model is the source of truth for that -element's state, and you update that state based on user input or other events. - -This example shows what that means in practice. For any controlled input we need -two things: - -- A field in our model (or a function to derive a value from the model) to use - as the input's `value` attribute. - -- A message variant to handle input events and update the model. - -```gleam -ui.input([ - // Input's value is fixed to the model's `value` field - attribute.value(model.value), - // Whenever the input changes, we send a `UserUpdatedMessage` message with the - // new value - event.on_input(UserUpdatedMessage) -]) -``` - -## Why is this beneficial? - -Central to Lustre's architecture is the idea that your model is the single source -of truth for your application's UI. This opens up the door to things like serialising -program state to load in the future, time-travel debugging, and rehydrating your -app's state from a server. - -It also gives you tighter control of when and how to update your UI in response -to user input. In this example, we only update the model when the new input -value is less than 10 characters long. - -```gleam -case msg { - UserUpdatedMessage(value) -> { - let length = string.length(value) - - case length <= model.max { - True -> Model(..model, value: value, length: length) - False -> model - } - } - - ... -``` - -## A note on message naming - -In our [state management guide](https://hexdocs.pm/lustre/guide/02-state-management.html) -we touch on the idea of "messages not actions." We think the best way to name your -messages is following a "Subject Verb Object" pattern: `UserUpdatedMessage` not -`SetMessage` and so on. - -This approach to message naming can feel a cumbersome at first, especially for -small examples like this. One of Lustre's super powers is that as your app grows -in size, your `Msg` type becomes a very helpful overview of all the different -events your app can handle. When they take the form of `Subject Verb Object` it -gives you an immediate sense of the different things that speak to your app: how -much is coming from your backend, how much is user input, and so on. - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/examples/03-controlled-inputs/gleam.toml b/packages/lustre/examples/03-controlled-inputs/gleam.toml deleted file mode 100644 index 6b9e4db..0000000 --- a/packages/lustre/examples/03-controlled-inputs/gleam.toml +++ /dev/null @@ -1,13 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_json = "1.0.1" -gleam_stdlib = "~> 0.36" -lustre = "~> 4.0" -lustre_ui = "~> 0.4" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.0" diff --git a/packages/lustre/examples/03-controlled-inputs/header.png b/packages/lustre/examples/03-controlled-inputs/header.png deleted file mode 100644 index 336fb184fd72c44e8b02f18fa7bc9c683dbf4ca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330067 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%0D5G2#7bS*AJR5fA#w&5 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

    dD3AtrtFF8b8vhVSp1X*USbFag% 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 i)a@_Tyz7e=hSu`Dx;;ScQxa2&U)43m z^Uv=-!m`J5&L5w|X+0RQcmNKe3aUi10U&TId7*Zz%B_SP2y1 zL!x94rye=fiW!{$X^g;zM~NIg9^yyjGH};<0TNY%LzIg06I1c_$q{9U*3x%#&;4mW z$FMGXg!^b9g}M0lm!|c?`hqZ9^YXm?_li|L33S2niHL)&kGgdnrNz9_$3<^gN{i*0 zU4<#c1bdY)6);(V52C%}bO3M46cG<}Er+`3(_aO|}wct23rnzN%dI3I1mpV0-*K>coq1j_=wYQJrjkZv!q6dh~}hZ6O3E zl9YFEkW6=lFZzDZZ0-t!=<(|8Ij?^AzvTAMMDxWka(}JW9v$c5<7jQXh8-Q4QONZK zP%8oF9Pz?obP1&w2KgiRmq9Wg_wQ2(r>JxLpvm1<9ksz9WCw-cb?glILw|>}#V4o! z?ZB}U>UOo&xNl8)zwng2I)*Y}Rl~EekywdkY%``I|5k=L0~xky9aQ^ZV;Tz9NXM7v zXvSZ}x42phC7FnRsCYPA@D@H(S?VM`Pkaa$l~aa^?T<|M(Am7~Ab}?uQMYtf&>Oqp zA*Y2+I>cI?q$NA&FL*z(e?2KV_)`=ODOkr`VS);}%NLaC4~BG#k>3-PZ#Z|XECI=F zHRqcC~=qY%_|7^9i+__sMKV+OK5AFX~ zU1lq=P9fe$6^cppg?)BGaBeVUR%bU*z97Ai`qdSA;<;swU(C$ovc%1#wdi*XPDKW_ zqY$fliKWe*8{p?a*=1$E&3xX1dCY&U{~Rq}M-1MGMONDKBNErNrd+Y^HMBV+Iuf73 zcu5So5r#VX{I0vj`!!e8tmK~+4pL;SM$Xv=+(8xCivkPlq_AOWg!RFZ&$AbfqrWP) zDM>>p9tDTST0Z$9RYA*i4Ov# z+__I%S*l6r9fSh$C>aNsPM^PzzcBWBKR#PU;}yck22f#-%>*v)AztSxH15^{cFIz- z6c@2Xh=>QivRIf(!{0_h+z^331*;2G=2b9AYgKuE0KknqBG4v#|3m88PwaUx`6Jw2 z{7z^yu>InuAE`=hqw?ouu6cPxGX9u}S>_V?TNl9IGjA#uUwv;Z(VRa2@vElut}Fky zB}Dhr<=5fG?8n=V+FQM1<;_XejeoYk23$%wC+gofLTk?35E5JB`!I|GX72o)ZFt=Pj|w?aq>T@X zV_O(_ZH)3q)oJgU(|3jHQl{xO4#c=STAlm@T|U~e+MRPdvDn6Hf4F;Zb)I=wOn~}P zzA$C8nVtWiTI$IQ7F4}ibZf+orDBQO*xQgjP~N&Nf^3#Fx6E#sYDp0yD7z^H|2wIf zCq`|63K@k%wa_FHF!iahMI=x_&=mX(a6*8mU~+->3NS3B9hvl+3NUGMY05H}`Ybe+T2%RD?%1{$%r(=luP~a!Tr@hrar~Rx zs&`&-iWL^uR+kNe;_$X%1u)nS4Va7uLBsXIaW;d>$Hvn9^?q^4UnEx|v||TrruC|4 zqP`1lR+i=Qz>j)V*(p7d{}<_Hb%rvYW3d4h#%~syt9h-HCuvIWf=a345Npwx0lb8;g9XKu+_8r)6?7$~NoqRBV7&vj-iFx3v7@0>}=VKXx z#BE=Jj!W7vJ zaKlDiS;+$s5fqSM;ZN01Ja#ngl&mU3ECg_uEO3dcGj{^jAm1}%l)Rv4!pPFc@Fh)= zxeWAD0~1G`#-g#(pnn1y=FHIDM9{R-oht~ln(&YIUKm*`TiASYi`PVuq!@T_eQf+I z`~F!ol)z9t+TBjb_bSwFydZbSCvxXV&u)}8E6)%mPnDiWhi85~jQ?Feg?KXZhdnGq zfKQZF6jJ}mMNut(0?PIQ-_2qO_@_7*X9B%OEfg4yYn|IBv^8?Nzl7ch{NeyGFg?pZ z0@@kyZGCHc@^i zT9vXT7glvzRw8jQ34df0FO%elSK6$e)>P-UXl$Y1u7Z2R*7G{7JTqs=*ATu~s3kU* zVY`cL`V)S@F@9tGMW}k~bP&f!&(ajtXbPkTpoS+g%OIoSj2(DJODKaOUENAm6)#d> zEd@TX2d$a8XE+!G-^v3q-E+UhXy~^VtYwmgTsCFtZbfxTmyh0rH{oY{%BpiOI;LGb z11u&tA4b#CmSv(@#DxEds^Uo*domO6y8xs^t<*EiV7ylD<{)ttB|u{IpnrmaHPG|Y z?J-#-V|Y`*;u!_^27Kn;AmO6c8++n!KVQ_4P*&S@uC3hDx?C&L_kQ}dcnu;D=&6c| z3nOaIwD+}ds0wS@1*YH?u+Br*HpIB8I+ir?cnbO z{e0LP|E^mkMsIsnE8lk&;xx2g8`oe5H9;>O1l&;~*zRou_veoN`-1z&>N4G}Efb#q z6uiv%pWpJNxRA?p&iOBkC?qCR=TIJN-4Ol|q!r_-#SDU*o!v^w{CxCrr!Q41yP zUqATI@1Oz~-ajJ(!^nkD$f)R&L8mi4Tx*Kc1^bBhP>05V3;HRc$ljQ4Vc37aI%RW` z?Z5(@HYpgh997}oy>MTlvGBP1X)aVwlTb~*v$%hBhWfpWd}%XlUBB+avO#{Lhpy{_ zRqkaQ4i+5PGZ?Z`{LiTBv4)ut82obVmF???VpTLaEh^Uwm#DhpJr8W^?7963oKVIw za|Ygp#3v1Vh@q+U`Rnv~l6)Z$RtIw*+xju@}X z`m`X93Dq`He#<3rhp>KzZad=jnAtYjWR!!=?TvYU#~kL!5CuyH=}sys;3FX6a~E#o zCOHB0ypWXjo8XaQV}664jL82ZMGda_{6FbQW07ZQR$~>|SD->QI*#49+kj6j7#FBC zWKU=;sDmZbKP20wTaaQWhrKOc@bcRk?pf4(H%J3_H!h~nxQQYypS8#2bx&k3jk>3K zowMB9xQ4&Oguiu;{_WhbD(g3G$;x#@I|a0n^jP%${(I&wORQUI6A(V+dcpJj?*__s zMH*$~j`#ZskJyp>f~RG$6jFs>QO?CxGeqa@yAG)lGY-it@FY6RPqVR*Lcf-F|KT zsW{OQ^wKvRm4(2@c)i`}Tfa{@UnyJ)cg?n`Fk3=ZUb5Yj{ZyaS$9vABJD4=E*pwSq zI&{)3^>^zR#cP5sBw_wdeLV}0vqFfv2WdAflzl95eAP--1Fj2ysQd6>N%Sq&^0QwE zbr-|sRSIVbKBAcc)APRo_iW)jGB~#ec%W zH`4ik!J-DrD%}HdeeppC<&`rb7f}@j4_cn`uD}u+k%T}dGcFTbLa$#yEXHWCj#Kw` zP6EI7#Npy&pgF5#=KYLP(P^n&!TwUm~?UMMa-k zsJq|&28+Oioz{l4trUYv3kZMKijEdNb?LjwGF0>>!Q`-pQymGc>&gP%@qsu2j*dP{i)-LmsREw~63*T!107qL58M|@@+ zrmRgrmf*XE3~ES?e2uyt%tzi@NLp_J4SBBo}-0i$tw&yzF zJmp`-j=xaFTxbWt_-&C|@&xq`PrjDp+pM~SRK*ERVx-cU!J;*bf}R35h2irMD2v9h z=i3(N8Z;xj>~9)`u!nV%i4-n=@{paIKBM63rJ@yxql-~h5CxvF-Gk3e!{nE@uOk|f^K4Q#3=b8Mb{8p|`(R|s=JMRWNa{kio ze_lc8;MK!M;kd2kOf)Xhuc^CU+~8T_R5LP5*XQ1SaG_9==e)V#sMM-v;Z6NLb9wu; zw`NE%wB3F13o zb0x)X@DOe1`RqQh2ius`mX)LhJ6lHO-{!tndb2=1i>vbs7lo8qh#B(B)>90FElDL)ply@Aol2|*+HA$^MwabF z08Jy_?0wV{#IqpfBJ+IkhHe2W+jZd7RtcR%Wi;^3oBKI<0Di2X>-wSZtDg4H{zj>` zE$coC80(+(uex*Qa(6sY@koq0S7bFe#h^(L#_`RPU<1zywuO~DSfKvk5Ykn*$=Os% zpC}=;>-kSNP%N;KANNop{uv^bsPFRm1?)+PZ17(tnre*o{ch!g-YF|EdxAb%fsLE0 z->)y_o-0gFjH593!6OOp2v$-NHq>T*=G>&!)*hfnqu|V6d{|_Tm z-eqR>?=XA)m^t;uXc|ViVi3DmaSMoodLkmvqsmVY_++w{Z)uW&ek=x*uKTKR?TE7I zC2A}1O2`bJS%71j;};9uDz*eMX*J|eKN~*LtQHYmTtc*9!>?BpfuWK6%CGS+p~U|$ zW+hFeu9&`So&~ZP2z#)BGa)>FBN8|XN1z@En~D-$VUgr0(e=#f`N-ujEjt2VA=L>L zi1;H(+l0nO@VtlYXiq|HTnM7g@m!@Z0il>R;aDW|vRZ;}x)WH8=;GoR^pvmdr}F#v z`Dy|Pt?(oV-nGgroXz;YvD?ZM|GG|ph=+PCX+QSQ8pBPKzL>%hI@oFFoWWnIN6Y?Z zQ~9lkc(109xB4In)Ix`ITYO>V!X|j7wb54VmRyP^3aR@pNnOF#3T_GmPzB3+&8d;W zJHW8MJ+&rT7I#!exf43MF>g`-xvl1jL6mh5s2dF^+Az3n&{P3J%6U;W{&+uYFG73^ zaMl()w*2mU^toPO=tN_6S`3CoBccAl$fS)Oo`xQ^OMqGfPt#Kho(U*=wimDLpc`zr z1MIQ2(Uvnz?^Es<(Z*?^Z4OdKpt1)lv#R4hT)2UsWT!eCIw+F@GM=MN!5ujUI{h8u z=bb&O^&97IZrBkjdYbPEq7z~$N?#Tz7GXM*^yl;m;zVzFOMB)N- z^mLTQGofC}%*7~Rj5igh1*xu^Qr%C2ikm~7P1yNi7D2rAlSFSYa$IZV$a6Tep(L%^ zc(A|JQnGyiI#5&pwr|!>Cgv`m(bc=n^q@tqLvv-x7(lM>J3EoH4LoqKeK{#waKuwg zl$L6wY*N=94|SKWd{-E}HuK&~Xxk9Ss=)*m6pK29g^IQN)7f4)?YA9h1Z6y@Ie;-E zkDvltZl@w322}_DpVa~Bkt}WHyG{QYGOh|6D8$0+NvO9#mmuTQ6P@~Milp|N(F;Pz zK~(8Noa)lm2@Gzl*I$Rq5{XpHiAVq)CH*Ot_^C*OtB zaMBPCH!*$wJA8v%#p5?K3y?|oLDP&F7S@=ulk*W^I^affkqN zm8LG9iaG18=5*;{)^(;&nHauf+vYZA@TL%bZtzkv^rgbwS9lsCb5=~WDl9H|j(DYc zI7{ZL%YG6vhKQ*K6;irKB`2&mSjkH1^D~NLgU%0WRkmS|CRXrI)S|}>oQcuu8pn%Y zff>ot6_QdtbJ^sm|9H&HMb%C!Xte!5o*y&t|IR?hA(##!3B4wlzK{fe0*>Il;d`og HAJ6_TNq`JN diff --git a/packages/lustre/examples/03-controlled-inputs/index.html b/packages/lustre/examples/03-controlled-inputs/index.html deleted file mode 100644 index 36ddf10..0000000 --- a/packages/lustre/examples/03-controlled-inputs/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - 🚧 app - - - - - - -

    - - diff --git a/packages/lustre/examples/03-controlled-inputs/manifest.toml b/packages/lustre/examples/03-controlled-inputs/manifest.toml deleted file mode 100644 index ee55acd..0000000 --- a/packages/lustre/examples/03-controlled-inputs/manifest.toml +++ /dev/null @@ -1,49 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "9ABD71D63F4B8F362CB824DED2C4CA64895DEFACD8F22B0FF055BF15241B1AE2" }, - { name = "lustre_dev_tools", version = "1.3.3", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "67B4E62DAD9B8323487AAA697A6F3FA72348B6DEA6674D65D4F7A1407CF377ED" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_json = { version = "1.0.1" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { version = "~> 4.0" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/examples/03-controlled-inputs/src/app.gleam b/packages/lustre/examples/03-controlled-inputs/src/app.gleam deleted file mode 100644 index d44e1ae..0000000 --- a/packages/lustre/examples/03-controlled-inputs/src/app.gleam +++ /dev/null @@ -1,71 +0,0 @@ -import gleam/int -import gleam/string -import lustre -import lustre/attribute -import lustre/element.{type Element} -import lustre/event -import lustre/ui -import lustre/ui/layout/aside - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.simple(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) -} - -// MODEL ----------------------------------------------------------------------- - -type Model { - Model(value: String, length: Int, max: Int) -} - -fn init(_flags) -> Model { - Model(value: "", length: 0, max: 10) -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - UserUpdatedMessage(value: String) - UserResetMessage -} - -fn update(model: Model, msg: Msg) -> Model { - case msg { - UserUpdatedMessage(value) -> { - let length = string.length(value) - - case length <= model.max { - True -> Model(..model, value: value, length: length) - False -> model - } - } - UserResetMessage -> Model(..model, value: "", length: 0) - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - let length = int.to_string(model.length) - let max = int.to_string(model.max) - - ui.centre( - [attribute.style(styles)], - ui.aside( - [aside.content_first(), aside.align_centre()], - ui.field( - [], - [element.text("Write a message:")], - ui.input([ - attribute.value(model.value), - event.on_input(UserUpdatedMessage), - ]), - [element.text(length <> "/" <> max)], - ), - ui.button([event.on_click(UserResetMessage)], [element.text("Reset")]), - ), - ) -} diff --git a/packages/lustre/examples/04-custom-event-handlers/README.md b/packages/lustre/examples/04-custom-event-handlers/README.md deleted file mode 100644 index 434725a..0000000 --- a/packages/lustre/examples/04-custom-event-handlers/README.md +++ /dev/null @@ -1,76 +0,0 @@ -![](./header.png) - -# 04 Custom Event Handlers - -While Lustre's built-in event handlers can cover most of your basic needs, in practice you will often need to provide more advanced functionality. For this, we can reach for the `event.on("eventname", handler)` function to generate attributes that can provide custom event handling. - -But first, let's take a look under the hood to see what event handlers actually _do_. - -## Decoding Dynamic Data - -Lustre is a type-safe framework, but the DOM allows HTML elements to generate events containing values of any arbitrary type and structure. In Gleam, such data is referred to as _dynamic_, and is handled by the `gleam/dynamic` library. `gleam/dynamic` is used for decoding everything from unpredictable JSON input to Lustre's DOM events. - -If you peek at [the gleam\dynamic documentation](https://hexdocs.pm/gleam_stdlib/0.17.1/gleam/dynamic/#module-types), you'll quickly see it exports four types: - -```gleam - pub external type Dynamic - // data for which we don't know the type - - pub type DecodeError { ... } - // the error returned when unexpected data is encountered - - pub type DecodeErrors = List(DecodeError) - - pub type Decoder(t) = fn(Dynamic) -> Result(t, DecodeErrors) - // any function that accepts dynamic data and returns a Result(t, DecodeErrors) -``` - -In Lustre, all DOM event values are converted to `Dynamic` values before being passed to their respective handlers. Event handlers accept those `Dynamic` values and return a `Result` of either `Ok(Msg)`, or `DecodeErrors` - the `DecodeError` list. - -Therefore, Lustre event handlers are simply an implementation of the `Decoder` function type. - -## Writing A Custom Input Handler - -In javascript, input event handlers often look something like this: - -```js -function onInput(event) { - const input = event.target.value; - // do your stuff! -} -``` - -This is very convenient! But it's not type-safe. From the function's perspective, there is no guarantee that _`event`_ is an object with a property named _`target`_ which itself has a property named _`value`_. In a more complex app, we might even pass it a numeric or boolean value on accident. The failure to handle such error conditions leads to many `Uncaught TypeError` crashes. - -Here's how we can extract the event's dynamic value in a type-safe way in Lustre: - -```gleam - let on_input = fn(event: dynamic.Dynamic) -> Result(Msg, dynamic.DecodeErrors) { - use target <- result.try(dynamic.field("target", dynamic.dynamic)(event)) - use value <- result.try(dynamic.field("value", dynamic.string)(target)) - // do your stuff! - Ok(GotInput(value)) - } -``` - -First we extract the `target` field from our `event`, which is expected to be of the type `dynamic.dynamic`. Because the target is itself dynamic, we can again use the dynamic library to extract its `value` field, which is expected to be of type `dynamic.string`. If either of those expectations are not met, the function will return an error, and nothing more will happen. - -This is such a common use case that Lustre's `event` module has a helper function for it. Here is a far less verbose version that provides the exact same type-safe guarantees: - -```gleam - let on_input = fn(event) { - use value <- result.try(event.value(event)) - // do your stuff! - Ok(GotInput(value)) - } -``` - -## Make it Loud - -In this [example code](./src/app.gleam#L63), we define a custom input handler called `make_it_loud`, which calls `string.uppercase` to make sure all our input is LOUD. Then in our [view function](./src/app.gleam#L79), instead of calling `event.on_input(GotInput)` like we did in the last example, we can just call `event.on("input", make_it_loud)`. - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/examples/04-custom-event-handlers/gleam.toml b/packages/lustre/examples/04-custom-event-handlers/gleam.toml deleted file mode 100644 index 6b9e4db..0000000 --- a/packages/lustre/examples/04-custom-event-handlers/gleam.toml +++ /dev/null @@ -1,13 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_json = "1.0.1" -gleam_stdlib = "~> 0.36" -lustre = "~> 4.0" -lustre_ui = "~> 0.4" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.0" diff --git a/packages/lustre/examples/04-custom-event-handlers/header.png b/packages/lustre/examples/04-custom-event-handlers/header.png deleted file mode 100644 index e75e2b5c8db9634747fd3d27249eab61093f904a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99692 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 Q!T(MkJA1VF$hCX_AFYOEZvX%Q diff --git a/packages/lustre/examples/04-custom-event-handlers/index.html b/packages/lustre/examples/04-custom-event-handlers/index.html deleted file mode 100644 index 36ddf10..0000000 --- a/packages/lustre/examples/04-custom-event-handlers/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - 🚧 app - - - - - - -
    - - diff --git a/packages/lustre/examples/04-custom-event-handlers/manifest.toml b/packages/lustre/examples/04-custom-event-handlers/manifest.toml deleted file mode 100644 index ee55acd..0000000 --- a/packages/lustre/examples/04-custom-event-handlers/manifest.toml +++ /dev/null @@ -1,49 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "9ABD71D63F4B8F362CB824DED2C4CA64895DEFACD8F22B0FF055BF15241B1AE2" }, - { name = "lustre_dev_tools", version = "1.3.3", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "67B4E62DAD9B8323487AAA697A6F3FA72348B6DEA6674D65D4F7A1407CF377ED" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_json = { version = "1.0.1" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { version = "~> 4.0" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/examples/04-custom-event-handlers/src/app.gleam b/packages/lustre/examples/04-custom-event-handlers/src/app.gleam deleted file mode 100644 index 725b04b..0000000 --- a/packages/lustre/examples/04-custom-event-handlers/src/app.gleam +++ /dev/null @@ -1,77 +0,0 @@ -import gleam/dynamic -import gleam/int -import gleam/result -import gleam/string -import lustre -import lustre/attribute -import lustre/element.{type Element} -import lustre/event -import lustre/ui -import lustre/ui/layout/aside - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.simple(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) -} - -// MODEL ----------------------------------------------------------------------- - -type Model { - Model(value: String, length: Int, max: Int) -} - -fn init(_flags) -> Model { - Model(value: "", length: 0, max: 10) -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - UserUpdatedMessage(value: String) - UserResetMessage -} - -fn update(model: Model, msg: Msg) -> Model { - case msg { - UserUpdatedMessage(value) -> { - let length = string.length(value) - case length <= model.max { - True -> Model(..model, value: value, length: length) - False -> model - } - } - UserResetMessage -> Model(..model, value: "", length: 0) - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - let length = int.to_string(model.length) - let max = int.to_string(model.max) - let make_it_loud = fn(event) -> Result(Msg, List(dynamic.DecodeError)) { - use target <- result.try(dynamic.field("target", dynamic.dynamic)(event)) - use value <- result.try(dynamic.field("value", dynamic.string)(target)) - - let loud = string.uppercase(value) - - Ok(UserUpdatedMessage(loud)) - } - - ui.centre( - [attribute.style(styles)], - ui.aside( - [aside.content_first(), aside.align_centre()], - ui.field( - [], - [element.text("Write a LOUD message:")], - ui.input([attribute.value(model.value), event.on("input", make_it_loud)]), - [element.text(length <> "/" <> max)], - ), - ui.button([event.on_click(UserResetMessage)], [element.text("Reset")]), - ), - ) -} diff --git a/packages/lustre/examples/05-http-requests/README.md b/packages/lustre/examples/05-http-requests/README.md deleted file mode 100644 index 5fb95eb..0000000 --- a/packages/lustre/examples/05-http-requests/README.md +++ /dev/null @@ -1,137 +0,0 @@ -![](./header.png) - -# 05 HTTP Requests - -In the previous examples, we've seen Lustre applications constructed with the -[`lustre.simple`](https://hexdocs.pm/lustre/lustre.html#simple) constructor. -These kinds of applications are great for introducing the Model-View-Update (MVU) -pattern, but for most real-world applications we'll need a way to talk to the -outside world. - -Lustre's runtime includes _managed effects_, which allow us to perform side effects -like HTTP requests and communicate the results back to our application's `update` -function. To learn more about Lustre's effect system and why it's useful, check -out the [side effects guide](https://hexdocs.pm/lustre/guide/03-side-effects.html), -or the docs for the [`lustre/effect` module](https://hexdocs.pm/lustre/lustre/effect.html). - -This example is a practical look at what effects mean in Lustre, and we'll look -at how to send HTTP requests in a Lustre application: a pretty important thing to -know! - -## Moving on from `lustre.simple` - -From this example onwards, we will use a new application constructor: -[`lustre.application`](https://hexdocs.pm/lustre/lustre.html#application). Full Lustre -applications have the ability to communicate to the runtime. Let's compare the type -of both the `simple` and `application` functions: - -```gleam -pub fn simple( - init: fn(flags) -> model, - update: fn(model, msg) -> model, - view: fn(model) -> Element(msg), -) -> App(flags, model, msg) - -pub fn application( - init: fn(flags) -> #(model, Effect(msg)), - update: fn(model, msg) -> #(model, Effect(msg)), - view: fn(model) -> Element(msg), -) -> App(flags, model, msg) -``` - -All that's changed is the return type of our `init` and `update` functions. Instead -of returning just a new model, they now return a tuple containing both a model and -any side effects we want the runtime to perform. - -You'll notice that running a Lustre app with side effects _changes the signature_ -of our [`init`](src/app.gleam#L43) and [`update`](src/app.gleam#L54) functions. -Instead of returning just a model, we return a tuple containing both a model an -an `Effect(Msg)` value. The effect value specifies any further updates we might -want the Lustre runtime to execute before the next invocation of the `view` -function. - -> **Note**: notice how the type of `view` remains the same. In Lustre, your `view` -> is always a [_pure function_](https://github.com/lustre-labs/lustre/blob/main/pages/hints/pure-functions.md) -> that takes a model and returns the UI to be rendered: we never perform side effects -> in the `view` function itself. - -## HTTP requests as side effects - -The community library [`lustre_http`](https://hexdocs.pm/lustre_http/) gives us -a way to model HTTP requests as Lustre `Effect`s. Crucially, when we call -`lustre_http.get` we are _not_ performing the request! We're constructing a -description of the side effect that we can hand off to the Lustre runtime to -perform. - -```gleam -fn get_quote() -> Effect(Msg) { - let url = "https://api.quotable.io/random" - let decoder = - dynamic.decode2( - Quote, - dynamic.field("author", dynamic.string), - dynamic.field("content", dynamic.string), - ) - - lustre_http.get(url, lustre_http.expect_json(decoder, ApiUpdatedQuote)) -} -``` - -To construct HTTP requests, we need a few different things: - -- The `url` to send the request to. - -- A description of what we _expect_ the result to be. There are a few options: - `expect_anything`, `expect_text`, `expect_json`. In this example we say we're - expecting a JSON response and provide a decoder. - -- Along with what we expect the response to be, we also need to provide a way - to turn that response into a `Msg` value that our `update` function can handle. - -The same applies for post requests too, but there you also need to provide the -JSON body of the request. - -## Tying it together - -We now have a function that can create an `Effect` for us, but we need to hand it -to the runtime to be executed. The only way we can do that is by returning it from -our `update` (or `init`) function! We attach an event listener on a button, and -when the user clicks that button we'll return the `Effect` we want to perform as -the second element of a tuple: - -```gleam -fn view(model: Model) -> Element(Msg) { - ui.centre([], - ui.button([event.on_click(UserClickedRefresh)], [ - element.text("New quote"), - ]), - ) -} - -fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { - case msg { - UserClickedRefresh -> #(model, get_quote()) - ... - } -} -``` - -Of course, we need to handle responses from the quote API in our `update` function -too. When there are no side effects we want the runtime to perform for us, we need -to call `effect.none()`: - -```gleam -fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { - case msg { - ... - ApiUpdatedQuote(Ok(quote)) -> #(Model(quote: Some(quote)), effect.none()) - ApiUpdatedQuote(Error(_)) -> #(model, effect.none()) - } -} -``` - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/examples/05-http-requests/gleam.toml b/packages/lustre/examples/05-http-requests/gleam.toml deleted file mode 100644 index 518d327..0000000 --- a/packages/lustre/examples/05-http-requests/gleam.toml +++ /dev/null @@ -1,14 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_json = "1.0.1" -gleam_stdlib = "~> 0.36" -lustre = "~> 4.0" -lustre_ui = "~> 0.4" -lustre_http = "~> 0.5.2" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.0" diff --git a/packages/lustre/examples/05-http-requests/header.png b/packages/lustre/examples/05-http-requests/header.png deleted file mode 100644 index f08fb17a7fed71c8501c4dbf8af23183d9985224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 369241 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
    {5T={oG(*^8xwT$i+Szp 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 G7$pA`^WOajU3 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 z%0A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

    ufDE4K5nq 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 o5ZdzpJpP%1|L++HPHBQ=N4 - - - - - - 🚧 app - - - - - - -

    - - diff --git a/packages/lustre/examples/05-http-requests/manifest.toml b/packages/lustre/examples/05-http-requests/manifest.toml deleted file mode 100644 index 68abb49..0000000 --- a/packages/lustre/examples/05-http-requests/manifest.toml +++ /dev/null @@ -1,53 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_fetch", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "gleam_fetch", source = "hex", outer_checksum = "7446410A44A1D1328F5BC1FF4FC9CBD1570479EA69349237B3F82E34521CCC10" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_javascript", version = "0.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "14D5B7E1A70681E0776BF0A0357F575B822167960C844D3D3FA114D3A75F05A8" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "9ABD71D63F4B8F362CB824DED2C4CA64895DEFACD8F22B0FF055BF15241B1AE2" }, - { name = "lustre_dev_tools", version = "1.3.3", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "67B4E62DAD9B8323487AAA697A6F3FA72348B6DEA6674D65D4F7A1407CF377ED" }, - { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_json = { version = "1.0.1" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { version = "~> 4.0" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_http = { version = "~> 0.5.2" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/examples/05-http-requests/src/app.gleam b/packages/lustre/examples/05-http-requests/src/app.gleam deleted file mode 100644 index acd5fcc..0000000 --- a/packages/lustre/examples/05-http-requests/src/app.gleam +++ /dev/null @@ -1,93 +0,0 @@ -import gleam/dynamic -import gleam/option.{type Option, None, Some} -import lustre -import lustre/attribute -import lustre/effect.{type Effect} -import lustre/element.{type Element} -import lustre/element/html -import lustre/event - -// Lustre_http is a community package that provides a simple API for making -// HTTP requests from your update function. You can find the docs for the package -// here: https://hexdocs.pm/lustre_http/index.html -import lustre/ui -import lustre/ui/layout/aside -import lustre_http.{type HttpError} - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.application(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) -} - -// MODEL ----------------------------------------------------------------------- - -type Model { - Model(quote: Option(Quote)) -} - -type Quote { - Quote(author: String, content: String) -} - -fn init(_flags) -> #(Model, Effect(Msg)) { - #(Model(quote: None), effect.none()) -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - UserClickedRefresh - ApiUpdatedQuote(Result(Quote, HttpError)) -} - -fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { - case msg { - UserClickedRefresh -> #(model, get_quote()) - ApiUpdatedQuote(Ok(quote)) -> #(Model(quote: Some(quote)), effect.none()) - ApiUpdatedQuote(Error(_)) -> #(model, effect.none()) - } -} - -fn get_quote() -> Effect(Msg) { - let url = "https://api.quotable.io/random" - let decoder = - dynamic.decode2( - Quote, - dynamic.field("author", dynamic.string), - dynamic.field("content", dynamic.string), - ) - - lustre_http.get(url, lustre_http.expect_json(decoder, ApiUpdatedQuote)) -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - - ui.centre( - [attribute.style(styles)], - ui.aside( - [aside.min_width(70), attribute.style([#("width", "60ch")])], - view_quote(model.quote), - ui.button([event.on_click(UserClickedRefresh)], [ - element.text("New quote"), - ]), - ), - ) -} - -fn view_quote(quote: Option(Quote)) -> Element(msg) { - case quote { - Some(quote) -> - ui.stack([], [ - element.text(quote.author <> " once said..."), - html.p([attribute.style([#("font-style", "italic")])], [ - element.text(quote.content), - ]), - ]) - None -> html.p([], [element.text("Click the button to get a quote!")]) - } -} diff --git a/packages/lustre/examples/06-custom-effects/README.md b/packages/lustre/examples/06-custom-effects/README.md deleted file mode 100644 index 0af61bd..0000000 --- a/packages/lustre/examples/06-custom-effects/README.md +++ /dev/null @@ -1,88 +0,0 @@ -![](./header.png) - -# 06 Custom Effects - -In the last example, we showed how to use effects provided by `lustre_http`. In -this example we'll see how to create effects of our own using Lustre's -[`effect.from`](https://hexdocs.pm/lustre/lustre/effect.html#from) -function. - -Since we use effects to communicate with _external_ systems (like the browser or -the Erlang VM) you'll find creating custom effects usually involves Gleam's -[external functions](https://tour.gleam.run/everything/#advanced-features-externals). -So be sure to read up on that! - -> Gleam externals are part of its "foreign function interface", which is why -> you'll typically see files with `ffi` in the name - like -> [`app.ffi.mjs`](./src/app.ffi.mjs). - -## Accessing Browser Storage - -In this example, the external system we want to interact with is the browser's -[local storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage). -This way, we can write a message into the text input and it will still be there -when we refresh the page. Handy! - -The `view`, `update` and `init` functions should look pretty familiar by now, so -let's focus on the functions that generate our custom effects. - -```rust -fn read_localstorage(key: String) -> Effect(Msg) { - effect.from(fn(dispatch) { - do_read_localstorage(key) - |> CacheUpdatedMessage - |> dispatch - }) -} -``` - -We use `effect.from` by passing it a custom function that describes the effect -we want the Lustre runtime to perform. Our custom function will receive a -`dispatch` function as its only parameter - we can use that to send new messages -back to our `update` function if we want to. - -In this case, we read from local storage, pipe its value into the -`CacheUpdatedMessage` constructor, and pipe that to the `dispatch` function so -our `update` messsage can handle it. - -```rust -fn write_localstorage(key: String, value: String) -> Effect(msg) { - effect.from(fn(_) { - do_write_localstorage(key, value) - }) -} -``` - -Here, our effect is simpler. We tell the gleam compiler we don't need to use the -`dispatch` function by replacing it with a [discard -pattern](https://tour.gleam.run/everything/#basics-discard-patterns). Then we -write to local storage, and no more work needs to be done. - -You may be wondering, why bother using an effect if we aren't also going to update -our program with the result? Why not just fire off `do_write_localstorage` directly -from the `update` function or a custom event handler? - -Using effects has many benefits! It lets us implement our `update` and `view` -functions as [pure functions](https://github.com/lustre-labs/lustre/blob/main/pages/hints/pure-functions.md). -This makes them easier to test, allows for time-travel debugging, and even opens -the door to easily porting them to [server components](https://hexdocs.pm/lustre/lustre/server_component.html). - -## Another note on message naming - -In our [controlled inputs -example](https://github.com/lustre-labs/lustre/tree/main/examples/03-controlled-inputs) -we touched on the idea of naming messages in a "Subject Verb Object" pattern. -This example neatly shows the benefits of taking such an approach once different -"things" start talking to your application. - -It would be easy to have a single `SetMessage` variant that both the user input -and local storage lookup use to update the model, but doing so might encourage -us to conceal the fact that the local storage lookup can fail and makes it -harder to see what things our app deals with. - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord -server](https://discord.gg/Fm8Pwmy). You could also open an issue on the [Lustre -GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/examples/06-custom-effects/gleam.toml b/packages/lustre/examples/06-custom-effects/gleam.toml deleted file mode 100644 index 1066817..0000000 --- a/packages/lustre/examples/06-custom-effects/gleam.toml +++ /dev/null @@ -1,14 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_json = "1.0.1" -gleam_stdlib = "~> 0.36" -lustre = "~> 4.0" -lustre_ui = "~> 0.4" -lustre_http = "~> 0.5" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.0" diff --git a/packages/lustre/examples/06-custom-effects/header.png b/packages/lustre/examples/06-custom-effects/header.png deleted file mode 100644 index 1dbbdb06b8b5a4626a4b3d6c15e2b4a4e20a595d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219045 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

    Z5?t2 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 - - - - - - 🚧 app - - - - - - -

    - - diff --git a/packages/lustre/examples/06-custom-effects/manifest.toml b/packages/lustre/examples/06-custom-effects/manifest.toml deleted file mode 100644 index 69c2af4..0000000 --- a/packages/lustre/examples/06-custom-effects/manifest.toml +++ /dev/null @@ -1,53 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_fetch", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "gleam_fetch", source = "hex", outer_checksum = "7446410A44A1D1328F5BC1FF4FC9CBD1570479EA69349237B3F82E34521CCC10" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_javascript", version = "0.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "14D5B7E1A70681E0776BF0A0357F575B822167960C844D3D3FA114D3A75F05A8" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "9ABD71D63F4B8F362CB824DED2C4CA64895DEFACD8F22B0FF055BF15241B1AE2" }, - { name = "lustre_dev_tools", version = "1.3.3", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "67B4E62DAD9B8323487AAA697A6F3FA72348B6DEA6674D65D4F7A1407CF377ED" }, - { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_json = { version = "1.0.1" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { version = "~> 4.0" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_http = { version = "~> 0.5" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/examples/06-custom-effects/src/app.ffi.mjs b/packages/lustre/examples/06-custom-effects/src/app.ffi.mjs deleted file mode 100644 index c401b99..0000000 --- a/packages/lustre/examples/06-custom-effects/src/app.ffi.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import { Ok, Error } from "./gleam.mjs"; - -export function read_localstorage(key) { - const value = window.localStorage.getItem(key); - - return value ? new Ok(value) : new Error(undefined); -} - -export function write_localstorage(key, value) { - window.localStorage.setItem(key, value); -} diff --git a/packages/lustre/examples/06-custom-effects/src/app.gleam b/packages/lustre/examples/06-custom-effects/src/app.gleam deleted file mode 100644 index a6c668e..0000000 --- a/packages/lustre/examples/06-custom-effects/src/app.gleam +++ /dev/null @@ -1,84 +0,0 @@ -import gleam/option.{type Option, None, Some} -import lustre -import lustre/attribute -import lustre/effect.{type Effect} -import lustre/element.{type Element} -import lustre/event -import lustre/ui - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.application(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) -} - -// MODEL ----------------------------------------------------------------------- - -type Model { - Model(message: Option(String)) -} - -fn init(_flags) -> #(Model, Effect(Msg)) { - #(Model(message: None), read_localstorage("message")) -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - UserUpdatedMessage(String) - CacheUpdatedMessage(Result(String, Nil)) -} - -fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { - case msg { - UserUpdatedMessage(input) -> #( - Model(message: Some(input)), - write_localstorage("message", input), - ) - CacheUpdatedMessage(Ok(message)) -> #( - Model(message: Some(message)), - effect.none(), - ) - CacheUpdatedMessage(Error(_)) -> #(model, effect.none()) - } -} - -fn read_localstorage(key: String) -> Effect(Msg) { - effect.from(fn(dispatch) { - do_read_localstorage(key) - |> CacheUpdatedMessage - |> dispatch - }) -} - -@external(javascript, "./app.ffi.mjs", "read_localstorage") -fn do_read_localstorage(_key: String) -> Result(String, Nil) { - Error(Nil) -} - -fn write_localstorage(key: String, value: String) -> Effect(msg) { - effect.from(fn(_) { do_write_localstorage(key, value) }) -} - -@external(javascript, "./app.ffi.mjs", "write_localstorage") -fn do_write_localstorage(_key: String, _value: String) -> Nil { - Nil -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh")] - let message = option.unwrap(model.message, "") - - ui.centre( - [attribute.style(styles)], - ui.field( - [], - [], - ui.input([attribute.value(message), event.on_input(UserUpdatedMessage)]), - [element.text("Type a message and refresh the page")], - ), - ) -} diff --git a/packages/lustre/examples/07-routing/README.md b/packages/lustre/examples/07-routing/README.md deleted file mode 100644 index 217b674..0000000 --- a/packages/lustre/examples/07-routing/README.md +++ /dev/null @@ -1,65 +0,0 @@ -![](./header.png) - -# 07 Routing - -In this example, we demonstrate basic routing using the community library [modem](https://hexdocs.pm/modem/). Modem's quickstart docs should be all you should need to get up to speed, so that's the best place to start. - -Of course, it's not much fun routing without something to route _to_. This example lets users create new pages on the fly - a guest book for your next house party! Hospitality is very important, and guests will be sure to feel welcome when they see their name in the navigation with a special greeting page just for them. - -## Using Modem - -Modem uses [custom side effects](../06-custom-effects/) and external Javascript to translate browser click and navigation events into `update` messages for the Lustre runtime. All we need to use it is a [route change handler function](./src/app.gleam#L59) that we can pass to `modem.init` in our app's `init` function. - -> _Note:_ See [`modem.advanced`](https://hexdocs.pm/modem/modem.html#advanced) to configure more options. - -Inside our `on_route_change` function, we match URI path segment patterns to our routes: - -```gleam - fn on_route_change(uri: Uri) -> Msg { - case uri.path_segments(uri.path) { - ["welcome", guest] -> OnRouteChange(WelcomeGuest(guest)) - _ -> OnRouteChange(Home) - } - } -``` - -In our `update` function, we assign the matched route to `model.current_route`: - -```gleam -fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { - case msg { - OnRouteChange(route) -> #( - Model(..model, current_route: route), - effect.none(), - ) - ... - } -``` - -And in our `view` function, we use `model.current_route` to determine what to display to the user: - -```gleam -fn view(model: Model) -> Element(Msg) { - let page = case model.current_route { - Home -> render_home(model) - WelcomeGuest(name) -> render_welcome(model, name) - } - ... -} -``` - -## Views: They're just functions! - -Lustre doesn't provide a traditional HTML or JSX-style templating engine, and this is by design. - -Since the `view` portion of this example is a bit more involved than our previous ones have been, it should start to give you more of a feel for how views in Lustre are _just functions_. The layout is a function. Each page view is a function. The nav is a function, and each individual nav _item_ is a function too. - -This means we can build up our entire UI using Gleam's functional syntax, benefiting from features like exhaustive pattern matching based on our routes. - -Since our views are [pure functions](https://github.com/lustre-labs/lustre/blob/main/pages/hints/pure-functions.md), we know they'll always render reliably. - -## Getting help - -If you're having trouble with Lustre or are not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/examples/07-routing/gleam.toml b/packages/lustre/examples/07-routing/gleam.toml deleted file mode 100644 index 58f37ee..0000000 --- a/packages/lustre/examples/07-routing/gleam.toml +++ /dev/null @@ -1,15 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_json = "1.0.1" -gleam_stdlib = "~> 0.36" -lustre = "~> 4.0" -lustre_ui = "~> 0.4" -lustre_http = "~> 0.5.2" -modem = "~> 1.0" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.1" diff --git a/packages/lustre/examples/07-routing/header.png b/packages/lustre/examples/07-routing/header.png deleted file mode 100644 index f903c8979bd2929dad1eb0f7d4470aa937eee83d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317512 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
    I? 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

  • Xva<*$S7d7=KJYI5A!i#Ao@=NiUyUu##h*NdAm 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�@JNaR+@4# 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

    e&<<}O}}(FARyYkcQnl) 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 - - - - - - 🚧 app - - - - - - -

    - - diff --git a/packages/lustre/examples/07-routing/manifest.toml b/packages/lustre/examples/07-routing/manifest.toml deleted file mode 100644 index a02e147..0000000 --- a/packages/lustre/examples/07-routing/manifest.toml +++ /dev/null @@ -1,55 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_fetch", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "gleam_fetch", source = "hex", outer_checksum = "7446410A44A1D1328F5BC1FF4FC9CBD1570479EA69349237B3F82E34521CCC10" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_javascript", version = "0.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "14D5B7E1A70681E0776BF0A0357F575B822167960C844D3D3FA114D3A75F05A8" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "9ABD71D63F4B8F362CB824DED2C4CA64895DEFACD8F22B0FF055BF15241B1AE2" }, - { name = "lustre_dev_tools", version = "1.3.3", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "67B4E62DAD9B8323487AAA697A6F3FA72348B6DEA6674D65D4F7A1407CF377ED" }, - { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.2.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "5188D643C181EE350D8A20A3BDBD63AF7B6C505DE333CFBE05EF642ADD88A59B" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "modem", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre"], otp_app = "modem", source = "hex", outer_checksum = "4C6E448089B09A57C179455D44526A717E4E217D4000B91201617FD2D9F18E68" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_json = { version = "1.0.1" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { version = "~> 4.0" } -lustre_dev_tools = { version = "~> 1.1" } -lustre_http = { version = "~> 0.5.2" } -lustre_ui = { version = "~> 0.4" } -modem = { version = "~> 1.0" } diff --git a/packages/lustre/examples/07-routing/src/app.gleam b/packages/lustre/examples/07-routing/src/app.gleam deleted file mode 100644 index 5b65d51..0000000 --- a/packages/lustre/examples/07-routing/src/app.gleam +++ /dev/null @@ -1,169 +0,0 @@ -import gleam/dynamic -import gleam/list -import gleam/result -import gleam/string -import gleam/uri.{type Uri} -import lustre -import lustre/attribute -import lustre/effect.{type Effect} -import lustre/element.{type Element} -import lustre/element/html -import lustre/event -import lustre/ui -import lustre/ui/layout/cluster -import lustre/ui/util/cn -import modem - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.application(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) -} - -// MODEL ----------------------------------------------------------------------- - -type Model { - Model(current_route: Route, guests: List(Guest), new_guest_name: String) -} - -type Route { - Home - WelcomeGuest(value: String) -} - -type Guest { - Guest(slug: String, name: String) -} - -fn init(_flags) -> #(Model, Effect(Msg)) { - #( - Model( - current_route: Home, - guests: [ - Guest(slug: "chihiro", name: "Chihiro"), - Guest(slug: "totoro", name: "Totoro"), - ], - new_guest_name: "", - ), - modem.init(on_route_change), - ) -} - -fn on_route_change(uri: Uri) -> Msg { - case uri.path_segments(uri.path) { - ["welcome", guest] -> OnRouteChange(WelcomeGuest(guest)) - _ -> OnRouteChange(Home) - } -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - OnRouteChange(Route) - UserUpdatedNewGuestName(String) - UserAddedNewGuest(Guest) -} - -fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { - case msg { - OnRouteChange(route) -> #( - Model(..model, current_route: route), - effect.none(), - ) - UserUpdatedNewGuestName(name) -> #( - Model(..model, new_guest_name: name), - effect.none(), - ) - UserAddedNewGuest(guest) -> #( - Model( - ..model, - guests: list.append(model.guests, [guest]), - new_guest_name: "", - ), - effect.none(), - ) - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("margin", "15vh")] - - let page = case model.current_route { - Home -> view_home(model) - WelcomeGuest(name) -> view_welcome(model, name) - } - - ui.stack([attribute.style(styles)], [view_nav(model), page]) -} - -fn view_home(model: Model) { - let new_guest_input = fn(event) { - use key_code <- result.try(dynamic.field("key", dynamic.string)(event)) - case key_code { - "Enter" -> { - let guest_slug = - model.new_guest_name - |> string.replace(" ", "-") - |> string.lowercase - Ok( - UserAddedNewGuest(Guest(name: model.new_guest_name, slug: guest_slug)), - ) - } - _ -> { - use value <- result.try(event.value(event)) - Ok(UserUpdatedNewGuestName(value)) - } - } - } - - view_body([ - view_title("Welcome to the Party 🏡"), - html.p([], [element.text("Please sign the guest book:")]), - ui.input([ - event.on("keyup", new_guest_input), - attribute.value(model.new_guest_name), - ]), - ]) -} - -fn view_welcome(model: Model, slug) -> Element(a) { - let guest = - model.guests - |> list.find(fn(guest: Guest) { guest.slug == slug }) - - let title = case guest { - Ok(guest) -> view_title("Hello, " <> guest.name <> "! 🎉") - _ -> view_title("Sorry ... didn't quite catch that.") - } - - view_body([title]) -} - -fn view_nav(model: Model) -> Element(a) { - let item_styles = [#("text-decoration", "underline")] - - let view_nav_item = fn(path, text) { - html.a([attribute.href("/" <> path), attribute.style(item_styles)], [ - element.text(text), - ]) - } - - let guest_nav_items = - model.guests - |> list.map(fn(guest: Guest) { - view_nav_item("welcome/" <> guest.slug, guest.name) - }) - - cluster.of(html.nav, [], [view_nav_item("", "Home"), ..guest_nav_items]) -} - -fn view_body(children) { - ui.centre([cn.mt_xl()], ui.stack([], children)) -} - -fn view_title(text) { - html.h1([cn.text_xl()], [element.text(text)]) -} diff --git a/packages/lustre/examples/99-full-stack-applications/README.md b/packages/lustre/examples/99-full-stack-applications/README.md deleted file mode 100644 index a45e7a9..0000000 --- a/packages/lustre/examples/99-full-stack-applications/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# app - -[![Package Version](https://img.shields.io/hexpm/v/app)](https://hex.pm/packages/app) -[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/app/) - -```sh -gleam add app -``` -```gleam -import app - -pub fn main() { - // TODO: An example of the project in use -} -``` - -Further documentation can be found at . - -## Development - -```sh -gleam run # Run the project -gleam test # Run the tests -gleam shell # Run an Erlang shell -``` diff --git a/packages/lustre/examples/99-full-stack-applications/client/gleam.toml b/packages/lustre/examples/99-full-stack-applications/client/gleam.toml deleted file mode 100644 index 9025873..0000000 --- a/packages/lustre/examples/99-full-stack-applications/client/gleam.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "app" -version = "1.0.0" - -# Fill out these fields if you intend to generate HTML documentation or publish -# your project to the Hex package manager. -# -# description = "" -# licences = ["Apache-2.0"] -# repository = { type = "github", user = "username", repo = "project" } -# links = [{ title = "Website", href = "https://gleam.run" }] -# -# For a full reference of all the available options, you can have a look at -# https://gleam.run/writing-gleam/gleam-toml/. - -[dependencies] -gleam_stdlib = ">= 0.34.0 and < 2.0.0" -lustre = ">= 4.2.4 and < 5.0.0" -lustre_http = ">= 0.5.2 and < 1.0.0" -gleam_json = ">= 1.0.1 and < 2.0.0" -decipher = ">= 1.2.0 and < 2.0.0" - -[dev-dependencies] -gleeunit = ">= 1.0.0 and < 2.0.0" -lustre_dev_tools = ">= 1.3.2 and < 2.0.0" diff --git a/packages/lustre/examples/99-full-stack-applications/client/index.html b/packages/lustre/examples/99-full-stack-applications/client/index.html deleted file mode 100644 index da137b1..0000000 --- a/packages/lustre/examples/99-full-stack-applications/client/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - 🚧 app - - - - - -
    - - diff --git a/packages/lustre/examples/99-full-stack-applications/client/manifest.toml b/packages/lustre/examples/99-full-stack-applications/client/manifest.toml deleted file mode 100644 index 4d627ad..0000000 --- a/packages/lustre/examples/99-full-stack-applications/client/manifest.toml +++ /dev/null @@ -1,54 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "B1FA529E7BE3FF12CADF32814AB8EC7294E74CEDEE8CC734505707B929A98985" }, - { name = "decipher", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_json", "gleam_stdlib", "stoiridh_version"], otp_app = "decipher", source = "hex", outer_checksum = "9F1B5C6FF0D798046E4E0EF87D09DD729324CB72BD7F0D4152B797324D51223E" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_fetch", version = "0.4.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "gleam_fetch", source = "hex", outer_checksum = "7446410A44A1D1328F5BC1FF4FC9CBD1570479EA69349237B3F82E34521CCC10" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_httpc", version = "2.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF76C71002DEECF6DC5D9CA83D962728FAE166B57926BE442D827004D3C7DF1B" }, - { name = "gleam_javascript", version = "0.8.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "14D5B7E1A70681E0776BF0A0357F575B822167960C844D3D3FA114D3A75F05A8" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "glearray", version = "0.2.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "9C207E05F38D724F464FA921378DB3ABC2B0A2F5821116D8BC8B2CACC68930D5" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5FB54D7732B4105E4AF4D89A7EE6D5E8CF33DA13A3575D0C6ECE470B97958454" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.4", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "09B94E1380CBC400DCD594B36A845E5CB2E143DF89E95460B2CA59E44499CAC9" }, - { name = "lustre_dev_tools", version = "1.3.2", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "CC8F46BCE51C1349862C5F6BA0075B0C68096B866ED1C520B60358FAAB398B60" }, - { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, - { name = "marceau", version = "1.1.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "1AAD727A30BE0F95562C3403BB9B27C823797AD90037714255EEBF617B1CDA81" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "stoiridh_version", version = "0.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "stoiridh_version", source = "hex", outer_checksum = "298ABEA44DF37764A34C2E9190A84BF2770BC59DD9397C6DC7708040E5A0142B" }, - { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -decipher = { version = ">= 1.2.0 and < 2.0.0"} -gleam_json = { version = ">= 1.0.1 and < 2.0.0" } -gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } -gleeunit = { version = ">= 1.0.0 and < 2.0.0" } -lustre = { version = ">= 4.2.4 and < 5.0.0" } -lustre_dev_tools = { version = ">= 1.3.2 and < 2.0.0" } -lustre_http = { version = ">= 0.5.2 and < 1.0.0" } diff --git a/packages/lustre/examples/99-full-stack-applications/client/src/app.gleam b/packages/lustre/examples/99-full-stack-applications/client/src/app.gleam deleted file mode 100644 index 9f1dc27..0000000 --- a/packages/lustre/examples/99-full-stack-applications/client/src/app.gleam +++ /dev/null @@ -1,127 +0,0 @@ -// IMPORTS --------------------------------------------------------------------- - -import decipher -import gleam/dynamic.{dynamic} -import gleam/int -import gleam/list -import gleam/result -import lustre -import lustre/attribute -import lustre/effect.{type Effect} -import lustre/element.{type Element} -import lustre/element/html -import lustre/event - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.application(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) - - Nil -} - -// MODEL ----------------------------------------------------------------------- - -type Model = - List(#(String, Int)) - -fn init(_) -> #(Model, Effect(Msg)) { - let model = [] - let effect = effect.none() - - #(model, effect) -} - -// UPDATE ---------------------------------------------------------------------- - -type Msg { - ServerSavedList(Result(Nil, String)) - UserAddedProduct(name: String) - UserSavedList - UserUpdatedQuantity(name: String, amount: Int) -} - -fn update(model: Model, msg: Msg) -> #(Model, Effect(Msg)) { - case msg { - ServerSavedList(_) -> #(model, effect.none()) - UserAddedProduct(name) -> #([#(name, 1), ..model], effect.none()) - UserSavedList -> #(model, effect.none()) - UserUpdatedQuantity(name, quantity) -> { - let model = - list.map(model, fn(item) { - case item.0 == name { - True -> #(name, quantity) - False -> item - } - }) - - #(model, effect.none()) - } - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [ - #("max-width", "30ch"), - #("margin", "0 auto"), - #("display", "flex"), - #("flex-direction", "column"), - #("gap", "1em"), - ] - - html.div([attribute.style(styles)], [ - view_grocery_list(model), - view_new_item(), - html.div([], [html.button([], [html.text("Sync")])]), - ]) -} - -fn view_new_item() -> Element(Msg) { - let handle_click = fn(event) { - let path = ["target", "previousElementSibling", "value"] - - event - |> decipher.at(path, dynamic.string) - |> result.map(UserAddedProduct) - } - - html.div([], [ - html.input([]), - html.button([event.on("click", handle_click)], [html.text("Add")]), - ]) -} - -fn view_grocery_list(model: Model) -> Element(Msg) { - let styles = [#("display", "flex"), #("flex-direction", "column-reverse")] - - element.keyed(html.div([attribute.style(styles)], _), { - use #(name, quantity) <- list.map(model) - let item = view_grocery_item(name, quantity) - - #(name, item) - }) -} - -fn view_grocery_item(name: String, quantity: Int) -> Element(Msg) { - let handle_input = fn(e) { - event.value(e) - |> result.replace_error(Nil) - |> result.then(int.parse) - |> result.map(UserUpdatedQuantity(name, _)) - |> result.replace_error([]) - } - - html.div([attribute.style([#("display", "flex"), #("gap", "1em")])], [ - html.span([attribute.style([#("flex", "1")])], [html.text(name)]), - html.input([ - attribute.style([#("width", "4em")]), - attribute.type_("number"), - attribute.value(int.to_string(quantity)), - attribute.min("0"), - event.on("input", handle_input), - ]), - ]) -} diff --git a/packages/lustre/examples/99-full-stack-applications/server/manifest.toml b/packages/lustre/examples/99-full-stack-applications/server/manifest.toml deleted file mode 100644 index 2a7bc47..0000000 --- a/packages/lustre/examples/99-full-stack-applications/server/manifest.toml +++ /dev/null @@ -1,11 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, -] - -[requirements] -gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } -gleeunit = { version = ">= 1.0.0 and < 2.0.0" } diff --git a/packages/lustre/examples/99-full-stack-applications/server/src/app.gleam b/packages/lustre/examples/99-full-stack-applications/server/src/app.gleam deleted file mode 100644 index 452ccb7..0000000 --- a/packages/lustre/examples/99-full-stack-applications/server/src/app.gleam +++ /dev/null @@ -1,5 +0,0 @@ -import gleam/io - -pub fn main() { - io.println("Hello from app!") -} diff --git a/packages/lustre/examples/99-full-stack-applications/shared/gleam.toml b/packages/lustre/examples/99-full-stack-applications/shared/gleam.toml deleted file mode 100644 index 8478ab1..0000000 --- a/packages/lustre/examples/99-full-stack-applications/shared/gleam.toml +++ /dev/null @@ -1,19 +0,0 @@ -name = "shared" -version = "1.0.0" - -# Fill out these fields if you intend to generate HTML documentation or publish -# your project to the Hex package manager. -# -# description = "" -# licences = ["Apache-2.0"] -# repository = { type = "github", user = "username", repo = "project" } -# links = [{ title = "Website", href = "https://gleam.run" }] -# -# For a full reference of all the available options, you can have a look at -# https://gleam.run/writing-gleam/gleam-toml/. - -[dependencies] -gleam_stdlib = ">= 0.34.0 and < 2.0.0" - -[dev-dependencies] -gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/packages/lustre/examples/99-full-stack-applications/shared/manifest.toml b/packages/lustre/examples/99-full-stack-applications/shared/manifest.toml deleted file mode 100644 index 2a7bc47..0000000 --- a/packages/lustre/examples/99-full-stack-applications/shared/manifest.toml +++ /dev/null @@ -1,11 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, -] - -[requirements] -gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } -gleeunit = { version = ">= 1.0.0 and < 2.0.0" } diff --git a/packages/lustre/examples/99-full-stack-applications/shared/src/shared.gleam b/packages/lustre/examples/99-full-stack-applications/shared/src/shared.gleam deleted file mode 100644 index 4b3811b..0000000 --- a/packages/lustre/examples/99-full-stack-applications/shared/src/shared.gleam +++ /dev/null @@ -1,5 +0,0 @@ -import gleam/io - -pub fn main() { - io.println("Hello from shared!") -} diff --git a/packages/lustre/examples/99-server-components/README.md b/packages/lustre/examples/99-server-components/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/packages/lustre/examples/99-server-components/gleam.toml b/packages/lustre/examples/99-server-components/gleam.toml deleted file mode 100644 index 1d640d2..0000000 --- a/packages/lustre/examples/99-server-components/gleam.toml +++ /dev/null @@ -1,27 +0,0 @@ -name = "app" -version = "1.0.0" - -# Fill out these fields if you intend to generate HTML documentation or publish -# your project to the Hex package manager. -# -# description = "" -# licences = ["Apache-2.0"] -# repository = { type = "github", user = "username", repo = "project" } -# links = [{ title = "Website", href = "https://gleam.run" }] -# -# For a full reference of all the available options, you can have a look at -# https://gleam.run/writing-gleam/gleam-toml/. - -[dependencies] -gleam_stdlib = "~> 0.36" -lustre = { path = "../../" } -mist = "~> 1.0" -gleam_erlang = "~> 0.24" -gleam_otp = "~> 0.10" -gleam_http = "~> 3.6" -lustre_ui = "~> 0.4" -gleam_json = "~> 1.0" -simplifile = "~> 1.5" - -[dev-dependencies] -gleeunit = "~> 1.0" diff --git a/packages/lustre/examples/99-server-components/manifest.toml b/packages/lustre/examples/99-server-components/manifest.toml deleted file mode 100644 index aea8226..0000000 --- a/packages/lustre/examples/99-server-components/manifest.toml +++ /dev/null @@ -1,37 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "lustre", version = "4.2.6", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], source = "local", path = "../.." }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "mist", version = "1.2.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "109B4D64E68C104CC23BB3CC5441ECD479DD7444889DA01113B75C6AF0F0E17B" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, -] - -[requirements] -gleam_erlang = { version = "~> 0.24" } -gleam_http = { version = "~> 3.6" } -gleam_json = { version = "~> 1.0" } -gleam_otp = { version = "~> 0.10" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { path = "../../" } -lustre_ui = { version = "~> 0.4" } -mist = { version = "~> 1.0" } -simplifile = { version = "~> 1.5" } diff --git a/packages/lustre/examples/99-server-components/src/app.gleam b/packages/lustre/examples/99-server-components/src/app.gleam deleted file mode 100644 index bc3227f..0000000 --- a/packages/lustre/examples/99-server-components/src/app.gleam +++ /dev/null @@ -1,168 +0,0 @@ -import counter -import gleam/bytes_builder -import gleam/erlang -import gleam/erlang/process.{type Selector, type Subject} -import gleam/http/request.{type Request} -import gleam/http/response.{type Response} -import gleam/json -import gleam/option.{type Option, None, Some} -import gleam/otp/actor -import gleam/result -import lustre -import lustre/attribute -import lustre/element.{element} -import lustre/element/html.{html} -import lustre/server_component -import mist.{ - type Connection, type ResponseData, type WebsocketConnection, - type WebsocketMessage, -} - -pub fn main() { - let assert Ok(_) = - fn(req: Request(Connection)) -> Response(ResponseData) { - case request.path_segments(req) { - // Set up the websocket connection to the client. This is how we send - // DOM updates to the browser and receive events from the client. - ["counter"] -> - mist.websocket( - request: req, - on_init: socket_init, - on_close: socket_close, - handler: socket_update, - ) - - // We need to serve the server component runtime. There's also a minified - // version of this script for production. - ["lustre-server-component.mjs"] -> { - let assert Ok(priv) = erlang.priv_directory("lustre") - let path = priv <> "/static/lustre-server-component.mjs" - - mist.send_file(path, offset: 0, limit: None) - |> result.map(fn(script) { - response.new(200) - |> response.prepend_header("content-type", "application/javascript") - |> response.set_body(script) - }) - |> result.lazy_unwrap(fn() { - response.new(404) - |> response.set_body(mist.Bytes(bytes_builder.new())) - }) - } - - // For all other requests we'll just serve some HTML that renders the - // server component. - _ -> - response.new(200) - |> response.prepend_header("content-type", "text/html") - |> response.set_body( - html([], [ - html.head([], [ - html.link([ - attribute.rel("stylesheet"), - attribute.href( - "https://cdn.jsdelivr.net/gh/lustre-labs/ui/priv/styles.css", - ), - ]), - html.script( - [ - attribute.type_("module"), - attribute.src("/lustre-server-component.mjs"), - ], - "", - ), - ]), - html.body([], [ - element( - "lustre-server-component", - [server_component.route("/counter")], - [html.p([], [html.text("This is a slot")])], - ), - ]), - ]) - |> element.to_document_string_builder - |> bytes_builder.from_string_builder - |> mist.Bytes, - ) - } - } - |> mist.new - |> mist.port(3000) - |> mist.start_http - - process.sleep_forever() -} - -// - -type Counter = - Subject(lustre.Action(counter.Msg, lustre.ServerComponent)) - -fn socket_init( - conn: WebsocketConnection, -) -> #(Counter, Option(Selector(lustre.Patch(counter.Msg)))) { - let self = process.new_subject() - let app = counter.app() - let assert Ok(counter) = lustre.start_actor(app, 0) - - process.send( - counter, - server_component.subscribe( - // server components can have many connected clients, so we need a way to - // identify this client. - "ws", - // this callback is called whenever the server component has a new patch - // to send to the client. here we json encode that patch and send it to - // via the websocket connection. - // - // a more involved version would have us sending the patch to this socket's - // subject, and then it could be handled (perhaps with some other work) in - // the `mist.Custom` branch of `socket_update` below. - process.send(self, _), - ), - ) - - #( - // we store the server component's `Subject` as this socket's state so we - // can shut it down when the socket is closed. - counter, - Some(process.selecting(process.new_selector(), self, fn(a) { a })), - ) -} - -fn socket_update( - counter: Counter, - conn: WebsocketConnection, - msg: WebsocketMessage(lustre.Patch(counter.Msg)), -) { - case msg { - mist.Text(json) -> { - // we attempt to decode the incoming text as an action to send to our - // server component runtime. - let action = json.decode(json, server_component.decode_action) - - case action { - Ok(action) -> process.send(counter, action) - Error(_) -> Nil - } - - actor.continue(counter) - } - - mist.Binary(_) -> actor.continue(counter) - mist.Custom(patch) -> { - let assert Ok(_) = - patch - |> server_component.encode_patch - |> json.to_string - |> mist.send_text_frame(conn, _) - - actor.continue(counter) - } - mist.Closed | mist.Shutdown -> actor.Stop(process.Normal) - } -} - -fn socket_close(counter: Counter) { - process.send(counter, lustre.shutdown()) -} diff --git a/packages/lustre/examples/99-server-components/src/counter.gleam b/packages/lustre/examples/99-server-components/src/counter.gleam deleted file mode 100644 index 0c9f115..0000000 --- a/packages/lustre/examples/99-server-components/src/counter.gleam +++ /dev/null @@ -1,58 +0,0 @@ -import gleam/int -import lustre -import lustre/attribute -import lustre/element.{type Element} -import lustre/element/html -import lustre/event -import lustre/ui - -// MAIN ------------------------------------------------------------------------ - -pub fn app() { - lustre.simple(init, update, view) -} - -// MODEL ----------------------------------------------------------------------- - -type Model = - Int - -fn init(initial_count: Int) -> Model { - case initial_count < 0 { - True -> 0 - False -> initial_count - } -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - Incr - Decr -} - -fn update(model: Model, msg: Msg) -> Model { - case msg { - Incr -> model + 1 - Decr -> model - 1 - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - let count = int.to_string(model) - - ui.centre( - [attribute.style(styles)], - ui.stack([], [ - ui.button([event.on_click(Incr)], [element.text("+")]), - html.slot([]), - html.p([attribute.style([#("text-align", "center")])], [ - element.text(count), - ]), - ui.button([event.on_click(Decr)], [element.text("-")]), - ]), - ) -} diff --git a/packages/lustre/examples/README.md b/packages/lustre/examples/README.md deleted file mode 100644 index c3a6009..0000000 --- a/packages/lustre/examples/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Lustre examples - -Each of the examples in this directory is a self-contained, complete Gleam app -that demonstrates a particular feature or concept of the library. For newcomers, -we recommend looking through them in order, as each example tends to build on -the previous ones. Feel free to jump in to any example that interests you, though! - -> **Note**: these examples all use [`lustre/ui`](https://github.com/lustre-labs/ui) -> to show off something a little more visually interesting than unstyled HTML. None -> of the ideas in these examples are specific to `lustre/ui`, though, and you should -> know that you can follow along with any of these examples using only the standard -> `lustre/element/html` module. - -## Examples - -- [`01-hello-world`](./01-hello-world) is a simple example to just get something - on the screen. - -- [`02-interactivity`](./02-interactivity) introduces the core Model-View-Update - loop that underpins every Lustre application. - -- [`03-controlled-inputs`](./03-controlled-inputs) demonstrates the most common - way to handle `` elements in Lustre. - -- [`04-custom-event-handlers`](./04-custom-event-handlers) shows you how to - write your own event handlers and decoders, instead of relying on the ones - provided by `lustre/event`. - -- [`05-http-requests`](./05-http-requests) demonstrates how side effects are - handled in Lustre, using the third-party [`lustre_http`](https://hexdocs.pm/lustre_http/) - package. - -- [`06-custom-effects`](./06-custom-effects) builds on the previous example and - shows you how to write your own side effects for Lustre to perform. - -- [`07-routing`](./07-routing) shows you how to use [`modem`](https://hexdocs.pm/modem/) - to set up routing and navigating between pages in a Lustre app. - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). - -While our docs are still a work in progress, the official [Elm guide](https://guide.elm-lang.org) -is also a great resource for learning about the Model-View-Update architecture -and the kinds of patterns that Lustre is built around. diff --git a/packages/lustre/gleam.toml b/packages/lustre/gleam.toml deleted file mode 100644 index 8996318..0000000 --- a/packages/lustre/gleam.toml +++ /dev/null @@ -1,49 +0,0 @@ -name = "lustre" -version = "4.3.0" -gleam = ">= 1.0.0" - -description = "An Elm-inspired framework for building HTML templates, single page applications, and server-rendered components in Gleam!" -repository = { type = "github", user = "lustre-labs", repo = "lustre" } -licences = ["MIT"] - -links = [ - { title = "Sponsor", href = "https://github.com/sponsors/hayleigh-dot-dev" }, -] - -internal_modules = ["lustre/internals", "lustre/internals/*"] - -[documentation] -pages = [ - { title = "Examples directory", path = "reference/examples.html", source = "./pages/reference/examples.md" }, - { title = " ", path = "#", source = "" }, - { title = "Quickstart guide", path = "guide/01-quickstart.html", source = "./pages/guide/01-quickstart.md" }, - { title = "Managing state", path = "guide/02-state-management.html", source = "./pages/guide/02-state-management.md" }, - { title = "Side effects", path = "guide/03-side-effects.html", source = "./pages/guide/03-side-effects.md" }, - { title = "Server-side rendering", path = "guide/04-server-side-rendering.html", source = "./pages/guide/04-server-side-rendering.md" }, - # { title = "Full-stack apps", path = "guide/05-full-stack-apps.html", source = "./pages/guide/05-full-stack-apps.md" }, - # { title = "Components", path = "#", source = "" }, - # { title = "Server components", path = "#", source = "" }, - # { title = " ", path = "#", source = "" }, - # { title = "SPA deployments", path = "#", source = "" }, - # { title = "Full-stack deployments", path = "#", source = "" }, - # { title = " ", path = "#", source = "" }, - # { title = "Using with Wisp", path = "#", source = "" }, - # { title = "Using with Glen", path = "#", source = "" }, - # { title = "Using with Mist", path = "#", source = "" }, - # { title = " ", path = "#", source = "" }, - { title = "For Elm developers", path = "cheatsheets/elm", source = "./pages/reference/for-elm-devs.md" }, - { title = "For React developers", path = "cheatsheets/react", source = "./pages/reference/for-react-devs.md" }, - { title = "For LiveView developers", path = "cheatsheets/liveview", source = "./pages/reference/for-liveview-devs.md" }, -] - -[dependencies] -gleam_erlang = "~> 0.24" -gleam_json = "~> 1.0 or ~> 2.0" -gleam_otp = "~> 0.9" -gleam_stdlib = "~> 0.36" - -[dev-dependencies] -birdie = "~> 1.0" -gleeunit = "~> 1.0" -shellout = "~> 1.6" -simplifile = "~> 1.4" diff --git a/packages/lustre/manifest.toml b/packages/lustre/manifest.toml deleted file mode 100644 index cc9d928..0000000 --- a/packages/lustre/manifest.toml +++ /dev/null @@ -1,33 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birdie", version = "1.1.5", build_tools = ["gleam"], requirements = ["argv", "filepath", "glance", "gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "justin", "rank", "simplifile", "trie_again"], otp_app = "birdie", source = "hex", outer_checksum = "E1B6CB7B9EDE8F4C67F7E68C9FB45FBAA54881545F85D315D2B179560CC63F60" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "glance", version = "0.11.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "8F3314D27773B7C3B9FB58D8C02C634290422CE531988C0394FA0DF8676B964D" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_stdlib", version = "0.37.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5398BD6C2ABA17338F676F42F404B9B7BABE1C8DC7380031ACB05BBE1BCF3742" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glexer", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "BD477AD657C2B637FEF75F2405FAEFFA533F277A74EF1A5E17B55B1178C228FB" }, - { name = "justin", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "justin", source = "hex", outer_checksum = "7FA0C6DB78640C6DC5FBFD59BF3456009F3F8B485BF6825E97E1EB44E9A1E2CD" }, - { name = "rank", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "rank", source = "hex", outer_checksum = "5660E361F0E49CBB714CC57CC4C89C63415D8986F05B2DA0C719D5642FAD91C9" }, - { name = "shellout", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "shellout", source = "hex", outer_checksum = "E2FCD18957F0E9F67E1F497FC9FF57393392F8A9BAEAEA4779541DE7A68DD7E0" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "thoas", version = "1.2.0", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "540C8CB7D9257F2AD0A14145DC23560F91ACDCA995F0CCBA779EB33AF5D859D1" }, - { name = "trie_again", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "trie_again", source = "hex", outer_checksum = "5B19176F52B1BD98831B57FDC97BD1F88C8A403D6D8C63471407E78598E27184" }, -] - -[requirements] -birdie = { version = "~> 1.0" } -gleam_erlang = { version = "~> 0.24" } -gleam_json = { version = "~> 1.0 or ~> 2.0" } -gleam_otp = { version = "~> 0.9" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -shellout = { version = "~> 1.6" } -simplifile = { version = "~> 1.4" } diff --git a/packages/lustre/package-lock.json b/packages/lustre/package-lock.json deleted file mode 100644 index c11246c..0000000 --- a/packages/lustre/package-lock.json +++ /dev/null @@ -1,3170 +0,0 @@ -{ - "name": "lustre-client-test", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lustre-client-test", - "version": "0.1.0", - "license": "MIT", - "devDependencies": { - "esbuild": "^0.20.2", - "linkedom": "^0.16.11", - "npm-run-all": "^4.1.5", - "vitest": "^1.5.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@vitest/expect": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.2.tgz", - "integrity": "sha512-rf7MTD1WCoDlN3FfYJ9Llfp0PbdtOMZ3FIF0AVkDnKbp3oiMW1c8AmvRZBcqbAhDUAvF52e9zx4WQM1r3oraVA==", - "dev": true, - "dependencies": { - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.2.tgz", - "integrity": "sha512-7IJ7sJhMZrqx7HIEpv3WrMYcq8ZNz9L6alo81Y6f8hV5mIE6yVZsFoivLZmr0D777klm1ReqonE9LyChdcmw6g==", - "dev": true, - "dependencies": { - "@vitest/utils": "1.5.2", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.2.tgz", - "integrity": "sha512-CTEp/lTYos8fuCc9+Z55Ga5NVPKUgExritjF5VY7heRFUfheoAqBneUlvXSUJHUZPjnPmyZA96yLRJDP1QATFQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.2.tgz", - "integrity": "sha512-xCcPvI8JpCtgikT9nLpHPL1/81AYqZy1GCy4+MCHBE7xi8jgsYkULpW5hrx5PGLgOQjUpb6fd15lqcriJ40tfQ==", - "dev": true, - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.2.tgz", - "integrity": "sha512-sWOmyofuXLJ85VvXNsroZur7mOJGiQeM0JN3/0D1uU8U9bGFM69X1iqHaRXl6R8BwaLY6yPCogP257zxTzkUdA==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "dev": true - }, - "node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/linkedom": { - "version": "0.16.11", - "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.16.11.tgz", - "integrity": "sha512-WgaTVbj7itjyXTsCvgerpneERXShcnNJF5VIV+/4SLtyRLN+HppPre/WDHRofAr2IpEuujSNgJbCBd5lMl6lRw==", - "dev": true, - "dependencies": { - "css-select": "^5.1.0", - "cssom": "^0.5.0", - "html-escaper": "^3.0.3", - "htmlparser2": "^9.1.0", - "uhyphen": "^0.2.0" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mlly": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", - "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "ufo": "^1.3.2" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", - "dev": true, - "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.6.1", - "pathe": "^1.1.2" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-is": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", - "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", - "dev": true - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true - }, - "node_modules/string.prototype.padend": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", - "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dev": true, - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "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==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ufo": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", - "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", - "dev": true - }, - "node_modules/uhyphen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", - "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==", - "dev": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vite": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", - "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.2.tgz", - "integrity": "sha512-Y8p91kz9zU+bWtF7HGt6DVw2JbhyuB2RlZix3FPYAYmUyZ3n7iTp8eSyLyY6sxtPegvxQtmlTMhfPhUfCUF93A==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.2.tgz", - "integrity": "sha512-l9gwIkq16ug3xY7BxHwcBQovLZG75zZL0PlsiYQbf76Rz6QGs54416UWMtC0jXeihvHvcHrf2ROEjkQRVpoZYw==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.5.2", - "@vitest/runner": "1.5.2", - "@vitest/snapshot": "1.5.2", - "@vitest/spy": "1.5.2", - "@vitest/utils": "1.5.2", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.5.2", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.5.2", - "@vitest/ui": "1.5.2", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/packages/lustre/package.json b/packages/lustre/package.json deleted file mode 100644 index a333d7a..0000000 --- a/packages/lustre/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "lustre-client-test", - "version": "0.1.0", - "description": "testing for client scripts, and using vitest experimental bench", - "scripts": { - "bench": "run-s build:bench bench:vitest", - "bench:vitest": "vitest bench --config ./vitest.config.js", - "build": "run-p build:test:**", - "build:bench": "run-s build:test:vdom", - "build:test:02": "cd examples/02-interactivity && gleam build", - "build:test:vdom": "cd test-apps/vdom-test-templates && gleam build", - "run:vitest": "vitest --config ./vitest.config.js", - "test": "run-s build \"run:vitest -- --run\"", - "test:02": "run-s build:test:02 \"run:vitest -- --run 02-interactivity.test\"", - "test:vdom": "run-s build:test:vdom \"run:vitest -- --run vdom.ffi \"", - "watch:test": "run-p \"watch:init:**\"", - "watch:init:build": "run-p build:test:**", - "watch:init:vitest": "run-s run:vitest" - }, - "author": "Jacob Scearcy", - "license": "MIT", - "devDependencies": { - "esbuild": "^0.20.2", - "linkedom": "^0.16.11", - "npm-run-all": "^4.1.5", - "vitest": "^1.5.0" - }, - "dependencies": { - "@chouqueth/gleam": "^1.3.2" - } -} diff --git a/packages/lustre/pages/guide/01-quickstart.md b/packages/lustre/pages/guide/01-quickstart.md deleted file mode 100644 index 6713967..0000000 --- a/packages/lustre/pages/guide/01-quickstart.md +++ /dev/null @@ -1,422 +0,0 @@ -# 01 Quickstart guide - -Welcome to the Lustre quickstart guide! This document should get you up to speed -with the core ideas that underpin every Lustre application as well as how to get -something on the screen. - -## What is a SPA? - -Lustre can be used to create HTML in many different contexts, but it is primarily -designed to be used to build Single-Page Applications – or SPAs. SPAs are a type -of Web application that render content primarily in the browser (rather than on -the server) and, crucially, do not require a full page load when navigating -between pages or loading new content. - -To help build these kinds of applications, Lustre comes with an opinionated -runtime. Some of Lustre's core features include: - -- **Declarative rendering**: User interfaces are constructed using a declarative - API that describes HTML as a function of your application's state. This is in - contrast to more traditional imperative approaches to direct DOM mutation like - jQuery. - -- **State management**: If UIs are a function of state, then orchestrating state - changes is crucial! Lustre provides a simple message-based state management - system modelled after OTP [gen_servers](https://www.erlang.org/doc/design_principles/gen_server_concepts), - Gleam's [actors](https://hexdocs.pm/gleam_otp/gleam/otp/actor.html), and the - [Elm Architecture](https://guide.elm-lang.org/architecture/). - -- **Managed side effects**: Managing asynchronous operations like HTTP requests - and timers can be tricky when JavaScript is single-threaded. Lustre provides a - runtime to manage these side effects and let them communicate with your application - using the same messages as your update loop. - -## Your first Lustre program - -To get started, let's create a new Gleam application and add Lustre as a dependency. - -```sh -gleam new app && cd app && gleam add lustre -``` - -By default, Gleam builds projects for the Erlang target unless told otherwise. We -can change this by adding a `target` field to the `gleam.toml` file generated in -the root of the project. - -```diff - name = "app" -+ target = "javascript" - version = "1.0.0" - - ... -``` - -The simplest type of Lustre application is constructed with the `element` function. -This produces an application that renders a static piece of content without the -typical update loop. - -We can start by importing `lustre` and `lustre/element` and just rendering some -text: - -```gleam -import lustre -import lustre/element - -pub fn main() { - let app = lustre.element(element.text("Hello, world!")) - let assert Ok(_) = lustre.start(app, "#app", Nil) - - Nil -} -``` - -Lustre has some official development tooling published in the -[`lustre_dev_tools`](https://hexdocs.pm/lustre_dev_tools/) package. Most projects -will probably want to add those too! - -> **Note**: the lustre_dev_tools development server watches your filesystem for -> changes to your gleam code and can automatically reload the browser. For linux -> users this requires [inotify-tools](https://github.com/inotify-tools/inotify-tools) -> be installed. If you do not or cannot install this, the development server will -> still run but it will not watch your files for changes. - -> **Note**: currently one of lustre_dev_tools' dependencies is not compatible with -> the most recent version of `gleam_json`, making it impossible to install. To fix -> this, add `gleam_json = "1.0.1"` as a dependency in your `gleam.toml` file. - -```sh -gleam add --dev lustre_dev_tools -``` - -It's important to make sure the development tooling is added as a `--dev` -dependency. This ensures they're never included in production builds of your app. - -To start a development server, we can run: - -```sh -gleam run -m lustre/dev start -``` - -The first time you run this command might take a little while, but subsequent runs -should be much faster! - -> **Note**: Lustre uses esbuild under the hood, and attempts to download the [right -> binary for your platform](https://esbuild.github.io/getting-started/#download-a-build). -> If you're not connected to the internet, on an unsupported platform, or don't -> want Lustre to download the binary you can grab or build it yourself and place it -> in `build/.lustre/bin/esbuild`. - -Once the server is up and running you should be able to visit http://localhost:1234 -and be greeted with your "Hello, world!" message. - -We mentioned Lustre has a declarative API for constructing HTML. Let's see what -that looks like by building something slightly more complex. - -```gleam -import lustre -import lustre/attribute -import lustre/element -import lustre/element/html - -pub fn main() { - let app = - lustre.element( - html.div([], [ - html.h1([], [element.text("Hello, world!")]), - html.figure([], [ - html.img([attribute.src("https://cataas.com/cat")]), - html.figcaption([], [element.text("A cat!")]) - ]) - ]) - ) - let assert Ok(_) = lustre.start(app, "#app", Nil) - - Nil -} -``` - -Here we _describe_ the structure of the HTML we want to render, and leave the -busywork to Lustre's runtime: that's what makes it declarative! - -"**Where are the templates?**" we hear you cry. Lustre doesn't have a separate -templating syntax like JSX or HEEx for a few reasons (lack of metaprogramming -built into Gleam, for one). Some folks might find this a bit odd at first, but -we encourage you to give it a try. Realising that your UI is _just functions_ -can be a bit of a lightbulb moment as you build more complex applications. - -## Adding interactivity - -Rendering static HTML is great, but we said at the beginning Lustre was designed -primarily for building SPAs – and SPAs are interactive! To do that we'll need -to move on from `lustre.element` to the first of Lustre's application constructors -that includes an update loop: `lustre.simple`. - -```gleam -import gleam/int -import lustre -import lustre/element -import lustre/element/html -import lustre/event - -pub fn main() { - let app = lustre.simple(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) - - Nil -} -``` - -There are three main building blocks to every interactive Lustre application: - -- A `Model` that represents your application's state and an `init` function - to create it. - -- A `Msg` type that represents all the different ways the outside world can - communicate with your application and an `update` function that modifies - your model in response to those messages. - -- A `view` function that renders your model to HTML. - -We'll build a simple counter application to demonstrate these concepts. Our -model can be an `Int` and our `init` function will initialise it to `0`: - -```gleam -pub type Model = Int - -fn init(_flags) -> Model { - 0 -} -``` - -> **Note**: The `init` function always takes a single argument! These are the "flags" -> or start arguments you can pass in when your application is started with -> `lustre.start`. For the time being, we can ignore them, but they're useful for -> passing in configuration or other data when your application starts. - -The main update loop in a Lustre application revolves around messages passed in -from the outside world. For our counter application, we'll have two messages to -increment and decrement the counter: - -```gleam -pub type Msg { - Increment - Decrement -} - -pub fn update(model: Model, msg: Msg) -> Model { - case msg { - Increment -> model + 1 - Decrement -> model - 1 - } -} -``` - -Each time a message is produced from an event listener, Lustre will call your -`update` function with the current model and the incoming message. The result -will be the new application state that is then passed to the `view` function: - -```gleam -pub fn view(model: Model) -> element.Element(Msg) { - let count = int.to_string(model) - - html.div([], [ - html.button([event.on_click(Increment)], [ - element.text("+") - ]), - element.text(count), - html.button([event.on_click(Decrement)], [ - element.text("-") - ]) - ]) -} -``` - -The above snippet attaches two click event listeners that produce an `Increment` -or `Decrement` message when clicked. The Lustre runtime is responsible for -attaching these event listeners and calling your `update` function with the -resulting message. - -> **Note**: notice that the return type of `view` is `element.Element(Msg)`. The -> type parameter `Msg` tells us the kinds of messages this element might produce -> from events: type safety to the rescue! - -This forms the core of every Lustre application: - -- A model produces some view. -- The view can produce messages in response to user interaction. -- Those messages are passed to the update function to produce a new model. -- ... and the cycle continues. - -## Talking to the outside world - -This "closed loop" of messages and updates works well if all we need is an -interactive document, but many applications will also need to talk to the outside -world – whether that's fetching data from an API, setting up a WebSocket connection, -or even just setting a timer. - -Lustre manages these side effects through an abstraction called an `Effect`. In -essence, effects are any functions that talk with the outside world and might -want to send messages back to your application. Lustre lets you write your own -effects, but for now we'll use a community package called -[`lustre_http`](https://hexdocs.pm/lustre_http/index.html) to fetch a new cat image -every time the counter is incremented. - -Because this is a separate package, make sure to add it to your project first. -While we're here, we'll also add `gleam_json` so we can decode the response from -the cat API: - -```sh -$ gleam add lustre_http -``` - -Now we are introducing side effects, we need to graduate from `lustre.simple` to -the more powerful `lustre.application` constructor. - -```gleam -import gleam/dynamic -import gleam/int -import gleam/list -import lustre -import lustre/attribute -import lustre/effect -import lustre/element -import lustre/element/html -import lustre/event -import lustre_http - -pub fn main() { - let app = lustre.application(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) - - Nil -} -``` - -If you edited your previous counter app, you'll notice the program no longer -compiles. Specifically, the type of our `init` and `update` functions are wrong -for the new `lustre.application` constructor! - -In order to tell Lustre about what effects it should perform, these functions now -need to return a _tuple_ of the new model and any effects. We can amend our `init` -function like so: - -```gleam -pub type Model { - Model(count: Int, cats: List(String)) -} - -fn init(_flags) -> #(Model, effect.Effect(Msg)) { - #(Model(0, []), effect.none()) -} -``` - -The `effect.none` function is a way of saying "no effects" – we don't need to do -anything when the application starts. We've also changed our `Model` type from a -simple type alias to a Gleam [record](https://tour.gleam.run/data-types/records/) -that holds both the current count and a list of cat image URLs. - -In our `update` function, we want to fetch a new cat image every time the counter -is incremented. To do this we need two things: - -- An `Effect` to describe the request the runtime should perform. -- A variant of our `Msg` to handle the response. - -The `lustre_http` package has the effect side of things handled, so we just need -to modify our `Msg` type to include a new variant for the response: - -```gleam -pub type Msg { - UserIncrementedCount - UserDecrementedCount - ApiReturnedCat(Result(String, lustre_http.HttpError)) -} -``` - -> **Note**: Concerned your message type is too verbose? Read our thoughts on why -> this is a good thing in our [state management guide](./02-state-management.html). - -Finally, we can modify our `update` function to also fetch a cat image when the -counter is incremented and handle the response: - -```gleam -pub fn update(model: Model, msg: Msg) -> #(Model, effect.Effect(Msg)) { - case msg { - UserIncrementedCount -> #(Model(..model, count: model.count + 1), get_cat()) - UserDecrementedCount -> #(Model(..model, count: model.count - 1), effect.none()) - ApiReturnedCat(Ok(cat)) -> #(Model(..model, cats: [cat, ..model.cats]), effect.none()) - ApiReturnedCat(Error(_)) -> #(model, effect.none()) - } -} - -fn get_cat() -> effect.Effect(Msg) { - let decoder = dynamic.field("_id", dynamic.string) - let expect = lustre_http.expect_json(decoder, ApiReturnedCat) - - lustre_http.get("https://cataas.com/cat?json=true", expect) -} -``` - -> **Note**: The `get_cat` function returns an `Effect` that tells the runtime how -> to fetch a cat image. It's important to know that the `get_cat` function doesn't -> perform the request directly! This is why we need to add the `ApiReturnedCat` message -> variant: the runtime needs to know what to do with the response when it arrives. - -This model of managed effects can feel cumbersome at first, but it comes with some -benefits. Forcing side effects to produce a message means our message type naturally -describes all the ways the world can communicate with our application; as an app -grows being able to get this kind of overview is invaluable! It also means we can -test our update loop in isolation from the runtime and side effects: we could write -tests that verify a particular sequence of messages produces an expected model -without needing to mock out HTTP requests or timers. - -Before we forget, let's also update our `view` function to actually display the -cat images we're fetching: - -```gleam -pub fn view(model: Model) -> element.Element(Msg) { - let count = int.to_string(model.count) - - html.div([], [ - html.button([event.on_click(UserIncrementedCount)], [ - element.text("+") - ]), - element.text(count), - html.button([event.on_click(UserDecrementedCount)], [ - element.text("-") - ]), - html.div( - [], - list.map(model.cats, fn(cat) { - html.img([attribute.src("https://cataas.com/cat/" <> cat)]) - }), - ), - ]) -} -``` - -## Where to go from here - -Believe it or not, you've already seen about 80% of what Lustre has to offer! From -these core concepts, you can build rich interactive applications that are predictable -and maintainable. Where to go from here depends on what you want to build, and -how you like to learn: - -- There are a number of [examples](https://github.com/lustre-labs/lustre/tree/main/examples) - if the Lustre repository that gradually introduce more complex applications - and ideas. - -- The [rest of this guide](./02-state-management.html) also continues to teach - Lustre's high-level concepts and best-practices. - -- Of course, if you want to dive in and start making things straight away, the - [API documentation](https://hexdocs.pm/lustre/lustre.html) is always handy to keep open. - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). - -While our docs are still a work in progress, the official [Elm guide](https://guide.elm-lang.org) -is also a great resource for learning about the Model-View-Update architecture -and the kinds of patterns that Lustre is built around. diff --git a/packages/lustre/pages/guide/02-state-management.md b/packages/lustre/pages/guide/02-state-management.md deleted file mode 100644 index b29ac5c..0000000 --- a/packages/lustre/pages/guide/02-state-management.md +++ /dev/null @@ -1,244 +0,0 @@ -# 02 State management - -We saw in the quickstart guide that all Lustre applications are built around the -Model-View-Update (MVU) architecture. This means that the state of the application -is stored in a single, immutable data structure called the model, and updated as -messages are dispatched to the runtime. - -The MVU architecture is an example of _unidirectional data flow_: - -- Your model describes the entire state of your application at a given point in - time. - -- The UI is a [pure](https://github.com/lustre-labs/lustre/blob/main/pages/hints/pure-functions.md) - function of that model: if the model doesn't change, the UI doesn't change. - -- Events from the outside world – user interaction, HTTP responses, ... – send - messages to an update function that constructs a new model. - -- The UI re-renders based on the new state. - -```text - +--------+ - | | - | update | - | | - +--------+ - ^ | - | | - Msg | | Model - | | - | v -+------+ +------------------------+ -| | Model | | -| init |------------------------>| Lustre Runtime | -| | | | -+------+ +------------------------+ - ^ | - | | - Msg | | Model - | | - | v - +--------+ - | | - | view | - | | - +--------+ -``` - -This is in contrast to _bidirectional_ approaches to state management, where the -UI can modify state directly. For some developers this can be a difficult idea -to get used to, but it brings a number of benefits: - -- A **single source of truth** makes it easier to reason about the state of your - application. State management is lifted _out_ of UI code, letting it focus just - on presentation and making it easier to test and refactor. - -- Message-driven **declarative state updates** give you a holistic view of how - your application can change over time. Tracking incoming messages gives you a - history of state updates and can be serialised and logged for debugging or - testing purposes. - -- State updates are **pure**. We will learn more about this in the [next guide](./03-side-effects.html), - but for now it is enough to know that this means testing your state changes is - much easier because mocking messages is simpler than mocking side effects! - -The rest of this guide contains some learned-wisdom and best practices for managing -state in Lustre applications. - -## The best model is not always a record - -It is overwhelmingly common to see the model of a Lustre application as a single -record. This is a sensible place to start, but there are other options! Gleam's -custom types allow us to model our data as disjoint variants. Using these as your -application's model can be particularly useful when you have different states that -do not need to persist across navigations: - -```gleam -type Model { - LoggedIn(LoggedInModel) - Public(PublicModel) -} - -type LoggedInModel { - ... -} - -type PublicModel { - ... -} -``` - -Here, we have a model that represents our application as either having a logged in -user or just one of the public routes. This pushes us towards the great practice of -[making impossible states impossible](https://github.com/stereobooster/pragmatic-types/blob/master/posts/making-impossible-states-impossible.md). -Now, we can write separate update and view functions that only handle the states -they care about. - -Another option is to use a _type alias_ to represent some state using existing -Gleam types. It's important to remember that your model represents _application_ -state and not necessarily _page_ state. This can manifest as simple as aliasing -Gleam's `Result` type or maybe a `Dict` representing loaded posts. - -## Messages not actions - -Lustre is not the first frontend framework to use the MVU architecture or to -focus on dispatching messages to update state. State management libraries like -Redux and Zustand follow a very similar pattern. The devil is in the details -though, and these libraries often talk in terms of _actions_ but you'll see -Elm and Lustre prefer the term _message_. - -Actions frame incoming events as _things to do_: "add a new todo", "make an HTTP -request", etc. This can work well in the beginning, but as your application grows -and the number of things you can do grows, naming messages as actions can become -problematic. - -In particular, it encourages you to recursively call your `update` function with -different messages when you want to compose behaviour. Gleam is a functional -programming language: we should use functions to update our state, not message -dispatching! Communicating through messages is a way for the _outside world_ to -talk to our application, not for our applications to talk to themselves. - -A recursive update function makes it difficult to see the consequences of any one -message as you need to trace through the recursive calls in your head to understand -which messages are being dispatched and in what order. - -Instead, we recommend you name your messages according to a **Subject Verb Object** -pattern. This frames messages based on who (or what) sent them, what state or -"thing" they're working on, and what they did or want to do. Imagine a password -reset form, the user can type in a new password and submit it and our app waits -for a response. As a first-pass we might end up with something like this: - -```gleam -type Msg { - SetPassword(String) - ResetPassword - PasswordReset(Result(Nil, String)) -} -``` - -This is quite muddled, and is compounded as we add more messages to our app -(especially if they also relate to the password!). It's hard to tell from looking -at our messages what our app might _really_ be doing: we'd have to dig into our -`update` function and possibly our `view` to work out what our intent was. One -super power of the MVU pattern is that we can look at our messages to get a -holistic view of what our app can handle. Things become much clearer if we refactor -this example to the Subject Verb Object naming pattern: - -```gleam -type Msg { - UserUpdatedPassword(String) - UserRequestedPasswordReset - BackendResetPassword(Result(Nil, String)) -} -``` - -It's now immediately obvious at a glance: - -1. Where these messages are coming from (user interaction, the network, ...) -2. What sort of event or intention they represent - -As our apps grow in size, we'll be thankful for this clarity! - -## View functions not components - -Although Lustre does have a way to create encapsulated stateful components (something -we sorely missed in Elm) it shouldn't be the default. The word "component" is a bit -overloaded in the frontend world, so for clarity Lustre considers _components_ -as stateful nested Model-View-Update applications and calls stateless functions -that return `Element`s _view functions_. - -The best Lustre code bases take the lessons learned from similar languages like -Elm, Erlang, and Elixir and keep the number of components low and the number of -simple view functions much higher. If you're coming from a typical frontend -framework the idea of eschewing stateful components might seem quite strange, but -there are some tangible benefits to this approach: - -- **Favouring view functions forces us to be intentional with state.** - - Frameworks often make it easy to add state to components, which in turn makes - it easy to add state without really thinking about whether we need it or whether - we're taking the best approach. - - View functions on the other hand _only_ have arguments, and adding a new argument - is a much more deliberate act. This gives us a chance to consider whether we're - modelling things the right way or whether we're trying to do too much. - -- **Components are bad for code organisation.** - - It can be tempting to use components as a way to organise code. You might see - this commonly in React and Vue codebases: you have a folder for components, a - folder for hooks, and so on. Using components as a means of organisation often - leads to us drawing weird boundaries around our code and spreading out things - that should be together. - - By sticking to view functions we're much more likely to keep code grouped based - on _what it does_ rather than what it _is_ and this approach is much more idiomatic - to Gleam on the whole, and also an approach favoured by Elm and Elixir alike. - -- **Avoiding components makes your code easier to test.** - - When we reach for components too soon or too frequently, we often end up needing - to pull in a complete E2E testing framework to make sure our code is behaving - correctly, or we might end up exposing our components' internals for testing: - defeating the purpose of encapsulation in the first place! - - By sticking to plain view functions and functions to transform data before - rendering, we end up with a codebase that is much easier to test with Gleam's - available testing tools. - -- **Overusing components makes refactoring more challenging.** - - Imagine you have a table component with tabs to switch between different views. - If some time in the future you decide to pull the tabs out so they can be - rendered elsewhere on the page you'll discover that the tabs' state was tightly - coupled to the table. Now we are forced to refactor the table component so the - tab state can be passed in as an attribute. We'll also need to refactor the - _parent_ to contain the state of the tabs so it can be passed down to both - components. - - By avoiding components this sort of refactoring becomes simpler: we were already - managing the state further up the component tree so moving things around is - much less painful. - -- **Creating components is more boilerplate.** - - Components share the same shape as any other Lustre application. That means for - any component you want to create, you also need to define an `init`, `update`, - and `view` function, a `Model` type, and a `Msg` type. If you find yourself - thinking "wow, this is a lot of boilerplate just to do X" then listen to your - gut! - -## Related examples - -If you'd like to see some of the ideas in action, we have a number of examples -that demonstrate how to use Lustre in practice: - -- [`02-interactivity`](https://github.com/lustre-labs/lustre/tree/main/examples/02-interactivity) -- [`03-controlled-inputs`](https://github.com/lustre-labs/lustre/tree/main/examples/03-controlled-inputs) - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/pages/guide/03-side-effects.md b/packages/lustre/pages/guide/03-side-effects.md deleted file mode 100644 index f873724..0000000 --- a/packages/lustre/pages/guide/03-side-effects.md +++ /dev/null @@ -1,268 +0,0 @@ -# 03 Side effects - -Lustre's implementation of the Model-View-Update architecture includes one -additional piece of the puzzle: managed side effects. If we take the MVU diagram -from the previous guide and upgrade it to include managed effects, it looks like -this: - -```text - +--------+ - | | - | update | - | | - +--------+ - ^ | - | | - Msg | | #(Model, Effect(msg)) - | | - | v -+------+ +------------------------+ -| | #(Model, Effect(msg)) | | -| init |------------------------>| Lustre Runtime | -| | | | -+------+ +------------------------+ - ^ | - | | - Msg | | Model - | | - | v - +--------+ - | | - | view | - | | - +--------+ -``` - -Well what does managed effects mean, exactly? In Lustre, we expect your `init`, -`update`, and `view` functions to be [_pure_](https://github.com/lustre-labs/lustre/blob/main/pages/hints/pure-functions.md). -That means they shouldn't perform side effects like making an HTTP request or writing -to local storage: we should be able to run your functions 100 times with the same -input and get the same output every time! - -Of course, in real applications performing HTTP requests and writing to local -storage turn out to be quite useful things to do. If we shouldn't perform side -effects in our code how do we do them then? Lustre has an [`Effect`](https://hexdocs.pm/lustre/lustre/effect.html) -type that _tells the runtime what side effects to perform_. So we say "Hey, I -want to make an HTTP request to this URL and when you get the response, dispatch -this message to me". The runtime takes care of performing the side effect and -turning the result into something our `update` function understands. - -## Why managed effects? - -This can feel like a lot of ceremony to go through just to make an HTTP request. -The natural question is: why not just let us make these requests ourselves? - -Managed effects have a number of benefits that come from _separating our programs -from the outside world_: - -1. **Predictability**: by keeping side effects out of our `update` function, we - can be confident that our application's state is only ever changed in one - place. This makes it easier to reason about our code and track down bugs. - -2. **Testability**: because our application code is pure, we can test it without - needing to mock out HTTP services or browser APIs. We can test our `update` - function, for example, by passing in a sequence of messages: no network mocks - required! - -3. **Reusability**: Lustre applications can run in a variety of environments and - contexts. The more we push platform-specific code into managed effects, the - easier time we'll have running our application as a [server component](https://hexdocs.pm/lustre/lustre/server_component.html) - or as a static site. - -## Packages for common effects - -The community has started to build packages that cover common side effects. For -many applications it's enough to drop these packages in and start using them -without needing to write any custom effects. - -> **Note**: _all_ of these packages are community maintained and unrelated to the -> core Lustre organisation. If you run into issues please open an issue on the -> package's repository! - -- [`lustre_http`](https://hexdocs.pm/lustre_http/) lets you make HTTP requests - and describe what responses to expect from them. - -- [`lustre_websocket`](https://hexdocs.pm/lustre_websocket/) handles WebSocket - connections and messages. - -- [`modem`](https://hexdocs.pm/modem/) and [`lustre_routed`](https://hexdocs.pm/lustre_routed/) - are two packages that help you manage navigation and routing. - -- [`lustre_animation`](https://hexdocs.pm/lustre_animation/) is a simple package - for interpolating between values over time. - -## Running effects - -We know that effects need to be performed by the runtime, but how does the runtime -know when we want it to run an effect? If you have been using the `lustre.simple` -application constructor until now, it is time to upgrade to -[`lustre.application`](https://hexdocs.pm/lustre/lustre.html#application)! - -Full Lustre applications differ from simple applications in one important way by -returning a tuple of `#(Model, Effect(Msg))` from your `init` and `update` -functions: - -```gleam -pub fn simple( - init: fn(flags) -> model, - update: fn(model, msg) -> model, - view: fn(model) -> Element(msg), -) -> App(flags, model, msg) - -pub fn application( - init: fn(flags) -> #(model, Effect(msg)), - update: fn(model, msg) -> #(model, Effect(msg)), - view: fn(model) -> Element(msg), -) -> App(flags, model, msg) -``` - -We can, for example, launch an HTTP request on application start by using `lustre_http.get` -in our `init` function: - -```gleam -fn init(_flags) { - let model = Model(...) - let get_ip = lustre_http.get( - "https://api.ipify.org", - ApiReturnedIpAddress - ) - - #(model, get_ip) -} -``` - -> **Note**: to tell the runtime we _don't_ want to perform any side effects this -> time, we can use [`effect.none()`](https://hexdocs.pm/lustre/lustre/effect.html#none). - -## Writing your own effects - -When you need to do something one of the existing packages doesn't cover, you need -to write your own effect. You can do that by passing a callback to -[`effect.from`](https://hexdocs.pm/lustre/lustre/effect.html#from). Custom effects -are called with an argument – commonly called `dispatch` – that you can use to -send messages back to your application's `update` function. - -Below is an example of a custom effect that reads a value from local storage: - -```js -// ffi.mjs -import { Ok, Error } from "./gleam.mjs"; - -export function read(key) { - const value = window.localStorage.getItem(key); - return value ? new Ok(value) : new Error(undefined); -} -``` - -```gleam -fn read(key: String, to_msg: fn(Result(String, Nil)) -> msg) -> Effect(msg) { - effect.from(fn(dispatch) { - do_read(key) - |> to_msg - |> dispatch - }) -} - -@external(javascript, "ffi.mjs", "read") -fn do_read(key: String) -> Result(String, Nil) { - Error(Nil) -} -``` - -> **Note**: we provide a default implementation of the `do_read` function that -> always fails. Where possible it's good to provide an implementation for all of -> Gleam's targets. This makes it much easier to run your code as a -> [server component](https://hexdocs.pm/lustre/lustre/server_component.html) in -> the future. - -### Effects that touch the DOM - -Lustre runs all your side effects after your `update` function returns but _before_ -your `view` function is called. A common bug folks run into is trying to interact -with a particular element in the DOM before it's had a chance to render. As a -rule of thumb, you should _always_ wrap custom effects that interact with the DOM -in a [`requestAnimationFrame`](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame) -call to ensure the DOM has had a chance to update first. - -### Effects without dispatch - -So far, we have seen side effects that are expected to _return something_ to our -program. If we fire an HTTP request, it wouldn't be much use if we couldn't get -the response back! Sometimes folks wrongly assume effects _must_ use the `dispatch` -function they're given, but this isn't true! - -It's also totally valid to write effects that don't dispatch any messages. Earlier -we saw an example of how to read from local storage, we might also want an effect -to _write_ to local storage and there's not much to dispatch in that case! - -```js -// ffi.mjs -export function write(key, value) { - window.localStorage.setItem(key, value); -} -``` - -```gleam -// app.gleam -fn write(key: String, value: String) -> Effect(msg) { - effect.from(fn(_) { - do_write(key, value) - }) -} - -@external(javascript, "ffi.mjs", "write") -fn do_write(key: String, value: String) -> Nil { - Nil -} -``` - -### Effects with multiple dispatch - -Similar to effects that don't dispatch any messages, some folks skip over the fact -effects can dispatch _multiple_ messages. Packages like [`lustre_websocket`](https://hexdocs.pm/lustre_websocket/) -and [`modem`](https://hexdocs.pm/modem/) set up effects that will dispatch many -messages over the lifetime of your program. - -Once you have a reference to that `dispatch` function, you're free to call it as -many times as you want! - -```js -// ffi.mjs -export function every(interval, cb) { - window.setInterval(cb, interval); -} -``` - -```gleam -// app.gleam -fn every(interval: Int, tick: msg) -> Effect(msg) { - effect.from(fn(dispatch) { - do_every(interval, fn() { - dispatch(tick) - }) - }) -} - -@external(javascript, "ffi.mjs", "every") -fn do_every(interval: Int, cb: fn() -> Nil) -> Nil { - Nil -} -``` - -Here we set up an effect that will continuously dispatch a `tick` message at a -fixed interval. - -## Related examples - -If you'd like to see some of the ideas in action, we have a number of examples -that demonstrate how Lustre's effects system works in practice: - -- [`05-http-requests`](https://github.com/lustre-labs/lustre/tree/main/examples/05-http-requests) -- [`06-custom-effects`](https://github.com/lustre-labs/lustre/tree/main/examples/06-custom-effects) -- [`07-routing`](https://github.com/lustre-labs/lustre/tree/main/examples/07-routing) - -## Getting help - -If you're having trouble with Lustre or not sure what the right way to do -something is, the best place to get help is the [Gleam Discord server](https://discord.gg/Fm8Pwmy). -You could also open an issue on the [Lustre GitHub repository](https://github.com/lustre-labs/lustre/issues). diff --git a/packages/lustre/pages/guide/04-server-side-rendering.md b/packages/lustre/pages/guide/04-server-side-rendering.md deleted file mode 100644 index 27a2d89..0000000 --- a/packages/lustre/pages/guide/04-server-side-rendering.md +++ /dev/null @@ -1,216 +0,0 @@ -# 04 Server-side rendering - -Up until now, we have focused on Lustre's ability as a framework for building -Single Page Applications (SPAs). While Lustre's development and feature set is -primarily focused on SPA development, that doesn't mean it can't be used on the -backend as well! In this guide we'll set up a small [mist](https://hexdocs.pm/mist/) -server that renders some static HTML using Lustre. - -## Setting up the project - -We'll start by adding the dependencies we need and scaffolding the HTTP server. -Besides Lustre and Mist, we also need `gleam_erlang` (to keep our application -alive) and `gleam_http` (for types and functions to work with HTTP requests and -responses): - -```sh -gleam new app && cd app && gleam add gleam_erlang gleam_http lustre mist -``` - -Besides imports for `mist` and `gleam_http` modules, we also need to import some -modules to render HTML with Lustre. Importantly, we _don't_ need anything from the -main `lustre` module: we're not building an application with a runtime! - -```gleam -import gleam/bytes_builder -import gleam/erlang/process -import gleam/http/request.{type Request} -import gleam/http/response.{type Response} -import lustre/element -import lustre/element/html.{html} -import mist.{type Connection, type ResponseData} -``` - -We'll modify Mist's example and write a simple request handler that responds to -requests to `/greet/:name` with a greeting message: - -```gleam -pub fn main() { - let empty_body = mist.Bytes(bytes_builder.new()) - let not_found = response.set_body(response.new(404), empty_body) - - let assert Ok(_) = - fn(req: Request(Connection)) -> Response(ResponseData) { - case request.path_segments(req) { - ["greet", name] -> greet(name) - _ -> not_found - } - } - |> mist.new - |> mist.port(3000) - |> mist.start_http - - process.sleep_forever() -} -``` - -Let's take a peek inside that `greet` function: - -```gleam -fn greet(name: String) -> Response(ResponseData) { - let res = response.new(200) - let html = - html([], [ - html.head([], [html.title([], "Greetings!")]), - html.body([], [ - html.h1([], [html.text("Hey there, " <> name <> "!")]) - ]) - ]) - - response.set_body(res, - html - |> element.to_document_string - |> bytes_builder.from_string - |> mist.Bytes - ) -} -``` - -The `lustre/element` module has functions for rendering Lustre elements to a -string (or string builder); the `to_document_string` function helpfully prepends -the `` declaration to the output. - -It's important to realise that `element.to_string` and `element.to_document_string` -can render _any_ Lustre element! This means you could take the `view` function -from your client-side SPA and render it server-side, too. - -## Hydration - -If we know we can render our apps server-side, the next logical question is how -do we handle _hydration_? Hydration is the process of taking the static HTML -generated by the server and turning it into a fully interactive client application, -ideally doing as little work as possible. - -Most frameworks today support hydration or some equivalent, for example by -serialising the state of each component into the HTML and then picking up where -the server left off. Lustre doesn't have a built-in hydration mechanism, but -because of the way it works, it's easy to implement one yourself! - -We've said many times now that in Lustre, your `view` is just a -[pure function](https://github.com/lustre-labs/lustre/blob/main/pages/hints/pure-functions.md) -of your model. We should produce the same HTML every time we call `view` with the -same model, no matter how many times we call it. - -Let's use that to our advantage! We know our app's `init` function is responsible -for producing the initial model, so all we need is a way to make sure the initial -model on the client is the same as what the server used to render the page. - -```gleam -pub fn view(model: Int) -> Element(Msg) { - let count = int.to_string(model) - - html.div([], [ - html.button([event.on_click(Decr)], [html.text("-")]), - html.button([event.on_click(Incr)], [html.text("+")]), - html.p([], [html.text("Count: " <> count)]) - ]) -} -``` - -We've seen the counter example a thousand times over now, but it's a good example -to show off how simple hydration can be. The `view` function produces some HTML -with events attached, but we already know Lustre can render _any_ element to a -string so that shouldn't be a problem. - -Let's imagine our HTTP server responds with the following HTML: - -```gleam -import app/counter -import gleam/bytes_builder -import gleam/http/response.{type Response} -import gleam/json -import lustre/attribute -import lustre/element.{type Element} -import lustre/element/html.{html} -import mist.{type ResponseData} - -fn app() -> Response(ResponseData) { - let res = response.new(200) - - let model = 5 - let html = - html([], [ - html.head([], [ - html.script([attribute.type_("module"), attribute.src("...")], ""), - html.script([attribute.type_("application/json"), attribute.id("model")], - json.int(model) - |> json.to_string - ) - ]), - html.body([], [ - html.div([attribute.id("app")], [ - counter.view(model) - ]) - ]) - ]) - - response.set_body(res, - html - |> element.to_document_string - |> bytes_builder.from_string - |> mist.Bytes - ) -} -``` - -We've rendered the shell of our application, as well as the counter using `5` as -the initial model. Importantly, we've included a ` - - - -
    - - diff --git a/packages/lustre/test-apps/options-list/manifest.toml b/packages/lustre/test-apps/options-list/manifest.toml deleted file mode 100644 index 676354e..0000000 --- a/packages/lustre/test-apps/options-list/manifest.toml +++ /dev/null @@ -1,46 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "birl", version = "1.6.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "976CFF85D34D50F7775896615A71745FBE0C325E50399787088F941B539A0497" }, - { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "filespy", version = "0.4.0", build_tools = ["gleam"], requirements = ["fs", "gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "filespy", source = "hex", outer_checksum = "950469A2FA50265EB84530637D3E9597C2CA676A2EEABC98C69A83C77316709C" }, - { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_json", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "8B197DD5D578EA6AC2C0D4BDC634C71A5BCA8E7DB5F47091C263ECB411A60DF3" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.36.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "C0D14D807FEC6F8A08A7C9EF8DFDE6AE5C10E40E21325B2B29365965D82EB3D4" }, - { name = "glearray", version = "0.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "908154F695D330E06A37FAB2C04119E8F315D643206F8F32B6A6C14A8709FFF4" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "BB0F14643CC51C069A5DC6E9082EAFCD9967AFD1C9CC408803D1A40A3FD43B54" }, - { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, - { name = "logging", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "82C112ED9B6C30C1772A6FE2613B94B13F62EA35F5869A2630D13948D297BD39" }, - { name = "lustre", version = "4.1.7", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], source = "local", path = "../.." }, - { name = "lustre_dev_tools", version = "1.2.1", build_tools = ["gleam"], requirements = ["argv", "filepath", "filespy", "fs", "gleam_community_ansi", "gleam_erlang", "gleam_http", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "930BBE8C4E92A16857C31B7B12616651433E1643304696FB93B69D659CE3ADC2" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "marceau", version = "1.1.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "1AAD727A30BE0F95562C3403BB9B27C823797AD90037714255EEBF617B1CDA81" }, - { name = "mist", version = "1.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "7765E53DCC9ACCACF217B8E0CA3DE7E848C783BFAE5118B75011E81C2C80385C" }, - { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "thoas", version = "0.4.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "4918D50026C073C4AB1388437132C77A6F6F7C8AC43C60C13758CC0ADCE2134E" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, - { name = "wisp", version = "0.14.0", build_tools = ["gleam"], requirements = ["exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "9F5453AF1F9275E6F8707BC815D6A6A9DF41551921B16FBDBA52883773BAE684" }, -] - -[requirements] -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { path = "../../" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/test-apps/options-list/src/app.gleam b/packages/lustre/test-apps/options-list/src/app.gleam deleted file mode 100644 index 3328e7d..0000000 --- a/packages/lustre/test-apps/options-list/src/app.gleam +++ /dev/null @@ -1,49 +0,0 @@ -import lustre -import lustre/attribute -import lustre/element.{type Element} -import lustre/element/html -import lustre/event -import lustre/ui - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - let app = lustre.simple(init, update, view) - let assert Ok(_) = lustre.start(app, "#app", Nil) -} - -// MODEL ----------------------------------------------------------------------- - -type Model = - String - -fn init(_flags) -> Model { - "a" -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - Select(String) -} - -fn update(_model: Model, msg: Msg) -> Model { - case msg { - Select(tag) -> tag - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - - ui.centre( - [attribute.style(styles)], - html.select([event.on_input(Select)], [ - html.option([attribute.value("a"), attribute.selected("a" == model)], "a"), - html.option([attribute.value("b"), attribute.selected("b" == model)], "b"), - html.option([attribute.value("c"), attribute.selected("c" == model)], "c"), - ]), - ) -} diff --git a/packages/lustre/test-apps/server-component-change-children/README.md b/packages/lustre/test-apps/server-component-change-children/README.md deleted file mode 100644 index a6acb10..0000000 --- a/packages/lustre/test-apps/server-component-change-children/README.md +++ /dev/null @@ -1,5 +0,0 @@ -This example makes sure that patches that add or remove different children in a -server component are correctly applied on the client. At one point we realised -patches were being sent in reverse order and that meant the client ended up -incorrectly reusing newly-created children from the _current patch_ when diffing -new nodes. diff --git a/packages/lustre/test-apps/server-component-change-children/gleam.toml b/packages/lustre/test-apps/server-component-change-children/gleam.toml deleted file mode 100644 index eb98040..0000000 --- a/packages/lustre/test-apps/server-component-change-children/gleam.toml +++ /dev/null @@ -1,27 +0,0 @@ -name = "app" -version = "1.0.0" - -# Fill out these fields if you intend to generate HTML documentation or publish -# your project to the Hex package manager. -# -# description = "" -# licences = ["Apache-2.0"] -# repository = { type = "github", user = "username", repo = "project" } -# links = [{ title = "Website", href = "https://gleam.run" }] -# -# For a full reference of all the available options, you can have a look at -# https://gleam.run/writing-gleam/gleam-toml/. - -[dependencies] -gleam_stdlib = "~> 0.36" -lustre = { path = "../../" } -mist = "~> 0.17" -gleam_erlang = "~> 0.24" -gleam_otp = "~> 0.10" -gleam_http = "~> 3.6" -lustre_ui = "~> 0.4" -gleam_json = "~> 1.0" -simplifile = "~> 1.5" - -[dev-dependencies] -gleeunit = "~> 1.0" diff --git a/packages/lustre/test-apps/server-component-change-children/manifest.toml b/packages/lustre/test-apps/server-component-change-children/manifest.toml deleted file mode 100644 index 32f8931..0000000 --- a/packages/lustre/test-apps/server-component-change-children/manifest.toml +++ /dev/null @@ -1,31 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_stdlib", version = "0.37.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5398BD6C2ABA17338F676F42F404B9B7BABE1C8DC7380031ACB05BBE1BCF3742" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glisten", version = "0.11.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "73BC09C8487C2FFC0963BFAB33ED2F0D636FDFA43B966E65C1251CBAB8458099" }, - { name = "lustre", version = "4.1.8", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], source = "local", path = "../.." }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "mist", version = "0.17.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten"], otp_app = "mist", source = "hex", outer_checksum = "DA8ACEE52C1E4892A75181B3166A4876D8CBC69D555E4770250BC84C80F75524" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "thoas", version = "1.2.0", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "540C8CB7D9257F2AD0A14145DC23560F91ACDCA995F0CCBA779EB33AF5D859D1" }, -] - -[requirements] -gleam_erlang = { version = "~> 0.24" } -gleam_http = { version = "~> 3.6" } -gleam_json = { version = "~> 1.0" } -gleam_otp = { version = "~> 0.10" } -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { path = "../../" } -lustre_ui = { version = "~> 0.4" } -mist = { version = "~> 0.17" } -simplifile = { version = "~> 1.5" } diff --git a/packages/lustre/test-apps/server-component-change-children/src/app.gleam b/packages/lustre/test-apps/server-component-change-children/src/app.gleam deleted file mode 100644 index 82a1658..0000000 --- a/packages/lustre/test-apps/server-component-change-children/src/app.gleam +++ /dev/null @@ -1,167 +0,0 @@ -import counter -import gleam/bytes_builder -import gleam/erlang -import gleam/erlang/process.{type Selector, type Subject} -import gleam/http/request.{type Request} -import gleam/http/response.{type Response} -import gleam/json -import gleam/option.{type Option, None} -import gleam/otp/actor -import gleam/result -import lustre -import lustre/attribute -import lustre/element -import lustre/element/html.{html} -import lustre/server_component -import mist.{ - type Connection, type ResponseData, type WebsocketConnection, - type WebsocketMessage, -} - -pub fn main() { - let assert Ok(_) = - fn(req: Request(Connection)) -> Response(ResponseData) { - case request.path_segments(req) { - // Set up the websocket connection to the client. This is how we send - // DOM updates to the browser and receive events from the client. - ["counter"] -> - mist.websocket( - request: req, - on_init: socket_init, - on_close: socket_close, - handler: socket_update, - ) - - // We need to serve the server component runtime. There's also a minified - // version of this script for production. - ["lustre-server-component.mjs"] -> { - let assert Ok(priv) = erlang.priv_directory("lustre") - let path = priv <> "/static/lustre-server-component.mjs" - - mist.send_file(path, offset: 0, limit: None) - |> result.map(fn(script) { - response.new(200) - |> response.prepend_header("content-type", "application/javascript") - |> response.set_body(script) - }) - |> result.lazy_unwrap(fn() { - response.new(404) - |> response.set_body(mist.Bytes(bytes_builder.new())) - }) - } - - // For all other requests we'll just serve some HTML that renders the - // server component. - _ -> - response.new(200) - |> response.prepend_header("content-type", "text/html") - |> response.set_body( - html([], [ - html.head([], [ - html.link([ - attribute.rel("stylesheet"), - attribute.href( - "https://cdn.jsdelivr.net/gh/lustre-labs/ui/priv/styles.css", - ), - ]), - html.script( - [ - attribute.type_("module"), - attribute.src("/lustre-server-component.mjs"), - ], - "", - ), - ]), - html.body([], [ - server_component.component([server_component.route("/counter")]), - ]), - ]) - |> element.to_document_string_builder - |> bytes_builder.from_string_builder - |> mist.Bytes, - ) - } - } - |> mist.new - |> mist.port(3000) - |> mist.start_http - - process.sleep_forever() -} - -// - -type Counter = - Subject(lustre.Action(counter.Msg, lustre.ServerComponent)) - -fn socket_init( - conn: WebsocketConnection, -) -> #(Counter, Option(Selector(lustre.Patch(counter.Msg)))) { - let app = counter.app() - let assert Ok(counter) = lustre.start_actor(app, 0) - - process.send( - counter, - server_component.subscribe( - // server components can have many connected clients, so we need a way to - // identify this client. - "ws", - // this callback is called whenever the server component has a new patch - // to send to the client. here we json encode that patch and send it to - // via the websocket connection. - // - // a more involved version would have us sending the patch to this socket's - // subject, and then it could be handled (perhaps with some other work) in - // the `mist.Custom` branch of `socket_update` below. - fn(patch) { - let assert Ok(_) = - patch - |> server_component.encode_patch - |> json.to_string - |> mist.send_text_frame(conn, _) - - Nil - }, - ), - ) - - #( - // we store the server component's `Subject` as this socket's state so we - // can shut it down when the socket is closed. - counter, - // the `None` here means we aren't planning on receiving any messages from - // elsewhere and dont need a `Selector` to handle them. - None, - ) -} - -import gleam/io - -fn socket_update( - counter: Counter, - _conn: WebsocketConnection, - msg: WebsocketMessage(lustre.Patch(counter.Msg)), -) { - case msg { - mist.Text(json) -> { - // we attempt to decode the incoming text as an action to send to our - // server component runtime. - let action = json.decode(json, server_component.decode_action) - - case action { - Ok(action) -> process.send(counter, action) - Error(_) -> Nil - } - - actor.continue(counter) - } - - mist.Binary(_) -> actor.continue(counter) - mist.Custom(_) -> actor.continue(counter) - mist.Closed | mist.Shutdown -> actor.Stop(process.Normal) - } -} - -fn socket_close(counter: Counter) { - process.send(counter, lustre.shutdown()) -} diff --git a/packages/lustre/test-apps/server-component-change-children/src/counter.gleam b/packages/lustre/test-apps/server-component-change-children/src/counter.gleam deleted file mode 100644 index 06131fc..0000000 --- a/packages/lustre/test-apps/server-component-change-children/src/counter.gleam +++ /dev/null @@ -1,88 +0,0 @@ -import gleam/list -import lustre -import lustre/attribute -import lustre/element.{type Element} -import lustre/element/html -import lustre/event -import lustre/ui - -// MAIN ------------------------------------------------------------------------ - -pub fn app() { - lustre.simple(init, update, view) -} - -// MODEL ----------------------------------------------------------------------- - -pub type Model = - List(#(String, String, String, String)) - -fn init(_) -> Model { - [] -} - -// UPDATE ---------------------------------------------------------------------- - -pub opaque type Msg { - Incr - Decr -} - -fn update(_: Model, msg: Msg) -> Model { - case msg { - Incr -> [ - #("1", "1", "1", "1"), - #("2", "2", "2", "2"), - #("3", "3", "3", "3"), - #("4", "4", "4", "4"), - #("5", "5", "5", "5"), - ] - - Decr -> [ - #("3", "3", "3", "3"), - #("2", "2", "2", "2"), - #("1", "1", "1", "1"), - ] - } -} - -// VIEW ------------------------------------------------------------------------ - -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - - ui.centre( - [attribute.style(styles)], - ui.stack([], [ - ui.button([event.on_click(Incr)], [element.text("ascending")]), - ui.button([event.on_click(Decr)], [element.text("descending")]), - html.div([], [ - ui.stack([], [ - html.table([], [ - html.thead([], [ - html.tr([attribute.style([])], [ - html.th([], [html.text("Part No")]), - html.th([], [html.text("Customer")]), - html.th([], [html.text("Job No")]), - html.th([], [html.text("Due Date")]), - ]), - ]), - { - // let rows = - html.tbody([], { - list.map(model, fn(tuple) { - html.tr([], [ - html.td([], [html.text(tuple.0)]), - html.td([], [html.text(tuple.1)]), - html.td([], [html.text(tuple.2)]), - html.td([], [html.text(tuple.3)]), - ]) - }) - }) - }, - ]), - ]), - ]), - ]), - ) -} diff --git a/packages/lustre/test-apps/svg/README.md b/packages/lustre/test-apps/svg/README.md deleted file mode 100644 index ebe238b..0000000 --- a/packages/lustre/test-apps/svg/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This example exists because setting some SVG attributes like `viewBox` was causing -a runtime error. These attributes were mirrored as DOM properties but they were -marked as **read-only**. diff --git a/packages/lustre/test-apps/svg/gleam.toml b/packages/lustre/test-apps/svg/gleam.toml deleted file mode 100644 index 4a824db..0000000 --- a/packages/lustre/test-apps/svg/gleam.toml +++ /dev/null @@ -1,12 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_stdlib = "~> 0.36" -lustre = { path = "../../" } -lustre_ui = "~> 0.4" - -[dev-dependencies] -gleeunit = "~> 1.0" -lustre_dev_tools = "~> 1.0" diff --git a/packages/lustre/test-apps/svg/manifest.toml b/packages/lustre/test-apps/svg/manifest.toml deleted file mode 100644 index 74a1b75..0000000 --- a/packages/lustre/test-apps/svg/manifest.toml +++ /dev/null @@ -1,33 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, - { name = "filepath", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "EFB6FF65C98B2A16378ABC3EE2B14124168C0CE5201553DE652E2644DCFDB594" }, - { name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" }, - { name = "gleam_community_colour", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "795964217EBEDB3DA656F5EB8F67D7AD22872EB95182042D3E7AFEF32D3FD2FE" }, - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_json", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "8B197DD5D578EA6AC2C0D4BDC634C71A5BCA8E7DB5F47091C263ECB411A60DF3" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_package_interface", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "52A721BCA972C8099BB881195D821AAA64B9F2655BECC102165D5A1097731F01" }, - { name = "gleam_stdlib", version = "0.36.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "C0D14D807FEC6F8A08A7C9EF8DFDE6AE5C10E40E21325B2B29365965D82EB3D4" }, - { name = "glearray", version = "0.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "908154F695D330E06A37FAB2C04119E8F315D643206F8F32B6A6C14A8709FFF4" }, - { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, - { name = "glint", version = "0.18.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "BB0F14643CC51C069A5DC6E9082EAFCD9967AFD1C9CC408803D1A40A3FD43B54" }, - { name = "lustre", version = "4.1.5", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], source = "local", path = "../.." }, - { name = "lustre_dev_tools", version = "1.1.5", build_tools = ["gleam"], requirements = ["argv", "filepath", "gleam_community_ansi", "gleam_erlang", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "simplifile", "spinner", "tom"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "CA6C10177B66C4FBE8F56B37973C7BB312A8622248D5489957B364FF2C0700AE" }, - { name = "lustre_ui", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_ui", source = "hex", outer_checksum = "FA1F9E89D89CDD5DF376ED86ABA8A38441CB2E664CD4D402F22A49DA4D7BB56D" }, - { name = "repeatedly", version = "2.1.1", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "38808C3EC382B0CD981336D5879C24ECB37FCB9C1D1BD128F7A80B0F74404D79" }, - { name = "simplifile", version = "1.7.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "1D5DFA3A2F9319EC85825F6ED88B8E449F381B0D55A62F5E61424E748E7DDEB0" }, - { name = "snag", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "54D32E16E33655346AA3E66CBA7E191DE0A8793D2C05284E3EFB90AD2CE92BCC" }, - { name = "spinner", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_erlang", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "200BA3D4A04D468898E63C0D316E23F526E02514BC46454091975CB5BAE41E8F" }, - { name = "thoas", version = "0.4.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "4918D50026C073C4AB1388437132C77A6F6F7C8AC43C60C13758CC0ADCE2134E" }, - { name = "tom", version = "0.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "0831C73E45405A2153091226BF98FB485ED16376988602CC01A5FD086B82D577" }, -] - -[requirements] -gleam_stdlib = { version = "~> 0.36" } -gleeunit = { version = "~> 1.0" } -lustre = { path = "../../" } -lustre_dev_tools = { version = "~> 1.0" } -lustre_ui = { version = "~> 0.4" } diff --git a/packages/lustre/test-apps/svg/src/app.gleam b/packages/lustre/test-apps/svg/src/app.gleam deleted file mode 100644 index 4b0b8b2..0000000 --- a/packages/lustre/test-apps/svg/src/app.gleam +++ /dev/null @@ -1,35 +0,0 @@ -import lustre -import lustre/attribute.{attribute} -import lustre/element/html -import lustre/element/svg -import lustre/ui -import lustre/ui/icon - -pub fn main() { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - - lustre.element(ui.centre( - [attribute.style(styles)], - html.svg( - [ - attribute("version", "1.1"), - attribute("viewBox", "0 0 300 200"), - attribute("width", "300"), - attribute("height", "200"), - ], - [ - svg.rect([ - attribute("width", "100%"), - attribute("height", "100%"), - attribute("fill", "red"), - ]), - svg.circle([ - attribute("cx", "150"), - attribute("cy", "100"), - attribute("r", "80"), - attribute("fill", "green"), - ]), - ], - ), - )) -} diff --git a/packages/lustre/test-apps/vdom-test-templates/gleam.toml b/packages/lustre/test-apps/vdom-test-templates/gleam.toml deleted file mode 100644 index 24c306c..0000000 --- a/packages/lustre/test-apps/vdom-test-templates/gleam.toml +++ /dev/null @@ -1,7 +0,0 @@ -name = "app" -version = "1.0.0" -target = "javascript" - -[dependencies] -gleam_stdlib = "~> 0.36" -lustre = { path = "../../" } diff --git a/packages/lustre/test-apps/vdom-test-templates/manifest.toml b/packages/lustre/test-apps/vdom-test-templates/manifest.toml deleted file mode 100644 index 342a523..0000000 --- a/packages/lustre/test-apps/vdom-test-templates/manifest.toml +++ /dev/null @@ -1,15 +0,0 @@ -# This file was generated by Gleam -# You typically do not need to edit this file - -packages = [ - { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, - { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_stdlib", version = "0.37.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5398BD6C2ABA17338F676F42F404B9B7BABE1C8DC7380031ACB05BBE1BCF3742" }, - { name = "lustre", version = "4.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], source = "local", path = "../.." }, - { name = "thoas", version = "1.2.0", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "540C8CB7D9257F2AD0A14145DC23560F91ACDCA995F0CCBA779EB33AF5D859D1" }, -] - -[requirements] -gleam_stdlib = { version = "~> 0.36" } -lustre = { path = "../../" } diff --git a/packages/lustre/test-apps/vdom-test-templates/src/client_test.gleam b/packages/lustre/test-apps/vdom-test-templates/src/client_test.gleam deleted file mode 100644 index ccbb65e..0000000 --- a/packages/lustre/test-apps/vdom-test-templates/src/client_test.gleam +++ /dev/null @@ -1,64 +0,0 @@ -import gleam/int -import gleam/list -import lustre/attribute -import lustre/element -import lustre/element/html - -// VIEW HELPERS ----------------------------------------------------------------- -// Functions to get view definitions for testing client ffi, further testing could reuse examples -pub fn smoke_test() { - html.div([], [html.p([], [element.text("smoke test")])]) -} - -pub fn dynamic_content_test(number: Int, some_string: String) { - html.div([], [ - html.h1([], [element.text(some_string)]), - html.p([], [element.text(int.to_string(number))]), - ]) -} - -const mock_people = [ - #("1dfg", "Person One", 18), - #("abc3", "Person Two", 24), - #("ga4d", "Person Three", 30), -] - -pub fn fragment_test() { - let person_els = - element.fragment( - list.map(mock_people, fn(person) { - let #(_, person_name, age) = person - let person_el = [ - html.td([], [element.text(person_name)]), - html.td([], [element.text(int.to_string(age))]), - ] - element.fragment([html.tr([], person_el)]) - }), - ) - - html.table([], [ - html.head([], [ - html.tr([], [ - html.th([], [element.text("Person Name")]), - html.th([], [element.text("Person Age")]), - ]), - ]), - html.body([], [person_els]), - ]) -} - -pub fn keyed_test() { - element.keyed(html.ul([], _), { - use #(id, person_name, age) <- list.map(mock_people) - let child = - html.tr([], [ - html.td([], [element.text(person_name)]), - html.td([], [element.text(int.to_string(age))]), - ]) - #(id, child) - }) -} - -pub fn disabled_attr_test(is_disabled: Bool) { - html.div([], [html.input([attribute.disabled(is_disabled)])]) -} diff --git a/packages/lustre/test/02-interactivity.test.js b/packages/lustre/test/02-interactivity.test.js deleted file mode 100644 index 3355e94..0000000 --- a/packages/lustre/test/02-interactivity.test.js +++ /dev/null @@ -1,88 +0,0 @@ -import { beforeEach, describe, expect, test } from "vitest"; -import { setupDOM } from "./utils.js"; -// built via npm script "build:test:02" -import { main } from "@root/examples/02-interactivity/build/dev/javascript/app/app.mjs"; - -let appEl; -beforeEach(() => { - setupDOM(); - appEl = document.getElementById("app"); -}); - -describe("counter example", () => { - test("should render initially", () => { - main(); - - expect(document.toString()).toMatchSnapshot(); - }); - - test("should increment on button press", () => { - main(); - - const buttons = document.querySelectorAll("button.lustre-ui-button"); - const incrementButton = buttons[0]; - const count = document.querySelector("p"); - - expect(incrementButton).toBeTruthy(); - - incrementButton.click(); - - expect(count.innerText).toBe("1"); - - incrementButton.click(); - expect(count.innerText).toBe("2"); - - incrementButton.click(); - expect(count.innerText).toBe("3"); - - }); - - test("should decrement on button press", () => { - main(); - - const buttons = document.querySelectorAll("button.lustre-ui-button"); - const decrementButton = buttons[1]; - const count = document.querySelector("p"); - - expect(decrementButton).toBeTruthy(); - - decrementButton.click(); - expect(count.innerText).toBe("-1"); - - decrementButton.click(); - expect(count.innerText).toBe("-2"); - - decrementButton.click(); - expect(count.innerText).toBe("-3"); - }); - - test("should increment and decrement on button press", () => { - main(); - - const buttons = document.querySelectorAll("button.lustre-ui-button"); - const incrementButton = buttons[0]; - const decrementButton = buttons[1]; - const count = document.querySelector("p"); - - incrementButton.click(); - - expect(count.innerText).toBe("1"); - - incrementButton.click(); - expect(count.innerText).toBe("2"); - - incrementButton.click(); - expect(count.innerText).toBe("3"); - - expect(decrementButton).toBeTruthy(); - - decrementButton.click(); - expect(count.innerText).toBe("2"); - - decrementButton.click(); - expect(count.innerText).toBe("1"); - - decrementButton.click(); - expect(count.innerText).toBe("0"); - }); -}); diff --git a/packages/lustre/test/README.md b/packages/lustre/test/README.md deleted file mode 100644 index 6577c5c..0000000 --- a/packages/lustre/test/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Client testing for Lustre runtime - -1. Build and test example projects -2. Build and test vdom - -Depends on: -- `linkedom` - headless DOM testing -- `npm-run-all` - run watch in parallel -- `vitest` - execute tests - - -### Commands - -Run from the `test` directory -Each command will run a `build` command to build project dependencies - -#### Benchmark - -- `npm run bench` - -#### Test - -- ##### Single - - - `npm run test` - -- ##### Watch - - - `npm run test:watch` diff --git a/packages/lustre/test/apps/counter.gleam b/packages/lustre/test/apps/counter.gleam deleted file mode 100644 index b58b2ee..0000000 --- a/packages/lustre/test/apps/counter.gleam +++ /dev/null @@ -1,41 +0,0 @@ -// IMPORTS --------------------------------------------------------------------- - -import gleam/int -import lustre/element.{text} -import lustre/element/html.{button, div, p} -import lustre/event - -// MODEL ----------------------------------------------------------------------- - -pub type Model = - Int - -pub fn init(count) { - count -} - -// UPDATE ---------------------------------------------------------------------- - -pub type Msg { - Increment - Decrement -} - -pub fn update(model, msg) { - case msg { - Increment -> model + 1 - Decrement -> model - 1 - } -} - -// VIEW ------------------------------------------------------------------------ - -pub fn view(model) { - let count = int.to_string(model) - - div([], [ - p([], [text(count)]), - button([event.on_click(Decrement)], [text("-")]), - button([event.on_click(Increment)], [text("+")]), - ]) -} diff --git a/packages/lustre/test/apps/fragment.gleam b/packages/lustre/test/apps/fragment.gleam deleted file mode 100644 index d20400e..0000000 --- a/packages/lustre/test/apps/fragment.gleam +++ /dev/null @@ -1,45 +0,0 @@ -// Similar to count app, with fragments and edge cases - -// IMPORTS --------------------------------------------------------------------- - -import gleam/int -import lustre/element.{text} -import lustre/element/html.{button, p} -import lustre/event - -// MODEL ----------------------------------------------------------------------- - -pub type Model = - Int - -pub fn init(count) { - count -} - -// UPDATE ---------------------------------------------------------------------- - -pub type Msg { - Increment - Decrement -} - -pub fn update(model, msg) { - case msg { - Increment -> model + 1 - Decrement -> model - 1 - } -} - -// VIEW ------------------------------------------------------------------------ - -pub fn view(model) { - let count = int.to_string(model) - element.fragment([ - element.fragment([p([], [element.text("start fragment")])]), - element.fragment([p([], [element.text("middle fragment")])]), - element.fragment([p([], [element.text(count)])]), - button([event.on_click(Decrement)], [text("-")]), - button([event.on_click(Increment)], [text("+")]), - p([], [element.text("order check, last element")]), - ]) -} diff --git a/packages/lustre/test/apps/static.gleam b/packages/lustre/test/apps/static.gleam deleted file mode 100644 index fcf52f3..0000000 --- a/packages/lustre/test/apps/static.gleam +++ /dev/null @@ -1,29 +0,0 @@ -// IMPORTS --------------------------------------------------------------------- - -import lustre/attribute.{attribute, class, disabled, src, style} -import lustre/element.{text} -import lustre/element/html.{body, div, h1, head, html, img, input, title} - -// VIEW ------------------------------------------------------------------------ - -pub fn view() { - html([], [ - head([], [title([], "Hello, World!")]), - body([], [ - h1([], [text("Hello, World!")]), - input([disabled(True)]), - img([src("https://source.unsplash.com/random")]), - ]), - ]) -} - -pub fn escaped_attribute() { - div( - [ - class("'badquotes'"), - style([#("background", "\">")]), - attribute("example", "{\"mykey\": \"myvalue\"}"), - ], - [], - ) -} diff --git a/packages/lustre/test/build.gleam b/packages/lustre/test/build.gleam deleted file mode 100644 index b223027..0000000 --- a/packages/lustre/test/build.gleam +++ /dev/null @@ -1,122 +0,0 @@ -// IMPORTS --------------------------------------------------------------------- - -import gleam/bool -import gleam/io -import gleam/regex.{Options} -import gleam/result -import gleam/string -import shellout -import simplifile - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - io.debug({ - use exists <- try(verify_esbuild(), SimplifileError) - use <- bool.guard(!exists, Error(MissingEsbuild)) - - use _ <- try(build_for_javascript(), ShelloutError) - use _ <- try(bundle_server_component(), ShelloutError) - use _ <- try(bundle_minified_server_component(), ShelloutError) - - use script <- try(read_script(), SimplifileError) - use module <- try(read_module(), SimplifileError) - use _ <- try(inject_script(script, module), SimplifileError) - - use _ <- try(format_project(), ShelloutError) - - Ok(Nil) - }) -} - -// CONSTANTS ------------------------------------------------------------------- - -const esbuild = "./build/.lustre/bin/esbuild" - -// STEPS ----------------------------------------------------------------------- - -fn verify_esbuild() { - simplifile.verify_is_file(esbuild) -} - -fn build_for_javascript() { - shellout.command( - run: "gleam", - with: ["build", "--target", "javascript"], - in: ".", - opt: [], - ) -} - -fn bundle_server_component() { - shellout.command( - run: esbuild, - with: [ - "./src/server-component.mjs", "--bundle", "--format=esm", - "--outfile=./priv/static/lustre-server-component.mjs", - ], - in: ".", - opt: [], - ) -} - -fn bundle_minified_server_component() { - shellout.command( - run: esbuild, - with: [ - "./src/server-component.mjs", "--bundle", "--minify", "--format=esm", - "--outfile=./priv/static/lustre-server-component.min.mjs", - ], - in: ".", - opt: [], - ) -} - -fn read_script() { - simplifile.read("./priv/static/lustre-server-component.min.mjs") - |> result.map(string.replace(_, "\"", "\\\"")) - |> result.map(string.trim) -} - -fn read_module() { - simplifile.read("./src/lustre/server_component.gleam") -} - -fn inject_script(script, module) { - let inject_regex = "// <>\\n.+\\n.+\\n \\)," - let options = Options(case_insensitive: False, multi_line: True) - let assert Ok(re) = regex.compile(inject_regex, options) - let assert [before, after] = regex.split(re, module) - - simplifile.write( - "./src/lustre/server_component.gleam", - before - <> "// <>\n element.text(\"" - <> script - <> "\")," - <> after, - ) -} - -fn format_project() { - shellout.command(run: "gleam", with: ["format"], in: ".", opt: []) -} - -// ERROR HANDLING -------------------------------------------------------------- - -pub type Error { - MissingEsbuild - ShelloutError(#(Int, String)) - SimplifileError(simplifile.FileError) -} - -fn try( - result: Result(a, e), - to_error: fn(e) -> Error, - then: fn(a) -> Result(b, Error), -) -> Result(b, Error) { - case result { - Ok(value) -> then(value) - Error(error) -> Error(to_error(error)) - } -} diff --git a/packages/lustre/test/lustre_test.gleam b/packages/lustre/test/lustre_test.gleam deleted file mode 100644 index 2330b3c..0000000 --- a/packages/lustre/test/lustre_test.gleam +++ /dev/null @@ -1,175 +0,0 @@ -// IMPORTS --------------------------------------------------------------------- - -import apps/counter -import apps/fragment -import apps/static -import birdie -import gleam/erlang/process -import gleam/json -import gleeunit -import lustre -import lustre/element -import lustre/internals/patch -import lustre/internals/runtime.{Debug, Dispatch, Shutdown, View} - -// MAIN ------------------------------------------------------------------------ - -pub fn main() { - gleeunit.main() -} - -// TESTS ----------------------------------------------------------------------- - -pub fn static_test() { - let title = "Can render static HTML" - let el = static.view() - - birdie.snap(element.to_string(el), title) -} - -@target(erlang) -pub fn counter_init_test() { - let title = "Can render an application's initial state." - let app = lustre.simple(counter.init, counter.update, counter.view) - let assert Ok(runtime) = lustre.start_actor(app, 0) - let el = - process.call( - runtime, - fn(reply) { - process.send(reply, _) - |> View - |> Debug - }, - 100, - ) - - birdie.snap(element.to_string(el), title) - process.send(runtime, Shutdown) -} - -@target(erlang) -pub fn counter_update_test() { - let title = "Can render an application's state after some updates." - let app = lustre.simple(counter.init, counter.update, counter.view) - let assert Ok(runtime) = lustre.start_actor(app, 0) - - process.send(runtime, Dispatch(counter.Increment)) - process.send(runtime, Dispatch(counter.Increment)) - process.send(runtime, Dispatch(counter.Increment)) - - let el = - process.call( - runtime, - fn(reply) { - process.send(reply, _) - |> View - |> Debug - }, - 100, - ) - - birdie.snap(element.to_string(el), title) - process.send(runtime, Shutdown) -} - -@target(erlang) -pub fn counter_diff_test() { - let title = "Can compute a diff from one render to the next" - let app = lustre.simple(counter.init, counter.update, counter.view) - let assert Ok(runtime) = lustre.start_actor(app, 0) - - let prev = - process.call( - runtime, - fn(reply) { - process.send(reply, _) - |> View - |> Debug - }, - 100, - ) - - process.send(runtime, Dispatch(counter.Increment)) - process.send(runtime, Dispatch(counter.Increment)) - process.send(runtime, Dispatch(counter.Increment)) - - let next = - process.call( - runtime, - fn(reply) { - process.send(reply, _) - |> View - |> Debug - }, - 100, - ) - - let diff = patch.elements(prev, next) - - birdie.snap(json.to_string(patch.element_diff_to_json(diff)), title) - process.send(runtime, Shutdown) -} - -@target(erlang) -pub fn fragment_init_test() { - let title = "Can render an application's initial state when using fragments" - let app = lustre.simple(fragment.init, fragment.update, fragment.view) - let assert Ok(runtime) = lustre.start_actor(app, 0) - let el = - process.call( - runtime, - fn(reply) { - process.send(reply, _) - |> View - |> Debug - }, - 100, - ) - - birdie.snap(element.to_string(el), title) - process.send(runtime, Shutdown) -} - -@target(erlang) -pub fn fragment_counter_diff_test() { - let title = "Can compute a diff from one render to the next with fragments" - let app = lustre.simple(fragment.init, fragment.update, fragment.view) - let assert Ok(runtime) = lustre.start_actor(app, 0) - - let prev = - process.call( - runtime, - fn(reply) { - process.send(reply, _) - |> View - |> Debug - }, - 100, - ) - - process.send(runtime, Dispatch(fragment.Increment)) - process.send(runtime, Dispatch(fragment.Increment)) - process.send(runtime, Dispatch(fragment.Increment)) - - let next = - process.call( - runtime, - fn(reply) { - process.send(reply, _) - |> View - |> Debug - }, - 100, - ) - - let diff = patch.elements(prev, next) - - birdie.snap(json.to_string(patch.element_diff_to_json(diff)), title) - process.send(runtime, Shutdown) -} - -pub fn escaped_attribute_test() { - let title = "Can safely escape dangerous symbols in attributes" - let el = static.escaped_attribute() - birdie.snap(element.to_string(el), title) -} diff --git a/packages/lustre/test/utils.js b/packages/lustre/test/utils.js deleted file mode 100644 index c3abaee..0000000 --- a/packages/lustre/test/utils.js +++ /dev/null @@ -1,29 +0,0 @@ -import { parseHTML } from 'linkedom'; -import { vi } from 'vitest'; - -// Parse the starting state of the basic starting template -export function setupDOM() { - const result = parseHTML(` - - - - - - - 🚧 {app_name} - - - - -
    - -`); - - global.HTMLElement = result.HTMLElement; - global.Node = result.Node; - global.document = result.document; - global.window = result.window; - global.window.requestAnimationFrame = vi.fn().mockImplementation((cb) => cb()); - - return result; -} \ No newline at end of file diff --git a/packages/lustre/test/vdom.ffi.bench.js b/packages/lustre/test/vdom.ffi.bench.js deleted file mode 100644 index a8e139e..0000000 --- a/packages/lustre/test/vdom.ffi.bench.js +++ /dev/null @@ -1,27 +0,0 @@ -import { bench, describe } from "vitest"; -import { setupDOM } from "./utils"; -import { morph } from "../src/vdom.ffi.mjs"; -import { smoke_test } from "../test-apps/vdom-test-templates/build/dev/javascript/app/client_test.mjs"; - -// BENCH ------------------------------------------------------------------------ - -describe("vdom morph bench", () => { - let appEl; - let template; - bench( - "smoke test morph", - () => { - appEl = morph(appEl, template); - }, - { - setup: () => { - const result = setupDOM(); - - global.Node = result.Node; - global.document = result.document; - appEl = document.getElementById("app"); - template = smoke_test(); - } - } - ); -}); diff --git a/packages/lustre/test/vdom.ffi.test.js b/packages/lustre/test/vdom.ffi.test.js deleted file mode 100644 index 2614c71..0000000 --- a/packages/lustre/test/vdom.ffi.test.js +++ /dev/null @@ -1,150 +0,0 @@ -import { beforeEach, describe, expect, test } from "vitest"; -import { setupDOM } from "./utils.js"; - -import { morph } from "@root/src/vdom.ffi.mjs"; - -// built via npm script "build:test:vdom" -import { - disabled_attr_test, - dynamic_content_test, - fragment_test, - keyed_test, - smoke_test, -} from "../test-apps/vdom-test-templates/build/dev/javascript/app/client_test.mjs"; - -let appEl; -beforeEach(() => { - setupDOM(); - appEl = document.getElementById("app"); -}); - -// TEST ------------------------------------------------------------------------ - -const singleMorphSnapshot = (name, template) => { - appEl = morph(appEl, template); - - const currentState = document.toString(); - - expect(currentState).toMatchSnapshot(name); -}; - -describe("vdom morph", () => { - test(`should render smoke test with vdom morph`, () => { - const template = smoke_test(); - - singleMorphSnapshot("smoke_test", template); - }); - - test(`should render using vdom morph with fragments`, () => { - const template = fragment_test(); - - singleMorphSnapshot("fragment_test", template); - }); - - test(`should render using vdom morph with keys`, () => { - const template = keyed_test(); - - singleMorphSnapshot("fragment_test", template); - }); - - test(`should be stable when vdom morph is called multiple times with no changes using fragment`, () => { - const template = fragment_test(); - appEl = morph(appEl, template); - - const initialState = document.toString(); - - const states = []; - for (let i = 0; i < 5; i++) { - appEl = morph(appEl, template); - states.push(document.toString()); - } - - states.forEach((state) => { - expect(state).toEqual(initialState); - }); - }); - - test(`should be stable when vdom morph is called multiple times with no changes using keys`, () => { - const template = keyed_test(); - appEl = morph(appEl, template); - - const initialState = document.toString(); - - const states = []; - for (let i = 0; i < 5; i++) { - appEl = morph(appEl, template); - states.push(document.toString()); - } - - states.forEach((state) => { - expect(state).toEqual(initialState); - }); - }); - - test(`should render updated templates`, () => { - const initialTemplate = dynamic_content_test(0, "initial_name"); - - appEl = morph(appEl, initialTemplate); - - const initialState = document.toString(); - - expect(initialState).toContain("0"); - expect(initialState).toContain("initial_name"); - - const updatedtemplate = dynamic_content_test(56, "updated_name"); - - appEl = morph(appEl, updatedtemplate); - - const updatedState = document.toString(); - - expect(updatedState).toContain("56"); - expect(updatedState).toContain("updated_name"); - }); -}); - -describe("vdom morph attribute", () => { - describe("disabled", () => { - test("should not be disabled when is_disabled is false", () => { - const template = disabled_attr_test(false); - - appEl = morph(appEl, template); - - const domResult = document.toString(); - - expect(domResult).toContain("input"); - expect(domResult).not.toContain("disabled"); - }); - - test("should be disabled when is_disabled is true", () => { - const template = disabled_attr_test(true); - - appEl = morph(appEl, template); - - const domResult = document.toString(); - - expect(domResult).toContain("input"); - expect(domResult).toContain("disabled"); - }); - - - // this fails today - test.skip("should be stable when disabled attribute does not change", () => { - const template = disabled_attr_test(true); - - appEl = morph(appEl, template); - - const initialState = document.toString(); - - const states = []; - for (let i = 0; i < 5; i++) { - appEl = morph(appEl, template); - states.push(document.toString()); - } - - states.forEach((state) => { - expect(state).toEqual(initialState); - }); - }); - }); -}); - diff --git a/packages/lustre/vitest.config.js b/packages/lustre/vitest.config.js deleted file mode 100644 index e0a777d..0000000 --- a/packages/lustre/vitest.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import { configDefaults, defineConfig } from "vitest/config"; -import { basename, dirname, join, resolve } from 'node:path'; - -export default defineConfig({ - test: { - alias: { - '@root': resolve(__dirname) - }, - benchmark: { - include: ["**/test/**/*.bench.js"], - exclude: [...configDefaults.exclude, "**/build/**/*"], - }, - include: ["**/test/**/*.test.js"], - exclude: [...configDefaults.exclude, "**/build/**/*"], - resolveSnapshotPath: (testPath, snapExtension) => - join(join(dirname(testPath), '../', 'vitest_snapshots'), `${basename(testPath)}${snapExtension}`) - }, -}); diff --git a/packages/lustre/vitest_snapshots/02-interactivity.test.js.snap b/packages/lustre/vitest_snapshots/02-interactivity.test.js.snap deleted file mode 100644 index c7c7ce2..0000000 --- a/packages/lustre/vitest_snapshots/02-interactivity.test.js.snap +++ /dev/null @@ -1,19 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`counter example > should render initially 1`] = ` -" - - - - - - - 🚧 {app_name} - - - - -

    0

    - -" -`; diff --git a/packages/lustre/vitest_snapshots/vdom.ffi.test.js.snap b/packages/lustre/vitest_snapshots/vdom.ffi.test.js.snap deleted file mode 100644 index fa11c73..0000000 --- a/packages/lustre/vitest_snapshots/vdom.ffi.test.js.snap +++ /dev/null @@ -1,55 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`vdom morph > should render smoke test with vdom morph > smoke_test 1`] = ` -" - - - - - - - 🚧 {app_name} - - - - -

    smoke test

    - -" -`; - -exports[`vdom morph > should render using vdom morph with fragments > fragment_test 1`] = ` -" - - - - - - - 🚧 {app_name} - - - - -
    Person NamePerson Age
    Person One18
    Person Two24
    Person Three30
    - -" -`; - -exports[`vdom morph > should render using vdom morph with keys > fragment_test 1`] = ` -" - - - - - - - 🚧 {app_name} - - - - -
      Person One18Person Two24Person Three30
    - -" -`; diff --git a/packages/sketch_magic/.gitignore b/packages/sketch_magic/.gitignore new file mode 100644 index 0000000..599be4e --- /dev/null +++ b/packages/sketch_magic/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +/build +erl_crash.dump diff --git a/packages/sketch_magic/README.md b/packages/sketch_magic/README.md new file mode 100644 index 0000000..2a30033 --- /dev/null +++ b/packages/sketch_magic/README.md @@ -0,0 +1,24 @@ +# sketch_magic + +[![Package Version](https://img.shields.io/hexpm/v/sketch_magic)](https://hex.pm/packages/sketch_magic) +[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/sketch_magic/) + +```sh +gleam add sketch_magic@1 +``` +```gleam +import sketch_magic + +pub fn main() { + // TODO: An example of the project in use +} +``` + +Further documentation can be found at . + +## Development + +```sh +gleam run # Run the project +gleam test # Run the tests +``` diff --git a/packages/lustre/examples/99-full-stack-applications/server/gleam.toml b/packages/sketch_magic/gleam.toml similarity index 69% rename from packages/lustre/examples/99-full-stack-applications/server/gleam.toml rename to packages/sketch_magic/gleam.toml index 4ea8472..382fbb2 100644 --- a/packages/lustre/examples/99-full-stack-applications/server/gleam.toml +++ b/packages/sketch_magic/gleam.toml @@ -1,4 +1,4 @@ -name = "app" +name = "sketch_magic" version = "1.0.0" # Fill out these fields if you intend to generate HTML documentation or publish @@ -6,14 +6,16 @@ version = "1.0.0" # # description = "" # licences = ["Apache-2.0"] -# repository = { type = "github", user = "username", repo = "project" } -# links = [{ title = "Website", href = "https://gleam.run" }] +# repository = { type = "github", user = "", repo = "" } +# links = [{ title = "Website", href = "" }] # # For a full reference of all the available options, you can have a look at # https://gleam.run/writing-gleam/gleam-toml/. [dependencies] gleam_stdlib = ">= 0.34.0 and < 2.0.0" +lustre = ">= 4.6.1 and < 5.0.0" +sketch = ">= 3.1.1 and < 4.0.0" [dev-dependencies] gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/packages/sketch_magic/manifest.toml b/packages/sketch_magic/manifest.toml new file mode 100644 index 0000000..7546c08 --- /dev/null +++ b/packages/sketch_magic/manifest.toml @@ -0,0 +1,18 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "gleam_erlang", version = "0.28.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "BE551521F708DCE5CB954AFBBDF08519C1C44986521FD40753608825F48FFA9E" }, + { name = "gleam_json", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "CB10B0E7BF44282FB25162F1A24C1A025F6B93E777CCF238C4017E4EEF2CDE97" }, + { name = "gleam_otp", version = "0.13.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "F7EA44C81679B2A6032FF1B3851F0EFB43F4F1F1CAC616CB7F4A18497F39FAB9" }, + { name = "gleam_stdlib", version = "0.41.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "1B2F80CB1B66B027E3198A2FF71EF3F2F31DF89ED97AD606F25FD387A4C3C1EF" }, + { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, + { name = "lustre", version = "4.6.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "486C3CFBD126939CAD2CA8B92A979A2DAADA5BABAA62BF2B163CD21E257BD4A1" }, + { name = "sketch", version = "3.1.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "sketch", source = "hex", outer_checksum = "6CBFAAA92C37F1F44FC552FD9E9DAC34598BDEB5F873B6191C696DC67D85AD00" }, +] + +[requirements] +gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } +lustre = { version = ">= 4.6.1 and < 5.0.0" } +sketch = { version = ">= 3.1.1 and < 4.0.0" } diff --git a/packages/sketch_magic/package.json b/packages/sketch_magic/package.json new file mode 100644 index 0000000..cf0cdc8 --- /dev/null +++ b/packages/sketch_magic/package.json @@ -0,0 +1,10 @@ +{ + "name": "sketch_magic", + "packageManager": "yarn@4.3.1", + "scripts": { + "clean": "gleam clean" + }, + "devDependencies": { + "@chouqueth/gleam": "^1.6.1" + } +} diff --git a/packages/sketch_magic/src/sketch/internals/ffi.gleam b/packages/sketch_magic/src/sketch/internals/ffi.gleam new file mode 100644 index 0000000..a984848 --- /dev/null +++ b/packages/sketch_magic/src/sketch/internals/ffi.gleam @@ -0,0 +1,27 @@ +import gleam/dynamic.{type Dynamic} +import sketch + +@external(javascript, "../../sketch_magic.ffi.mjs", "setCache") +pub fn set_cache(cache: sketch.Cache) -> sketch.Cache { + cache +} + +@external(javascript, "../../sketch_magic.ffi.mjs", "getCache") +pub fn get_cache() -> Result(sketch.Cache, Nil) { + Error(Nil) +} + +@external(javascript, "../../sketch_magic.ffi.mjs", "createCssStyleSheet") +pub fn create_document_stylesheet() -> Dynamic { + dynamic.from(Nil) +} + +@external(javascript, "../../sketch_magic.ffi.mjs", "createCssStyleSheet") +pub fn create_shadow_root_stylesheet(_root: Dynamic) -> Dynamic { + dynamic.from(Nil) +} + +@external(javascript, "../../sketch_magic.ffi.mjs", "setStylesheet") +pub fn set_stylesheet(_content: String, _stylesheet: Dynamic) -> Nil { + Nil +} diff --git a/packages/sketch_magic/src/sketch/magic.gleam b/packages/sketch_magic/src/sketch/magic.gleam new file mode 100644 index 0000000..66a1138 --- /dev/null +++ b/packages/sketch_magic/src/sketch/magic.gleam @@ -0,0 +1,69 @@ +import gleam/dynamic.{type Dynamic} +import gleam/list +import lustre/element as el +import lustre/element/html +import sketch.{type Cache} +import sketch/internals/ffi + +pub type StyleSheet { + CssStyleSheet(stylesheet: Dynamic) + NodeStyleSheet +} + +pub fn setup(cache: Cache) { + ffi.set_cache(cache) + Ok(cache) +} + +/// Wrap the view function in lustre. This should have no impact on your app. +pub fn render(stylesheets: List(StyleSheet), view: fn() -> el.Element(msg)) { + let new_view = view() + let assert Ok(cache) = ffi.get_cache() + let content = sketch.render(cache) + use view, stylesheet <- list.fold(stylesheets, new_view) + render_stylesheet(content, stylesheet, view) +} + +fn render_stylesheet(content, stylesheet, view) { + case stylesheet { + CssStyleSheet(stylesheet:) -> render_css(content, stylesheet, view) + NodeStyleSheet -> render_node(content, view) + } +} + +fn render_css(content, stylesheet, view) { + ffi.set_stylesheet(content, stylesheet) + view +} + +fn render_node(content, view) { + let style = html.style([], content) + el.fragment([style, view]) +} + +/// Generate a class name from a `Class`, using the provided `Cache` in the +/// environment. +pub fn class_name(class: sketch.Class) { + let assert Ok(cache) = ffi.get_cache() + let #(cache, class_name) = sketch.class_name(class, cache) + ffi.set_cache(cache) + class_name +} + +/// Output the StyleSheet in a `CSSStyleSheet` in `document`. +/// `document` cannot be used on server. +pub fn document() -> StyleSheet { + let stylesheet = ffi.create_document_stylesheet() + CssStyleSheet(stylesheet:) +} + +/// Output the StyleSheet in a `CSSStyleSheet` in a shadow root. +/// `shadow` cannot be used on server. +pub fn shadow(root: Dynamic) -> StyleSheet { + let stylesheet = ffi.create_shadow_root_stylesheet(root) + CssStyleSheet(stylesheet:) +} + +pub fn node() -> StyleSheet { + NodeStyleSheet +} diff --git a/packages/sketch_magic/src/sketch/magic/element.gleam b/packages/sketch_magic/src/sketch/magic/element.gleam new file mode 100644 index 0000000..3207867 --- /dev/null +++ b/packages/sketch_magic/src/sketch/magic/element.gleam @@ -0,0 +1,53 @@ +import lustre/attribute.{type Attribute} +import lustre/element as el +import sketch +import sketch/magic + +pub const keyed = el.keyed + +pub const fragment = el.fragment + +pub const none = el.none + +pub const text = el.text + +pub const map = el.map + +pub fn element( + tag tag: String, + class class: sketch.Class, + attributes attributes: List(Attribute(msg)), + children children: List(el.Element(msg)), +) { + let class_name = magic.class_name(class) + el.element(tag, [attribute.class(class_name), ..attributes], children) +} + +pub fn element_( + tag tag: String, + attributes attributes: List(Attribute(msg)), + children children: List(el.Element(msg)), +) { + el.element(tag, attributes, children) +} + +pub fn namespaced( + tag tag: String, + namespace namespace: String, + class class: sketch.Class, + attributes attributes: List(Attribute(msg)), + children children: List(el.Element(msg)), +) { + let class_name = magic.class_name(class) + let attributes = [attribute.class(class_name), ..attributes] + el.namespaced(tag, namespace, attributes, children) +} + +pub fn namespaced_( + tag tag: String, + namespace namespace: String, + attributes attributes: List(Attribute(msg)), + children children: List(el.Element(msg)), +) { + el.namespaced(tag, namespace, attributes, children) +} diff --git a/packages/sketch_magic/src/sketch/magic/element/html.gleam b/packages/sketch_magic/src/sketch/magic/element/html.gleam new file mode 100644 index 0000000..846a98a --- /dev/null +++ b/packages/sketch_magic/src/sketch/magic/element/html.gleam @@ -0,0 +1,1583 @@ +import lustre/attribute.{type Attribute} +import lustre/element.{type Element} as _ +import sketch.{type Class} +import sketch/magic/element.{element, element_} + +// + +pub fn html( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("html", attributes, children) +} + +pub fn base(attributes: List(Attribute(b))) -> Element(b) { + element_("base", attributes, []) +} + +pub fn head( + attributes: List(Attribute(c)), + children: List(Element(c)), +) -> Element(c) { + element_("head", attributes, children) +} + +pub fn link(attributes: List(Attribute(d))) -> Element(d) { + element_("link", attributes, []) +} + +pub fn meta(attributes: List(Attribute(e))) -> Element(e) { + element_("meta", attributes, []) +} + +pub fn style(attributes: List(Attribute(f)), child: String) -> Element(f) { + element_("style", attributes, [text(child)]) +} + +pub fn title(attributes: List(Attribute(g)), title: String) -> Element(g) { + element_("title", attributes, [text(title)]) +} + +// + +pub fn text(content: String) -> Element(h) { + element.text(content) +} + +// + +pub fn a( + class: Class, + attributes: List(Attribute(i)), + children: List(Element(i)), +) -> Element(i) { + element("a", class, attributes, children) +} + +pub fn a_( + attributes: List(Attribute(i)), + children: List(Element(i)), +) -> Element(i) { + element_("a", attributes, children) +} + +pub fn abbr( + class: Class, + attributes: List(Attribute(j)), + children: List(Element(j)), +) -> Element(j) { + element("abbr", class, attributes, children) +} + +pub fn abbr_( + attributes: List(Attribute(k)), + children: List(Element(k)), +) -> Element(k) { + element_("abbr", attributes, children) +} + +pub fn address( + class: Class, + attributes: List(Attribute(l)), + children: List(Element(l)), +) -> Element(l) { + element("address", class, attributes, children) +} + +pub fn address_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("address", attributes, children) +} + +pub fn area(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("area", class, attributes, []) +} + +pub fn area_(attributes: List(Attribute(a))) -> Element(a) { + element_("area", attributes, []) +} + +pub fn article( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("article", class, attributes, children) +} + +pub fn article_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("article", attributes, children) +} + +pub fn aside( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("aside", class, attributes, children) +} + +pub fn aside_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("aside", attributes, children) +} + +pub fn audio( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("audio", class, attributes, children) +} + +pub fn audio_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("audio", attributes, children) +} + +pub fn b( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("b", class, attributes, children) +} + +pub fn b_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("b", attributes, children) +} + +pub fn bdi( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("bdi", class, attributes, children) +} + +pub fn bdi_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("bdi", attributes, children) +} + +pub fn bdo( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("bdo", class, attributes, children) +} + +pub fn bdo_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("bdo", attributes, children) +} + +pub fn blockquote( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("blockquote", class, attributes, children) +} + +pub fn blockquote_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("blockquote", attributes, children) +} + +pub fn body( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("body", class, attributes, children) +} + +pub fn body_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("body", attributes, children) +} + +pub fn br(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("br", class, attributes, []) +} + +pub fn br_(attributes: List(Attribute(a))) -> Element(a) { + element_("br", attributes, []) +} + +pub fn button( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("button", class, attributes, children) +} + +pub fn button_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("button", attributes, children) +} + +pub fn canvas( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("canvas", class, attributes, children) +} + +pub fn canvas_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("canvas", attributes, children) +} + +pub fn caption( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("caption", class, attributes, children) +} + +pub fn caption_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("caption", attributes, children) +} + +pub fn cite( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("cite", class, attributes, children) +} + +pub fn cite_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("cite", attributes, children) +} + +pub fn code( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("code", class, attributes, children) +} + +pub fn code_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("code", attributes, children) +} + +pub fn col(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("col", class, attributes, []) +} + +pub fn col_(attributes: List(Attribute(a))) -> Element(a) { + element_("col", attributes, []) +} + +pub fn colgroup( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("colgroup", class, attributes, children) +} + +pub fn colgroup_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("colgroup", attributes, children) +} + +pub fn data( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("data", class, attributes, children) +} + +pub fn data_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("data", attributes, children) +} + +pub fn datalist( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("datalist", class, attributes, children) +} + +pub fn datalist_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("datalist", attributes, children) +} + +pub fn dd( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("dd", class, attributes, children) +} + +pub fn dd_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("dd", attributes, children) +} + +pub fn del( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("del", class, attributes, children) +} + +pub fn del_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("del", attributes, children) +} + +pub fn details( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("details", class, attributes, children) +} + +pub fn details_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("details", attributes, children) +} + +pub fn dfn( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("dfn", class, attributes, children) +} + +pub fn dfn_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("dfn", attributes, children) +} + +pub fn dialog( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("dialog", class, attributes, children) +} + +pub fn dialog_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("dialog", attributes, children) +} + +pub fn div( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("div", class, attributes, children) +} + +pub fn div_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("div", attributes, children) +} + +pub fn dl( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("dl", class, attributes, children) +} + +pub fn dl_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("dl", attributes, children) +} + +pub fn dt( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("dt", class, attributes, children) +} + +pub fn dt_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("dt", attributes, children) +} + +pub fn em( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("em", class, attributes, children) +} + +pub fn em_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("em", attributes, children) +} + +pub fn embed(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("embed", class, attributes, []) +} + +pub fn embed_(attributes: List(Attribute(a))) -> Element(a) { + element_("embed", attributes, []) +} + +pub fn fieldset( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("fieldset", class, attributes, children) +} + +pub fn fieldset_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("fieldset", attributes, children) +} + +pub fn figcaption( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("figcaption", class, attributes, children) +} + +pub fn figcaption_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("figcaption", attributes, children) +} + +pub fn figure( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("figure", class, attributes, children) +} + +pub fn figure_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("figure", attributes, children) +} + +pub fn footer( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("footer", class, attributes, children) +} + +pub fn footer_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("footer", attributes, children) +} + +pub fn form( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("form", class, attributes, children) +} + +pub fn form_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("form", attributes, children) +} + +pub fn h1( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("h1", class, attributes, children) +} + +pub fn h1_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("h1", attributes, children) +} + +pub fn h2( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("h2", class, attributes, children) +} + +pub fn h2_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("h2", attributes, children) +} + +pub fn h3( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("h3", class, attributes, children) +} + +pub fn h3_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("h3", attributes, children) +} + +pub fn h4( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("h4", class, attributes, children) +} + +pub fn h4_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("h4", attributes, children) +} + +pub fn h5( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("h5", class, attributes, children) +} + +pub fn h5_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("h5", attributes, children) +} + +pub fn h6( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("h6", class, attributes, children) +} + +pub fn h6_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("h6", attributes, children) +} + +pub fn header( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("header", class, attributes, children) +} + +pub fn header_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("header", attributes, children) +} + +pub fn hgroup( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("hgroup", class, attributes, children) +} + +pub fn hgroup_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("hgroup", attributes, children) +} + +pub fn hr(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("hr", class, attributes, []) +} + +pub fn hr_(attributes: List(Attribute(a))) -> Element(a) { + element_("hr", attributes, []) +} + +pub fn i( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("i", class, attributes, children) +} + +pub fn i_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("i", attributes, children) +} + +pub fn iframe( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("iframe", class, attributes, children) +} + +pub fn iframe_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("iframe", attributes, children) +} + +pub fn img(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("img", class, attributes, []) +} + +pub fn img_(attributes: List(Attribute(a))) -> Element(a) { + element_("img", attributes, []) +} + +pub fn input(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("input", class, attributes, []) +} + +pub fn input_(attributes: List(Attribute(a))) -> Element(a) { + element_("input", attributes, []) +} + +pub fn ins( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("ins", class, attributes, children) +} + +pub fn ins_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("ins", attributes, children) +} + +pub fn kbd( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("kbd", class, attributes, children) +} + +pub fn kbd_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("kbd", attributes, children) +} + +pub fn label( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("label", class, attributes, children) +} + +pub fn label_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("label", attributes, children) +} + +pub fn legend( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("legend", class, attributes, children) +} + +pub fn legend_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("legend", attributes, children) +} + +pub fn li( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("li", class, attributes, children) +} + +pub fn li_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("li", attributes, children) +} + +pub fn main( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("main", class, attributes, children) +} + +pub fn main_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("main", attributes, children) +} + +pub fn map( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("map", class, attributes, children) +} + +pub fn map_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("map", attributes, children) +} + +pub fn mark( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("mark", class, attributes, children) +} + +pub fn mark_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("mark", attributes, children) +} + +pub fn math( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("math", class, attributes, children) +} + +pub fn math_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("math", attributes, children) +} + +pub fn menu( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("menu", class, attributes, children) +} + +pub fn menu_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("menu", attributes, children) +} + +pub fn meter( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("meter", class, attributes, children) +} + +pub fn meter_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("meter", attributes, children) +} + +pub fn nav( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("nav", class, attributes, children) +} + +pub fn nav_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("nav", attributes, children) +} + +pub fn noscript( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("noscript", class, attributes, children) +} + +pub fn noscript_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("noscript", attributes, children) +} + +pub fn object( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("object", class, attributes, children) +} + +pub fn object_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("object", attributes, children) +} + +pub fn ol( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("ol", class, attributes, children) +} + +pub fn ol_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("ol", attributes, children) +} + +pub fn optgroup( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("optgroup", class, attributes, children) +} + +pub fn optgroup_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("optgroup", attributes, children) +} + +pub fn option( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("option", class, attributes, children) +} + +pub fn option_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("option", attributes, children) +} + +pub fn output( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("output", class, attributes, children) +} + +pub fn output_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("output", attributes, children) +} + +pub fn p( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("p", class, attributes, children) +} + +pub fn p_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("p", attributes, children) +} + +pub fn picture( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("picture", class, attributes, children) +} + +pub fn picture_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("picture", attributes, children) +} + +pub fn portal( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("portal", class, attributes, children) +} + +pub fn portal_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("portal", attributes, children) +} + +pub fn pre( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("pre", class, attributes, children) +} + +pub fn pre_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("pre", attributes, children) +} + +pub fn progress( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("progress", class, attributes, children) +} + +pub fn progress_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("progress", attributes, children) +} + +pub fn q( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("q", class, attributes, children) +} + +pub fn q_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("q", attributes, children) +} + +pub fn rp( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("rp", class, attributes, children) +} + +pub fn rp_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("rp", attributes, children) +} + +pub fn rt( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("rt", class, attributes, children) +} + +pub fn rt_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("rt", attributes, children) +} + +pub fn ruby( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("ruby", class, attributes, children) +} + +pub fn ruby_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("ruby", attributes, children) +} + +pub fn s( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("s", class, attributes, children) +} + +pub fn s_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("s", attributes, children) +} + +pub fn samp( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("samp", class, attributes, children) +} + +pub fn samp_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("samp", attributes, children) +} + +pub fn script( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("script", class, attributes, children) +} + +pub fn script_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("script", attributes, children) +} + +pub fn search( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("search", class, attributes, children) +} + +pub fn search_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("search", attributes, children) +} + +pub fn section( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("section", class, attributes, children) +} + +pub fn section_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("section", attributes, children) +} + +pub fn select( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("select", class, attributes, children) +} + +pub fn select_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("select", attributes, children) +} + +pub fn slot( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("slot", class, attributes, children) +} + +pub fn slot_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("slot", attributes, children) +} + +pub fn small( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("small", class, attributes, children) +} + +pub fn small_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("small", attributes, children) +} + +pub fn source(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("source", class, attributes, []) +} + +pub fn source_(attributes: List(Attribute(a))) -> Element(a) { + element_("source", attributes, []) +} + +pub fn span( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("span", class, attributes, children) +} + +pub fn span_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("span", attributes, children) +} + +pub fn strong( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("strong", class, attributes, children) +} + +pub fn strong_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("strong", attributes, children) +} + +pub fn sub( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("sub", class, attributes, children) +} + +pub fn sub_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("sub", attributes, children) +} + +pub fn summary( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("summary", class, attributes, children) +} + +pub fn summary_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("summary", attributes, children) +} + +pub fn sup( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("sup", class, attributes, children) +} + +pub fn sup_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("sup", attributes, children) +} + +pub fn table( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("table", class, attributes, children) +} + +pub fn table_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("table", attributes, children) +} + +pub fn tbody( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("tbody", class, attributes, children) +} + +pub fn tbody_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("tbody", attributes, children) +} + +pub fn td( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("td", class, attributes, children) +} + +pub fn td_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("td", attributes, children) +} + +pub fn template( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("template", class, attributes, children) +} + +pub fn template_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("template", attributes, children) +} + +pub fn textarea( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("textarea", class, attributes, children) +} + +pub fn textarea_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("textarea", attributes, children) +} + +pub fn tfoot( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("tfoot", class, attributes, children) +} + +pub fn tfoot_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("tfoot", attributes, children) +} + +pub fn th( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("th", class, attributes, children) +} + +pub fn th_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("th", attributes, children) +} + +pub fn thead( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("thead", class, attributes, children) +} + +pub fn thead_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("thead", attributes, children) +} + +pub fn time( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("time", class, attributes, children) +} + +pub fn time_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("time", attributes, children) +} + +pub fn tr( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("tr", class, attributes, children) +} + +pub fn tr_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("tr", attributes, children) +} + +pub fn track(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("track", class, attributes, []) +} + +pub fn track_(attributes: List(Attribute(a))) -> Element(a) { + element_("track", attributes, []) +} + +pub fn u( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("u", class, attributes, children) +} + +pub fn u_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("u", attributes, children) +} + +pub fn ul( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("ul", class, attributes, children) +} + +pub fn ul_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("ul", attributes, children) +} + +pub fn var( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("var", class, attributes, children) +} + +pub fn var_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("var", attributes, children) +} + +pub fn video( + class: Class, + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element("video", class, attributes, children) +} + +pub fn video_( + attributes: List(Attribute(a)), + children: List(Element(a)), +) -> Element(a) { + element_("video", attributes, children) +} + +pub fn wbr(class: Class, attributes: List(Attribute(a))) -> Element(a) { + element("wbr", class, attributes, []) +} + +pub fn wbr_(attributes: List(Attribute(a))) -> Element(a) { + element_("wbr", attributes, []) +} diff --git a/packages/sketch_magic/src/sketch_magic.ffi.mjs b/packages/sketch_magic/src/sketch_magic.ffi.mjs new file mode 100644 index 0000000..8f55178 --- /dev/null +++ b/packages/sketch_magic/src/sketch_magic.ffi.mjs @@ -0,0 +1,28 @@ +import * as gleam from './gleam.mjs' + +let _cache = null + +export function setCache(cache) { + _cache = cache + return cache +} + +export function getCache() { + if (!_cache) return new gleam.Error() + return new gleam.Ok(_cache) +} + +export function createCssStyleSheet(root) { + if (!(root instanceof ShadowRoot)) throw new Error(`root is not a ShadowRoot`) + const stylesheet = new CSSStyleSheet() + if (root && root.adoptedStyleSheets) { + root.adoptedStyleSheets.push(stylesheet) + } else { + document.adoptedStyleSheets.push(stylesheet) + } + return stylesheet +} + +export function setStylesheet(content, stylesheet) { + stylesheet.replaceSync(content) +} diff --git a/packages/sketch_magic/test/sketch_magic_test.gleam b/packages/sketch_magic/test/sketch_magic_test.gleam new file mode 100644 index 0000000..3831e7a --- /dev/null +++ b/packages/sketch_magic/test/sketch_magic_test.gleam @@ -0,0 +1,12 @@ +import gleeunit +import gleeunit/should + +pub fn main() { + gleeunit.main() +} + +// gleeunit test functions end in `_test` +pub fn hello_world_test() { + 1 + |> should.equal(1) +} From 4321802be18f3217511fae4adb7f94efcac31e2e Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 15:49:34 +0100 Subject: [PATCH 3/9] Update config (erlang_ls, yarn) --- erlang_ls.config | 8 + plugins/yarn-mise.js | 2 +- yarn.lock | 1995 +----------------------------------------- 3 files changed, 39 insertions(+), 1966 deletions(-) create mode 100644 erlang_ls.config diff --git a/erlang_ls.config b/erlang_ls.config new file mode 100644 index 0000000..ac4b8fd --- /dev/null +++ b/erlang_ls.config @@ -0,0 +1,8 @@ +app_dirs: + - "packages/*" + - "apps/*" +include_dirs: + - "packages" + - "apps" + - "packages/*/build/dev/erlang" + - "apps/*/build/dev/erlang" diff --git a/plugins/yarn-mise.js b/plugins/yarn-mise.js index 893b509..7c2bbfd 100644 --- a/plugins/yarn-mise.js +++ b/plugins/yarn-mise.js @@ -48,7 +48,7 @@ function addVenvInPath(path, tomlDir, venvPath, scriptEnv) { } module.exports = { - name: `plugin-hello-world`, + name: `yarn-mise`, factory: require => { const path = require('path') const fs = require('fs') diff --git a/yarn.lock b/yarn.lock index 7c816ea..81dd93d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -316,10 +316,15 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/aix-ppc64@npm:0.20.2" - conditions: os=aix & cpu=ppc64 +"@chouqueth/gleam@npm:^1.6.1": + version: 1.6.2 + resolution: "@chouqueth/gleam@npm:1.6.2" + dependencies: + cachedir: "npm:^2.4.0" + tar: "npm:^7.1.0" + bin: + gleam: bin/cli.mjs + checksum: 10c0/e138f2ca54937f6fad1740b425c420b094a09cc6c56d442d9425b1c5600012d21780f4f356ca868d8708b0ce49e4fde89eee2aca224a1bec738e76a15e19046c languageName: node linkType: hard @@ -337,13 +342,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm64@npm:0.20.2" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm64@npm:0.21.5" @@ -358,13 +356,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm@npm:0.20.2" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm@npm:0.21.5" @@ -379,13 +370,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-x64@npm:0.20.2" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-x64@npm:0.21.5" @@ -400,13 +384,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-arm64@npm:0.20.2" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-arm64@npm:0.21.5" @@ -421,13 +398,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-x64@npm:0.20.2" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-x64@npm:0.21.5" @@ -442,13 +412,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-arm64@npm:0.20.2" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-arm64@npm:0.21.5" @@ -463,13 +426,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-x64@npm:0.20.2" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-x64@npm:0.21.5" @@ -484,13 +440,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm64@npm:0.20.2" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm64@npm:0.21.5" @@ -505,13 +454,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm@npm:0.20.2" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm@npm:0.21.5" @@ -526,13 +468,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ia32@npm:0.20.2" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ia32@npm:0.21.5" @@ -547,13 +482,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-loong64@npm:0.20.2" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-loong64@npm:0.21.5" @@ -568,13 +496,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-mips64el@npm:0.20.2" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-mips64el@npm:0.21.5" @@ -589,13 +510,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ppc64@npm:0.20.2" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ppc64@npm:0.21.5" @@ -610,13 +524,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-riscv64@npm:0.20.2" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-riscv64@npm:0.21.5" @@ -631,13 +538,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-s390x@npm:0.20.2" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-s390x@npm:0.21.5" @@ -652,13 +552,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-x64@npm:0.20.2" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-x64@npm:0.21.5" @@ -673,13 +566,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/netbsd-x64@npm:0.20.2" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/netbsd-x64@npm:0.21.5" @@ -694,13 +580,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/openbsd-x64@npm:0.20.2" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/openbsd-x64@npm:0.21.5" @@ -715,13 +594,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/sunos-x64@npm:0.20.2" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/sunos-x64@npm:0.21.5" @@ -736,13 +608,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-arm64@npm:0.20.2" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-arm64@npm:0.21.5" @@ -757,13 +622,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-ia32@npm:0.20.2" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-ia32@npm:0.21.5" @@ -778,13 +636,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-x64@npm:0.20.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-x64@npm:0.21.5" @@ -799,13 +650,6 @@ __metadata: languageName: node linkType: hard -"@iarna/toml@npm:^2.2.5": - version: 2.2.5 - resolution: "@iarna/toml@npm:2.2.5" - checksum: 10c0/d095381ad4554aca233b7cf5a91f243ef619e5e15efd3157bc640feac320545450d14b394aebbf6f02a2047437ced778ae598d5879a995441ab7b6c0b2c2f201 - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -829,15 +673,6 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/schemas@npm:29.6.3" - dependencies: - "@sinclair/typebox": "npm:^0.27.8" - checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be - languageName: node - linkType: hard - "@jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.5 resolution: "@jridgewell/gen-mapping@npm:0.3.5" @@ -1234,13 +1069,6 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e - languageName: node - linkType: hard - "@trivago/prettier-plugin-sort-imports@npm:^4.3.0": version: 4.3.0 resolution: "@trivago/prettier-plugin-sort-imports@npm:4.3.0" @@ -1261,83 +1089,13 @@ __metadata: languageName: node linkType: hard -"@types/dompurify@npm:^3.0.5": - version: 3.0.5 - resolution: "@types/dompurify@npm:3.0.5" - dependencies: - "@types/trusted-types": "npm:*" - checksum: 10c0/a34dcc4498ca250815ccf9aecbe82df96ba5db247d0440cf266a876757d47c52519c240db3475e794d7deb0d6b1af23328e02879be368ad0e26b20c0f0865dba - languageName: node - linkType: hard - -"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": +"@types/estree@npm:1.0.5": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d languageName: node linkType: hard -"@types/trusted-types@npm:*": - version: 2.0.7 - resolution: "@types/trusted-types@npm:2.0.7" - checksum: 10c0/4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c - languageName: node - linkType: hard - -"@vitest/expect@npm:1.6.0": - version: 1.6.0 - resolution: "@vitest/expect@npm:1.6.0" - dependencies: - "@vitest/spy": "npm:1.6.0" - "@vitest/utils": "npm:1.6.0" - chai: "npm:^4.3.10" - checksum: 10c0/a4351f912a70543e04960f5694f1f1ac95f71a856a46e87bba27d3eb72a08c5d11d35021cbdc6077452a152e7d93723fc804bba76c2cc53c8896b7789caadae3 - languageName: node - linkType: hard - -"@vitest/runner@npm:1.6.0": - version: 1.6.0 - resolution: "@vitest/runner@npm:1.6.0" - dependencies: - "@vitest/utils": "npm:1.6.0" - p-limit: "npm:^5.0.0" - pathe: "npm:^1.1.1" - checksum: 10c0/27d67fa51f40effe0e41ee5f26563c12c0ef9a96161f806036f02ea5eb9980c5cdf305a70673942e7a1e3d472d4d7feb40093ae93024ef1ccc40637fc65b1d2f - languageName: node - linkType: hard - -"@vitest/snapshot@npm:1.6.0": - version: 1.6.0 - resolution: "@vitest/snapshot@npm:1.6.0" - dependencies: - magic-string: "npm:^0.30.5" - pathe: "npm:^1.1.1" - pretty-format: "npm:^29.7.0" - checksum: 10c0/be027fd268d524589ff50c5fad7b4faa1ac5742b59ac6c1dc6f5a3930aad553560e6d8775e90ac4dfae4be746fc732a6f134ba95606a1519707ce70db3a772a5 - languageName: node - linkType: hard - -"@vitest/spy@npm:1.6.0": - version: 1.6.0 - resolution: "@vitest/spy@npm:1.6.0" - dependencies: - tinyspy: "npm:^2.2.0" - checksum: 10c0/df66ea6632b44fb76ef6a65c1abbace13d883703aff37cd6d062add6dcd1b883f19ce733af8e0f7feb185b61600c6eb4042a518e4fb66323d0690ec357f9401c - languageName: node - linkType: hard - -"@vitest/utils@npm:1.6.0": - version: 1.6.0 - resolution: "@vitest/utils@npm:1.6.0" - dependencies: - diff-sequences: "npm:^29.6.3" - estree-walker: "npm:^3.0.3" - loupe: "npm:^2.3.7" - pretty-format: "npm:^29.7.0" - checksum: 10c0/8b0d19835866455eb0b02b31c5ca3d8ad45f41a24e4c7e1f064b480f6b2804dc895a70af332f14c11ed89581011b92b179718523f55f5b14787285a0321b1301 - languageName: node - linkType: hard - "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -1345,16 +1103,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.3.2": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" - dependencies: - acorn: "npm:^8.11.0" - checksum: 10c0/4a9e24313e6a0a7b389e712ba69b66b455b4cb25988903506a8d247e7b126f02060b05a8a5b738a9284214e4ca95f383dd93443a4ba84f1af9b528305c7f243b - languageName: node - linkType: hard - -"acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.8.1": +"acorn@npm:^8.8.1": version: 8.12.1 resolution: "acorn@npm:8.12.1" bin: @@ -1423,13 +1172,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df - languageName: node - linkType: hard - "ansi-styles@npm:^6.1.0": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" @@ -1447,48 +1189,6 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.3": - version: 1.0.3 - resolution: "arraybuffer.prototype.slice@npm:1.0.3" - dependencies: - array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.22.3" - es-errors: "npm:^1.2.1" - get-intrinsic: "npm:^1.2.3" - is-array-buffer: "npm:^3.0.4" - is-shared-array-buffer: "npm:^1.0.2" - checksum: 10c0/d32754045bcb2294ade881d45140a5e52bda2321b9e98fa514797b7f0d252c4c5ab0d1edb34112652c62fa6a9398def568da63a4d7544672229afea283358c36 - languageName: node - linkType: hard - -"assertion-error@npm:^1.1.0": - version: 1.1.0 - resolution: "assertion-error@npm:1.1.0" - checksum: 10c0/25456b2aa333250f01143968e02e4884a34588a8538fbbf65c91a637f1dbfb8069249133cd2f4e530f10f624d206a664e7df30207830b659e9f5298b00a4099b - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 - languageName: node - linkType: hard - "backend@workspace:apps/backend": version: 0.0.0-use.local resolution: "backend@workspace:apps/backend" @@ -1511,23 +1211,6 @@ __metadata: languageName: node linkType: hard -"boolbase@npm:^1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - "brace-expansion@npm:^2.0.1": version: 2.0.1 resolution: "brace-expansion@npm:2.0.1" @@ -1560,13 +1243,6 @@ __metadata: languageName: node linkType: hard -"cac@npm:^6.7.14": - version: 6.7.14 - resolution: "cac@npm:6.7.14" - checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 - languageName: node - linkType: hard - "cacache@npm:^18.0.0": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -1594,19 +1270,6 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001640": version: 1.0.30001642 resolution: "caniuse-lite@npm:1.0.30001642" @@ -1614,22 +1277,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.10": - version: 4.4.1 - resolution: "chai@npm:4.4.1" - dependencies: - assertion-error: "npm:^1.1.0" - check-error: "npm:^1.0.3" - deep-eql: "npm:^4.1.3" - get-func-name: "npm:^2.0.2" - loupe: "npm:^2.3.6" - pathval: "npm:^1.1.1" - type-detect: "npm:^4.0.8" - checksum: 10c0/91590a8fe18bd6235dece04ccb2d5b4ecec49984b50924499bdcd7a95c02cb1fd2a689407c19bb854497bde534ef57525cfad6c7fdd2507100fd802fbc2aefbd - languageName: node - linkType: hard - -"chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -1659,15 +1307,6 @@ __metadata: languageName: node linkType: hard -"check-error@npm:^1.0.3": - version: 1.0.3 - resolution: "check-error@npm:1.0.3" - dependencies: - get-func-name: "npm:^2.0.2" - checksum: 10c0/94aa37a7315c0e8a83d0112b5bfb5a8624f7f0f81057c73e4707729cdd8077166c6aefb3d8e2b92c63ee130d4a2ff94bad46d547e12f3238cc1d78342a973841 - languageName: node - linkType: hard - "chokidar@npm:^3.5.3": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -1751,13 +1390,6 @@ __metadata: languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - "concurrently@npm:^8.2.2": version: 8.2.2 resolution: "concurrently@npm:8.2.2" @@ -1778,13 +1410,6 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.1.7": - version: 0.1.7 - resolution: "confbox@npm:0.1.7" - checksum: 10c0/18b40c2f652196a833f3f1a5db2326a8a579cd14eacabfe637e4fc8cb9b68d7cf296139a38c5e7c688ce5041bf46f9adce05932d43fde44cf7e012840b5da111 - languageName: node - linkType: hard - "convert-source-map@npm:^2.0.0": version: 2.0.0 resolution: "convert-source-map@npm:2.0.0" @@ -1792,20 +1417,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^6.0.5": - version: 6.0.5 - resolution: "cross-spawn@npm:6.0.5" - dependencies: - nice-try: "npm:^1.0.4" - path-key: "npm:^2.0.1" - semver: "npm:^5.5.0" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10c0/e05544722e9d7189b4292c66e42b7abeb21db0d07c91b785f4ae5fefceb1f89e626da2703744657b287e86dcd4af57b54567cef75159957ff7a8a761d9055012 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -1816,66 +1428,6 @@ __metadata: languageName: node linkType: hard -"css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.1.0" - domhandler: "npm:^5.0.2" - domutils: "npm:^3.0.1" - nth-check: "npm:^2.0.1" - checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 - languageName: node - linkType: hard - -"css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 - languageName: node - linkType: hard - -"cssom@npm:^0.5.0": - version: 0.5.0 - resolution: "cssom@npm:0.5.0" - checksum: 10c0/8c4121c243baf0678c65dcac29b201ff0067dfecf978de9d5c83b2ff127a8fdefd2bfd54577f5ad8c80ed7d2c8b489ae01c82023545d010c4ecb87683fb403dd - languageName: node - linkType: hard - -"data-view-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-buffer@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.6" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/8984119e59dbed906a11fcfb417d7d861936f16697a0e7216fe2c6c810f6b5e8f4a5281e73f2c28e8e9259027190ac4a33e2a65fdd7fa86ac06b76e838918583 - languageName: node - linkType: hard - -"data-view-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-length@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/b7d9e48a0cf5aefed9ab7d123559917b2d7e0d65531f43b2fd95b9d3a6b46042dd3fca597c42bba384e66b70d7ad66ff23932f8367b241f53d93af42cfe04ec2 - languageName: node - linkType: hard - -"data-view-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "data-view-byte-offset@npm:1.0.0" - dependencies: - call-bind: "npm:^1.0.6" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/21b0d2e53fd6e20cc4257c873bf6d36d77bd6185624b84076c0a1ddaa757b49aaf076254006341d35568e89f52eecd1ccb1a502cfb620f2beca04f48a6a62a8f - languageName: node - linkType: hard - "date-fns@npm:^2.30.0": version: 2.30.0 resolution: "date-fns@npm:2.30.0" @@ -1897,71 +1449,6 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^4.1.3": - version: 4.1.4 - resolution: "deep-eql@npm:4.1.4" - dependencies: - type-detect: "npm:^4.0.0" - checksum: 10c0/264e0613493b43552fc908f4ff87b8b445c0e6e075656649600e1b8a17a57ee03e960156fce7177646e4d2ddaf8e5ee616d76bd79929ff593e5c79e4e5e6c517 - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 - languageName: node - linkType: hard - -"diff-sequences@npm:^29.6.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 - languageName: node - linkType: hard - -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.2" - entities: "npm:^4.2.0" - checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 - languageName: node - linkType: hard - -"domelementtype@npm:^2.3.0": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 - languageName: node - linkType: hard - -"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: "npm:^2.3.0" - checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a - languageName: node - linkType: hard - "dompurify@npm:^3.1.4": version: 3.1.6 resolution: "dompurify@npm:3.1.6" @@ -1969,18 +1456,7 @@ __metadata: languageName: node linkType: hard -"domutils@npm:^3.0.1, domutils@npm:^3.1.0": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" - dependencies: - dom-serializer: "npm:^2.0.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - checksum: 10c0/342d64cf4d07b8a0573fb51e0a6312a88fb520c7fefd751870bf72fa5fc0f2e0cb9a3958a573610b1d608c6e2a69b8e9b4b40f0bfb8f87a71bce4f180cca1887 - languageName: node - linkType: hard - -"dotenv@npm:^16.3.1, dotenv@npm:^16.4.5": +"dotenv@npm:^16.3.1": version: 16.4.5 resolution: "dotenv@npm:16.4.5" checksum: 10c0/48d92870076832af0418b13acd6e5a5a3e83bb00df690d9812e94b24aff62b88ade955ac99a05501305b8dc8f1b0ee7638b18493deb6fe93d680e5220936292f @@ -2024,13 +1500,6 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.2.0, entities@npm:^4.5.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 - languageName: node - linkType: hard - "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -2045,116 +1514,6 @@ __metadata: languageName: node linkType: hard -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce - languageName: node - linkType: hard - -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" - dependencies: - array-buffer-byte-length: "npm:^1.0.1" - arraybuffer.prototype.slice: "npm:^1.0.3" - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - data-view-buffer: "npm:^1.0.1" - data-view-byte-length: "npm:^1.0.1" - data-view-byte-offset: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.0.3" - es-to-primitive: "npm:^1.2.1" - function.prototype.name: "npm:^1.1.6" - get-intrinsic: "npm:^1.2.4" - get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.0.3" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.2" - internal-slot: "npm:^1.0.7" - is-array-buffer: "npm:^3.0.4" - is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.1" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.3" - is-string: "npm:^1.0.7" - is-typed-array: "npm:^1.1.13" - is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" - safe-array-concat: "npm:^1.1.2" - safe-regex-test: "npm:^1.0.3" - string.prototype.trim: "npm:^1.2.9" - string.prototype.trimend: "npm:^1.0.8" - string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.2" - typed-array-byte-length: "npm:^1.0.1" - typed-array-byte-offset: "npm:^1.0.2" - typed-array-length: "npm:^1.0.6" - unbox-primitive: "npm:^1.0.2" - which-typed-array: "npm:^1.1.15" - checksum: 10c0/d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 - languageName: node - linkType: hard - -"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - checksum: 10c0/1fed3d102eb27ab8d983337bb7c8b159dd2a1e63ff833ec54eea1311c96d5b08223b433060ba240541ca8adba9eee6b0a60cdbf2f80634b784febc9cc8b687b4 - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.0.3": - version: 2.0.3 - resolution: "es-set-tostringtag@npm:2.0.3" - dependencies: - get-intrinsic: "npm:^1.2.4" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.1" - checksum: 10c0/f22aff1585eb33569c326323f0b0d175844a1f11618b86e193b386f8be0ea9474cfbe46df39c45d959f7aa8f6c06985dc51dd6bce5401645ec5a74c4ceaa836a - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: "npm:^1.1.4" - is-date-object: "npm:^1.0.1" - is-symbol: "npm:^1.0.2" - checksum: 10c0/0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 - languageName: node - linkType: hard - "esbuild@npm:^0.18.10": version: 0.18.20 resolution: "esbuild@npm:0.18.20" @@ -2232,86 +1591,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.20.2": - version: 0.20.2 - resolution: "esbuild@npm:0.20.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.20.2" - "@esbuild/android-arm": "npm:0.20.2" - "@esbuild/android-arm64": "npm:0.20.2" - "@esbuild/android-x64": "npm:0.20.2" - "@esbuild/darwin-arm64": "npm:0.20.2" - "@esbuild/darwin-x64": "npm:0.20.2" - "@esbuild/freebsd-arm64": "npm:0.20.2" - "@esbuild/freebsd-x64": "npm:0.20.2" - "@esbuild/linux-arm": "npm:0.20.2" - "@esbuild/linux-arm64": "npm:0.20.2" - "@esbuild/linux-ia32": "npm:0.20.2" - "@esbuild/linux-loong64": "npm:0.20.2" - "@esbuild/linux-mips64el": "npm:0.20.2" - "@esbuild/linux-ppc64": "npm:0.20.2" - "@esbuild/linux-riscv64": "npm:0.20.2" - "@esbuild/linux-s390x": "npm:0.20.2" - "@esbuild/linux-x64": "npm:0.20.2" - "@esbuild/netbsd-x64": "npm:0.20.2" - "@esbuild/openbsd-x64": "npm:0.20.2" - "@esbuild/sunos-x64": "npm:0.20.2" - "@esbuild/win32-arm64": "npm:0.20.2" - "@esbuild/win32-ia32": "npm:0.20.2" - "@esbuild/win32-x64": "npm:0.20.2" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/66398f9fb2c65e456a3e649747b39af8a001e47963b25e86d9c09d2a48d61aa641b27da0ce5cad63df95ad246105e1d83e7fee0e1e22a0663def73b1c5101112 - languageName: node - linkType: hard - "esbuild@npm:^0.21.3": version: 0.21.5 resolution: "esbuild@npm:0.21.5" @@ -2406,32 +1685,6 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d - languageName: node - linkType: hard - -"execa@npm:^8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af - languageName: node - linkType: hard - "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -2458,15 +1711,6 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa - languageName: node - linkType: hard - "foreground-child@npm:^3.1.0": version: 3.2.1 resolution: "foreground-child@npm:3.2.1" @@ -2486,16 +1730,12 @@ __metadata: "@sentry/browser": "npm:^8.0.0" "@sentry/vite-plugin": "npm:^2.16.1" "@trivago/prettier-plugin-sort-imports": "npm:^4.3.0" - "@types/dompurify": "npm:^3.0.5" chart.js: "npm:^4.4.4" dompurify: "npm:^3.1.4" - dotenv: "npm:^16.4.5" highlight.js: "npm:^11.9.0" marked: "npm:^12.0.2" marked-highlight: "npm:^2.1.1" prettier: "npm:^3.2.5" - ts-gleam: "npm:^1.0.1" - typescript: "npm:^5.4.2" vite: "npm:^5.1.6" vite-gleam: "npm:^0.4.0" languageName: unknown @@ -2545,32 +1785,6 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.2" - define-properties: "npm:^1.2.0" - es-abstract: "npm:^1.22.1" - functions-have-names: "npm:^1.2.3" - checksum: 10c0/9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca - languageName: node - linkType: hard - "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -2585,44 +1799,6 @@ __metadata: languageName: node linkType: hard -"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 10c0/5c2181e98202b9dae0bb4a849979291043e5892eb40312b47f0c22b9414fc9b28a3b6063d2375705eb24abc41ecf97894d9a51f64ff021511b504477b27b4290 - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.0.2": - version: 1.0.2 - resolution: "get-symbol-description@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.5" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/867be6d63f5e0eb026cb3b0ef695ec9ecf9310febb041072d2e142f260bd91ced9eeb426b3af98791d1064e324e653424afa6fd1af17dee373bea48ae03162bc - languageName: node - linkType: hard - "glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -2667,16 +1843,6 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.3": - version: 1.0.4 - resolution: "globalthis@npm:1.0.4" - dependencies: - define-properties: "npm:^1.2.1" - gopd: "npm:^1.0.1" - checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 - languageName: node - linkType: hard - "gloogle@workspace:.": version: 0.0.0-use.local resolution: "gloogle@workspace:." @@ -2688,29 +1854,13 @@ __metadata: languageName: unknown linkType: soft -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": +"graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -2725,47 +1875,6 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - -"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - "highlight.js@npm:^11.9.0": version: 11.10.0 resolution: "highlight.js@npm:11.10.0" @@ -2773,32 +1882,6 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - -"html-escaper@npm:^3.0.3": - version: 3.0.3 - resolution: "html-escaper@npm:3.0.3" - checksum: 10c0/a042fa4139127ff7546513e90ea39cc9161a1938ce90122dbc4260d4b7252c9aa8452f4509c0c2889901b8ae9a8699179150f1f99d3f80bcf7317573c5f08f4e - languageName: node - linkType: hard - -"htmlparser2@npm:^9.1.0": - version: 9.1.0 - resolution: "htmlparser2@npm:9.1.0" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.1.0" - entities: "npm:^4.5.0" - checksum: 10c0/394f6323efc265bbc791d8c0d96bfe95984e0407565248521ab92e2dc7668e5ceeca7bc6ed18d408b9ee3b25032c5743368a4280d280332d782821d5d467ad8f - languageName: node - linkType: hard - "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -2836,13 +1919,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 10c0/5a9359073fe17a8b58e5a085e9a39a950366d9f00217c4ff5878bd312e09d80f460536ea6a3f260b5943a01fe55c158d1cea3fc7bee3d0520aeef04f6d915c82 - languageName: node - linkType: hard - "iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -2866,17 +1942,6 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.7": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" - dependencies: - es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c - languageName: node - linkType: hard - "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -2887,32 +1952,6 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" - dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 - languageName: node - linkType: hard - -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: "npm:^1.0.1" - checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 - languageName: node - linkType: hard - "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -2922,50 +1961,6 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 - languageName: node - linkType: hard - -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f - languageName: node - linkType: hard - -"is-core-module@npm:^2.13.0": - version: 2.14.0 - resolution: "is-core-module@npm:2.14.0" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/ae8dbc82bd20426558bc8d20ce290ce301c1cfd6ae4446266d10cacff4c63c67ab16440ade1d72ced9ec41c569fbacbcee01e293782ce568527c4cdf35936e4c - languageName: node - linkType: hard - -"is-data-view@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-view@npm:1.0.1" - dependencies: - is-typed-array: "npm:^1.1.13" - checksum: 10c0/a3e6ec84efe303da859107aed9b970e018e2bee7ffcb48e2f8096921a493608134240e672a2072577e5f23a729846241d9634806e8a0e51d9129c56d5f65442d - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -2996,22 +1991,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e - languageName: node - linkType: hard - -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b - languageName: node - linkType: hard - "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -3019,75 +1998,6 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.7" - checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 - languageName: node - linkType: hard - -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 10c0/eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 - languageName: node - linkType: hard - -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: "npm:^1.0.2" - checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.13": - version: 1.1.13 - resolution: "is-typed-array@npm:1.1.13" - dependencies: - which-typed-array: "npm:^1.1.14" - checksum: 10c0/fa5cb97d4a80e52c2cc8ed3778e39f175a1a2ae4ddf3adae3187d69586a1fd57cfa0b095db31f66aa90331e9e3da79184cea9c6abdcd1abc722dc3c3edd51cca - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - checksum: 10c0/1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -3129,13 +2039,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^9.0.0": - version: 9.0.0 - resolution: "js-tokens@npm:9.0.0" - checksum: 10c0/4ad1c12f47b8c8b2a3a99e29ef338c1385c7b7442198a425f3463f3537384dab6032012791bfc2f056ea5ecdb06b1ed4f70e11a3ab3f388d3dcebfe16a52b27d - languageName: node - linkType: hard - "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -3152,13 +2055,6 @@ __metadata: languageName: node linkType: hard -"json-parse-better-errors@npm:^1.0.1": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb - languageName: node - linkType: hard - "json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -3168,41 +2064,6 @@ __metadata: languageName: node linkType: hard -"linkedom@npm:^0.16.11": - version: 0.16.11 - resolution: "linkedom@npm:0.16.11" - dependencies: - css-select: "npm:^5.1.0" - cssom: "npm:^0.5.0" - html-escaper: "npm:^3.0.3" - htmlparser2: "npm:^9.1.0" - uhyphen: "npm:^0.2.0" - checksum: 10c0/6a8928ac91f84caa2c4ba6253989f42521139a5c5a3e386df5fc259ccd256cfd3eb1a6009afd74dbef64133358dc1c99ab181f909567f9f04d00eb260c9fea84 - languageName: node - linkType: hard - -"load-json-file@npm:^4.0.0": - version: 4.0.0 - resolution: "load-json-file@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.2" - parse-json: "npm:^4.0.0" - pify: "npm:^3.0.0" - strip-bom: "npm:^3.0.0" - checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 - languageName: node - linkType: hard - -"local-pkg@npm:^0.5.0": - version: 0.5.0 - resolution: "local-pkg@npm:0.5.0" - dependencies: - mlly: "npm:^1.4.2" - pkg-types: "npm:^1.0.3" - checksum: 10c0/f61cbd00d7689f275558b1a45c7ff2a3ddf8472654123ed880215677b9adfa729f1081e50c27ffb415cdb9fa706fb755fec5e23cdd965be375c8059e87ff1cc9 - languageName: node - linkType: hard - "locate-path@npm:^6.0.0": version: 6.0.0 resolution: "locate-path@npm:6.0.0" @@ -3219,15 +2080,6 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^2.3.6, loupe@npm:^2.3.7": - version: 2.3.7 - resolution: "loupe@npm:2.3.7" - dependencies: - get-func-name: "npm:^2.0.1" - checksum: 10c0/71a781c8fc21527b99ed1062043f1f2bb30bdaf54fa4cf92463427e1718bc6567af2988300bc243c1f276e4f0876f29e3cbf7b58106fdc186915687456ce5bf4 - languageName: node - linkType: hard - "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -3244,18 +2096,6 @@ __metadata: languageName: node linkType: hard -"lustre-client-test@workspace:packages/lustre": - version: 0.0.0-use.local - resolution: "lustre-client-test@workspace:packages/lustre" - dependencies: - "@chouqueth/gleam": "npm:^1.3.2" - esbuild: "npm:^0.20.2" - linkedom: "npm:^0.16.11" - npm-run-all: "npm:^4.1.5" - vitest: "npm:^1.5.0" - languageName: unknown - linkType: soft - "magic-string@npm:0.30.8": version: 0.30.8 resolution: "magic-string@npm:0.30.8" @@ -3265,7 +2105,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.2, magic-string@npm:^0.30.5": +"magic-string@npm:^0.30.2": version: 0.30.10 resolution: "magic-string@npm:0.30.10" dependencies: @@ -3312,36 +2152,6 @@ __metadata: languageName: node linkType: hard -"memorystream@npm:^0.3.1": - version: 0.3.1 - resolution: "memorystream@npm:0.3.1" - checksum: 10c0/4bd164657711d9747ff5edb0508b2944414da3464b7fe21ac5c67cf35bba975c4b446a0124bd0f9a8be54cfc18faf92e92bd77563a20328b1ccf2ff04e9f39b9 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 - languageName: node - linkType: hard - -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - "minimatch@npm:^8.0.2": version: 8.0.4 resolution: "minimatch@npm:8.0.4" @@ -3479,18 +2289,6 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.4.2, mlly@npm:^1.7.1": - version: 1.7.1 - resolution: "mlly@npm:1.7.1" - dependencies: - acorn: "npm:^8.11.3" - pathe: "npm:^1.1.2" - pkg-types: "npm:^1.1.1" - ufo: "npm:^1.5.3" - checksum: 10c0/d836a7b0adff4d118af41fb93ad4d9e57f80e694a681185280ba220a4607603c19e86c80f9a6c57512b04280567f2599e3386081705c5b5fd74c9ddfd571d0fa - languageName: node - linkType: hard - "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -3514,13 +2312,6 @@ __metadata: languageName: node linkType: hard -"nice-try@npm:^1.0.4": - version: 1.0.5 - resolution: "nice-try@npm:1.0.5" - checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f - languageName: node - linkType: hard - "node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" @@ -3573,18 +2364,6 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^2.3.2": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" @@ -3592,80 +2371,6 @@ __metadata: languageName: node linkType: hard -"npm-run-all@npm:^4.1.5": - version: 4.1.5 - resolution: "npm-run-all@npm:4.1.5" - dependencies: - ansi-styles: "npm:^3.2.1" - chalk: "npm:^2.4.1" - cross-spawn: "npm:^6.0.5" - memorystream: "npm:^0.3.1" - minimatch: "npm:^3.0.4" - pidtree: "npm:^0.3.0" - read-pkg: "npm:^3.0.0" - shell-quote: "npm:^1.6.1" - string.prototype.padend: "npm:^3.0.0" - bin: - npm-run-all: bin/npm-run-all/index.js - run-p: bin/run-p/index.js - run-s: bin/run-s/index.js - checksum: 10c0/736ee39bd35454d3efaa4a2e53eba6c523e2e17fba21a18edcce6b221f5cab62000bef16bb6ae8aff9e615831e6b0eb25ab51d52d60e6fa6f4ea880e4c6d31f4 - languageName: node - linkType: hard - -"npm-run-path@npm:^5.1.0": - version: 5.3.0 - resolution: "npm-run-path@npm:5.3.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba - languageName: node - linkType: hard - -"nth-check@npm:^2.0.1": - version: 2.1.1 - resolution: "nth-check@npm:2.1.1" - dependencies: - boolbase: "npm:^1.0.0" - checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4 - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d - languageName: node - linkType: hard - -"object.assign@npm:^4.1.5": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" - dependencies: - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - object-keys: "npm:^1.1.1" - checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 - languageName: node - linkType: hard - -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 10c0/4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c - languageName: node - linkType: hard - "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -3675,15 +2380,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^5.0.0": - version: 5.0.0 - resolution: "p-limit@npm:5.0.0" - dependencies: - yocto-queue: "npm:^1.0.0" - checksum: 10c0/574e93b8895a26e8485eb1df7c4b58a1a6e8d8ae41b1750cc2cc440922b3d306044fc6e9a7f74578a883d46802d9db72b30f2e612690fcef838c173261b1ed83 - languageName: node - linkType: hard - "p-locate@npm:^5.0.0": version: 5.0.0 resolution: "p-locate@npm:5.0.0" @@ -3709,16 +2405,6 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-json@npm:4.0.0" - dependencies: - error-ex: "npm:^1.3.1" - json-parse-better-errors: "npm:^1.0.1" - checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -3726,13 +2412,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b - languageName: node - linkType: hard - "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -3740,50 +2419,13 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - "path-scurry@npm:^1.11.1, path-scurry@npm:^1.6.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"path-type@npm:^3.0.0": - version: 3.0.0 - resolution: "path-type@npm:3.0.0" - dependencies: - pify: "npm:^3.0.0" - checksum: 10c0/1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 - languageName: node - linkType: hard - -"pathe@npm:^1.1.1, pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 - languageName: node - linkType: hard - -"pathval@npm:^1.1.1": - version: 1.1.1 - resolution: "pathval@npm:1.1.1" - checksum: 10c0/f63e1bc1b33593cdf094ed6ff5c49c1c0dc5dc20a646ca9725cc7fe7cd9995002d51d5685b9b2ec6814342935748b711bafa840f84c0bb04e38ff40a335c94dc + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d languageName: node linkType: hard @@ -3801,40 +2443,6 @@ __metadata: languageName: node linkType: hard -"pidtree@npm:^0.3.0": - version: 0.3.1 - resolution: "pidtree@npm:0.3.1" - bin: - pidtree: bin/pidtree.js - checksum: 10c0/cd69b0182f749f45ab48584e3442c48c5dc4512502c18d5b0147a33b042c41a4db4269b9ce2f7c48f11833ee5e79d81f5ebc6f7bf8372d4ea55726f60dc505a1 - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 - languageName: node - linkType: hard - -"pkg-types@npm:^1.0.3, pkg-types@npm:^1.1.1": - version: 1.1.3 - resolution: "pkg-types@npm:1.1.3" - dependencies: - confbox: "npm:^0.1.7" - mlly: "npm:^1.7.1" - pathe: "npm:^1.1.2" - checksum: 10c0/4cd2c9442dd5e4ae0c61cbd8fdaa92a273939749b081f78150ce9a3f4e625cca0375607386f49f103f0720b239d02369bf181c3ea6c80cf1028a633df03706ad - languageName: node - linkType: hard - -"possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd - languageName: node - linkType: hard - "postcss@npm:^8.4.27, postcss@npm:^8.4.39": version: 8.4.39 resolution: "postcss@npm:8.4.39" @@ -3855,17 +2463,6 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.7.0": - version: 29.7.0 - resolution: "pretty-format@npm:29.7.0" - dependencies: - "@jest/schemas": "npm:^29.6.3" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^18.0.0" - checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f - languageName: node - linkType: hard - "proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": version: 4.2.0 resolution: "proc-log@npm:4.2.0" @@ -3897,24 +2494,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 - languageName: node - linkType: hard - -"read-pkg@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg@npm:3.0.0" - dependencies: - load-json-file: "npm:^4.0.0" - normalize-package-data: "npm:^2.3.2" - path-type: "npm:^3.0.0" - checksum: 10c0/65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 - languageName: node - linkType: hard - "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -3931,18 +2510,6 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" - dependencies: - call-bind: "npm:^1.0.6" - define-properties: "npm:^1.2.1" - es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -3950,32 +2517,6 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -4080,29 +2621,6 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.1.2": - version: 1.1.2 - resolution: "safe-array-concat@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - has-symbols: "npm:^1.0.3" - isarray: "npm:^2.0.5" - checksum: 10c0/12f9fdb01c8585e199a347eacc3bae7b5164ae805cdc8c6707199dbad5b9e30001a50a43c4ee24dc9ea32dbb7279397850e9208a7e217f4d8b1cf5d90129dec9 - languageName: node - linkType: hard - -"safe-regex-test@npm:^1.0.3": - version: 1.0.3 - resolution: "safe-regex-test@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.6" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.1.4" - checksum: 10c0/900bf7c98dc58f08d8523b7012b468e4eb757afa624f198902c0643d7008ba777b0bdc35810ba0b758671ce887617295fb742b3f3968991b178ceca54cb07603 - languageName: node - linkType: hard - "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -4110,15 +2628,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - "semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -4137,41 +2646,6 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"set-function-name@npm:^2.0.1": - version: 2.0.2 - resolution: "set-function-name@npm:2.0.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - functions-have-names: "npm:^1.2.3" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: "npm:^1.0.0" - checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d - languageName: node - linkType: hard - "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -4181,13 +2655,6 @@ __metadata: languageName: node linkType: hard -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 - languageName: node - linkType: hard - "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" @@ -4195,39 +2662,28 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.6.1, shell-quote@npm:^1.8.1": +"shell-quote@npm:^1.8.1": version: 1.8.1 resolution: "shell-quote@npm:1.8.1" checksum: 10c0/8cec6fd827bad74d0a49347057d40dfea1e01f12a6123bf82c4649f3ef152fc2bc6d6176e6376bffcd205d9d0ccb4f1f9acae889384d20baff92186f01ea455a languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f - languageName: node - linkType: hard - -"siginfo@npm:^2.0.0": - version: 2.0.0 - resolution: "siginfo@npm:2.0.0" - checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": +"signal-exit@npm:^4.0.1": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 languageName: node linkType: hard +"sketch_magic@workspace:packages/sketch_magic": + version: 0.0.0-use.local + resolution: "sketch_magic@workspace:packages/sketch_magic" + dependencies: + "@chouqueth/gleam": "npm:^1.6.1" + languageName: unknown + linkType: soft + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -4277,40 +2733,6 @@ __metadata: languageName: node linkType: hard -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.18 - resolution: "spdx-license-ids@npm:3.0.18" - checksum: 10c0/c64ba03d4727191c8fdbd001f137d6ab51386c350d5516be8a4576c2e74044cb27bc8a758f6a04809da986cc0b14213f069b04de72caccecbc9f733753ccde32 - languageName: node - linkType: hard - "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -4327,20 +2749,6 @@ __metadata: languageName: node linkType: hard -"stackback@npm:0.0.2": - version: 0.0.2 - resolution: "stackback@npm:0.0.2" - checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 - languageName: node - linkType: hard - -"std-env@npm:^3.5.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10c0/60edf2d130a4feb7002974af3d5a5f3343558d1ccf8d9b9934d225c638606884db4a20d2fe6440a09605bca282af6b042ae8070a10490c0800d69e82e478f41e - languageName: node - linkType: hard - "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -4363,52 +2771,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.padend@npm:^3.0.0": - version: 3.1.6 - resolution: "string.prototype.padend@npm:3.1.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/8f2c8c1f3db1efcdc210668c80c87f2cea1253d6029ff296a172b5e13edc9adebeed4942d023de8d31f9b13b69f3f5d73de7141959b1f09817fba5f527e83be1 - languageName: node - linkType: hard - -"string.prototype.trim@npm:^1.2.9": - version: 1.2.9 - resolution: "string.prototype.trim@npm:1.2.9" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.0" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/dcef1a0fb61d255778155006b372dff8cc6c4394bc39869117e4241f41a2c52899c0d263ffc7738a1f9e61488c490b05c0427faa15151efad721e1a9fb2663c2 - languageName: node - linkType: hard - -"string.prototype.trimend@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimend@npm:1.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/0a0b54c17c070551b38e756ae271865ac6cc5f60dabf2e7e343cceae7d9b02e1a1120a824e090e79da1b041a74464e8477e2da43e2775c85392be30a6f60963c - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimstart@npm:1.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 - languageName: node - linkType: hard - "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -4427,29 +2789,6 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 - languageName: node - linkType: hard - -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 10c0/a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce - languageName: node - linkType: hard - -"strip-literal@npm:^2.0.0": - version: 2.1.0 - resolution: "strip-literal@npm:2.1.0" - dependencies: - js-tokens: "npm:^9.0.0" - checksum: 10c0/bc8b8c8346125ae3c20fcdaf12e10a498ff85baf6f69597b4ab2b5fbf2e58cfd2827f1a44f83606b852da99a5f6c8279770046ddea974c510c17c98934c9cc24 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -4477,13 +2816,6 @@ __metadata: languageName: node linkType: hard -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - "tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -4512,27 +2844,6 @@ __metadata: languageName: node linkType: hard -"tinybench@npm:^2.5.1": - version: 2.8.0 - resolution: "tinybench@npm:2.8.0" - checksum: 10c0/5a9a642351fa3e4955e0cbf38f5674be5f3ba6730fd872fd23a5c953ad6c914234d5aba6ea41ef88820180a81829ceece5bd8d3967c490c5171bca1141c2f24d - languageName: node - linkType: hard - -"tinypool@npm:^0.8.3": - version: 0.8.4 - resolution: "tinypool@npm:0.8.4" - checksum: 10c0/779c790adcb0316a45359652f4b025958c1dff5a82460fe49f553c864309b12ad732c8288be52f852973bc76317f5e7b3598878aee0beb8a33322c0e72c4a66c - languageName: node - linkType: hard - -"tinyspy@npm:^2.2.0": - version: 2.2.1 - resolution: "tinyspy@npm:2.2.1" - checksum: 10c0/0b4cfd07c09871e12c592dfa7b91528124dc49a4766a0b23350638c62e6a483d5a2a667de7e6282246c0d4f09996482ddaacbd01f0c05b7ed7e0f79d32409bdc - languageName: node - linkType: hard - "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -4572,16 +2883,6 @@ __metadata: languageName: node linkType: hard -"ts-gleam@npm:^1.0.1": - version: 1.0.1 - resolution: "ts-gleam@npm:1.0.1" - dependencies: - "@iarna/toml": "npm:^2.2.5" - typescript: "npm:^5.2.2" - checksum: 10c0/c0f07828cbcb5793a25d974f233b2470d4f2cddebf0e6201beb38838a24a77272e98c2dcdb29a21b4796fb069e9f77224dae95c19a2a2b7df295f9703f597bfb - languageName: node - linkType: hard - "tslib@npm:^2.1.0": version: 2.6.3 resolution: "tslib@npm:2.6.3" @@ -4589,111 +2890,6 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd - languageName: node - linkType: hard - -"typed-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-buffer@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/9e043eb38e1b4df4ddf9dde1aa64919ae8bb909571c1cc4490ba777d55d23a0c74c7d73afcdd29ec98616d91bb3ae0f705fad4421ea147e1daf9528200b562da - languageName: node - linkType: hard - -"typed-array-byte-length@npm:^1.0.1": - version: 1.0.1 - resolution: "typed-array-byte-length@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/fcebeffb2436c9f355e91bd19e2368273b88c11d1acc0948a2a306792f1ab672bce4cfe524ab9f51a0505c9d7cd1c98eff4235c4f6bfef6a198f6cfc4ff3d4f3 - languageName: node - linkType: hard - -"typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.6": - version: 1.0.6 - resolution: "typed-array-length@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-proto: "npm:^1.0.3" - is-typed-array: "npm:^1.1.13" - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/74253d7dc488eb28b6b2711cf31f5a9dcefc9c41b0681fd1c178ed0a1681b4468581a3626d39cd4df7aee3d3927ab62be06aa9ca74e5baf81827f61641445b77 - languageName: node - linkType: hard - -"typescript@npm:^5.2.2, typescript@npm:^5.4.2": - version: 5.5.3 - resolution: "typescript@npm:5.5.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/f52c71ccbc7080b034b9d3b72051d563601a4815bf3e39ded188e6ce60813f75dbedf11ad15dd4d32a12996a9ed8c7155b46c93a9b9c9bad1049766fe614bbdd - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.2.2#optional!builtin, typescript@patch:typescript@npm%3A^5.4.2#optional!builtin": - version: 5.5.3 - resolution: "typescript@patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=b45daf" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5a437c416251334deeaf29897157032311f3f126547cfdc4b133768b606cb0e62bcee733bb97cf74c42fe7268801aea1392d8e40988cdef112e9546eba4c03c5 - languageName: node - linkType: hard - -"ufo@npm:^1.5.3": - version: 1.5.3 - resolution: "ufo@npm:1.5.3" - checksum: 10c0/1df10702582aa74f4deac4486ecdfd660e74be057355f1afb6adfa14243476cf3d3acff734ccc3d0b74e9bfdefe91d578f3edbbb0a5b2430fe93cd672370e024 - languageName: node - linkType: hard - -"uhyphen@npm:^0.2.0": - version: 0.2.0 - resolution: "uhyphen@npm:0.2.0" - checksum: 10c0/1e7129fe7a5c86445d1adf04d5c58913b5992e4899ea5553d9ddf6e7ef88af0f807a47f1bf9673b92f705276e5cf1b2c1d3852f1ab5d08ecac3382bcc3a642f9 - languageName: node - linkType: hard - -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: "npm:^1.0.2" - has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.0.3" - which-boxed-primitive: "npm:^1.0.2" - checksum: 10c0/81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 - languageName: node - linkType: hard - "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -4738,16 +2934,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - "vite-gleam@npm:^0.4.0": version: 0.4.3 resolution: "vite-gleam@npm:0.4.3" @@ -4760,21 +2946,6 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:1.6.0": - version: 1.6.0 - resolution: "vite-node@npm:1.6.0" - dependencies: - cac: "npm:^6.7.14" - debug: "npm:^4.3.4" - pathe: "npm:^1.1.1" - picocolors: "npm:^1.0.0" - vite: "npm:^5.0.0" - bin: - vite-node: vite-node.mjs - checksum: 10c0/0807e6501ac7763e0efa2b4bd484ce99fb207e92c98624c9f8999d1f6727ac026e457994260fa7fdb7060d87546d197081e46a705d05b0136a38b6f03715cbc2 - languageName: node - linkType: hard - "vite@npm:^4.4.5": version: 4.5.3 resolution: "vite@npm:4.5.3" @@ -4815,7 +2986,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0, vite@npm:^5.1.6": +"vite@npm:^5.1.6": version: 5.3.3 resolution: "vite@npm:5.3.3" dependencies: @@ -4855,56 +3026,6 @@ __metadata: languageName: node linkType: hard -"vitest@npm:^1.5.0": - version: 1.6.0 - resolution: "vitest@npm:1.6.0" - dependencies: - "@vitest/expect": "npm:1.6.0" - "@vitest/runner": "npm:1.6.0" - "@vitest/snapshot": "npm:1.6.0" - "@vitest/spy": "npm:1.6.0" - "@vitest/utils": "npm:1.6.0" - acorn-walk: "npm:^8.3.2" - chai: "npm:^4.3.10" - debug: "npm:^4.3.4" - execa: "npm:^8.0.1" - local-pkg: "npm:^0.5.0" - magic-string: "npm:^0.30.5" - pathe: "npm:^1.1.1" - picocolors: "npm:^1.0.0" - std-env: "npm:^3.5.0" - strip-literal: "npm:^2.0.0" - tinybench: "npm:^2.5.1" - tinypool: "npm:^0.8.3" - vite: "npm:^5.0.0" - vite-node: "npm:1.6.0" - why-is-node-running: "npm:^2.2.2" - peerDependencies: - "@edge-runtime/vm": "*" - "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 1.6.0 - "@vitest/ui": 1.6.0 - happy-dom: "*" - jsdom: "*" - peerDependenciesMeta: - "@edge-runtime/vm": - optional: true - "@types/node": - optional: true - "@vitest/browser": - optional: true - "@vitest/ui": - optional: true - happy-dom: - optional: true - jsdom: - optional: true - bin: - vitest: vitest.mjs - checksum: 10c0/065da5b8ead51eb174d93dac0cd50042ca9539856dc25e340ea905d668c41961f7e00df3e388e6c76125b2c22091db2e8465f993d0f6944daf9598d549e562e7 - languageName: node - linkType: hard - "vitools@workspace:packages/vitools": version: 0.0.0-use.local resolution: "vitools@workspace:packages/vitools" @@ -4944,43 +3065,6 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - dependencies: - is-bigint: "npm:^1.0.1" - is-boolean-object: "npm:^1.1.0" - is-number-object: "npm:^1.0.4" - is-string: "npm:^1.0.5" - is-symbol: "npm:^1.0.3" - checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 - languageName: node - linkType: hard - -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - "which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -5003,18 +3087,6 @@ __metadata: languageName: node linkType: hard -"why-is-node-running@npm:^2.2.2": - version: 2.3.0 - resolution: "why-is-node-running@npm:2.3.0" - dependencies: - siginfo: "npm:^2.0.0" - stackback: "npm:0.0.2" - bin: - why-is-node-running: cli.js - checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 - languageName: node - linkType: hard - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -5093,10 +3165,3 @@ __metadata: checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard - -"yocto-queue@npm:^1.0.0": - version: 1.1.1 - resolution: "yocto-queue@npm:1.1.1" - checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 - languageName: node - linkType: hard From 10a63c8f1d0bed76a2f8e0cf98645478facb5370 Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 16:15:14 +0100 Subject: [PATCH 4/9] Rename message with convention Subject-Verb-Object --- apps/frontend/src/data/msg.gleam | 29 ++++----- apps/frontend/src/frontend.gleam | 61 ++++++++----------- .../src/frontend/view/body/body.gleam | 6 +- .../src/frontend/view/body/cache.gleam | 12 ++-- .../src/frontend/view/footer/footer.gleam | 2 +- .../view/search_input/search_input.gleam | 2 +- 6 files changed, 53 insertions(+), 59 deletions(-) diff --git a/apps/frontend/src/data/msg.gleam b/apps/frontend/src/data/msg.gleam index 11142ab..3bece08 100644 --- a/apps/frontend/src/data/msg.gleam +++ b/apps/frontend/src/data/msg.gleam @@ -37,18 +37,19 @@ pub type Analytics { } pub type Msg { - None - Packages(packages: Result(List(package.Package), http.HttpError)) - OnSearchFocus(event: Dynamic) - SubmitSearch - UpdateIsMobile(is_mobile: Bool) - SearchResults(input: String, result: Result(SearchResults, http.HttpError)) - Trendings(result: Result(List(package.Package), http.HttpError)) - UpdateInput(String) - Reset - ScrollTo(String) - OnEscape - OnAnalytics(Result(Analytics, http.HttpError)) - OnRouteChange(router.Route) - OnCheckFilter(Filter, Bool) + ApiReturnedAnalytics(Result(Analytics, http.HttpError)) + ApiReturnedPackages(packages: Result(List(package.Package), http.HttpError)) + ApiReturnedSearchResults( + input: String, + result: Result(SearchResults, http.HttpError), + ) + ApiReturnedTrendings(result: Result(List(package.Package), http.HttpError)) + BrowserChangedRoute(router.Route) + BrowserResizedViewport(is_mobile: Bool) + UserClickedSidebarName(String) + UserFocusedSearch(event: Dynamic) + UserInputtedSearch(String) + UserPressedEscape + UserSubmittedSearch + UserToggledFilter(Filter, Bool) } diff --git a/apps/frontend/src/frontend.gleam b/apps/frontend/src/frontend.gleam index cef7323..0c7f66d 100644 --- a/apps/frontend/src/frontend.gleam +++ b/apps/frontend/src/frontend.gleam @@ -46,15 +46,15 @@ fn subscribe_focus() { use dispatch <- effect.from() use event <- ffi.subscribe_focus() case ffi.key(event) { - Ok("Escape") -> dispatch(msg.OnEscape) - _ -> dispatch(msg.OnSearchFocus(event)) + Ok("Escape") -> dispatch(msg.UserPressedEscape) + _ -> dispatch(msg.UserFocusedSearch(event)) } } fn subscribe_is_mobile() { use dispatch <- effect.from() use is_mobile <- ffi.suscribe_is_mobile() - dispatch(msg.UpdateIsMobile(is_mobile)) + dispatch(msg.BrowserResizedViewport(is_mobile)) } pub fn main() { @@ -94,15 +94,15 @@ fn init(_) { |> update.add_effect(subscribe_focus()) |> update.add_effect(subscribe_is_mobile()) |> update.add_effect( - http.expect_json(dynamic.list(package.decoder), msg.Trendings) + http.expect_json(dynamic.list(package.decoder), msg.ApiReturnedTrendings) |> http.get(config.api_endpoint() <> "/trendings", _), ) |> update.add_effect( - http.expect_json(dynamic.list(package.decoder), msg.Packages) + http.expect_json(dynamic.list(package.decoder), msg.ApiReturnedPackages) |> http.get(config.api_endpoint() <> "/packages", _), ) |> update.add_effect( - msg.OnAnalytics + msg.ApiReturnedAnalytics |> http.expect_json( dynamic.decode6( msg.Analytics, @@ -133,32 +133,12 @@ fn init(_) { fn on_url_change(uri: Uri) -> Msg { router.parse_uri(uri) - |> msg.OnRouteChange() + |> msg.BrowserChangedRoute } fn update(model: Model, msg: Msg) { case msg { - msg.UpdateInput(content) -> update_input(model, content) - msg.SubmitSearch -> submit_search(model) - msg.Reset -> reset(model) - msg.None -> update.none(model) - msg.Packages(Ok(packages)) -> model.Model(..model, packages:) |> update.none - msg.Packages(_) -> update.none(model) - msg.ScrollTo(id) -> scroll_to(model, id) - msg.OnRouteChange(route) -> handle_route_change(model, route) - msg.Trendings(trendings) -> handle_trendings(model, trendings) - msg.OnSearchFocus(event) -> - update.effect(model, focus(on: "search-input", event: event)) - msg.OnEscape -> update.effect(model, blur()) - msg.UpdateIsMobile(is_mobile) -> - model - |> model.update_is_mobile(is_mobile) - |> update.none - msg.SearchResults(input, search_results) -> - handle_search_results(model, input, search_results) - msg.OnCheckFilter(filter, value) -> - handle_oncheck_filter(model, filter, value) - msg.OnAnalytics(analytics) -> { + msg.ApiReturnedAnalytics(analytics) -> { case analytics { Error(_) -> #(model, effect.none()) Ok(analytics) -> @@ -167,6 +147,23 @@ fn update(model: Model, msg: Msg) { |> update.none() } } + msg.ApiReturnedPackages(Ok(packages)) -> + model.Model(..model, packages:) |> update.none + msg.ApiReturnedPackages(_) -> update.none(model) + msg.ApiReturnedSearchResults(input, search_results) -> + handle_search_results(model, input, search_results) + msg.ApiReturnedTrendings(trendings) -> handle_trendings(model, trendings) + msg.BrowserChangedRoute(route) -> handle_route_change(model, route) + msg.BrowserResizedViewport(is_mobile) -> + model |> model.update_is_mobile(is_mobile) |> update.none + msg.UserClickedSidebarName(id) -> scroll_to(model, id) + msg.UserFocusedSearch(event) -> + update.effect(model, focus(on: "search-input", event: event)) + msg.UserInputtedSearch(content) -> update_input(model, content) + msg.UserPressedEscape -> update.effect(model, blur()) + msg.UserSubmittedSearch -> submit_search(model) + msg.UserToggledFilter(filter, value) -> + handle_oncheck_filter(model, filter, value) } } @@ -191,12 +188,6 @@ fn update_input(model: Model, content: String) { |> update.none } -fn reset(model: Model) { - model - |> model.reset - |> update.none -} - fn submit_search(model: Model) { use <- bool.guard(when: model.input == "", return: #(model, effect.none())) use <- bool.guard(when: model.loading, return: #(model, effect.none())) @@ -214,7 +205,7 @@ fn submit_search(model: Model) { |> update.add_effect(blur()) } Error(_) -> - msg.SearchResults(input: model.input, result: _) + msg.ApiReturnedSearchResults(input: model.input, result: _) |> http.expect_json(search_result.decode_search_results, _) |> http.get(config.api_endpoint() <> "/search?q=" <> model.input, _) |> update.effect(model.toggle_loading(new_model), _) diff --git a/apps/frontend/src/frontend/view/body/body.gleam b/apps/frontend/src/frontend/view/body/body.gleam index 7bde2f1..bc8e4c0 100644 --- a/apps/frontend/src/frontend/view/body/body.gleam +++ b/apps/frontend/src/frontend/view/body/body.gleam @@ -28,7 +28,7 @@ fn view_search_input(model: Model) { |> string.length() |> fn(input) { input != 0 } } - h.form([a.class("search-wrapper"), e.on_submit(msg.SubmitSearch)], [ + h.form([a.class("search-wrapper"), e.on_submit(msg.UserSubmittedSearch)], [ h.div([a.class("search-title-wrapper")], [ h.div([a.class("search-title")], [ h.img([ @@ -152,7 +152,7 @@ fn sidebar(model: Model) { ]), h.form([a.class("sidebar-title-inside")], [h.text("Gloogle")]), ]), - h.form([e.on_submit(msg.SubmitSearch)], [ + h.form([e.on_submit(msg.UserSubmittedSearch)], [ search_input.view(model.loading, model.input, small: True), ]), h.div([a.class("sidebar-filter"), disabled], [el.text("Filters")]), @@ -208,7 +208,7 @@ fn checkbox(active: Bool, msg: msg.Filter, name: String) { a.class("sidebar-checkbox-2"), a.type_("checkbox"), a.checked(active), - e.on_check(msg.OnCheckFilter(msg, _)), + e.on_check(msg.UserToggledFilter(msg, _)), ]), ]), h.div([a.class("sidebar-filter-name")], [el.text(name)]), diff --git a/apps/frontend/src/frontend/view/body/cache.gleam b/apps/frontend/src/frontend/view/body/cache.gleam index 8068bf3..57074b1 100644 --- a/apps/frontend/src/frontend/view/body/cache.gleam +++ b/apps/frontend/src/frontend/view/body/cache.gleam @@ -32,11 +32,13 @@ fn sidebar( ..list.map(modules, fn(module) { let #(module, name) = module let id = package.0 <> "@" <> package.1 <> "-" <> module <> "-" <> name - h.div([a.class("sidebar-module-name"), e.on_click(msg.ScrollTo(id))], [ - t.keyword(module), - h.text("."), - t.fun(name), - ]) + h.div( + [ + a.class("sidebar-module-name"), + e.on_click(msg.UserClickedSidebarName(id)), + ], + [t.keyword(module), h.text("."), t.fun(name)], + ) }) ]) } diff --git a/apps/frontend/src/frontend/view/footer/footer.gleam b/apps/frontend/src/frontend/view/footer/footer.gleam index db73cb0..9c3994e 100644 --- a/apps/frontend/src/frontend/view/footer/footer.gleam +++ b/apps/frontend/src/frontend/view/footer/footer.gleam @@ -42,7 +42,7 @@ pub fn view() { pub fn search_bar(model: Model) { use <- bool.guard(when: !model.is_mobile, return: el.none()) h.div([a.class("footer-search")], [ - h.form([e.on_submit(msg.SubmitSearch)], [ + h.form([e.on_submit(msg.UserSubmittedSearch)], [ search_input.view(model.loading, model.input, small: True), ]), ]) diff --git a/apps/frontend/src/frontend/view/search_input/search_input.gleam b/apps/frontend/src/frontend/view/search_input/search_input.gleam index 74b5d2d..afdf0e9 100644 --- a/apps/frontend/src/frontend/view/search_input/search_input.gleam +++ b/apps/frontend/src/frontend/view/search_input/search_input.gleam @@ -11,7 +11,7 @@ pub fn view(loading loading: Bool, input input: String, small small: Bool) { s.search_input_content([ a.id("search-input"), a.placeholder("Search for a function, or a type"), - e.on_input(msg.UpdateInput), + e.on_input(msg.UserInputtedSearch), a.value(input), a.attribute("autocorrect", "off"), a.attribute("autocapitalize", "none"), From 9fe39bd26d3fa1ba929528a028df8e32a86de641 Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 18:53:23 +0100 Subject: [PATCH 5/9] Remove lustre_http and improve error handling --- apps/backend/package.json | 2 +- apps/frontend/gleam.toml | 5 +- apps/frontend/manifest.toml | 8 +- apps/frontend/package.json | 2 +- apps/frontend/src/data/msg.gleam | 22 +- apps/frontend/src/frontend.gleam | 302 ++++++++++++----------- apps/frontend/src/frontend/config.gleam | 8 - apps/frontend/src/frontend/discuss.gleam | 137 ++++++++++ apps/frontend/src/toast/error.gleam | 54 +--- packages/sketch_magic/package.json | 2 +- packages/vitools/package.json | 2 +- yarn.lock | 22 +- 12 files changed, 336 insertions(+), 230 deletions(-) delete mode 100644 apps/frontend/src/frontend/config.gleam create mode 100644 apps/frontend/src/frontend/discuss.gleam diff --git a/apps/backend/package.json b/apps/backend/package.json index 3f3dbac..5af73d0 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -9,6 +9,6 @@ "backend:db:reset": "yarn backend:db:drop && yarn backend:db:init" }, "dependencies": { - "@chouqueth/gleam": "^1.3.2" + "@chouqueth/gleam": "^1.6.2" } } diff --git a/apps/frontend/gleam.toml b/apps/frontend/gleam.toml index 86b4dfb..7002d5a 100644 --- a/apps/frontend/gleam.toml +++ b/apps/frontend/gleam.toml @@ -11,17 +11,18 @@ typescript_declarations = true [dependencies] birl = ">= 1.7.1 and < 2.0.0" bright = ">= 0.1.0 and < 1.0.0" -gleam_javascript = "~> 0.8" +gleam_javascript = ">= 0.13.0 and < 1.0.0" gleam_json = ">= 1.0.1 and < 2.0.0" gleam_regexp = ">= 1.0.0 and < 2.0.0" gleam_stdlib = "~> 0.34 or ~> 1.0" lustre = ">= 4.6.1 and < 5.0.0" -lustre_http = "~> 0.5" modem = ">= 2.0.0 and < 3.0.0" sketch = ">= 3.0.0 and < 4.0.0" sketch_magic = {path = "../../packages/sketch_magic"} vitools = {path = "../../packages/vitools"} grille_pain = ">= 1.1.0 and < 2.0.0" +gleam_fetch = ">= 0.4.0 and < 1.0.0" +gleam_http = ">= 3.7.1 and < 4.0.0" [dev-dependencies] gleeunit = "~> 1.0" diff --git a/apps/frontend/manifest.toml b/apps/frontend/manifest.toml index 138bc09..485b88e 100644 --- a/apps/frontend/manifest.toml +++ b/apps/frontend/manifest.toml @@ -34,7 +34,6 @@ packages = [ { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, { name = "lustre", version = "4.6.3", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "BDF833368F6C8F152F948D5B6A79866E9881CB80CB66C0685B3327E7DCBFB12F" }, { name = "lustre_dev_tools", version = "1.6.2", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_regexp", "gleam_stdlib", "glint", "glisten", "lustre", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "A0CBC323AA7E03EC91D785CEB644776082D76BE46F1624FB920BB92BD79853F7" }, - { name = "lustre_http", version = "0.5.2", build_tools = ["gleam"], requirements = ["gleam_fetch", "gleam_http", "gleam_javascript", "gleam_json", "gleam_stdlib", "lustre"], otp_app = "lustre_http", source = "hex", outer_checksum = "FB0478CBFA6B16DBE8ECA326DAE2EC15645E04900595EF2C4F039ABFA0512ABA" }, { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, { name = "mist", version = "3.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "CDA1A74E768419235E16886463EC4722EFF4AB3F8D820A76EAD45D7C167D7282" }, { name = "modem", version = "2.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre"], otp_app = "modem", source = "hex", outer_checksum = "B446119A85DC9C31FEA0DCB204072E40356CB246C9D091CBBF2E4678CDB05A2D" }, @@ -45,7 +44,7 @@ packages = [ { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, { name = "sketch", version = "3.1.2", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "sketch", source = "hex", outer_checksum = "85E41BC0BE2E5D8985EF34F0D2FD7315329A463FC845570EC5D399F20F8AFA08" }, { name = "sketch_lustre", version = "1.0.3", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "plinth", "sketch"], otp_app = "sketch_lustre", source = "hex", outer_checksum = "DD5437B10D4BB8AB45A19820B17883188B8568B6ED7885D7D073A983F4984E79" }, - { name = "sketch_magic", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "plinth", "sketch"], source = "local", path = "../../packages/sketch_magic" }, + { name = "sketch_magic", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "sketch"], source = "local", path = "../../packages/sketch_magic" }, { name = "snag", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "08E9EB87C413457DB1DD66CD704C6878DACC9C93B418600F63873D0CD224E756" }, { name = "spinner", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "9EE43AA33BE2DA5731B8F3F170AAB59AF1A815AFA5BF615F12C1B91F3B03F157" }, { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, @@ -59,14 +58,15 @@ packages = [ [requirements] birl = { version = ">= 1.7.1 and < 2.0.0" } bright = { version = ">= 0.1.0 and < 1.0.0" } -gleam_javascript = { version = "~> 0.8" } +gleam_fetch = { version = ">= 0.4.0 and < 1.0.0" } +gleam_http = { version = ">= 3.7.1 and < 4.0.0" } +gleam_javascript = { version = ">= 0.13.0 and < 1.0.0" } gleam_json = { version = ">= 1.0.1 and < 2.0.0" } gleam_regexp = { version = ">= 1.0.0 and < 2.0.0" } gleam_stdlib = { version = "~> 0.34 or ~> 1.0" } gleeunit = { version = "~> 1.0" } grille_pain = { version = ">= 1.1.0 and < 2.0.0" } lustre = { version = ">= 4.6.1 and < 5.0.0" } -lustre_http = { version = "~> 0.5" } modem = { version = ">= 2.0.0 and < 3.0.0" } sketch = { version = ">= 3.0.0 and < 4.0.0" } sketch_magic = { path = "../../packages/sketch_magic" } diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 53a1e1d..d63e2b0 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -9,7 +9,6 @@ "frontend:preview": "vite preview" }, "dependencies": { - "@chouqueth/gleam": "^1.4.1", "@gleam-lang/highlight.js-gleam": "^1.5.0", "@sentry/browser": "^8.0.0", "chart.js": "^4.4.4", @@ -19,6 +18,7 @@ "marked-highlight": "^2.1.1" }, "devDependencies": { + "@chouqueth/gleam": "^1.6.2", "@sentry/vite-plugin": "^2.16.1", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "prettier": "^3.2.5", diff --git a/apps/frontend/src/data/msg.gleam b/apps/frontend/src/data/msg.gleam index 3bece08..8581ac1 100644 --- a/apps/frontend/src/data/msg.gleam +++ b/apps/frontend/src/data/msg.gleam @@ -1,10 +1,10 @@ import birl import data/package import data/search_result.{type SearchResults} +import frontend/discuss import frontend/router import gleam/dynamic.{type Dynamic} import gleam/option -import lustre_http as http pub type Filter { Functions @@ -37,19 +37,17 @@ pub type Analytics { } pub type Msg { - ApiReturnedAnalytics(Result(Analytics, http.HttpError)) - ApiReturnedPackages(packages: Result(List(package.Package), http.HttpError)) - ApiReturnedSearchResults( - input: String, - result: Result(SearchResults, http.HttpError), - ) - ApiReturnedTrendings(result: Result(List(package.Package), http.HttpError)) - BrowserChangedRoute(router.Route) + ApiReturnedAnalytics(analytics: Analytics) + ApiReturnedPackages(packages: List(package.Package)) + ApiReturnedSearchResults(input: String, search_results: SearchResults) + ApiReturnedTrendings(trendings: List(package.Package)) + AppRequiredDiscussToast(message: discuss.DiscussError) + BrowserChangedRoute(route: router.Route) BrowserResizedViewport(is_mobile: Bool) - UserClickedSidebarName(String) + UserClickedSidebarName(id: String) UserFocusedSearch(event: Dynamic) - UserInputtedSearch(String) + UserInputtedSearch(query: String) UserPressedEscape UserSubmittedSearch - UserToggledFilter(Filter, Bool) + UserToggledFilter(filter: Filter, value: Bool) } diff --git a/apps/frontend/src/frontend.gleam b/apps/frontend/src/frontend.gleam index 0c7f66d..fe86bad 100644 --- a/apps/frontend/src/frontend.gleam +++ b/apps/frontend/src/frontend.gleam @@ -3,7 +3,7 @@ import data/model.{type Model} import data/msg.{type Msg} import data/package import data/search_result -import frontend/config +import frontend/discuss import frontend/errors import frontend/ffi import frontend/router @@ -24,7 +24,6 @@ import lustre/effect import lustre/event import lustre/lazy import lustre/update -import lustre_http as http import modem import sketch import sketch/magic @@ -87,48 +86,59 @@ fn init(_) { modem.initial_uri() |> result.map(router.parse_uri) |> result.unwrap(router.Home) - |> handle_route_change(model.init(), _) - submit_search(initial.0) + |> handle_changed_route(model.init(), _) + handle_submitted_search(initial.0) |> update.add_effect(modem.init(on_url_change)) |> update.add_effect(router.update_page_title({ initial.0 }.route)) |> update.add_effect(subscribe_focus()) |> update.add_effect(subscribe_is_mobile()) - |> update.add_effect( - http.expect_json(dynamic.list(package.decoder), msg.ApiReturnedTrendings) - |> http.get(config.api_endpoint() <> "/trendings", _), - ) - |> update.add_effect( - http.expect_json(dynamic.list(package.decoder), msg.ApiReturnedPackages) - |> http.get(config.api_endpoint() <> "/packages", _), - ) - |> update.add_effect( - msg.ApiReturnedAnalytics - |> http.expect_json( - dynamic.decode6( - msg.Analytics, - dynamic.field("total", dynamic.int), - dynamic.field("signatures", dynamic.int), - dynamic.field("packages", dynamic.int), - dynamic.field("timeseries", { - dynamic.list(dynamic.decode2( - pair.new, - dynamic.field("count", dynamic.int), - dynamic.field("date", fn(dyn) { - dynamic.string(dyn) - |> result.then(fn(t) { - birl.parse(t) - |> result.replace_error([]) - }) - }), - )) - }), - dynamic.field("ranked", dynamic.list(decode_package)), - dynamic.field("popular", dynamic.list(decode_package)), - ), - _, - ) - |> http.get(config.api_endpoint() <> "/analytics", _), - ) + |> update.add_effect({ + use dispatch <- effect.from + discuss.about(["trendings"]) + |> discuss.expect(dynamic.list(package.decoder)) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedTrendings(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil + }) + |> update.add_effect({ + use dispatch <- effect.from + discuss.about(["packages"]) + |> discuss.expect(dynamic.list(package.decoder)) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedPackages(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil + }) + |> update.add_effect({ + use dispatch <- effect.from + discuss.about(["analytics"]) + |> discuss.expect(dynamic.decode6( + msg.Analytics, + dynamic.field("total", dynamic.int), + dynamic.field("signatures", dynamic.int), + dynamic.field("packages", dynamic.int), + dynamic.field("timeseries", { + dynamic.list(dynamic.decode2( + pair.new, + dynamic.field("count", dynamic.int), + dynamic.field("date", fn(dyn) { + dynamic.string(dyn) + |> result.then(fn(t) { + birl.parse(t) + |> result.replace_error([]) + }) + }), + )) + }), + dynamic.field("ranked", dynamic.list(decode_package)), + dynamic.field("popular", dynamic.list(decode_package)), + )) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedAnalytics(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil + }) } fn on_url_change(uri: Uri) -> Msg { @@ -138,102 +148,64 @@ fn on_url_change(uri: Uri) -> Msg { fn update(model: Model, msg: Msg) { case msg { - msg.ApiReturnedAnalytics(analytics) -> { - case analytics { - Error(_) -> #(model, effect.none()) - Ok(analytics) -> - model - |> model.update_analytics(analytics) - |> update.none() - } - } - msg.ApiReturnedPackages(Ok(packages)) -> - model.Model(..model, packages:) |> update.none - msg.ApiReturnedPackages(_) -> update.none(model) - msg.ApiReturnedSearchResults(input, search_results) -> + msg.ApiReturnedAnalytics(analytics:) -> handle_analytics(model, analytics) + msg.ApiReturnedPackages(packages:) -> handle_packages(model, packages) + msg.ApiReturnedSearchResults(input:, search_results:) -> handle_search_results(model, input, search_results) - msg.ApiReturnedTrendings(trendings) -> handle_trendings(model, trendings) - msg.BrowserChangedRoute(route) -> handle_route_change(model, route) - msg.BrowserResizedViewport(is_mobile) -> - model |> model.update_is_mobile(is_mobile) |> update.none - msg.UserClickedSidebarName(id) -> scroll_to(model, id) - msg.UserFocusedSearch(event) -> - update.effect(model, focus(on: "search-input", event: event)) - msg.UserInputtedSearch(content) -> update_input(model, content) - msg.UserPressedEscape -> update.effect(model, blur()) - msg.UserSubmittedSearch -> submit_search(model) - msg.UserToggledFilter(filter, value) -> - handle_oncheck_filter(model, filter, value) - } -} - -fn handle_oncheck_filter(model, filter, value) { - case filter, value { - msg.Functions, value -> model.Model(..model, keep_functions: value) - msg.Types, value -> model.Model(..model, keep_types: value) - msg.Aliases, value -> model.Model(..model, keep_aliases: value) - msg.Documented, value -> model.Model(..model, keep_documented: value) - msg.ShowOldPackages, value -> model.Model(..model, show_old_packages: value) - msg.VectorSearch, value -> model.Model(..model, show_vector_search: value) - msg.DocumentationSearch, value -> - model.Model(..model, show_documentation_search: value) + msg.ApiReturnedTrendings(trendings:) -> handle_trendings(model, trendings) + msg.AppRequiredDiscussToast(message:) -> + handle_discuss_toast(model, message) + msg.BrowserChangedRoute(route:) -> handle_changed_route(model, route) + msg.BrowserResizedViewport(is_mobile:) -> + handle_resized_viewport(model, is_mobile) + msg.UserClickedSidebarName(id:) -> handle_clicked_sidebar_name(model, id) + msg.UserFocusedSearch(event:) -> handle_focused_search(model, event) + msg.UserInputtedSearch(query:) -> handle_inputted_search(model, query) + msg.UserPressedEscape -> handle_pressed_escape(model) + msg.UserSubmittedSearch -> handle_submitted_search(model) + msg.UserToggledFilter(filter:, value:) -> + handle_toggle_filter(model, filter, value) } - |> model.update_search_results_filter - |> update.none } -fn update_input(model: Model, content: String) { +fn handle_analytics(model: Model, analytics: msg.Analytics) { model - |> model.update_input(content) + |> model.update_analytics(analytics) |> update.none } -fn submit_search(model: Model) { - use <- bool.guard(when: model.input == "", return: #(model, effect.none())) - use <- bool.guard(when: model.loading, return: #(model, effect.none())) - let new_model = model.update_submitted_input(model) - case dict.get(new_model.search_results, new_model.submitted_input) { - Ok(_) -> { - let new_route = router.Search(new_model.submitted_input) - let is_same_route = new_model.route == new_route - use <- bool.guard(when: is_same_route, return: update.none(new_model)) - new_model - |> update.effect({ - Some("q=" <> new_model.submitted_input) - |> modem.push("search", _, None) - }) - |> update.add_effect(blur()) - } - Error(_) -> - msg.ApiReturnedSearchResults(input: model.input, result: _) - |> http.expect_json(search_result.decode_search_results, _) - |> http.get(config.api_endpoint() <> "/search?q=" <> model.input, _) - |> update.effect(model.toggle_loading(new_model), _) - |> update.add_effect(blur()) - } -} - -fn scroll_to(model: Model, id: String) { - ffi.scroll_to(element: id) - |> effect.from - |> update.effect(model, _) +fn handle_packages(model: Model, packages: List(package.Package)) { + model.Model(..model, packages:) + |> pair.new(effect.none()) } fn handle_search_results( model: Model, input: String, - search_results: Result(search_result.SearchResults, http.HttpError), + search_results: search_result.SearchResults, ) { - let toast = display_toast(search_results) search_results - |> result.map(model.update_search_results(model, input, _)) - |> result.unwrap(model) + |> model.update_search_results(model, input, _) |> model.toggle_loading - |> update.effect(toast) - |> update.add_effect(modem.push("/search", Some("q=" <> input), None)) + |> update.effect(modem.push("/search", Some("q=" <> input), None)) +} + +fn handle_trendings(model: Model, trendings: List(package.Package)) { + trendings + |> model.update_trendings(model, _) + |> update.none } -fn handle_route_change(model: Model, route: router.Route) { +fn handle_discuss_toast(model: Model, message: discuss.DiscussError) { + message + |> toast_error.describe_http_error + |> option.map(errors.capture_message) + |> option.map(toast.error) + |> option.unwrap(effect.none()) + |> pair.new(model, _) +} + +fn handle_changed_route(model: Model, route: router.Route) { let model = model.update_route(model, route) case route { router.Home -> model.update_input(model, "") @@ -244,29 +216,83 @@ fn handle_route_change(model: Model, route: router.Route) { model.update_input(model, q) |> model.update_submitted_input } - |> update.effect(router.update_page_title(route)) + |> pair.new(router.update_page_title(route)) } -fn display_toast( - search_results: Result(search_result.SearchResults, http.HttpError), -) { - search_results - |> result.map_error(fn(error) { - toast_error.describe_http_error(error) - |> option.map(errors.capture_message) - |> option.map(toast.error) - |> option.map(fn(_) { effect.none() }) - }) - |> result.unwrap_error(option.None) - |> option.unwrap(effect.none()) +fn handle_resized_viewport(model: Model, is_mobile: Bool) { + model + |> model.update_is_mobile(is_mobile) + |> pair.new(effect.none()) } -fn handle_trendings( - model: Model, - trendings: Result(List(package.Package), http.HttpError), -) { - trendings - |> result.map(model.update_trendings(model, _)) - |> result.unwrap(model) +fn handle_clicked_sidebar_name(model: Model, id: String) { + ffi.scroll_to(element: id) + |> effect.from + |> update.effect(model, _) +} + +fn handle_focused_search(model: Model, event: Dynamic) { + #(model, focus(on: "search-input", event: event)) +} + +fn handle_inputted_search(model: Model, content: String) { + model + |> model.update_input(content) + |> update.none +} + +fn handle_pressed_escape(model: Model) { + #(model, blur()) +} + +fn handle_submitted_search(model: Model) { + use <- bool.guard(when: model.input == "", return: #(model, effect.none())) + use <- bool.guard(when: model.loading, return: #(model, effect.none())) + let new_model = model.update_submitted_input(model) + case dict.get(new_model.search_results, new_model.submitted_input) { + Ok(_) -> { + let new_route = router.Search(new_model.submitted_input) + let is_same_route = new_model.route == new_route + use <- bool.guard(when: is_same_route, return: update.none(new_model)) + new_model + |> update.effect({ + Some("q=" <> new_model.submitted_input) + |> modem.push("search", _, None) + }) + |> update.add_effect(blur()) + } + Error(_) -> { + model.toggle_loading(new_model) + |> pair.new({ + use dispatch <- effect.from + discuss.about(["search"]) + |> discuss.query([#("q", model.input)]) + |> discuss.expect(search_result.decode_search_results) + |> discuss.on_success(fn(search_results) { + model.input + |> msg.ApiReturnedSearchResults(input: _, search_results:) + |> dispatch + }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil + }) + |> update.add_effect(blur()) + } + } +} + +fn handle_toggle_filter(model, filter, value) { + case filter, value { + msg.Functions, value -> model.Model(..model, keep_functions: value) + msg.Types, value -> model.Model(..model, keep_types: value) + msg.Aliases, value -> model.Model(..model, keep_aliases: value) + msg.Documented, value -> model.Model(..model, keep_documented: value) + msg.ShowOldPackages, value -> model.Model(..model, show_old_packages: value) + msg.VectorSearch, value -> model.Model(..model, show_vector_search: value) + msg.DocumentationSearch, value -> + model.Model(..model, show_documentation_search: value) + } + |> model.update_search_results_filter |> update.none } diff --git a/apps/frontend/src/frontend/config.gleam b/apps/frontend/src/frontend/config.gleam deleted file mode 100644 index e960b1b..0000000 --- a/apps/frontend/src/frontend/config.gleam +++ /dev/null @@ -1,8 +0,0 @@ -import vitools - -pub fn api_endpoint() { - case vitools.is_dev() { - True -> "http://localhost:3000" - False -> "https://api.gloogle.run" - } -} diff --git a/apps/frontend/src/frontend/discuss.gleam b/apps/frontend/src/frontend/discuss.gleam new file mode 100644 index 0000000..3a6c62a --- /dev/null +++ b/apps/frontend/src/frontend/discuss.gleam @@ -0,0 +1,137 @@ +import gleam/bool +import gleam/dynamic.{type Decoder, type Dynamic} +import gleam/fetch +import gleam/http +import gleam/http/request +import gleam/http/response +import gleam/io +import gleam/javascript/promise +import gleam/list +import gleam/result +import gleam/string +import gleam/uri +import vitools + +pub type DiscussError { + InternalServerError + InvalidJsonBody + DecodeError(List(dynamic.DecodeError)) + NetworkError + NotFound +} + +pub opaque type Discuss(a) { + Discuss( + path: String, + query: List(#(String, String)), + method: http.Method, + decoder: Decoder(a), + on_success: fn(a) -> Nil, + on_error: fn(DiscussError) -> Nil, + ) +} + +pub fn about(segments: List(String)) { + let path = encode_path(segments) + Discuss( + path:, + query: [], + method: http.Get, + decoder: fn(a: Dynamic) { Ok(a) }, + on_success: fn(_) { Nil }, + on_error: fn(_) { Nil }, + ) +} + +pub fn via(discuss: Discuss(a), method method: http.Method) { + Discuss(..discuss, method:) +} + +pub fn query(discuss: Discuss(a), query: List(#(String, String))) { + Discuss(..discuss, query:) +} + +pub fn expect(discuss: Discuss(a), format decoder: Decoder(b)) { + let Discuss(path:, query:, method:, ..) = discuss + Discuss( + path:, + decoder:, + method:, + query:, + on_success: fn(_) { Nil }, + on_error: fn(_) { Nil }, + ) +} + +pub fn on_success(discuss: Discuss(a), run on_success: fn(a) -> Nil) { + Discuss(..discuss, on_success:) +} + +pub fn on_error(discuss: Discuss(a), run on_error: fn(DiscussError) -> Nil) { + Discuss(..discuss, on_error:) +} + +pub fn start(discuss: Discuss(a)) { + let assert Ok(req) = endpoint() + req + |> request.set_path(discuss.path) + |> request.set_query(discuss.query) + |> fetch.send() + |> promise.try_await(fetch.read_json_body) + |> promise.map(fn(result) { result.map_error(result, map_fetch_error) }) + |> promise.tap(fn(res) { + case res { + Error(error) -> discuss.on_error(error) + Ok(res) -> { + let warn = fn(error) { fn() { discuss.on_error(error) } } + use <- handle_status(res, 404, warn(NotFound)) + use <- handle_status(res, 500, warn(InternalServerError)) + case discuss.decoder(res.body) { + Error(error) -> discuss.on_error(DecodeError(error)) + Ok(res) -> discuss.on_success(res) + } + } + } + }) +} + +fn encode_path(segments: List(String)) { + segments + |> list.map(uri.percent_encode) + |> string.join("/") + |> prepend_slash +} + +fn prepend_slash(path) { + case path { + "/" <> path -> path + path -> "/" <> path + } +} + +fn endpoint() { + case vitools.is_dev() { + True -> "http://localhost:3000" + False -> "https://api.gloogle.run" + } + |> request.to +} + +fn map_fetch_error(error: fetch.FetchError) { + case error { + fetch.InvalidJsonBody -> InvalidJsonBody + fetch.NetworkError(_) -> NetworkError + fetch.UnableToReadBody -> InvalidJsonBody + } +} + +fn handle_status( + response: response.Response(a), + status_code: Int, + return: fn() -> b, + continuation: fn() -> b, +) { + let is_matching_status = status_code == response.status + use <- bool.lazy_guard(when: is_matching_status, return:) + continuation() +} diff --git a/apps/frontend/src/toast/error.gleam b/apps/frontend/src/toast/error.gleam index 3a5db81..55030d5 100644 --- a/apps/frontend/src/toast/error.gleam +++ b/apps/frontend/src/toast/error.gleam @@ -1,50 +1,14 @@ -import gleam/dynamic -import gleam/int -import gleam/json -import gleam/list +import frontend/discuss import gleam/option.{Some} -import gleam/string -import lustre_http as http -pub fn describe_json_error(error: json.DecodeError) { +pub fn describe_http_error(error: discuss.DiscussError) { case error { - json.UnexpectedEndOfInput -> - "Impossible to parse the response. Unexpected end of input." - json.UnexpectedByte(byte, position) -> { - "Impossible to parse the response. Unexpected byte. " - <> { byte <> " at position " <> int.to_string(position) } - } - json.UnexpectedSequence(byte, position) -> { - "Impossible to parse the response. Unexpected sequence. " - <> { byte <> " at position " <> int.to_string(position) } - } - json.UnexpectedFormat(errors) -> { - string.append("Impossible to parse the response. Unexpected format. ", { - errors - |> list.map(fn(error) { - let dynamic.DecodeError(expected, found, path) = error - let expected = "Expected value: " <> expected - let found = "Found: " <> found - let path = "Path: " <> string.join(path, ".") - expected <> ". " <> found <> ". " <> path <> "." - }) - |> string.join("\n") - }) - } - } - |> Some -} - -pub fn describe_http_error(error: http.HttpError) { - case error { - http.BadUrl(url) -> Some("Bad URL: " <> url) - http.InternalServerError(error) -> - Some({ "Internal server error. Please try again later. " <> error }) - http.JsonError(error) -> describe_json_error(error) - http.NetworkError -> Some("Network error. Please try again later.") - http.NotFound -> Some("Resource not found. Please try again later.") - http.OtherError(error_code, description) -> - Some("Error " <> int.to_string(error_code) <> ". " <> description) - http.Unauthorized -> Some("Operation unauthorized.") + discuss.InternalServerError -> + Some("Internal server error. Please try again later.") + discuss.DecodeError(_) -> Some("Format error. Please try again later.") + discuss.NetworkError -> Some("Network error. Please try again later.") + discuss.NotFound -> + Some("Resource not found. Make sure you have the correct URL.") + discuss.InvalidJsonBody -> Some("Invalid JSON body. Please, retry later.") } } diff --git a/packages/sketch_magic/package.json b/packages/sketch_magic/package.json index cf0cdc8..350ffea 100644 --- a/packages/sketch_magic/package.json +++ b/packages/sketch_magic/package.json @@ -5,6 +5,6 @@ "clean": "gleam clean" }, "devDependencies": { - "@chouqueth/gleam": "^1.6.1" + "@chouqueth/gleam": "^1.6.2" } } diff --git a/packages/vitools/package.json b/packages/vitools/package.json index 8264498..b7d29ef 100644 --- a/packages/vitools/package.json +++ b/packages/vitools/package.json @@ -2,6 +2,6 @@ "name": "vitools", "packageManager": "yarn@4.3.1", "devDependencies": { - "@chouqueth/gleam": "^1.3.2" + "@chouqueth/gleam": "^1.6.2" } } diff --git a/yarn.lock b/yarn.lock index 81dd93d..1416ec6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -304,19 +304,7 @@ __metadata: languageName: node linkType: hard -"@chouqueth/gleam@npm:^1.4.1": - version: 1.4.1 - resolution: "@chouqueth/gleam@npm:1.4.1" - dependencies: - cachedir: "npm:^2.4.0" - tar: "npm:^7.1.0" - bin: - gleam: bin/cli.mjs - checksum: 10c0/d7238a489c699ff1fdab1701603e3066132826eb005926b1e3f2ed4fae0a894c34016cf8b32ac88495c2359a6ec4d447697a09fe3680ddd6b441611b4f42efb4 - languageName: node - linkType: hard - -"@chouqueth/gleam@npm:^1.6.1": +"@chouqueth/gleam@npm:^1.6.2": version: 1.6.2 resolution: "@chouqueth/gleam@npm:1.6.2" dependencies: @@ -1193,7 +1181,7 @@ __metadata: version: 0.0.0-use.local resolution: "backend@workspace:apps/backend" dependencies: - "@chouqueth/gleam": "npm:^1.3.2" + "@chouqueth/gleam": "npm:^1.6.2" languageName: unknown linkType: soft @@ -1725,7 +1713,7 @@ __metadata: version: 0.0.0-use.local resolution: "frontend@workspace:apps/frontend" dependencies: - "@chouqueth/gleam": "npm:^1.4.1" + "@chouqueth/gleam": "npm:^1.6.2" "@gleam-lang/highlight.js-gleam": "npm:^1.5.0" "@sentry/browser": "npm:^8.0.0" "@sentry/vite-plugin": "npm:^2.16.1" @@ -2680,7 +2668,7 @@ __metadata: version: 0.0.0-use.local resolution: "sketch_magic@workspace:packages/sketch_magic" dependencies: - "@chouqueth/gleam": "npm:^1.6.1" + "@chouqueth/gleam": "npm:^1.6.2" languageName: unknown linkType: soft @@ -3030,7 +3018,7 @@ __metadata: version: 0.0.0-use.local resolution: "vitools@workspace:packages/vitools" dependencies: - "@chouqueth/gleam": "npm:^1.3.2" + "@chouqueth/gleam": "npm:^1.6.2" languageName: unknown linkType: soft From f45f5b7dd9ec2044e5f38ee09187083e62909721 Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 21:56:12 +0100 Subject: [PATCH 6/9] Share data for client/server communication --- apps/backend/gleam.toml | 3 +- apps/backend/manifest.toml | 9 +- apps/backend/src/backend/data/hex_read.gleam | 4 +- apps/backend/src/backend/data/hex_user.gleam | 12 +- apps/backend/src/backend/error.gleam | 6 +- .../src/backend/gleam/generate/types.gleam | 16 +- .../src/backend/gleam/type_search/state.gleam | 7 +- .../src/backend/postgres/postgres.gleam | 4 +- .../src/backend/postgres/queries.gleam | 234 +++++------ apps/backend/src/backend/router.gleam | 83 ++-- apps/frontend/gleam.toml | 11 +- apps/frontend/manifest.toml | 11 +- apps/frontend/src/data/metadata.gleam | 27 -- apps/frontend/src/data/model.gleam | 100 ++--- apps/frontend/src/data/msg.gleam | 25 +- apps/frontend/src/data/search_result.gleam | 56 +-- apps/frontend/src/frontend.gleam | 363 +++++------------- apps/frontend/src/frontend/discuss.gleam | 1 - .../src/frontend/effects/window.gleam | 52 +++ apps/frontend/src/frontend/ffi.gleam | 20 - apps/frontend/src/frontend/update.gleam | 149 +++++++ apps/frontend/src/frontend/view.gleam | 10 +- .../src/frontend/view/body/body.gleam | 20 +- .../src/frontend/view/body/cache.gleam | 16 +- .../frontend/view/body/search_result.gleam | 25 +- .../src/frontend/view/body/signature.gleam | 14 +- .../src/frontend/view/footer/footer.gleam | 4 +- .../src/frontend/view/navbar/navbar.gleam | 4 +- apps/frontend/src/gleam/coerce.gleam | 2 - apps/frontend/src/gleam/decoder_extra.gleam | 10 - apps/frontend/src/lustre/update.gleam | 18 - apps/frontend/src/toast/error.gleam | 6 +- packages/bright/.github/workflows/demo.yml | 54 +++ packages/bright/.github/workflows/test.yml | 23 ++ packages/bright/.gitignore | 7 + packages/bright/.prettierrc.json | 3 + packages/bright/LICENCE | 7 + packages/bright/README.md | 272 +++++++++++++ packages/bright/e2e/sample/.gitignore | 4 + packages/bright/e2e/sample/README.md | 24 ++ packages/bright/e2e/sample/gleam.toml | 24 ++ packages/bright/e2e/sample/index.html | 18 + packages/bright/e2e/sample/manifest.toml | 58 +++ packages/bright/e2e/sample/src/icons.gleam | 28 ++ .../e2e/sample/src/icons/book_open.gleam | 17 + .../bright/e2e/sample/src/icons/check.gleam | 17 + .../bright/e2e/sample/src/icons/copy.gleam | 17 + .../bright/e2e/sample/src/icons/github.gleam | 17 + .../bright/e2e/sample/src/icons/home.gleam | 17 + packages/bright/e2e/sample/src/sample.ffi.mjs | 3 + packages/bright/e2e/sample/src/sample.gleam | 235 ++++++++++++ packages/bright/e2e/sample/src/styles.gleam | 192 +++++++++ .../bright/e2e/sample/test/sample_test.gleam | 12 + packages/bright/gleam.toml | 22 ++ packages/bright/manifest.toml | 49 +++ packages/bright/src/bright.ffi.mjs | 9 + packages/bright/src/bright.gleam | 254 ++++++++++++ packages/bright/src/bright_ffi.erl | 6 + packages/bright/test/bright_test.gleam | 12 + .../interfaces/.github/workflows/test.yml | 23 ++ packages/interfaces/.gitignore | 4 + packages/interfaces/README.md | 24 ++ packages/interfaces/gleam.toml | 21 + packages/interfaces/manifest.toml | 16 + packages/interfaces/src/data/analytics.gleam | 88 +++++ .../src/data/implementations.gleam | 0 .../interfaces}/src/data/kind.gleam | 15 +- packages/interfaces/src/data/metadata.gleam | 60 +++ .../interfaces}/src/data/package.gleam | 34 +- .../interfaces}/src/data/signature.gleam | 74 +++- .../interfaces/src/data/type_search.gleam | 46 +++ packages/interfaces/src/gleam/coerce.gleam | 3 + .../interfaces/src/gleam/decoder_extra.gleam | 25 ++ packages/interfaces/src/interfaces.ffi.mjs | 3 + packages/interfaces/src/interfaces.gleam | 5 + packages/interfaces/src/interfaces_ffi.erl | 6 + .../interfaces/test/interfaces_test.gleam | 12 + 77 files changed, 2448 insertions(+), 734 deletions(-) delete mode 100644 apps/frontend/src/data/metadata.gleam create mode 100644 apps/frontend/src/frontend/effects/window.gleam create mode 100644 apps/frontend/src/frontend/update.gleam delete mode 100644 apps/frontend/src/gleam/coerce.gleam delete mode 100644 apps/frontend/src/gleam/decoder_extra.gleam delete mode 100644 apps/frontend/src/lustre/update.gleam create mode 100644 packages/bright/.github/workflows/demo.yml create mode 100644 packages/bright/.github/workflows/test.yml create mode 100644 packages/bright/.gitignore create mode 100644 packages/bright/.prettierrc.json create mode 100644 packages/bright/LICENCE create mode 100644 packages/bright/README.md create mode 100644 packages/bright/e2e/sample/.gitignore create mode 100644 packages/bright/e2e/sample/README.md create mode 100644 packages/bright/e2e/sample/gleam.toml create mode 100644 packages/bright/e2e/sample/index.html create mode 100644 packages/bright/e2e/sample/manifest.toml create mode 100644 packages/bright/e2e/sample/src/icons.gleam create mode 100644 packages/bright/e2e/sample/src/icons/book_open.gleam create mode 100644 packages/bright/e2e/sample/src/icons/check.gleam create mode 100644 packages/bright/e2e/sample/src/icons/copy.gleam create mode 100644 packages/bright/e2e/sample/src/icons/github.gleam create mode 100644 packages/bright/e2e/sample/src/icons/home.gleam create mode 100644 packages/bright/e2e/sample/src/sample.ffi.mjs create mode 100644 packages/bright/e2e/sample/src/sample.gleam create mode 100644 packages/bright/e2e/sample/src/styles.gleam create mode 100644 packages/bright/e2e/sample/test/sample_test.gleam create mode 100644 packages/bright/gleam.toml create mode 100644 packages/bright/manifest.toml create mode 100644 packages/bright/src/bright.ffi.mjs create mode 100644 packages/bright/src/bright.gleam create mode 100644 packages/bright/src/bright_ffi.erl create mode 100644 packages/bright/test/bright_test.gleam create mode 100644 packages/interfaces/.github/workflows/test.yml create mode 100644 packages/interfaces/.gitignore create mode 100644 packages/interfaces/README.md create mode 100644 packages/interfaces/gleam.toml create mode 100644 packages/interfaces/manifest.toml create mode 100644 packages/interfaces/src/data/analytics.gleam rename {apps/frontend => packages/interfaces}/src/data/implementations.gleam (100%) rename {apps/frontend => packages/interfaces}/src/data/kind.gleam (67%) create mode 100644 packages/interfaces/src/data/metadata.gleam rename {apps/frontend => packages/interfaces}/src/data/package.gleam (50%) rename {apps/frontend => packages/interfaces}/src/data/signature.gleam (68%) create mode 100644 packages/interfaces/src/data/type_search.gleam create mode 100644 packages/interfaces/src/gleam/coerce.gleam create mode 100644 packages/interfaces/src/gleam/decoder_extra.gleam create mode 100644 packages/interfaces/src/interfaces.ffi.mjs create mode 100644 packages/interfaces/src/interfaces.gleam create mode 100644 packages/interfaces/src/interfaces_ffi.erl create mode 100644 packages/interfaces/test/interfaces_test.gleam diff --git a/apps/backend/gleam.toml b/apps/backend/gleam.toml index 019634a..5b4d239 100644 --- a/apps/backend/gleam.toml +++ b/apps/backend/gleam.toml @@ -12,13 +12,14 @@ gleam_erlang = "~> 0.25" gleam_hexpm = "~> 1.0" gleam_http = "~> 3.6" gleam_httpc = ">= 2.2.0 and < 3.0.0" -gleam_json = "~> 1.0" +gleam_json = ">= 2.1.0 and < 3.0.0" gleam_otp = "~> 0.10" gleam_package_interface = ">= 1.0.0 and < 2.0.0" gleam_regexp = ">= 1.0.0 and < 2.0.0" gleam_stdlib = ">= 0.44.0 and < 1.0.0" gleam_yielder = ">= 1.1.0 and < 2.0.0" glexer = ">= 1.0.1 and < 2.0.0" +interfaces = {path = "../../packages/interfaces"} mist = ">= 3.0.0 and < 4.0.0" pog = ">= 1.0.1 and < 2.0.0" prng = ">= 3.0.3 and < 4.0.0" diff --git a/apps/backend/manifest.toml b/apps/backend/manifest.toml index b6c8c5c..618c275 100644 --- a/apps/backend/manifest.toml +++ b/apps/backend/manifest.toml @@ -21,17 +21,18 @@ packages = [ { name = "gleam_hexpm", version = "1.1.0", build_tools = ["gleam"], requirements = ["birl", "gleam_stdlib"], otp_app = "gleam_hexpm", source = "hex", outer_checksum = "D32439FD6AD683FE1094922737904EC2091E2D7B1F236AD23815935694A5221A" }, { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, { name = "gleam_httpc", version = "2.3.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "CF6CDD88830CC9853F7638ECC0BE7D7CD9522640DA5FAB4C08CFAC8DEBD08028" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, + { name = "gleam_json", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "0A57FB5666E695FD2BEE74C0428A98B0FC11A395D2C7B4CDF5E22C5DD32C74C6" }, { name = "gleam_otp", version = "0.14.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "5A8CE8DBD01C29403390A7BD5C0A63D26F865C83173CF9708E6E827E53159C65" }, { name = "gleam_package_interface", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "CF3BFC5D0997750D9550D8D73A90F4B8D71C6C081B20ED4E70FFBE1E99AFC3C2" }, { name = "gleam_regexp", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "A3655FDD288571E90EE9C4009B719FEF59FA16AFCDF3952A76A125AF23CF1592" }, - { name = "gleam_stdlib", version = "0.44.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "A6E55E309A6778206AAD4038D9C49E15DF71027A1DB13C6ADA06BFDB6CF1260E" }, + { name = "gleam_stdlib", version = "0.45.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "206FCE1A76974AECFC55AEBCD0217D59EDE4E408C016E2CFCCC8FF51278F186E" }, { name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" }, { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, { name = "glexer", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "BD477AD657C2B637FEF75F2405FAEFFA533F277A74EF1A5E17B55B1178C228FB" }, { name = "glisten", version = "6.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "912132751031473CB38F454120124FFC96AF6B0EA33D92C9C90DB16327A2A972" }, { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, + { name = "interfaces", version = "1.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_json", "gleam_stdlib"], source = "local", path = "../../packages/interfaces" }, { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, { name = "mist", version = "3.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "CDA1A74E768419235E16886463EC4722EFF4AB3F8D820A76EAD45D7C167D7282" }, @@ -48,7 +49,6 @@ packages = [ { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, { name = "stoiridh_version", version = "0.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "stoiridh_version", source = "hex", outer_checksum = "EEF8ADAB9755BD33EB202F169376F1A7797AEF90823FDCA671D8590D04FBF56B" }, { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, { name = "tom", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "228E667239504B57AD05EC3C332C930391592F6C974D0EFECF32FFD0F3629A27" }, { name = "verl", version = "1.1.1", build_tools = ["rebar3"], requirements = [], otp_app = "verl", source = "hex", outer_checksum = "0925E51CD92A0A8BE271765B02430B2E2CFF8AC30EF24D123BD0D58511E8FB18" }, { name = "wisp", version = "1.3.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "D12384EE63ADEE833B40A6D26EF8014A6E4BFC10EC2CDC8B57D325DD4B52740E" }, @@ -65,7 +65,7 @@ gleam_erlang = { version = "~> 0.25" } gleam_hexpm = { version = "~> 1.0" } gleam_http = { version = "~> 3.6" } gleam_httpc = { version = ">= 2.2.0 and < 3.0.0" } -gleam_json = { version = "~> 1.0" } +gleam_json = { version = ">= 2.1.0 and < 3.0.0" } gleam_otp = { version = "~> 0.10" } gleam_package_interface = { version = ">= 1.0.0 and < 2.0.0" } gleam_regexp = { version = ">= 1.0.0 and < 2.0.0" } @@ -73,6 +73,7 @@ gleam_stdlib = { version = ">= 0.44.0 and < 1.0.0" } gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" } gleeunit = { version = "~> 1.0" } glexer = { version = ">= 1.0.1 and < 2.0.0" } +interfaces = { path = "../../packages/interfaces" } mist = { version = ">= 3.0.0 and < 4.0.0" } pog = { version = ">= 1.0.1 and < 2.0.0" } pprint = { version = ">= 1.0.3 and < 2.0.0" } diff --git a/apps/backend/src/backend/data/hex_read.gleam b/apps/backend/src/backend/data/hex_read.gleam index d4caa20..8f5c6dc 100644 --- a/apps/backend/src/backend/data/hex_read.gleam +++ b/apps/backend/src/backend/data/hex_read.gleam @@ -9,7 +9,7 @@ pub type HexRead { pub fn decode(data) { dynamic.decode2( HexRead, - dynamic.element(0, dynamic.int), - dynamic.element(1, helpers.decode_time), + dynamic.field("id", dynamic.int), + dynamic.field("last_check", helpers.decode_time), )(data) } diff --git a/apps/backend/src/backend/data/hex_user.gleam b/apps/backend/src/backend/data/hex_user.gleam index 04c5a2d..abed1a6 100644 --- a/apps/backend/src/backend/data/hex_user.gleam +++ b/apps/backend/src/backend/data/hex_user.gleam @@ -17,11 +17,11 @@ pub type HexUser { pub fn decode(data) { dynamic.decode6( HexUser, - dynamic.element(0, dynamic.int), - dynamic.element(1, dynamic.string), - dynamic.element(2, dynamic.optional(dynamic.string)), - dynamic.element(3, dynamic.string), - dynamic.element(4, helpers.decode_time), - dynamic.element(5, helpers.decode_time), + dynamic.field("id", dynamic.int), + dynamic.field("username", dynamic.string), + dynamic.field("email", dynamic.optional(dynamic.string)), + dynamic.field("url", dynamic.string), + dynamic.field("created_at", helpers.decode_time), + dynamic.field("updated_at", helpers.decode_time), )(data) } diff --git a/apps/backend/src/backend/error.gleam b/apps/backend/src/backend/error.gleam index f4bb5c0..bb85d12 100644 --- a/apps/backend/src/backend/error.gleam +++ b/apps/backend/src/backend/error.gleam @@ -42,15 +42,13 @@ pub fn log_dynamic_error(error: dynamic.DecodeError) { pub fn log_decode_error(error: json.DecodeError) { case error { json.UnexpectedEndOfInput -> wisp.log_warning("Unexpected end of input") - json.UnexpectedByte(byte, position) -> { + json.UnexpectedByte(byte) -> { wisp.log_warning("Unexpected byte") wisp.log_warning(" byte: " <> byte) - wisp.log_warning(" position: " <> int.to_string(position)) } - json.UnexpectedSequence(byte, position) -> { + json.UnexpectedSequence(byte) -> { wisp.log_warning("Unexpected sequence") wisp.log_warning(" byte: " <> byte) - wisp.log_warning(" position: " <> int.to_string(position)) } json.UnexpectedFormat(errors) -> { wisp.log_warning("Unexpected format") diff --git a/apps/backend/src/backend/gleam/generate/types.gleam b/apps/backend/src/backend/gleam/generate/types.gleam index 4c4f7d4..6967abd 100644 --- a/apps/backend/src/backend/gleam/generate/types.gleam +++ b/apps/backend/src/backend/gleam/generate/types.gleam @@ -122,14 +122,18 @@ fn type_to_json(ctx: Context, type_: Type) { } fn find_package_release(ctx: Context, package: String, requirement: String) { - "SELECT package_release.id, package_release.version + "SELECT package_release.id id, package_release.version version FROM package JOIN package_release ON package.id = package_release.package_id WHERE package.name = $1" |> pog.query |> pog.parameter(pog.text(package)) - |> pog.returning(dynamic.tuple2(dynamic.int, dynamic.string)) + |> pog.returning(dynamic.decode2( + pair.new, + dynamic.field("id", dynamic.int), + dynamic.field("version", dynamic.string), + )) |> pog.execute(ctx.db) |> result.map_error(error.DatabaseError) |> result.map(fn(response) { response.rows }) @@ -173,7 +177,7 @@ fn find_signature_from_release( ) { use acc, release <- list.fold(releases, error.empty()) use <- bool.guard(when: result.is_ok(acc), return: acc) - "SELECT release.version, signature.id + "SELECT release.version version, signature.id id FROM package_release release JOIN package_module module ON module.package_release_id = release.id @@ -186,7 +190,11 @@ fn find_signature_from_release( |> pog.parameter(pog.text(name)) |> pog.parameter(pog.text(module)) |> pog.parameter(pog.int(release)) - |> pog.returning(dynamic.tuple2(dynamic.string, dynamic.int)) + |> pog.returning(dynamic.decode2( + pair.new, + dynamic.field("version", dynamic.string), + dynamic.field("id", dynamic.int), + )) |> pog.execute(ctx.db) |> result.map_error(error.DatabaseError) |> result.try(fn(response) { diff --git a/apps/backend/src/backend/gleam/type_search/state.gleam b/apps/backend/src/backend/gleam/type_search/state.gleam index e8c057c..5825ee6 100644 --- a/apps/backend/src/backend/gleam/type_search/state.gleam +++ b/apps/backend/src/backend/gleam/type_search/state.gleam @@ -8,6 +8,7 @@ import gleam/function import gleam/list import gleam/option import gleam/otp/actor +import gleam/pair import gleam/result import pog @@ -101,7 +102,11 @@ fn compute_rows( OFFSET $1" |> pog.query |> pog.parameter(pog.int(offset)) - |> pog.returning(dynamic.tuple2(dynamic.string, dynamic.int)) + |> pog.returning(dynamic.decode2( + pair.new, + dynamic.field("signature_", dynamic.string), + dynamic.field("id", dynamic.int), + )) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.unwrap([]) diff --git a/apps/backend/src/backend/postgres/postgres.gleam b/apps/backend/src/backend/postgres/postgres.gleam index 45170e1..8ccc051 100644 --- a/apps/backend/src/backend/postgres/postgres.gleam +++ b/apps/backend/src/backend/postgres/postgres.gleam @@ -9,7 +9,9 @@ import pog.{Config} pub fn connect(database_url: String) { let assert Ok(config) = parse_database_url(database_url) - pog.connect(config) + config + |> pog.rows_as_map(True) + |> pog.connect } fn parse_database_url(database_url: String) { diff --git a/apps/backend/src/backend/postgres/queries.gleam b/apps/backend/src/backend/postgres/queries.gleam index edb7cab..77a4c5c 100644 --- a/apps/backend/src/backend/postgres/queries.gleam +++ b/apps/backend/src/backend/postgres/queries.gleam @@ -3,6 +3,9 @@ import backend/data/hex_user.{type HexUser} import backend/error import backend/gleam/context import birl.{type Time} +import data/analytics +import data/package +import data/type_search import gleam/bool import gleam/dict.{type Dict} import gleam/dynamic @@ -48,7 +51,7 @@ pub fn upsert_most_recent_hex_timestamp(db: pog.Connection, latest: Time) { VALUES (1, $1) ON CONFLICT (id) DO UPDATE SET last_check = $1 - RETURNING *" + RETURNING id, last_check" |> pog.query |> pog.parameter(helpers.convert_time(latest)) |> pog.returning(hex_read.decode) @@ -83,18 +86,18 @@ pub fn upsert_search_analytics(db: pog.Connection, query: String) { pub fn select_more_popular_packages(db: pog.Connection) { use ranked <- result.try({ - "SELECT name, repository, rank, (popularity -> 'github')::int + "SELECT name, repository, rank, (popularity -> 'github')::int AS popularity FROM package ORDER BY rank DESC LIMIT 22" |> pog.query - |> pog.returning(decode_popular_package) + |> pog.returning(analytics.decode_package) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) }) use popular <- result.try({ - "SELECT name, repository, rank, (popularity -> 'github')::int + "SELECT name, repository, rank, (popularity -> 'github')::int AS popularity FROM package WHERE popularity -> 'github' IS NOT NULL AND name != 'funtil' @@ -102,7 +105,7 @@ pub fn select_more_popular_packages(db: pog.Connection) { ORDER BY popularity -> 'github' DESC LIMIT 23" |> pog.query - |> pog.returning(decode_popular_package) + |> pog.returning(analytics.decode_package) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) @@ -110,15 +113,6 @@ pub fn select_more_popular_packages(db: pog.Connection) { Ok(#(ranked, popular)) } -fn decode_popular_package(dyn) { - dynamic.tuple4( - dynamic.string, - dynamic.string, - dynamic.int, - dynamic.optional(dynamic.int), - )(dyn) -} - pub fn select_last_day_search_analytics(db: pog.Connection) { let #(date, _) = birl.to_erlang_universal_datetime(birl.now()) let now = birl.from_erlang_universal_datetime(#(date, #(0, 0, 0))) @@ -127,7 +121,11 @@ pub fn select_last_day_search_analytics(db: pog.Connection) { WHERE updated_at >= $1" |> pog.query |> pog.parameter(helpers.convert_time(now)) - |> pog.returning(dynamic.tuple2(dynamic.string, dynamic.int)) + |> pog.returning(dynamic.decode2( + pair.new, + dynamic.field("query", dynamic.string), + dynamic.field("occurences", dynamic.int), + )) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) @@ -170,7 +168,11 @@ pub fn get_timeseries_count(db: pog.Connection) { GROUP BY at.date ORDER BY date DESC" |> pog.query - |> pog.returning(dynamic.tuple2(dynamic.int, helpers.decode_time)) + |> pog.returning(dynamic.decode2( + pair.new, + dynamic.field("searches", dynamic.int), + dynamic.field("date", helpers.decode_time), + )) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -200,39 +202,39 @@ fn upsert_package_owners(db: pog.Connection, owners: List(hexpm.PackageOwner)) { } fn get_current_package_owners(db: pog.Connection, package_id: Int) { - "SELECT package_owner.hex_user_id + "SELECT package_owner.hex_user_id AS user_id FROM package_owner WHERE package_owner.package_id = $1" |> pog.query |> pog.parameter(pog.int(package_id)) - |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.returning(dynamic.field("user_id", dynamic.int)) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } pub fn get_total_searches(db: pog.Connection) { - "SELECT SUM(occurences) FROM search_analytics" + "SELECT SUM(occurences) occurences FROM search_analytics" |> pog.query - |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.returning(dynamic.field("occurences", dynamic.int)) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } pub fn get_total_signatures(db: pog.Connection) { - "SELECT COUNT(*) FROM package_type_fun_signature" + "SELECT COUNT(*) c FROM package_type_fun_signature" |> pog.query - |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.returning(dynamic.field("c", dynamic.int)) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) } pub fn get_total_packages(db: pog.Connection) { - "SELECT COUNT(*) FROM package" + "SELECT COUNT(*) c FROM package" |> pog.query - |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.returning(dynamic.field("c", dynamic.int)) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) @@ -320,7 +322,7 @@ pub fn upsert_package(db: pog.Connection, package: hexpm.Package) { |> pog.parameter(package.meta.links |> helpers.json_dict() |> pog.text()) |> pog.parameter(package.meta.licenses |> helpers.json_list() |> pog.text()) |> pog.parameter(pog.nullable(pog.text, package.meta.description)) - |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.returning(dynamic.field("id", dynamic.int)) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.try(fn(response) { @@ -363,10 +365,11 @@ pub fn upsert_release( |> birl.to_erlang_universal_datetime |> coerce }) - |> pog.returning(dynamic.tuple3( - dynamic.int, - dynamic.optional(dynamic.string), - dynamic.optional(dynamic.string), + |> pog.returning(dynamic.decode3( + fn(a, b, c) { #(a, b, c) }, + dynamic.field("id", dynamic.int), + dynamic.field("package_interface", dynamic.optional(dynamic.string)), + dynamic.field("gleam_toml", dynamic.optional(dynamic.string)), )) |> pog.execute(db) |> result.map_error(error.DatabaseError) @@ -383,10 +386,11 @@ pub fn lookup_release( |> pog.query |> pog.parameter(pog.int(package_id)) |> pog.parameter(pog.text(release.version)) - |> pog.returning(dynamic.tuple3( - dynamic.int, - dynamic.optional(dynamic.string), - dynamic.optional(dynamic.string), + |> pog.returning(dynamic.decode3( + fn(a, b, c) { #(a, b, c) }, + dynamic.field("id", dynamic.int), + dynamic.field("package_interface", dynamic.optional(dynamic.string)), + dynamic.field("gleam_toml", dynamic.optional(dynamic.string)), )) |> pog.execute(db) |> result.map_error(error.DatabaseError) @@ -456,7 +460,11 @@ pub fn get_package_release_ids( |> pog.query |> pog.parameter(pog.text(package.name)) |> pog.parameter(pog.text(package.version)) - |> pog.returning(dynamic.tuple2(dynamic.int, dynamic.int)) + |> pog.returning(dynamic.decode2( + pair.new, + dynamic.field("package_id", dynamic.int), + dynamic.field("package_release_id", dynamic.int), + )) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.try(fn(response) { @@ -482,7 +490,7 @@ pub fn upsert_package_module(db: pog.Connection, module: context.Module) { |> pog.text() }) |> pog.parameter(pog.int(module.release_id)) - |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.returning(dynamic.field("id", dynamic.int)) |> pog.execute(db) |> result.map_error(error.DatabaseError) }) @@ -565,7 +573,7 @@ pub fn upsert_package_type_fun_signature( |> option.map(pog.text) |> option.unwrap(pog.null()) }) - |> pog.returning(dynamic.element(0, dynamic.int)) + |> pog.returning(dynamic.field("id", dynamic.int)) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -600,7 +608,7 @@ pub fn find_similar_type_names(db: pog.Connection, name: String) { AND levenshtein_less_equal(name, $1, 2) <= 2" |> pog.query |> pog.parameter(pog.text(name)) - |> pog.returning(dynamic.element(0, dynamic.string)) + |> pog.returning(dynamic.field("name", dynamic.string)) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -609,13 +617,13 @@ pub fn find_similar_type_names(db: pog.Connection, name: String) { pub fn name_search(db: pog.Connection, query: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, - s.documentation, + s.documentation documentation, s.kind signature_kind, - s.metadata, + s.metadata metadata, s.json_signature, m.name module_name, - p.name, - r.version, + p.name package_name, + r.version version, p.rank package_rank, string_to_array(regexp_replace(r.version, '([0-9]+).([0-9]+).([0-9]+).*', '\\1.\\2.\\3'), '.')::int[] AS ordering FROM package_type_fun_signature s @@ -630,7 +638,7 @@ pub fn name_search(db: pog.Connection, query: String) { LIMIT 100" |> pog.query |> pog.parameter(pog.text(query)) - |> pog.returning(decode_type_search) + |> pog.returning(type_search.decode) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -640,13 +648,13 @@ pub fn module_and_name_search(db: pog.Connection, query: String) { "WITH splitted_name AS (SELECT string_to_array($1, '.') AS full_name) SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, - s.documentation, + s.documentation documentation, s.kind signature_kind, - s.metadata, + s.metadata metadata, s.json_signature, m.name module_name, - p.name, - r.version, + p.name package_name, + r.version version, p.rank package_rank, string_to_array(regexp_replace(r.version, '([0-9]+).([0-9]+).([0-9]+).*', '\\1.\\2.\\3'), '.')::int[] AS ordering FROM package_type_fun_signature s @@ -664,7 +672,7 @@ pub fn module_and_name_search(db: pog.Connection, query: String) { LIMIT 100" |> pog.query |> pog.parameter(pog.text(query)) - |> pog.returning(decode_type_search) + |> pog.returning(type_search.decode) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -684,13 +692,13 @@ fn transform_query(q: String) { pub fn content_search(db: pog.Connection, query: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, - s.documentation, + s.documentation documentation, s.kind signature_kind, - s.metadata, + s.metadata metadata, s.json_signature, m.name module_name, - p.name, - r.version, + p.name package_name, + r.version version, p.rank package_rank, string_to_array(regexp_replace(r.version, '([0-9]+).([0-9]+).([0-9]+).*', '\\1.\\2.\\3'), '.')::int[] AS ordering FROM package_type_fun_signature s @@ -712,50 +720,22 @@ pub fn content_search(db: pog.Connection, query: String) { |> pog.query |> pog.parameter(pog.text(query)) |> pog.parameter(pog.text(transform_query(query))) - |> pog.returning(decode_type_search) + |> pog.returning(type_search.decode) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) } -fn decode_type_search(dyn) { - dynamic.decode8( - fn(a, b, c, d, e, f, g, h) { #(a, b, c, d, e, f, g, h) }, - dynamic.element(0, dynamic.string), - dynamic.element(1, dynamic.string), - dynamic.element(2, dynamic.string), - dynamic.element(3, dynamic.dynamic), - dynamic.element(4, dynamic.dynamic), - dynamic.element(5, dynamic.string), - dynamic.element(6, dynamic.string), - dynamic.element(7, dynamic.string), - )(dyn) -} - -pub fn type_search_to_json(item) { - let #(a, b, c, d, e, f, g, h) = item - json.object([ - #("name", json.string(a)), - #("documentation", json.string(b)), - #("kind", json.string(c)), - #("metadata", coerce(d)), - #("json_signature", coerce(e)), - #("module_name", json.string(f)), - #("package_name", json.string(g)), - #("version", json.string(h)), - ]) -} - pub fn signature_search(db: pog.Connection, q: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, - s.documentation, + s.documentation documentation, s.kind signature_kind, - s.metadata, + s.metadata metadata, s.json_signature, m.name module_name, - p.name, - r.version, + p.name package_name, + r.version version, p.rank package_rank, string_to_array(regexp_replace(r.version, '([0-9]+).([0-9]+).([0-9]+).*', '\\1.\\2.\\3'), '.')::int[] AS ordering FROM package_type_fun_signature s @@ -770,7 +750,7 @@ pub fn signature_search(db: pog.Connection, q: String) { LIMIT 100" |> pog.query |> pog.parameter(pog.text(q)) - |> pog.returning(decode_type_search) + |> pog.returning(type_search.decode) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -779,13 +759,13 @@ pub fn signature_search(db: pog.Connection, q: String) { pub fn documentation_search(db: pog.Connection, q: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, - s.documentation, + s.documentation documentation, s.kind signature_kind, - s.metadata, + s.metadata metadata, s.json_signature, m.name module_name, - p.name, - r.version, + p.name package_name, + r.version version, p.rank package_rank, string_to_array(regexp_replace(r.version, '([0-9]+).([0-9]+).([0-9]+).*', '\\1.\\2.\\3'), '.')::int[] AS ordering FROM package_type_fun_signature s @@ -800,7 +780,7 @@ pub fn documentation_search(db: pog.Connection, q: String) { LIMIT 100" |> pog.query |> pog.parameter(pog.text(q)) - |> pog.returning(decode_type_search) + |> pog.returning(type_search.decode) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -809,13 +789,13 @@ pub fn documentation_search(db: pog.Connection, q: String) { pub fn module_search(db: pog.Connection, q: String) { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, - s.documentation, + s.documentation documentation, s.kind signature_kind, - s.metadata, + s.metadata metadata, s.json_signature, m.name module_name, - p.name, - r.version, + p.name package_name, + r.version version, p.rank package_rank, string_to_array(regexp_replace(r.version, '([0-9]+).([0-9]+).([0-9]+).*', '\\1.\\2.\\3'), '.')::int[] AS ordering FROM package_type_fun_signature s @@ -839,7 +819,7 @@ pub fn module_search(db: pog.Connection, q: String) { ORDER BY package_rank DESC, ordering DESC, type_name, signature_kind, module_name" |> pog.query |> pog.parameter(pog.text(q)) - |> pog.returning(decode_type_search) + |> pog.returning(type_search.decode) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -853,13 +833,13 @@ pub fn exact_type_search(db: pog.Connection, q: List(Int)) { { "SELECT DISTINCT ON (package_rank, ordering, type_name, signature_kind, module_name) s.name type_name, - s.documentation, + s.documentation documentation, s.kind signature_kind, - s.metadata, + s.metadata metadata, s.json_signature, m.name module_name, - p.name, - r.version, + p.name package_name, + r.version version, p.rank package_rank, string_to_array(regexp_replace(r.version, '([0-9]+).([0-9]+).([0-9]+).*', '\\1.\\2.\\3'), '.')::int[] AS ordering FROM package_type_fun_signature s @@ -876,7 +856,7 @@ pub fn exact_type_search(db: pog.Connection, q: List(Int)) { } |> pog.query |> list.fold(q, _, fn(query, q) { pog.parameter(query, pog.int(q)) }) - |> pog.returning(decode_type_search) + |> pog.returning(type_search.decode) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -891,7 +871,7 @@ pub fn select_gleam_toml(db: pog.Connection, offset: Int) { OFFSET $1" |> pog.query |> pog.parameter(pog.int(offset)) - |> pog.returning(dynamic.element(0, dynamic.string)) + |> pog.returning(dynamic.field("gleam_toml", dynamic.string)) |> pog.execute(db) |> result.map_error(error.DatabaseError) |> result.map(fn(r) { r.rows }) @@ -912,7 +892,11 @@ pub fn select_package_repository_address(db: pog.Connection, offset: Int) { |> pog.query |> pog.parameter(pog.int(offset)) |> pog.returning(fn(dyn) { - dynamic.tuple2(dynamic.int, dynamic.optional(dynamic.string))(dyn) + dynamic.decode2( + pair.new, + dynamic.field("id", dynamic.int), + dynamic.field("repository", dynamic.optional(dynamic.string)), + )(dyn) |> result.map(fn(content) { case content { #(id, Some(repo)) -> Some(#(id, repo)) @@ -963,28 +947,7 @@ pub fn select_package_by_popularity(db: pog.Connection, page: Int) { OFFSET $1" |> pog.query |> pog.parameter(pog.int(offset)) - |> pog.returning(dynamic.decode8( - fn(a, b, c, d, e, f, g, h) { - json.object([ - #("name", json.string(a)), - #("repository", json.nullable(b, json.string)), - #("documentation", json.nullable(c, json.string)), - #("hex-url", json.nullable(d, json.string)), - #("licenses", json.string(e)), - #("description", json.nullable(f, json.string)), - #("rank", json.int(g)), - #("popularity", json.nullable(h, json.string)), - ]) - }, - dynamic.element(0, dynamic.string), - dynamic.element(1, dynamic.optional(dynamic.string)), - dynamic.element(2, dynamic.optional(dynamic.string)), - dynamic.element(3, dynamic.optional(dynamic.string)), - dynamic.element(4, dynamic.string), - dynamic.element(5, dynamic.optional(dynamic.string)), - dynamic.element(6, dynamic.int), - dynamic.element(7, dynamic.optional(dynamic.string)), - )) + |> pog.returning(package.decode) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) @@ -1003,28 +966,7 @@ pub fn select_package_by_updated_at(db: pog.Connection) { FROM package ORDER BY updated_at DESC" |> pog.query - |> pog.returning(dynamic.decode8( - fn(a, b, c, d, e, f, g, h) { - json.object([ - #("name", json.string(a)), - #("repository", json.nullable(b, json.string)), - #("documentation", json.nullable(c, json.string)), - #("hex-url", json.nullable(d, json.string)), - #("licenses", json.string(e)), - #("description", json.nullable(f, json.string)), - #("rank", json.int(g)), - #("popularity", json.nullable(h, json.string)), - ]) - }, - dynamic.element(0, dynamic.string), - dynamic.element(1, dynamic.optional(dynamic.string)), - dynamic.element(2, dynamic.optional(dynamic.string)), - dynamic.element(3, dynamic.optional(dynamic.string)), - dynamic.element(4, dynamic.string), - dynamic.element(5, dynamic.optional(dynamic.string)), - dynamic.element(6, dynamic.int), - dynamic.element(7, dynamic.optional(dynamic.string)), - )) + |> pog.returning(package.decode) |> pog.execute(db) |> result.map(fn(r) { r.rows }) |> result.map_error(error.DatabaseError) diff --git a/apps/backend/src/backend/router.gleam b/apps/backend/src/backend/router.gleam index 5c57d6e..5330d62 100644 --- a/apps/backend/src/backend/router.gleam +++ b/apps/backend/src/backend/router.gleam @@ -1,11 +1,13 @@ import api/hex import backend/context.{type Context} import backend/error -import backend/gleam/type_search/msg as type_search +import backend/gleam/type_search/msg import backend/postgres/queries import backend/web -import birl import cors_builder as cors +import data/analytics +import data/package +import data/type_search import gleam/erlang/process import gleam/http import gleam/int @@ -30,7 +32,7 @@ fn search(query: String, ctx: Context) { let exact_type_searches = option.then(ctx.type_search_subject, fn(subject) { - process.try_call(subject, type_search.Find(_, query), within: 25_000) + process.try_call(subject, msg.Find(_, query), within: 25_000) |> option.from_result |> option.flatten }) @@ -109,29 +111,14 @@ fn search(query: String, ctx: Context) { }) json.object([ - #( - "exact-type-matches", - json.array(exact_type_searches, queries.type_search_to_json), - ), - #("exact-matches", json.array(exact_matches, queries.type_search_to_json)), - #("matches", json.array(matches, queries.type_search_to_json)), - #("searches", json.array(signature_searches, queries.type_search_to_json)), + #("exact-type-matches", json.array(exact_type_searches, type_search.encode)), + #("exact-matches", json.array(exact_matches, type_search.encode)), + #("matches", json.array(matches, type_search.encode)), + #("searches", json.array(signature_searches, type_search.encode)), #("docs-searches", { - json.array(documentation_searches, queries.type_search_to_json) + json.array(documentation_searches, type_search.encode) }), - #("module-searches", { - json.array(module_searches, queries.type_search_to_json) - }), - ]) -} - -fn encode_package(package: #(String, String, Int, option.Option(Int))) { - let #(name, repository, rank, popularity) = package - json.object([ - #("name", json.string(name)), - #("repository", json.string(repository)), - #("rank", json.int(rank)), - #("popularity", json.nullable(popularity, json.int)), + #("module-searches", { json.array(module_searches, type_search.encode) }), ]) } @@ -141,8 +128,8 @@ pub fn handle_get(req: Request, ctx: Context) { ["packages"] -> queries.select_package_by_updated_at(ctx.db) |> result.unwrap([]) - |> json.preprocessed_array - |> json.to_string_builder + |> json.array(package.encode) + |> json.to_string_tree |> wisp.json_response(200) ["trendings"] -> wisp.get_query(req) @@ -153,44 +140,36 @@ pub fn handle_get(req: Request, ctx: Context) { |> queries.select_package_by_popularity(ctx.db, _) |> result.map(fn(content) { content - |> json.preprocessed_array() - |> json.to_string_builder() + |> json.array(package.encode) + |> json.to_string_tree |> wisp.json_response(200) }) |> result.unwrap(wisp.internal_server_error()) ["analytics"] -> { { use timeseries <- result.try(queries.get_timeseries_count(ctx.db)) - use total <- result.try(queries.get_total_searches(ctx.db)) + use total_searches <- result.try(queries.get_total_searches(ctx.db)) use signatures <- result.try(queries.get_total_signatures(ctx.db)) use packages <- result.try(queries.get_total_packages(ctx.db)) use #(ranked, popular) <- result.try({ queries.select_more_popular_packages(ctx.db) }) - let total = list.first(total) |> result.unwrap(0) - let signatures = list.first(signatures) |> result.unwrap(0) - let packages = list.first(packages) |> result.unwrap(0) - Ok(#(timeseries, total, signatures, packages, ranked, popular)) + let total_searches = list.first(total_searches) |> result.unwrap(0) + let total_signatures = list.first(signatures) |> result.unwrap(0) + let total_indexed = list.first(packages) |> result.unwrap(0) + Ok(analytics.Analytics( + timeseries:, + total_searches:, + total_signatures:, + total_indexed:, + ranked:, + popular:, + )) } |> result.map(fn(content) { - let #(timeseries, total, signatures, packages, ranked, popular) = - content - json.object([ - #("total", json.int(total)), - #("signatures", json.int(signatures)), - #("packages", json.int(packages)), - #("ranked", json.array(ranked, encode_package)), - #("popular", json.array(popular, encode_package)), - #("timeseries", { - json.array(timeseries, fn(row) { - json.object([ - #("count", json.int(row.0)), - #("date", json.string(birl.to_iso8601(row.1))), - ]) - }) - }), - ]) - |> json.to_string_builder + content + |> analytics.encode + |> json.to_string_tree |> wisp.json_response(200) }) |> result.map_error(error.debug_log) @@ -202,7 +181,7 @@ pub fn handle_get(req: Request, ctx: Context) { |> result.replace_error(error.EmptyError) |> result.map(fn(item) { search(item.1, ctx) }) |> result.unwrap(json.object([#("error", json.string("internal"))])) - |> json.to_string_builder() + |> json.to_string_tree |> wisp.json_response(200) } _ -> wisp.not_found() diff --git a/apps/frontend/gleam.toml b/apps/frontend/gleam.toml index 7002d5a..67e8da5 100644 --- a/apps/frontend/gleam.toml +++ b/apps/frontend/gleam.toml @@ -10,19 +10,20 @@ typescript_declarations = true [dependencies] birl = ">= 1.7.1 and < 2.0.0" -bright = ">= 0.1.0 and < 1.0.0" +bright = {path = "../../packages/bright"} +gleam_fetch = ">= 0.4.0 and < 1.0.0" +gleam_http = ">= 3.7.1 and < 4.0.0" gleam_javascript = ">= 0.13.0 and < 1.0.0" -gleam_json = ">= 1.0.1 and < 2.0.0" +gleam_json = ">= 2.1.0 and < 3.0.0" gleam_regexp = ">= 1.0.0 and < 2.0.0" gleam_stdlib = "~> 0.34 or ~> 1.0" +grille_pain = ">= 1.1.0 and < 2.0.0" +interfaces = {path = "../../packages/interfaces"} lustre = ">= 4.6.1 and < 5.0.0" modem = ">= 2.0.0 and < 3.0.0" sketch = ">= 3.0.0 and < 4.0.0" sketch_magic = {path = "../../packages/sketch_magic"} vitools = {path = "../../packages/vitools"} -grille_pain = ">= 1.1.0 and < 2.0.0" -gleam_fetch = ">= 0.4.0 and < 1.0.0" -gleam_http = ">= 3.7.1 and < 4.0.0" [dev-dependencies] gleeunit = "~> 1.0" diff --git a/apps/frontend/manifest.toml b/apps/frontend/manifest.toml index 485b88e..495dcfb 100644 --- a/apps/frontend/manifest.toml +++ b/apps/frontend/manifest.toml @@ -4,7 +4,7 @@ packages = [ { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, - { name = "bright", version = "0.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "lustre_dev_tools"], otp_app = "bright", source = "hex", outer_checksum = "4E3044561BDDC3349E2D8A4B08D43C1D50EEC86EF686F2A141F2E06CFD3D3544" }, + { name = "bright", version = "0.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "lustre_dev_tools"], source = "local", path = "../../packages/bright" }, { name = "conversation", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "conversation", source = "hex", outer_checksum = "908B46F60444442785A495197D482558AD8B849C3714A38FAA1940358CC8CCCD" }, { name = "directories", version = "1.1.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "BDA521A4EB9EE3A7894F0DC863797878E91FF5C7826F7084B2E731E208BDB076" }, { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" }, @@ -19,7 +19,7 @@ packages = [ { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, { name = "gleam_httpc", version = "4.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "76FEEC99473E568EBA34336A37CF3D54629ACE77712950DC9BB097B5FD664664" }, { name = "gleam_javascript", version = "0.13.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "F98328FCF573DA6F3A35D7F6CB3F9FF19FD5224CCBA9151FCBEAA0B983AF2F58" }, - { name = "gleam_json", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "9063D14D25406326C0255BDA0021541E797D8A7A12573D849462CAFED459F6EB" }, + { name = "gleam_json", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "0A57FB5666E695FD2BEE74C0428A98B0FC11A395D2C7B4CDF5E22C5DD32C74C6" }, { name = "gleam_otp", version = "0.14.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "5A8CE8DBD01C29403390A7BD5C0A63D26F865C83173CF9708E6E827E53159C65" }, { name = "gleam_package_interface", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "CF3BFC5D0997750D9550D8D73A90F4B8D71C6C081B20ED4E70FFBE1E99AFC3C2" }, { name = "gleam_regexp", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "A3655FDD288571E90EE9C4009B719FEF59FA16AFCDF3952A76A125AF23CF1592" }, @@ -31,6 +31,7 @@ packages = [ { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, { name = "grille_pain", version = "1.1.0", build_tools = ["gleam"], requirements = ["birl", "gleam_stdlib", "lustre", "plinth", "sketch", "sketch_lustre"], otp_app = "grille_pain", source = "hex", outer_checksum = "718CB2468EF77EDECE148A98948EF8CC376D3CB96ACCE4983BC6C2F43A254D45" }, { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, + { name = "interfaces", version = "1.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_json", "gleam_stdlib"], source = "local", path = "../../packages/interfaces" }, { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, { name = "lustre", version = "4.6.3", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "BDF833368F6C8F152F948D5B6A79866E9881CB80CB66C0685B3327E7DCBFB12F" }, { name = "lustre_dev_tools", version = "1.6.2", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_regexp", "gleam_stdlib", "glint", "glisten", "lustre", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "A0CBC323AA7E03EC91D785CEB644776082D76BE46F1624FB920BB92BD79853F7" }, @@ -49,7 +50,6 @@ packages = [ { name = "spinner", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "9EE43AA33BE2DA5731B8F3F170AAB59AF1A815AFA5BF615F12C1B91F3B03F157" }, { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, - { name = "thoas", version = "1.2.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "E38697EDFFD6E91BD12CEA41B155115282630075C2A727E7A6B2947F5408B86A" }, { name = "tom", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "228E667239504B57AD05EC3C332C930391592F6C974D0EFECF32FFD0F3629A27" }, { name = "vitools", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], source = "local", path = "../../packages/vitools" }, { name = "wisp", version = "1.3.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "D12384EE63ADEE833B40A6D26EF8014A6E4BFC10EC2CDC8B57D325DD4B52740E" }, @@ -57,15 +57,16 @@ packages = [ [requirements] birl = { version = ">= 1.7.1 and < 2.0.0" } -bright = { version = ">= 0.1.0 and < 1.0.0" } +bright = { path = "../../packages/bright" } gleam_fetch = { version = ">= 0.4.0 and < 1.0.0" } gleam_http = { version = ">= 3.7.1 and < 4.0.0" } gleam_javascript = { version = ">= 0.13.0 and < 1.0.0" } -gleam_json = { version = ">= 1.0.1 and < 2.0.0" } +gleam_json = { version = ">= 2.1.0 and < 3.0.0" } gleam_regexp = { version = ">= 1.0.0 and < 2.0.0" } gleam_stdlib = { version = "~> 0.34 or ~> 1.0" } gleeunit = { version = "~> 1.0" } grille_pain = { version = ">= 1.1.0 and < 2.0.0" } +interfaces = { path = "../../packages/interfaces" } lustre = { version = ">= 4.6.1 and < 5.0.0" } modem = { version = ">= 2.0.0 and < 3.0.0" } sketch = { version = ">= 3.0.0 and < 4.0.0" } diff --git a/apps/frontend/src/data/metadata.gleam b/apps/frontend/src/data/metadata.gleam deleted file mode 100644 index ebff845..0000000 --- a/apps/frontend/src/data/metadata.gleam +++ /dev/null @@ -1,27 +0,0 @@ -import data/implementations.{type Implementations, Implementations} -import gleam/decoder_extra -import gleam/dynamic -import gleam/option.{type Option} - -pub type Metadata { - Metadata( - deprecation: Option(String), - implementations: Option(Implementations), - ) -} - -pub fn decode_metadata(dyn) { - dynamic.decode2( - Metadata, - decoder_extra.completely_option("deprecation"), - dynamic.optional_field( - "implementations", - dynamic.decode3( - Implementations, - dynamic.field("gleam", dynamic.bool), - dynamic.field("uses_erlang_externals", dynamic.bool), - dynamic.field("uses_javascript_externals", dynamic.bool), - ), - ), - )(dyn) -} diff --git a/apps/frontend/src/data/model.gleam b/apps/frontend/src/data/model.gleam index 791067b..13faa2f 100644 --- a/apps/frontend/src/data/model.gleam +++ b/apps/frontend/src/data/model.gleam @@ -1,8 +1,11 @@ import birl +import bright +import data/analytics import data/kind import data/msg.{type Msg} import data/package.{type Package} -import data/search_result.{type SearchResult, type SearchResults} +import data/search_result.{type SearchResults, SearchResults} +import data/type_search.{type TypeSearch} import frontend/router import frontend/view/body/cache import gleam/dict.{type Dict} @@ -18,8 +21,11 @@ import lustre/element.{type Element} pub type Index = List(#(#(String, String), List(#(String, String)))) -pub type Model { - Model( +pub type Model = + bright.Bright(Data, Computed) + +pub type Data { + Data( input: String, search_results: Dict(String, SearchResults), index: Index, @@ -41,18 +47,22 @@ pub type Model { total_signatures: Int, total_packages: Int, timeseries: List(#(Int, birl.Time)), - ranked: List(msg.Package), - popular: List(msg.Package), + ranked: List(analytics.Package), + popular: List(analytics.Package), ) } +pub type Computed { + Computed +} + @external(javascript, "../gloogle.ffi.mjs", "isMobile") fn is_mobile() -> Bool -pub fn init() { +pub fn init_data() { let search_results = search_result.Start let index = compute_index(search_results) - Model( + Data( input: "", search_results: dict.new(), index: index, @@ -79,36 +89,36 @@ pub fn init() { ) } -pub fn update_route(model: Model, route: router.Route) { - Model(..model, route: route) +pub fn update_route(model: Data, route: router.Route) { + Data(..model, route: route) } -pub fn update_submitted_input(model: Model) { - Model(..model, submitted_input: model.input) +pub fn update_submitted_input(model: Data) { + Data(..model, submitted_input: model.input) } -pub fn update_is_mobile(model: Model, is_mobile: Bool) { - Model(..model, is_mobile: is_mobile) +pub fn update_is_mobile(model: Data, is_mobile: Bool) { + Data(..model, is_mobile: is_mobile) } -pub fn update_trendings(model: Model, trendings: List(Package)) { +pub fn update_trendings(model: Data, trendings: List(Package)) { model.trendings |> option.unwrap([]) |> list.append(trendings) |> option.Some - |> fn(t) { Model(..model, trendings: t) } + |> fn(t) { Data(..model, trendings: t) } } -pub fn toggle_loading(model: Model) { - Model(..model, loading: !model.loading) +pub fn toggle_loading(model: Data) { + Data(..model, loading: !model.loading) } -pub fn update_input(model: Model, content: String) { - Model(..model, input: content) +pub fn update_input(model: Data, content: String) { + Data(..model, input: content) } -pub fn update_analytics(model: Model, analytics: msg.Analytics) { - Model( +pub fn update_analytics(model: Data, analytics: analytics.Analytics) { + Data( ..model, timeseries: analytics.timeseries, total_searches: analytics.total_searches, @@ -119,7 +129,7 @@ pub fn update_analytics(model: Model, analytics: msg.Analytics) { ) } -pub fn search_key(key key: String, model model: Model) { +pub fn search_key(key key: String, model model: Data) { key <> string.inspect([ model.keep_functions, @@ -137,7 +147,7 @@ fn default_search_key(key key: String) { } pub fn update_search_results( - model: Model, + model: Data, key: String, search_results: SearchResults, ) { @@ -145,7 +155,7 @@ pub fn update_search_results( let index = compute_index(search_results) let view_cache = case search_results { search_result.Start | search_result.InternalServerError -> model.view_cache - search_result.SearchResults(types, e, m, s, d, mods) -> + SearchResults(types, e, m, s, d, mods) -> cache.cache_search_results( model.submitted_input, index, @@ -158,7 +168,7 @@ pub fn update_search_results( ) |> dict.insert(model.view_cache, key, _) } - Model( + Data( ..model, search_results: dict.insert(model.search_results, key, search_results), index: index, @@ -186,7 +196,7 @@ fn is_higher(new: List(Int), old: List(Int)) { fn extract_package_version( acc: Dict(String, String), - search_result: search_result.SearchResult, + search_result: TypeSearch, ) -> Dict(String, String) { let assert Ok(re) = regexp.from_string("^[0-9]*.[0-9]*.[0-9]*$") case regexp.check(re, search_result.version) { @@ -218,7 +228,7 @@ fn extract_package_version( } } -pub fn update_search_results_filter(model: Model) { +pub fn update_search_results_filter(model: Data) { let default_key = default_search_key(model.submitted_input) let show_old = case model.show_old_packages { True -> fn(_) { True } @@ -229,7 +239,7 @@ pub fn update_search_results_filter(model: Model) { case search_results { search_result.Start | search_result.InternalServerError -> dict.new() - search_result.SearchResults(t, e, m, s, d, mods) -> { + SearchResults(t, e, m, s, d, mods) -> { dict.new() |> list.fold(t, _, extract_package_version) |> list.fold(e, _, extract_package_version) @@ -241,7 +251,7 @@ pub fn update_search_results_filter(model: Model) { } } } - fn(a: search_result.SearchResult) { + fn(a: TypeSearch) { case dict.get(last_versions, a.package_name) { Error(_) -> False Ok(content) -> content == a.version @@ -251,21 +261,21 @@ pub fn update_search_results_filter(model: Model) { } let or_filters = [ - #(model.keep_functions, fn(s: search_result.SearchResult) { - s.kind == kind.Function + #(model.keep_functions, fn(s: TypeSearch) { + s.signature_kind == kind.Function }), - #(model.keep_types, fn(s: search_result.SearchResult) { - s.kind == kind.TypeDefinition + #(model.keep_types, fn(s: TypeSearch) { + s.signature_kind == kind.TypeDefinition }), - #(model.keep_aliases, fn(s: search_result.SearchResult) { - s.kind == kind.TypeAlias + #(model.keep_aliases, fn(s: TypeSearch) { + s.signature_kind == kind.TypeAlias }), ] |> list.filter(fn(a) { a.0 }) |> list.map(pair.second) let and_filters = [ - #(model.keep_documented, fn(s: search_result.SearchResult) { + #(model.keep_documented, fn(s: TypeSearch) { string.length(s.documentation) > 0 }), ] @@ -289,8 +299,8 @@ pub fn update_search_results_filter(model: Model) { let search_results = case search_results { search_result.Start | search_result.InternalServerError -> search_results - search_result.SearchResults(t, e, m, s, d, mods) -> - search_result.SearchResults( + SearchResults(t, e, m, s, d, mods) -> + SearchResults( t |> list.filter(filter), e |> list.filter(filter), m |> list.filter(filter), @@ -309,7 +319,7 @@ pub fn update_search_results_filter(model: Model) { let view_cache = case search_results { search_result.Start | search_result.InternalServerError -> model.view_cache - search_result.SearchResults(types, e, m, s, d, mods) -> + SearchResults(types, e, m, s, d, mods) -> cache.cache_search_results( model.submitted_input, index, @@ -322,7 +332,7 @@ pub fn update_search_results_filter(model: Model) { ) |> dict.insert(model.view_cache, key, _) } - Model( + Data( ..model, search_results: dict.insert(model.search_results, key, search_results), index: index, @@ -332,8 +342,8 @@ pub fn update_search_results_filter(model: Model) { } } -pub fn reset(model: Model) { - Model( +pub fn reset(model: Data) { + Data( search_results: model.search_results, input: "", index: [], @@ -363,7 +373,7 @@ pub fn reset(model: Model) { fn compute_index(search_results: SearchResults) -> Index { case search_results { search_result.Start | search_result.InternalServerError -> [] - search_result.SearchResults(types, exact, others, searches, docs, modules) -> { + SearchResults(types, exact, others, searches, docs, modules) -> { [] |> insert_module_names(types) |> insert_module_names(exact) @@ -376,11 +386,11 @@ fn compute_index(search_results: SearchResults) -> Index { } } -fn insert_module_names(index: Index, search_results: List(SearchResult)) { +fn insert_module_names(index: Index, search_results: List(TypeSearch)) { use acc, val <- list.fold(search_results, index) let key = #(val.package_name, val.version) list.key_find(acc, key) |> result.unwrap([]) - |> fn(i) { list.prepend(i, #(val.module_name, val.name)) } + |> fn(i) { list.prepend(i, #(val.module_name, val.type_name)) } |> fn(i) { list.key_set(acc, key, i) } } diff --git a/apps/frontend/src/data/msg.gleam b/apps/frontend/src/data/msg.gleam index 8581ac1..4136bf3 100644 --- a/apps/frontend/src/data/msg.gleam +++ b/apps/frontend/src/data/msg.gleam @@ -1,10 +1,9 @@ -import birl +import data/analytics import data/package import data/search_result.{type SearchResults} import frontend/discuss import frontend/router import gleam/dynamic.{type Dynamic} -import gleam/option pub type Filter { Functions @@ -16,28 +15,8 @@ pub type Filter { VectorSearch } -pub type Package { - Package( - name: String, - repository: String, - rank: Int, - popularity: option.Option(Int), - ) -} - -pub type Analytics { - Analytics( - total_searches: Int, - total_signatures: Int, - total_indexed: Int, - timeseries: List(#(Int, birl.Time)), - ranked: List(Package), - popular: List(Package), - ) -} - pub type Msg { - ApiReturnedAnalytics(analytics: Analytics) + ApiReturnedAnalytics(analytics: analytics.Analytics) ApiReturnedPackages(packages: List(package.Package)) ApiReturnedSearchResults(input: String, search_results: SearchResults) ApiReturnedTrendings(trendings: List(package.Package)) diff --git a/apps/frontend/src/data/search_result.gleam b/apps/frontend/src/data/search_result.gleam index 82f487f..d5da578 100644 --- a/apps/frontend/src/data/search_result.gleam +++ b/apps/frontend/src/data/search_result.gleam @@ -1,58 +1,22 @@ -import data/kind.{type Kind} -import data/metadata.{type Metadata} -import data/signature.{type Signature} +import data/type_search.{type TypeSearch} import frontend/view/helpers import gleam/dynamic -import gleam/list -import gleam/option.{None, Some} -import gleam/result - -pub type SearchResult { - SearchResult( - documentation: String, - module_name: String, - name: String, - kind: Kind, - package_name: String, - json_signature: Signature, - metadata: Metadata, - version: String, - ) -} pub type SearchResults { Start InternalServerError SearchResults( - exact_type_matches: List(SearchResult), - exact_name_matches: List(SearchResult), - name_signature_matches: List(SearchResult), - vector_signature_searches: List(SearchResult), - docs_searches: List(SearchResult), - module_searches: List(SearchResult), + exact_type_matches: List(TypeSearch), + exact_name_matches: List(TypeSearch), + name_signature_matches: List(TypeSearch), + vector_signature_searches: List(TypeSearch), + docs_searches: List(TypeSearch), + module_searches: List(TypeSearch), ) } -pub fn decode_search_result(dyn) { - dynamic.decode8( - SearchResult, - dynamic.field("documentation", dynamic.string), - dynamic.field("module_name", dynamic.string), - dynamic.field("name", dynamic.string), - dynamic.field("kind", kind.decode_kind), - dynamic.field("package_name", dynamic.string), - dynamic.field("json_signature", signature.decode_signature), - dynamic.field("metadata", metadata.decode_metadata), - dynamic.field("version", dynamic.string), - )(dyn) - |> result.map(Some) - |> result.try_recover(fn(_) { Ok(None) }) -} - pub fn decode_search_results_list(dyn) { - use data <- result.map(dynamic.list(decode_search_result)(dyn)) - use item <- list.filter_map(data) - option.to_result(item, "") + dynamic.list(type_search.decode)(dyn) } pub fn decode_search_results(dyn) { @@ -72,11 +36,11 @@ pub fn decode_search_results(dyn) { ])(dyn) } -pub fn hexdocs_link(search_result: SearchResult) { +pub fn hexdocs_link(search_result: TypeSearch) { helpers.hexdocs_link( package: search_result.package_name, version: search_result.version, module: search_result.module_name, - name: search_result.name, + name: search_result.type_name, ) } diff --git a/apps/frontend/src/frontend.gleam b/apps/frontend/src/frontend.gleam index fe86bad..2521dc2 100644 --- a/apps/frontend/src/frontend.gleam +++ b/apps/frontend/src/frontend.gleam @@ -1,298 +1,145 @@ -import birl +import bright +import data/analytics import data/model.{type Model} import data/msg.{type Msg} import data/package -import data/search_result import frontend/discuss -import frontend/errors -import frontend/ffi +import frontend/effects/window import frontend/router +import frontend/update import frontend/view import frontend/view/body/search_result as sr -import gleam/bool -import gleam/dict -import gleam/dynamic.{type Dynamic} -import gleam/option.{None, Some} -import gleam/pair +import gleam/dynamic + import gleam/result -import gleam/uri.{type Uri} + import grille_pain -import grille_pain/lustre/toast + import grille_pain/options import lustre import lustre/effect -import lustre/event import lustre/lazy -import lustre/update import modem import sketch import sketch/magic -import toast/error as toast_error -fn focus(on id: String, event event: Dynamic) { - use _ <- effect.from() - use <- bool.guard(when: ffi.is_active(id), return: Nil) - event.prevent_default(event) - ffi.focus(on: id, event: event) -} - -fn blur() { - use _ <- effect.from() - ffi.blur() +pub fn main() { + let assert Ok(_) = setup_sketch() + let assert Ok(_) = setup_components() + let assert Ok(_) = setup_grille_pain() + let assert Ok(_) = start_application() } -fn subscribe_focus() { - use dispatch <- effect.from() - use event <- ffi.subscribe_focus() - case ffi.key(event) { - Ok("Escape") -> dispatch(msg.UserPressedEscape) - _ -> dispatch(msg.UserFocusedSearch(event)) - } +fn setup_sketch() { + use cache <- result.try(sketch.cache(strategy: sketch.Ephemeral)) + use _ <- result.try(magic.setup(cache)) + Ok(Nil) } -fn subscribe_is_mobile() { - use dispatch <- effect.from() - use is_mobile <- ffi.suscribe_is_mobile() - dispatch(msg.BrowserResizedViewport(is_mobile)) +fn setup_components() { + use _ <- result.try(lazy.setup()) + use _ <- result.try(sr.setup()) + Ok(Nil) } -pub fn main() { - let assert Ok(cache) = sketch.cache(strategy: sketch.Ephemeral) - let assert Ok(_) = magic.setup(cache) - let assert Ok(_) = lazy.setup() - let assert Ok(_) = sr.setup() - let assert Ok(_) = - options.default() - |> options.timeout(5000) - |> grille_pain.setup() - - let assert Ok(_) = - lustre.application(init, update, view.view) - |> lustre.start("#app", Nil) +fn setup_grille_pain() { + options.default() + |> options.timeout(5000) + |> grille_pain.setup() } -fn decode_package(dyn) { - dynamic.decode4( - msg.Package, - dynamic.field("name", dynamic.string), - dynamic.field("repository", dynamic.string), - dynamic.field("rank", dynamic.int), - dynamic.field("popularity", dynamic.optional(dynamic.int)), - )(dyn) +fn start_application() { + lustre.application(init, update, view.view) + |> lustre.start("#app", Nil) } -fn init(_) { - let initial = - modem.initial_uri() - |> result.map(router.parse_uri) - |> result.unwrap(router.Home) - |> handle_changed_route(model.init(), _) - handle_submitted_search(initial.0) - |> update.add_effect(modem.init(on_url_change)) - |> update.add_effect(router.update_page_title({ initial.0 }.route)) - |> update.add_effect(subscribe_focus()) - |> update.add_effect(subscribe_is_mobile()) - |> update.add_effect({ - use dispatch <- effect.from - discuss.about(["trendings"]) - |> discuss.expect(dynamic.list(package.decoder)) - |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedTrendings(m)) }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil - }) - |> update.add_effect({ - use dispatch <- effect.from - discuss.about(["packages"]) - |> discuss.expect(dynamic.list(package.decoder)) - |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedPackages(m)) }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil - }) - |> update.add_effect({ - use dispatch <- effect.from - discuss.about(["analytics"]) - |> discuss.expect(dynamic.decode6( - msg.Analytics, - dynamic.field("total", dynamic.int), - dynamic.field("signatures", dynamic.int), - dynamic.field("packages", dynamic.int), - dynamic.field("timeseries", { - dynamic.list(dynamic.decode2( - pair.new, - dynamic.field("count", dynamic.int), - dynamic.field("date", fn(dyn) { - dynamic.string(dyn) - |> result.then(fn(t) { - birl.parse(t) - |> result.replace_error([]) - }) - }), - )) - }), - dynamic.field("ranked", dynamic.list(decode_package)), - dynamic.field("popular", dynamic.list(decode_package)), - )) - |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedAnalytics(m)) }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil - }) +fn get_initial_uri() { + modem.initial_uri() + |> result.map(router.parse_uri) + |> result.unwrap(router.Home) } -fn on_url_change(uri: Uri) -> Msg { +fn init_modem() { + use uri <- modem.init router.parse_uri(uri) |> msg.BrowserChangedRoute } -fn update(model: Model, msg: Msg) { +fn get_trendings() { + use dispatch <- effect.from + discuss.about(["trendings"]) + |> discuss.expect(dynamic.list(package.decode)) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedTrendings(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil +} + +fn get_packages() { + use dispatch <- effect.from + discuss.about(["packages"]) + |> discuss.expect(dynamic.list(package.decode)) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedPackages(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil +} + +fn get_analytics() { + use dispatch <- effect.from + discuss.about(["analytics"]) + |> discuss.expect(analytics.decode) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedAnalytics(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil +} + +fn init(_) -> #(Model, effect.Effect(Msg)) { + let uri = get_initial_uri() + let model = bright.init(model.init_data(), model.Computed) + use model <- bright.start(model) + use model <- bright.update(model, update.handle_changed_route(_, uri)) + use model <- bright.update(model, update.handle_submitted_search) + model + |> bright.run(fn(_, _) { init_modem() }) + |> bright.run(fn(data, _) { router.update_page_title(data.route) }) + |> bright.run(fn(_, _) { window.subscribe_focus() }) + |> bright.run(fn(_, _) { window.subscribe_is_mobile() }) + |> bright.run(fn(_, _) { get_trendings() }) + |> bright.run(fn(_, _) { get_packages() }) + |> bright.run(fn(_, _) { get_analytics() }) +} + +fn update(model: Model, msg: Msg) -> #(Model, effect.Effect(Msg)) { + use model <- bright.start(model) + use model <- bright.update(model, update_data(_, msg)) + model +} + +fn update_data(model: model.Data, msg: Msg) { case msg { - msg.ApiReturnedAnalytics(analytics:) -> handle_analytics(model, analytics) - msg.ApiReturnedPackages(packages:) -> handle_packages(model, packages) + msg.ApiReturnedAnalytics(analytics:) -> + update.handle_analytics(model, analytics) + msg.ApiReturnedPackages(packages:) -> + update.handle_packages(model, packages) msg.ApiReturnedSearchResults(input:, search_results:) -> - handle_search_results(model, input, search_results) - msg.ApiReturnedTrendings(trendings:) -> handle_trendings(model, trendings) + update.handle_search_results(model, input, search_results) + msg.ApiReturnedTrendings(trendings:) -> + update.handle_trendings(model, trendings) msg.AppRequiredDiscussToast(message:) -> - handle_discuss_toast(model, message) - msg.BrowserChangedRoute(route:) -> handle_changed_route(model, route) + update.handle_discuss_toast(model, message) + msg.BrowserChangedRoute(route:) -> update.handle_changed_route(model, route) msg.BrowserResizedViewport(is_mobile:) -> - handle_resized_viewport(model, is_mobile) - msg.UserClickedSidebarName(id:) -> handle_clicked_sidebar_name(model, id) - msg.UserFocusedSearch(event:) -> handle_focused_search(model, event) - msg.UserInputtedSearch(query:) -> handle_inputted_search(model, query) - msg.UserPressedEscape -> handle_pressed_escape(model) - msg.UserSubmittedSearch -> handle_submitted_search(model) + update.handle_resized_viewport(model, is_mobile) + msg.UserClickedSidebarName(id:) -> + update.handle_clicked_sidebar_name(model, id) + msg.UserFocusedSearch(event:) -> update.handle_focused_search(model, event) + msg.UserInputtedSearch(query:) -> + update.handle_inputted_search(model, query) + msg.UserPressedEscape -> update.handle_pressed_escape(model) + msg.UserSubmittedSearch -> update.handle_submitted_search(model) msg.UserToggledFilter(filter:, value:) -> - handle_toggle_filter(model, filter, value) - } -} - -fn handle_analytics(model: Model, analytics: msg.Analytics) { - model - |> model.update_analytics(analytics) - |> update.none -} - -fn handle_packages(model: Model, packages: List(package.Package)) { - model.Model(..model, packages:) - |> pair.new(effect.none()) -} - -fn handle_search_results( - model: Model, - input: String, - search_results: search_result.SearchResults, -) { - search_results - |> model.update_search_results(model, input, _) - |> model.toggle_loading - |> update.effect(modem.push("/search", Some("q=" <> input), None)) -} - -fn handle_trendings(model: Model, trendings: List(package.Package)) { - trendings - |> model.update_trendings(model, _) - |> update.none -} - -fn handle_discuss_toast(model: Model, message: discuss.DiscussError) { - message - |> toast_error.describe_http_error - |> option.map(errors.capture_message) - |> option.map(toast.error) - |> option.unwrap(effect.none()) - |> pair.new(model, _) -} - -fn handle_changed_route(model: Model, route: router.Route) { - let model = model.update_route(model, route) - case route { - router.Home -> model.update_input(model, "") - router.Packages -> model.update_input(model, "") - router.Trending -> model.update_input(model, "") - router.Analytics -> model.update_input(model, "") - router.Search(q) -> - model.update_input(model, q) - |> model.update_submitted_input - } - |> pair.new(router.update_page_title(route)) -} - -fn handle_resized_viewport(model: Model, is_mobile: Bool) { - model - |> model.update_is_mobile(is_mobile) - |> pair.new(effect.none()) -} - -fn handle_clicked_sidebar_name(model: Model, id: String) { - ffi.scroll_to(element: id) - |> effect.from - |> update.effect(model, _) -} - -fn handle_focused_search(model: Model, event: Dynamic) { - #(model, focus(on: "search-input", event: event)) -} - -fn handle_inputted_search(model: Model, content: String) { - model - |> model.update_input(content) - |> update.none -} - -fn handle_pressed_escape(model: Model) { - #(model, blur()) -} - -fn handle_submitted_search(model: Model) { - use <- bool.guard(when: model.input == "", return: #(model, effect.none())) - use <- bool.guard(when: model.loading, return: #(model, effect.none())) - let new_model = model.update_submitted_input(model) - case dict.get(new_model.search_results, new_model.submitted_input) { - Ok(_) -> { - let new_route = router.Search(new_model.submitted_input) - let is_same_route = new_model.route == new_route - use <- bool.guard(when: is_same_route, return: update.none(new_model)) - new_model - |> update.effect({ - Some("q=" <> new_model.submitted_input) - |> modem.push("search", _, None) - }) - |> update.add_effect(blur()) - } - Error(_) -> { - model.toggle_loading(new_model) - |> pair.new({ - use dispatch <- effect.from - discuss.about(["search"]) - |> discuss.query([#("q", model.input)]) - |> discuss.expect(search_result.decode_search_results) - |> discuss.on_success(fn(search_results) { - model.input - |> msg.ApiReturnedSearchResults(input: _, search_results:) - |> dispatch - }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil - }) - |> update.add_effect(blur()) - } - } -} - -fn handle_toggle_filter(model, filter, value) { - case filter, value { - msg.Functions, value -> model.Model(..model, keep_functions: value) - msg.Types, value -> model.Model(..model, keep_types: value) - msg.Aliases, value -> model.Model(..model, keep_aliases: value) - msg.Documented, value -> model.Model(..model, keep_documented: value) - msg.ShowOldPackages, value -> model.Model(..model, show_old_packages: value) - msg.VectorSearch, value -> model.Model(..model, show_vector_search: value) - msg.DocumentationSearch, value -> - model.Model(..model, show_documentation_search: value) + update.handle_toggle_filter(model, filter, value) } - |> model.update_search_results_filter - |> update.none } diff --git a/apps/frontend/src/frontend/discuss.gleam b/apps/frontend/src/frontend/discuss.gleam index 3a6c62a..35e74f3 100644 --- a/apps/frontend/src/frontend/discuss.gleam +++ b/apps/frontend/src/frontend/discuss.gleam @@ -4,7 +4,6 @@ import gleam/fetch import gleam/http import gleam/http/request import gleam/http/response -import gleam/io import gleam/javascript/promise import gleam/list import gleam/result diff --git a/apps/frontend/src/frontend/effects/window.gleam b/apps/frontend/src/frontend/effects/window.gleam new file mode 100644 index 0000000..a6fc78b --- /dev/null +++ b/apps/frontend/src/frontend/effects/window.gleam @@ -0,0 +1,52 @@ +import data/msg +import gleam/bool +import gleam/dynamic.{type Dynamic} +import lustre/effect +import lustre/event + +pub fn focus(on id: String, event event: Dynamic) { + use _ <- effect.from() + use <- bool.guard(when: do_is_active(id), return: Nil) + event.prevent_default(event) + do_focus(on: id, event: event) +} + +pub fn blur() { + use _ <- effect.from() + do_blur() +} + +pub fn subscribe_focus() { + use dispatch <- effect.from() + use event <- do_subscribe_focus() + case do_key(event) { + Ok("Escape") -> dispatch(msg.UserPressedEscape) + _ -> dispatch(msg.UserFocusedSearch(event)) + } +} + +pub fn subscribe_is_mobile() { + use dispatch <- effect.from() + use is_mobile <- do_suscribe_is_mobile() + dispatch(msg.BrowserResizedViewport(is_mobile)) +} + +// FFI + +@external(javascript, "../../gloogle.ffi.mjs", "subscribeFocus") +fn do_subscribe_focus(callback: fn(Dynamic) -> Nil) -> Nil + +@external(javascript, "../../gloogle.ffi.mjs", "subscribeIsMobile") +fn do_suscribe_is_mobile(callback: fn(Bool) -> Nil) -> Nil + +@external(javascript, "../../gloogle.ffi.mjs", "focus") +fn do_focus(on id: String, event event: a) -> Nil + +@external(javascript, "../../gloogle.ffi.mjs", "isActive") +fn do_is_active(element id: String) -> Bool + +@external(javascript, "../../gloogle.ffi.mjs", "eventKey") +fn do_key(event: Dynamic) -> Result(String, Nil) + +@external(javascript, "../../gloogle.ffi.mjs", "blur") +fn do_blur() -> Nil diff --git a/apps/frontend/src/frontend/ffi.gleam b/apps/frontend/src/frontend/ffi.gleam index 0a567a5..bb68297 100644 --- a/apps/frontend/src/frontend/ffi.gleam +++ b/apps/frontend/src/frontend/ffi.gleam @@ -1,25 +1,5 @@ -import gleam/dynamic.{type Dynamic} - @external(javascript, "../gloogle.ffi.mjs", "scrollTo") pub fn scroll_to(element id: String) -> fn(dispatch) -> Nil -@external(javascript, "../gloogle.ffi.mjs", "subscribeIsMobile") -pub fn suscribe_is_mobile(callback: fn(Bool) -> Nil) -> Nil - -@external(javascript, "../gloogle.ffi.mjs", "subscribeFocus") -pub fn subscribe_focus(callback: fn(Dynamic) -> Nil) -> Nil - -@external(javascript, "../gloogle.ffi.mjs", "focus") -pub fn focus(on id: String, event event: a) -> Nil - -@external(javascript, "../gloogle.ffi.mjs", "isActive") -pub fn is_active(element id: String) -> Bool - -@external(javascript, "../gloogle.ffi.mjs", "blur") -pub fn blur() -> Nil - @external(javascript, "../gloogle.ffi.mjs", "updateTitle") pub fn update_title(title: String) -> Nil - -@external(javascript, "../gloogle.ffi.mjs", "eventKey") -pub fn key(event: Dynamic) -> Result(String, Nil) diff --git a/apps/frontend/src/frontend/update.gleam b/apps/frontend/src/frontend/update.gleam new file mode 100644 index 0000000..400657f --- /dev/null +++ b/apps/frontend/src/frontend/update.gleam @@ -0,0 +1,149 @@ +import data/analytics +import data/model.{type Data} +import data/msg +import data/package +import data/search_result +import frontend/discuss +import frontend/effects/window +import frontend/errors +import frontend/ffi +import frontend/router +import gleam/bool +import gleam/dict +import gleam/dynamic.{type Dynamic} +import gleam/option.{None, Some} +import gleam/pair +import grille_pain/lustre/toast +import lustre/effect +import modem +import toast/error as toast_error + +pub fn handle_analytics(model: Data, analytics: analytics.Analytics) { + model + |> model.update_analytics(analytics) + |> pair.new(effect.none()) +} + +pub fn handle_packages(model: Data, packages: List(package.Package)) { + model.Data(..model, packages:) + |> pair.new(effect.none()) +} + +pub fn handle_search_results( + model: Data, + input: String, + search_results: search_result.SearchResults, +) { + search_results + |> model.update_search_results(model, input, _) + |> model.toggle_loading + |> pair.new(modem.push("/search", Some("q=" <> input), None)) +} + +pub fn handle_trendings(model: Data, trendings: List(package.Package)) { + trendings + |> model.update_trendings(model, _) + |> pair.new(effect.none()) +} + +pub fn handle_discuss_toast(model: Data, message: discuss.DiscussError) { + message + |> toast_error.describe_http_error + |> option.map(errors.capture_message) + |> option.map(toast.error) + |> option.unwrap(effect.none()) + |> pair.new(model, _) +} + +pub fn handle_changed_route(model: Data, route: router.Route) { + let model = model.update_route(model, route) + case route { + router.Home -> model.update_input(model, "") + router.Packages -> model.update_input(model, "") + router.Trending -> model.update_input(model, "") + router.Analytics -> model.update_input(model, "") + router.Search(q) -> + model.update_input(model, q) + |> model.update_submitted_input + } + |> pair.new(router.update_page_title(route)) +} + +pub fn handle_resized_viewport(model: Data, is_mobile: Bool) { + model + |> model.update_is_mobile(is_mobile) + |> pair.new(effect.none()) +} + +pub fn handle_clicked_sidebar_name(model: Data, id: String) { + ffi.scroll_to(element: id) + |> effect.from + |> pair.new(model, _) +} + +pub fn handle_focused_search(model: Data, event: Dynamic) { + #(model, window.focus(on: "search-input", event: event)) +} + +pub fn handle_inputted_search(model: Data, content: String) { + model + |> model.update_input(content) + |> pair.new(effect.none()) +} + +pub fn handle_pressed_escape(model: Data) { + #(model, window.blur()) +} + +pub fn handle_submitted_search(model: Data) { + use <- bool.guard(when: model.input == "", return: #(model, effect.none())) + use <- bool.guard(when: model.loading, return: #(model, effect.none())) + let new_model = model.update_submitted_input(model) + case dict.get(new_model.search_results, new_model.submitted_input) { + Ok(_) -> { + let new_route = router.Search(new_model.submitted_input) + let is_same_route = new_model.route == new_route + use <- bool.guard(when: is_same_route, return: #(new_model, effect.none())) + new_model + |> pair.new( + effect.batch([ + modem.push("search", Some("q=" <> new_model.submitted_input), None), + window.blur(), + ]), + ) + } + Error(_) -> { + model.toggle_loading(new_model) + |> pair.new({ + use dispatch <- effect.from + discuss.about(["search"]) + |> discuss.query([#("q", model.input)]) + |> discuss.expect(search_result.decode_search_results) + |> discuss.on_success(fn(search_results) { + model.input + |> msg.ApiReturnedSearchResults(input: _, search_results:) + |> dispatch + }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil + }) + |> fn(a) { #(a.0, effect.batch([a.1, window.blur()])) } + } + } +} + +pub fn handle_toggle_filter(model, filter, value) { + case filter, value { + msg.Functions, value -> model.Data(..model, keep_functions: value) + msg.Types, value -> model.Data(..model, keep_types: value) + msg.Aliases, value -> model.Data(..model, keep_aliases: value) + msg.Documented, value -> model.Data(..model, keep_documented: value) + msg.ShowOldPackages, value -> model.Data(..model, show_old_packages: value) + msg.VectorSearch, value -> model.Data(..model, show_vector_search: value) + msg.DocumentationSearch, value -> + model.Data(..model, show_documentation_search: value) + } + |> model.update_search_results_filter + |> pair.new(effect.none()) +} diff --git a/apps/frontend/src/frontend/view.gleam b/apps/frontend/src/frontend/view.gleam index 4c01fc3..02dd890 100644 --- a/apps/frontend/src/frontend/view.gleam +++ b/apps/frontend/src/frontend/view.gleam @@ -1,3 +1,4 @@ +import bright import data/model.{type Model} import frontend/colors/palette import frontend/router @@ -29,12 +30,13 @@ fn layout(attributes, children) { pub fn view(model: Model) { use <- magic.render([magic.node()]) + use data, _computed <- bright.view(model) layout([], [ - navbar.navbar(model), - body.body(model), - case model.route { + navbar.navbar(data), + body.body(data), + case data.route { router.Home -> footer.view() - router.Search(_) -> footer.search_bar(model) + router.Search(_) -> footer.search_bar(data) _ -> el.none() }, ]) diff --git a/apps/frontend/src/frontend/view/body/body.gleam b/apps/frontend/src/frontend/view/body/body.gleam index bc8e4c0..2eb8fc3 100644 --- a/apps/frontend/src/frontend/view/body/body.gleam +++ b/apps/frontend/src/frontend/view/body/body.gleam @@ -1,6 +1,6 @@ import birl import chart.{Dataset} -import data/model.{type Model} +import data/model.{type Data} import data/msg import data/search_result import frontend/icons @@ -22,7 +22,7 @@ import lustre/element/html as h import lustre/event as e import lustre/lazy -fn view_search_input(model: Model) { +fn view_search_input(model: Data) { let has_content = { model.input |> string.length() @@ -67,7 +67,7 @@ fn empty_state( ]) } -pub fn view_trending(_model: Model) { +pub fn view_trending(_model: Data) { el.none() // case model.trendings { // None -> @@ -137,7 +137,7 @@ pub fn view_trending(_model: Model) { // } } -fn sidebar(model: Model) { +fn sidebar(model: Data) { use <- bool.guard(when: model.is_mobile, return: el.none()) let disabled = case model.route { router.Search(..) -> a.style([#("opacity", "1")]) @@ -251,7 +251,7 @@ fn analytics_box(title: String, count: Int) { ]) } -fn popularity_chart(model: Model) { +fn popularity_chart(model: Data) { let data = list.filter(model.popular, fn(p) { p.repository != "https://github.com/gleam-lang/gleam" @@ -270,7 +270,7 @@ fn popularity_chart(model: Model) { }) } -fn ranked_chart(model: Model) { +fn ranked_chart(model: Data) { let data = list.filter(model.ranked, fn(p) { p.name != "gleam_stdlib" && p.name != "gleeunit" @@ -284,7 +284,7 @@ fn ranked_chart(model: Model) { }) } -fn analytics_chart(model: Model) { +fn analytics_chart(model: Data) { let data = model.timeseries use <- bool.guard(when: list.is_empty(data), return: el.none()) chart.line_chart({ @@ -322,7 +322,7 @@ fn analytics_title(title: String, border: Bool) { ]) } -fn view_analytics(model: Model) { +fn view_analytics(model: Data) { el.fragment([ sidebar(model), h.main([a.class("main"), a.style([#("padding", "24px 36px")])], [ @@ -374,7 +374,7 @@ fn view_analytics(model: Model) { ]) } -fn view_packages(model: Model) { +fn view_packages(model: Data) { el.fragment([ sidebar(model), h.main( @@ -429,7 +429,7 @@ fn view_packages(model: Model) { ]) } -pub fn body(model: Model) { +pub fn body(model: Data) { case model.route { router.Home -> h.main([a.class("main")], [view_search_input(model)]) router.Packages -> view_packages(model) diff --git a/apps/frontend/src/frontend/view/body/cache.gleam b/apps/frontend/src/frontend/view/body/cache.gleam index 57074b1..8706ca0 100644 --- a/apps/frontend/src/frontend/view/body/cache.gleam +++ b/apps/frontend/src/frontend/view/body/cache.gleam @@ -1,5 +1,5 @@ import data/msg -import data/search_result +import data/type_search import frontend/view/body/search_result as sr import frontend/view/types as t import gleam/list @@ -8,7 +8,7 @@ import lustre/element as el import lustre/element/html as h import lustre/event as e -fn view_search_results(search_results: List(search_result.SearchResult)) { +fn view_search_results(search_results: List(type_search.TypeSearch)) { list.map(search_results, sr.view) |> list.intersperse(h.div([a.class("search-result-separator")], [])) |> el.fragment @@ -76,12 +76,12 @@ fn types_separator() { pub fn cache_search_results( search: String, index: List(#(#(String, String), List(#(String, String)))), - types: List(search_result.SearchResult), - exact: List(search_result.SearchResult), - others: List(search_result.SearchResult), - searches: List(search_result.SearchResult), - docs_searches: List(search_result.SearchResult), - modules_searches: List(search_result.SearchResult), + types: List(type_search.TypeSearch), + exact: List(type_search.TypeSearch), + others: List(type_search.TypeSearch), + searches: List(type_search.TypeSearch), + docs_searches: List(type_search.TypeSearch), + modules_searches: List(type_search.TypeSearch), ) { h.div([a.class("search-results-wrapper")], [ sidebar(search, index), diff --git a/apps/frontend/src/frontend/view/body/search_result.gleam b/apps/frontend/src/frontend/view/body/search_result.gleam index 59ea5b9..750cc09 100644 --- a/apps/frontend/src/frontend/view/body/search_result.gleam +++ b/apps/frontend/src/frontend/view/body/search_result.gleam @@ -1,5 +1,6 @@ import data/implementations -import data/search_result.{type SearchResult} +import data/search_result +import data/type_search.{type TypeSearch} import frontend/colors/palette import frontend/icons import frontend/view/body/signature @@ -11,6 +12,7 @@ import gleam/dict import gleam/dynamic import gleam/list import gleam/option +import gleam/pair import gleam/result import lustre import lustre/attribute as a @@ -18,14 +20,13 @@ import lustre/effect import lustre/element import lustre/element/html as h import lustre/event as e -import lustre/update pub type Model { - Model(item: option.Option(SearchResult), opened: Bool) + Model(item: option.Option(TypeSearch), opened: Bool) } pub type Msg { - Received(option.Option(SearchResult)) + Received(option.Option(TypeSearch)) ToggleOpen } @@ -41,7 +42,7 @@ pub fn setup() { |> lustre.register("search-result") } -pub fn view(item: SearchResult) { +pub fn view(item: TypeSearch) { let attributes = [a.property("item", item)] element.element("search-result", attributes, []) } @@ -51,7 +52,7 @@ fn update(model, msg) { ToggleOpen -> Model(..model, opened: !model.opened) Received(search_result) -> Model(item: search_result, opened: False) } - |> update.none + |> pair.new(effect.none()) } fn implementation_pill(item) { @@ -82,7 +83,7 @@ fn internal_view(model: Model) -> element.Element(Msg) { use <- bool.guard(when: option.is_none(model.item), return: element.none()) let assert option.Some(item) = model.item let package_id = item.package_name <> "@" <> item.version - let id = package_id <> "-" <> item.module_name <> "-" <> item.name + let id = package_id <> "-" <> item.module_name <> "-" <> item.type_name h.div([a.class("search-result"), a.id(id)], [ h.div([a.class("search-details")], [ h.div([a.class("search-details-name")], [ @@ -99,7 +100,7 @@ fn internal_view(model: Model) -> element.Element(Msg) { ]) } -fn view_name(item: SearchResult) { +fn view_name(item: TypeSearch) { let class = a.class("qualified-name") let href = search_result.hexdocs_link(item) h.a([class, a.target("_blank"), a.rel("noreferrer"), a.href(href)], [ @@ -108,11 +109,11 @@ fn view_name(item: SearchResult) { t.dark_white("."), t.keyword(item.module_name), t.dark_white("."), - t.fun(item.name), + t.fun(item.type_name), ]) } -fn view_documentation_arrow(model: Model, item: SearchResult) { +fn view_documentation_arrow(model: Model, item: TypeSearch) { use <- bool.guard(when: item.documentation == "", return: element.none()) let no_implementation = option.is_none(item.metadata.implementations) use <- bool.guard(when: no_implementation, return: element.none()) @@ -132,14 +133,14 @@ fn view_documentation_arrow(model: Model, item: SearchResult) { ]) } -fn view_implementation_pills(model: Model, item: SearchResult) { +fn view_implementation_pills(model: Model, item: TypeSearch) { use <- bool.guard(when: !model.opened, return: element.none()) item.metadata.implementations |> option.map(implementation_pills) |> option.unwrap(element.none()) } -fn view_documentation(model: Model, item: SearchResult) { +fn view_documentation(model: Model, item: TypeSearch) { use <- bool.guard(when: item.documentation == "", return: element.none()) use <- bool.guard(when: !model.opened, return: element.none()) h.div([a.class("documentation")], [documentation.view(item.documentation)]) diff --git a/apps/frontend/src/frontend/view/body/signature.gleam b/apps/frontend/src/frontend/view/body/signature.gleam index 82b36f4..081ee3e 100644 --- a/apps/frontend/src/frontend/view/body/signature.gleam +++ b/apps/frontend/src/frontend/view/body/signature.gleam @@ -1,5 +1,5 @@ -import data/search_result import data/signature.{type Parameter, type Type, Parameter} +import data/type_search import frontend/view/helpers import frontend/view/types as t import gleam/bool @@ -213,11 +213,15 @@ fn view_type_constructor(constructor: signature.TypeConstructor, indent: Int) { ]) } -pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) { +pub fn view_signature(item: type_search.TypeSearch) -> List(el.Element(msg)) { case item.json_signature { signature.TypeDefinition(parameters, constructors) -> list.flatten([ - [t.keyword("type "), t.fun(item.name), ..render_parameters(parameters)], + [ + t.keyword("type "), + t.fun(item.type_name), + ..render_parameters(parameters) + ], case constructors { [] -> [] _ -> [h.text(" {"), helpers.newline()] @@ -237,7 +241,7 @@ pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) ]) signature.Constant(width, type_) -> list.flatten([ - [t.keyword("const "), t.fun(item.name), h.text(" = ")], + [t.keyword("const "), t.fun(item.type_name), h.text(" = ")], case width > 80 { True -> [helpers.newline(), ..view_type(type_, 2)] False -> view_type(type_, 0) @@ -247,7 +251,7 @@ pub fn view_signature(item: search_result.SearchResult) -> List(el.Element(msg)) list.flatten([ [ t.keyword("type "), - t.type_(item.name), + t.type_(item.type_name), ..render_parameters(parameters) ], [h.text(" = ")], diff --git a/apps/frontend/src/frontend/view/footer/footer.gleam b/apps/frontend/src/frontend/view/footer/footer.gleam index 9c3994e..dff4a6c 100644 --- a/apps/frontend/src/frontend/view/footer/footer.gleam +++ b/apps/frontend/src/frontend/view/footer/footer.gleam @@ -1,4 +1,4 @@ -import data/model.{type Model} +import data/model.{type Data} import data/msg import frontend/view/footer/links.{links} import frontend/view/footer/styles as s @@ -39,7 +39,7 @@ pub fn view() { ]) } -pub fn search_bar(model: Model) { +pub fn search_bar(model: Data) { use <- bool.guard(when: !model.is_mobile, return: el.none()) h.div([a.class("footer-search")], [ h.form([e.on_submit(msg.UserSubmittedSearch)], [ diff --git a/apps/frontend/src/frontend/view/navbar/navbar.gleam b/apps/frontend/src/frontend/view/navbar/navbar.gleam index dce12a2..243b4f7 100644 --- a/apps/frontend/src/frontend/view/navbar/navbar.gleam +++ b/apps/frontend/src/frontend/view/navbar/navbar.gleam @@ -1,4 +1,4 @@ -import data/model.{type Model} +import data/model.{type Data} import frontend/router import frontend/view/navbar/styles as s import lustre/attribute as a @@ -11,7 +11,7 @@ fn navbar_links() { ]) } -pub fn navbar(model: Model) { +pub fn navbar(model: Data) { let transparent = model.route == router.Home s.navbar(transparent, [a.class("navbar")], [ case model.route { diff --git a/apps/frontend/src/gleam/coerce.gleam b/apps/frontend/src/gleam/coerce.gleam deleted file mode 100644 index 3f1da9e..0000000 --- a/apps/frontend/src/gleam/coerce.gleam +++ /dev/null @@ -1,2 +0,0 @@ -@external(javascript, "../gloogle.ffi.mjs", "coerce") -pub fn coerce(value: a) -> b diff --git a/apps/frontend/src/gleam/decoder_extra.gleam b/apps/frontend/src/gleam/decoder_extra.gleam deleted file mode 100644 index b2905f9..0000000 --- a/apps/frontend/src/gleam/decoder_extra.gleam +++ /dev/null @@ -1,10 +0,0 @@ -import gleam/dynamic.{type Dynamic} -import gleam/option -import gleam/result - -pub fn completely_option(field: String) { - fn(dyn: Dynamic) { - dynamic.optional_field(field, dynamic.optional(dynamic.string))(dyn) - |> result.map(fn(res) { option.flatten(res) }) - } -} diff --git a/apps/frontend/src/lustre/update.gleam b/apps/frontend/src/lustre/update.gleam deleted file mode 100644 index 27ecdb2..0000000 --- a/apps/frontend/src/lustre/update.gleam +++ /dev/null @@ -1,18 +0,0 @@ -import lustre/effect.{type Effect} - -pub fn none(model: model) { - #(model, effect.none()) -} - -pub fn effect(model: model, effect: Effect(msg)) { - #(model, effect) -} - -pub fn effects(model: model, effects: List(Effect(msg))) { - #(model, effect.batch(effects)) -} - -pub fn add_effect(tuple: #(model, Effect(msg)), effect: Effect(msg)) { - let #(model, fst_effect) = tuple - #(model, effect.batch([fst_effect, effect])) -} diff --git a/apps/frontend/src/toast/error.gleam b/apps/frontend/src/toast/error.gleam index 55030d5..dc5bb74 100644 --- a/apps/frontend/src/toast/error.gleam +++ b/apps/frontend/src/toast/error.gleam @@ -1,14 +1,18 @@ import frontend/discuss +import gleam/io import gleam/option.{Some} pub fn describe_http_error(error: discuss.DiscussError) { case error { discuss.InternalServerError -> Some("Internal server error. Please try again later.") - discuss.DecodeError(_) -> Some("Format error. Please try again later.") discuss.NetworkError -> Some("Network error. Please try again later.") discuss.NotFound -> Some("Resource not found. Make sure you have the correct URL.") discuss.InvalidJsonBody -> Some("Invalid JSON body. Please, retry later.") + discuss.DecodeError(error) -> { + io.debug(error) + Some("Format error. Please try again later.") + } } } diff --git a/packages/bright/.github/workflows/demo.yml b/packages/bright/.github/workflows/demo.yml new file mode 100644 index 0000000..af1a259 --- /dev/null +++ b/packages/bright/.github/workflows/demo.yml @@ -0,0 +1,54 @@ +name: Deploy demo + +on: + push: + branches: [main] + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup BEAM + uses: erlef/setup-beam@v1 + with: + otp-version: "27.0.0" + gleam-version: "1.6.1" + rebar3-version: "3" + # elixir-version: "1.15.4" + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Downloading dependencies + run: gleam deps download + working-directory: e2e/sample + - name: Build demo + run: gleam run -m lustre/dev build + working-directory: e2e/sample + - name: Copy files + run: | + mkdir _site + cp -r e2e/sample/priv _site + cp e2e/sample/index.html _site + - name: Upload artifacts + uses: actions/upload-pages-artifact@v3 + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/packages/bright/.github/workflows/test.yml b/packages/bright/.github/workflows/test.yml new file mode 100644 index 0000000..6026a40 --- /dev/null +++ b/packages/bright/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: test + +on: + push: + branches: + - master + - main + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: erlef/setup-beam@v1 + with: + otp-version: "27.1.2" + gleam-version: "1.6.1" + rebar3-version: "3" + # elixir-version: "1.15.4" + - run: gleam deps download + - run: gleam test + - run: gleam format --check src test diff --git a/packages/bright/.gitignore b/packages/bright/.gitignore new file mode 100644 index 0000000..93d449b --- /dev/null +++ b/packages/bright/.gitignore @@ -0,0 +1,7 @@ +*.beam +*.ez +/build +erl_crash.dump +sample.mjs +/index.html +.DS_Store diff --git a/packages/bright/.prettierrc.json b/packages/bright/.prettierrc.json new file mode 100644 index 0000000..cce9d3c --- /dev/null +++ b/packages/bright/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "semi": false +} diff --git a/packages/bright/LICENCE b/packages/bright/LICENCE new file mode 100644 index 0000000..62fede3 --- /dev/null +++ b/packages/bright/LICENCE @@ -0,0 +1,7 @@ +Copyright 2024 Guillaume Hivert + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/bright/README.md b/packages/bright/README.md new file mode 100644 index 0000000..b12db53 --- /dev/null +++ b/packages/bright/README.md @@ -0,0 +1,272 @@ +# Bright + +Bright is a library to help you manage your `model` and your `update` function in +a [Lustre](https://lustre.build) application. As you probably know, in Lustre, +your model is the only mutable place of the application, and centralize every +data your application uses. If you're coming from the JS world, it can seems +weird at first, because it's usual to have multiple storage places in an +application, whether they're contexts, stores, observables, or anything else. + +In such a centralized model, everything is simpler, and just works. However, +managing your model and your updates can quickly become a mess, with dependent +data, data splitting, normalization, etc. Bright comes in to help you avoid such +states, by both helping your to maintain a properly defined model, but also +to define dependant data in an easy way. Bright also provides a powerful caching +system to guarantee to not compute the same information twice! + +> As usual, a demo is worth a thousand words, so take a look at +> [https://bright.chouquette.dev](https://bright.chouquette.dev)! + +If you're used to stores & data management, you can skip the next section, see +you in the [getting started](#getting-started)! + +## Installation + +```sh +gleam add bright@1 +``` + +## Dependent data? Caching system? + +To sum up simply, a data is dependent on another data when the latter data is +required to compute the former. If you have worked with relational data, you +already encountered it. Let's take an example. + +Imagine you have a list of users on one side, with their info (name, age for example) +and ID, and you have a list of addresses referring to a user by their ID. You want to +create a page displaying the user info and all of their addresses. +Intuitively, you would display the user info, and then you would find all the user +addresses in the address list to display them. + +```gleam +pub type User { + User( + name: String, + age: Int, + id: String + ) +} + +pub type Address { + Address( + street: String, + city: String, + country: String, + user_id: String + ) +} + +pub fn display_user_page(model, user_id) { + // First find the user. + use user <- result.try(list.find(model.users, fn (user) { user.id == user_id })) + // After the user has been found, filter the addresses to find them. + use addresses <- list.filter(model.addresses, fn (address) { address.user_id == user.id }) + // Do the display here. +} +``` + +While it works perfectly in this example, what if every time you need to access +those data? Recompute the same data over and over again, in every part of the +application? We can do better: define the user and its address in one record, +and use it everywhere! + +```gleam +pub type UserAndAddress { + UserAndAddress( + user: User, + addresses: List(Address) + ) +} + +// Compute the data, and store it in your model. +pub fn compute_user_address(model) { + list.map(model.users, fn (user) { + let addresses = list.filter(model.addresses, fn (address) { address.user_id == user.id }) + UserAndAddresses(user:, addresses:) + }) +} + +// The data is in your model. +pub fn display_user_page(model, user_id) { + // Find directly everything! + use UserAndAddress(user:, addresses:) <- result.try({ + list.find(model.users_and_addresses, fn (user) { user.id == user_id }) + }) + // Do the display here. +} +``` + +You have defined here a derived, computed data that depends on two previous data +you own. Now, every time you need to access the user, you have the address bundled! +But in a classic application, you would have to define that computation by yourself, +and make sure to keep it in sync after each update. That's where Bright comes in, +and do the hard work for you! Instead of having to think to synchronize the data +when a new data comes in, let Bright does it for you. And with built-in caching +on-demand, Bright will never recompute the same data twice for intense computations. + +## Getting Started + +Bright handles the hard task of computing the derived data when needed, and as +such, you have to initialize it at first. Bright accepts two types of data: +your main model, holding the raw data, and your derived, computed data. Because +Gleam is strongly-typed language, you'll have to define those data by hand. +A counter will be used to illustrate how to use it. + +```gleam +/// Define your raw data. No derived data will reside here. +pub type Data { + Data(counter: Int) +} + +/// Define your derived data. No raw data will reside here. +pub type Computed { + Computed(double: Int) +} + +/// Define an alias, to simplify reference to the model. +pub type Model = + Bright(Data, Computed) + +// In your init function, you'll initialize Bright. You can use it as-is as a +// replacement for your model. +pub fn init() { + let data = Data(counter: 0) + let computed = Computed(double: 0) + let model = bright.init(data, computed) + // bright.return is a helper to write nice little DSL. + bright.return(model) +} +``` + +Once Bright is initialized, you have to modify a bit your update function. Now, +instead of simply receiving the message and modifying your model, you'll have to +run that modification through Bright. You can then chain your computation calls +to the Bright object. And of course, derived data can be computed from pre-computed +derived data! + +```gleam +pub type Msg { + Increment + Decrement +} + +pub fn update(model: Model, msg: Msg) { + // By using function capture, we can easily use our update function here. + // bright.update will automatically run your update against data, here our + // Data record. Like every update function, that function have to return + // a #(Data, Effect(Msg)). The message will automatically be batched with + // next messages. + // Finally, Bright(Data, Computed) is returned, with Data updated. To let you + // continue the chain. + use model <- bright.update(model, update_data(_, msg)) + model + // bright.compute will compute the new derived data, and let you set it in + // the computed. You can also simply return the original computed, in which + // case the data is not updated. + |> bright.compute(fn(data, computed) { Computed(..computed, double: d.counter * 2) }) + // bright.lazy_compute will compute the new derived data, if and only if the + // selector you pass as the first argument changed between two renders. + // In case the selector did not change, the old data is kept in memory for the + // next render. + |> bright.lazy_compute( + // That selector value is compared at every render. + fn (data) { data.counter / 10 }, + fn(data, computed) { Computed(..computed, double: d.counter * 2) } + ) +} + +pub fn update_data(data: Data, msg: Msg) { + case msg { + Increment -> #(Data(..data, counter: data.counter + 1), effect.none()) + Decrement -> #(Data(..data, counter: data.counter - 1), effect.none()) + } +} +``` + +And once your data is computed, all you have to do is to run through your view +function! + +```gleam +pub fn view(model: Model) { + use data, computed <- bright.view(model) + // You can use data & computed with correct, up to date data. + html.div([], []) +} +``` + +And you're good to go! Now, you don't have to think anymore to update your +derived data, everything is kept in-sync directly for you! + +## Using guards + +Sometimes, you also have to define side-effects that run after your computations +have run. Because you figure out the data is finally incorrect. Or because your +user have written a false URL in the address bar. Bright got you covered too! +Just use `bright.guard`, and let the side-effects flow automatically in your app, +only when you need it! + +```gleam +pub fn update(model: Model, msg: Msg) { + use model <- bright.update(model, update_data(_, msg)) + model + |> bright.compute(fn(data, computed) { Computed(..computed, double: d.counter * 2) }) + |> bright.lazy_compute( + fn (data) { data.counter / 10 }, + fn(data, computed) { Computed(..computed, double: d.counter * 2) } + ) + // bright.guard will run at every render, and let you the possibility to issue + // a side-effect. Bright will take care to gather them, and provide them to the + // runtime! + |> bright.guard(fn (data, computed) { + effect.from(fn (dispatch) { + io.println("That side-effect will run at every render!") + }) + }) + // bright.lazy_guard will issue the side-effect, if and only if the + // selector you pass as the first argument changed between two renders. + // In case the selector did not change, the old data is kept in memory for the + // next render. + |> bright.lazy_guard( + fn (data) { data.counter / 10 }, + fn (data, computed) { + effect.from(fn (dispatch) { + io.println("That side-effect will only run when the selector changes!") + }) + } + ) +} +``` + +## Combining multiple Bright + +Sometimes, you also need to combine multiple Bright in the same model. While you +can keep a `Bright` as model, you could want to combine them, to handle one `Bright` +by page for example. `bright.step` helps you to do this. + +```gleam +pub type Model { + Model( + counter_1: Bright(Data, Computed), + counter_2: Bright(Data, Computed), + ) +} + +pub type Msg { + First(counter: Counter) + Second(counter: Counter) +} + +pub type Counter { + Decrement + Increment +} + +/// Here, we define a new update function, that calls our previously defined +/// update function. It keeps the two Bright synchronized by running the full +/// updated cycle on each of them. +fn update_both_counters(model: Model, msg: Msg) { + use counter_1 <- bright.step(update(model.counter_1, msg.counter)) + use counter_2 <- bright.step(update(model.counter_2, msg.counter)) + bright.return(Model(..model, counter_1:, counter_2:)) +} +``` diff --git a/packages/bright/e2e/sample/.gitignore b/packages/bright/e2e/sample/.gitignore new file mode 100644 index 0000000..599be4e --- /dev/null +++ b/packages/bright/e2e/sample/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +/build +erl_crash.dump diff --git a/packages/bright/e2e/sample/README.md b/packages/bright/e2e/sample/README.md new file mode 100644 index 0000000..27a5d5c --- /dev/null +++ b/packages/bright/e2e/sample/README.md @@ -0,0 +1,24 @@ +# sample + +[![Package Version](https://img.shields.io/hexpm/v/sample)](https://hex.pm/packages/sample) +[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/sample/) + +```sh +gleam add sample@1 +``` +```gleam +import sample + +pub fn main() { + // TODO: An example of the project in use +} +``` + +Further documentation can be found at . + +## Development + +```sh +gleam run # Run the project +gleam test # Run the tests +``` diff --git a/packages/bright/e2e/sample/gleam.toml b/packages/bright/e2e/sample/gleam.toml new file mode 100644 index 0000000..0419f3b --- /dev/null +++ b/packages/bright/e2e/sample/gleam.toml @@ -0,0 +1,24 @@ +name = "sample" +version = "1.0.0" + +# Fill out these fields if you intend to generate HTML documentation or publish +# your project to the Hex package manager. +# +# description = "" +# licences = ["Apache-2.0"] +# repository = { type = "github", user = "", repo = "" } +# links = [{ title = "Website", href = "" }] +# +# For a full reference of all the available options, you can have a look at +# https://gleam.run/writing-gleam/gleam-toml/. + +[dependencies] +gleam_stdlib = ">= 0.34.0 and < 2.0.0" +lustre = ">= 4.6.1 and < 5.0.0" +bright = {path = "../.."} +sketch = ">= 3.1.1 and < 4.0.0" +sketch_lustre = ">= 1.0.3 and < 2.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" +lustre_dev_tools = ">= 1.6.0 and < 2.0.0" diff --git a/packages/bright/e2e/sample/index.html b/packages/bright/e2e/sample/index.html new file mode 100644 index 0000000..7d7baf8 --- /dev/null +++ b/packages/bright/e2e/sample/index.html @@ -0,0 +1,18 @@ + + + + + + + Bright 💡 + + + + + + + +
    +
    + + diff --git a/packages/bright/e2e/sample/manifest.toml b/packages/bright/e2e/sample/manifest.toml new file mode 100644 index 0000000..37b2c4f --- /dev/null +++ b/packages/bright/e2e/sample/manifest.toml @@ -0,0 +1,58 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, + { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, + { name = "bright", version = "0.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "lustre_dev_tools"], source = "local", path = "../.." }, + { name = "conversation", version = "1.4.3", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_javascript", "gleam_stdlib"], otp_app = "conversation", source = "hex", outer_checksum = "908B46F60444442785A495197D482558AD8B849C3714A38FAA1940358CC8CCCD" }, + { name = "directories", version = "1.1.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "BDA521A4EB9EE3A7894F0DC863797878E91FF5C7826F7084B2E731E208BDB076" }, + { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" }, + { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, + { name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" }, + { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, + { name = "gleam_community_ansi", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "4CD513FC62523053E62ED7BAC2F36136EC17D6A8942728250A9A00A15E340E4B" }, + { name = "gleam_community_colour", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "386CB9B01B33371538672EEA8A6375A0A0ADEF41F17C86DDCB81C92AD00DA610" }, + { name = "gleam_crypto", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "8AE56026B3E05EBB1F076778478A762E9EB62B31AEEB4285755452F397029D22" }, + { name = "gleam_erlang", version = "0.30.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "760618870AE4A497B10C73548E6E44F43B76292A54F0207B3771CBB599C675B4" }, + { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, + { name = "gleam_httpc", version = "3.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "091CDD2BEC8092E82707BEA03FB5205A2BBBDE4A2F551E3C069E13B8BC0C428E" }, + { name = "gleam_javascript", version = "0.13.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_javascript", source = "hex", outer_checksum = "F98328FCF573DA6F3A35D7F6CB3F9FF19FD5224CCBA9151FCBEAA0B983AF2F58" }, + { name = "gleam_json", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "0A57FB5666E695FD2BEE74C0428A98B0FC11A395D2C7B4CDF5E22C5DD32C74C6" }, + { name = "gleam_otp", version = "0.14.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "5A8CE8DBD01C29403390A7BD5C0A63D26F865C83173CF9708E6E827E53159C65" }, + { name = "gleam_package_interface", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "CF3BFC5D0997750D9550D8D73A90F4B8D71C6C081B20ED4E70FFBE1E99AFC3C2" }, + { name = "gleam_stdlib", version = "0.44.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "A6E55E309A6778206AAD4038D9C49E15DF71027A1DB13C6ADA06BFDB6CF1260E" }, + { name = "glearray", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "B99767A9BC63EF9CC8809F66C7276042E5EFEACAA5B25188B552D3691B91AC6D" }, + { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, + { name = "glint", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5F6720081150AED8023131B0F3A35F9B0D6426A96CE02BEC52AD7018DF70566A" }, + { name = "glisten", version = "5.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "48EF7F6D1DCA877C2F49AF35CC33946C7129EEB05A114758A2CC569C708BFAF8" }, + { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, + { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, + { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, + { name = "lustre", version = "4.6.3", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "BDF833368F6C8F152F948D5B6A79866E9881CB80CB66C0685B3327E7DCBFB12F" }, + { name = "lustre_dev_tools", version = "1.6.0", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "5A1C7D20FA2C0D77D59F259EAE0E14BB3F5359CC1DE7C5ED6922B65FFCBD4C31" }, + { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, + { name = "mist", version = "2.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "981F12FC8BA0656B40099EC876D6F2BEE7B95593610F342E9AB0DC4E663A932F" }, + { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, + { name = "plinth", version = "0.5.2", build_tools = ["gleam"], requirements = ["conversation", "gleam_javascript", "gleam_json", "gleam_stdlib"], otp_app = "plinth", source = "hex", outer_checksum = "6F346577D02879D5D516C61EC7C41CD09642528072BA04E1DBD36B9415A82517" }, + { name = "ranger", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "B8F3AFF23A3A5B5D9526B8D18E7C43A7DFD3902B151B97EC65397FE29192B695" }, + { name = "repeatedly", version = "2.1.2", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "93AE1938DDE0DC0F7034F32C1BF0D4E89ACEBA82198A1FE21F604E849DA5F589" }, + { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, + { name = "sketch", version = "3.1.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "sketch", source = "hex", outer_checksum = "6CBFAAA92C37F1F44FC552FD9E9DAC34598BDEB5F873B6191C696DC67D85AD00" }, + { name = "sketch_lustre", version = "1.0.3", build_tools = ["gleam"], requirements = ["gleam_stdlib", "lustre", "plinth", "sketch"], otp_app = "sketch_lustre", source = "hex", outer_checksum = "DD5437B10D4BB8AB45A19820B17883188B8568B6ED7885D7D073A983F4984E79" }, + { name = "snag", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "08E9EB87C413457DB1DD66CD704C6878DACC9C93B418600F63873D0CD224E756" }, + { name = "spinner", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "9EE43AA33BE2DA5731B8F3F170AAB59AF1A815AFA5BF615F12C1B91F3B03F157" }, + { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, + { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, + { name = "tom", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "228E667239504B57AD05EC3C332C930391592F6C974D0EFECF32FFD0F3629A27" }, + { name = "wisp", version = "1.2.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "F71265D2F1DE11426535A2FA1DA3B11D2FFB783B116DF9496BC8C41983EBADB4" }, +] + +[requirements] +bright = { path = "../.." } +gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } +lustre = { version = ">= 4.6.1 and < 5.0.0" } +lustre_dev_tools = { version = ">= 1.6.0 and < 2.0.0" } +sketch = { version = ">= 3.1.1 and < 4.0.0" } +sketch_lustre = { version = ">= 1.0.3 and < 2.0.0" } diff --git a/packages/bright/e2e/sample/src/icons.gleam b/packages/bright/e2e/sample/src/icons.gleam new file mode 100644 index 0000000..597150e --- /dev/null +++ b/packages/bright/e2e/sample/src/icons.gleam @@ -0,0 +1,28 @@ +import icons/book_open +import icons/check +import icons/copy +import icons/github +import icons/home +import sketch as s +import sketch/lustre/element/html as h +import sketch/size.{px} + +pub fn small(icon) { + s.class([s.width(px(24)), s.height(px(24))]) + |> h.div([], [icon]) +} + +pub fn tiny(icon) { + s.class([s.width(px(12)), s.height(px(12))]) + |> h.div([], [icon]) +} + +pub const book_open = book_open.icon + +pub const check = check.icon + +pub const copy = copy.icon + +pub const github = github.icon + +pub const home = home.icon diff --git a/packages/bright/e2e/sample/src/icons/book_open.gleam b/packages/bright/e2e/sample/src/icons/book_open.gleam new file mode 100644 index 0000000..a518c4d --- /dev/null +++ b/packages/bright/e2e/sample/src/icons/book_open.gleam @@ -0,0 +1,17 @@ +import lustre/attribute as a +import sketch/lustre/element/html + +const content = "" + +pub fn icon() { + html.svg_( + [ + a.style([#("max-width", "100%"), #("max-height", "100%")]), + a.attribute("xmlns", "http://www.w3.org/2000/svg"), + a.attribute("viewBox", "0 0 256 256"), + a.attribute("fill", "currentColor"), + a.attribute("dangerous-unescaped-html", content), + ], + [], + ) +} diff --git a/packages/bright/e2e/sample/src/icons/check.gleam b/packages/bright/e2e/sample/src/icons/check.gleam new file mode 100644 index 0000000..d8aadbf --- /dev/null +++ b/packages/bright/e2e/sample/src/icons/check.gleam @@ -0,0 +1,17 @@ +import lustre/attribute as a +import sketch/lustre/element/html + +const content = "" + +pub fn icon() { + html.svg_( + [ + a.style([#("max-width", "100%"), #("max-height", "100%")]), + a.attribute("xmlns", "http://www.w3.org/2000/svg"), + a.attribute("viewBox", "0 0 256 256"), + a.attribute("fill", "currentColor"), + a.attribute("dangerous-unescaped-html", content), + ], + [], + ) +} diff --git a/packages/bright/e2e/sample/src/icons/copy.gleam b/packages/bright/e2e/sample/src/icons/copy.gleam new file mode 100644 index 0000000..cfc9ffc --- /dev/null +++ b/packages/bright/e2e/sample/src/icons/copy.gleam @@ -0,0 +1,17 @@ +import lustre/attribute as a +import sketch/lustre/element/html + +const content = "" + +pub fn icon() { + html.svg_( + [ + a.style([#("max-width", "100%"), #("max-height", "100%")]), + a.attribute("xmlns", "http://www.w3.org/2000/svg"), + a.attribute("viewBox", "0 0 256 256"), + a.attribute("fill", "currentColor"), + a.attribute("dangerous-unescaped-html", content), + ], + [], + ) +} diff --git a/packages/bright/e2e/sample/src/icons/github.gleam b/packages/bright/e2e/sample/src/icons/github.gleam new file mode 100644 index 0000000..db6b326 --- /dev/null +++ b/packages/bright/e2e/sample/src/icons/github.gleam @@ -0,0 +1,17 @@ +import lustre/attribute as a +import sketch/lustre/element/html + +const content = "" + +pub fn icon() { + html.svg_( + [ + a.style([#("max-width", "100%"), #("max-height", "100%")]), + a.attribute("xmlns", "http://www.w3.org/2000/svg"), + a.attribute("viewBox", "0 0 256 256"), + a.attribute("fill", "currentColor"), + a.attribute("dangerous-unescaped-html", content), + ], + [], + ) +} diff --git a/packages/bright/e2e/sample/src/icons/home.gleam b/packages/bright/e2e/sample/src/icons/home.gleam new file mode 100644 index 0000000..2869405 --- /dev/null +++ b/packages/bright/e2e/sample/src/icons/home.gleam @@ -0,0 +1,17 @@ +import lustre/attribute as a +import sketch/lustre/element/html + +const content = "" + +pub fn icon() { + html.svg_( + [ + a.style([#("max-width", "100%"), #("max-height", "100%")]), + a.attribute("xmlns", "http://www.w3.org/2000/svg"), + a.attribute("viewBox", "0 0 256 256"), + a.attribute("fill", "currentColor"), + a.attribute("dangerous-unescaped-html", content), + ], + [], + ) +} diff --git a/packages/bright/e2e/sample/src/sample.ffi.mjs b/packages/bright/e2e/sample/src/sample.ffi.mjs new file mode 100644 index 0000000..27bfa91 --- /dev/null +++ b/packages/bright/e2e/sample/src/sample.ffi.mjs @@ -0,0 +1,3 @@ +export function dateNow() { + return Date.now() +} diff --git a/packages/bright/e2e/sample/src/sample.gleam b/packages/bright/e2e/sample/src/sample.gleam new file mode 100644 index 0000000..915c290 --- /dev/null +++ b/packages/bright/e2e/sample/src/sample.gleam @@ -0,0 +1,235 @@ +import bright.{type Bright} +import gleam/bool +import gleam/int +import gleam/io +import gleam/pair +import gleam/result +import gleam/string +import lustre +import lustre/effect +import lustre/event as e +import sketch +import sketch/lustre as sketch_ +import sketch/lustre/element +import sketch/lustre/element/html as h +import sketch/size.{px} +import styles + +@external(javascript, "./sample.ffi.mjs", "dateNow") +fn now() -> Int { + 0 +} + +pub type Data { + Data(counter: Int) +} + +pub type Computed { + Computed(double: Int, triple: Int, memoized: Int, last_lazy: Int) +} + +pub type Model { + Model( + node: String, + counter_1: Bright(Data, Computed), + counter_2: Bright(Data, Computed), + ) +} + +pub type Msg { + First(counter: Counter) + Second(counter: Counter) +} + +pub type Counter { + Decrement + Increment +} + +/// It's possible to switch between `update_both` and `update_one` +/// to see how it works actually. +pub fn main() { + let assert Ok(cache) = sketch.cache(strategy: sketch.Ephemeral) + use _ <- result.try(start(cache, update_one, "#single")) + use _ <- result.try(start(cache, update_both, "#double")) + Ok(Nil) +} + +fn start(cache, update, node) { + let view = sketch_.compose(sketch_.node(), view, cache) + lustre.application(init, update, view) + |> lustre.start(node, node) +} + +fn init(node: String) { + let data = Data(counter: 0) + let computed = Computed(double: 0, triple: 0, memoized: 0, last_lazy: 0) + let counter = bright.init(data, computed) + bright.return(Model(node:, counter_1: counter, counter_2: counter)) +} + +/// Here, update both fields in `Model` with the Counter message. +/// Both counters are synchronized, both exebright the full lifecycle +/// and both side-effects run as desired. +fn update_both(model: Model, msg: Msg) { + use counter_1 <- bright.step(update(model.counter_1, msg.counter)) + use counter_2 <- bright.step(update(model.counter_2, msg.counter)) + bright.return(Model(..model, counter_1:, counter_2:)) +} + +/// Here, update only one field, according to the main message. +/// The other message is not updated. +fn update_one(model: Model, msg: Msg) { + let #(data, msg_) = select_data_structure(model, msg) + use counter <- bright.step(update(data, msg_)) + case msg { + First(..) -> bright.return(Model(..model, counter_1: counter)) + Second(..) -> bright.return(Model(..model, counter_2: counter)) + } +} + +fn select_data_structure(model: Model, msg: Msg) { + case msg { + First(counter) -> #(model.counter_1, counter) + Second(counter) -> #(model.counter_2, counter) + } +} + +/// Execute the full lifecycle, with derived data, and lazy computations. +fn update(model: Bright(Data, Computed), msg: Counter) { + use model <- bright.update(model, update_data(_, msg)) + model + |> bright.compute(fn(d, c) { Computed(..c, double: d.counter * 2) }) + |> bright.compute(fn(d, c) { Computed(..c, triple: d.counter * 3) }) + |> bright.lazy_compute(fn(d) { d.counter / 10 }, compute_memoized) + |> bright.guard(warn_on_three) + |> bright.guard(warn_on_three_multiple) + |> bright.lazy_guard(fn(d) { d.counter / 10 }, warn) +} + +/// Raw update. +fn update_data(model: Data, msg: Counter) { + case msg { + Decrement -> Data(counter: model.counter - 1) + Increment -> Data(counter: model.counter + 1) + } + |> pair.new(effect.none()) +} + +fn view(model: Model) { + element.fragment([ + navbar(model), + styles.body([], [ + introduction(model.node), + explanations(model.node), + styles.container([], [ + counter(model.counter_1) |> element.map(First), + counter(model.counter_2) |> element.map(Second), + ]), + ]), + case model.node { + "#double" -> element.none() + _ -> styles.footer([], [h.text("Made with 💜 at Chou Corp.")]) + }, + ]) +} + +fn introduction(node) { + case node { + "#single" -> element.none() + _ -> + h.div(styles.intro(), [], [ + h.text("Bright is a Lustre's model & update management "), + h.text("package. While your model is the only mutable "), + h.text("place in your application, you can store almost "), + h.text("everything you want inside. Bright provides an "), + h.text("abstraction layer on top of Lustre's model, "), + h.text("and add the ability to derive some data from "), + h.text("your raw data, add some caching for extensive "), + h.text("computations, and protects you from some "), + h.text("invalid state that could come in sometimes."), + ]) + } +} + +fn explanations(node) { + case node { + "#single" -> + sketch.class([sketch.compose(styles.intro()), sketch.margin_top(px(60))]) + |> h.div([], [ + styles.title("Dissociated counters"), + h.text("That second example illustrates the ability to run two "), + h.text("Bright counters in the same application, dissociated with "), + h.text("each other. They both contains two computed, derived "), + h.text("data, and one lazy data, computed every time the result "), + h.text("of counter / 10 changes. But that time, when you change "), + h.text("one, the other will stay the same. You can see the data "), + h.text("and computations will not happen again. Open your "), + h.text("console, and watch the side-effects running!"), + ]) + _ -> + h.div(styles.intro(), [], [ + styles.title("Synchronized counters"), + h.text("That first example illustrates the ability to run two "), + h.text("Bright counters in the same application, synchronized "), + h.text("with each other. They both contains two computed, derived "), + h.text("data, and one lazy data, computed every time the result"), + h.text("of counter / 10 changes. Open your console, and watch "), + h.text("the side-effects running!"), + ]) + } +} + +fn navbar(model: Model) { + case model.node { + "#single" -> element.none() + _ -> styles.nav() + } +} + +fn counter(counter: Bright(Data, Computed)) { + use data, computed <- bright.view(counter) + styles.counter_wrapper([], [ + styles.counter([], [ + styles.counter_number(data.counter), + styles.buttons_wrapper([], [ + styles.button([e.on_click(Increment)], [h.text("Increase")]), + styles.button([e.on_click(Decrement)], [h.text("Decrease")]), + ]), + ]), + styles.counter_infos([], [ + styles.computed("computed.last_lazy: ", computed.last_lazy), + h.hr_([]), + styles.computed("computed.double: ", computed.double), + styles.computed("computed.triple: ", computed.triple), + ]), + ]) +} + +fn compute_memoized(data: Data, computed: Computed) { + let memoized = data.counter * 1000 + let last_lazy = now() + Computed(..computed, memoized:, last_lazy:) +} + +fn warn_on_three(data: Data, _: Computed) { + use <- bool.guard(when: data.counter != 3, return: effect.none()) + use _ <- effect.from + io.println("This message happened because the counter equals 3!") +} + +fn warn_on_three_multiple(data: Data, _: Computed) { + use <- bool.guard(when: data.counter % 3 != 0, return: effect.none()) + use _ <- effect.from + let counter = int.to_string(data.counter) + let msg = "This message happened because the counter is a multiple of 3!" + [msg, "(" <> counter <> ")"] + |> string.join(" ") + |> io.println +} + +fn warn(_, _) { + use _ <- effect.from + "This lazy message happened because the result of counter / 10 changed value!" + |> io.println +} diff --git a/packages/bright/e2e/sample/src/styles.gleam b/packages/bright/e2e/sample/src/styles.gleam new file mode 100644 index 0000000..95fa149 --- /dev/null +++ b/packages/bright/e2e/sample/src/styles.gleam @@ -0,0 +1,192 @@ +import gleam/int +import icons +import lustre/attribute as a +import sketch +import sketch/lustre/element/html as h +import sketch/media +import sketch/size.{px} + +pub fn intro() { + sketch.class([ + sketch.padding(px(40)), + sketch.padding_top(px(0)), + sketch.margin_bottom(px(20)), + sketch.first_of_type([sketch.padding_top(px(40))]), + ]) +} + +pub fn title(title) { + sketch.class([sketch.font_weight("bold")]) + |> h.h2([], [h.text(title)]) +} + +pub fn nav() { + sketch.class([ + sketch.font_size(size.rem(1.3)), + sketch.font_weight("bold"), + sketch.display("flex"), + sketch.justify_content("space-between"), + sketch.margin(px(18)), + sketch.gap(px(36)), + sketch.background("var(--navbar-background)"), + sketch.position("sticky"), + sketch.border_radius(px(10)), + sketch.top(px(18)), + sketch.border("1px solid var(--dark-background)"), + sketch.backdrop_filter("blur(8px)"), + ]) + |> h.nav([a.id("navbar")], [ + sketch.class([ + sketch.display("flex"), + sketch.align_items("center"), + sketch.padding_left(px(18)), + ]) + |> h.div([], [h.text("Bright")]), + h.div_([], []), + h.div( + sketch.class([ + sketch.display("flex"), + sketch.gap(px(24)), + sketch.padding(px(18)), + ]), + [], + [ + external_icon("https://hexdocs.pm/bright", icons.book_open()), + external_icon("https://github.com/ghivert/bright", icons.github()), + ], + ), + ]) +} + +fn external_icon(url, icon) { + sketch.class([ + sketch.color("#aaa"), + sketch.transition("all .3s"), + sketch.hover([sketch.color("var(--text-color)")]), + ]) + |> h.a([a.href(url)], [icons.small(icon)]) +} + +pub fn counter(attrs, children) { + sketch.class([ + sketch.display("flex"), + sketch.flex_direction("column"), + sketch.align_items("center"), + sketch.background("var(--darker-background)"), + sketch.color("var(--text-color)"), + sketch.height(px(220)), + sketch.width(px(220)), + sketch.border_radius(px(2)), + sketch.position("relative"), + sketch.z_index(100), + sketch.border_radius(px(10)), + ]) + |> h.div(attrs, children) +} + +pub fn button(attrs, children) { + sketch.class([ + sketch.appearance("none"), + sketch.border_radius(px(5)), + sketch.background("var(--dark-background)"), + sketch.display("flex"), + sketch.border("1px solid var(--border-color)"), + sketch.align_items("center"), + sketch.justify_content("center"), + sketch.padding(px(10)), + sketch.cursor("pointer"), + sketch.font_family("inherit"), + sketch.color("var(--text-color)"), + sketch.font_size_("inherit"), + sketch.text_transform("uppercase"), + sketch.font_weight("bold"), + sketch.hover([sketch.background("var(--button-hover)")]), + ]) + |> h.button(attrs, children) +} + +pub fn counter_number(counter) { + sketch.class([ + sketch.flex("1"), + sketch.display("flex"), + sketch.align_items("center"), + sketch.padding_top(px(20)), + sketch.font_weight("bold"), + sketch.font_size(size.rem(1.4)), + ]) + |> h.div([], [h.text(int.to_string(counter))]) +} + +pub fn buttons_wrapper(attrs, children) { + sketch.class([ + sketch.display("flex"), + sketch.flex_direction("column"), + sketch.padding(px(10)), + sketch.justify_content("space-evenly"), + sketch.width(size.percent(100)), + sketch.gap(px(10)), + ]) + |> h.div(attrs, children) +} + +pub fn counter_infos(attrs, children) { + sketch.class([ + sketch.font_family("Fira Code"), + sketch.background("var(--dark-background)"), + sketch.position("absolute"), + sketch.top(px(110)), + sketch.left(px(50)), + sketch.width(px(250)), + sketch.height(px(250)), + sketch.z_index(10), + sketch.display("flex"), + sketch.flex_direction("column"), + sketch.justify_content("end"), + sketch.padding(px(10)), + sketch.border_radius(px(10)), + sketch.media(media.max_width(px(400)), [sketch.width(px(200))]), + ]) + |> h.div(attrs, children) +} + +pub fn computed(title, content) { + h.div_([], [h.text(title), h.text(int.to_string(content))]) +} + +pub fn container(attrs, children) { + sketch.class([ + sketch.display("flex"), + sketch.gap(px(10)), + sketch.justify_content("center"), + sketch.media(media.max_width(px(700)), [ + sketch.flex_direction("column"), + sketch.align_items("center"), + ]), + ]) + |> h.div(attrs, children) +} + +pub fn counter_wrapper(attrs, children) { + sketch.class([ + sketch.position("relative"), + sketch.width(px(350)), + sketch.height(px(400)), + sketch.media(media.max_width(px(400)), [sketch.width(px(250))]), + ]) + |> h.div(attrs, children) +} + +pub fn footer(attrs, children) { + sketch.class([ + sketch.text_align("center"), + sketch.margin_top(px(60)), + sketch.margin_bottom(px(30)), + sketch.color("var(--text-grey)"), + ]) + |> h.div(attrs, children) +} + +pub fn body(attrs, children) { + sketch.class([sketch.max_width(px(1000)), sketch.margin_("auto")]) + |> h.div(attrs, children) +} diff --git a/packages/bright/e2e/sample/test/sample_test.gleam b/packages/bright/e2e/sample/test/sample_test.gleam new file mode 100644 index 0000000..3831e7a --- /dev/null +++ b/packages/bright/e2e/sample/test/sample_test.gleam @@ -0,0 +1,12 @@ +import gleeunit +import gleeunit/should + +pub fn main() { + gleeunit.main() +} + +// gleeunit test functions end in `_test` +pub fn hello_world_test() { + 1 + |> should.equal(1) +} diff --git a/packages/bright/gleam.toml b/packages/bright/gleam.toml new file mode 100644 index 0000000..d2072ff --- /dev/null +++ b/packages/bright/gleam.toml @@ -0,0 +1,22 @@ +name = "bright" +version = "0.1.0" + +description = "Be bright. Derive data in your Lustre model." +licences = ["MIT"] + +[[links]] +title = "Sponsor" +href = "https://github.com/sponsors/ghivert" + +[repository] +type = "github" +user = "ghivert" +repo = "bright" + +[dependencies] +gleam_stdlib = ">= 0.34.0 and < 2.0.0" +lustre = ">= 4.6.1 and < 5.0.0" +lustre_dev_tools = ">= 1.6.0 and < 2.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/packages/bright/manifest.toml b/packages/bright/manifest.toml new file mode 100644 index 0000000..d0bc494 --- /dev/null +++ b/packages/bright/manifest.toml @@ -0,0 +1,49 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "argv", version = "1.0.2", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "BA1FF0929525DEBA1CE67256E5ADF77A7CDDFE729E3E3F57A5BDCAA031DED09D" }, + { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, + { name = "directories", version = "1.1.0", build_tools = ["gleam"], requirements = ["envoy", "gleam_stdlib", "platform", "simplifile"], otp_app = "directories", source = "hex", outer_checksum = "BDA521A4EB9EE3A7894F0DC863797878E91FF5C7826F7084B2E731E208BDB076" }, + { name = "envoy", version = "1.0.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "envoy", source = "hex", outer_checksum = "95FD059345AA982E89A0B6E2A3BF1CF43E17A7048DCD85B5B65D3B9E4E39D359" }, + { name = "exception", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "exception", source = "hex", outer_checksum = "F5580D584F16A20B7FCDCABF9E9BE9A2C1F6AC4F9176FA6DD0B63E3B20D450AA" }, + { name = "filepath", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "67A6D15FB39EEB69DD31F8C145BB5A421790581BD6AA14B33D64D5A55DBD6587" }, + { name = "fs", version = "8.6.1", build_tools = ["rebar3"], requirements = [], otp_app = "fs", source = "hex", outer_checksum = "61EA2BDAEDAE4E2024D0D25C63E44DCCF65622D4402DB4A2DF12868D1546503F" }, + { name = "gleam_community_ansi", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "4CD513FC62523053E62ED7BAC2F36136EC17D6A8942728250A9A00A15E340E4B" }, + { name = "gleam_community_colour", version = "1.4.1", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "386CB9B01B33371538672EEA8A6375A0A0ADEF41F17C86DDCB81C92AD00DA610" }, + { name = "gleam_crypto", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "8AE56026B3E05EBB1F076778478A762E9EB62B31AEEB4285755452F397029D22" }, + { name = "gleam_erlang", version = "0.30.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "760618870AE4A497B10C73548E6E44F43B76292A54F0207B3771CBB599C675B4" }, + { name = "gleam_http", version = "3.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "A9EE0722106FCCAB8AD3BF9D0A3EFF92BFE8561D59B83BAE96EB0BE1938D4E0F" }, + { name = "gleam_httpc", version = "3.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "091CDD2BEC8092E82707BEA03FB5205A2BBBDE4A2F551E3C069E13B8BC0C428E" }, + { name = "gleam_json", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "0A57FB5666E695FD2BEE74C0428A98B0FC11A395D2C7B4CDF5E22C5DD32C74C6" }, + { name = "gleam_otp", version = "0.14.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "5A8CE8DBD01C29403390A7BD5C0A63D26F865C83173CF9708E6E827E53159C65" }, + { name = "gleam_package_interface", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_json", "gleam_stdlib"], otp_app = "gleam_package_interface", source = "hex", outer_checksum = "CF3BFC5D0997750D9550D8D73A90F4B8D71C6C081B20ED4E70FFBE1E99AFC3C2" }, + { name = "gleam_stdlib", version = "0.43.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "69EF22E78FDCA9097CBE7DF91C05B2A8B5436826D9F66680D879182C0860A747" }, + { name = "glearray", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glearray", source = "hex", outer_checksum = "B99767A9BC63EF9CC8809F66C7276042E5EFEACAA5B25188B552D3691B91AC6D" }, + { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, + { name = "glint", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "5F6720081150AED8023131B0F3A35F9B0D6426A96CE02BEC52AD7018DF70566A" }, + { name = "glisten", version = "5.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "48EF7F6D1DCA877C2F49AF35CC33946C7129EEB05A114758A2CC569C708BFAF8" }, + { name = "gramps", version = "2.0.3", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "3CCAA6E081225180D95C79679D383BBF51C8D1FDC1B84DA1DA444F628C373793" }, + { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, + { name = "logging", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "1098FBF10B54B44C2C7FDF0B01C1253CAFACDACABEFB4B0D027803246753E06D" }, + { name = "lustre", version = "4.6.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_json", "gleam_otp", "gleam_stdlib"], otp_app = "lustre", source = "hex", outer_checksum = "486C3CFBD126939CAD2CA8B92A979A2DAADA5BABAA62BF2B163CD21E257BD4A1" }, + { name = "lustre_dev_tools", version = "1.6.0", build_tools = ["gleam"], requirements = ["argv", "filepath", "fs", "gleam_community_ansi", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_httpc", "gleam_json", "gleam_otp", "gleam_package_interface", "gleam_stdlib", "glint", "glisten", "mist", "simplifile", "spinner", "term_size", "tom", "wisp"], otp_app = "lustre_dev_tools", source = "hex", outer_checksum = "5A1C7D20FA2C0D77D59F259EAE0E14BB3F5359CC1DE7C5ED6922B65FFCBD4C31" }, + { name = "marceau", version = "1.3.0", build_tools = ["gleam"], requirements = [], otp_app = "marceau", source = "hex", outer_checksum = "2D1C27504BEF45005F5DFB18591F8610FB4BFA91744878210BDC464412EC44E9" }, + { name = "mist", version = "2.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], otp_app = "mist", source = "hex", outer_checksum = "981F12FC8BA0656B40099EC876D6F2BEE7B95593610F342E9AB0DC4E663A932F" }, + { name = "platform", version = "1.0.0", build_tools = ["gleam"], requirements = [], otp_app = "platform", source = "hex", outer_checksum = "8339420A95AD89AAC0F82F4C3DB8DD401041742D6C3F46132A8739F6AEB75391" }, + { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, + { name = "repeatedly", version = "2.1.2", build_tools = ["gleam"], requirements = [], otp_app = "repeatedly", source = "hex", outer_checksum = "93AE1938DDE0DC0F7034F32C1BF0D4E89ACEBA82198A1FE21F604E849DA5F589" }, + { name = "simplifile", version = "2.2.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0DFABEF7DC7A9E2FF4BB27B108034E60C81BEBFCB7AB816B9E7E18ED4503ACD8" }, + { name = "snag", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "08E9EB87C413457DB1DD66CD704C6878DACC9C93B418600F63873D0CD224E756" }, + { name = "spinner", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib", "glearray", "repeatedly"], otp_app = "spinner", source = "hex", outer_checksum = "9EE43AA33BE2DA5731B8F3F170AAB59AF1A815AFA5BF615F12C1B91F3B03F157" }, + { name = "telemetry", version = "1.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "telemetry", source = "hex", outer_checksum = "7015FC8919DBE63764F4B4B87A95B7C0996BD539E0D499BE6EC9D7F3875B79E6" }, + { name = "term_size", version = "1.0.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "term_size", source = "hex", outer_checksum = "D00BD2BC8FB3EBB7E6AE076F3F1FF2AC9D5ED1805F004D0896C784D06C6645F1" }, + { name = "tom", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "tom", source = "hex", outer_checksum = "228E667239504B57AD05EC3C332C930391592F6C974D0EFECF32FFD0F3629A27" }, + { name = "wisp", version = "1.2.0", build_tools = ["gleam"], requirements = ["directories", "exception", "gleam_crypto", "gleam_erlang", "gleam_http", "gleam_json", "gleam_stdlib", "logging", "marceau", "mist", "simplifile"], otp_app = "wisp", source = "hex", outer_checksum = "F71265D2F1DE11426535A2FA1DA3B11D2FFB783B116DF9496BC8C41983EBADB4" }, +] + +[requirements] +gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } +lustre = { version = ">= 4.6.1 and < 5.0.0" } +lustre_dev_tools = { version = ">= 1.6.0 and < 2.0.0" } diff --git a/packages/bright/src/bright.ffi.mjs b/packages/bright/src/bright.ffi.mjs new file mode 100644 index 0000000..599e83f --- /dev/null +++ b/packages/bright/src/bright.ffi.mjs @@ -0,0 +1,9 @@ +import * as gleam from "./gleam.mjs" + +export function coerce(a) { + return a +} + +export function areReferentiallyEqual(a, b) { + return a === b && gleam.isEqual(a, b) +} diff --git a/packages/bright/src/bright.gleam b/packages/bright/src/bright.gleam new file mode 100644 index 0000000..7cfd93c --- /dev/null +++ b/packages/bright/src/bright.gleam @@ -0,0 +1,254 @@ +import gleam/bool +import gleam/dynamic.{type Dynamic} +import gleam/function +import gleam/list +import gleam/pair +import lustre/effect.{type Effect} + +@external(erlang, "bright_ffi", "coerce") +@external(javascript, "./bright.ffi.mjs", "coerce") +fn coerce(a: a) -> b + +/// Optimization on JS, to ensure two data sharing the referential equality +/// will shortcut the comparison. Useful when performance are a thing in client +/// browser. +@external(javascript, "./bright.ffi.mjs", "areReferentiallyEqual") +fn are_referentially_equal(a: a, b: b) -> Bool { + dynamic.from(a) == dynamic.from(b) +} + +/// `Bright` holds raw data and computed data, and is used to compute caching. +/// `Bright` is instanciated using `init`, with initial data and computed data. +pub opaque type Bright(data, computed) { + Bright( + data: data, + computed: computed, + selections: List(Dynamic), + past_selections: List(Dynamic), + effects: List(Dynamic), + ) +} + +/// Creates the initial `Bright`. `data` & `computed` should be initialised with +/// their correct empty initial state. +pub fn init(data data: data, computed computed: computed) { + Bright(data:, computed:, selections: [], past_selections: [], effects: []) +} + +pub fn start( + bright: Bright(data, computed), + next: fn(Bright(data, computed)) -> Bright(data, computed), +) -> #(Bright(data, computed), Effect(msg)) { + let old_computations = bright.past_selections + let new_data = next(bright) + let all_effects = dynamic.from(new_data.effects) |> coerce |> list.reverse + panic_if_different_computations_count(old_computations, new_data.selections) + let past_selections = list.reverse(new_data.selections) + Bright(..new_data, past_selections:, selections: [], effects: []) + |> pair.new(effect.batch(all_effects)) +} + +/// Entrypoint for the update cycle. Use it a way to trigger the start of `Bright` +/// computations, and chain them with other `bright` calls. +/// +/// ```gleam +/// pub fn update(model: Bright(data, computed), msg: Msg) { +/// // Starts the update cycle, and returns #(Bright(data, computed), Effect(msg)). +/// use model <- bright.update(model, update_data(_, msg)) +/// bright.return(model) +/// } +/// ``` +pub fn update( + bright: Bright(data, computed), + update_: fn(data) -> #(data, Effect(msg)), + next: fn(Bright(data, computed)) -> Bright(data, computed), +) -> Bright(data, computed) { + let #(data, effects) = update_(bright.data) + let effects = [dynamic.from(effects), ..bright.effects] + Bright(..bright, data:, effects:) + |> next +} + +/// Derives data from the `data` state, and potentially the current `computed` +/// state. `compute` will run **at every render**, so be careful with computations +/// as they can block paint or actors. +/// +/// ```gleam +/// pub fn update(model: Bright(data, computed), msg: Msg) { +/// use model <- bright.update(model, update_data(_, msg)) +/// model +/// |> bright.compute(fn (d, c) { Computed(..c, field1: computation1(d)) }) +/// |> bright.compute(fn (d, c) { Computed(..c, field2: computation2(d)) }) +/// |> bright.compute(fn (d, c) { Computed(..c, field3: computation3(d)) }) +/// } +/// ``` +pub fn compute( + bright: Bright(data, computed), + compute_: fn(data, computed) -> computed, +) -> Bright(data, computed) { + compute_(bright.data, bright.computed) + |> fn(computed) { Bright(..bright, computed:) } +} + +/// Plugs in existing `data` and `computed` state, to issue some side-effects, +/// when your application needs to run side-effects depending on the current state. +/// +/// ```gleam +/// pub fn update(model: Bright(data, computed), msg: Msg) { +/// use model <- bright.update(model, update_data(_, msg)) +/// use d, c <- bright.guard(model) +/// use dispatch <- effect.from +/// case d.field == 10 { +/// True -> dispatch(my_msg) +/// False -> Nil +/// } +/// } +/// ``` +pub fn run( + bright: Bright(data, computed), + guard_: fn(data, computed) -> Effect(msg), +) -> Bright(data, computed) { + guard_(bright.data, bright.computed) + |> dynamic.from + |> list.prepend(bright.effects, _) + |> fn(effects) { Bright(..bright, effects:) } +} + +/// Derives data like [`compute`](#compute) lazily. `lazy_compute` accepts a +/// selector as second argument. Each time the selector returns a different data +/// than previous run, the computation will run. Otherwise, nothing happens. +/// +/// ```gleam +/// pub fn update(model: Bright(data, computed), msg: Msg) { +/// use model <- bright.update(model, update_data(_, msg)) +/// model +/// |> bright.lazy_compute(selector, fn (d, c) { Computed(..c, field1: computation1(d)) }) +/// |> bright.lazy_compute(selector, fn (d, c) { Computed(..c, field2: computation2(d)) }) +/// |> bright.lazy_compute(selector, fn (d, c) { Computed(..c, field3: computation3(d)) }) +/// } +/// +/// /// Use it with lazy_compute to recompute only when the field when +/// /// { old_data.field / 10 } != { data.field / 10 } +/// fn selector(d, _) { +/// d.field / 10 +/// } +/// ``` +pub fn lazy_compute( + bright: Bright(data, computed), + selector: fn(data) -> a, + compute_: fn(data, computed) -> computed, +) -> Bright(data, computed) { + lazy_wrap(bright, selector, compute, compute_) +} + +/// Plugs in existing `data` like [`guard`](#guard) lazily. `lazy_guard` accepts +/// a selector as second argument. Each time the selector returns a different data +/// than previous run, the computation will run. Otherwise, nothing happens. +/// +/// ```gleam +/// pub fn update(model: Bright(data, computed), msg: Msg) { +/// use model <- bright.update(model, update_data(_, msg)) +/// use d, c <- bright.lazy_guard(model, selector) +/// use dispatch <- effect.from +/// case d.field == 10 { +/// True -> dispatch(my_msg) +/// False -> Nil +/// } +/// } +/// +/// /// Use it with lazy_guard to recompute only when the field when +/// /// { old_data.field / 10 } != { data.field / 10 } +/// fn selector(d, _) { +/// d.field / 10 +/// } +/// ``` +pub fn lazy_run( + bright: Bright(data, computed), + selector: fn(data) -> a, + guard_: fn(data, computed) -> Effect(msg), +) -> Bright(data, computed) { + lazy_wrap(bright, selector, run, guard_) +} + +/// Injects `Bright(data, computed)` in the `view` function, like a middleware. +/// Used to extract `data` & `computed` states from `Bright`. +/// +/// ```gleam +/// pub fn view(model: Bright(data, computed)) { +/// use data, computed <- bright.view(model) +/// html.div([], [ +/// // Use data or computed here. +/// ]) +/// } +/// ``` +pub fn view( + bright: Bright(data, computed), + viewer: fn(data, computed) -> a, +) -> a { + viewer(bright.data, bright.computed) +} + +/// Allows to run multiple `update` on multiple `Bright` in the same update cycle. +/// Every call to step with compute a new `Bright`, and will let you chain the +/// steps. +/// +/// ```gleam +/// pub type Model { +/// Model( +/// fst_bright: Bright(data, computed), +/// snd_bright: Bright(data, computed), +/// ) +/// } +/// +/// fn update(model: Model, msg: Msg) { +/// use fst_bright <- bright.step(update_fst(model.fst_bright, msg)) +/// use snd_bright <- bright.step(update_snd(model.snd_bright, msg)) +/// bright.return(Model(fst_bright:, snd_bright:)) +/// } +/// ``` +pub fn step( + bright: #(Bright(data, computed), Effect(msg)), + next: fn(Bright(data, computed)) -> #(model, Effect(msg)), +) { + let #(bright, effs) = bright + let #(model, effs_) = next(bright) + #(model, effect.batch([effs, effs_])) +} + +/// Helper to write `bright` update cycle. Equivalent to `#(a, effect.none())`. +pub fn return(a) { + #(a, effect.none()) +} + +fn lazy_wrap( + bright: Bright(data, computed), + selector: fn(data) -> a, + setter: fn(Bright(data, computed), fn(data, computed) -> c) -> + Bright(data, computed), + compute_: fn(data, computed) -> c, +) -> Bright(data, computed) { + let selected_data = selector(bright.data) + let selections = [dynamic.from(selected_data), ..bright.selections] + let bright = Bright(..bright, selections:) + case bright.past_selections { + [] -> setter(bright, compute_) + [value, ..past_selections] -> { + Bright(..bright, past_selections:) + |> case are_referentially_equal(value, selected_data) { + True -> function.identity + False -> setter(_, compute_) + } + } + } +} + +fn panic_if_different_computations_count( + old_computations: List(c), + computations: List(d), +) -> Nil { + let count = list.length(old_computations) + use <- bool.guard(when: count == 0, return: Nil) + let is_same_count = count == list.length(computations) + use <- bool.guard(when: is_same_count, return: Nil) + panic as "Memoized computed should be consistent over time, otherwise memo can not work." +} diff --git a/packages/bright/src/bright_ffi.erl b/packages/bright/src/bright_ffi.erl new file mode 100644 index 0000000..4cc764f --- /dev/null +++ b/packages/bright/src/bright_ffi.erl @@ -0,0 +1,6 @@ +-module(bright_ffi). + +-export([coerce/1]). + +coerce(A) -> + A. diff --git a/packages/bright/test/bright_test.gleam b/packages/bright/test/bright_test.gleam new file mode 100644 index 0000000..3831e7a --- /dev/null +++ b/packages/bright/test/bright_test.gleam @@ -0,0 +1,12 @@ +import gleeunit +import gleeunit/should + +pub fn main() { + gleeunit.main() +} + +// gleeunit test functions end in `_test` +pub fn hello_world_test() { + 1 + |> should.equal(1) +} diff --git a/packages/interfaces/.github/workflows/test.yml b/packages/interfaces/.github/workflows/test.yml new file mode 100644 index 0000000..c3d0e65 --- /dev/null +++ b/packages/interfaces/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: test + +on: + push: + branches: + - master + - main + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: erlef/setup-beam@v1 + with: + otp-version: "27.1.2" + gleam-version: "1.6.2" + rebar3-version: "3" + # elixir-version: "1.15.4" + - run: gleam deps download + - run: gleam test + - run: gleam format --check src test diff --git a/packages/interfaces/.gitignore b/packages/interfaces/.gitignore new file mode 100644 index 0000000..599be4e --- /dev/null +++ b/packages/interfaces/.gitignore @@ -0,0 +1,4 @@ +*.beam +*.ez +/build +erl_crash.dump diff --git a/packages/interfaces/README.md b/packages/interfaces/README.md new file mode 100644 index 0000000..446cba5 --- /dev/null +++ b/packages/interfaces/README.md @@ -0,0 +1,24 @@ +# interfaces + +[![Package Version](https://img.shields.io/hexpm/v/interfaces)](https://hex.pm/packages/interfaces) +[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/interfaces/) + +```sh +gleam add interfaces@1 +``` +```gleam +import interfaces + +pub fn main() { + // TODO: An example of the project in use +} +``` + +Further documentation can be found at . + +## Development + +```sh +gleam run # Run the project +gleam test # Run the tests +``` diff --git a/packages/interfaces/gleam.toml b/packages/interfaces/gleam.toml new file mode 100644 index 0000000..663d43a --- /dev/null +++ b/packages/interfaces/gleam.toml @@ -0,0 +1,21 @@ +name = "interfaces" +version = "1.0.0" + +# Fill out these fields if you intend to generate HTML documentation or publish +# your project to the Hex package manager. +# +# description = "" +# licences = ["Apache-2.0"] +# repository = { type = "github", user = "", repo = "" } +# links = [{ title = "Website", href = "" }] +# +# For a full reference of all the available options, you can have a look at +# https://gleam.run/writing-gleam/gleam-toml/. + +[dependencies] +gleam_stdlib = ">= 0.34.0 and < 2.0.0" +birl = ">= 1.7.1 and < 2.0.0" +gleam_json = ">= 2.1.0 and < 3.0.0" + +[dev-dependencies] +gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/packages/interfaces/manifest.toml b/packages/interfaces/manifest.toml new file mode 100644 index 0000000..fbe77a1 --- /dev/null +++ b/packages/interfaces/manifest.toml @@ -0,0 +1,16 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "birl", version = "1.7.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "5C66647D62BCB11FE327E7A6024907C4A17954EF22865FE0940B54A852446D01" }, + { name = "gleam_json", version = "2.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "0A57FB5666E695FD2BEE74C0428A98B0FC11A395D2C7B4CDF5E22C5DD32C74C6" }, + { name = "gleam_stdlib", version = "0.45.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "206FCE1A76974AECFC55AEBCD0217D59EDE4E408C016E2CFCCC8FF51278F186E" }, + { name = "gleeunit", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "F7A7228925D3EE7D0813C922E062BFD6D7E9310F0BEE585D3A42F3307E3CFD13" }, + { name = "ranger", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "B8F3AFF23A3A5B5D9526B8D18E7C43A7DFD3902B151B97EC65397FE29192B695" }, +] + +[requirements] +birl = { version = ">= 1.7.1 and < 2.0.0" } +gleam_json = { version = ">= 2.1.0 and < 3.0.0" } +gleam_stdlib = { version = ">= 0.34.0 and < 2.0.0" } +gleeunit = { version = ">= 1.0.0 and < 2.0.0" } diff --git a/packages/interfaces/src/data/analytics.gleam b/packages/interfaces/src/data/analytics.gleam new file mode 100644 index 0000000..65a22ab --- /dev/null +++ b/packages/interfaces/src/data/analytics.gleam @@ -0,0 +1,88 @@ +import birl +import gleam/dynamic +import gleam/json +import gleam/option +import gleam/pair +import gleam/result + +pub type Analytics { + Analytics( + total_searches: Int, + total_signatures: Int, + total_indexed: Int, + timeseries: List(#(Int, birl.Time)), + ranked: List(Package), + popular: List(Package), + ) +} + +pub type Package { + Package( + name: String, + repository: String, + rank: Int, + popularity: option.Option(Int), + ) +} + +pub fn encode(analytics: Analytics) { + json.object([ + #("total_searches", json.int(analytics.total_searches)), + #("total_signatures", json.int(analytics.total_signatures)), + #("total_indexed", json.int(analytics.total_indexed)), + #("ranked", json.array(analytics.ranked, encode_package)), + #("popular", json.array(analytics.popular, encode_package)), + #("timeseries", { + json.array(analytics.timeseries, fn(row) { + json.object([ + #("count", json.int(row.0)), + #("date", json.string(birl.to_iso8601(row.1))), + ]) + }) + }), + ]) +} + +pub fn decode(dyn) { + dynamic.decode6( + Analytics, + dynamic.field("total_searches", dynamic.int), + dynamic.field("total_signatures", dynamic.int), + dynamic.field("total_indexed", dynamic.int), + dynamic.field("timeseries", { + dynamic.list(dynamic.decode2( + pair.new, + dynamic.field("count", dynamic.int), + dynamic.field("date", fn(dyn) { + dynamic.string(dyn) + |> result.then(fn(t) { + birl.parse(t) + |> result.replace_error([]) + }) + }), + )) + }), + dynamic.field("ranked", dynamic.list(decode_package)), + dynamic.field("popular", dynamic.list(decode_package)), + )(dyn) +} + +pub fn encode_package(package: Package) { + let Package(name:, repository:, rank:, popularity:) = package + json.object([ + #("name", json.string(name)), + #("repository", json.string(repository)), + #("rank", json.int(rank)), + #("popularity", json.nullable(popularity, json.int)), + ]) +} + +pub fn decode_package(dyn) { + dynamic.decode4( + Package, + dynamic.field("name", dynamic.string), + dynamic.field("repository", dynamic.string), + dynamic.field("rank", dynamic.int), + dynamic.field("popularity", dynamic.optional(dynamic.int)), + )(dyn) +} diff --git a/apps/frontend/src/data/implementations.gleam b/packages/interfaces/src/data/implementations.gleam similarity index 100% rename from apps/frontend/src/data/implementations.gleam rename to packages/interfaces/src/data/implementations.gleam diff --git a/apps/frontend/src/data/kind.gleam b/packages/interfaces/src/data/kind.gleam similarity index 67% rename from apps/frontend/src/data/kind.gleam rename to packages/interfaces/src/data/kind.gleam index 0c31fd2..4ddf899 100644 --- a/apps/frontend/src/data/kind.gleam +++ b/packages/interfaces/src/data/kind.gleam @@ -1,4 +1,5 @@ import gleam/dynamic +import gleam/json import gleam/result pub type Kind { @@ -8,7 +9,7 @@ pub type Kind { Constant } -pub fn decode_kind(dyn) { +pub fn decode(dyn) { use str <- result.try(dynamic.string(dyn)) case str { "function" -> Ok(Function) @@ -19,7 +20,17 @@ pub fn decode_kind(dyn) { } } -pub fn display_kind(kind) { +pub fn encode(kind) { + case kind { + Function -> "function" + TypeDefinition -> "type_definition" + TypeAlias -> "type_alias" + Constant -> "constant" + } + |> json.string +} + +pub fn display(kind) { case kind { Function -> "Function" TypeDefinition -> "Type" diff --git a/packages/interfaces/src/data/metadata.gleam b/packages/interfaces/src/data/metadata.gleam new file mode 100644 index 0000000..795bb27 --- /dev/null +++ b/packages/interfaces/src/data/metadata.gleam @@ -0,0 +1,60 @@ +import data/implementations.{type Implementations, Implementations} +import gleam/decoder_extra +import gleam/dynamic +import gleam/json +import gleam/option.{type Option} + +pub type Metadata { + Metadata( + deprecation: Option(String), + implementations: Option(Implementations), + ) +} + +pub fn decode(dyn) { + dynamic.decode2( + Metadata, + decoder_extra.completely_option("deprecation"), + dynamic.optional_field( + "implementations", + dynamic.decode3( + Implementations, + dynamic.field("gleam", dynamic.bool), + dynamic.field("uses_erlang_externals", dynamic.bool), + dynamic.field("uses_javascript_externals", dynamic.bool), + ), + ), + )(dyn) +} + +pub fn encode(metadata: Metadata) { + [] + |> fn(elems) { + case metadata.deprecation { + option.None -> elems + option.Some(deprecation) -> [#("deprecation", json.string(deprecation))] + } + } + |> fn(elems) { + case metadata.implementations { + option.None -> elems + option.Some(implementations) -> [ + #( + "implementations", + json.object([ + #("gleam", json.bool(implementations.gleam)), + #( + "uses_erlang_externals", + json.bool(implementations.uses_erlang_externals), + ), + #( + "uses_javascript_externals", + json.bool(implementations.uses_javascript_externals), + ), + ]), + ), + ] + } + } + |> json.object +} diff --git a/apps/frontend/src/data/package.gleam b/packages/interfaces/src/data/package.gleam similarity index 50% rename from apps/frontend/src/data/package.gleam rename to packages/interfaces/src/data/package.gleam index cc14763..b229b82 100644 --- a/apps/frontend/src/data/package.gleam +++ b/packages/interfaces/src/data/package.gleam @@ -16,18 +16,23 @@ pub type Package { ) } -pub fn decoder(dyn) { +pub fn decode(dyn) { dynamic.decode8( Package, dynamic.field("name", dynamic.string), dynamic.field("repository", dynamic.optional(dynamic.string)), dynamic.field("documentation", dynamic.optional(dynamic.string)), - dynamic.field("hex-url", dynamic.optional(dynamic.string)), + dynamic.field("hex_url", dynamic.optional(dynamic.string)), dynamic.field("licenses", fn(dyn) { - use data <- result.try(dynamic.optional(dynamic.string)(dyn)) - option.unwrap(data, "[]") - |> json.decode(using: dynamic.list(dynamic.string)) - |> result.replace_error([dynamic.DecodeError("", "", [])]) + dynamic.any([ + dynamic.list(dynamic.string), + fn(dyn) { + use data <- result.try(dynamic.optional(dynamic.string)(dyn)) + option.unwrap(data, "[]") + |> json.decode(using: dynamic.list(dynamic.string)) + |> result.replace_error([dynamic.DecodeError("", "", [])]) + }, + ])(dyn) }), dynamic.field("description", dynamic.optional(dynamic.string)), dynamic.field("rank", dynamic.optional(dynamic.int)), @@ -40,3 +45,20 @@ pub fn decoder(dyn) { }), )(dyn) } + +pub fn encode(package: Package) { + json.object([ + #("name", json.string(package.name)), + #("repository", json.nullable(package.repository, json.string)), + #("documentation", json.nullable(package.documentation, json.string)), + #("hex_url", json.nullable(package.hex_url, json.string)), + #("licenses", json.array(package.licenses, json.string)), + #("description", json.nullable(package.description, json.string)), + #("rank", json.nullable(package.rank, json.int)), + #("popularity", { + json.object([#("github", json.int(package.popularity))]) + |> json.to_string + |> json.string + }), + ]) +} diff --git a/apps/frontend/src/data/signature.gleam b/packages/interfaces/src/data/signature.gleam similarity index 68% rename from apps/frontend/src/data/signature.gleam rename to packages/interfaces/src/data/signature.gleam index 7c8adda..10242c1 100644 --- a/apps/frontend/src/data/signature.gleam +++ b/packages/interfaces/src/data/signature.gleam @@ -1,5 +1,6 @@ import gleam/dynamic import gleam/int +import gleam/json import gleam/list import gleam/option.{type Option} import gleam/result @@ -46,7 +47,7 @@ pub type Signature { TypeDefinition(parameters: Int, constructors: List(TypeConstructor)) } -pub fn decode_signature(dyn) { +pub fn decode(dyn) { use res <- result.try(dynamic.field("kind", dynamic.string)(dyn)) case res { "constant" -> decode_constant(dyn) @@ -57,6 +58,35 @@ pub fn decode_signature(dyn) { } } +pub fn encode(signature: Signature) { + case signature { + Constant(type_:, ..) -> + json.object([ + #("kind", json.string("constant")), + #("type", encode_type(type_)), + ]) + TypeAlias(parameters:, alias:, ..) -> + json.object([ + #("kind", json.string("type-alias")), + #("parameters", json.int(parameters)), + #("alias", encode_type(alias)), + ]) + TypeDefinition(parameters:, constructors:) -> + json.object([ + #("kind", json.string("type-definition")), + #("parameters", json.int(parameters)), + #("constructors", json.array(constructors, encode_constructors)), + ]) + Function(name:, return:, parameters:, ..) -> + json.object([ + #("kind", json.string("function")), + #("name", json.string(name)), + #("return", encode_type(return)), + #("parameters", json.array(parameters, encode_parameter)), + ]) + } +} + fn decode_type(dyn) { use res <- result.try(dynamic.field("kind", dynamic.string)(dyn)) case res { @@ -68,6 +98,33 @@ fn decode_type(dyn) { } } +fn encode_type(type_: Type) { + case type_ { + Variable(id:, ..) -> + json.object([#("kind", json.string("variable")), #("id", json.int(id))]) + Fn(parameters:, return:, ..) -> + json.object([ + #("kind", json.string("fn")), + #("params", json.array(parameters, encode_type)), + #("return", encode_type(return)), + ]) + Named(name:, package:, module:, parameters:, ref:, ..) -> + json.object([ + #("kind", json.string("named")), + #("name", json.string(name)), + #("package", json.string(package)), + #("module", json.string(module)), + #("parameters", json.array(parameters, encode_type)), + #("ref", json.nullable(ref, json.string)), + ]) + Tuple(elements:, ..) -> + json.object([ + #("kind", json.string("tuple")), + #("elements", json.array(elements, encode_type)), + ]) + } +} + fn decode_variable(dyn) { dynamic.decode1(fn(a) { Variable(1, a) }, dynamic.field("id", dynamic.int))( dyn, @@ -137,6 +194,13 @@ fn decode_parameter(dyn) { )(dyn) } +pub fn encode_parameter(parameter: Parameter) { + json.object([ + #("label", json.nullable(parameter.label, json.string)), + #("type", encode_type(parameter.type_)), + ]) +} + fn decode_constant(dyn) { dynamic.decode1( fn(a: Type) { @@ -201,3 +265,11 @@ fn decode_constructors(dyn) { dynamic.field("parameters", dynamic.list(decode_parameter)), )(dyn) } + +fn encode_constructors(constructor: TypeConstructor) { + json.object([ + #("documentation", json.nullable(constructor.documentation, json.string)), + #("name", json.string(constructor.name)), + #("parameters", json.array(constructor.parameters, encode_parameter)), + ]) +} diff --git a/packages/interfaces/src/data/type_search.gleam b/packages/interfaces/src/data/type_search.gleam new file mode 100644 index 0000000..a30435d --- /dev/null +++ b/packages/interfaces/src/data/type_search.gleam @@ -0,0 +1,46 @@ +import data/kind.{type Kind} +import data/metadata.{type Metadata} +import data/signature.{type Signature} +import gleam/decoder_extra as decode_ +import gleam/dynamic +import gleam/json + +pub type TypeSearch { + TypeSearch( + type_name: String, + documentation: String, + signature_kind: Kind, + metadata: Metadata, + json_signature: Signature, + module_name: String, + package_name: String, + version: String, + ) +} + +pub fn decode(dyn) { + dynamic.decode8( + TypeSearch, + dynamic.field("type_name", dynamic.string), + dynamic.field("documentation", dynamic.string), + dynamic.field("signature_kind", kind.decode), + dynamic.field("metadata", decode_.json(metadata.decode)), + dynamic.field("json_signature", decode_.json(signature.decode)), + dynamic.field("module_name", dynamic.string), + dynamic.field("package_name", dynamic.string), + dynamic.field("version", dynamic.string), + )(dyn) +} + +pub fn encode(item: TypeSearch) { + json.object([ + #("type_name", json.string(item.type_name)), + #("documentation", json.string(item.documentation)), + #("signature_kind", kind.encode(item.signature_kind)), + #("metadata", metadata.encode(item.metadata)), + #("json_signature", signature.encode(item.json_signature)), + #("module_name", json.string(item.module_name)), + #("package_name", json.string(item.package_name)), + #("version", json.string(item.version)), + ]) +} diff --git a/packages/interfaces/src/gleam/coerce.gleam b/packages/interfaces/src/gleam/coerce.gleam new file mode 100644 index 0000000..c379fff --- /dev/null +++ b/packages/interfaces/src/gleam/coerce.gleam @@ -0,0 +1,3 @@ +@external(erlang, "interfaces_ffi", "coerce") +@external(javascript, "../interfaces.ffi.mjs", "coerce") +pub fn coerce(value: a) -> b diff --git a/packages/interfaces/src/gleam/decoder_extra.gleam b/packages/interfaces/src/gleam/decoder_extra.gleam new file mode 100644 index 0000000..6222325 --- /dev/null +++ b/packages/interfaces/src/gleam/decoder_extra.gleam @@ -0,0 +1,25 @@ +import gleam/dynamic.{type Dynamic} +import gleam/json +import gleam/option +import gleam/result + +pub fn completely_option(field: String) { + fn(dyn: Dynamic) { + dynamic.optional_field(field, dynamic.optional(dynamic.string))(dyn) + |> result.map(fn(res) { option.flatten(res) }) + } +} + +pub fn json(decoder: dynamic.Decoder(a)) { + dynamic.any([ + decoder, + fn(dyn) { + case dynamic.string(dyn) { + Error(e) -> Error(e) + Ok(content) -> + json.decode(content, decoder) + |> result.replace_error([]) + } + }, + ]) +} diff --git a/packages/interfaces/src/interfaces.ffi.mjs b/packages/interfaces/src/interfaces.ffi.mjs new file mode 100644 index 0000000..b6eec50 --- /dev/null +++ b/packages/interfaces/src/interfaces.ffi.mjs @@ -0,0 +1,3 @@ +export function coerce(a) { + return a +} diff --git a/packages/interfaces/src/interfaces.gleam b/packages/interfaces/src/interfaces.gleam new file mode 100644 index 0000000..942143f --- /dev/null +++ b/packages/interfaces/src/interfaces.gleam @@ -0,0 +1,5 @@ +import gleam/io + +pub fn main() { + io.println("Hello from interfaces!") +} diff --git a/packages/interfaces/src/interfaces_ffi.erl b/packages/interfaces/src/interfaces_ffi.erl new file mode 100644 index 0000000..e8ab1dc --- /dev/null +++ b/packages/interfaces/src/interfaces_ffi.erl @@ -0,0 +1,6 @@ +-module(interfaces_ffi). + +-export([coerce/1]). + +coerce(A) -> + A. diff --git a/packages/interfaces/test/interfaces_test.gleam b/packages/interfaces/test/interfaces_test.gleam new file mode 100644 index 0000000..3831e7a --- /dev/null +++ b/packages/interfaces/test/interfaces_test.gleam @@ -0,0 +1,12 @@ +import gleeunit +import gleeunit/should + +pub fn main() { + gleeunit.main() +} + +// gleeunit test functions end in `_test` +pub fn hello_world_test() { + 1 + |> should.equal(1) +} From 027536e775826d5a498fffcaddfdabf08a0b340a Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 22:33:03 +0100 Subject: [PATCH 7/9] Improve handlers in router --- .../src/backend/gleam/type_search/state.gleam | 22 +- apps/backend/src/backend/router.gleam | 189 +----------------- .../backend/src/backend/router/handlers.gleam | 177 ++++++++++++++++ .../interfaces/.github/workflows/test.yml | 23 --- packages/interfaces/README.md | 24 --- packages/interfaces/src/data/metadata.gleam | 47 ++--- packages/interfaces/src/interfaces.gleam | 5 - 7 files changed, 212 insertions(+), 275 deletions(-) create mode 100644 apps/backend/src/backend/router/handlers.gleam delete mode 100644 packages/interfaces/.github/workflows/test.yml delete mode 100644 packages/interfaces/README.md delete mode 100644 packages/interfaces/src/interfaces.gleam diff --git a/apps/backend/src/backend/gleam/type_search/state.gleam b/apps/backend/src/backend/gleam/type_search/state.gleam index 5825ee6..bf65f47 100644 --- a/apps/backend/src/backend/gleam/type_search/state.gleam +++ b/apps/backend/src/backend/gleam/type_search/state.gleam @@ -18,18 +18,15 @@ pub type State { pub fn init(db: pog.Connection) { let init = fn() { - let search = - compute_rows(0, db, #(0, type_search.empty()), { - fn(search: #(Int, TypeSearch), row: #(String, Int)) { - let #(signature, id) = row - signature - |> parse.parse_function - |> result.map(fn(kind) { - #(search.0 + 1, type_search.add(search.1, kind, id)) - }) - |> result.unwrap(search) - } - }) + let search = { + use search, row <- compute_rows(0, db, #(0, type_search.empty())) + let idx = search.0 + 1 + let #(signature, id) = row + signature + |> parse.parse_function + |> result.map(fn(kind) { #(idx, type_search.add(search.1, kind, id)) }) + |> result.unwrap(search) + } process.new_selector() |> process.selecting(process.new_subject(), function.identity) |> actor.Ready(State(db, search.1), _) @@ -57,7 +54,6 @@ fn loop(msg: msg.Msg, state: State) -> actor.Next(msg.Msg, State) { |> actor.continue } } - actor.continue(state) } fn is_permutable(list: List(a), len: Int) { diff --git a/apps/backend/src/backend/router.gleam b/apps/backend/src/backend/router.gleam index 5330d62..0454e86 100644 --- a/apps/backend/src/backend/router.gleam +++ b/apps/backend/src/backend/router.gleam @@ -1,201 +1,24 @@ -import api/hex import backend/context.{type Context} -import backend/error -import backend/gleam/type_search/msg -import backend/postgres/queries +import backend/router/handlers import backend/web import cors_builder as cors -import data/analytics -import data/package -import data/type_search -import gleam/erlang/process import gleam/http -import gleam/int -import gleam/json -import gleam/list -import gleam/option -import gleam/result -import gleam/string_tree -import tasks/hex as syncing import wisp.{type Request, type Response} -fn empty_json() { - let content = "{}" - content - |> string_tree.from_string() - |> wisp.json_response(200) -} - -fn search(query: String, ctx: Context) { - wisp.log_notice("Searching for " <> query) - let _ = queries.upsert_search_analytics(ctx.db, query) - - let exact_type_searches = - option.then(ctx.type_search_subject, fn(subject) { - process.try_call(subject, msg.Find(_, query), within: 25_000) - |> option.from_result - |> option.flatten - }) - |> option.unwrap([]) - |> queries.exact_type_search(ctx.db, _) - |> result.map_error(error.debug_log) - |> result.unwrap([]) - - let exact_name_matches = - queries.name_search(ctx.db, query) - |> result.map_error(error.debug_log) - |> result.unwrap([]) - |> list.filter(fn(i) { !list.contains(exact_type_searches, i) }) - - let exact_module_and_name_matches = - queries.module_and_name_search(ctx.db, query) - |> result.map_error(error.debug_log) - |> result.unwrap([]) - |> list.filter(fn(i) { - !list.contains(list.flatten([exact_type_searches, exact_name_matches]), i) - }) - - let exact_matches = - list.flatten([exact_name_matches, exact_module_and_name_matches]) - - let matches = - queries.content_search(ctx.db, query) - |> result.map_error(error.debug_log) - |> result.unwrap([]) - |> list.filter(fn(i) { - !list.contains(list.flatten([exact_matches, exact_type_searches]), i) - }) - - let signature_searches = - queries.signature_search(ctx.db, query) - |> result.map_error(error.debug_log) - |> result.unwrap([]) - |> list.filter(fn(i) { - !list.contains( - list.flatten([exact_matches, exact_type_searches, matches]), - i, - ) - }) - - let documentation_searches = - queries.documentation_search(ctx.db, query) - |> result.map_error(error.debug_log) - |> result.unwrap([]) - |> list.filter(fn(i) { - !list.contains( - list.flatten([ - exact_matches, - exact_type_searches, - matches, - signature_searches, - ]), - i, - ) - }) - - let module_searches = - queries.module_search(ctx.db, query) - |> result.map_error(error.debug_log) - |> result.unwrap([]) - |> list.filter(fn(i) { - !list.contains( - list.flatten([ - exact_matches, - exact_type_searches, - matches, - signature_searches, - documentation_searches, - ]), - i, - ) - }) - - json.object([ - #("exact-type-matches", json.array(exact_type_searches, type_search.encode)), - #("exact-matches", json.array(exact_matches, type_search.encode)), - #("matches", json.array(matches, type_search.encode)), - #("searches", json.array(signature_searches, type_search.encode)), - #("docs-searches", { - json.array(documentation_searches, type_search.encode) - }), - #("module-searches", { json.array(module_searches, type_search.encode) }), - ]) -} - pub fn handle_get(req: Request, ctx: Context) { case wisp.path_segments(req) { ["healthcheck"] -> wisp.ok() - ["packages"] -> - queries.select_package_by_updated_at(ctx.db) - |> result.unwrap([]) - |> json.array(package.encode) - |> json.to_string_tree - |> wisp.json_response(200) - ["trendings"] -> - wisp.get_query(req) - |> list.find(fn(item) { item.0 == "page" }) - |> result.try(fn(item) { int.parse(item.1) }) - |> result.try_recover(fn(_) { Ok(0) }) - |> result.unwrap(0) - |> queries.select_package_by_popularity(ctx.db, _) - |> result.map(fn(content) { - content - |> json.array(package.encode) - |> json.to_string_tree - |> wisp.json_response(200) - }) - |> result.unwrap(wisp.internal_server_error()) - ["analytics"] -> { - { - use timeseries <- result.try(queries.get_timeseries_count(ctx.db)) - use total_searches <- result.try(queries.get_total_searches(ctx.db)) - use signatures <- result.try(queries.get_total_signatures(ctx.db)) - use packages <- result.try(queries.get_total_packages(ctx.db)) - use #(ranked, popular) <- result.try({ - queries.select_more_popular_packages(ctx.db) - }) - let total_searches = list.first(total_searches) |> result.unwrap(0) - let total_signatures = list.first(signatures) |> result.unwrap(0) - let total_indexed = list.first(packages) |> result.unwrap(0) - Ok(analytics.Analytics( - timeseries:, - total_searches:, - total_signatures:, - total_indexed:, - ranked:, - popular:, - )) - } - |> result.map(fn(content) { - content - |> analytics.encode - |> json.to_string_tree - |> wisp.json_response(200) - }) - |> result.map_error(error.debug_log) - |> result.unwrap(wisp.internal_server_error()) - } - ["search"] -> { - wisp.get_query(req) - |> list.find(fn(item) { item.0 == "q" }) - |> result.replace_error(error.EmptyError) - |> result.map(fn(item) { search(item.1, ctx) }) - |> result.unwrap(json.object([#("error", json.string("internal"))])) - |> json.to_string_tree - |> wisp.json_response(200) - } + ["packages"] -> handlers.packages(req, ctx) + ["trendings"] -> handlers.trendings(req, ctx) + ["analytics"] -> handlers.analytics(req, ctx) + ["search"] -> handlers.search(req, ctx) _ -> wisp.not_found() } } pub fn handle_post(req: Request, ctx: Context) { case wisp.path_segments(req) { - ["packages", "update", name] -> { - let _ = - hex.get_package(name, ctx.hex_api_key) - |> result.try(fn(package) { syncing.sync_package(ctx, package) }) - empty_json() - } + ["packages", "update", name] -> handlers.package_update(req, ctx, name) _ -> wisp.not_found() } } diff --git a/apps/backend/src/backend/router/handlers.gleam b/apps/backend/src/backend/router/handlers.gleam new file mode 100644 index 0000000..b97d9d1 --- /dev/null +++ b/apps/backend/src/backend/router/handlers.gleam @@ -0,0 +1,177 @@ +import api/hex +import backend/context.{type Context} +import backend/error +import backend/gleam/type_search/msg +import backend/postgres/queries +import data/analytics +import data/package +import data/type_search +import gleam/erlang/process +import gleam/int +import gleam/json +import gleam/list +import gleam/option +import gleam/result +import gleam/string_tree +import pog +import tasks/hex as syncing +import wisp.{type Request} + +pub fn analytics(_req: Request, ctx: Context) { + select_all_analytics(ctx) + |> result.map(fn(content) { + content + |> analytics.encode + |> json.to_string_tree + |> wisp.json_response(200) + }) + |> result.map_error(error.debug_log) + |> result.unwrap(wisp.internal_server_error()) +} + +pub fn search(req: Request, ctx: Context) { + wisp.get_query(req) + |> list.find(fn(item) { item.0 == "q" }) + |> result.replace_error(error.EmptyError) + |> result.map(fn(item) { do_search(item.1, ctx) }) + |> result.unwrap(json.object([#("error", json.string("internal"))])) + |> json.to_string_tree + |> wisp.json_response(200) +} + +pub fn packages(_req: Request, ctx: Context) { + queries.select_package_by_updated_at(ctx.db) + |> result.unwrap([]) + |> json.array(package.encode) + |> json.to_string_tree + |> wisp.json_response(200) +} + +pub fn trendings(req: Request, ctx: Context) { + wisp.get_query(req) + |> list.find(fn(item) { item.0 == "page" }) + |> result.try(fn(item) { int.parse(item.1) }) + |> result.try_recover(fn(_) { Ok(0) }) + |> result.unwrap(0) + |> queries.select_package_by_popularity(ctx.db, _) + |> result.map(fn(content) { + content + |> json.array(package.encode) + |> json.to_string_tree + |> wisp.json_response(200) + }) + |> result.unwrap(wisp.internal_server_error()) +} + +pub fn package_update(_req: Request, ctx: Context, name: String) { + let _ = do_update_package(ctx, name) + "{}" + |> string_tree.from_string + |> wisp.json_response(200) +} + +fn do_update_package(ctx: Context, name: String) { + let found_package = hex.get_package(name, ctx.hex_api_key) + use package <- result.try(found_package) + syncing.sync_package(ctx, package) +} + +fn select_all_analytics(ctx: Context) { + use timeseries <- result.try(queries.get_timeseries_count(ctx.db)) + use total_searches <- result.try(queries.get_total_searches(ctx.db)) + use signatures <- result.try(queries.get_total_signatures(ctx.db)) + use packages <- result.try(queries.get_total_packages(ctx.db)) + use #(ranked, popular) <- result.try({ + queries.select_more_popular_packages(ctx.db) + }) + let total_searches = list.first(total_searches) |> result.unwrap(0) + let total_signatures = list.first(signatures) |> result.unwrap(0) + let total_indexed = list.first(packages) |> result.unwrap(0) + Ok(analytics.Analytics( + timeseries:, + total_searches:, + total_signatures:, + total_indexed:, + ranked:, + popular:, + )) +} + +fn do_search(query: String, ctx: Context) { + wisp.log_notice("Searching for " <> query) + let _ = queries.upsert_search_analytics(ctx.db, query) + + let exact_type_searches = exec_type_search(ctx, query) + + let exact_name_matches = + exact_type_searches + |> exec_search(ctx, query, queries.name_search, _) + + let exact_module_and_name_matches = + [exact_type_searches, exact_name_matches] + |> list.flatten + |> exec_search(ctx, query, queries.module_and_name_search, _) + + let exact_matches = + list.flatten([exact_name_matches, exact_module_and_name_matches]) + + let matches = + [exact_matches, exact_type_searches] + |> list.flatten + |> exec_search(ctx, query, queries.content_search, _) + + let signature_searches = + [exact_matches, exact_type_searches, matches] + |> list.flatten + |> exec_search(ctx, query, queries.signature_search, _) + + let documentation_searches = + [exact_matches, exact_type_searches, matches, signature_searches] + |> list.flatten + |> exec_search(ctx, query, queries.documentation_search, _) + + let module_searches = + [ + exact_matches, + exact_type_searches, + matches, + signature_searches, + documentation_searches, + ] + |> list.flatten + |> exec_search(ctx, query, queries.module_search, _) + + json.object([ + #("exact-type-matches", json.array(exact_type_searches, type_search.encode)), + #("exact-matches", json.array(exact_matches, type_search.encode)), + #("matches", json.array(matches, type_search.encode)), + #("searches", json.array(signature_searches, type_search.encode)), + #("docs-searches", json.array(documentation_searches, type_search.encode)), + #("module-searches", { json.array(module_searches, type_search.encode) }), + ]) +} + +fn exec_type_search(ctx: Context, query: String) { + option.then(ctx.type_search_subject, fn(subject) { + process.try_call(subject, msg.Find(_, query), within: 25_000) + |> option.from_result + |> option.flatten + }) + |> option.unwrap([]) + |> queries.exact_type_search(ctx.db, _) + |> result.map_error(error.debug_log) + |> result.unwrap([]) +} + +fn exec_search( + ctx: Context, + query: String, + run: fn(pog.Connection, String) -> + Result(List(type_search.TypeSearch), error.Error), + previous: List(type_search.TypeSearch), +) -> List(type_search.TypeSearch) { + run(ctx.db, query) + |> result.map_error(error.debug_log) + |> result.unwrap([]) + |> list.filter(fn(i) { !list.contains(previous, i) }) +} diff --git a/packages/interfaces/.github/workflows/test.yml b/packages/interfaces/.github/workflows/test.yml deleted file mode 100644 index c3d0e65..0000000 --- a/packages/interfaces/.github/workflows/test.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: test - -on: - push: - branches: - - master - - main - pull_request: - -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: erlef/setup-beam@v1 - with: - otp-version: "27.1.2" - gleam-version: "1.6.2" - rebar3-version: "3" - # elixir-version: "1.15.4" - - run: gleam deps download - - run: gleam test - - run: gleam format --check src test diff --git a/packages/interfaces/README.md b/packages/interfaces/README.md deleted file mode 100644 index 446cba5..0000000 --- a/packages/interfaces/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# interfaces - -[![Package Version](https://img.shields.io/hexpm/v/interfaces)](https://hex.pm/packages/interfaces) -[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/interfaces/) - -```sh -gleam add interfaces@1 -``` -```gleam -import interfaces - -pub fn main() { - // TODO: An example of the project in use -} -``` - -Further documentation can be found at . - -## Development - -```sh -gleam run # Run the project -gleam test # Run the tests -``` diff --git a/packages/interfaces/src/data/metadata.gleam b/packages/interfaces/src/data/metadata.gleam index 795bb27..b165c33 100644 --- a/packages/interfaces/src/data/metadata.gleam +++ b/packages/interfaces/src/data/metadata.gleam @@ -3,6 +3,7 @@ import gleam/decoder_extra import gleam/dynamic import gleam/json import gleam/option.{type Option} +import gleam/pair pub type Metadata { Metadata( @@ -28,33 +29,25 @@ pub fn decode(dyn) { } pub fn encode(metadata: Metadata) { + let Metadata(deprecation:, implementations:) = metadata [] - |> fn(elems) { - case metadata.deprecation { - option.None -> elems - option.Some(deprecation) -> [#("deprecation", json.string(deprecation))] - } - } - |> fn(elems) { - case metadata.implementations { - option.None -> elems - option.Some(implementations) -> [ - #( - "implementations", - json.object([ - #("gleam", json.bool(implementations.gleam)), - #( - "uses_erlang_externals", - json.bool(implementations.uses_erlang_externals), - ), - #( - "uses_javascript_externals", - json.bool(implementations.uses_javascript_externals), - ), - ]), - ), - ] - } - } + |> append_optional(deprecation, fn(d) { #("deprecation", json.string(d)) }) + |> append_optional(implementations, encode_implementations) |> json.object } + +fn encode_implementations(i: Implementations) { + json.object([ + #("gleam", json.bool(i.gleam)), + #("uses_erlang_externals", json.bool(i.uses_erlang_externals)), + #("uses_javascript_externals", json.bool(i.uses_javascript_externals)), + ]) + |> pair.new("implementations", _) +} + +fn append_optional(elems, data, mapper) { + case data { + option.None -> elems + option.Some(data) -> [mapper(data), ..elems] + } +} diff --git a/packages/interfaces/src/interfaces.gleam b/packages/interfaces/src/interfaces.gleam deleted file mode 100644 index 942143f..0000000 --- a/packages/interfaces/src/interfaces.gleam +++ /dev/null @@ -1,5 +0,0 @@ -import gleam/io - -pub fn main() { - io.println("Hello from interfaces!") -} From a5b9e5d0d36029c438448fb9b00b59b977b16461 Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 22:52:14 +0100 Subject: [PATCH 8/9] Improve effects separation --- apps/frontend/src/frontend.gleam | 103 ++---------------- apps/frontend/src/frontend/effects/api.gleam | 53 +++++++++ .../src/frontend/effects/document.gleam | 9 ++ .../src/frontend/effects/window.gleam | 8 ++ apps/frontend/src/frontend/ffi.gleam | 5 - apps/frontend/src/frontend/router.gleam | 36 ++++-- apps/frontend/src/frontend/setup.gleam | 46 ++++++++ apps/frontend/src/frontend/update.gleam | 39 ++----- apps/frontend/src/gloogle.ffi.mjs | 24 ++-- 9 files changed, 178 insertions(+), 145 deletions(-) create mode 100644 apps/frontend/src/frontend/effects/api.gleam create mode 100644 apps/frontend/src/frontend/effects/document.gleam delete mode 100644 apps/frontend/src/frontend/ffi.gleam create mode 100644 apps/frontend/src/frontend/setup.gleam diff --git a/apps/frontend/src/frontend.gleam b/apps/frontend/src/frontend.gleam index 2521dc2..552a3c2 100644 --- a/apps/frontend/src/frontend.gleam +++ b/apps/frontend/src/frontend.gleam @@ -1,114 +1,35 @@ import bright -import data/analytics import data/model.{type Model} import data/msg.{type Msg} -import data/package -import frontend/discuss +import frontend/effects/api import frontend/effects/window import frontend/router +import frontend/setup import frontend/update import frontend/view -import frontend/view/body/search_result as sr -import gleam/dynamic - -import gleam/result - -import grille_pain - -import grille_pain/options -import lustre import lustre/effect -import lustre/lazy -import modem -import sketch -import sketch/magic pub fn main() { - let assert Ok(_) = setup_sketch() - let assert Ok(_) = setup_components() - let assert Ok(_) = setup_grille_pain() - let assert Ok(_) = start_application() -} - -fn setup_sketch() { - use cache <- result.try(sketch.cache(strategy: sketch.Ephemeral)) - use _ <- result.try(magic.setup(cache)) - Ok(Nil) -} - -fn setup_components() { - use _ <- result.try(lazy.setup()) - use _ <- result.try(sr.setup()) - Ok(Nil) -} - -fn setup_grille_pain() { - options.default() - |> options.timeout(5000) - |> grille_pain.setup() -} - -fn start_application() { - lustre.application(init, update, view.view) - |> lustre.start("#app", Nil) -} - -fn get_initial_uri() { - modem.initial_uri() - |> result.map(router.parse_uri) - |> result.unwrap(router.Home) -} - -fn init_modem() { - use uri <- modem.init - router.parse_uri(uri) - |> msg.BrowserChangedRoute -} - -fn get_trendings() { - use dispatch <- effect.from - discuss.about(["trendings"]) - |> discuss.expect(dynamic.list(package.decode)) - |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedTrendings(m)) }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil -} - -fn get_packages() { - use dispatch <- effect.from - discuss.about(["packages"]) - |> discuss.expect(dynamic.list(package.decode)) - |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedPackages(m)) }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil -} - -fn get_analytics() { - use dispatch <- effect.from - discuss.about(["analytics"]) - |> discuss.expect(analytics.decode) - |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedAnalytics(m)) }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil + let assert Ok(_) = setup.sketch() + let assert Ok(_) = setup.components() + let assert Ok(_) = setup.grille_pain() + let assert Ok(_) = setup.start_application(init, update, view.view) } fn init(_) -> #(Model, effect.Effect(Msg)) { - let uri = get_initial_uri() + let route = setup.initial_route() let model = bright.init(model.init_data(), model.Computed) use model <- bright.start(model) - use model <- bright.update(model, update.handle_changed_route(_, uri)) + use model <- bright.update(model, update.handle_changed_route(_, route)) use model <- bright.update(model, update.handle_submitted_search) model - |> bright.run(fn(_, _) { init_modem() }) + |> bright.run(fn(_, _) { setup.modem() }) |> bright.run(fn(data, _) { router.update_page_title(data.route) }) |> bright.run(fn(_, _) { window.subscribe_focus() }) |> bright.run(fn(_, _) { window.subscribe_is_mobile() }) - |> bright.run(fn(_, _) { get_trendings() }) - |> bright.run(fn(_, _) { get_packages() }) - |> bright.run(fn(_, _) { get_analytics() }) + |> bright.run(fn(_, _) { api.get_trendings() }) + |> bright.run(fn(_, _) { api.get_packages() }) + |> bright.run(fn(_, _) { api.get_analytics() }) } fn update(model: Model, msg: Msg) -> #(Model, effect.Effect(Msg)) { diff --git a/apps/frontend/src/frontend/effects/api.gleam b/apps/frontend/src/frontend/effects/api.gleam new file mode 100644 index 0000000..378ab70 --- /dev/null +++ b/apps/frontend/src/frontend/effects/api.gleam @@ -0,0 +1,53 @@ +import data/analytics +import data/model.{type Data} +import data/msg +import data/package +import data/search_result +import frontend/discuss +import gleam/dynamic +import lustre/effect + +pub fn get_trendings() { + use dispatch <- effect.from + discuss.about(["trendings"]) + |> discuss.expect(dynamic.list(package.decode)) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedTrendings(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil +} + +pub fn get_packages() { + use dispatch <- effect.from + discuss.about(["packages"]) + |> discuss.expect(dynamic.list(package.decode)) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedPackages(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil +} + +pub fn get_analytics() { + use dispatch <- effect.from + discuss.about(["analytics"]) + |> discuss.expect(analytics.decode) + |> discuss.on_success(fn(m) { dispatch(msg.ApiReturnedAnalytics(m)) }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil +} + +pub fn get_search(data: Data) { + use dispatch <- effect.from + discuss.about(["search"]) + |> discuss.query([#("q", data.input)]) + |> discuss.expect(search_result.decode_search_results) + |> discuss.on_success(fn(search_results) { + data.input + |> msg.ApiReturnedSearchResults(input: _, search_results:) + |> dispatch + }) + |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) + |> discuss.start + Nil +} diff --git a/apps/frontend/src/frontend/effects/document.gleam b/apps/frontend/src/frontend/effects/document.gleam new file mode 100644 index 0000000..ccf3219 --- /dev/null +++ b/apps/frontend/src/frontend/effects/document.gleam @@ -0,0 +1,9 @@ +import lustre/effect + +pub fn update_title(title: String) { + use _ <- effect.from + do_update_title(title) +} + +@external(javascript, "../../gloogle.ffi.mjs", "updateTitle") +fn do_update_title(title: String) -> Nil diff --git a/apps/frontend/src/frontend/effects/window.gleam b/apps/frontend/src/frontend/effects/window.gleam index a6fc78b..35d03bf 100644 --- a/apps/frontend/src/frontend/effects/window.gleam +++ b/apps/frontend/src/frontend/effects/window.gleam @@ -31,6 +31,11 @@ pub fn subscribe_is_mobile() { dispatch(msg.BrowserResizedViewport(is_mobile)) } +pub fn scroll_to(element id: String) { + use _ <- effect.from + do_scroll_to(id) +} + // FFI @external(javascript, "../../gloogle.ffi.mjs", "subscribeFocus") @@ -50,3 +55,6 @@ fn do_key(event: Dynamic) -> Result(String, Nil) @external(javascript, "../../gloogle.ffi.mjs", "blur") fn do_blur() -> Nil + +@external(javascript, "../../gloogle.ffi.mjs", "scrollTo") +pub fn do_scroll_to(element id: String) -> Nil diff --git a/apps/frontend/src/frontend/ffi.gleam b/apps/frontend/src/frontend/ffi.gleam deleted file mode 100644 index bb68297..0000000 --- a/apps/frontend/src/frontend/ffi.gleam +++ /dev/null @@ -1,5 +0,0 @@ -@external(javascript, "../gloogle.ffi.mjs", "scrollTo") -pub fn scroll_to(element id: String) -> fn(dispatch) -> Nil - -@external(javascript, "../gloogle.ffi.mjs", "updateTitle") -pub fn update_title(title: String) -> Nil diff --git a/apps/frontend/src/frontend/router.gleam b/apps/frontend/src/frontend/router.gleam index f5377f1..d6433c3 100644 --- a/apps/frontend/src/frontend/router.gleam +++ b/apps/frontend/src/frontend/router.gleam @@ -1,9 +1,9 @@ -import frontend/ffi +import frontend/effects/document import gleam/list import gleam/option import gleam/result import gleam/uri.{type Uri} -import lustre/effect +import modem pub type Route { Home @@ -37,12 +37,32 @@ fn handle_search_path(uri: Uri) { } pub fn update_page_title(route: Route) { - use _ <- effect.from() case route { - Home -> ffi.update_title("Gloogle") - Packages -> ffi.update_title("Gloogle — Packages") - Search(q) -> ffi.update_title("Gloogle — Search " <> q) - Trending -> ffi.update_title("Gloogle — Trending") - Analytics -> ffi.update_title("Gloogle — Analytics") + Home -> document.update_title("Gloogle") + Packages -> document.update_title("Gloogle — Packages") + Search(q) -> document.update_title("Gloogle — Search " <> q) + Trending -> document.update_title("Gloogle — Trending") + Analytics -> document.update_title("Gloogle — Analytics") } } + +pub fn to_uri(route: Route) -> Uri { + let assert Ok(uri) = case route { + Home -> uri.parse("/") + Search(query:) -> uri.parse("/search?" <> query) + Packages -> uri.parse("/packages") + Trending -> uri.parse("/trending") + Analytics -> uri.parse("/analytics") + } + uri +} + +pub fn push(route: Route) { + let uri = to_uri(route) + modem.push(uri.path, uri.query, uri.fragment) +} + +pub fn replace(route: Route) { + let uri = to_uri(route) + modem.replace(uri.path, uri.query, uri.fragment) +} diff --git a/apps/frontend/src/frontend/setup.gleam b/apps/frontend/src/frontend/setup.gleam new file mode 100644 index 0000000..bf13b25 --- /dev/null +++ b/apps/frontend/src/frontend/setup.gleam @@ -0,0 +1,46 @@ +import data/msg +import frontend/router +import frontend/view/body/search_result as sr +import gleam/result +import grille_pain +import grille_pain/options +import lustre +import lustre/lazy +import modem +import sketch +import sketch/magic + +pub fn sketch() { + use cache <- result.try(sketch.cache(strategy: sketch.Ephemeral)) + use _ <- result.try(magic.setup(cache)) + Ok(Nil) +} + +pub fn components() { + use _ <- result.try(lazy.setup()) + use _ <- result.try(sr.setup()) + Ok(Nil) +} + +pub fn grille_pain() { + options.default() + |> options.timeout(5000) + |> grille_pain.setup() +} + +pub fn start_application(init, update, view) { + lustre.application(init, update, view) + |> lustre.start("#app", Nil) +} + +pub fn initial_route() { + modem.initial_uri() + |> result.map(router.parse_uri) + |> result.unwrap(router.Home) +} + +pub fn modem() { + use uri <- modem.init + router.parse_uri(uri) + |> msg.BrowserChangedRoute +} diff --git a/apps/frontend/src/frontend/update.gleam b/apps/frontend/src/frontend/update.gleam index 400657f..73b1a31 100644 --- a/apps/frontend/src/frontend/update.gleam +++ b/apps/frontend/src/frontend/update.gleam @@ -4,18 +4,18 @@ import data/msg import data/package import data/search_result import frontend/discuss +import frontend/effects/api import frontend/effects/window import frontend/errors -import frontend/ffi import frontend/router import gleam/bool import gleam/dict import gleam/dynamic.{type Dynamic} -import gleam/option.{None, Some} +import gleam/list +import gleam/option import gleam/pair import grille_pain/lustre/toast import lustre/effect -import modem import toast/error as toast_error pub fn handle_analytics(model: Data, analytics: analytics.Analytics) { @@ -37,7 +37,7 @@ pub fn handle_search_results( search_results |> model.update_search_results(model, input, _) |> model.toggle_loading - |> pair.new(modem.push("/search", Some("q=" <> input), None)) + |> pair.new(router.push(router.Search("q=" <> input))) } pub fn handle_trendings(model: Data, trendings: List(package.Package)) { @@ -76,8 +76,7 @@ pub fn handle_resized_viewport(model: Data, is_mobile: Bool) { } pub fn handle_clicked_sidebar_name(model: Data, id: String) { - ffi.scroll_to(element: id) - |> effect.from + window.scroll_to(element: id) |> pair.new(model, _) } @@ -104,31 +103,15 @@ pub fn handle_submitted_search(model: Data) { let new_route = router.Search(new_model.submitted_input) let is_same_route = new_model.route == new_route use <- bool.guard(when: is_same_route, return: #(new_model, effect.none())) - new_model - |> pair.new( - effect.batch([ - modem.push("search", Some("q=" <> new_model.submitted_input), None), - window.blur(), - ]), - ) + [router.push(router.Search("q=" <> new_model.submitted_input))] + |> list.prepend(window.blur()) + |> effect.batch + |> pair.new(new_model, _) } Error(_) -> { + let effects = effect.batch([api.get_search(model), window.blur()]) model.toggle_loading(new_model) - |> pair.new({ - use dispatch <- effect.from - discuss.about(["search"]) - |> discuss.query([#("q", model.input)]) - |> discuss.expect(search_result.decode_search_results) - |> discuss.on_success(fn(search_results) { - model.input - |> msg.ApiReturnedSearchResults(input: _, search_results:) - |> dispatch - }) - |> discuss.on_error(fn(e) { dispatch(msg.AppRequiredDiscussToast(e)) }) - |> discuss.start - Nil - }) - |> fn(a) { #(a.0, effect.batch([a.1, window.blur()])) } + |> pair.new(effects) } } } diff --git a/apps/frontend/src/gloogle.ffi.mjs b/apps/frontend/src/gloogle.ffi.mjs index 4d73501..bffca58 100644 --- a/apps/frontend/src/gloogle.ffi.mjs +++ b/apps/frontend/src/gloogle.ffi.mjs @@ -8,19 +8,17 @@ function findSearchResultChild(shadowRoot, id) { } export function scrollTo(id) { - return function (_) { - const cache = document.getElementsByTagName('lazy-node') - if (!cache?.[0]) return - const elem = findSearchResultChild(cache[0].shadowRoot, id) - if (!elem) return - const elemRect = elem.getBoundingClientRect() - const navbarRect = document - .getElementsByClassName('navbar')?.[0] - ?.getBoundingClientRect() - const bodyRect = document.body.getBoundingClientRect() - const top = elemRect.top - bodyRect.top - (navbarRect?.height ?? 0) - 12 - window.scrollTo({ top, behavior: 'smooth' }) - } + const cache = document.getElementsByTagName('lazy-node') + if (!cache?.[0]) return + const elem = findSearchResultChild(cache[0].shadowRoot, id) + if (!elem) return + const elemRect = elem.getBoundingClientRect() + const navbarRect = document + .getElementsByClassName('navbar')?.[0] + ?.getBoundingClientRect() + const bodyRect = document.body.getBoundingClientRect() + const top = elemRect.top - bodyRect.top - (navbarRect?.height ?? 0) - 12 + window.scrollTo({ top, behavior: 'smooth' }) } export function captureMessage(content) { From a8518fd334461327a34d102a3e47b81afd1b3ae1 Mon Sep 17 00:00:00 2001 From: Guillaume Hivert Date: Sun, 1 Dec 2024 22:54:06 +0100 Subject: [PATCH 9/9] Upgrade CI --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3f2869d..3f731df 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,8 +16,8 @@ jobs: - name: Setup BEAM uses: erlef/setup-beam@v1 with: - otp-version: '26.0.2' - gleam-version: '1.4.1' + otp-version: '27.0.0' + gleam-version: '1.6.2' rebar3-version: '3' # elixir-version: "1.15.4" - name: Download gleam dependencies @@ -50,8 +50,8 @@ jobs: - name: Setup BEAM uses: erlef/setup-beam@v1 with: - otp-version: '26.0.2' - gleam-version: '1.4.1' + otp-version: '27.0.0' + gleam-version: '1.6.2' rebar3-version: '3' - name: Download gleam dependencies run: gleam deps download
  • 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 qrdE!U9fFL!SIZOX>Dj^CciK;Gf>AE! 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