{"id":20591437,"url":"https://github.com/airtap/multi","last_synced_at":"2026-03-03T13:42:49.231Z","repository":{"id":45867403,"uuid":"285785429","full_name":"airtap/multi","owner":"airtap","description":"Use multiple browser providers as one.","archived":false,"fork":false,"pushed_at":"2024-07-01T03:42:18.000Z","size":11,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-01-20T19:25:12.314Z","etag":null,"topics":["airtap","browser-provider","browsers","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/airtap.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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,"publiccode":null,"codemeta":null}},"created_at":"2020-08-07T09:02:43.000Z","updated_at":"2021-12-01T07:51:06.000Z","dependencies_parsed_at":"2024-06-21T20:41:04.183Z","dependency_job_id":null,"html_url":"https://github.com/airtap/multi","commit_stats":{"total_commits":5,"total_committers":2,"mean_commits":2.5,"dds":0.4,"last_synced_commit":"7073655de2b99107156feb9513ee89b8918e570b"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airtap%2Fmulti","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airtap%2Fmulti/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airtap%2Fmulti/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airtap%2Fmulti/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/airtap","download_url":"https://codeload.github.com/airtap/multi/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240205849,"owners_count":19764990,"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":["airtap","browser-provider","browsers","nodejs"],"created_at":"2024-11-16T07:40:19.208Z","updated_at":"2026-03-03T13:42:49.191Z","avatar_url":"https://github.com/airtap.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# airtap-multi\n\n**Use multiple [browser providers](https://github.com/airtap/browser-provider) as one.**\n\n[![npm status](http://img.shields.io/npm/v/airtap-multi.svg)](https://www.npmjs.org/package/airtap-multi)\n[![node](https://img.shields.io/node/v/airtap-multi.svg)](https://www.npmjs.org/package/airtap-multi)\n[![Travis build status](https://img.shields.io/travis/com/airtap/multi.svg?label=travis)](http://travis-ci.com/airtap/multi)\n[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)\n\n## Usage\n\n```js\nconst Multi = require('airtap-multi')\nconst multi = new Multi()\n\nmulti.add('airtap-playwright')\nmulti.add('airtap-sauce')\n\n// Get manifests with name 'firefox'\nconst manifests = await multi.manifests([{\n  name: 'firefox'\n}])\n\n// Only from the airtap-sauce provider\nconst manifests = await multi.manifests([{\n  name: 'firefox',\n  provider: 'airtap-sauce'\n}])\n\n// Instantiate a browser (see browser-provider for details)\nconst browser = multi.browser(manifest, target)\n```\n\n## API\n\n### `multi = new Multi()`\n\nImplements the [`browser-provider`](https://github.com/airtap/browser-provider) interface with a few additional methods.\n\n### `multi.add(id[, options])`\n\nAdd a provider that's been installed in a nearby `node_modules`. The optional `options` object will be passed to the provider's constructor.\n\n### `multi.add(object[, options])`\n\nAdd multiple providers in the form of `{ [id]: options }`:\n\n```js\nmulti.add({\n  'airtap-sauce': {\n    username: 'example',\n    key: 'secret'\n  }\n})\n```\n\nIf the second `options` argument is provided, those options will be deeply merged into the options of each provider.\n\n### `multi.add(fn[, options])`\n\nAdd a provider as a constructor function.\n\n### `multi.add(array[, options])`\n\nAdd multiple providers using an array, where each array element is of the above types (string, object or function).\n\n### `provider = multi.get(id)`\n\nGet an added provider by its id.\n\n### `iterator = multi[Symbol.iterator]()`\n\n```js\nfor (const [id, provider] of multi) {\n  // ..\n}\n```\n\n### `iterator = multi.keys()`\n\n```js\nfor (const id of multi.keys()) {\n  // ..\n}\n```\n\n### `iterator = multi.values()`\n\n```js\nfor (const provider of multi.values()) {\n  // ..\n}\n```\n\n## Install\n\nWith [npm](https://npmjs.org) do:\n\n```\nnpm install airtap-multi\n```\n\n## License\n\n[MIT](LICENSE.md) © 2020-present Airtap contributors\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fairtap%2Fmulti","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fairtap%2Fmulti","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fairtap%2Fmulti/lists"}