{"id":13701279,"url":"https://github.com/victorvoid/dinoql","last_synced_at":"2025-04-08T10:14:44.246Z","repository":{"id":34806575,"uuid":"181014901","full_name":"victorvoid/dinoql","owner":"victorvoid","description":"A customizable GraphQL style query language for interacting with JavaScript objects.","archived":false,"fork":false,"pushed_at":"2023-01-14T00:37:23.000Z","size":2055,"stargazers_count":1047,"open_issues_count":18,"forks_count":22,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-04-01T09:27:54.628Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/victorvoid.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":"2019-04-12T13:35:09.000Z","updated_at":"2024-11-30T08:25:00.000Z","dependencies_parsed_at":"2023-01-16T23:00:23.273Z","dependency_job_id":null,"html_url":"https://github.com/victorvoid/dinoql","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorvoid%2Fdinoql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorvoid%2Fdinoql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorvoid%2Fdinoql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/victorvoid%2Fdinoql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/victorvoid","download_url":"https://codeload.github.com/victorvoid/dinoql/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247819933,"owners_count":21001394,"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":[],"created_at":"2024-08-02T20:01:26.300Z","updated_at":"2025-04-08T10:14:44.222Z","avatar_url":"https://github.com/victorvoid.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# dinoql\n\n[![Build Status](https://travis-ci.org/victorvoid/dinoql.svg?branch=master)](https://travis-ci.org/victorvoid/dinoql)\n[![license](https://badgen.now.sh/badge/license/MIT)](./LICENSE)\n\nA customizable GraphQL style query language for interacting with JavaScript objects. Use dinoql to traverse JavaScript objects the same way you query APIs with GraphQL. \n\n**Table of Contents**\n\n- [Installation](#installation)\n- [Why ?](#why-)\n- [Documentation](#documentation)\n  - [Getting only name from users](#getting-only-name-from-users)\n  - [Get user by id](#get-user-by-id)\n  - [Aliases - Renaming keys](#aliases---renaming-keys)\n  - [Variables](#variables)\n  - [Conditions to get fields](#conditions-to-get-fields)\n  - [Keep key from object](#keep-key-from-object)\n  - [Resolvers](#resolvers)\n    - [Order by](#order-by)\n    - [Merge](#merge)\n    - [Default value](#default-value)\n    - [Parse to Number](#parse-to-number)\n    - [Get object values](#get-object-values)\n    - [Parse to array](#parse-to-array)\n    - [First](#first)\n    - [Last](#last)\n    - [Get Prop](#get-prop)\n    - [Get Path](#get-path)\n    \n  - [Building your own resolver](#building-your-own-resolver)\n  - [Custom options](#custom-options)\n    - [Keep structure](#keep-structure)\n  - [Improve Performance](#improve-performance-)\n- [Organizations and projects using dinoql](organizations-and-projects-using-dinoql)\n\n## Installation\n\n`dinoql` is available from `npm`.\n\n```\n$ npm install dinoql -S\n```\n\n## Why ?\n\nThe main objective is to use the same idea of [GraphQL](https://graphql.org/), however instead of being for API, it will be for javascript objects.\n\n- ♥️  GraphQL syntax.\n- 🔫 Safe access (no runtime errors to keys that does not exist).\n- ⚡️  [Aliases](#aliases---renaming-keys) support (You can rename your keys in the query).\n- 🌟 Many [resolvers](#resolvers) implemented by default.\n- 🐣 [Build your own resolver](#building-your-own-resolver).\n- 💥 [Fragments support](#fragments-support-)(share piece of query logic).\n- 👂 [Variables support](#variables)(dynamic queries).\n- 🏄 Parse your queries in build time. ([Example](https://github.com/victorvoid/dinoql/tree/master/examples/webpack))\n- 🎒 [Filter values according to the value](#get-user-by-id).\n- 💾 Caching support\n- 🔥 [Customizable](#custom-options).\n\n## Documentation\n\nAll examples are using this data:\n\n```js\nconst data = {\n  requests: {\n    products: [],\n    \n    users: [{\n      name: 'Victor Igor',\n      id: \"100\",\n      age: 40\n    }, {\n      name: 'Kant Jonas',\n      id: \"200\",\n      age: 35\n    }],\n    \n    friends: [{\n      name: 'Kátia',\n      id: \"300\",\n      age: 10\n    }]\n  }\n}\n```\n\n### Getting only name from users\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    users {\n      name\n    }\n  }\n`\n\nconsole.log(users) //{ users: [{ name: 'Victor Igor' }, { name: 'Kant Jonas' }] }\n```\n\n### Get user by id\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    users(id: \"200\") {\n      name\n    }\n  }\n`\n\nconsole.log(users) //{ users: [{ name: 'Kant Jonas' }] }\n```\n\n### Aliases - Renaming keys \n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    changeUsers: users(id: \"200\") {\n      name\n    }\n  }\n`\n\nconsole.log(users) //{ changeUsers: [{ name: 'Kant Jonas' }] }\n```\n\n### Variables\n\nBuild dynamic queries with variables.\n\n```js\nconst data = {\n  users: [{\n    name: 'Victor Igor',\n    id: \"100\",\n    age: 18\n  }, {\n    name: 'Paul Gilbert',\n    id: \"200\",\n    age: 35\n  }],\t\n};\n\nconst variables = {\n  id: \"100\"\n};\n\nconst gql = dinoql(data, { variables })`\n  users(id: $id) {\n    name\n  }\n`\n\n// { users: [{ name: 'Victor Igor' }] }\n```\n\n### Conditions to get fields\n\nYou can create conditions to get a field.\n\n```js\nconst data = {\n  dashboard: {\n    value: '#54'\t\n  },\n  \n  name: 'Vic'\n};\n\nconst variables = {\n  cond: false\n};\n\nconst gql = dql(data, { variables })` \n  dashboard(if: $cond) {\n    value\n  },\n  name\n}`;\n//{ name: 'Vic' }\n\nconst otherGql = dql(data, { variables })` \n  dashboard(unless: $cond) {\n    value\n  },\n  name\n}`;\n//{ name: 'Vic', value: '#54' }\n```\n\n### Keep key from object\n\nSometimes, we need to keep specific keys.\n\n```js\n\nconst data = {\n  requests: {\n    user: {\n      name: {\n        text: 'Dinoql'\n      },\n      \n      description: {\n        text: 'I am dinoql.'\n      }\n    }\n  }\n}\n\n```\n\nIf you wanna keep some keys, like:\n\n```js\n//{ user: { name: 'Dinoql', description: 'I am dinoql.'} }\n```\n\nYou can use `(keep: true)` in key, like:\n\n```js\nimport dinoql from 'dinoql'\n\n//keeping user key\nconst user = dinoql(data)`\n  requests {\n    user(keep: true) {\n       name {\n         name: text\n       },\n       description {\n         description: text\n       }\n    }\n  }\n`\n//{ user: { name: 'Dinoql', description: 'I am dinoql.'} }\n```\n\n### Resolvers\n\nResolvers provide the instructions for turning a dinoQL operation into data.\n\n#### Order by\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    users(orderBy: age) {\n      name,\n      age\n    }\n  }\n`\n\nconsole.log(users) \n\n//{ users: [{ name: 'Kant Jonas', age: 35 }, { name: 'Victor Igor', age: 40 }] }\n```\n\n#### Merge\n\nYou can merge array or objects.\n\n##### Array\n```js\nimport dinoql from 'dinoql'\nconst data = {\n  requests: {\n    users: [{ id: 10, age: 10 }]\n  }\n}\n\nconst variables = { \n  user: { id: 15, age: 40 }\n}\n\nconst users = dinoql(data, { variables })`\n  requests {\n    users(merge: $user) {\n      age\n    }\n  }\n`\n\nconsole.log(users) \n\n//{ users: [{ age: 10 }, { age: 40 }] }\n```\n\n##### Object\n\n```js\nimport dinoql from 'dinoql'\nconst data = {\n  requests: {\n    user: { id: 10, name: 'Victor Igor' }\n  }\n}\n\nconst variables = { \n  user: { age: 40 }\n}\n\nconst user = dinoql(data, { variables })`\n  requests {\n    user(merge: $user)\n  }\n`\n\nconsole.log(user) \n\n//{ user: { id: 10, name: 'Victor Igor', age: 40 } }\n```\n\n#### Default value\nYou can add default value to keys not found or values (null/undefined).\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    notfound(defaultValue: \"Hello\")\n  }\n`\n\nconsole.log(users) \n\n// {notfound: \"Hello\"}\n```\n\n#### Parse to Number\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    users {\n      id(toNumber: 1)\n    }\n  }\n`\n\nconsole.log(users)  //{ users: [{ id: 100 }, { id: 200 }] }\n```\n\n#### Get object values\n\n```js\nimport dinoql from 'dinoql'\n\nconst data = {\n  requests: {\n    user: {\n      name: 'vic',\n      age: 10\n    }\n  }\n}\nconst gql = dinoql(data)`\n  requests {\n    user(getObjectValues: true)\n  }\n`\n\nconsole.log(gql) //['vic', 10]\n```\n\n#### Parse to array\n\n\n```js\nimport dinoql from 'dinoql'\n\nconst data = {\n  requests: {\n    fields: {\n      field1: 'name',\n      field2: 'age'\n    }\n  }\n}\n\nconst users = dinoql(data)`\n  requests {\n    fields(toArray: true)\n  }\n`\n\nconsole.log(users)  //[{ field1: 'name' }, { field2: 'age' }]\n```\n\n#### First\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    users(first: true) {\n      name\n    }\n  }\n`\n\nconsole.log(users)  //{ users: { name: 'Victor Igor' } }\n```\n\n#### Last\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data)`\n  requests {\n    users(last: true) {\n      name\n    }\n  }\n`\n\nconsole.log(users)  //{ users: { name: 'Kant Jonas' } }\n```\n\n#### Get Prop\n\n```js\nimport dinoql from 'dinoql'\n\nconst newData = {\n  requests: {\n    users: { id: 10, name: 'Victor Fellype' },\n    information: { \n      title: { text: 'my title' }, \n      description: { text: 'my description' } \n    }\n  }\n};\n```\n\nwithout getProp\n\n```js\nconst data = dinoql(newData)`\n  requests {\n    users {\n      name\n    }\n    information {\n      title {\n        title: text\n      }\n      description {\n        description: text\n      }\n    }\n  }\n`\n```\n\nwith getProp\n\n```js\nconst data = dinoql(newData)`\n  requests {\n    users(getProp: name)\n    information {\n      title(getProp: text)\n      description(getProp: text)\n    }\n  }\n`\n\nconsole.log(data) // { users: 'Victor Fellype', title: 'my title', description: 'my description' }\n```\n\n\n#### Get Path\n\n```js\nimport dinoql from 'dinoql'\n\nconst newData = {\n  requests: {\n    cms: {\n      footer_data: {\n        social_networks: [\n          { name: 'facebook', url: 'facebook.com' },\n          { name: 'instagram', url: 'instagram.com' }\n        ]\n      }\n    }\n  }\n};\n```\n\nwithout getPath \n\n```js\nconst data = dinoql(newData)`\n  requests {\n    cms {\n      footer_data {\n        social_networks\n      }\n    }\n  }\n`\n```\n\nwith getPath\n\n```js\nconst socialNetworks = dinoql(newData)`\n  requests(getPath: \"cms.footer_data.social_networks\")\n`\n\nconsole.log(socialNetworks) \n/* \n  { \n    requests: [ \n      { name: 'facebook', url: 'facebook.com' }, \n      { name: 'instagram', url: 'instagram.com' }\n    ]\n  }\n*/\n```\n\n### Building your own resolver\n\nYou can create a function to change a value in query.\n\n```js\nimport dql, { addResolvers } from 'dinoql';\n\nconst incAge = (list, right) =\u003e {\n  const valueToInc = Number(right);\n  return list.map(item =\u003e ({ ...item, age: item.age + valueToInc }));\n};\n\naddResolvers(({ incAge }));\n\nconst value = dql(data)`\n  requests {\n    users(incAge: 2) {\n      name,\n      age\n    }\n  }\n`;\n// { users: [{ name: 'Victor Igor', age: 42 }, { name: 'Kant Jonas', age: 37 }] }\n```\n\n### Custom options\n\n#### Keep structure\n\n```js\nimport dinoql from 'dinoql'\n\nconst users = dinoql(data, { keep: true })`\n  requests {\n    users(id: \"200\") {\n      name\n    }\n  }\n`\n\nconsole.log(users)\n/*\n{ \n requests: { \n   users: [{ name: 'Kant Jonas' }] \n }\n} \n*/\n```\n\n### Improve performance 🏄\n\nYou can improve performance parsing in build time your queries.\n\n#### How ?\n\n1. Create files `.graphql` or `.gql` and add your queries.\n\n2. Import your queries from `.graphql|.gql`\n\n```graphql\n# your queries\n\nquery MyQuery {\n  requests {\n    users\n  }\n}\n```\n\n```js\n//your js\nimport dinoql from 'dinoql'\nimport { MyQuery } from './MyQueries';\n\nconst users = dinoql(data)(MyQuery)\n```\n\n3. Setup your webpack - [example](https://github.com/victorvoid/dinoql/tree/master/examples/webpack)\n\n### Fragments support 💥\n\nYou can share piece of query logic.\n\n```graphql\nfragment queryOne on Query {\n  users {\n    name\n  }\n}\n\nfragment queryTwo on Query {\n  products\n}\n\nquery Form {\n  requests {\n    ...queryOne,\n    ...queryTwo,\n    friends\n  }\n}\n\n```\n\n## Organizations and projects using dinoql\n\n⚡️ [List of organizations and projects using dinoql](https://github.com/victorvoid/dinoql/issues/15)\n\nLicense\n-------\n\nThe code is available under the [MIT License](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvictorvoid%2Fdinoql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvictorvoid%2Fdinoql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvictorvoid%2Fdinoql/lists"}