Giter Club home page Giter Club logo

quilt's Introduction

Quilt

License: MIT Build Status Build Status

A loosely related set of packages for JavaScript/TypeScript projects at Shopify.

These libraries compose together to help you create performant modern JS apps that you love to develop and test. These packages are developed primarily to be used on top of the stack we like best for our JS apps; Typescript for the flavor, Koa for the server, React for UI, Apollo for data fetching, and Jest for tests. That said, you can mix and match as you like.

⚠️ Over the past few years, this repo has become a dumping ground for a variety of packages unrelated to the core problems Quilt, and it's stewards - the Admin Web Foundation team - aims to solve. Before submitting a pull request, please speak with the Admin Web Platform team on guidance as to whether a package might belong in Quilt. The Admin Web Platform team's focus is on the web codebase. If you're proposing a package that has not already been widely used in the web codebase then it is unlikely that it would be merged into Quilt.

Usage

The Quilt repo is managed as a monorepo that is composed of 71 npm packages and one Ruby gem. Each package/gem has its own README.md and documentation describing usage.

Package Index

Package Version Description
@shopify/address Address utilities for formatting addresses
@shopify/address-consts Constants and types relating to @shopify/address
@shopify/address-mocks Address mocks for @shopify/address
@shopify/admin-graphql-api-utilities A set of utilities to use when consuming Shopify’s admin GraphQL API
@shopify/async Primitives for loading parts of an application asynchronously
@shopify/browser Utilities for extracting browser information from user-agents
@shopify/csrf-token-fetcher JavaScript utility function to fetch the CSRF token required to make requests to a Rails server
@shopify/css-utilities A set of CSS styling-related utilities
@shopify/dates Lightweight date operations library
@shopify/function-enhancers A set of helpers to enhance functions
graphql-config-utilities Common utilities for graphql-config
graphql-fixtures Utilities for generating fixture objects from GraphQL documents.
graphql-mini-transforms Transformers for importing .graphql files in various build tools.
@shopify/graphql-persisted Apollo and Koa integrations for persisted GraphQL queries.
@shopify/graphql-testing Utilities to create mock GraphQL factories
graphql-tool-utilities Common utilities for GraphQL developer tools
graphql-typed A more strongly typed version of GraphQL's DocumentNode.
graphql-typescript-definitions Generate TypeScript definition files from .graphql documents
graphql-validate-fixtures Validates JSON fixtures for GraphQL responses against the associated operations and schema
@shopify/i18n Generic i18n-related utilities
@shopify/jest-dom-mocks Jest mocking utilities for working with the DOM
@shopify/jest-koa-mocks Utilities to easily stub Koa context and cookies
@shopify/koa-liveness-ping A package for creating liveness ping middleware for use with Koa
@shopify/koa-metrics Aims to provide standard middleware and instrumentation tooling for metrics in Koa
@shopify/koa-performance Creating middleware that sends performance-related data through StatsD
@shopify/koa-shopify-graphql-proxy A wrapper around koa-better-http-proxy which allows easy proxying of GraphQL requests from an embedded Shopify app
@shopify/koa-shopify-webhooks Receive webhooks from Shopify with ease
@shopify/logger Opinionated logger for production-scale applications
@shopify/mime-types MIME type consistency
@shopify/name Name-related utilities
@shopify/network Common values related to dealing with the network
@shopify/performance Primitives for collecting browser performance metrics
@shopify/phone Phone number utilities for formatting phone numbers
@shopify/polyfills Blessed polyfills for web platform features
@shopify/predicates A set of common JavaScript predicates
@shopify/react-app-bridge-universal-provider A self-serializing/deserializing app-bridge-react provider that works for isomorphic applications
@shopify/react-async Tools for creating powerful, asynchronously-loaded React components
@shopify/react-bugsnag An opinionated wrapper for Bugsnag's React plugin
@shopify/react-compose Cleanly compose multiple component enhancers together with minimal fuss
@shopify/react-cookie Cookies in React for the server and client
@shopify/react-csrf Share CSRF tokens throughout a React application
@shopify/react-csrf-universal-provider A self-serializing/deserializing CSRF token provider that works for isomorphic applications
@shopify/react-effect A component and set of utilities for performing effects within a universal React app
@shopify/react-form Manage React forms tersely and safely-typed with no magic using React hooks
@shopify/react-form-state Manage React forms tersely and type-safely with no magic
@shopify/react-google-analytics Allows React apps to easily embed Google Analytics scripts
@shopify/react-graphql Tools for creating type-safe and asynchronous GraphQL components for React
@shopify/react-graphql-universal-provider A self-serializing/deserializing GraphQL provider that works for isomorphic applications
@shopify/react-hooks A collection of primitive React hooks
@shopify/react-html A component to render your React app with no static HTML
@shopify/react-hydrate Utilities for hydrating server-rendered React apps
@shopify/react-i18n i18n utilities for React handling translations, formatting, and more
@shopify/react-i18n-universal-provider A self-serializing/deserializing i18n provider that works for isomorphic applications
@shopify/react-idle Utilities for working with idle callbacks in React
@shopify/react-import-remote Asynchronous script loading for React
@shopify/react-intersection-observer A React wrapper around the Intersection Observer API
@shopify/react-network A collection of components that allow you to set common HTTP headers from within your React application
@shopify/react-performance Primitives to measure your React application's performance using @shopify/performance
@shopify/react-router A universal router for React
@shopify/react-server Utilities for React server-side rendering
@shopify/react-shortcuts Declaratively and efficiently match shortcut combinations in your React application
@shopify/react-testing A library for testing React components according to our conventions
@shopify/react-universal-provider Factory function and utilities to create self-serializing/deserializing providers that work for isomorphic applications
@shopify/react-web-worker A hook for using web workers in React applications
@shopify/semaphore Counting semaphore
@shopify/sewing-kit-koa Easily access Sewing Kit assets from a Koa server
@shopify/statsd An opinionated StatsD client for Shopify Node.js servers and other StatsD utilities
@shopify/storybook-a11y-test Test storybook pages with axe and puppeteer
@shopify/useful-types A few handy TypeScript types
@shopify/web-worker Tools for making web workers fun to use
@shopify/with-env A utility for executing code under a specific NODE_ENV

