{"id":17654695,"url":"https://github.com/ubugeeei/firegen","last_synced_at":"2026-01-19T08:02:08.917Z","repository":{"id":46780112,"uuid":"409025660","full_name":"ubugeeei/firegen","owner":"ubugeeei","description":"Generator of Firestore rules and type safe client code.","archived":false,"fork":false,"pushed_at":"2021-09-26T08:31:18.000Z","size":29,"stargazers_count":3,"open_issues_count":13,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-14T22:57:13.596Z","etag":null,"topics":["code-generation","firebase","firestore","rust","rust-lang"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ubugeeei.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-09-22T01:24:49.000Z","updated_at":"2022-10-06T17:15:17.000Z","dependencies_parsed_at":"2022-09-23T03:41:55.648Z","dependency_job_id":null,"html_url":"https://github.com/ubugeeei/firegen","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ubugeeei/firegen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ubugeeei%2Ffiregen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ubugeeei%2Ffiregen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ubugeeei%2Ffiregen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ubugeeei%2Ffiregen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ubugeeei","download_url":"https://codeload.github.com/ubugeeei/firegen/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ubugeeei%2Ffiregen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28563224,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T03:31:16.861Z","status":"ssl_error","status_checked_at":"2026-01-19T03:31:15.069Z","response_time":67,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["code-generation","firebase","firestore","rust","rust-lang"],"created_at":"2024-10-23T12:35:39.845Z","updated_at":"2026-01-19T08:02:08.901Z","avatar_url":"https://github.com/ubugeeei.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/71201308/134777775-a850f363-60f5-4180-893b-975a2ece126c.png\"\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n   \u003ca href=\"https://github.com/Ubugeeei/firegen/actions/workflows/rust.yml\"\u003e\n    \u003cimg src=\"https://github.com/Ubugeeei/firegen/actions/workflows/rust.yml/badge.svg\" alt=\"Rust CI\" /\u003e\n  \u003c/a\u003e\n  \n  \u003cp\u003eGenerator of Firestore rules and type safe client code.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n# Usage [WIP]\n## Install from npm or curl.\n```sh\n$ npm install -g firegen\n```\n## Setting your yml.\n\n```yml\n# firegen.yml\nschemaPath: ./schema/**/**.fireSchema\nexport:\n  rulesPath: ./generated/firestore.rules\n  clientCodePath: ./generated/firestoreClient.ts\n\n```\n\n## Create firestore schema files.\n```ts\n// User.fireSchema\n\n/**\n * definition schema\n */\nDocument User {\n  username: Text\n  mail?: Text\n  age: Int\n  todos: Todo\n}\n/**\n * [WIP] Rules schema\n */\n//ex1\nDocument Todo rules TodoRules {\n  id: Int\n  description: Text\n  memo?: Text\n}\nRule TodoRules {\n get: request.auth != null\n list: true\n create: request.auth.uid == userKey\n update: request.auth.uid == userKey\n delete: false\n}\n\n//ex2 normalization rules\nDocument Todo rules AllowReadOnlyLoginUser \u0026 AllowWriteOriginalUser {\n  id: number\n  description: string\n  memo?: string\n}\nRule AllowReadOnlyLoginUser {\n  get: request.auth != null\n  list: request.auth != null\n}\nRule AllowWriteOriginalUser {\n  create: request.auth.uid == userId\n  update: request.auth.uid == userId\n  delete: request.auth.uid == userId\n}\n\n```\n\n\n## Run command to generate files.\n```sh\n$ firegen generate\n```\nexort as\n```ts\n// types\nexport interface User {\n  id: number\n  username: string\n  mail?: string\n  age: number\n  todos: Todo[]\n}\nexport interface UserCreateInput {\n  username: string\n  mail?: string\n  age: number\n  todos: Todo[]\n}\nexport interface UserUpdateInput {\n  username?: string\n  mail?: string\n  age?: number\n}\nexport interface Todo {\n  id: number\n  description: string\n  memo?: string\n  createdAt?: string\n  isDone: boolean\n}\nexport interface TodoCreateInput {\n  description: string\n  memo?: string\n  createdAt?: string\n  isDone: boolean\n}\nexport interface TodoUpdateInput {\n  description: string\n  memo?: string\n  createdAt?: string\n  isDone: boolean\n}\n```\n\n```ts\n// client code\nimport firebase from \"firebase\"\nconst db = firebase.firestore()\nexport const firestoreClient = {\n  getUsers: async (): Promise\u003cUser[]\u003e =\u003e\n    await db.collection('users').get(),\n\n  getUser: async (id: number): Promise\u003cUser\u003e =\u003e\n    await db.collection('users').doc(id).get(),\n\n  createUser: async (input: UserCreateInput) =\u003e\n    await db.collection('users').add(input),\n\n  updateUser: async (userId: number, input: UserUpdateInput) =\u003e\n    await db.collection('users').doc(userId).update(input),\n\n  deleteUser: async (id: number) =\u003e\n    await db.collection('users').doc(id).delete(),\n\n  getTodosByUser: async (id: number): Promise\u003cTodo[]\u003e =\u003e\n    await db.collection('users').doc(id).collection('todos').get(),\n\n  getTodoByUser: async (userId: number, todoId: number): Promise\u003cTodo\u003e =\u003e\n    await db.collection('users').doc(userId).collection('todos').doc(todoId).get(),\n\n  createTodo: async (userId: number, input: TodoCreateInput) =\u003e\n    await db.collection('users').doc(userId).collection('todos').add(input),\n\n  updateTodo: async (userId: number, todoId: number, input: TodoUpdateInput) =\u003e\n    await db.collection('users').doc(userId).collection('todos').doc(todoId).update(input),\n\n  deleteTodo: async (userId: number, todoId: number) =\u003e\n    await db.collection('users').doc(userId).collection('todos').doc(todoId).delete()\n}\n```\n\n```ts\n// rules\nrules_version = '2';\n\nservice cloud.firestore {\n    match /databases/{database}/documents {\n         match /users/{userId} {\n             match /todos/{todoId} {\n                 allow get: if request.auth != null\n                 allow create: if request.auth.uid == userId\n                 allow update: if request.auth.uid == userId\n                 allow delete: if request.auth.uid == userId\n             }\n             \n         }\n     }\n}\n```\n\n```ts\n/**\n * use in your project!\n */\nconst userId = store.user.id\nconst user = await firestoreClient.getUser(userId)\nconst todos = await firestoreClient.getTodosByUser(userId)\n\nconst todoId = 22\nawait firestoreClient.deleteTodo(userId, todoId)\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fubugeeei%2Ffiregen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fubugeeei%2Ffiregen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fubugeeei%2Ffiregen/lists"}