{"id":19786487,"url":"https://github.com/knockout/tko","last_synced_at":"2025-05-14T21:09:18.523Z","repository":{"id":3058798,"uuid":"48294708","full_name":"knockout/tko","owner":"knockout","description":"🥊  Technical Knockout – The Monorepo for Knockout.js (4.0+)","archived":false,"fork":false,"pushed_at":"2025-03-06T12:34:14.000Z","size":9328,"stargazers_count":285,"open_issues_count":65,"forks_count":36,"subscribers_count":40,"default_branch":"main","last_synced_at":"2025-04-07T19:06:12.107Z","etag":null,"topics":["framework","frontend","frontend-app","frontend-framework","frontend-web","knockout","mvvm","mvvm-framework","tko"],"latest_commit_sha":null,"homepage":"http://www.tko.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/knockout.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2015-12-19T19:36:11.000Z","updated_at":"2025-03-16T23:46:23.000Z","dependencies_parsed_at":"2025-01-27T06:02:20.149Z","dependency_job_id":"8849f028-185b-4510-aecb-3b303bad71da","html_url":"https://github.com/knockout/tko","commit_stats":{"total_commits":1245,"total_committers":23,"mean_commits":"54.130434782608695","dds":0.508433734939759,"last_synced_commit":"d71d7f9edd356e6fb7b2bd3e740d08b351b68dca"},"previous_names":[],"tags_count":74,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knockout%2Ftko","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knockout%2Ftko/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knockout%2Ftko/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/knockout%2Ftko/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/knockout","download_url":"https://codeload.github.com/knockout/tko/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248949572,"owners_count":21188100,"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":["framework","frontend","frontend-app","frontend-framework","frontend-web","knockout","mvvm","mvvm-framework","tko"],"created_at":"2024-11-12T06:18:14.771Z","updated_at":"2025-04-14T22:10:47.182Z","avatar_url":"https://github.com/knockout.png","language":"TypeScript","readme":"\n# TKO (“Technical Knockout”)\n\n[![npm version](https://badge.fury.io/js/tko.svg)](https://badge.fury.io/js/tko)\n[![Join the chat at https://gitter.im/knockout/tko](https://badges.gitter.im/knockout/tko.svg)](https://gitter.im/knockout/tko?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n[![Circle CI](https://circleci.com/gh/knockout/tko.svg?style=shield)](https://circleci.com/gh/knockout/tko)\n[![Coverage Status](https://coveralls.io/repos/knockout/tko/badge.svg?branch=master\u0026service=github)](https://coveralls.io/github/knockout/tko?branch=master)\n[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)\n\n\u003c!-- [![Sauce Test Status](https://saucelabs.com/browser-matrix/tko.svg)](https://saucelabs.com/u/tko) --\u003e\n\n**TKO** houses the monorepo of [Knockout](https://github.com/knockout/knockout).\n\n## Getting Started\n\nTo install use one of the usual package managers e.g.\n\n- $ `yarn add @tko/build.reference`\n- $ `npm install @tko/build.reference`\n\nOver CDN\n\n- Reference Build: https://cdn.jsdelivr.net/npm/@tko/build.reference@4.0.0-alpha8/dist/build.reference.min.js\n\n## Knockout Build\n\nThe Knockout build has some backwards compatibility that is not in the reference build.  See the build differences, here: https://tko.io/3to4\n\nIt's available as `@tko/build.knockout`, and over CDN:\n\n- Knockout Build https://cdn.jsdelivr.net/npm/@tko/build.knockout@4.0.0-alpha8/dist/build.knockout.min.js\n\n### Using the Monorepo\n\n| Command | Effect |\n| ------- | ------ |\n| $ `git clone git@github.com:knockout/tko` | Clone the repository. |\n| $ `npm install -g yarn` | Ensure yarn is globally available |\n| $ `yarn` | Install local node packages and link tko modules |\n| $ `make` | **Currently TKO use a make file** |\n| $ `yarn test` | Run all tests. See below. |\n| $ `yarn watch` | Run all tests and watch for changes. See below. |\n| $ `yarn build` | Build tko\\[.module\\]\\[.es6\\]\\[.min\\].js files, where `.es6` version has not been transpiled |\n| $ `lerna publish` | Bump versions and publish to npm registry |\n\nCheckout `package.json =\u003e scripts` for more commands that can be executed with `yarn {command}`.\n\nIn each individual `packages/*/` directory, you can also run (presuming `rollup` and `karma` are installed globally):\n\n| Command | Effect |\n| --- | --- |\n| $ `karma COMMAND ../../karma.conf.js [--once]`  | Test the local package, where COMMAND is e.g. `start` or `run` |\n| $ `rollup -c ../../rollup.config.js`  | Build the package into the local `dist/` |\n\n#### Testing with `yarn test` and `yarn watch`\n\n### NEW\n\nStart tests with electron: `make test`\n\nStart tests with headless-chrome: `make test-headless`\n\n### OLD\n\nThe `yarn test` and `yarn watch` commands can be used in the root directory, where it will run across all tests, or alternatively in any `packages/*/` directory to run tests\nspecific to that package.\n\nOptional arguments to `yarn test` include:\n\n- `--sauce` — use Sauce Labs to test a variety of platforms; requires an account at Sauce Labs and `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` to be set in the environment.\n- `--noStartConnect` — Do not start a new Sauce Connect proxy instance for every\ntest; requires that Sauce Connect be already running.\n\n#### `visual.html`\n\nNote that running `karma` or `rollup` will create a `visual.html` file that shows the proportional size of imports into each package.\n\n### Objectives\n\nTKO aims to become a base for future versions of Knockout.  The objectives include:\n\n- Modularization into ES6 and separate projects, with compilation using an ES6 compiler like [Rollup](http://rollupjs.org/).  This solves several problems with Knockout, including:\n  - Some folks want to roll-their-own with e.g. removing components\n  - Compilation is now with Closure compiler, which is actually transliterating – meaning the *debug* and *minified* versions have different code paths (mostly in the form of things exposed in *debug* being missing in the *minified* version)\n  - The compilation of Knockout is just concatenation, leading to difficulties with maintainance, severance, and replacement\n- Documentation inline in the source code.  This aims to make it easier to document, by making documentation adjacent to the code about-which it speaks.  Also, we aim to have examples in the documentation.\n- A more comprehensive home page.  The hope is to have something fun and fancy, and we have [a rough prototype](http://brianmhunt.github.io/knockout).\n- Better setup for plugins.  The problems with Knockout include:\n  - There's no central, searchable repository for knockout\n  - What should be simple plugins (e.g. binding handlers or providers) are complex, including:\n    - Built-ins have first-class access to quite a bit of good Knockout code, but plugins generally have second-class access and often have to duplicate Knockout internals\n    - Quality plugins have lots of boilerplate for compilation, release, documentation, and testing\n\n## Some WSL tricks\n\nInstall electron-deps for \"make test\":\n\n```bash\nsudo apt-get install build-essential clang libdbus-1-dev libgtk-3-dev \\\nlibnotify-dev libasound2-dev libcap-dev \\\nlibcups2-dev libxtst-dev \\\nlibxss1 libnss3-dev gcc-multilib g++-multilib curl \\\ngperf bison python3-dbusmock openjdk-8-jre\n```\n\nInstall Chrome for \"make test-headless\":\n\n```bash\nwget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb\nsudo apt -y install ./google-chrome-stable_current_amd64.deb\n```\n\n## Next steps\n\nThere's an [issue for that](https://github.com/knockout/tko/issues/1).\n\n## License\n\nMIT license - [http://www.opensource.org/licenses/mit-license.php.](http://www.opensource.org/licenses/mit-license.php)\n\n## Shout Outs\n\n\u003cdiv\u003e\n  \u003ca href='http://browserstack.com'\u003e\n    \u003cimg height=150px src='https://p3.zdusercontent.com/attachment/1015988/gTNrZ9vPjL8ThUHOWP7ucklJi?token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..HkCKDttXKDSGFoV5uaMPQA.ha9NDy63mjLKFcyNeib70TCkqfY0dcwiFwDYpZ8s5h75o-e1_cLjPAHlOUEwvKAbfMUaa1XpOL5F9AQd_B4iyc6JbgvKoKBxxe12aaOdfWFccP7r9iQ2Os6myiqBpP79prDXqFPMSAkF8ybzhVqCnWzxmK-Wvkbav-DGPZm3oS2IPD9ueIvf46bggFsikQhf1pjS5fgmzo07yi9Cf5SzA8zIKAjKX1RKQeFXOhBwxRfh_5SbJprfEZMnKBnGuO_qzP2fsK3BvxbyBKpIEWFdnA.t10i3BbyEpGtFVgyGbvQfw' alt='Browser Stack' /\u003e\n  \u003c/a\u003e\n\u003cdiv\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknockout%2Ftko","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fknockout%2Ftko","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fknockout%2Ftko/lists"}