Gem Index

Gem Version Description
quilt_rails A turn-key solution for integrating server-rendered React into your Rails app using Quilt libraries.

Want to contribute?

Check out our Contributing Guide

Questions?

For Shopifolk, you can reach out to us in Slack in the #help-admin-web-platform channel. For external inquiries, we welcome bug reports, enhancements, and feature requests via GitHub issues.

License

MIT © Shopify, see LICENSE.md for details.

Shopify

quilt's People

Contributors

alexandcote avatar atesgoral avatar blazingbbq avatar bpscott avatar cejaekl avatar dahukish avatar dependabot[bot] avatar emileber avatar felipeleusin avatar github-actions[bot] avatar gmcgibbon avatar goodforonefare avatar greenkeeper[bot] avatar ismail-syed avatar jordanatshopify avatar lemonmade avatar markiiikram avatar marutypes avatar melnikov-s avatar michenly avatar nickjs avatar patsissons avatar peter-hamilton avatar ryanwilsonperkin avatar sambostock avatar shopify-github-actions-access[bot] avatar theodoretan avatar tzvipm avatar vsumner avatar xie 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  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

quilt's Issues

Type definition error in @shopify/enzyme-utilities

Using @shopify/enzyme-utilities
and doing

const wrapper = mount(<ConnectedAccountCard {...mockDefaultProps} />);
trigger(wrapper.find(Button), 'onClick');

I get the following typescript error

