Giter VIP home page Giter VIP logo

fdmediagroep / fd-cypress-recorder Goto Github PK

View Code? Open in Web Editor NEW
25.0 7.0 9.0 8.5 MB

Browser plugin Fd Cypress Recorder captures user interactions and generates Cypress test code.

JavaScript 9.33% HTML 0.98% TypeScript 84.45% SCSS 5.24%
react typescript chrome-extension cypress-io end-to-end-testing react-beautiful-dnd fdmg fdmediagroep hetfinancieeledagblad css-modules scss-modules fd-cypress-recorder

fd-cypress-recorder's Introduction

DEPRECATED ❗ : Not compatible with Manifest V3 https://developer.chrome.com/docs/extensions/mv3/intro/

Build CodeQL All Contributors Coverage Status

Fd Cypress Recorder

Before you get started Note that since the inception of this project a lot of other projects with similar functionality has been created. One very promising project is Microsoft Playwright which now comes with a CLI-tool which allows you to spawn a browser process within which you can record your interactions and have it output Playwright scripts. I can highly recommend it. Playwright supports cross-browser testing on Mac, Windows and Linux. It is actively being developed and backed by one of the largest software companies out there with an amazing track-record in OSS. End Message

Fd Cypress Recorder is a minimal plugin which records user interactions with a website. The interactions are then converted to Cypress test code which you can copy and paste into a Cypress test. The plugin only automatically record click on anchors and buttons. If you want to do some custom actions, e.g. click on span, you can open up the context menu to record custom actions.

Installation

Via Chrome Web Store: https://chrome.google.com/webstore/detail/fd-cypress-recorder/amleackadkomdccpbfginhnecfhhognj

Via Edge Add-ons: https://microsoftedge.microsoft.com/addons/detail/fd-cypress-recorder/lpfepmjegidkfonehkgfgipioceoccmc

Or manually:

or

  • Compile the plugin yourself
    1. Clone this repository.
    2. npm i
    3. npm run webpack
    4. In your Chrome or Edge Chromium browser you can then load an unpacked extension using the fd-cypress-recorder folder.

Usage

  1. Open the website you want to test
  2. Click the Fd Cypress Recorder extension icon to open the popup
  3. Press Record and the scenario recording starts
    1. Make sure the website has focus
    2. Press ALT+c or alternatively CTRL+right mouse click to open up a context menu with extra test options
    3. Interact with your website
  4. Click the Fd Cypress Recorder extension icon to open the popup
  5. Click Stop to stop recording.
  6. Optional:
    1. Fill in the Test suite name and Description.
    2. You can now save these interactions as a template by pressing the + button
    3. Click Show events to see the recorded interactions in a list. Events
    4. You can remove or re-order the interactions as you see fit.
  7. Copy the code from the text area and paste it into a Cypress test file.
  8. Run the Cypress test.

Extension options

  1. Right-click the extension icon to open the browser context-menu.
  2. Click Extension options to open the options screen for the extension.

Prioritize attribute as unique selector

According to the best practices of Cypress.io one should have data-* attributes on elements. You can configure the Fd Cypress Recorder extension to prioritize attributes as unique DOM Selector to accomodate this best practice. This is turned off by default so you need to go to the Extension options to turn this option on. Templates

Templates

Fd Cypress Recorder has the option to save your current interactions as a template. The philosophy behind this is to provide the user the ability to start recording from a certain point. For instance when you want to record various scenarios for which the user needs to be logged in then you can record all actions necessary to log in and save these interactions as template. The next time you can decide to go to the page which comes after login and load the saved template and continue from there. Alternatively you can also decide to navigate to a whole different page and load the template. You can open the Context Menu and use the Visit current url option to record this navigation step. Templates

Load templates

Click on the name of the template to load it. This action will overwrite your current interactions if you have any.

Append templates

Click on the [+] button next to the template name to load and append the template interactions to your current existing interactions. This is useful if you have created your templates as small building blocks which can succeed each other. I.e. cookiewall accept + login + click article. This allows greater flexibility when it comes to rewriting templates. If for instance your cookiewall has changed and the test needs to be rewritten you now only have to change that particular template and you can then join all other relevant templates together quickly to replace the failing test.

