{"id":19018995,"url":"https://github.com/garrettmflynn/escode","last_synced_at":"2025-07-20T21:36:57.203Z","repository":{"id":60945364,"uuid":"527731611","full_name":"garrettmflynn/escode","owner":"garrettmflynn","description":"The Universal Web Development Framework","archived":false,"fork":false,"pushed_at":"2023-10-28T15:52:51.000Z","size":72749,"stargazers_count":2,"open_issues_count":8,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-06-14T09:05:02.813Z","etag":null,"topics":["composability","ecmascript","esm","javascript"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/garrettmflynn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-08-22T21:03:45.000Z","updated_at":"2023-10-28T15:17:02.000Z","dependencies_parsed_at":"2023-07-18T23:17:39.933Z","dependency_job_id":"a91baae5-51a5-4419-b695-5288c486d008","html_url":"https://github.com/garrettmflynn/escode","commit_stats":{"total_commits":224,"total_committers":3,"mean_commits":74.66666666666667,"dds":0.0892857142857143,"last_synced_commit":"aac5b7bd8eaf7908ca23ef9d13519a35b941d3a2"},"previous_names":["brainsatplay/es-plugins","brainsatplay/escompose","garrettmflynn/escode","brainsatplay/escode"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/garrettmflynn/escode","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garrettmflynn%2Fescode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garrettmflynn%2Fescode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garrettmflynn%2Fescode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garrettmflynn%2Fescode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/garrettmflynn","download_url":"https://codeload.github.com/garrettmflynn/escode/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/garrettmflynn%2Fescode/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265508850,"owners_count":23779249,"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":["composability","ecmascript","esm","javascript"],"created_at":"2024-11-08T20:10:13.116Z","updated_at":"2025-07-20T21:36:57.184Z","avatar_url":"https://github.com/garrettmflynn.png","language":"JavaScript","funding_links":["https://opencollective.com/brainsatplay","https://opencollective.com/brainsatplay/backer/0/website","https://opencollective.com/brainsatplay/backer/1/website","https://opencollective.com/brainsatplay/backer/2/website","https://opencollective.com/brainsatplay/backer/3/website","https://opencollective.com/brainsatplay/backer/4/website","https://opencollective.com/brainsatplay/backer/5/website","https://opencollective.com/brainsatplay/backer/6/website","https://opencollective.com/brainsatplay/backer/7/website","https://opencollective.com/brainsatplay/backer/8/website","https://opencollective.com/brainsatplay/backer/9/website","https://opencollective.com/brainsatplay/backer/10/website","https://opencollective.com/brainsatplay/backer/11/website","https://opencollective.com/brainsatplay/backer/12/website","https://opencollective.com/brainsatplay/backer/13/website","https://opencollective.com/brainsatplay/backer/14/website","https://opencollective.com/brainsatplay/backer/15/website","https://opencollective.com/brainsatplay/backer/16/website","https://opencollective.com/brainsatplay/backer/17/website","https://opencollective.com/brainsatplay/backer/18/website","https://opencollective.com/brainsatplay/backer/19/website","https://opencollective.com/brainsatplay/backer/20/website","https://opencollective.com/brainsatplay/backer/21/website","https://opencollective.com/brainsatplay/backer/22/website","https://opencollective.com/brainsatplay/backer/23/website","https://opencollective.com/brainsatplay/backer/24/website","https://opencollective.com/brainsatplay/backer/25/website","https://opencollective.com/brainsatplay/backer/26/website","https://opencollective.com/brainsatplay/backer/27/website","https://opencollective.com/brainsatplay/backer/28/website","https://opencollective.com/brainsatplay/backer/29/website"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"./assets/logo_with_text_dark.svg\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"./assets/logo_with_text_light.svg\"\u003e\n    \u003cimg alt=\"escode: Recompose the Web\" src=\"./assets/logo_with_text_light.svg\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n[![Npm package version](https://badgen.net/npm/v/escode)](https://npmjs.com/package/escode)\n[![Npm package monthly downloads](https://badgen.net/npm/dm/escode)](https://npmjs.com/package/escode)\n[![License: AGPL v3](https://img.shields.io/badge/license-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)\n[![Discord](https://img.shields.io/badge/community-discord-7289da.svg?sanitize=true)](https://discord.gg/CDxskSh9ZB)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-13-orange.svg?style=flat-square)](#contributors)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\nThe [Brains@Play] **ESCode** project is a collection of ECMAScript libraries intended to further the Web as a **Universal Development Engine** by allowing you to program and share composable web applications using [any WebAssembly-supported language](https://www.fermyon.com/wasm-languages/webassembly-language-support).\n\n\u003e **Note:** As of January 2023, all development related to the ESCode project has been moved to the [graphscript] repository. All NPM packages are still available, but have not been updated since the release of [ESCode: A First Look](https://www.youtube.com/watch?v=aD4hluIhazs\u0026ab_channel=brainsatplay) in November 2022.\n\n**escode** implements the [ES Components] specification—a variant of [graphscript]—which allows you to define special properties on a hierarchy of reactive objects.\n\n## What's Possible with ESCode\n- **Write Software Faster:** Use existing Components to start your journey\n- **Visualize your Code:** See how your code is organized at a high level—and change it\n- **Share Code with Others:** Contribute to a growing community\n- **Move as One:** Pull updates from a wide array of other programmers\n\n\u003e ### ESCode vs. Other Popular Frameworks\n\u003e Unlike libraries that use hooks like useEffect (React) and watchEffect (Vue), ESCode monitors **arbitrary objects** for changes to their values based on specified **listeners**—meaning we don't require explicitly registering references or using returned objects.\n\n## Getting Started\nTo create a component, pass an object to the `create` function:\n```js\n\nimport { create } from 'escode';\n\nconst button = {\n    __element: 'button',\n    __attributes: {\n        onclick: function (input) { console.log(this) }\n    }\n}\n\nconst component = create(button, {__parent: document.body})\ncomponent.__element.click()\n```\n\nThese objects are deep cloned, meaning that **all properties attached to the object itself are independent across instantiations**.\n\n## Other Instantiation Strategies\n### Classes\nIf you prefer to work with classes, these will also be instanced using this function:\n\n```js\nimport { create } from 'escode';\n\nconst shared = {\n    value: 0\n}\n\nclass MyButton {\n\n    shared = shared\n\n    __element = 'button'\n\n    __attributes = {\n        onclick: function (input) { \n            this.value++\n            console.log(this.value)\n         }\n    }\n\n}\n\nconst component = create(MyButton, {__parent: document.body})\ncomponent.__element.click() // shared.value = 1\n```\n\nHowever, **class instances are assumed to be sufficiently instanced by the user**. As such, local objects attached to the class itself will be shared across instances.\n\n```js\nconst secondComponent = create(MyButton, {__parent: document.body})\nsecondComponent.__element.click() // shared.value = 2\n```\n\nTo avoid this, you can simply pass an **instance** of the class using the `new` keyword:\n```js\nconst component = create(new MyButton(), {__parent: document.body})\ncomponent.__element.click()\n```\n\n#### A Note on Deep and Shallow Composition\nClasses are inherently suited for shallow composition because **top-level properties that are reset on an extension are overwritten—even if they are objects with shared properties**.\n\nOn the other hand, the [escode-compose-loader] allows you to compose classes deeply, meaning that **properties that are objects are merged** as well as **strings are loaded from source**.\n\nAlthough the [escode-compose-loader] is native to [ES Components], it's worth noting that classes already have some mechanism for loading—so, in some cases, they may be better suited to your needs.\n\n### Arrays\nIn specific cases, an array may be useful to apply bulk operations to independent Components:\n```js\nimport { create } from 'escode';\n\nconst components = create([button, myButton, button], {\n    __parent: document.body,\n    __attributes: {\n        onclick: function (input) { console.log(this) }\n    }\n})\ncomponents.forEach(component =\u003e component.__element.click())\n```\n\n### Linking Components to Source Text\nA string can be passed to grab the Component from a local JavaScript file—or, with additional utilities, compile from source text:\n```js\nimport { create } from 'escode';\nimport * as esm from 'esmpile'\n\nconst button = './index.esc.js'\nconst component = create(button)\nconst component = create(button, {__parent: document.body},  { utilities: { bundle: {function: esm.bundle.get}}})\ncomponent.__element.click()\n```\n\n\n### Creating Components from Functions\nA function can be passed directly as a Component, which wraps it as the `default` function of a new component:\n\n```js\nimport { create } from 'escode';\n\nconst fn = (input) =\u003e {\n    console.log(input)\n    return input\n}\nconst component = create(fn)\ncomponent.default()\n```\n\nIf you're looking to listen to a function, you can simply add it as a property _inside_ a valid ES Component object.\n\n```js\nimport { create } from 'escode';\n\nconst reactive = {\n    fn,\n    latest: undefined,\n    __listeners: {\n        fn: 'latest'\n    }\n}\n\nconst component = create(reactive)\ncomponent.fn(1)\n```\n\n### Applying Components to DOM Element\nElements can be passed to apply Components to existing DOM elements:\n```js\nimport { create } from 'escode';\n\nconst button = document.createElement('button')\nbutton.innerText = 'I will respond to clicks using ESCode'\ndocument.body.appendChild(button)\n\n\nconst component = create(button, {\n    __attributes: {\n        onclick: function (input) { console.log(this) }\n    }\n})\ncomponent.__element.click()\n```\n\n## GraphScript Properties\nGraphScript properties refer to **special properties that are used to instantiate the Component**. These properties are prefixed with `__` and are recognized with **loaders** than can be used to experiment with new Component behaviors\n\n\u003e See the [ES Components] specification for a full list of default properties. \n\nAll ES Components have at least one GraphScript property at instantiation. All other properties throughout an ES Component are listeneable by the root Component.\n\n\u003e **Note:** This includes classes and functions. Classes will not be instantiated without a static `__` property. On the other hand, functions will not converted to a `default` property without a `__` property set—though they will still be listenable without it.\n\nActive components are recognized by the presence of the `__` property on them. This provides access to utilities such as `run` and `subscribe`—as well as retains a record of read-only properties maintained by the library itself.\n\nAll other `__` properties are considered GraphScript properties, and are used to program the behavior of the Component. \n\n### Component Instancing\nComponents are created using the `create` factory function, which accepts any object (e.g. Object, Array, or Class) and outputs an analogous object.\n\n**Unlike graphscript, we do not return a standard class from the `create` function.** Instead, the Component is returned based on the type of the input object.\n\n#### Objects\nObjects are extensively instanced and treated as templates. This means that **all properties attached to the object itself are independent across instantiations**. \n\n#### Classes\nClasses are instanced using the `new` keyword. The resulting instancing behavior is assumed to be appropriate for the Component. This allows for minimal performance overhead when using classes.\n\n#### Arrays\nArrays are iterated over and each item is passed to the factory function. The resulting array is returned.\n\n## Loaders\nAdditional properties can be added using the loaders argument for escode: \n```js\nimport { create } from 'escode';\nconst component = create(input, undefined, {\n    loaders: [ myLoader ]\n})\n```\n\n## Integrating with Existing Projects\nYou can incrementally integrate ESCode into your existing projects by wrapping existing functional components and using our listener system to trigger messages between different aspects of the app: \n    \n```js\nimport { create } from 'escode';\nimport * as existing from './app.js'\n\nconst component = {\n    producer: existing.producer,\n    consumer: existing.consumer,\n    __listeners: {\n        'producer': 'consumer'\n    }\n}\n\nconst component = create(existing, {__parent: document.body})\n\ncomponent.producer()\n```\n\nRelatedly, you can also use ESCode more directly as an event manager: \n    \n```js\nimport { create } from 'escode';\nimport * as existing from './app.js'\n\nconst component = {\n    producer: existing.producer,\n    consumer: existing.consumer,\n    __listeners: {\n        'producer': (result) =\u003e {\n            const res = existing.consumer(result)\n            console.log(res)\n            return res\n        }\n    }\n}\n\nconst component = create(existing, {__parent: document.body})\n\ncomponent.producer()\n```\n\nBoth of these strategies are particularly useful for integrating with published [ES Components] that you'd like to use in your project.\n\n## The Libraries\n### ECMAScript (JS)\n#### [esmpile]\nThe [esmpile] library allows you to compile ESM code from their text sources. This allows you to track a list of active imports.\n\n#### [esmonitor]\nThe [esmonitor] library allows you to receive notification about changes to objects and their values via a _simple plain-text subscription interface for arbitrary object properties_.\n\n#### [escode]\nThe [escode] library allows you to transform ESM into Web Components that send messages to each other using the [ECMAScript Components (ESC)](./js/escode/README.md#the-specification) specification.\n\n#### [escompose]\nThe [escompose] library allows you to convert between JS, JSON, and HTML declarations of ESC.\n\n#### [escode-ide]\nThe [escode-ide] library is a visual programming system to visualize and edit ESC files.\n\n## Current Benchmarks\n| Metric | [escode] | [graphscript] |\n| --- | ----------- | ----------- |\n| Core Size - bundled | 86kb | 39kb |\n| Core Size - minified | 37kb | 20kb |\n| Instantiation Time | 3.15ms | — |\n| Instantiation w/ Explicit Children | 2.7963ms | 3.15ms |\n| Listener Reaction Time | 0.026ms | 0.015ms |\n\n## Future Work\n### Composers\nGenerally, we would like to introduce **composers** to provide additional ways to load and instantiate Components. This would allow for more complex behaviors to be added to the library, such as:\n\n#### Exporting + Loading JSON Objects\nAfter creating a component, you can serialize it to a JSON object:\n```js\nconst json = component.toJSON()\n```\n\n```json\n{\n    \"value\": 0,\n    \"fn\": \"function(){this.value++}\",\n    \"__listeners\": {\n        \"fn\": \"value\"\n    }\n}\n```\n\nThis can be used to reconstruct the component:\n```js\nimport { create } from 'escode';\nconst component = create(json)\ncomponent.fn()\n```\n\n#### Exporting HTML + Page Hydration\nAfter creating a component, you can export it to HTML text:\n```js\nconst htmlString = component.toHTML()\n```\n\nThis can be used to reconstruct the component:\n```js\nimport { create } from 'escode';\nconst component = create(htmlString)\n```\n\nAdditionally, you can load the HTML text as a file and hydrate your components:\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003cscript type=\"module\"\u003e\n            import { create } from 'https://cdn.jsdelivr.net/npm/escode';\n            const component = create()\n            component.fn()\n        \u003c/script\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003cdiv .value=0 .fn=\"function(){this.value++}\" __listeners.fn=\"value\" escomponent\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\n#### Adding ESMpile Support\nBoth of the aforementioned methods could additionally from knowing where accompanying source files actually sit. When exporting a component, you could optionally use [esmpile] to reference source files rather than exhaustively enumerating all of your properties in JSON or HTML.\n\n## Contributors\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003e\u003ca href=\"http://garrettflynn.com/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/46533749?v=4?s=100\" width=\"100px;\" alt=\"Garrett Michael Flynn\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGarrett Michael Flynn\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-garrettmflynn\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/brainsatplay/escode/commits?author=garrettmflynn\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#business-garrettmflynn\" title=\"Business development\"\u003e💼\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\n## Additional Repository Information\n### [components](./components/README.md)\nThis is intended to be an official repository of ES Components.\n\nIn the near future, we will switch to the registration of ES Components through NPM via standardized use of the `graphscript` and `escomponent` keywords. These existing components will be published and distributed into independent repositories.\n\nTo learn more about the publication workflow, see the [escomponent](https://github.com/brainsatplay/escomponent) template repository.\n\n## Acknowledgments\nOur work at [Brains@Play] is sustained by a wide range of contract work and the generous support of our community through [Open Collective](https://opencollective.com/brainsatplay):\n\n### Backers\n[Support us with a monthly donation](https://opencollective.com/brainsatplay#backer) and help us continue our activities!\n\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/9/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/10/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/10/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/11/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/11/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/12/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/12/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/13/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/13/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/14/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/14/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/15/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/15/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/16/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/16/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/17/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/17/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/18/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/18/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/19/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/19/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/20/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/20/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/21/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/21/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/22/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/22/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/23/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/23/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/24/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/24/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/25/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/25/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/26/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/26/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/27/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/27/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/28/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/28/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/backer/29/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/backer/29/avatar.svg\"\u003e\u003c/a\u003e\n\n### Sponsors\n\n[Become a sponsor](https://opencollective.com/brainsatplay#sponsor) and get your logo here with a link to your site!\n\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/10/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/10/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/11/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/11/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/12/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/12/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/13/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/13/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/14/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/14/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/15/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/15/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/16/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/16/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/17/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/17/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/18/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/18/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/19/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/19/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/20/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/20/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/21/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/21/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/22/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/22/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/23/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/23/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/24/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/24/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/25/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/25/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/26/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/26/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/27/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/27/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/28/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/28/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/brainsatplay/sponsor/29/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/brainsatplay/sponsor/29/avatar.svg\"\u003e\u003c/a\u003e\n\n\n[graphscript]: https://github.com/brainsatplay/graphscript\n[escode-ide]: ./js/packages/escode-ide/README.md\n\n[escode-compose-loader]: ./js/packages/escode-compose-loader/README.md\n\n[Brains@Play]: https://github.com/brainsatplay\n\n[esmpile]: https://github.com/garrettmflynn/esmpile\n[esmonitor]: https://github.com/garrettmflynn/esmonitor\n[escompose]: ./js/packages/escompose/README.md\n[escode]: ./js/README.md\n[ES Components]: ./spec/README.md\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgarrettmflynn%2Fescode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgarrettmflynn%2Fescode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgarrettmflynn%2Fescode/lists"}