Argument of type 'ReactWrapp
er<Props, never>' is not assignable to parameter of type 'AnyWrapper'.
  Type 'ReactWrapper<Props, never>' is not assignable to type 'CommonWrapper<any, any>'.
    Types of property 'filterWhere' are incompatible.
      Type '(predicate: (wrapper: ReactWrapper<Props, never>) => boolean) => ReactWrapper<Props, never>' is not assignable to type '(predicate: (wrapper:
CommonWrapper<any, any>) => boolean) => CommonWrapper<any, any>'.
        Types of parameters 'predicate' and 'predicate' are incompatible.
          Types of parameters 'wrapper' and 'wrapper' are incompatible.
            Type 'ReactWrapper<Props, never>' is not assignable to type 'CommonWrapper<any, any>'.

upon on research I see the type definition is different from the definition in web

in web

function trigger(wrapper: AnyWrapper, keypath: string, ...args: any[]) 
interface AnyWrapper {
  props: CommonWrapper<any, any>['props'];
  length: number;
  instance(): any;
  update(): void;
}

in @shopify/enzyme-utilities

import { ReactWrapper, CommonWrapper } from 'enzyme';
export declare type AnyWrapper = ReactWrapper<any, any> | CommonWrapper<any, any>;
export declare function trigger(wrapper: AnyWrapper, keypath: string, ...args: any[]): any;

Also I still need to use '@shopify/enzyme-utilities/dist'

assert that typescript versions stay in synch

We get relatively confusing build errors if our typescript versions go out of synch between our packages and our root lerna directory. We should consider a script that runs pretest and asserts they are the same. That way we can surface a useful error to devs.

[jest-mock-apollo] the module does not provided typescript declaration

Version Number: "@shopify/jest-mock-apollo": "^1.0.2"

Using the module (ie import {registerSchema} from '@shopify/jest-mock-apollo';)
I am running into error

{
	"resource": "/Users/yin-shaochen/src/github.com/Shopify/sell-on-amazon/test/javascripts/web-foundation/setup.ts",
	"owner": "typescript",
	"code": "7016",
	"severity": 8,
	"message": "Could not find a declaration file for module '@shopify/jest-mock-apollo'. '/Users/yin-shaochen/src/github.com/Shopify/sell-on-amazon/node_modules/@shopify/jest-mock-apollo/dist/index.js' implicitly has an 'any' type.\n  Try `npm install @types/shopify__jest-mock-apollo` if it exists or add a new declaration (.d.ts) file containing `declare module 'shopify__jest-mock-apollo';`",
	"source": "ts",
	"startLineNumber": 6,
	"startColumn": 30,
	"endLineNumber": 6,
	"endColumn": 57
}

Current workaround
Using import {registerSchema} from '@shopify/jest-mock-apollo/dist'; instead

Standardize all koa middleware usage to be factory-like

From #101 (review)

koa-shopify-graphql-proxy is the only package I am aware of that does not follow the pattern of being mounted with a function call ().

We should change that package (and any others) and enforce this style moving forward. This will mean things are consistent and configuration can be added to any package at a later time without it breaking past usage.

Create @shopify/logger

Problem Summary

Logging is an important tool in a developer’s arsenal. It can be used to debug applications both in development and production to better diagnose problems. It can be used, along with statistical analysis, to gain insight into the activity of even the most complex distributed systems.

As Shopify becomes increasingly distributed and complex, it will become imperative that logging is something that we do right.

We eventually want to build a great experience with a nice API, filtering, and a slick UI. By getting the API right and creating a nice separation of concerns, we allow for ease of continuous improvement for things like filtering, etc.

In development, for web application, there are concerns around simultaneous, asynchronous requests. We want immediate feedback, but, when many requests are happening at the same time, the UI is hard to get right.

In production web applications, stdout is our interface into splunk (via fluentd). We want our logs to have context about our application, and perhaps we want to aggregate these logs, so that we send only a single JSON payload to splunk per request.