Remove template

Click on the [x] button next to the template name to delete the template completely. This action can not be undone.

Context Menu

Functionality provided by the context menu, records the corresponding interactions. Context Menu

Click

Dispatches the click event to the element. Use this function on elements other than a or button which has a custom click interaction. Note: a and button already have click handlers so this menu-item would cause a double interaction entry. You can easily remove the double interaction through the plugin popup Show events view.

Enter text

This allows you to enter text into text fields. The field must have focus in order for this to work correctly.

Hover

Triggers the mouse hover interaction.

Wait

This allows you to wait a number of milliseconds before the next event triggers in the test.

Attributes...

Opens another context menu with extra options to assert the HTML attributes on the hovered element. All attributes existing on the hovered element are shown in the following context menu. And each attribute gives you the following options:

  1. Contains: Check if attribute contains given text.
  2. Equals: Check if attribute value equals current value.
  3. Exists: Check if attribute exists

Contains text

Checks if the hovered element contains given text.

Count...

Counts the recurrence of the currently hovered element type within it's parent. Note: it can often be difficult to select the correct container element.

  1. Equals(n): Check that element of type within parent equals this number.
  2. Equals...: Check that element of type within parent equals given number.
  3. Greater...: Check that element of type within parent is greater than given number.
  4. Less...: Check that element of type within parent is less than given number.

Exists

Checks if hovered element exists.

Match current URL

Uses the current URL as value to create a check if the current URL is the same. This is useful when you have recorded multiple interactions and some interactions causes you to navigate to another URL. You can use this option to check if you have landed on the expected URL.

URL contains

Check if current URL contains given text. This is useful if you want to check if after a series of interactions the URL contains a certain text. You'll use this functionality instead of Match current URL in the event the URL contains dynamic portions which are unpredictable. With this functionality you can assert the static portion of the URL.

Visit current URL

Use this function if you want to navigate to a certain URL not caused by another interaction like a click on an anchor or via submitting a form.

Fork for other Testing frameworks

This plugin is mainly a recorder. The literal code generation is handled in Dictionary.ts. If you think the recording functionality and interface is useful and want to re-use it for the purpose of generating code for other Testing frameworks then you only need to modify Dictionary.ts for it.

In short: Fork this repository and modify Dictionary.ts to return the corresponding code for the testing framework of your choice add a backlink in README.md crediting this repository and you're done.

Disclaimer

As with all extensions, Fd Cypress Recorder has an impact on the user-experience while using your browser. And also because of its ability to listen for keyboard and mouse interactions it is recommended that you disable this plugin when you're not making use of it.

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Willem Liu

💻 📖 💡 🚧

Willem Liu

💻 📖 💡 🚧

Robert Schadek

💻 👀

Greenkeeper

💻

Átila Camurça Alves

💻

adelin-b

🤔

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

fd-cypress-recorder's People

Contributors

allcontributors[bot] avatar burner avatar dependabot[bot] avatar greenkeeper[bot] avatar snyk-bot avatar willemliu avatar willemliufdmg 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

fd-cypress-recorder's Issues

An in-range update of @types/react-table is breaking the build 🚨

The devDependency @types/react-table was updated from 6.8.2 to 6.8.3.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@types/react-table is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build failed (Details).
  • Travis CI - Branch: The build failed.

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of @types/react is breaking the build 🚨

The devDependency @types/react was updated from 16.9.22 to 16.9.23.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@types/react is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • coverage/coveralls: First build on greenkeeper/@types/react-16.9.23 at 74.322% (Details).
  • Travis CI - Branch: The build failed.

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of styled-components is breaking the build 🚨

The dependency styled-components was updated from 4.3.2 to 4.4.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

styled-components is a direct dependency of this project, and it is very likely causing it to break. If other packages depend on yours, this update is probably also breaking those in turn.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build failed (Details).
  • Travis CI - Branch: The build failed.

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

cy.get use id if available

