GithubHelp home page GithubHelp logo

asyncapi / asyncapi-react Goto Github PK

View Code? Open in Web Editor NEW
172.0 172.0 107.0 106.73 MB

React component for rendering documentation from your specification in real-time in the browser. It also provides a WebComponent and bundle for Angular and Vue

Home Page: https://asyncapi.github.io/asyncapi-react/

License: Apache License 2.0

TypeScript 94.65% JavaScript 3.41% HTML 1.29% CSS 0.41% Shell 0.26%
asyncapi asyncapi-specification event get-global-node-release-workflows hacktoberfest nodejs react reactjs

asyncapi-react's Introduction

AsyncAPI Logo

Read the specification

The latest draft specification can be found at spec/asyncapi.md which tracks the latest commit to the master branch in this repository.

The human-readable markdown file is the source of truth for the specification.

Click to see reference links to older versions of the specification.

Looking for the JSON Schema files? Check out our spec-json-schemas repo.

Feel like contributing? Check out our contributor's guide.

Examples

Check out the examples directory for examples.

Case Studies and Adopters

Check out the AsyncAPI website to see the list of AsyncAPI adopters and their use cases.

Our Sponsors

Want to become a sponsor? Learn what we do with sponsors' money and join the club.

Platinum

Solace logo      Gravitee      Postman

Gold

IBM

Silver

Bump.sh      Svix
HiveMQ      Aklivity
SmartBear      HDI
Best Route Planning and Route Optimization Software

Bronze

RedHat

Contributors

Thanks goes to these wonderful people (emoji key):

Fran Méndez
Fran Méndez

💬 🐛 📝 📖 🤔 🚇 🚧 👀 📢
Lukasz Gornicki
Lukasz Gornicki

📖 🤔 👀 💬 📝 📢 🚧 🚇
Mike Ralphson
Mike Ralphson

💬 📖 🤔 🚇 👀 🚧
raisel melian
raisel melian

💬 🐛 📖 🤔 🚧 👀
Chris Wood
Chris Wood

🤔 📖
Jonathan Schabowsky
Jonathan Schabowsky

📖 🤔
Victor Romero
Victor Romero

🤔 👀
Antonio Garrote
Antonio Garrote

🤔 👀 📖
Jonathan Stoikovitch
Jonathan Stoikovitch

💡 🤔 👀
Jonas Lagoni
Jonas Lagoni

🐛 📖 🤔 💬 👀 💡
Waleed Ashraf
Waleed Ashraf

📢 🤔 📖 💡
Andrzej Jarzyna
Andrzej Jarzyna

📢
Emmelyn Wang
Emmelyn Wang

📝 🤔 📖 📢
Marc DiPasquale
Marc DiPasquale

📝 📢 👀 🐛 🤔 📹
Gerald Loeffler
Gerald Loeffler

📖 🐛 🤔
Dale Lane
Dale Lane

📝 🤔 📹 📢 📖
Maciej Urbańczyk
Maciej Urbańczyk

👀 🤔 💬 🐛 📖 💡 🚧
Vladimir Gorej
Vladimir Gorej

📖 🐛 💡 🤔 👀
Lorna Jane Mitchell
Lorna Jane Mitchell

📢 🤔
Laurent Broudoux
Laurent Broudoux

📖 📝 📢 💡 🤔 👀
Jesse Menning
Jesse Menning

📝 📢 👀 🤔
Sergio Moya
Sergio Moya

👀 🤔 💬 📝 🐛 📖 💡 🚧
Alexander Balogh
Alexander Balogh

📖 🐛
Khuda Dad Nomani
Khuda Dad Nomani

💡 🐛
Aaron Korver
Aaron Korver

📖
Orlov Valentine
Orlov Valentine

📖
Moez Bouhlel
Moez Bouhlel

📖
Muhammad Rafly Andrianza
Muhammad Rafly Andrianza

📖
Daniel Kocot
Daniel Kocot

📖 💡 🤔
sekharbans-ebay
sekharbans-ebay

📖 💡 🤔
Michael Davis
Michael Davis

🐛 📖 💡 🤔
Heiko Henning
Heiko Henning

🐛 💻 🖋 📖 💡 🤔 🚧 👀
Quetzalli
Quetzalli

🖋 📖 💡 🤔 👀
Akshit Gupta
Akshit Gupta

🖋 📖
samz
samz

🐛 🖋 📖 💡 📆
Rishi
Rishi

🚧 🚇
nickshoe
nickshoe

🐛 📖
Ace
Ace

📋 🤔 🚧 📢
Animesh Kumar
Animesh Kumar

🖋 📖 🚧
Fabrizio Lazzaretti
Fabrizio Lazzaretti

📖
Pavel Bodiachevskii
Pavel Bodiachevskii

📖 🐛 🤔 💬

This project follows the all-contributors specification. Contributions of any kind welcome!

asyncapi-react's People

Contributors

195858 avatar aayushmau5 avatar acethecreator avatar akshatnema avatar akucharska avatar allcontributors[bot] avatar asyncapi-bot avatar bizordec avatar dependabot[bot] avatar derberg avatar dhenneke avatar diegotorresd avatar ductaily avatar fmvilas avatar fox32 avatar gexclaude avatar greenrover avatar hesyar avatar hhogg avatar hudymi avatar jakubiwanowski avatar jonaslagoni avatar kennethaasan avatar ktorz avatar magicmatatjahu avatar milgner avatar parasss19 avatar raphaelvrossi avatar robintail avatar syedzubeen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

asyncapi-react's Issues

Display message names in "Channels"

Description
Display message names or/and titles in "Channels"

Reasons
It is difficult to understand what message the channel is receiving, because only message payload and headers is displayed.
I think it would be more informative to display the name of the message itself instead of numbers or the title "Message".

Attachments

image

Make playground available as a separate npm package

Description
This repository provides two nice tools: a react-component to visualize asynapi-specs and a playground for writing async-api specs in an editor and see the results visualized.
The playground is currently only maintained for local development as far as I understand and can't be accessed apart from cloning this repository.
https://github.com/asyncapi/playground is a server-side version of the playground ?!