For CLI applications, we’d like to avoid duplicating work in creating a nice UI for logging. It would be nice if our logger was not specifically tied to server applications.

Proposed Solution

  • Logging is split into 2 stages:
    • Logging (API emits intermediate data)
    • Formatting (converts intermediate data into desired format)
  • We use JSON as the intermediate logging format (pino / bunyan / bole)
  • The core logging API will stay as close as possible to https://console.spec.whatwg.org
    • If API exists, we’ll use it:
      • .time, .timeEnd
    • If API doesn’t exist, we’ll use idiomatic naming:
      • .tag, .tagEnd
  • Buffering for production is handled by @shopify/koa-logger

Why?

  • By splitting logging into 2 stages, we conceptually decouple the concept of an API from the concept of a logging UI. This allows us to focus on perfecting the 2 independently of each other.
  • By logging to a JSON format, we can easily create aggregation or filtering logic that gets applied before the logs get formatted. Again, we can do all of this independently of the logger API mechanism.
  • By staying close to the console specification for our API, we reduce friction for new developers into our code base. We also defer to the W3C arguments or differences of opinion for how things like tagging, grouping, or timing should be done. Sometimes it’s nice to have a decision made for you in a consistent way, even if it’s not your favorite outcome.

References

Inspiration was taken from many sources, but the primary influences were:
http://getpino.io/#/
https://github.com/klauscfhq/signale
https://console.spec.whatwg.org/

Improve documentation for jest-mock-apollo

  1. We might want to also show an example using mock providers over custom context.
mount(
  <ApolloProvider client={createGraphQLClient()}>
    <SomePage/>
  </ApolloProvider>
);
  1. we should document the API instead of just telling people to look at the code.

Make working scoped to a single library a bit cleaner

Right now linting and testing is a pain if you are only working in the scope of one package folder. We should minimize this friction by getting all the commands working in each package with as little config duplication as we can.

Add decision documents for quilt middleware conventions

We should document our middleware conventions in a decision document, it should cover:

  • always exporting factories
  • naming factories for what they output (eg. shopifyAuth > createShopifyAuth)
  • always scoping to a default path so things 'just work' for simple cases
  • supporting mountability / router composability when possible

Create @shopify/upload-assets

Some thought will need to go into what part of this makes sense for a public package, but certainly the idea of uploading assets from webpack to some sort of cdn makes sense in that context.

Fix redirects and status messages for `createMockContext`

Status messages

const ctx = createMockContext({
  statusCode: 302,
});

sets ctx.status to 302, but message to OK. Furthermore, the message cannot be explciitly overridden:
screen shot 2018-04-19 at 9 20 49 am

redirects

const ctx = createMockContext({
  statusCode: 302,
})
ctx.redirect('example.com');

I would assume that, after this, ctx.response.headers.location would be example.com, but instead it is undefined.

cc @TheMallen

Make auth middleware mountable, remove prefix option

Right now we are generating the callback redirect for the koa-shopify-auth middleware using ctx.path. This is hostile to cleanly composing it using koa-mount.

At the moment we support a custom prefix configuration option, but it seems like bette citizenry with the framework to just use the simplest possible path in our own logic and then support koa-mount for namespacing our routes if a user wants to.

[jest-mock-apollo] better error if schemaBuildPath is wrong

I made a typo when specifying the schemaBuildPath and it was really hard to debug.