IMHO it would make tests less brittle if cy.get would use element ids where available.

accesses such as

    cy.get(':nth-child(1) > :nth-child(1) > :nth-child(1) > div > input').type('[email protected]');

might fail easily when layout changes.

    cy.get('#emailInput').type('[email protected]');

might be better

An in-range update of @fdmg/fd-inputs is breaking the build 🚨

The dependency @fdmg/fd-inputs was updated from 2.0.2 to 2.0.3.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@fdmg/fd-inputs is a direct dependency of this project, and it is very likely causing it to break. If other packages depend on yours, this update is probably also breaking those in turn.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build failed (Details).
  • Travis CI - Branch: The build failed.

Commits

The new version differs by 17 commits.

  • 84e9999 Removed border-radius for .radio class
  • 1c5b292 Merge pull request #36 from FDMediagroep/greenkeeper/webpack-4.39.2
  • d3cf2ae chore(package): update lockfile package-lock.json
  • 51448b0 chore(package): update webpack to version 4.39.2
  • 54a30af Merge pull request #35 from FDMediagroep/greenkeeper/webpack-4.39.1
  • b9d3deb chore(package): update lockfile package-lock.json
  • 18412e6 chore(package): update webpack to version 4.39.1
  • 14e6441 Merge pull request #34 from FDMediagroep/greenkeeper/webpack-4.39.0
  • 836f648 chore(package): update lockfile package-lock.json
  • 6b91b3c chore(package): update webpack to version 4.39.0
  • 4a4185e Merge pull request #33 from FDMediagroep/greenkeeper/webpack-4.38.0
  • 840fd0b chore(package): update lockfile package-lock.json
  • 4407a99 chore(package): update webpack to version 4.38.0
  • 485960b Merge pull request #32 from FDMediagroep/greenkeeper/webpack-4.37.0
  • b4ac2dc chore(package): update lockfile package-lock.json

There are 17 commits in total.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of webpack is breaking the build 🚨

The devDependency webpack was updated from 4.35.3 to 4.36.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

webpack is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build could not complete due to an error (Details).
  • Travis CI - Branch: The build errored.

Release Notes for v4.36.0

Features

  • SourceMapDevToolPlugin append option now supports the default placeholders in addition to [url]
  • Arrays in resolve and parser options (Rule and Loader API) support backreferences with "..." when overriding options.
Commits

The new version differs by 42 commits.

  • 95d21bb 4.36.0
  • aa1216c Merge pull request #9422 from webpack/feature/dot-dot-dot-merge
  • b3ec775 improve merging of resolve and parsing options
  • 53a5ae2 Merge pull request #9419 from vankop/remove-valid-jsdoc-rule
  • ab75240 Merge pull request #9413 from webpack/dependabot/npm_and_yarn/ajv-6.10.2
  • 0bdabf4 Merge pull request #9418 from webpack/dependabot/npm_and_yarn/eslint-plugin-jsdoc-15.5.2
  • f207cdc remove valid jsdoc rule in favour of eslint-plugin-jsdoc
  • 31333a6 chore(deps-dev): bump eslint-plugin-jsdoc from 15.3.9 to 15.5.2
  • 036adf0 Merge pull request #9417 from webpack/dependabot/npm_and_yarn/eslint-plugin-jest-22.8.0
  • 37d4480 Merge pull request #9411 from webpack/dependabot/npm_and_yarn/simple-git-1.121.0
  • ce2a183 chore(deps-dev): bump eslint-plugin-jest from 22.7.2 to 22.8.0
  • 0beeb7e Merge pull request #9391 from vankop/create-hash-typescript
  • bf1a24a #9391 resolve super call discussion
  • bd7d95b #9391 resolve discussions, AbstractMethodError
  • 4190638 chore(deps): bump ajv from 6.10.1 to 6.10.2

There are 42 commits in total.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of react is breaking the build 🚨

There have been updates to the react monorepo:

    • The dependency react was updated from 16.12.0 to 16.13.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

This monorepo update includes releases of one or more dependencies which all belong to the react group definition.

