Giter VIP home page Giter VIP logo

reselector's Introduction

reselector

Travis branch Coverage Status branch npm version npm license Greenkeeper badge

Installation

npm install --save-dev reselector

Usage

You can use it as a babel-plugin or as the runtime function, or both.

babel-plugin

Add reselector to the plugin list in .babelrc for your client code. For example:

{
    presets: ['react'],
    env: {
        test: {
            plugins: [
                'reselector/babel',
            ],
        },
    },
}

Find Components in the DOM

Use select function to build any css selector by React Components.

Just a simple example with jest

import React from 'react'
import {render} from 'react-dom'
import {select} from 'reselector'

const Text = ({children}) => <p>{children}</p>

const Button = ({children}) => (
  <button>
    <Text>{children}</Text>
  </button>
)

describe('Button', () => {
  beforeEach(() => document.body.innerHTML = '<div id="app" />')

  it('should render a text', () => {
    const text = 'hello world!'
    render(<Button>{text}</Button>, window.app)

    const node = document.querySelector(select`${Button} > ${Text}`)
    expect(node.textContent).toBe(text)
  })
})

enzyme

It also works with libraries like enzyme out of the box.

import {render} from 'enzyme'

import Button from './Button'
import Text from './Text'

describe('Button', () => {
  it('should render a text', () => {
    const text = 'hello world!'
    const wrapper = render(<Button>{text}</Button>)

    expect(wrapper.find(select`${Button} > ${Text}`).text()).toBe(text)
  })
})

Babel

If you have a chanัe to transpile components with this plugin for your unit tests/autotests, you can import React Component as is.

import {select} from 'reselector'

import MyComponent from './MyComponent'
import MyButton from './MyButton'

/**
 * [data-tid="dadad"] [data-tid="czczx"]
 */
console.log(select`${MyComponent} ${MyButton}`)

/**
 * .myClassName > [data-tid="czczx"]
 */
console.log(select`.myClassName > ${MyButton}`)

Runtime (just node.js, without babel)

It may be useful for autotests (for example, with PageObjects) when you don't need to transpile code. Just use resolve or resolveBy functions to get Components' selector.

const {resolve, select} = require('reselector')

const {MyComponent} = resolve(require.resolve('./MyComponent'))
const {MyButton} = resolve(require.resolve('./MyButton'))

/**
 * [data-tid="dadad"] [data-tid="czczx"]
 */
console.log(select`${MyComponent} ${MyButton}`)

/**
 * .myClassName > [data-tid="czczx"]
 */
console.log(select`.myClassName > ${MyButton}`)

With resolveBy:

const {resolveBy, select} = require('reselector')

const resolve = resolveBy(require.resolve)

const {MyComponent} = resolve('./MyComponent')
const {MyButton} = resolve('./MyButton')

/**
 * [data-tid="dadad"] [data-tid="czczx"]
 */
console.log(select`${MyComponent} ${MyButton}`)

/**
 * .myClassName > [data-tid="czczx"]
 */
console.log(select`.myClassName > ${MyButton}`)

How it works

This plugin tries to find all React Component declarations and to add data-{hash} attribute with the uniq hash-id to the Component's root node. It also saves this hash as the static property for the Component, so get function uses this property to build a selector.

Configuration

You can provide some options via reselector.config.js, rc-files or in package.json.

name

{string = 'data-tid'} Test-attribute name, should not be empty.

You can define your own attribute name, for example

module.exports = {name: 'my-test-id'}

With that, you'll get attributes on nodes like <button my-test-id="c7b7156f" />.

env

{boolean = false} Just set it on true to control attributes appending by process.env.RESELECTOR. So it will no append hashes at runtime when process.env.RESELECTOR !== 'true'.

For example:

module.exports = {env: true}

envName

{string = process.env.BABEL_ENV || process.env.NODE_ENV || 'development'}

syntaxes

{string[]} By default, this plugin works with these syntax list:

