{"id":20604837,"url":"https://github.com/themost-framework/client","last_synced_at":"2026-06-05T19:31:09.715Z","repository":{"id":65806136,"uuid":"420188632","full_name":"themost-framework/client","owner":"themost-framework","description":"MOST Web Framework core module for javascript clients","archived":false,"fork":false,"pushed_at":"2024-07-07T07:06:07.000Z","size":1001,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-21T17:13:47.741Z","etag":null,"topics":["client","odata","odata-client","odatav4","orm","orm-framework"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/themost-framework.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}},"created_at":"2021-10-22T17:35:04.000Z","updated_at":"2024-07-07T07:04:39.000Z","dependencies_parsed_at":"2023-11-07T10:29:13.243Z","dependency_job_id":"b9897130-57a4-498d-83d8-f4640f807eed","html_url":"https://github.com/themost-framework/client","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/themost-framework/client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themost-framework%2Fclient","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themost-framework%2Fclient/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themost-framework%2Fclient/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themost-framework%2Fclient/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/themost-framework","download_url":"https://codeload.github.com/themost-framework/client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/themost-framework%2Fclient/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33957496,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["client","odata","odata-client","odatav4","orm","orm-framework"],"created_at":"2024-11-16T09:25:09.833Z","updated_at":"2026-06-05T19:31:09.698Z","avatar_url":"https://github.com/themost-framework.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![npm](https://img.shields.io/npm/v/@themost%2Fclient.svg)](https://www.npmjs.com/package/@themost%2Fclient)\n![GitHub top language](https://img.shields.io/github/languages/top/themost-framework/client)\n[![License](https://img.shields.io/npm/l/@themost/client)](https://github.com/themost-framework/themost-client/blob/master/LICENSE)\n![GitHub last commit](https://img.shields.io/github/last-commit/themost-framework/client)\n![GitHub Release Date](https://img.shields.io/github/release-date/themost-framework/client)\n[![npm](https://img.shields.io/npm/dw/@themost/client)](https://www.npmjs.com/package/@themost%2Fclient)\n[![Snyk Vulnerabilities for npm package](https://img.shields.io/snyk/vulnerabilities/npm/@themost/client)](https://snyk.io/vuln/npm:%40themost%2Fclient)\n\n# @themost/client\n\n![MOST Web Framework Logo](https://github.com/themost-framework/common/raw/master/docs/img/themost_framework_v3_128.png)\n\n[@themost-framework](https://github.com/themost-framework) core module for javascript clients.\n\n`@themost/client` provides a set of methods for creating [OData v4](https://www.odata.org/documentation/) queries by using javascript closures in both client and server.\n\ne.g. get name and price of products with category equals to 'Laptops'\n\n    // GET /Products?$select=name,price\u0026$filter=category eq 'Laptops'\n    \n    const items = await context.model('Products').select(({name, price}) =\u003e {\n        return {\n            name,\n            price\n        }\n    }).where(({category}) =\u003e {\n        return category === 'Laptops'\n    }).getItems();\n\nJavascript closure prototypes introduced by [@themost/query](https://github.com/themost-framework/query) uses native language and produces equivalent query expressions for both client and server environments:\n\n    import { round } from '@themost/query';\n\n    context.model('Products').select((x) =\u003e {\n        return {\n            name: x.name,\n            releaseYear: x.releaseDate.getFullYear(),\n            price: round(x.price, 2)\n        }\n    }).where((x) =\u003e {\n        return x.category === 'Laptops';\n    })\n    ...\n\nwhich produces the following OData expression `/Products?$select=name,year(releaseDate) as releaseYear,round(price,2) as price\u0026$filter=category eq 'Laptops'`\n\nor an equivalent SQL statement for server-side enviroments `SELECT Products.name AS name, YEAR(Products.releaseDate) AS releaseYear, ROUND(Products.price,2) AS price FROM Products WHERE Products.category = 'Laptops'`\n\n\n## node.js client\n\n![@themost/node](docs/nodejs.png)\n\n[@themost/node](https://github.com/themost-framework/node) is a client module for node.js applications which are going to use [@themost-framework](https://github.com/themost-framework) as backend api server.\n\n## angular client\n\n![@themost/angular](docs/angular.png)\n\n[@themost/angular](https://github.com/themost-framework/angular) is a client module for angular 2.x+ applications which are going to use [@themost-framework](https://github.com/themost-framework) as backend api server.\n\n## react client\n\n![@themost/react](docs/react.png)\n\n[@themost/react](https://github.com/themost-framework/react) is a client module for react applications which are going to use [@themost-framework](https://github.com/themost-framework) as backend api server.\n\n## jQuery client\n\n![@themost/jquery](docs/jquery.png)\n\n[@themost/jquery](https://github.com/themost-framework/jquery) is a client module for JQuery scripts and applications which are going to use [@themost-framework](https://github.com/themost-framework) as backend api server.\n\n## Usage\n\nuse `ClientDataContext` which is being provided by your environment and initialize an instance of `ClientDataQueryable` class.\n\n### System Query Options\n\n- [$select](#selectexpr-queryfunc-params-any)\n- [$filter](#whereexpr-queryfunc-params-any)\n    - [Logical Operators](#logical-operators)\n    - [Comparison Operators](#comparison-operators)\n    - [Aggregate Functions](#aggregate-function)\n    - [String Functions](#string-functions)\n    - [Date Functions](#date-functions)\n    - [Math Functions](#math-functions)\n    - [Arithmetic Operators](#arithmetic-operators)\n- [$orderby](#orderbyexpr-queryfunc-params-any)\n- [$expand](#expandargs-opendataquery--queryfunc)\n- [$top](#taken-number)\n- [$skip](#skip-number)\n\nRead OData v4 specification for more information about system query options: \n\nhttp://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#_Toc31360955\n\n### select(expr: QueryFunc\u003cT\u003e, ...params: any[])\n\nDefine `$select` system query option by using a javascript closure:\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .select((x) =\u003e {\n            return {\n                id: x.id,\n                customer: x.customer.description,\n                orderDate: x.orderDate,\n                product: x.orderedItem.name\n            }\n        })\n        .where((x) =\u003e {\n            return x.paymentMethod.alternateName === 'DirectDebit';\n        }).orderByDescending((x) =\u003e x.orderDate)\n        .take(10)\n        .getItems();\n\n\u003e `/Orders?$select=id,customer/description as customer,orderDate,orderedItem/name as product\u0026$filter=paymentMethod/alternateName eq 'DirectDebit'\u0026$orderby=orderDate desc\u0026$top=10`\n\n### where(expr: QueryFunc\u003cT\u003e, ...params: any[])\n\nDefine `$filter` system query option by using a javascript closure:\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x, orderStatus) =\u003e {\n            return x.orderStatus.alternateName === orderStatus;\n        }, 'OrderPickup').take(10)\n        .getItems();\n\n\u003e `/Orders?$filter=orderStatus/alternateName eq 'OrderPickup'\u0026$top=10`\n\n#### Using parameters\n\nA query expression can accept parameters as additional arguments. The following example demonstrates how to use parameters in a query expression e.g.\n\n```javascript\nconst items = await context.model('Orders')\n    .asQueryable()\n    .where((x, orderStatus) =\u003e {\n        return x.orderStatus.alternateName === orderStatus;\n    }, 'OrderPickup').take(10)\n    .getItems();\n```\nwhere the first parameter is a query closure and the second parameter is a string value which is going to be passed to closure as `orderStatus` argument.\n\n```javascript\nconst items = await context.model('Orders')\n    .asQueryable()\n    .where((x, orderStatus, productCategory) =\u003e {\n        return x.orderStatus.alternateName === orderStatus \u0026\u0026\n            x.orderedItem.category === productCategory;\n    }, 'OrderPickup', 'Desktops').take(10)\n    .getItems();\n```\n\n\n\n#### Logical Operators\n\nUse logical operators while querying data:\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where(({category}) =\u003e {\n            return category === 'Laptops' ||\n                category === 'Desktops';\n        }).getItems();\n\n\u003e `/People?$filter=(category eq 'Laptops' or category eq 'Desktops')`\n\n    import { round } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where(({category, price}) =\u003e {\n            return category === 'Laptops' \u0026\u0026 price \u003c=900;\n        }).getItems();\n\n\u003e `/People?$filter=(category eq 'Laptops' and price le 900)`\n\n#### Comparison operators\n\n`@themost/client` supports the usage of OData comparison operators like `eq`, `ne`, `lt`, `le` etc\n\n##### equals\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where(({id}) =\u003e {\n            return id === 100;\n        }).getItem();\n\n\u003e `/Orders?$filter=id eq 100`\n\n##### not equals\n\n    const item = await context.model('Orders')\n        .asQueryable()\n        .where(({category}) =\u003e {\n            return category !== 'Desktops';\n        }).getItems();\n\n\u003e `/Orders?$filter=category ne 'Desktops'`\n\n\n##### greater than\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where(({category, price}) =\u003e {\n            return category === 'Desktops' \u0026\u0026 price \u003e 1000;\n        }).getItems();\n\n\u003e `/Orders?$filter=(category eq 'Desktops' and price gt 1000)`\n\n##### greater than or equal\n\n    const item = await context.model('Orders')\n        .asQueryable()\n        .where(({category, price}) =\u003e {\n            return category === 'Desktops' \u0026\u0026 price \u003e= 1000;\n        }).getItems();\n\n\u003e `/Orders?$filter=(category eq 'Desktops' and price ge 1000)`\n\n##### lower than\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where(({category, price}) =\u003e {\n            return category === 'Desktops' \u0026\u0026 price \u003c 1200;\n        }).getItems();\n\n\u003e `/Orders?$filter=(category eq 'Desktops' and price lt 1200)`\n\n##### lower than or equal\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where(({category, price}) =\u003e {\n            return category === 'Desktops' \u0026\u0026 price \u003c= 1200;\n        }).getItems();\n\n\u003e `/Orders?$filter=(category eq 'Desktops' and price le 1200)`\n\n#### Aggregate functions\n\n`@themost/client` supports the usage of aggregate functions like `count`, `min`, `max` for getting\naggregated results\n\n##### count\n\n    import { count } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .select((x) =\u003e {\n            return {\n                category: x.category,\n                total: count(x.id)\n            };\n        }).groupBy((x) =\u003e x.category)\n        .getItems();\n\n\u003e `/Products?$select=category,count(id) as total\u0026$groupby=category`\n\n##### min\n\n    import { min } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .select((x) =\u003e {\n            return {\n                category: x.category,\n                minimumPrice: min(x.price)\n            };\n        }).groupBy((x) =\u003e x.category)\n        .getItems();\n\n\u003e `/Products?$select=category,min(price) as minimumPrice\u0026$groupby=category`\n\n##### min\n\n    import { max } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .select((x) =\u003e {\n            return {\n                category: x.category,\n                maxPrice: max(x.price)\n            };\n        }).groupBy((x) =\u003e x.category)\n        .getItems();\n\n\u003e `/Products?$select=category,max(price) as maxPrice\u0026$groupby=category`\n\n#### String functions\n\n`@themost/client` supports the usage of string functions while querying data\n\n##### indexof\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.name.indexOf('Intel') \u003e= 0;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=indexof(name,'Intel') ge 0`\n\n##### startsWith\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.name.startsWith('Intel') === true;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=startswith(name,'Intel') eq true`\n\n##### endsWith\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.name.endsWith('Edition') === true;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=endswith(name,'Edition') eq true`\n\n\n##### toLowerCase\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.category.toLowerCase() === 'laptops';\n        })\n        .getItems();\n\n\u003e `/Products?$filter=tolower(category) eq 'laptops'`\n\n##### toUpperCase\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.category.toUpperCase() === 'LAPTOPS';\n        })\n        .getItems();\n\n\u003e `/Products?$filter=toupper(category) eq 'LAPTOPS'`\n\n##### substring\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.category.substring(0,3) === 'Lapt';\n        })\n        .getItems();\n\n\u003e `/Products?$filter=substring(category,0,3) eq 'Lapt'`\n\n#### Date functions\n\n`@themost/client` supports also the usage of date functions while querying data\n\n##### getDate\n\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.orderDate.getDate() === 0;\n        })\n        .getItems();\n\n\u003e `/Orders?$filter=day(orderDate) eq 19`\n\n##### getMonth\n\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.orderDate.getMonth() === 0;\n        })\n        .getItems();\n\n\u003e `/Orders?$filter=(month(orderDate) sub 1) eq 0`\n\n##### getFullYear\n\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.orderDate.getFullYear() === 2019;\n        })\n        .getItems();\n\n\u003e `/Orders?$filter=(month(orderDate) sub 1) eq 0`\n\n##### getHours\n\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.orderDate.getHours() === 14;\n        })\n        .getItems();\n\n\u003e `/Orders?$filter=hour(orderDate) eq 14`\n\n##### getMinutes\n\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.orderDate.getMinutes() === 30;\n        })\n        .getItems();\n\n\u003e `/Orders?$filter=minute(orderDate) eq 30`\n\n##### getSeconds\n\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x) =\u003e {\n            return x.orderDate.getSeconds() === 30;\n        })\n        .getItems();\n\n\u003e `/Orders?$filter=second(orderDate) eq 30`\n\n### Math Functions\n\n#### floor\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return Math.floor(x.price) \u003c= 177;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=floor(price) le 177`\n\n#### ceil\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return Math.ceil(x.price) \u003e= 177;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=floor(price) ge 177`\n\n#### round\n\n    import { round } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return round(x.price, 2) \u003e= 177;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=round(price, 2) ge 177`\n\n### Arithmetic operators\n\n#### add\n\n    import { round } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return round(x.price, 2) + 100 \u003e= 277;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=(round(price,2) add 100) ge 277`\n\n#### subtract\n\n    import { round } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return round(x.price, 2) - 100 \u003c= 277;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=(round(price,2) sub 100) le 277`\n\n#### multiply\n\n    import { round } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return round(x.price, 2) * 0.75 \u003c 800;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=(round(price,2) mul 0.75) lt 800`\n\n#### divide\n\n    import { round } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .where((x) =\u003e {\n            return round(x.price, 2) / 1.25 \u003c 800;\n        })\n        .getItems();\n\n\u003e `/Products?$filter=(round(price,2) div 1.25) lt 800`\n\n#### case\n\n    import { round } from '@themost/query';\n\n    const items = await context.model('Products')\n        .asQueryable()\n        .select(({name, price}) =\u003e {\n            return {\n                name: name,\n                value: price \u003c 800 ? 'Normal' : 'Expensive'\n            }\n        })\n        .where(({category}) =\u003e {\n            return category === 'Laptops';\n        })\n        .getItems();\n\n\u003e `/Products?$select=name,case(price lt 800:'Normal',true:'Expensive') as value\u0026$filter=category eq 'Laptops'`\n\n\n### take(n: number)\n\nSet `$top` system query option for defining the number of records to be taken\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x, orderStatus) =\u003e {\n            return x.orderStatus.alternateName === orderStatus;\n        }, 'OrderPickup').take(10)\n        .getItems();\n\n\u003e `/Orders?$filter=orderStatus/alternateName eq 'OrderPickup'\u0026$top=10`\n\n### skip(n: number)\n\nSet `$skip` system query option for defining the number of records to be skipped\n\n    const items = await context.model('Orders')\n        .asQueryable()\n        .where((x, orderStatus) =\u003e {\n            return x.orderStatus.alternateName === orderStatus;\n        }, 'OrderPickup').take(25)\n        .skip(25)\n        .getItems();\n\n\u003e `/Orders?$filter=orderStatus/alternateName eq 'OrderPickup'\u0026$top=25\u0026$skip=25`\n\n### orderBy(expr: QueryFunc\u003cT\u003e, ...params: any[])\n\nDefine `$orderby` system query option for sorting records\n\n    const items = await context.model('People')\n        .asQueryable()\n        .orderBy(({familyName}) =\u003e familyName)\n        .getItems();\n\n\u003e `/People?$orderby=familyName`\n\n### thenBy(expr: QueryFunc\u003cT\u003e, ...params: any[])\n\n    const items = await context.model('People')\n        .asQueryable()\n        .orderBy(({familyName}) =\u003e familyName)\n        .thenBy(({givenName}) =\u003e givenName)\n        .getItems();\n\n\u003e `/People?$orderby=familyName,givenName`\n\n### orderByDescending(expr: QueryFunc\u003cT\u003e, ...params: any[])\n\n    const items = await context.model('People')\n        .asQueryable()\n        .orderByDescending(({familyName}) =\u003e familyName)\n        .getItems();\n\n\u003e `/People?$orderby=familyName desc`\n\n### thenByDescending(expr: QueryFunc\u003cT\u003e, ...params: any[])\n\n    const items = await context.model('People')\n        .asQueryable()\n        .orderByDescending(({familyName}) =\u003e familyName)\n        .thenByDescending(({givenName}) =\u003e givenName)\n        .getItems();\n\n\u003e `/People?$orderby=familyName desc,givenName desc`\n\n\n### groupBy\u003cT\u003e(...arg: [QueryFunc\u003cT\u003e], params?: any)\n\nDefine `$groupby` system query option to group records by using javascript closures:\n\n    const results = await context.model('Orders')\n        .asQueryable()\n        .select(({id, orderStatus}) =\u003e {\n            return {\n                total: count(id),\n                orderStatus\n            }\n        }).groupBy(({orderStatus}) =\u003e orderStatus)\n        .getItems();\n\n\u003e `/Orders?$select=count(id) as total,orderStatus\u0026$groupby=orderStatus`\n\n### expand\u003cT\u003e(...args: (OpenDataQuery | QueryFunc\u003cT\u003e)[])\n\nDefine `$expand` system query option for getting nested objects\n\nRead more about `$expand` at http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part2-url-conventions.html#_Toc31361039\n\n    const items= await context.model('Orders')\n        .asQueryable()\n        .select(({id, orderStatus, orderDate}) =\u003e {\n            return {\n                id,\n                orderStatus,\n                orderDate\n            }\n        }).expand(\n            (x) =\u003e x.customer,\n            (x) =\u003e x.orderedItem\n        ).getItems();\n\n\u003e `/Orders?$select=id,orderStatus,orderDate\u0026$expand=customer,orderedItem`\n\nor use query expressions for applying nested query options:\n\n    import { any } from '@themost/query';\n\n    const items= await context.model('People')\n        .asQueryable()\n        .expand(\n            any((x) =\u003e x.address)\n            .select(({id, streetAddress, addressLocalilty}) =\u003e ({\n                id, streetAddress, addressLocalilty\n            }))\n        ).getItems();\n\n\u003e `/People?$expand=address($select=id,streetAddress,addressLocalilty;$expand=addressCountry)`\n\n## Using CLI\n\n`@themost/client` provides a command line interface for generating client-side type declarations from an OData metadata service.\n\nConnect to an OData service and generate client-side type declarations:\n\n```bash\n$ npx @themost/client http://localhost:3000/api/\n```\nor extract metadata from an OData metadata document:\n\n```bash\n$ npx @themost/client ./metadata.xml\n```\nUse `--out-file` option for specifying the output file:\n\n```bash\n$ npx @themost/client http://localhost:3000/api/ --out-file ./client.d.ts\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthemost-framework%2Fclient","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthemost-framework%2Fclient","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthemost-framework%2Fclient/lists"}