{"id":16480596,"url":"https://github.com/morganstanley/desktopjs","last_synced_at":"2025-04-04T13:04:04.415Z","repository":{"id":39264899,"uuid":"91333622","full_name":"morganstanley/desktopJS","owner":"morganstanley","description":"desktopJS provides a common API across multiple HTML5 containers. By programming to a common API, applications can target multiple HTML5 containers without change.","archived":false,"fork":false,"pushed_at":"2025-03-01T11:25:44.000Z","size":3314,"stargazers_count":77,"open_issues_count":2,"forks_count":42,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-03-30T15:44:52.457Z","etag":null,"topics":["desktop-app","electron","frontend"],"latest_commit_sha":null,"homepage":"http://opensource.morganstanley.com/desktopJS","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/morganstanley.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-05-15T12:10:44.000Z","updated_at":"2025-03-18T22:58:32.000Z","dependencies_parsed_at":"2024-03-08T16:25:55.355Z","dependency_job_id":"e67bfe3d-a175-4e13-b848-a0dfeaf40832","html_url":"https://github.com/morganstanley/desktopJS","commit_stats":{"total_commits":514,"total_committers":16,"mean_commits":32.125,"dds":0.5486381322957199,"last_synced_commit":"a55c38eaaa8f7e0b165366e41b776c7c4b392894"},"previous_names":[],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morganstanley%2FdesktopJS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morganstanley%2FdesktopJS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morganstanley%2FdesktopJS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morganstanley%2FdesktopJS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/morganstanley","download_url":"https://codeload.github.com/morganstanley/desktopJS/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247182384,"owners_count":20897380,"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":["desktop-app","electron","frontend"],"created_at":"2024-10-11T13:04:44.352Z","updated_at":"2025-04-04T13:04:04.395Z","avatar_url":"https://github.com/morganstanley.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![desktopJS](https://raw.githubusercontent.com/wiki/MorganStanley/desktopJS/images/logo.png)\n==========\n![Lifecycle Active](https://badgen.net/badge/Lifecycle/Active/green)\n[![npm version](https://badge.fury.io/js/%40morgan-stanley%2Fdesktopjs.svg)](https://www.npmjs.com/package/@morgan-stanley/desktopjs)\n[![Build Status](https://github.com/MorganStanley/desktopJS/actions/workflows/continuous-integration.yml/badge.svg?event=push)](https://github.com/MorganStanley/desktopJS/actions/workflows/continuous-integration.yml)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/morganstanley/desktopJS/badge)](https://securityscorecards.dev/viewer/?uri=github.com/morganstanley/desktopJS)\n[![codecov](https://codecov.io/gh/MorganStanley/desktopJS/branch/main/graph/badge.svg)](https://codecov.io/gh/MorganStanley/desktopJS)\n\ndesktopJS is a common API across multiple HTML5 containers. By programming to a\ncommon API, applications can target multiple HTML5 containers without change. Detecting\nwhat container in which you are hosted, desktopJS provides shims and polyfills to\nbridge the common API to the underlying container.  The goal is to help applications be\ncontainer agnostic and provide portability when multiple container deployments are desired.\n\nUsage\n---------------\n\nThe first step is to simply [resolve](http://opensource.morganstanley.com/desktopJS/modules/_desktopjs_src_registry_.html#resolvecontainer) the current [container](http://opensource.morganstanley.com/desktopJS/classes/_desktopjs_src_container_.container.html). This enumerates\nall registered containers (including your own custom container or derived custom implementations) and\nreturns the container implementation that matches.\n\n```\nvar container = desktopJS.resolveContainer();\nconsole.log(\"Container: \" + container.hostType);\n```\n\nInteract with the [container](http://opensource.morganstanley.com/desktopJS/classes/_desktopjs_src_container_.container.html) via a single api instead of having conditional code or applications\nbased on deployment.\n\n```\ncontainer.addTrayIcon({ icon: 'assets/img/application.png', text: 'Example' }, () =\u003e {\n\tconsole.log(\"Icon clicked\");\n});\n```\n\nBuilding\n-------\nThe library uses gulp and rollup for building.  All build dependencies are included as\ndevDependencies and are installed during npm install.\n\n```\n$ npm install\n```\n\nBuild the project.  This runs static analysis, unit tests and bundles the output with\nrollup.\n\n```\n$ npm run build \u0026\u0026 npm test\n```\n\nFor those using [Visual Studio Code](https://code.visualstudio.com/), tasks.json has a build task.\n\nDevelopment\n-----------\n\n### Local Hosting\n\nTo run the examples or to manually test scenarios in each container, there is a gulp task providing\na local server with live reload.  This can be run directly via gulp or through npm.\n\n```\n$ npm start\n```\n\nThis is configured to listen at [http://localhost:8000](http://localhost:8000) and will reload upon\nany change to the project build output under /dist or the web example under /examples/web.  All of the\nincluded examples make use of this example application to showcase the portability of one\ncodebase.\n\n### Unit tests\n\nThe tests can be run independent of the build.\n\n```\n$ npm test\n```\n\nA task is provided for [Visual Studio Code](https://code.visualstudio.com/) users that can be launched\nfrom the command palette via\n\n```\n\u003eTasks: Run Test Task\n```\n\nor it is recommended to define a custom keyboard binding.\n\n```\n{\n    \"key\": \"ctrl+shift+t\",\n    \"command\": \"workbench.action.tasks.test\"\n}\n``` \n\nExamples\n--------\nExamples showcasing usage of desktopJS for various containers and scenarios can be found under\nthe [examples](https://github.com/MorganStanley/desktopJS/tree/main/examples) directory.\n\nFeature Matrix\n--------\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003ctr\u003e\n            \u003cth\u003e Feature \u003c/th\u003e\u003cth\u003e Browser \u003c/th\u003e\u003cth\u003e ComposeUI\u003c/th\u003e\n        \u003c/tr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd colspan=3\u003e Hosting \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Web \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :heavy_check_mark: \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e WPF \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e WinForms\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Java\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x: \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Win32 \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Flash \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd colspan=3\u003e MessageBus \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Cross Window\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :heavy_check_mark:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Cross Technology \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :heavy_check_mark:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Cross Process\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :heavy_check_mark:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Cross Machine \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd colspan=3\u003e Platform \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Windows \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :heavy_check_mark:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Mac \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Linux \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd colspan=3 \u003e Node.js \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Bootstrap \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Renderer\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd colspan=3 \u003e Notifications \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Native API\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Web Notifications \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e System tray\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Icon \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :heavy_check_mark:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Context Menu\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd colspan=3\u003e Windows \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Popups\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Modal \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Frameless\u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :x:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Screenshot \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e :heavy_check_mark:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd colspan=3\u003e Window Management \u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Persistence \u003c/td\u003e\n            \u003ctd class=\"browser\" class=\"container\"\u003e \n                \u003ca href=\"http://opensource.morganstanley.com/desktopJS/\"\u003edesktopJS\u003c/a\u003e \n            \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Grouping \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"browser\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Snap/Dock \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"browser\"\u003e :x:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Tabbing \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"browser\"\u003e :heavy_check_mark: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Remote Administration \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"browser\"\u003e:x:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e:x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Restart \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"browser\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Shutdown \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"browser\"\u003e :x:\u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\u003ctr\u003e\n            \u003ctd class=\"feature\"\u003e Screenshot \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"browser\"\u003e :x: \u003c/td\u003e\n            \u003ctd class=\"container\" class=\"composeui\"\u003e :x:\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorganstanley%2Fdesktopjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorganstanley%2Fdesktopjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorganstanley%2Fdesktopjs/lists"}