@babel/plugin-syntax-async-generators
@babel/plugin-syntax-class-properties
@babel/plugin-syntax-decorators
@babel/plugin-syntax-dynamic-import
@babel/plugin-syntax-export-default-from
@babel/plugin-syntax-export-namespace-from
@babel/plugin-syntax-flow
@babel/plugin-syntax-function-bind
@babel/plugin-syntax-import-meta
@babel/plugin-syntax-jsx
@babel/plugin-syntax-nullish-coalescing-operator
@babel/plugin-syntax-numeric-separator
@babel/plugin-syntax-object-rest-spread
@babel/plugin-syntax-optional-catch-binding
@babel/plugin-syntax-optional-chaining
@babel/plugin-syntax-pipeline-operator
@babel/plugin-syntax-throw-expressions

But you can declare your own syntax list, for example:

// .reselectorrc.js

module.exports = {
  syntaxes: [
    '@babel/plugin-syntax-async-generators',
    '@babel/plugin-syntax-class-properties',
    '@babel/plugin-syntax-decorators',
    '@babel/plugin-syntax-dynamic-import',
    '@babel/plugin-syntax-export-default-from',
    '@babel/plugin-syntax-export-namespace-from',
    '@babel/plugin-syntax-flow',
    '@babel/plugin-syntax-function-bind',
    '@babel/plugin-syntax-import-meta',
    '@babel/plugin-syntax-jsx',
    '@babel/plugin-syntax-nullish-coalescing-operator',
    '@babel/plugin-syntax-numeric-separator',
    '@babel/plugin-syntax-object-rest-spread',
    '@babel/plugin-syntax-optional-catch-binding',
    '@babel/plugin-syntax-optional-chaining',
    '@babel/plugin-syntax-pipeline-operator',
    '@babel/plugin-syntax-throw-expressions',
  ],
}

###Custom configuration You also can change base configuration in your .reselectorrc.js. Example:

// .reselectorrc.js

module.exports = function configurate(baseConfig) {
    const tsxSyntax = [
      '@babel/plugin-syntax-typescrypt',
      {
        isTSX: true
      }
    ]

    return Object.assign(baseConfig, {
      syntaxes: baseConfig.syntaxes.concat([tsxSyntax])
    })
}

reselector's People

Contributors

alisa007 avatar antonk52 avatar dependabot[bot] avatar greenkeeper[bot] avatar leonidlebedev avatar lttb avatar makary-s avatar nickshevr 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

reselector's Issues

An in-range update of coveralls is breaking the build ๐Ÿšจ


โ˜๏ธ Important announcement: Greenkeeper will be saying goodbye ๐Ÿ‘‹ and passing the torch to Snyk on June 3rd, 2020! Find out how to migrate to Snyk and more at greenkeeper.io


The devDependency coveralls was updated from 3.0.9 to 3.0.10.

๐Ÿšจ View failing branch.

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

coveralls 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).

Release Notes for CodeFresh support, Maintenance

Added:

  • CodeFresh support (@suda)

Improved:

Updated:

Commits

The new version differs by 6 commits.

  • 2ea7be3 bump version
  • 5e976c5 Only coverage report on test success, fixes #230
  • 3d83b4f Set service_name and/or repo_token from .coveralls.yml regardless of if $COVERALLS_REPO_TOKEN is set (#272)
  • 710c504 Add Codefresh support
  • 8c4ba99 CI: switch to actions/checkout@v2
  • eb1a3c9 278 Upgrades minimist dependency to 1.2.5

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 ๐ŸŒด

Resolve children

It will be quiet handy to have the ability to resolve nested components right from a parent's component path, so you don't have to search and specify them manually.
Like so:

const {LinkForm} = resolve('components/LinkForm');
const {
    Checkbox,
    Input
} = resolveChildren('components/LinkForm', 'Checkbox', 'Input');

Component with custom DOM node

If we make component like this:

type IProps = {
    tag: 'div' | 'h1' | ...
}

export function Component({
    children,
    tag: Wrapper = 'div',
}: IProps) {
    return (
        <Wrapper>
            {children}
        </Wrapper>
    );
}

And then try to grep it using helper select, we don't find it, because helper search by [data-tid=""] but attribute on our node is [data-tid-prop=]

Use Component's hash if it was used as a root

Let's say we've got Component like

const SuperText = () => (
    <Text>
        my super text
    </Text>
)

So reselector will add data-hash to the root component Text, and if it doesn't pass rest props to the DOM node, it will be applied only the one data-hash, generated just for the Text.

And for now you can find SuperText only by select`.smth ${Text}`.

The solution is to use Text's data-hash for the root node, and we can use select`.smth ${SuperText}` then

Keep component's name with default export

If we consider the component like this:

export default class MyComponent extends React.Component {
  // ...
}

reselector will resolve just {default: 'hash'}

it should be also handy to resolve the component's name: {default: 'hash', MyComponent: 'hash'}

An in-range update of core-js is breaking the build ๐Ÿšจ

The dependency core-js was updated from 3.2.0 to 3.2.1.

๐Ÿšจ View failing branch.

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

core-js 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).

