{"id":23091896,"url":"https://github.com/ttak0422/elmish.urlbuilder","last_synced_at":"2026-05-02T19:33:30.009Z","repository":{"id":47421807,"uuid":"179813278","full_name":"ttak0422/Elmish.UrlBuilder","owner":"ttak0422","description":"Elm inspired URL builder. Sample Application -\u003e","archived":false,"fork":false,"pushed_at":"2023-01-03T19:16:50.000Z","size":557,"stargazers_count":0,"open_issues_count":10,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-01T18:09:03.236Z","etag":null,"topics":["elm","elmish","fable","fsharp"],"latest_commit_sha":null,"homepage":"https://ttak0422.github.io/Elmish.UrlBuilder.Sample/public/","language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ttak0422.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-06T09:26:11.000Z","updated_at":"2020-01-25T18:39:20.000Z","dependencies_parsed_at":"2023-02-01T09:01:59.915Z","dependency_job_id":null,"html_url":"https://github.com/ttak0422/Elmish.UrlBuilder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ttak0422%2FElmish.UrlBuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ttak0422%2FElmish.UrlBuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ttak0422%2FElmish.UrlBuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ttak0422%2FElmish.UrlBuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ttak0422","download_url":"https://codeload.github.com/ttak0422/Elmish.UrlBuilder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247054762,"owners_count":20876066,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elm","elmish","fable","fsharp"],"created_at":"2024-12-16T21:26:16.125Z","updated_at":"2026-05-02T19:33:29.979Z","avatar_url":"https://github.com/ttak0422.png","language":"F#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Elmish.UrlBuilder\n\n[![NuGet version](https://badge.fury.io/nu/Fable.Elmish.UrlBuilder.svg)](https://badge.fury.io/nu/Fable.Elmish.UrlBuilder)\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/ff726cda5320446ca1947c1aa439b8cc)](https://www.codacy.com/app/ttak0422/U?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=ttak0422/U\u0026utm_campaign=Badge_Grade)\n\n- master\n\n  [![Build status](https://ci.appveyor.com/api/projects/status/noi4pduruj1k1fqi/branch/master?svg=true)](https://ci.appveyor.com/project/ttak0422/elmish-urlbuilder/branch/master)\n  [![Build Status](https://travis-ci.org/ttak0422/Elmish.UrlBuilder.svg?branch=master)](https://travis-ci.org/ttak0422/Elmish.UrlBuilder)\n\n- dev\n\n  [![Build status](https://ci.appveyor.com/api/projects/status/noi4pduruj1k1fqi/branch/master?svg=true)](https://ci.appveyor.com/project/ttak0422/elmish-urlbuilder/branch/dev)\n  [![Build Status](https://travis-ci.org/ttak0422/Elmish.UrlBuilder.svg?branch=dev)](https://travis-ci.org/ttak0422/Elmish.UrlBuilder)\n\n## About\n\n[**elm/url**](https://github.com/elm/url) for [**elmish/elmish**](https://github.com/elmish/elmish)\n\n## Build\n\n```sh\n./fake.sh build\n```\n\n## Info\n\n### URLs\n\n```fsharp\ntype Url =\n\t{ Protocol : Protocol\n  \t  Host : string\n\t  Port : Option\u003cint\u003e\n\t  Path : string\n\t  Query : Option\u003cstring\u003e\n\t  Fragment : Option\u003cstring\u003e }\n```\n\n```fsharp\ntype Protocol =\n\t| Http\n\t| Https\n```\n\n```fsharp\ntoString // Url -\u003e string\n```\n\n```fsharp\nfromString // string -\u003e Option\u003cUrl\u003e\n\n// sample\nfromString \"https://example.com:443/\"\n(*\n\tSome { Protocol = Https\n\t       Host =  \"example.com\"\n\t       Port = Some 443\n\t       Path =  \"/\"\n\t       Query = None\n\t       Fragment = None }\n*)\n\nfromString \"https://example.com/hats?q=top%20hat\"\n(*\n\tSome { Protocol = Https\n\t       Host = \"example.com\"\n\t       Port = None\n\t       Path = \"/hats\"\n\t       Query = Some \"q=top%20hat\"\n\t       Fragment = None }\n*)\n\nfromString \"http://example.com/core/List/#map\"\n(*\n\tSome { Protocol = Http\n\t       Host = \"example.com\"\n\t       Port = None\n\t       Path = \"/core/List\"\n\t       Query = None\n\t       Fragment = Some \"map\" }\n*)\n\nfromString \"example.com:443\"        = None\nfromString \"http://tom@example.com\" = None\nfromString \"http://#cats\"           = None\n```\n\n### Percent-Encoding\n\n```fsharp\npercentEncode // string -\u003e string\n\n// sample\npercentEncode \"hat\"   = \"hat\"\npercentEncode \"to be\" = \"to%20be\"\npercentEncode \"99%\"   = \"99%25\"\n\npercentEncode \"$\" = \"%24\"\npercentEncode \"¢\" = \"%C2%A2\"\npercentEncode \"€\" = \"%E2%82%AC\"\n```\n\n```fsharp\npercentDecode // string -\u003e Option\u003cstring\u003e\n\n// sample\npercentDecode \"hat\"     = Some \"hat\"\npercentDecode \"to%20be\" = Some \"to be\"\npercentDecode \"99%25\"   = Some \"99%\"\n\npercentDecode \"%24\"       = Some \"$\"\npercentDecode \"%C2%A2\"    = Some \"¢\"\npercentDecode \"%E2%82%AC\" = Some \"€\"\n\npercentDecode \"%\"   = None\npercentDecode \"%XY\" = None\npercentDecode \"%C2\" = None\n```\n\n### Queries\n\n**\u003cfont color = \"Red\"\u003eThe following function name is different from elm/url\u003c/font\u003e**\n\n- **\u003cfont color = \"Red\"\u003estr (in elm/url is string)\u003c/font\u003e**\n- **\u003cfont color = \"Red\"\u003ei32 (in elm/url is int)\u003c/font\u003e**\n\n```fsharp\ntype QueryPatameter = QueryPatameter of  keyValue : string * string\n```\n\n```fsharp\nstr // string -\u003e string -\u003e QueryParameter\n\n// sample\nabsolute [ \"products\" ] [ str \"search\" \"hat\" ]\n(*\n\t\"/products?search=hat\"\n*)\n\nabsolute [ \"products\" ] [ str \"search\" \"coffee table\" ]\n(*\n\t\"/products?search=coffee%20table\"\n*)\n```\n\n```fsharp\ni32 // string -\u003e int -\u003e QueryParameter\n\n// sample\nabsolute [ \"products\" ] [ str \"search\" \"hat\"; i32 \"page\" 2 ]\n(*\n\t\"/products?search=hat\u0026page=2\"\n*)\n```\n\n```fsharp\ntoQuery // QueryParameter list -\u003e string\n\n// sample\ntoQuery [ str \"search\" \"hat\" ]\n(*\n\t\"?search=hat\"\n*)\n\ntoQuery [ str \"search\" \"coffee table\" ]\n(*\n\t\"?search=coffee%20table\"\n*)\n\ntoQuery [ str \"search\" \"hat\"; int \"page\" 2 ]\n(*\n\t\"?search=hat\u0026page=2\"\n*)\n\ntoQuery []\n(*\n\t\"\"\n*)\n```\n\n### Builder\n\n```fsharp\ntype Root =\n\t| Absolute\n\t| Relative\n\t| CrossOrigin of string\n```\n\n```fsharp\nabusolute // string list -\u003e QueryParameter list -\u003e strnig\n\n// sample\nabsolute [] []\n(*\n\t\"/\"\n*)\n\nabsolute [ \"packages\"; \"elmish\"; \"elmish\" ] []\n(*\n\t\"/packages/elmish/elmish\n*)\n\nabsolute [ \"blog\"; string 42 ] []\n(*\n\t\"/blog/42\"\n*)\n\nabsolute [ \"products\" ] [ str \"search\" \"hat\"; i32 \"page\" 2 ]\n(*\n\t\"/products?search=hat\u0026page=2\"\n*)\n```\n\n```fsharp\nrelative // string list -\u003e QueryParameter list -\u003e string\n\n// sample\nrelative [] []\n(*\n\t\"\"\n*)\n\nrelative [ \"elmish\"; \"elmish\" ] []\n(*\n\t\"elmish/elmish\"\n*)\n\nrelative [ \"blog\"; string 42 ] []\n(*\n\t\"blog/42\"\n*)\n\nrelative [ \"products\" ] [ str \"search\" \"hat\"; i32 \"page\" 2 ]\n(*\n\t\"products?search=hat\u0026page=2\"\n*)\n```\n\n```fsharp\ncrossOrigin // string -\u003e string list -\u003e QueryParameter list -\u003e string\n\n// sample\ncrossOrigin \"https://example.com\" [ \"products\" ] []\n(*\n\t\"https://example.com/products\"\n*)\n\ncrossOrigin \"https://example.com\" [] []\n(*\n\t\"https://example.com/\"\n*)\n\ncrossOrigin\n  \"https://example.com:8042\"\n  [ \"over\"; \"there\" ]\n  [ str \"name\" \"ferret\" ]\n(*\n\t\"https://example.com:8042/over/there?name=ferret\"\n*)\n```\n\n```fsharp\ncustom // Root -\u003e string list -\u003e QueryParameter list -\u003e Option\u003cstring\u003e -\u003e string\n\n// sample\ncustom Absolute\n  [ \"packages\"; \"elmish\"; \"elmish\"; \"latest\"; \"String\" ]\n  []\n  (Some \"length\")\n(*\n\t\"/packages/elmish/elmish/latest/String#length\"\n*)\n\ncustom Relative [ \"there\" ] [ str \"name\" \"ferret\" ] None\n(*\n\t\"there?name=ferret\"\n*)\n\ncustom\n  (CrossOrigin \"https://example.com:8042\")\n  [ \"over\"; \"there\" ]\n  [ str \"name\" \"ferret\" ]\n  (Some \"nose\")\n(*\n\t\"https://example.com:8042/over/there?name=ferret#nose\"\n*)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fttak0422%2Felmish.urlbuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fttak0422%2Felmish.urlbuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fttak0422%2Felmish.urlbuilder/lists"}