{"id":21815341,"url":"https://github.com/raflymln/zod-key-parser","last_synced_at":"2025-10-29T16:33:43.538Z","repository":{"id":191918126,"uuid":"685954851","full_name":"raflymln/zod-key-parser","owner":"raflymln","description":"Parse your Zod schema into keys or Prisma ORM select format","archived":false,"fork":false,"pushed_at":"2024-08-12T13:58:43.000Z","size":227,"stargazers_count":19,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-10T04:12:10.210Z","etag":null,"topics":["nextjs","react","server-actions","typescript","validation","zod"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/zod-key-parser","language":"TypeScript","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/raflymln.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-09-01T11:52:42.000Z","updated_at":"2024-12-16T16:16:43.000Z","dependencies_parsed_at":"2023-09-22T21:52:34.156Z","dependency_job_id":"a69267c5-72af-4b83-9f97-da49252ca2dc","html_url":"https://github.com/raflymln/zod-key-parser","commit_stats":{"total_commits":115,"total_committers":2,"mean_commits":57.5,"dds":"0.12173913043478257","last_synced_commit":"27b12634076b90b43d3578460714634fe9f16474"},"previous_names":["raflymln/zod-key-parser"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raflymln%2Fzod-key-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raflymln%2Fzod-key-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raflymln%2Fzod-key-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/raflymln%2Fzod-key-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/raflymln","download_url":"https://codeload.github.com/raflymln/zod-key-parser/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248804719,"owners_count":21164127,"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":["nextjs","react","server-actions","typescript","validation","zod"],"created_at":"2024-11-27T15:17:58.662Z","updated_at":"2025-10-29T16:33:38.519Z","avatar_url":"https://github.com/raflymln.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003e ### ⚠ Please use latest version\n\u003e\n\u003e All bugs related to peer dependency, fail to parsing, and other bugs has been fixed in latest version\n\u003e\n\u003e **If you still have any problem, please make an issue in the GitHub repository**\n\u003e\n\u003e ---\n\u003e\n\u003e #### What's New on v.1.5.4?\n\u003e\n\u003e -   Add support for ZodDefault, ZodPromise, ZodReadonly, and ZodNaN\n\u003e -   Add support for ZodEffects (refine, transform, etc)\n\u003e -   BREAKING CHANGE: If you use customStringParser, the props is now an object instead of single string\n\u003e -   Add more string parser options\n\u003e -   Fix broken Date validation\n\n# Zod Key Parser\n\nParse your Zod schema into keys or Prisma ORM select format\n\n## What This Do?\n\n### Transform this schema:\n\n```js\nimport { parseZodSchema } from \"zod-key-parser\";\n\nconst schema = z.object({\n    a: z.boolean(),\n    b: z.string(),\n    c: z.string(),\n    d: z.string(),\n    e: z.string(),\n    f: z.string(),\n    g: z.string(),\n    h: z.array(\n        z.object({\n            ha: z.number(),\n            hb: z.string(),\n            hc: z.boolean(),\n            hd: z.string(),\n        })\n    ),\n    i: z.object({\n        ia: z.number(),\n    }),\n});\n```\n\n### Into This\n\n```ts\n// schema.keys\n\n{\n  \"a\": \"a\",\n  \"b\": \"b\",\n  \"c\": \"c\",\n  \"d\": \"d\",\n  \"e\": \"e\",\n  \"f\": \"f\",\n  \"g\": \"g\",\n  \"h\": (index: number) =\u003e {\n  \t\"ha\": `h.${index}.ha`,\n  \t\"hb\": `h.${index}.hb`,\n  \t\"hc\": `h.${index}.hc`,\n  \t\"hd\": `h.${index}.hd`,\n  },\n  \"i\": {\n    \"ia\": \"i.ia\"\n  }\n}\n```\n\nSo that you can use it on your form like this:\n\n```tsx\n\n\u003cinput name={schema.keys.a} type=\"string\" ... /\u003e\n\n```\n\n### And This\n\n```ts\n// schema.prismaKeys\n{\n  \"a\": true,\n  \"b\": true,\n  \"c\": true,\n  \"d\": true,\n  \"e\": true,\n  \"f\": true,\n  \"g\": true,\n  \"h\": {\n    \"select\": {\n      \"ha\": true,\n      \"hb\": true,\n      \"hc\": true,\n      \"hd\": true\n    }\n  },\n  \"i\": {\n    \"select\": {\n      \"ia\": true\n    }\n  }\n}\n```\n\nSo that you can use it on your Prisma ORM like this\n\n```ts\nconst something = await prisma.table.findUnique({\n  where: ...,\n  select: schema.prismaKeys\n})\n```\n\n## How About the Opposite? Don't Worry\n\nThere's 2 function, **`formatObject`** and **`formatFormData()`** that you can use\n\n### 1. formatObject(object)\n\nUse it to format object to keys format\n\n-   Format this:\n\n```ts\nconst inputData = {\n    formkey1: \"something\",\n    formkey2: \"something\",\n    \"formkey3.a\": \"something\",\n    \"formkey3.b\": \"something\",\n    \"formkey5.c\": \"something\",\n    \"formarray.0.a\": \"something\",\n    \"formarray.1.a\": \"something\",\n    \"formarray.1.ab\": \"something\",\n    \"formarray.2.c.d.0.a\": \"true\",\n    \"formarray.2.c.d.1.a\": \"true\",\n};\n\nconst formattedData = formatObject(inputData);\n```\n\n-   Into this\n\n```ts\n// formattedData\n{\n  \"formkey1\": \"something\",\n  \"formkey2\": \"something\",\n  \"formkey3\": {\n    \"a\": \"something\",\n    \"b\": \"something\"\n  },\n  \"formkey5\": {\n    \"c\": \"something\"\n  },\n  \"formarray\": [\n    {\n      \"a\": \"something\"\n    },\n    {\n      \"a\": \"something\",\n      \"ab\": \"something\"\n    },\n    {\n      \"c\": {\n        \"d\": [\n          {\n            \"a\": true\n          },\n          {\n            \"a\": true\n          }\n        ]\n      }\n    }\n  ]\n}\n```\n\n### 2. formatFormData(formData)\n\nUse it to format data from form action directly, **especially for React/Next.js user who use server action**\n\n\u003e It also use `formatObject()` under the hood\n\n```tsx\nconst formAction = (formData: FormData) =\u003e {\n  const parsed = schema.safeParse(formatFormData(formData));\n\n  if (!parsed.success) {\n    ...\n  }\n}\n\nreturn (\n  \u003cform action={formAction}\u003e\n      \u003cinput name={schema.keys.a} /\u003e\n      \u003cinput name={schema.keys.b} /\u003e\n  \u003c/form\u003e\n)\n```\n\n## What's The Point of This?\n\n#### Pros\n\n-   Avoid typos in form name\n-   Easily parsed form data with a little lines of code\n-   For Prisma, improve your database performance by only selecting data to be used\n-   _You'll lovin it like McDonalds says_\n\n#### Cons\n\n-   _Idk, maybe it's just too much for you? let me know_\n\n## What You Should Know\n\n-   Currently it doesn't support non object schema, if your schema is just like `z.string()` it wont parse anything since it doesn't have a key\n-   It **Supports** ZodEnum, ZodUnion, ZodIntersection, ZodArray, ZodOptional, ZodNullable, and ZodObject also of course the primitives type like string, boolean and so on, i don't know if there are any Zod class that i should be aware of since i myself doesn't use anything beside what I've specify before.\n\n## Any Suggestion or Problem?\n\nFeel free to reach me at `me@raflymaulana.me` or just make a GitHub issue at [this repository](https://github.com/raflymln/zod-key-parser).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraflymln%2Fzod-key-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fraflymln%2Fzod-key-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fraflymln%2Fzod-key-parser/lists"}