Release Notes for 3.2.1 - 2019.08.12
  • Added a workaround for possible recursion in microtasks caused by conflicts with other Promise polyfills, #615
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 monorepoundefined

๐Ÿšจ 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 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).

Release Notes for v16.5.1

16.5.1 (September 13, 2018)

React

  • Improve the warning when React.forwardRef receives an unexpected number of arguments. (@andresroberto in #13636)

React DOM

  • Fix a regression in unstable exports used by React Native Web. (@aweary in #13598)
  • Fix a crash when component defines a method called isReactComponent. (@gaearon in #13608)
  • Fix a crash in development mode in IE9 when printing a warning. (@link-alex in #13620)
  • Provide a better error message when running react-dom/profiling with schedule/tracking. (@bvaughn in #13605)
  • If a ForwardRef component defines a displayName, use it in warnings. (@probablyup in #13615)

Schedule (Experimental)

  • Add a separate profiling entry point at schedule/tracking-profiling. (@bvaughn in #13605)
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 enzyme-to-json is breaking the build ๐Ÿšจ


๐Ÿšจ Reminder! Less than one month left to migrate your repositories over to Snyk before Greenkeeper says goodbye on June 3rd! ๐Ÿ’œ ๐Ÿšš๐Ÿ’จ ๐Ÿ’š

Find out how to migrate to Snyk at greenkeeper.io


The devDependency enzyme-to-json was updated from 3.4.4 to 3.5.0.

๐Ÿšจ View failing branch.

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

enzyme-to-json 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).

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 babel-eslint is breaking the build ๐Ÿšจ

The devDependency babel-eslint was updated from 10.0.3 to 10.1.0.

๐Ÿšจ View failing branch.

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

babel-eslint 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).

Commits

The new version differs by 2 commits.

  • 4bd049e 10.1.0
  • 2c754a8 Update Babel to ^7.7.0 and enable Flow enums parsing (#812)

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 copyfiles is breaking the build ๐Ÿšจ


๐Ÿšจ Reminder! Less than one month left to migrate your repositories over to Snyk before Greenkeeper says goodbye on June 3rd! ๐Ÿ’œ ๐Ÿšš๐Ÿ’จ ๐Ÿ’š

Find out how to migrate to Snyk at greenkeeper.io


The devDependency copyfiles was updated from 2.2.0 to 2.3.0.

๐Ÿšจ View failing branch.

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

copyfiles 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).

Commits

The new version differs by 3 commits.

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 ๐ŸŒด

Different (and nonexistent) testId hash for default exported component

export default class Abc extends Component {}
...
const {default: AbcSelector} = resolve('...')

gives me the different testId compared with

class Abc extends Component {}
export default Abc
...
const {Abc: AbcSelector} = resolve('...') 

In first case testId-attribute not presented in the DOM, second case works correctly

require is unavailable in ESM

Hi!
I try to use reselector with esm. But at this moment reselector works only with commonjs environment. So require is unavailable inside esm modules. I think that logic for resolving full names of the file should be incapsulated inside of the reselector itself. What do you think?

An in-range update of rimraf is breaking the build ๐Ÿšจ

The devDependency rimraf was updated from 2.6.3 to 2.7.0.

๐Ÿšจ View failing branch.

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

rimraf 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).

Commits

The new version differs by 2 commits.

  • 250ee15 2.7.0
  • dc1682d feat: make it possible to omit glob dependency

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 ๐ŸŒด

wdio e2e tests, TID generation logic

Hi @lttb,
thanks for this great library, we are perfectly using it in our unit tests but I need your help with the following issue:

We have a monorepo project with webdriverio e2e tests, and we cannot use this selectors in our e2e tests because they generate different hashes for the components, how we can improve to generate same hashes independently of cwd, because for example react-app is started from /project/web/ and e2e is started from /e2e/web/

I have tried changing parentPath from utils.js with env variable:

const projectPath = process.env.RESELECTOR_PATH === undefined ? process.cwd().toLowerCase() : path.resolve(process.env.RESELECTOR_PATH);

But this does not solves the issue, please guide me though the logic so I could make a PR.

Ternary expression in component

For components which declared like:

const Component = (props) => {
    const {flag} = props;
    
    return flag
        ? <div>smth</div>
        : <a>smth</a>
}

It doesn't set data attribute.

Can't use with new JSX Transform from react 17+

Hello, thank you for this library, but I can't use it with new JSX Transform introduced in React 17.
I have debugged the reselector's source code and found, that in this line isElement function always returns false, because in the new jsx runtime transform we don't have in this line name === 'React' and property === 'createElement'. At the current moment I don't found any solution how to detect if jsx compiled to
_jsx('h1', { children: 'Hello world' });
instead to
React.createElement('h1', null, 'Hello world');

An in-range update of eslint is breaking the build ๐Ÿšจ

The devDependency eslint was updated from 6.4.0 to 6.5.0.

๐Ÿšจ View failing branch.

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

eslint 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).
  • โœ… coverage/coveralls: First build on greenkeeper/eslint-6.5.0 at 93.412% (Details).

Release Notes for v6.5.0
  • 73596cb Update: Add enforceForSwitchCase option to use-isnan (#12106) (Milos Djermanovic)
  • d592a24 Fix: exclude \u000d so new line won't convert to text (fixes #12027) (#12031) (zamboney)
  • e85d27a Fix: no-regex-spaces false positives and invalid autofix (fixes #12226) (#12231) (Milos Djermanovic)
  • b349bf7 Fix: prefer-named-capture-group incorrect locations (fixes #12233) (#12247) (Milos Djermanovic)
  • 7dc1ea9 Fix: no-useless-return autofix removes comments (#12292) (Milos Djermanovic)
  • 0e68677 Fix: no-extra-bind autofix removes comments (#12293) (Milos Djermanovic)
  • 6ad7e86 Fix: no-extra-label autofix removes comments (#12298) (Milos Djermanovic)
  • acec201 Fix: no-undef-init autofix removes comments (#12299) (Milos Djermanovic)
  • d89390b Fix: use async reading of stdin in bin/eslint.js (fixes #12212) (#12230) (Barrie Treloar)
  • 334ca7c Update: no-useless-rename also reports default values (fixes #12301) (#12322) (Kai Cataldo)
  • 41bfe91 Update: Fix handling of chained new expressions in new-parens (#12303) (Milos Djermanovic)
  • 160b7c4 Chore: add autofix npm script (#12330) (Kai Cataldo)
  • 04b6adb Chore: enable eslint-plugin-jsdoc (refs #11146) (#12332) (Kai Cataldo)
  • 9b86167 Docs: Add new ES environments to Configuring ESLint (#12289) (Milos Djermanovic)
  • c9aeab2 Docs: Add supported ECMAScript version to README (#12290) (Milos Djermanovic)
  • 8316e7b Fix: no-useless-rename autofix removes comments (#12300) (Milos Djermanovic)
  • 29c12f1 Chore: cache results in runtime-info (#12320) (Kai Cataldo)
  • f5537b2 Fix: prefer-numeric-literals autofix removes comments (#12313) (Milos Djermanovic)
  • 11ae6fc Update: Fix call, new and member expressions in no-extra-parens (#12302) (Milos Djermanovic)
  • a7894eb New: add --env-info flag to CLI (#12270) (Kai Cataldo)
  • 61392ff Sponsors: Sync README with website (ESLint Jenkins)
  • 2c6bf8e Docs: English fix (#12306) (Daniel Nixon)
  • 6f11877 Sponsors: Sync README with website (ESLint Jenkins)
  • 2e202ca Docs: fix links in array-callback-return (#12288) (Milos Djermanovic)
  • e39c631 Docs: add example for CLIEngine#executeOnText 3rd arg (#12286) (Kai Cataldo)
  • d4f9a16 Update: add support for JSXFragments in indent rule (fixes #12208) (#12210) (Kai Cataldo)
  • c6af95f Sponsors: Sync README with website (ESLint Jenkins)
  • 8cadd52 Sponsors: Sync README with website (ESLint Jenkins)
  • f9fc695 Chore: enable default-param-last (#12244) (่–›ๅฎš่ฐ”็š„็Œซ)
  • 9984c3e Docs: Update README team and sponsors (ESLint Jenkins)
Commits

The new version differs by 32 commits.

  • 76fb571 6.5.0
  • 7359a80 Build: changelog update for 6.5.0
  • 73596cb Update: Add enforceForSwitchCase option to use-isnan (#12106)
  • d592a24 Fix: exclude \u000d so new line won't convert to text (fixes #12027) (#12031)
  • e85d27a Fix: no-regex-spaces false positives and invalid autofix (fixes #12226) (#12231)
  • b349bf7 Fix: prefer-named-capture-group incorrect locations (fixes #12233) (#12247)
  • 7dc1ea9 Fix: no-useless-return autofix removes comments (#12292)
  • 0e68677 Fix: no-extra-bind autofix removes comments (#12293)
  • 6ad7e86 Fix: no-extra-label autofix removes comments (#12298)
  • acec201 Fix: no-undef-init autofix removes comments (#12299)
  • d89390b Fix: use async reading of stdin in bin/eslint.js (fixes #12212) (#12230)
  • 334ca7c Update: no-useless-rename also reports default values (fixes #12301) (#12322)
  • 41bfe91 Update: Fix handling of chained new expressions in new-parens (#12303)
  • 160b7c4 Chore: add autofix npm script (#12330)
  • 04b6adb Chore: enable eslint-plugin-jsdoc (refs #11146) (#12332)

There are 32 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 ๐ŸŒด

Fails on function declaration components

i have a component, exports like this:
export default function Placement() {return some jsx}

build failed with:

ERROR in ./src/components/Products/Placement/Placement.jsx
Module build failed: Error: ***Placement.jsx: We don't know what to do with this node type. We were previously a Statement but we can't fit in here?
    at NodePath.insertAfter (***/node_modules/babel-traverse/lib/path/modification.js:175:13)
    at PluginPass.JSXElement (***/node_modules/reselector/babel.js:29:16)
    at newFn (***/node_modules/babel-traverse/lib/visitors.js:276:21)
    at NodePath._call (***/node_modules/babel-traverse/lib/path/context.js:76:18)
    at NodePath.call (***/node_modules/babel-traverse/lib/path/context.js:48:17)
    at NodePath.visit (***/node_modules/babel-traverse/lib/path/context.js:105:12)
    at TraversalContext.visitQueue (***/node_modules/babel-traverse/lib/context.js:150:16)
    at TraversalContext.visitSingle (***/node_modules/babel-traverse/lib/context.js:108:19)
    at TraversalContext.visit (***/node_modules/babel-traverse/lib/context.js:192:19)
    at Function.traverse.node (***/node_modules/babel-traverse/lib/index.js:114:17)
 @ ./src/components/Products/Placement/index.js 1:0-38
 @ ./src/components/Products/index.js
 @ ./src/routes.jsx
 @ ./src/client.jsx
 @ multi (webpack)-dev-server/client?https://localhost:8080 webpack/hot/dev-server client

it solves when i changed it to:

const Placement = () => some jsx

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.