{"length": 0, Symbol(enzyme.__unrendered__): null, Symbol(enzyme.__renderer__): {"batchedUpdates": [Function batchedUpdates], "getNode": [Function getNode], "render": [Function render], "simulateEvent": [Function simulateEvent], "unmount": [Function unmount]}, Symbol(enzyme.__root__): {"length": 1, Symbol(enzyme.__unrendered__): <Apollo(ShopInfo) />, Symbol(enzyme.__renderer__): {"batchedUpdates": [Function batchedUpdates], "getNode": [Function getNode], "render": [Function render], "simulateEvent": [Function simulateEvent], "unmount": [Function unmount]}, Symbol(enzyme.__root__): [Circular], Symbol(enzyme.__node__): {"instance": {"__reactInternalMemoizedMaskedChildContext": {"client": [ApolloClient], "getQueryRecycler": undefined}, "__reactInternalMemoizedUnmaskedChildContext": {"client": [ApolloClient], "easdk": undefined, "polaris": [Object]}, "_reactInternalFiber": {"_debugID": 5, "_debugIsCurrentlyTiming": false, "_debugOwner": [FiberNode], "_debugSource": null, "alternate": [FiberNode], "child": [FiberNode], "effectTag": 5, "expirationTime": 1, "firstEffect": null, "index": 0, "key": null, "lastEffect": null, "memoizedProps": [Object], "memoizedState": null, "mode": 0, "nextEffect": null, "pendingProps": [Object], "ref": null, "return": [FiberNode], "sibling": null, "stateNode": [Circular], "tag": 2, "type": [Function h], "updateQueue": [Object]}, "_reactInternalInstance": {}, "client": {"cache": [InMemoryCache], "defaultOptions": [Object], "disableNetworkFetches": true, "graphQLRequests": [Requests], "graphQLResults": [Array], "link": [ApolloLink], "mutate": [Function bound ], "query": [Function bound ], "queryDeduplication": true, "queryManager": [QueryManager], "reFetchObservableQueries": [Function bound ], "resetStore": [Function bound ], "resetStoreCallbacks": [Array], "ssrMode": true, "store": [DataStore], "version": "2.3.1", "watchQuery": [Function bound ]}, "context": {"client": [ApolloClient], "getQueryRecycler": undefined}, "dataForChildViaMutation": [Function bound ], "hasMounted": true, "previousData": {}, "props": {}, "queryObservable": {"_subscriber": [Function anonymous], "isCurrentlyPolling": false, "isTornDown": true, "lastError": [Error: Network error: Error writing result to store for query:
     query ShopInfo {
      currentShop {
        facebookPage {
          name
          __typename
        }
        __typename
      }
    }

    Cannot read property 'currentShop' of undefined], "observers": [Array], "options": [Object], "queryId": "1", "queryManager": [QueryManager], "scheduler": [QueryScheduler], "shouldSubscribe": true, "subscriptionHandles": [Array], "variables": [Object]}, "querySubscription": {"_cleanup": undefined, "_observer": undefined, "_queue": undefined, "_state": "closed"}, "refs": {}, "renderedElement": <ShopInfo data={[Object]} />, "setWrappedInstance": [Function bound ], "shouldRerender": false, "state": null, "type": 0, "updater": {"enqueueForceUpdate": [Function enqueueForceUpdate], "enqueueReplaceState": [Function enqueueReplaceState], "enqueueSetState": [Function enqueueSetState], "isMounted": [Function isMounted]}, "version": 0}, "key": undefined, "nodeType": "class", "props": {}, "ref": null, "rendered": {"instance": {"_reactInternalFiber": [FiberNode], "_reactInternalInstance": [Object], "context": [Object], "props": [Object], "refs": [Object], "state": null, "updater": [Object]}, "key": undefined, "nodeType": "class", "props": {"data": [Object]}, "ref": null, "rendered": null, "type": [Function ShopInfo]}, "type": [Function h]}, Symbol(enzyme.__nodes__): [{"instance": {"__reactInternalMemoizedMaskedChildContext": [Object], "__reactInternalMemoizedUnmaskedChildContext": [Object], "_reactInternalFiber": [FiberNode], "_reactInternalInstance": [Object], "client": [ApolloClient], "context": [Object], "dataForChildViaMutation": [Function bound ], "hasMounted": true, "previousData": [Object], "props": [Object], "queryObservable": [ObservableQuery], "querySubscription": [Subscription], "refs": [Object], "renderedElement": <ShopInfo … />, "setWrappedInstance": [Function bound ], "shouldRerender": false, "state": null, "type": 0, "updater": [Object], "version": 0}, "key": undefined, "nodeType": "class", "props": {}, "ref": null, "rendered": {"instance": [ShopInfo], "key": undefined, "nodeType": "class", "props": [Object], "ref": null, "rendered": null, "type": [Function ShopInfo]}, "type": [Function h]}], Symbol(enzyme.__options__): {"adapter": {"options": {"enableComponentDidUpdateOnSetState": true}}, "childContextTypes": {"easdk": [Function bound checkType], "polaris": [Function bound checkType]}, "context": {"client": {"cache": [InMemoryCache], "defaultOptions": [Object], "disableNetworkFetches": true, "graphQLRequests": [Requests], "graphQLResults": [Array], "link": [ApolloLink], "mutate": [Function bound ], "query": [Function bound ], "queryDeduplication": true, "queryManager": [QueryManager], "reFetchObservableQueries": [Function bound ], "resetStore": [Function bound ], "resetStoreCallbacks": [Array], "ssrMode": true, "store": [DataStore], "version": "2.3.1", "watchQuery": [Function bound ]}, "easdk": undefined, "polaris": {"intl": [Intl], "link": [Link], "stickyManager": [StickyManager]}}}}, Symbol(enzyme.__node__): undefined, Symbol(enzyme.__nodes__): [], Symbol(enzyme.__options__): {"adapter": {"options": {"enableComponentDidUpdateOnSetState": true}}, "childContextTypes": {"easdk": [Function bound checkType], "polaris": [Function bound checkType]}, "context": {"client": {"cache": {"addTypename": true, "config": [Object], "data": [ObjectCache], "optimistic": [Array], "silenceBroadcast": false, "watches": [Array]}, "defaultOptions": {}, "disableNetworkFetches": true, "graphQLRequests": {"requests": [Array]}, "graphQLResults": [[Promise]], "link": {"request": [Function anonymous]}, "mutate": [Function bound ], "query": [Function bound ], "queryDeduplication": true, "queryManager": {"dataStore": [DataStore], "deduplicator": [ApolloLink], "fetchQueryPromises": [Map], "idCounter": 3, "link": [ApolloLink], "mutationStore": [MutationStore], "onBroadcast": [Function onBroadcast], "queries": [Map], "queryDeduplication": true, "queryIdsByName": [Object], "queryStore": [QueryStore], "scheduler": [QueryScheduler]}, "reFetchObservableQueries": [Function bound ], "resetStore": [Function bound ], "resetStoreCallbacks": [], "ssrMode": true, "store": {"cache": [InMemoryCache]}, "version": "2.3.1", "watchQuery": [Function bound ]}, "easdk": undefined, "polaris": {"intl": {"translation": [Object]}, "link": {"linkComponent": undefined}, "stickyManager": {"stickyItems": [Array], "stuckItems": [Array]}}}}}
    received.length:
      0

The error was something about a network error and data being undefined. Anyways, once I console.log'ed out the graphQLResults, I found the proper error.

Error: ENOENT: no such file or directory, open '/Users/user/path/to/somewhere/tmp/sewing-kit/schema.graphql'

It would be great if this threw the error earlier and more explicitly.

Headers in createMockContext don't get propagated to `ctx.headers`

It seems that the headers passed into createMockContext only get defined on the request, but not on the context itself. In particular, after calling:

const ctx = createMockContext({
  method: 'get',
  statusCode: 200,
  url: 'example.com',
  headers: {
    'User-Agent': 'some-ua-string',
  },
});

I would expect the following to yield some-ua-string:

ctx.header['User-Agent']

cc @TheMallen

Create @shopify/jest-mock-apollo

One of our most important and most useful mocks is our graphql client mock. We should expose createMockGraphQLClient as a test utility.

An alternate api would be to just expose a <MockApolloProvider> that you could wrap your components with in tests.

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.