{"id":25757723,"url":"https://github.com/oliver021/ecmalinq","last_synced_at":"2025-05-13T00:27:24.889Z","repository":{"id":45137360,"uuid":"341987389","full_name":"oliver021/ecmalinq","owner":"oliver021","description":"The linq runtime and support to typescript/javascript ecosystem","archived":false,"fork":false,"pushed_at":"2022-01-05T22:29:35.000Z","size":442,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-11T08:44:43.629Z","etag":null,"topics":["collection","data","iterable","iteration","javascript","library","linq","linq-expressions","nodejs","query","stream","stream-data","structure","typescript"],"latest_commit_sha":null,"homepage":"","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/oliver021.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-02-24T17:55:23.000Z","updated_at":"2022-04-24T04:33:07.000Z","dependencies_parsed_at":"2022-08-28T23:23:13.854Z","dependency_job_id":null,"html_url":"https://github.com/oliver021/ecmalinq","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":"oliver021/ts-starterkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliver021%2Fecmalinq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliver021%2Fecmalinq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliver021%2Fecmalinq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oliver021%2Fecmalinq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oliver021","download_url":"https://codeload.github.com/oliver021/ecmalinq/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240891017,"owners_count":19874116,"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":["collection","data","iterable","iteration","javascript","library","linq","linq-expressions","nodejs","query","stream","stream-data","structure","typescript"],"created_at":"2025-02-26T16:32:10.884Z","updated_at":"2025-02-26T16:32:11.376Z","avatar_url":"https://github.com/oliver021.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![npm version](https://badge.fury.io/js/angular2-expandable-list.svg)](https://badge.fury.io/js/angular2-expandable-list)\n\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)\n\n# LinqScript\n\nEsta biblioteca es un potente marco para crear objetos de consultas muy flexibles y poderosamente\nsemánticas gracias al tipado de Typescript, donde utilizamos un API fluida para agregar varios tipos \nde filtros a nuestras consultas, reglas de ordenamiento, agrupaciones, uniones y varias forma de conseguir resultados y de realizar encuestas a dichas consultas.\n\nCon linqscript tienes una posibilidad ilimitada de crear flujos de consultas complejas, filtrar objetos iterables, ordenarlos, convertirlos o reproducirlos, paginar los resultados, muy similar a como trabajan los estándares SQL. \n\nEste trabajo inspirado en la robusta implementación de .Net Standard, posee un vasto conjunto métodos\nque veremos mas adelante, como nos facilitara el trabajo con arreglos, collaciones, mapas y cualquier objeto iterable en JavaScript.\n\nEl *propsito de linq* es facilitar el trabajo con colleciones, registros y cualquier estructura o tipo de dato que sea iterable, a diferencia de sql, donde trabajamos con consultas esticas, aqui podemos lograr muchos resultados dinamicos en tiempo de ejecucion. La tarea de trabajar con datos, como el minado, la extracion, conversion, tratamiento y clasificacion se facilita mucho con esta poderosa herramienta. \n\n## Requisitos\n\nEsta biblioteca apenas tiene requerimientos relevantes a mencionar basta con\n[Node](http://nodejs.org/) y [NPM](https://npmjs.org/) para una instalacion de 5 segundos\nTo make sure you have them available on your machine,\nIntenta utilizar estos comandos:\n\n```sh\n$ npm -v \u0026\u0026 node -v\n6.4.1\nv8.16.0\n```\nSi todo sale bien, ya puedes incorporar esta biblioteca a tu proyecto\n## Tabla de contenidos\n\n- [LinqScript](#linqscript)\n  - [Requisitos](#Requisitos)\n  - [Tabla de contenidos](#tabla-de-contenidos)\n  - [Empezar](#empezar)\n  - [Instalacion](#instalacion)\n  - [Uso](#uso)\n    - [Simple consulta](#simple-consultap)\n    - [El metodo select](#el-metodo-select)\n    - [Metodo para conocer resultados](#metodos-para-conocer-resultados)\n    - [Ordenar resultados](#ordenar-resultados)\n    - [Las consultas son iterables](#las-consultas-son-iterables)\n    - [\"Limites y desplazamiento\"](#limites-y-desplazamiento)\n  - [Running the tests](#running-the-tests)\n  - [Contributing](#contributing)\n  - [Versioning](#versioning)\n  - [Authors](#authors)\n  - [License](#license)\n\n## Empezar\n\nPara comenzar a trabajar con linqscript solo tienes que instalar el paquete en su repo oficial de npm\ncon los comandos de instalación\n\n## Instalación\n\n**Antes de Instalar:** por favor lea  [prerequisites](#prerequisites)\n\nPara instalar la biblioteca ejecute el comando:\n\n```sh\n$ npm install -S linqscript\n```\n\no si prefiere usar Yarn:\n\n```sh\n$ yarn add --dev linqscript\n```\n\n## Uso\n\n### Simple consulta\n\nVamos a empezar por una simple consulta en donde tenemos un tipo de datos de cual tenemos un arreglo\nque vendría siendo un registro que bien pudimos obtener de una base de datos, api rest u otro servicio cualquiera, entonces veamos dicha interfaz en Typescript:\n\n```ts\ntype User = {\n    id: number,\n    username: string,\n    group: string,\n    data?: string,\n    followers: number,\n    login?: Date\n};\n```\n\nNotar que esta interfaz tiene varios campos donde figuran datos de nuestro interés, por ejemplo si queremos sabes que usuarios pertenecen al grupo \"a\", podemos ejecutar el siguiente código de ejemplo.\n\n```ts\nimport { from } from \"linqscript\";\n\ntype User = {\n    id: number,\n    username: string,\n    group: string,\n    data?: string,\n    followers: number,\n    login?: Date\n};\n\nconst users: User[] = [\n    {\n        id: 1,\n        username: \"john\",\n        followers: 100,\n        group: \"a\"\n    },\n    {\n        id: 2,\n        username: \"charles\",\n        followers: 140,\n        group: \"d\"\n    },\n    {\n        id: 12,\n        username: \"victor\",\n        followers: 400,\n        group: \"c\"\n    },{\n        id: 18,\n        username: \"tony\",\n        followers: 25,\n        group: \"a\"\n    }\n];\n\nconst result = from(users).where(x =\u003e x.group === \"a\").count();\n\n// show the result\nconsole.log(result); // expected 2\n```\n\nVamos a resaltar varios cosas, aquí estamos importando un función muy sencilla \"from(iterable)\",\nque actúa como un factory, que es para recibir cualquier objeto iterable de JavaScript, mediante el tipado y las características de autocompletado de cualquier IDE, tenemos acceso a una experiencia mejorada del diseño de la consulta. Luego esta funciona nos devolverá un `IQueryable\u003cT\u003e`, que es la interfaz esencial de esta biblioteca, a través de cual establecemos filtros, reglas, operaciones y encuestas de varios tipos. El método \"where(predicate)\" nos agrega filtros para ir consiguiendo los resultados que vamos necesitando. Finalmente, después de agregar el filtro procedemos a encuestar los resultado para cual tenemos un gran numero de métodos y posibilidades. En este caso utilizamos \"count()\" que es análogo al length de los array y string, ya este nos devuelve la cantidad de registros que trae la consulta.\n\n### El metodo select\n\nVeamos el siguiente código para comprender como funciona select:\n\n```ts\nimport { from } from \"linqscript\";\n\ntype User = {\n    id: number,\n    username: string,\n    group: string,\n    data?: string,\n    followers: number,\n    login?: Date\n};\n\nconst users: User[] = [\n    {\n        id: 1,\n        username: \"john\",\n        followers: 100,\n        group: \"a\"\n    },\n    {\n        id: 2,\n        username: \"charles\",\n        followers: 140,\n        group: \"d\"\n    },\n    {\n        id: 12,\n        username: \"victor\",\n        followers: 400,\n        group: \"c\"\n    },{\n        id: 18,\n        username: \"tony\",\n        followers: 25,\n        group: \"a\"\n    }\n];\n\nconst result = from(users)\n              .where(x =\u003e x.group === \"a\")\n              .select(x =\u003e x.id);\n\n// show the result\nconsole.log(result); // expected [1, 2, 12, 18] array witd id values\n```\n\nEl método \"select\" es de cierto modo análogo al metodo \"map()\" del prototipo de los `Array` en JavaScript, porque transforma el resultado de consulta y básicamente devuelve una nueva consultas con los filtros y reglas anteriores, pero con un nuevo tipo como argumento de la consulta.\n\n### Metodo para conocer resultados\nA continuación enumero algunos de los métodos de encuestas de resultados. \n\n```ts\nconst myQuery = from(data).where(x =\u003e /*my filter*/);\n\nmyQuery.first(); // the first result\nmyQuery.last(); // the last element\nmyQuery.any(); // return true if any result is match\nmyQuery.all(); // return true if all result is match\nmyQuery.contains(); // require an argument, a fucntion that return a\n// condition and return true if exist an element with this condition\nmyQuery.toArray(); // get an array with query elements\nmyQuery.toSet(); // an Set instance with results\nmyQuery.toJson(); // a json string ready to send by http or write on a file\n// and more...\n```\n\n### Ordenar resultados\n\nA continuación  un ejemplo con ordenamiento, utilizando el registro de usuarios anteriores:\n\n```ts\nlet result = from(users)\n              .where(x =\u003e x.group === \"a\")\n              .orderBy(x =\u003e x.followers);\n\n// show the result\nconsole.log(result.first()); // expected {\n//       id: 1,\n//       username: \"tony\",\n//       followers: 25,\n//       group: \"a\"\n//}\n// user with less followers\n\nlet result = from(users)\n              .orderByDecending(x =\u003e x.followers);\n\n// show the result\nconsole.log(result.first()); // expected {\n//       id: 1,\n//       username: \"victor\",\n//       followers: 400,\n//       group: \"c\"\n//}\n// user with more followers\n\n// sort with custom algorith\nlet result = from(users)\n              .orderBy((elm1, elm2) =\u003e elm2.username.length \u003c elm1.username.length);\n\n// show the result\nconsole.log(result.first()); // expected {\n//       id: 1,\n//       username: \"charles\",\n//       followers: 140,\n//       group: \"d\"\n//}\n// user with more followers\n```\n### Las consultas son iterables\n\nCualquier consulta que creemos, además de los métodos de encuestas, tenemos la posibilidad\nutilizar las ultimas características que nos regara el Javascript moderno, como el bucle for-of,\npor ejemplo:\n\n```ts\nconst result = from(users).where(x =\u003e x.group !== \"a\"); // exclude all user with group \"a\"\n\nfor (const element of result) {\n  console.log(\"debug element:\", element);\n}\n\n```\n### Limites y desplazamiento\n\n```ts\n const query = new from(users);\n        query.skip(1);\n        query.take(1);\n\n  console.log(query.count()); // the value is one\n\nEl limite y el desplazamiento sirven para crear paginas de resultados y crear reglas complejas de consultas.\nAmbos metedos son simples, solo requieren el numero para limitar o desplazar como argumento, \"skip\" desplaza y \"take\" limita los resultados. \n\n```\n## Running the tests\n\n```sh\n$ npm test\n```\nEn los test encontraremos muchisimo pero muchismo ejemplos de usos acerca de esta biblioteca.\n\n## Contributing\n\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.\n\n1.  Fork it!\n2.  Create your feature branch: `git checkout -b my-new-feature`\n3.  Add your changes: `git add .`\n4.  Commit your changes: `git commit -am 'Add some feature'`\n5.  Push to the branch: `git push origin my-new-feature`\n6.  Submit a pull request :sunglasses:\n\n## Versioning\n\nWe use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/your/project/tags).\n\n## Authors\n\n* **Oliver Valiente** - [Oliver Valiente](https://github.com/oliver021)\n\nSee also the list of [contributors](https://github.com/your/project/contributors) who participated in this project.\n\n## License\n\n[MIT License](https://andreasonny.mit-license.org/2019) © Oliver Valiente\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foliver021%2Fecmalinq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foliver021%2Fecmalinq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foliver021%2Fecmalinq/lists"}