react is a direct dependency of this project, and it is very likely causing it to break. If other packages depend on yours, this update is probably also breaking those in turn.

Status Details
  • coverage/coveralls: Coverage remained the same at 74.322% (Details).
  • Travis CI - Branch: The build failed.

Release Notes for 16.13.0 (February 26, 2020)

React

  • Warn when a string ref is used in a manner that's not amenable to a future codemod (@lunaruan in #17864)
  • Deprecate React.createFactory() (@trueadm in #17878)

React DOM

Concurrent Mode (Experimental)

Artifacts

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of @typescript-eslint/eslint-plugin is breaking the build 🚨

The devDependency @typescript-eslint/eslint-plugin was updated from 2.19.2 to 2.20.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@typescript-eslint/eslint-plugin is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • coverage/coveralls: Coverage remained the same at 76.48% (Details).
  • Travis CI - Branch: The build failed.

Release Notes for v2.20.0

2.20.0 (2020-02-17)

Features

  • eslint-plugin: [ban-types] allow banning null and undefined (#821) (0b2b887)
  • eslint-plugin: [strict-boolean-expressions] refactor, add clearer error messages (#1480) (db4b530)
Commits

The new version differs by 3 commits.

  • f9dd7ec chore: publish v2.20.0
  • db4b530 feat(eslint-plugin): [strict-boolean-expressions] refactor, add clearer error messages (#1480)
  • 0b2b887 feat(eslint-plugin): [ban-types] allow banning null and undefined (#821)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of @typescript-eslint/eslint-plugin is breaking the build 🚨

The devDependency @typescript-eslint/eslint-plugin was updated from 2.9.0 to 2.10.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@typescript-eslint/eslint-plugin is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • coverage/coveralls: Coverage remained the same at 76.403% (Details).
  • Travis CI - Branch: The build failed.

Release Notes for v2.10.0

2.10.0 (2019-12-02)

Bug Fixes

  • eslint-plugin: [no-empty-function] add missed node types (#1271) (e9d44f5)
  • eslint-plugin: [no-untyped-pub-sig] ignore set return (#1264) (6daff10)
  • eslint-plugin: [no-unused-expressions] ignore directives (#1285) (ce4c803)
  • eslint-plugin: [prefer-optional-chain] allow $ in identifiers (c72c3c1)
  • eslint-plugin: [prefer-optional-chain] handle more cases (#1261) (57ddba3)
  • eslint-plugin: [return-await] allow Any and Unknown (#1270) (ebf5e0a)
  • eslint-plugin: [strict-bool-expr] allow nullish coalescing (#1275) (3b39340)
  • typescript-estree: make FunctionDeclaration.body non-null (#1288) (dc73510)

Features

  • eslint-plugin: [no-empty-func] private/protected construct (#1267) (3b931ac)
  • eslint-plugin: [no-non-null-assert] add suggestion fixer (#1260) (e350a21)
  • eslint-plugin: [no-unnec-cond] support nullish coalescing (#1148) (96ef1e7)
  • eslint-plugin: [prefer-null-coal] opt for suggestion fixer (#1272) (f84eb96)
  • experimental-utils: add isSpaceBetween declaration to Sou… (#1268) (f83f04b)
Commits

The new version differs by 16 commits.

  • 5adb8a2 chore: publish v2.10.0
  • 065393b docs(eslint-plugin): typo in the configs README (#1295)
  • 96ef1e7 feat(eslint-plugin): [no-unnec-cond] support nullish coalescing (#1148)
  • e350a21 feat(eslint-plugin): [no-non-null-assert] add suggestion fixer (#1260)
  • ce4c803 fix(eslint-plugin): [no-unused-expressions] ignore directives (#1285)
  • f84eb96 feat(eslint-plugin): [prefer-null-coal] opt for suggestion fixer (#1272)
  • dc73510 fix(typescript-estree): make FunctionDeclaration.body non-null (#1288)
  • 3b39340 fix(eslint-plugin): [strict-bool-expr] allow nullish coalescing (#1275)
  • ebf5e0a fix(eslint-plugin): [return-await] allow Any and Unknown (#1270)
  • e9d44f5 fix(eslint-plugin): [no-empty-function] add missed node types (#1271)
  • 3b931ac feat(eslint-plugin): [no-empty-func] private/protected construct (#1267)
  • c72c3c1 fix(eslint-plugin): [prefer-optional-chain] allow $ in identifiers
  • f83f04b feat(experimental-utils): add isSpaceBetween declaration to Sou… (#1268)
  • 57ddba3 fix(eslint-plugin): [prefer-optional-chain] handle more cases (#1261)
  • 6daff10 fix(eslint-plugin): [no-untyped-pub-sig] ignore set return (#1264)

There are 16 commits in total.

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of styled-components is breaking the build 🚨

The dependency styled-components was updated from 4.2.0 to 4.2.1.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

styled-components is a direct dependency of this project, and it is very likely causing it to break. If other packages depend on yours, this update is probably also breaking those in turn.

Status Details
  • continuous-integration/travis-ci/push: The Travis CI build could not complete due to an error (Details).
  • Travis CI - Branch: The build errored.

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

An in-range update of @typescript-eslint/parser is breaking the build 🚨

The devDependency @typescript-eslint/parser was updated from 2.20.0 to 2.21.0.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@typescript-eslint/parser is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details
  • coverage/coveralls: Coverage remained the same at 74.322% (Details).
  • Travis CI - Branch: The build failed.

Release Notes for v2.21.0

2.21.0 (2020-02-24)

Bug Fixes

  • eslint-plugin: [embt] ignore JSX callbacks (#1630) (4d45b33)
  • eslint-plugin: [no-floating-promises] handle finally callback (#1620) (1aa7135)
  • eslint-plugin: [typedef] allow array/object destructuring in for/of (#1570) (660bace)
  • typescript-estree: process.stdout can be undefined (#1619) (0d8e87e)

Features

  • eslint-plugin: [require-await] add --fix support (#1561) (9edd863)
Commits

The new version differs by 9 commits.

  • 4eedd7f chore: publish v2.21.0
  • 4d45b33 fix(eslint-plugin): [embt] ignore JSX callbacks (#1630)
  • e23e4b9 docs(eslint-plugin): [no-parameter-properties] fix a typo (#1633)
  • be3e23f docs(eslint-plugin): added missing TSLint 5.20 rules to ROADMAP.md (#1609)
  • 9edd863 feat(eslint-plugin): [require-await] add --fix support (#1561)
  • 1aa7135 fix(eslint-plugin): [no-floating-promises] handle finally callback (#1620)
  • 660bace fix(eslint-plugin): [typedef] allow array/object destructuring in for/of (#1570)
  • 0d8e87e fix(typescript-estree): process.stdout can be undefined (#1619)
  • 7452e7d docs(eslint-plugin): update link to deprecation rule in roadmap (#1611)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

Doesn't work on Mac

The extension is not record anything with a mac or bring up the context menu options, since that involves using "Alt C".

An in-range update of @typescript-eslint/parser is breaking the build 🚨

The devDependency @typescript-eslint/parser was updated from 2.19.0 to 2.19.1.

🚨 View failing branch.

This version is covered by your current version range and after updating it in your project the build failed.

@typescript-eslint/parser is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

Status Details

Release Notes for v2.19.1

2.19.1 (2020-02-10)

Bug Fixes

  • eslint-plugin: [unbound-method] blacklist a few unbound natives (#1562) (4670aab)
  • typescript-estree: ts returning wrong file with project references (#1575) (4c12dac)
Commits

The new version differs by 5 commits.

  • 1c8f0df chore: publish v2.19.1
  • 4c12dac fix(typescript-estree): ts returning wrong file with project references (#1575)
  • e9cf734 docs(eslint-plugin): fix typo in readme
  • 10d86b1 docs(eslint-plugin): [no-dupe-class-members] fix typo (#1566)
  • 4670aab fix(eslint-plugin): [unbound-method] blacklist a few unbound natives (#1562)

See the full diff

FAQ and help

There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


Your Greenkeeper Bot 🌴

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.