{"id":18052972,"url":"https://github.com/izumisy/elm-firestore","last_synced_at":"2025-04-10T19:42:13.130Z","repository":{"id":38736071,"uuid":"210417867","full_name":"IzumiSy/elm-firestore","owner":"IzumiSy","description":"*Experimental* A type-safe Firestore integration for Elm","archived":false,"fork":false,"pushed_at":"2023-08-15T21:41:39.000Z","size":2198,"stargazers_count":16,"open_issues_count":10,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-24T17:21:17.664Z","etag":null,"topics":["elm","firestore"],"latest_commit_sha":null,"homepage":"https://package.elm-lang.org/packages/IzumiSy/elm-firestore/latest/","language":"Elm","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/IzumiSy.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-09-23T17:51:29.000Z","updated_at":"2025-02-20T17:18:18.000Z","dependencies_parsed_at":"2023-02-18T10:00:53.133Z","dependency_job_id":null,"html_url":"https://github.com/IzumiSy/elm-firestore","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IzumiSy%2Felm-firestore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IzumiSy%2Felm-firestore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IzumiSy%2Felm-firestore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/IzumiSy%2Felm-firestore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/IzumiSy","download_url":"https://codeload.github.com/IzumiSy/elm-firestore/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248281417,"owners_count":21077423,"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","firestore"],"created_at":"2024-10-30T23:13:54.569Z","updated_at":"2025-04-10T19:42:13.106Z","avatar_url":"https://github.com/IzumiSy.png","language":"Elm","funding_links":[],"categories":[],"sub_categories":[],"readme":"# elm-firestore\n\n[![CircleCI](https://circleci.com/gh/IzumiSy/elm-firestore.svg?style=svg)](https://circleci.com/gh/IzumiSy/elm-firestore)\n\nA type-safe Firestore integration module for Elm. No JavaScript/TypeScript needed for ports.\n\nThe features elm-firestore library supports are as follows:\n\n| Feature                                                  | Supported?                  |\n| :------------------------------------------------------- | :-------------------------- |\n| Simple CRUD operation (get, list, create, patch, delete) | :white_check_mark: Yes      |\n| Transactions                                             | :white_check_mark: Yes      |\n| Collection group                                         | :white_check_mark: Yes      |\n| Query                                                    | Partially supported         |\n| Realtime update listening                                | :heavy_exclamation_mark: No |\n\n### When will this package support realtime update?\n\nRealtime update listening is one of fundamental features Firestore offers, but this library internally uses Firestore RESTful API which is officially said to be out of support for realtime update.\n\nI strongly recommend you to use Firestore SDK in JavaScript through Ports instead of this library if you have a strong need to use realtime update on Firestore. This library shall not support it unless Google changes their mind.\n\n## Example\n\nAlmost all [basic types](https://firebase.google.com/docs/firestore/reference/rest/v1beta1/Value) in Firestore are supported\n\n```elm\nimport Firestore\nimport Firestore.Config as Config\nimport Firestore.Decode as FSDecode\nimport Firestore.Types.Geopoint as Geopoint\nimport Firestore.Types.Reference as Reference\nimport Result.Extra as ExResult\n\n\n-- model\n\n\ntype alias Model =\n    { firestore : Firestore.Firestore\n    , document : Maybe (Firestore.Document Document)\n    }\n\n\ntype alias Document =\n    { timestamp : Time.Posix\n    , geopoint : Geopoint.Geopoint\n    , reference : Reference.Reference\n    , integer : Int\n    , string : String\n    , list : List String\n    , map : Dict.Dict String String\n    , boolean : Bool\n    , nullable : Maybe String\n    }\n\n\n\n-- init\n\n\ninit : ( Model, Cmd Msg )\ninit =\n    let\n        firestore =\n            Config.new\n                { apiKey = \"your-own-api-key\"\n                , project = \"your-firestore-app\"\n                }\n                |\u003e Config.withDatabase \"your-own-database\" -- optional\n                |\u003e Config.withAuthorization \"your-own-auth-token\" -- optional\n                |\u003e Firestore.init\n    in\n    ( { firestore = firestore, document = Nothing }\n    , firestore\n        |\u003e Firestore.root\n        |\u003e Firestore.collection \"users\"\n        |\u003e Firestore.document \"user1\"\n        |\u003e Firestore.build\n        |\u003e ExResult.toTask\n        |\u003e Task.andThen (Firestore.get decoder)\n        |\u003e Task.attempt GotDocument\n    )\n\n\ndecoder : FSDecode.Decoder Document\ndecoder =\n    FSDecode.document Document\n        |\u003e FSDecode.required \"timestamp\" FSDecode.timestamp\n        |\u003e FSDecode.required \"geopoint\" FSDecode.geopoint\n        |\u003e FSDecode.required \"reference\" FSDecode.reference\n        |\u003e FSDecode.required \"integer\" FSDecode.int\n        |\u003e FSDecode.required \"string\" FSDecode.string\n        |\u003e FSDecode.required \"list\" (FSDecode.list FSDecode.string)\n        |\u003e FSDecode.required \"map\" (FSDecode.dict FSDecode.string)\n        |\u003e FSDecode.required \"boolean\" FSDecode.bool\n        |\u003e FSDecode.required \"nullable\" (FSDecode.maybe FSDecode.string)\n\n\nencoder : Document -\u003e FSEncode.Encoder\nencoder doc =\n    FSEncode.new\n        |\u003e FSEncode.field \"timestamp\" (FSEncode.timestamp doc.timestamp)\n        |\u003e FSEncode.field \"geopoint\" (FSEncode.geopoint doc.geopoint)\n        |\u003e FSEncode.field \"reference\" (FSEncode.reference doc.reference)\n        |\u003e FSEncode.field \"integer\" (FSEncode.int doc.integer)\n        |\u003e FSEncode.field \"string\" (FSEncode.string doc.string)\n        |\u003e FSEncode.field \"list\" (FSEncode.list FSEncode.string doc.list)\n        |\u003e FSEncode.field \"map\" (FSEncode.dict FSEncode.string doc.map)\n        |\u003e FSEncode.field \"boolean\" (FSEncode.bool doc.boolean)\n        |\u003e FSEncode.build\n\n\n\n-- update\n\n\ntype Msg\n    = GotDocument (Result Firestore.Error (Firestore.Document Document))\n    | SaveDocument Document\n\n\nupdate : Msg -\u003e Model -\u003e ( Model, Cmd msg )\nupdate msg model =\n    case msg of\n        SaveDocument doc -\u003e\n            ( model\n            , model.firestore\n                |\u003e Firestore.root\n                |\u003e Firestore.collection \"users\"\n                |\u003e Firestore.document \"user1\"\n                |\u003e Firestore.build\n                |\u003e ExResult.toTask\n                |\u003e ExResult.toTask\n                |\u003e Task.andThen (Firestore.insert decoder (encoder doc))\n                |\u003e Task.attempt GotDocument\n            )\n\n        GotDocument result -\u003e\n            case result of\n                Ok document -\u003e\n                    ( { model | document = Just document }, Cmd.none )\n\n                Err (Firestore.Http_ httpErr) -\u003e\n                    -- ...\n\n                Err (Firestore.Response firestoreErr) -\u003e\n                    -- ...\n```\n\n## Development\n\n### Setup\n\n```shell\n$ npm install\n```\n\n### Build\n\n```shell\n$ npm run build\n```\n\n### Unit testing\n\n```shell\n$ npm test\n```\n\n### Integration testing\nThis requires you to install Open JDK to run Firestore Emulator.\n\n```shell\n$ npm run test:integration:setup\n$ npm run test:integration\n```\n\n## License\n\nMIT\n\n## Contribution\n\nPRs accepted\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fizumisy%2Felm-firestore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fizumisy%2Felm-firestore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fizumisy%2Felm-firestore/lists"}