I suggest to publish the "playground" of this repository (could be renamed to asyapi-editor) as (at least) a react-component as well, since I think it is a nice tool which can be useful for others.

To increase accessibility of the package, it would be worth to think about providing a dependecy free bundle also (like: https://www.npmjs.com/package/swagger-editor-dist).

As already mentioned in

#76
#75

Regards,

Kai

Reasons
This feature would make another tool available in the asyncapi space, which is already there, but inaccessible.
It would be similar to https://www.npmjs.com/package/swagger-editor
I think developers coming from OpenAPI would appreciate to find such a tool.

Attachments
none

Ability to auto-expand message schema

Description

If one has a scheme that is too large and deep, then the component will render a very large amount of nesting that one has to manually click through to see the deep schema values. To increase the UX, we should have an additional button next to subschema button - a button to show deep nesting.

Solution

The changes should be introduced in the Schema component. If the user presses the extra button, all subschemas should open/close (depending if subschemas are opened/closed).


NOTE: Below is old description

@davydog187 commented on Wed Jan 22 2020

Hello and thank you for this great project!

The Problem

I have nested payload structures that are 3-4 levels deep, and it is cumbersome to keep clicking to view the schema.

Potential Solution

It would be nice if there was an option in the generator that has nested structures auto-expanded, maybe with a parameter to specify the level of nesting that you want to stop auto-expanding.

I could be interested in helping contribute, but would need some pointing in the right direction :) Thanks!


@fmvilas commented on Wed Feb 05 2020

Hey @davydog187. Thanks for the suggestion. It would indeed be great. Any help would be much appreciated 🙏

Rename App component file to Playground

Context

SonarCloud info:

By convention, a file that exports only one class, function, or constant should be named for that class, function or constant. Anything else may confuse maintainers.

so let us not confuse ourselves and fix it 😃

Description

  1. Rename this file to Playground.tsx
  2. Rename it also accordingly here and here

Support empty payload

Description

"payload" is not mandatory, therefore it can be empty or just left out completely.
However when you do this, the rendering will fail with an unclear error

Tested on https://playground.asyncapi.io/

Expected result

Render empty payload.

Actual result

Error (in case of the playground, example is "Cannot read property 'streetlights' of undefined")

Steps to reproduce

Remove payload from the a message in the streetlights example.

Troubleshooting

We work around it by using an empty object instead in these cases.

Websocket Subprotocol Support

Description

In one of our applications, we use STOMP over WebSockets. As we want to make use of AsyncAPI in order to document this API we stumbled upon the lack of "subprotocol" support.

What is the "subprotocol" regarding WebSockets? A WebSocket connection is simply a connection. It can be used to tunnel almost anything, starting with things like plain text messages but also video streaming or database connections. See IANA WebSocket Protocol for Subprotocols

