{"id":37442027,"url":"https://github.com/larrydiamond/typescriptcollectionsframework","last_synced_at":"2026-01-16T06:45:34.657Z","repository":{"id":57384003,"uuid":"97401304","full_name":"larrydiamond/typescriptcollectionsframework","owner":"larrydiamond","description":"TypeScript Collections Framework - a port of the Java Collections framework for use with Angular","archived":false,"fork":false,"pushed_at":"2022-02-06T21:48:30.000Z","size":12293,"stargazers_count":41,"open_issues_count":1,"forks_count":9,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-10-06T07:53:48.950Z","etag":null,"topics":["angular","arraylist","collection","collections","generic","generics","hashmap","hashset","java-collections","linkedlist","multiset","nodejs","queue","skiplistmap","skiplistset","treemap","treeset","typescript","typescript-collections"],"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/larrydiamond.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null},"funding":{"github":"larrydiamond"}},"created_at":"2017-07-16T18:04:57.000Z","updated_at":"2025-09-03T16:03:14.000Z","dependencies_parsed_at":"2022-09-14T17:43:01.547Z","dependency_job_id":null,"html_url":"https://github.com/larrydiamond/typescriptcollectionsframework","commit_stats":null,"previous_names":[],"tags_count":89,"template":false,"template_full_name":null,"purl":"pkg:github/larrydiamond/typescriptcollectionsframework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larrydiamond%2Ftypescriptcollectionsframework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larrydiamond%2Ftypescriptcollectionsframework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larrydiamond%2Ftypescriptcollectionsframework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larrydiamond%2Ftypescriptcollectionsframework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/larrydiamond","download_url":"https://codeload.github.com/larrydiamond/typescriptcollectionsframework/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/larrydiamond%2Ftypescriptcollectionsframework/sbom","scorecard":{"id":579192,"data":{"date":"2025-08-11","repo":{"name":"github.com/larrydiamond/typescriptcollectionsframework","commit":"c838b51711b25faacb8dad1d2c15197c4b2770b1"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/24 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":4,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Warn: no linked content found","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/larrydiamond/typescriptcollectionsframework/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/larrydiamond/typescriptcollectionsframework/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/larrydiamond/typescriptcollectionsframework/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/larrydiamond/typescriptcollectionsframework/codeql-analysis.yml/master?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"39 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-897m-rjf5-jp39","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-vfrc-7r7c-w9mx","Warn: Project is vulnerable to: GHSA-7wwv-vh3v-89cq","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-xf5p-87ch-gxw2","Warn: Project is vulnerable to: GHSA-ch52-vgq2-943f","Warn: Project is vulnerable to: GHSA-5v2h-r2cx-5xgj","Warn: Project is vulnerable to: GHSA-rrrm-qjm4-v8hf","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-7xcx-6wjh-7xp2","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T18:42:57.938Z","repository_id":57384003,"created_at":"2025-08-20T18:42:57.938Z","updated_at":"2025-08-20T18:42:57.938Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477943,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: 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":["angular","arraylist","collection","collections","generic","generics","hashmap","hashset","java-collections","linkedlist","multiset","nodejs","queue","skiplistmap","skiplistset","treemap","treeset","typescript","typescript-collections"],"created_at":"2026-01-16T06:45:34.596Z","updated_at":"2026-01-16T06:45:34.652Z","avatar_url":"https://github.com/larrydiamond.png","language":"TypeScript","readme":"\u003cimg src=\"tsf-blue.png\" width=\"100\" height=\"100\"\u003e\n\n**\"If you know the Java Collections Framework, you know the Typescript Collections Framework.   It's the same API (mostly)\"**\n\n**I am working on an upgrade to this library to the newest version of TypeScript.  This upgrade will be available to sponsors only and not open source ising the Github sponsorship tools - https://github.blog/2022-02-02-new-sponsors-only-repositories-custom-amounts-and-more/ To get access sponsor this project and you will be added when the sponsor only library is available.**\n\nIt is designed for and written by Java coders who also needed to do TypeScript programming.\n\n[![NPM](https://nodei.co/npm/typescriptcollectionsframework.png?compact=true)](https://npmjs.org/typescriptcollectionsframework)\n[![Build Status](https://travis-ci.org/larrydiamond/typescriptcollectionsframework.svg?branch=master)](https://travis-ci.org/larrydiamond/typescriptcollectionsframework)\n[![Code Coverage](https://codecov.io/gh/larrydiamond/typescriptcollectionsframework/branch/master/graphs/badge.svg?branch=master)](\nhttps://codecov.io/gh/larrydiamond/typescriptcollectionsframework)\n[![Code Triage](https://www.codetriage.com/larrydiamond/typescriptcollectionsframework/badges/users.svg)](https://www.codetriage.com)\n[![quality badge](https://img.shields.io/badge/cuteness-overload-orange.svg)](http://www.emergencykitten.com/)\n\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=reliability_rating)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=bugs)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=code_smells)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=duplicated_lines_density)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=ncloc)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=sqale_rating)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=security_rating)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=sqale_index)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=larrydiamond_typescriptcollectionsframework\u0026metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=larrydiamond_typescriptcollectionsframework)\n[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://paypal.me/ldiamondldiamond)\n\n**TypeScript Collections Framework** is a port of the Java Collections framework to TypeScript.   It fully supports Generics and native types.\n\n# Demo \u0026 Tutorial project with Angular 7\nDemo: https://larrydiamond.github.io/typescriptcollectionsframework-Demo-For-Angular7/dist/demoapp/\n\nSource: https://github.com/larrydiamond/typescriptcollectionsframework-Demo-For-Angular7\n\n# Demo and Tutorial project with Node.js\nDemo and Source: https://github.com/larrydiamond/typescriptcollectionsframeworktutorial\n\n# Classes documentation\nhttps://larrydiamond.github.io/typescriptcollectionsframework/typedoc/\n\n[ArrayList](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_arraylist_.arraylist.html), [LinkedList](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_linkedlist_.linkedlist.html), [SkipListSet](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_skiplist_.skiplistset.html), [TreeSet](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_treeset_.treeset.html),\n[PriorityQueue](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_priorityqueue_.priorityqueue.html),\n[HashSet](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_hashset_.hashset.html),\n[HashMap](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_hashmap_.hashmap.html), [SkipListMap](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_skiplist_.skiplistmap.html),  [TreeMap](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/classes/_treemap_.treemap.html) are all live and available today.\n\n[Collection](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/interfaces/_collection_.collection.html),\n[List](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/interfaces/_list_.list.html), [JSet](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/interfaces/_jset_.jset.html), [JMap](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/interfaces/_jmap_.jmap.html),\n[Queue](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/interfaces/_queue_.queue.html), and [Deque](https://larrydiamond.github.io/typescriptcollectionsframework/typedoc/interfaces/_deque_.deque.html) interfaces are also available with many others to come soon (or are already here and aren't yet documented :) )\n\nGoals for the next version include a tutorial with code examples in Java and TypeScript\n\n# My goals of this project\n* Port over as many of the classes and interfaces I've previously used as a Java developer to TypeScript\n* Support putting \"stuff\" from other libraries into Collections without having to box and unbox objects.\n* Use the compiler as much as possible to catch issues at compile rather than at run time or at test time.\n* Incorporate some of the classes from Google Guava and Apache Commons Collections to provide more than what the raw Java Collections Framework provides\n\n# Class Hierarchy\n![Class Hierarchy](docs/images/collections.png \"Collections Class Hierarchy\")\n![Map Class Hierarchy](docs/images/maps.png \"Maps Class Hierarchy\")\n\n# Installation instructions\n\nInstall `typescriptcollectionsframework` from `npm`\n```bash\nnpm install typescriptcollectionsframework --save\n```\n\n# How to build for development\n - clone repository\n - `npm install`\n - `npm test`\n\n# Design methodology\nThe goal of this library is to provide a \"as Java Collections\" framework as possible so that developers can migrate their existing Java knowledge to TypeScript and be productive quicker.   It won't be possible to perfectly recreate the framework since the language is not the same, but the goal is to provide as many of the \"normal\" classes as possible with as many of the \"normal\" methods as possible.\n\nSemver was adopted as of version 1.0 of this framework.\n\nIn TypeScript all objects do not inherit from Object (which we do not control anyway), so we made added a parameter to the constructors of each class to compare objects and calculate hash codes.   As a result, anything can be put into the Collections, even string, number, and classes from other packages.   There is no String class to wrap string, no Number class to wrap number, and no Boolean class to wrap boolean.   No autoboxing and no autounboxing.   Generics are fully supported, as are native JavaScript types.\n\nEnsuring that the Collection classes in this Framework fully supported generic types has been an important motivator for this framework, and we have accomplished this on the existing classes and ensure that all future Collection classes fully support generic types.\n\n# Immutability\nI am a big proponent of Immutability.   Google Guava explains this very well [Google Guava Immutable Collections Explained](https://github.com/google/guava/wiki/ImmutableCollectionsExplained).   \n\nOur implementations differ significantly.   Collection subclasses ImmutableCollection.   Every object created from this framework has an Immutable interface that is safe to pass around confident that the object cannot be changed via the methods exposed by the Immutable interface.   \n\nAll Sets inherit from ImmutableSet and have an immutableSet method that returns an ImmutableSet.    All Maps inherit from ImmutableMap and have an immutableMap method that returns an ImmutableMap.   All Lists inherit from ImmutableList and have an immutableList method that returns an ImmutableList.   \n\nThese interfaces provide immutable versions of the real Collection or Map that you can pass to methods confident that your Collection or Map will not be modified by that method.   You can also write a method that takes an Immutable object and let your callers know that you promise not to modify the object you receive.\n\n# Thank you for all the support.   \nThe number of NPM downloads has been way higher than I expected.  150 in the first three days, 350 in the first five days, 600 in the first week. That's *way* *way* *way* more interest in what I'm doing than I expected.   Thank you!  We first released in July of 2017, and by the end of 2017 we had over 10,000 downloads.  That's phenomenal for half a year, with no marketing effort or a big company bankrolling the work.  We felt there was a huge need, and the community has clearly supported our work, and we thank you.\n\nPlease feel free to email me at ldiamond at ldiamond dot com with feature requests.  I love to hear from people putting my effort to good use.   :)\n\n# Demo \u0026 Tutorial project with Angular 5\nDemo: https://larrydiamond.github.io/typescriptcollectionsframework-Demo-For-Angular5/dist/\n\nSource: https://github.com/larrydiamond/typescriptcollectionsframework-Demo-For-Angular5\n\n# Demo \u0026 Tutorial project with Angular 4\nDemo: https://larrydiamond.github.io/typescriptcollectionsframework-Demo-For-Angular4/dist/\n\nSource: https://github.com/larrydiamond/typescriptcollectionsframework-Demo-For-Angular4\n\n# Demo \u0026 Tutorial project with Angular 2\nDemo: https://larrydiamond.github.io/typescriptcollectionsframework-Demo-For-Angular2/dist/\n\nSource: https://github.com/larrydiamond/typescriptcollectionsframework-Demo-For-Angular2\n\n# Author\nLarry Diamond https://www.linkedin.com/in/larry-diamond-3964042/   ldiamond at ldiamond dot com    Please feel free to contact me for training or with questions\n\n**Please** volunteer to contribute.   All contributors will be listed here and I will of course help you to become recognized as a TypeScript expert so it helps your career  :)\n\n# Contributors\n\nFrank Giordano (https://github.com/frankgiordano)\n\nStephen E. Chiang (https://github.com/chiangs)\n","funding_links":["https://github.com/sponsors/larrydiamond","https://paypal.me/ldiamondldiamond"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarrydiamond%2Ftypescriptcollectionsframework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flarrydiamond%2Ftypescriptcollectionsframework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flarrydiamond%2Ftypescriptcollectionsframework/lists"}