AsyncAPI allows setting a server protocol and protocol version. The protocol may be ws|wss for WebSocket or stomp|stomps for STOMP (https://www.asyncapi.com/docs/specifications/2.0.0#serverObject). A combination is not possible yet.

For WebSockets, it would be good to have a subprotocol field which would contain the WebSocket subprotocol identifier. For STOMP 1.2 this would be v12.stomp (according to IANA WebSocket Protocol Registries). A separation of subprotocol and subprotocolVersion could be an alternative, but I think it would not help.

Reasons

Without any way to document protocol tunneling, I assume it is not possible to describe APIs using STOMP over WebSockets using AsyncAPI in a standardized manner. I would need to choose between either ws or stomp as protocol and describe in plain text that the other protocol is involved too.

Provide an Angular-Component

Description
For my company I integrate the Kafka API's into the Angular website. The goal is to be able to display and manage the APIs. I am currently integrating the React component into the existing Angular application.
I realized this with the contribution of Stackoverflow: https://stackoverflow.com/questions/47714221/using-react-component-library-in-an-angular-4-application. So the compatibility with Angular applications would be given.

Reason
Currently it is difficult to test or debug the React component. I can't derive errors well either. I think these bugs could be fixed if you offered an Angular component. Alternatively, web components are certainly possible. API management is not well known at the moment but I think that many developers will be happy if a component would be available.

[BUG] NextJS: SyntaxError: Cannot use import statement outside a module

Description

I'm trying to render the AsyncApi react component in a NextJS app, but it crashes, displaying the error above:
Maybe there is a problem of compatibility between CommonJS modules and ESModules

import AsyncApi from './containers/AsyncApi/AsyncApi';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at compileFunction (<anonymous>)
    at Module._compile (internal/modules/cjs/loader.js:895:18)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Module.require (internal/modules/cjs/loader.js:852:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at eval (webpack-internal:///@kyma-project/asyncapi-react:1:18)
    at Object.@kyma-project/asyncapi-react (/Users/ricardonakashima/Projetos/asyncapireact/.next/server/pages/index.js:150:1)
    at __webpack_require__ (/Users/naka/Projetos/asyncapireact/.next/server/pages/index.js:23:31)

Expected result

It should render the component

Steps to reproduce
you can easily reproduce the error by installing a simple next app:

  1. npx create-next-app
  2. installing the lib: npm install --save @kyma-project/asyncapi-react
  3. importing the component and rendering it in any page with any valid yml file.

Troubleshooting

I was able to compile the app by dynamically importing the component with ssr:false, but the component does not render.

import dynamic from 'next/dynamic'
const AsyncApiComponent = dynamic(() => import('@kyma-project/asyncapi-react'), { ssr:false})

Unhandled Rejection (SyntaxError) when no Servers defined

Description

when there is no defined servers section the parser breaks with the exception:

image

Expected result
as servers section is not required it should render correctly

Actual result

Steps to reproduce

Any document with NO servers section

Troubleshooting

Syntax highlight code in codeblocks

@davydog187 commented on Wed Mar 04 2020

Feature Request

Similar to Github style markdown, it would be awesome to be able to annotate code in markdown and have the generator make sure it highlighted it.

e.g.

```json
{
  "key": "value
}
```
```elxir
defmodule Hello do
  def world do
    IO.puts("hello")
  end
end
```

I'd love for this to show up syntax highlighted as it would in Github.

{
  "key": "value"
}
defmodule Hello do
  def world do
    IO.puts("hello")
  end
end

I haven't checked, but I assume that this project already uses prism.js or highlight.js, so it shouldn't be too hard to add, assuming that the markdown compiler supported it.

I'm definitely interested in helping build this feature, as well as #202


@davydog187 commented on Wed Mar 04 2020

Alright, confirmed that this project uses highlight.js

The JSON that's highlighted in the right sidebar highlights because its in highlight.js format

<code class="hljs json">

And as far as I can tell, the Markdown is generated using https://github.com/searKing/markdown2html-less which generates the above HTML from the markdown snippet:

<pre>
  <code class="language-json">{
    "key": "value"
  }
  </code>
</pre>
<pre>
<code class="language-elxir">
  defmodule Hello do
     def world do
       IO.puts("hello")
     end
  end
</code>
</pre>

So if we could tell the Markdown parser/compiler to convert to this format, theoretically this is straightforward. Right now it seems that asyncapi-generator uses the simplest Markdown 👉 HTML conversion possible.


@derberg commented on Thu Mar 05 2020

@davydog187 Hey man, thanks for reporting this issue. Awesome you are ready to work on it.
I hope you do not mind but I have some dummy questions so I can understand what is the scope of this issue. I will also state some clarifications:

Are you injecting some code samples in descriptions? Or this elixir sample is just a sample and has nothing to do with the spec?
Best would be if you could share some dummy asyncapi doc example and basing on this doc explain what you get and what you want to get.

Sorry for all those questions/clarifications from my side but I want to be sure we are both on the same page so I can help you


@davydog187 commented on Thu Mar 05 2020

Thank you for the reply @derberg!

We are using asyncapi at https://simplebet.io to describe our Kafka feed. To describe some of the semantics of our data, its useful to demonstrate how data might change from message to message. To call a few things out, in the introduction description we are using a few JSON examples. e.g.

asyncapi: 2.0.0
info:
  title: Example
  version: '0.0.9'
  description: |
     This is a description of our feed.
    
     ### Example One
     ```json
     {"key": "value"}
    ```

    yada yad

     ### Example Two
     ```json
     {"key": "value"}
    ```

@derberg commented on Thu Mar 05 2020

@davydog187 no worries man, happy yo help. Thanks a lot for these details. I think we soon should introduce a section "AsyncAPI in the wild" where we would for sure have to list you! 🚀

Good my questions were not that dumb after all 😄 you do have code snippets in there in descriptions.

If I would start working on this issue I would definitely try to extend https://github.com/asyncapi/generator-filters/blob/master/src/customFilters.js#L7-L15 filter as it is used all over the place whenever description must be rendered. Description content always goes through that filter like here https://github.com/asyncapi/html-template/blob/master/partials/introduction.html. Try to extend the filter, take a look at markdown-it docs, looks like it is possible to add highlighting https://github.com/markdown-it/markdown-it#syntax-highlighting. Also, if you find a better package that supports highlight.js much easier + CommonMark, feel free to suggest it.

I hope that helps, somehow


@davydog187 commented on Fri Mar 06 2020

I think it will. I'll try to take this on as soon as possible. I really appreciate you onboarding me into the project @derberg! I haven't written JS in over a year, so looking forward to dipping back in!


@github-actions[bot] commented on Wed May 13 2020

This issue has been automatically marked as stale because it has not had recent activity 😴
It will be closed in 30 days if no further activity occurs. To unstale this issue, add a comment with detailed explanation.
Thank you for your contributions ❤️

Add internal webpage anchors (or produce a guide to show users how to enable)

Description

The 0.3.0 component is a big improvement in usability. However, another feature that would significantly improve usability of this page as a primary documentation component for an API is the ability to directly link to a specific component on the page.

Reasons

While the collapsable nesting has solved some navigation problems, it would still be ideal for documentation external to the core API page one creates with this component to have access to direct linking to a specific message/object/etc. For example, consider an external word document with more details around an application's design. To avoid reproducing pieces of the API outside of a page generated with this component, one could directly link to part of the page instead.

If this is already possible, a tutorial would be great! My personal perspective is that if this is possible, it should be enabled by default.

Attachments

Title column is shown eventhough no title is given

Description

In the async component table a title column is display although nowhere a title was given.
image

Expected result

When the title column has no content, it should be hidden.

Actual result

An empty title column appears.

Component Fails to Render:

Description

Trying to render an incomplete document, the following error and backtrace occur in the console:

TypeError: clickedItem is undefined
Toggle.js:27
The above error occurred in the <Toggle> component:
    in Toggle (created by ErrorComponent)
    in section (created by ErrorComponent)
    in ErrorComponent (created by AsyncApiComponent)
    in AsyncApiComponent (at pages/index.tsx:31)
    in div (created by styled.div)
    in styled.div (at pages/index.tsx:30)
    in div (created by styled.div)
    in styled.div (at pages/index.tsx:29)
    in IndexPage (created by HotExportedIndexPage)
    in AppContainer (created by HotExportedIndexPage)
    in HotExportedIndexPage (created by PageRenderer)
    in PageRenderer (at query-result-store.js:86)
    in PageQueryStore (at root.js:56)
    in RouteHandler (at root.js:78)
    in div (created by FocusHandlerImpl)
    in FocusHandlerImpl (created by Context.Consumer)
    in FocusHandler (created by RouterImpl)
    in RouterImpl (created by Context.Consumer)
    in Location (created by Context.Consumer)
    in Router (created by EnsureResources)
    in ScrollContext (at root.js:69)
    in RouteUpdates (at root.js:68)
    in EnsureResources (at root.js:66)
    in LocationHandler (at root.js:124)
    in LocationProvider (created by Context.Consumer)
    in Location (at root.js:123)
    in Root (at root.js:132)
    in StaticQueryStore (at root.js:138)
    in _default (at app.js:94)

This is a Gatsby-based static rendering app.

Expected result

The error component will be rendered.

Actual result

See above.

Steps to reproduce

I am not 100% sure about it but it seems to occur during development when trying to render an error about an incomplete YAML definition:

channels:
  registry:
    subscribe:
      summary: Query information about an object
      operationId: getDeviceInformation

Troubleshooting

I did not yet investigate further apart from determining that it seems to relate to rendering an error related to an incomplete channel definition.

Support displaying enums

Description

When enums are used within the spec file, they are not displayed.
As we provide enums like following:
image

We would expected here enums to be shown like in the generator itself but rather get the following:
image

Reasons

We want to be able to see enums in the component

Attachments

Support missing fields/objects from spec 2.0.0

Description

At the moment we support a main part of spec in rendering, but there are also parts that we don't, like bindings, properties from schema (min, max, type etc) - https://github.com/asyncapi/asyncapi/blob/master/versions/next/asyncapi.md#properties, externalDocs, tags, correlationID etc.

AC:

  • support all missing fields/objects in rendering. With any question about design/styling, please contact with @fmvilas or our designers.

List:

  • properties from schema (min, max, type etc), - 6e2eeee,
  • bindings - #259
  • externalDocs - #327
  • tags - #327
  • correlationID - #327

Updated list (4 May 2021):

Intagrate Lerna changelog

Description

At this moment, we do not have a changelog for two releases: 0.1.0 and 0.1.1 and in addition, we do not have labels for the library and playground app and for other areas, so we must integrate lerna changelog with our repo for providing more information for releases.

AC:

  • add new labels for library, playground, documentation, community etc.
  • integrate Lerna changelog with out package.

Reasons

For providing more information for releases.

Attachments

Lerna changelog

Rewrite components to stateless components and use React hooks

Description

At the moment library and playground app have in the vast majority stateful components (created by class). In 16.8.0 version of React, the hooks feature will be made available.

AC:

  • rewrite components to stateless components,
  • if component has a state, please add state functionality by using React hooks.

Reasons

Willingness to improve speed of rendering and more readable code.

Attachements

Rename variable as it is already declared in the upper scope

Context

SonarCloud info:

Overriding or shadowing a variable declared in an outer scope can strongly impact the readability, and therefore the maintainability, of a piece of code. Further, it could lead maintainers to introduce bugs because they think they're using one variable but are really using another.

Description

Rename e to err or error as is is already declared here

[FEATURE REQUEST] Code-Samples for HTTP-Bindings

Reason/Context

Please try answering few of those questions

  • Why we need this improvement?
  • How will this change help?
  • What is the motivation?

As mentioned on Twitter it would be cool to generate Code-Samples depending on the bindings.

It would help developers to gain even more development speed when the examples are not only
the message-contents but full examples in their preffered environment/language.

E.g. if there is a http-Binding for an operation a curl or javascript example, maybe executeable, would be wonderful.

Description

Please try answering few of those questions

  • What changes have to be introduced?

-> the HTML-Output should respect the binding and useful examples should be generated.

  • Will this be a breaking change?

-> don't think so

  • How could it be implemented/designed?

-> i don't know, sorry :-)

Regex pattern not displayed behind the property type

Description

Regex pattern are not displayed in the description of the properties.

Expected result
Regex Pattern should be displayed behind the type of the property like it is in the generator. e.x.

image

Actual result

Regex pattern is ignored completely see:
image

Steps to reproduce

Use somewhere regex patterns in your spec file

Remove not needed undefined from the toKebabCase test

Context

This react component is written with TS. SonarCloud states:

Unlike in JavaScript, where every parameter can be omitted, in TypeScript you need to explicitly declare this in the function signature. Either you add ? in the parameter declaration and undefined will be automatically applied to this parameter. Or you add an initializer with a default value in the parameter declaration. In the latter case, when passing undefined for such parameter, default value will be applied as well. So it's better to avoid passing undefined value to an optional or default parameter because it creates more confusion than it brings clarity. Note, that this rule is only applied to the last arguments in function call.

Looking at the implementation you can see that we specify str argument with ?. Passing undefined explicitly in the test is redundant and removing it should keep tests pass.

Description

Just remove undefined from this test.
Test description, instead of should return empty string if input is undefined should say something like should return empty string if input is not provided

Support polymorphism

The following example is found in the chapter Composition and Inheritance (Polymorphism) of the specification.

Current behavior in the generated html: If Pet is used in a message payload, only the attributes of the Pet class are shown.

My desired behavior: A dropdown is shown next to the attribute petType. It has the entries Cat and Dog. Depending on the selection, additional attributes are shown.
This is the case in the OpenApi html generator ReDoc.

schemas:
  Pet:
    type: object
    discriminator: petType
    properties:
      name:
        type: string
      petType:
        type: string
    required:
    - name
    - petType
  Cat:  ## "Cat" will be used as the discriminator value
    description: A representation of a cat
    allOf:
    - $ref: '#/components/schemas/Pet'
    - type: object
      properties:
        huntingSkill:
          type: string
          description: The measured skill for hunting
          enum:
          - clueless
          - lazy
          - adventurous
          - aggressive
      required:
      - huntingSkill
  Dog:  ## "Dog" will be used as the discriminator value
    description: A representation of a dog
    allOf:
    - $ref: '#/components/schemas/Pet'
    - type: object
      properties:
        packSize:
          type: integer
          format: int32
          description: the size of the pack the dog is from
          minimum: 0
      required:
      - packSize

Add possibility to pass schema by url

Description

At the moment, we have only a possibility to pass AsyncApi specification by string (yaml) or by json. We good improvement would be add possibility to pass schema by url and then fetching content by our logic. Of course, we have a already this logic, but separate in playground app.

Perform simple proof of concept for using AsyncAPI 2.0 golang parser with WebAssembly with React

Description

  • Check how it would be supported in the asyncapi react component
  • Familiarize with Webassembly and provide honest opinion if this is a way to go
  • Give clear reason to use this approach or instead just writing JS based parser which is for sure much more expensive to provide

Links:

Reasons

We need to support parsing of the spec on client side to support UIs with no server side rendering

Rename CodeEditor component file to CodeEditorComponent

Context

SonarCloud info:

By convention, a file that exports only one class, function, or constant should be named for that class, function or constant. Anything else may confuse maintainers.

so let us not confuse ourselves and fix it 😃

Description

  1. Rename this file to CodeEditorComponent.tsx
  2. Rename it also accordingly here and here

Add other documentation engines and move playground to its own repo

Description

As we've discussed before, the playground in this project will become the editor for version 2.0.0. I'm already working on it and it's time to start adding HTML and Markdown engines, as well as code generation too very soon.

I was hacking the playground here but feels like we probably should be moving it to the https://github.com/asyncapi/editor repo and leave this repo just for the React component.

Reasons

Release cycles of the playground will have nothing to do with the React component alone anymore as we'll have more documentation engines and features not related to the React component.

What do you think?

Removing theme in the playground breaks application

Description

At the moment the Playground looks unstable because of:

  • the theme option errors
  • the changes in schema that are breaking yaml or are invalid with spec are not really reflected in the playground after hitting refresh button. There is no indicator in UI, just info in the console

Overall improvements:

  • Fixes in library or playground related to this bug should have unit tests
  • If new version needs to be released it should contain change log and should be properly marked in the github release section

Expected result

  • application still works and default style is applied to the component
  • errors in the UI are visible, best, realtime without refreshing
  • maybe we should have even a separate switcher button for switching between themes
  • maybe the custom style that is by default a part of the playground should become a default one (default style is what we see in official editor http://editor.asyncapi.org/)? What do you think @fmvilas ? should we maintain the default style as it is? or use only the one that is in the playground? I think that having both, styles implemented in the component and changeable with some prop is probably not a good idea as it will only increase the size of the component.

Actual result

white page with errors in browser console

Steps to reproduce

go to https://www.asyncapi.com/asyncapi-react/ and clear the custom theme and hit refresh

Configure CI for project

  • configure TravisCI or another CI bot:
    • contact Franz about choosing bot (all repos in AsyncApi organisation use TravisCI, but this bot may not be so far good for our needs)
    • try to create separate jobs for library and playground app (if you will choose TravisCI, read about matrix scripts config)
    • if you will have to write scripts for CI, write it 😄
    • please add all scripts or configuration files to the .ci directory on root dir of project or subdirectories: library or playground.
    • job for library will have to run tests and compiling from tsc to js,
    • job for library will have to run tests and build app,
    • make sure that job run on master will push new version of playground app to Github Pages.

Split project to Playground sandbox and library

  • split project to Playground sandbox and library,
  • prepare webpack configuration for library and Playground,
  • add more customisation in Playground app - possibility to pass theme, config, specification from Url and other features,
  • configure GithubPages for Playground app.

library crashes when invalid json schema

Description

when writing a document that is not valid the library crashes

Expected result
should not crash. should show an error indicating what's invalid or ignore the error

Actual result
image

Steps to reproduce

write the following example

asyncapi: '2.0.0'
id: 'urn:myapi'
info:
  title: My API
  version: '1.0.0'
channels:
  mychannel:
    publish:
      message:
        $ref: '#/components/messages/testMessage'

components:
  messages:
    testMessage:
      payload:
        $ref: '#/components/schemas/testSchema'
  schemas:
    testSchema:
      type: object
      properties:
        name:
          type: string
    order:
      type: object
      properties:
        name:
          type: string
    activity:
      type: o

the Activity type is invalid.

Troubleshooting

This is the validatedSchema returned from AsyncApi.tsx

const { validatedSchema, error } = this.state;

image

Error from Chrome console

Schema.js:47 Uncaught TypeError: Cannot create property 'description' on string 'o'
    at SchemaComponent (Schema.js:47)
    at renderWithHooks (react-dom.development.js:15821)
    at updateFunctionComponent (react-dom.development.js:17705)
    at beginWork$1 (react-dom.development.js:19371)
    at HTMLUnknownElement.callCallback (react-dom.development.js:363)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:412)
    at invokeGuardedCallback (react-dom.development.js:466)
    at beginWork$$1 (react-dom.development.js:24570)
    at performUnitOfWork (react-dom.development.js:23502)
    at workLoopSync (react-dom.development.js:23480)
    at renderRoot (react-dom.development.js:23155)
    at runRootCallback (react-dom.development.js:22809)
    at react-dom.development.js:11886
    at unstable_runWithPriority (scheduler.development.js:674)
    at runWithPriority$2 (react-dom.development.js:11834)
    at flushSyncCallbackQueueImpl (react-dom.development.js:11881)
    at flushSyncCallbackQueue (react-dom.development.js:11869)
    at scheduleUpdateOnFiber (react-dom.development.js:22667)
    at Object.enqueueSetState (react-dom.development.js:13710)
    at AsyncApiComponent.push../node_modules/react/cjs/react.development.js.Component.setState (react.development.js:324)
    at AsyncApiComponent.<anonymous> (AsyncApi.js:322)
    at step (AsyncApi.js:160)
    at Object.next (AsyncApi.js:91)
    at fulfilled (AsyncApi.js:43)
SchemaComponent @ Schema.js:47
renderWithHooks @ react-dom.development.js:15821
updateFunctionComponent @ react-dom.development.js:17705
beginWork$1 @ react-dom.development.js:19371
callCallback @ react-dom.development.js:363
invokeGuardedCallbackDev @ react-dom.development.js:412
invokeGuardedCallback @ react-dom.development.js:466
beginWork$$1 @ react-dom.development.js:24570
performUnitOfWork @ react-dom.development.js:23502
workLoopSync @ react-dom.development.js:23480
renderRoot @ react-dom.development.js:23155
runRootCallback @ react-dom.development.js:22809
(anonymous) @ react-dom.development.js:11886
unstable_runWithPriority @ scheduler.development.js:674
runWithPriority$2 @ react-dom.development.js:11834
flushSyncCallbackQueueImpl @ react-dom.development.js:11881
flushSyncCallbackQueue @ react-dom.development.js:11869
scheduleUpdateOnFiber @ react-dom.development.js:22667
enqueueSetState @ react-dom.development.js:13710
push../node_modules/react/cjs/react.development.js.Component.setState @ react.development.js:324
(anonymous) @ AsyncApi.js:322
step @ AsyncApi.js:160
(anonymous) @ AsyncApi.js:91
fulfilled @ AsyncApi.js:43
Promise.then (async)
step @ AsyncApi.js:60
(anonymous) @ AsyncApi.js:63
push.../../../dev/asyncapi/asyncapi-react/library/lib/containers/AsyncApi/AsyncApi.js.__awaiter @ AsyncApi.js:40
AsyncApiComponent.parseSchema @ AsyncApi.js:301
(anonymous) @ AsyncApi.js:228
step @ AsyncApi.js:160
(anonymous) @ AsyncApi.js:91
(anonymous) @ AsyncApi.js:63
push.../../../dev/asyncapi/asyncapi-react/library/lib/containers/AsyncApi/AsyncApi.js.__awaiter @ AsyncApi.js:40
AsyncApiComponent.componentDidUpdate @ AsyncApi.js:222
commitLifeCycles @ react-dom.development.js:21157
commitLayoutEffects @ react-dom.development.js:24138
callCallback @ react-dom.development.js:363
invokeGuardedCallbackDev @ react-dom.development.js:412
invokeGuardedCallback @ react-dom.development.js:466
commitRootImpl @ react-dom.development.js:23903
unstable_runWithPriority @ scheduler.development.js:674
runWithPriority$2 @ react-dom.development.js:11834
commitRoot @ react-dom.development.js:23723
runRootCallback @ react-dom.development.js:22809
(anonymous) @ react-dom.development.js:11886
unstable_runWithPriority @ scheduler.development.js:674
runWithPriority$2 @ react-dom.development.js:11834
flushSyncCallbackQueueImpl @ react-dom.development.js:11881
flushSyncCallbackQueue @ react-dom.development.js:11869
scheduleUpdateOnFiber @ react-dom.development.js:22667
dispatchAction @ react-dom.development.js:16542
updateSchema @ EditorPage.js:60
CodeEditorComponent.onChangeValue @ CodeEditor.tsx:48
(anonymous) @ index.js:695
(anonymous) @ codemirror.js:3168
fireCallbacksForOps @ codemirror.js:3107
finishOperation @ codemirror.js:3130
endOperation @ codemirror.js:5697
runInOp @ codemirror.js:5897
TextareaInput.poll @ codemirror.js:14182
(anonymous) @ codemirror.js:13899
Show 31 more frames
index.js:1375 The above error occurred in the <SchemaComponent> component:
    in SchemaComponent (created by SchemasComponent)
    in li (created by SchemasComponent)
    in ul (created by SchemasComponent)
    in div (created by Toggle)
    in div (created by Toggle)
    in Toggle (created by SchemasComponent)
    in section (created by SchemasComponent)
    in SchemasComponent (created by AsyncApiComponent)
    in section (created by AsyncApiComponent)
    in main (created by AsyncApiComponent)
    in useExpandedState.Provider (created by AsyncApiComponent)
    in AsyncApiComponent (at EditorPage.js:107)
    in div (created by Context.Consumer)
    in StyledComponent (created by styled.div)
    in styled.div (at EditorPage.js:106)
    in div (created by Context.Consumer)
    in StyledComponent (created by styled.div)
    in styled.div (at EditorPage.js:78)
    in div (created by Context.Consumer)
    in StyledComponent (created by styled.div)
    in styled.div (at EditorPage.js:76)
    in main (at TopMenuTemplate.js:24)
    in div (at TopMenuTemplate.js:22)
    in TopMenuTemplate (at EditorPage.js:75)
    in ApiEditor (at EditorPage.js:123)
    in Unknown (at EditorPage.js:140)
    in EditorPage (at App.js:54)
    in Route (at App.js:54)
    in Switch (at App.js:49)
    in Router (created by HashRouter)
    in HashRouter (at App.js:48)
    in MyApp (created by class_1)
    in class_1 (at src/index.js:13)
    in Router (created by BrowserRouter)
    in BrowserRouter (at src/index.js:12)

Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://fb.me/react-error-boundaries to learn more about error boundaries.
console.<computed> @ index.js:1375
r @ backend.js:1
logCapturedError @ react-dom.development.js:20888
logError @ react-dom.development.js:20924
update.callback @ react-dom.development.js:22134
callCallback @ react-dom.development.js:13541
commitUpdateEffects @ react-dom.development.js:13581
commitUpdateQueue @ react-dom.development.js:13571
commitLifeCycles @ react-dom.development.js:21199
commitLayoutEffects @ react-dom.development.js:24138
callCallback @ react-dom.development.js:363
invokeGuardedCallbackDev @ react-dom.development.js:412
invokeGuardedCallback @ react-dom.development.js:466
commitRootImpl @ react-dom.development.js:23903
unstable_runWithPriority @ scheduler.development.js:674
runWithPriority$2 @ react-dom.development.js:11834
commitRoot @ react-dom.development.js:23723
runRootCallback @ react-dom.development.js:22809
(anonymous) @ react-dom.development.js:11886
unstable_runWithPriority @ scheduler.development.js:674
runWithPriority$2 @ react-dom.development.js:11834
flushSyncCallbackQueueImpl @ react-dom.development.js:11881
flushSyncCallbackQueue @ react-dom.development.js:11869
scheduleUpdateOnFiber @ react-dom.development.js:22667
enqueueSetState @ react-dom.development.js:13710
push../node_modules/react/cjs/react.development.js.Component.setState @ react.development.js:324
(anonymous) @ AsyncApi.js:322
step @ AsyncApi.js:160
(anonymous) @ AsyncApi.js:91
fulfilled @ AsyncApi.js:43
Promise.then (async)
step @ AsyncApi.js:60
(anonymous) @ AsyncApi.js:63
push.../../../dev/asyncapi/asyncapi-react/library/lib/containers/AsyncApi/AsyncApi.js.__awaiter @ AsyncApi.js:40
AsyncApiComponent.parseSchema @ AsyncApi.js:301
(anonymous) @ AsyncApi.js:228
step @ AsyncApi.js:160
(anonymous) @ AsyncApi.js:91
(anonymous) @ AsyncApi.js:63
push.../../../dev/asyncapi/asyncapi-react/library/lib/containers/AsyncApi/AsyncApi.js.__awaiter @ AsyncApi.js:40
AsyncApiComponent.componentDidUpdate @ AsyncApi.js:222
commitLifeCycles @ react-dom.development.js:21157
commitLayoutEffects @ react-dom.development.js:24138
callCallback @ react-dom.development.js:363
invokeGuardedCallbackDev @ react-dom.development.js:412
invokeGuardedCallback @ react-dom.development.js:466
commitRootImpl @ react-dom.development.js:23903
unstable_runWithPriority @ scheduler.development.js:674
runWithPriority$2 @ react-dom.development.js:11834
commitRoot @ react-dom.development.js:23723
runRootCallback @ react-dom.development.js:22809
(anonymous) @ react-dom.development.js:11886
unstable_runWithPriority @ scheduler.development.js:674
runWithPriority$2 @ react-dom.development.js:11834
flushSyncCallbackQueueImpl @ react-dom.development.js:11881
flushSyncCallbackQueue @ react-dom.development.js:11869
scheduleUpdateOnFiber @ react-dom.development.js:22667
dispatchAction @ react-dom.development.js:16542
updateSchema @ EditorPage.js:60
CodeEditorComponent.onChangeValue @ CodeEditor.tsx:48
(anonymous) @ index.js:695
(anonymous) @ codemirror.js:3168
fireCallbacksForOps @ codemirror.js:3107
finishOperation @ codemirror.js:3130
endOperation @ codemirror.js:5697
runInOp @ codemirror.js:5897
TextareaInput.poll @ codemirror.js:14182
(anonymous) @ codemirror.js:13899
Show 37 more frames
Schema.js:47 Uncaught (in promise) TypeError: Cannot create property 'description' on string 'o'
    at SchemaComponent (Schema.js:47)
    at renderWithHooks (react-dom.development.js:15821)
    at updateFunctionComponent (react-dom.development.js:17705)
    at beginWork$1 (react-dom.development.js:19371)
    at HTMLUnknownElement.callCallback (react-dom.development.js:363)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:412)
    at invokeGuardedCallback (react-dom.development.js:466)
    at beginWork$$1 (react-dom.development.js:24570)
    at performUnitOfWork (react-dom.development.js:23502)
    at workLoopSync (react-dom.development.js:23480)
    at renderRoot (react-dom.development.js:23155)
    at runRootCallback (react-dom.development.js:22809)
    at react-dom.development.js:11886
    at unstable_runWithPriority (scheduler.development.js:674)
    at runWithPriority$2 (react-dom.development.js:11834)
    at flushSyncCallbackQueueImpl (react-dom.development.js:11881)
    at flushSyncCallbackQueue (react-dom.development.js:11869)
    at scheduleUpdateOnFiber (react-dom.development.js:22667)
    at Object.enqueueSetState (react-dom.development.js:13710)
    at AsyncApiComponent.push../node_modules/react/cjs/react.development.js.Component.setState (react.development.js:324)
    at AsyncApiComponent.<anonymous> (AsyncApi.js:322)
    at step (AsyncApi.js:160)
    at Object.next (AsyncApi.js:91)
    at fulfilled (AsyncApi.js:43)

Prepare basic documentation

Prepare basic documentation for AsyncAPi react component:

  • Readme.md file describing installation guide, features of this component and other basic content,
  • setup development environment,
  • how to use, run tests,
  • describe configuration of component, its config and theme props,
  • describe why we must write this component.

Cleanup GitHub Actions workflows

Context

  1. We want to make sure we have healthy community and people respec each other in GitHub. We want to monitor all comments in every repository and analyze sentiments to identify negative ones and get proper notification. Idea is to use GitHub Actions for it, to check sentiments with Google Natural Language API and post negative comments to Slack for review.

  2. We manage community files in global .github repo, and we have GitHub Funding config file there too. As a result we need to cleanup all the repos to remove .github/FUNDING.yml

  3. Start supporting new GitHub pull request event that allows gives access to GITHUB_TOKEN with write access. Fix welcome contributors workflow is needed.

  4. We want to automatically merge Pull Requests that are submitted by Dependanbot. New workflow needs to be added, or if already existins it needs to be modified

Description

  1. Add this workflow file called sentiment-analysis.yml to .github/workflows (create it if it doesn't exist yet) directory: https://gist.github.com/derberg/ab362e4b37f542e7e1813e67b7cb11ee
    Proper secrets are already added to GitHub organization so it is as simple as adding above file to workflows dir.
  2. Remove .github/FUNDING.yml if it exists
  3. If not done already rename pull_request from line 4 to pull_request_target in .github/workflows/welcome-first-time-contrib.yml file
  4. Create new file called automerge.yml with the following content: https://gist.github.com/derberg/024814a26959d54f683e7bd68d68f007
    If the repository already has a file called automerge-release-pr-bump.yml than rename it and adjust if statements to check github.actor == 'asyncapi-bot' || github.actor == 'dependabot[bot]' || github.actor == 'dependabot-preview[bot]' instead of github.actor == 'asyncapi-bot'

Usages of allOf within message payload could be flattened

Describe the bug

I'm not sure if this is a bug or not, but for me, allOf is rendered in an unexpected way when used in the message payload. Can you confirm if this is deliberate or not? If not, I'll look to fix.

How to Reproduce

asyncapi: 2.0.0
info:
  title: MQTT API
  version: '2.0.0'

defaultContentType: application/json

channels:
  /v2/abc/data/pack_data:
    description: Publish logging data from devices
    publish:
      operationId: publishPackData
      message:
        name: pack_data
        payload:
          $ref: "#/components/schemas/pack_data"

components:
  schemas:
    pack_data:
      allOf:
      - $ref: "#/components/schemas/common_payload"
      - type: object
        properties:
          cycle_id:
            type: string
    common_payload:
      type: object
      properties:
        device_id:
            type: string
        site_id:
            type: string

Screenshot 2020-04-23 at 13 47 24

Expected behavior

I'd expect the use of 'allOf' to be transparent in the documentation (ie as if everything had just been defined explicitly in-line).

ie
Screenshot 2020-04-23 at 13 50 28

additionalProperties: {} or false not supported properly

Description

As we use additionalProperties as follow: additonalProperties: false we get the following error message:

image

As we change this to additionalProperties: {} it doesn't throw any errors anymore but ignores the property completely and doesn't any indicator that additional properties aren't allowed.

Expected result

An indicator that like the generator for example like this:
image and "Additional properties are not allowed"

Actual result

Nothing. Completely ignores this properties

library crashes when writing properties for object

Description

When writing a document, specifically when adding new properties to an object, the library throws an error

Expected result

ignore properties when invalid

Actual result

image

Steps to reproduce

asyncapi: '2.0.0'
id: 'urn:myapi'
info:
  title: My API
  version: '1.0.0'
channels:
  mychannel:
    publish:
      message:
        $ref: '#/components/messages/testMessage'

components:
  messages:
    testMessage:
      payload:
        $ref: '#/components/schemas/testSchema'
  schemas:
    testSchema:
      type: object
      properties:
        name:
          type: string
    order:
      type: object
      properties:
        name:
          type: string
    activity:
      type: object
      properties:
        name:

Troubleshooting

This is the validatedSchema returned from AsyncApi.tsx

image

What is the recommended way to consume this component?

When consuming the component, I encountered a number of errors trying to build with webpack; and the resulting bundle size for my vendor bundle ended up at 4Mb (3.24Mb of this is webapi-parser).

Clearly I'm doing something wrong?

Here's how I did it:

  1. Install the dependencies:
npm i @kyma-project/asyncapi-react react react-dom
  1. Consume the component:
// app.tsx
import React from "react";
import { render } from "react-dom";
import AsyncApi, { ConfigInterface } from "@kyma-project/asyncapi-react";

const config: Partial<ConfigInterface> = {
  show: {
    schemas: false
  },
  showErrors: false
};

const schema = ` (omitted for brevity) `;

render(<AsyncApi schema={schema} config={config} />, document.getElementById("root"));
  1. Build with webpack (mode=production)

The first build error I encountered was:

ModuleNotFoundError: Module not found: Error: Can't resolve 'fs' in 'node_modules/webapi-parser'

...which I was able to suppress by adding the following to my webpack.config.js:

node: {
  fs: "empty"
},

The next error I encountered was:

ModuleNotFoundError: Module not found: Error: Can't resolve 'ajv/lib/refs/json-schema-v5.json' in 'node_modules/json-schema-migrate/lib'

It would seem that json-schema-migrate needs [email protected]; but one of the webpack plugins I use (mini-css-extract-plugin) needs [email protected] (which doesn't include the file json-schema-v5.json.

In my case, npm installed [email protected] in the node_modules folder inside json-schema-migrate, so I was able to suppress this error with a webpack alias:

resolve: {
  alias: {
    "ajv/lib/refs/json-schema-v5.json": "json-schema-migrate/node_modules/ajv/lib/refs/json-schema-v5.json"
  },

Similarly, markdown-it requires the file entities/maps/entities.json, but the file path (on my machine) is actually entities/lib/maps/entities.json, so another webpack alias fixes that:

ModuleNotFoundError: Module not found: Error: Can't resolve 'entities/maps/entities.json' in 'node_modules/markdown-it/lib/common'
resolve: {
  alias: {
    "ajv/lib/refs/json-schema-v5.json": "json-schema-migrate/node_modules/ajv/lib/refs/json-schema-v5.json",
    "entities/maps/entities.json": "entities/lib/maps/entities.json"
  },

With those errors fixed, I'm able to build successfully, but the size of the bundle is huge.

Here's what it looks like in source-map-explorer:

vendor-9dafdf_js_-_Source_Map_Explorer

Is this expected?

additionalProperties must be an object

Description

Dear all, I have a spec file which contains properties as follow -> additionalProperties: true . According to the documentation this is possible and allowed. However when I try to use the component where such a property is set within my spec file, I receive the following:

additionalProperties should be object

As soon as I change the value from a boolean to an empty object it works and the component is rendered as expected.

I use chrome 80.0.3987.149

Expected result

Component should rendered also with addtionalProperties: false

Actual result

Component throws an error with "additionalProperties should be object"

Steps to reproduce

use additionalProperties in your spec file

Manual examples do not work

Description

Manually provided examples of messages do not seem to be supported. Examples property of message:

https://www.asyncapi.com/docs/specifications/2.0.0/#a-name-messageobject-a-message-object

Expected result

Example should be presented

Actual result

Error: Invalid AsyncAPI document

.channels['user/signedup'].subscribe.message should have required property '$ref': $ref.channels['user/signedup'].subscribe.message should NOT have additional properties: description.channels['user/signedup'].subscribe.message should NOT have additional properties: examples.channels['user/signedup'].subscribe.message should NOT have additional properties: payload.channels['user/signedup'].subscribe.message should have required property 'oneOf': oneOf.channels['user/signedup'].subscribe.message.examples should be array.channels['user/signedup'].subscribe.message should match exactly one schema in oneOf: null.channels['user/signedup'].subscribe.message should match exactly one schema in oneOf: null

Steps to reproduce

asyncapi: '2.0.0'
info:
  title: Example
  version: 0.1.0
channels:
  user/signedup:
    subscribe:
      message:
        description: An event describing that a user just signed up.
        examples:
          example1:
            fullname: Mark
            email: [email protected]
            age: 18
        payload:
          type: object
          additionalProperties: false
          properties:
            fullName:
              type: string
            email:
              type: string
              format: email
            age:
              type: integer
              minimum: 18

Troubleshooting

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.