Détail du package

eslint-plugin-shopify

Shopify10.1kMITobsolète35.1.0

Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

Shopify’s ESLint rules and configs.

eslint, eslintconfig, eslintplugin, eslint-config

readme

eslint-plugin-shopify

NPM version Circle CI David DM

Shopify’s ESLint rules and configs.

Installation

You'll first need to install ESLint:

With Yarn

yarn add --dev eslint

With npm

$ npm i eslint --save-dev

Next, install eslint-plugin-shopify:

With Yarn

yarn add --dev eslint-plugin-shopify

With npm

$ npm install eslint-plugin-shopify --save-dev

Note: If you installed ESLint globally (using the -g flag) then you must also install eslint-plugin-shopify globally.

Usage

Shopify’s ESLint configs come bundled in this package. In order to use them, you simply extend the relevant configuration in your project’s .eslintrc. For example, the following will extend the ESNext (ES2015 and later) config:

{
  "extends": "plugin:shopify/esnext"
}

If you are working on an ES5 project, extend the ES5 version of the configuration:

{
  "extends": "plugin:shopify/es5"
}

You can also add some "augmenting" configs on top of the "core" config by extending an array of linting configs. For example, the following configuration would provide a base ESNext config that is augmented by a React config:

{
  "extends": [
    "plugin:shopify/esnext",
    "plugin:shopify/react"
  ]
}

Likewise, if you are using TypeScript and React, the following configuration extends the TypeScript base config with the React-specific rules provided by the React configuration file. To demonstrate multiple augmentations, we've also added the Prettier config, which disables rules that will conflict in projects using prettier.

{
  "extends": [
    "plugin:shopify/typescript",
    "plugin:shopify/react",
    "plugin:shopify/prettier",
  ]
}

Provided configurations

This plugin provides the following core configurations:

  • esnext: Use this for anything written with ES2015+ features.
  • typescript: Use this for Typescript projects. The rules enabled in this confige do not require type-checking to run. To enable all Typescript rules, you must augment this config with the typescript-type-checking config mentioned below.
  • es5: Use this for legacy projects.

This plugin also provides the following tool-specific configurations, which can be used on top of the core configurations:

  • typescript-type-checking Use this config to augment the typescript config to enable all TypeScript rules, including those that require type checking. These rules are slower to run and and you will need to specify a path to your tsconfig.json file in the "project" property of "parserOptions". The following example would provide all of the TypeScript rules, assuming the tsconfig.json is in the same directory as you ESlint configuration.
{
  "extends": [
    "plugin:shopify/typescript",
    "plugin:shopify/typescript-type-checking"
  ],
  "parserOptions": {
    "project": "tsconfig.json"
  }
}

node

If you are working on a node module, we also provide the node configuration for you. Note that this configuration needs to be used in conjunction with one of the core configurations (either es5 or esnext). If you plan to transpile your code using Babel, use the esnext config. If you do not plan to do so, the config you choose depends on the version of node you wish to support, and how many ESNext features are natively available in that version. You can see a detailed list of what version of node supports what new JavaScript features by visiting http://node.green.

A node project that will use Babel for transpilation would need the following ESLint config:

{
  "extends": [
    "plugin:shopify/esnext",
    "plugin:shopify/node"
  ]
}

Supported Typescript version

The version range of TypeScript currently supported by this plugin is >=3.2.1 <3.8.0. This is constrained by the @typescipt-eslint parser support.

Plugin-Provided Rules

This plugin provides the following custom rules, which are included as appropriate in all core linting configs:

changelog

Changelog

Unreleased

[35.1.0] - 2020-03-23

  • Update @typescript-eslint/eslint-plugin and @typescript-eslint/parser to 2.25.0, to support new syntax introduced in Typescript 3.8. (#523)

[35.0.0] - 2020-02-14

  • remove no-vague-titles because the rule was adopted into eslint-plugin-jest's valid-title rule. See the valid-title documentation
  • Fixed an issue with typescript/prefer-pascal-case-enum when you had enum with key as string. (517)

[34.0.1] - 2019-01-13

  • fix enabled graphql rules by specifying env: 'literal' (514)

[34.0.0] - 2019-01-13

  • changed no-vague-titles rule to catch blacklisted words (instead of sequences) in the title (514)
  • removed jest/no-empty-title and renamed jest/require-tothrow-message to jest/require-to-throw-message (499)

New Rules

The followiing new rules were introduced in eslint@6.7.0. More information can be found on the eslint blog.

[33.0.0] - 2019-11-20

Breaking Change

  • The graphql configs have been pushed to an override for files matching a .graphql extension. This will allow this config to chain together with other parser-setting configs without changing the parser value. Consider the following config:
// .eslintrc
{
  extends: [
    "plugin:shopify/typescript",
    "plugin:shopify/graphql"
  ]
}

Before this change the final parser becomes babel-eslint for all files. This will cause errors when parsing TypeScript files even though we are extending the typescript config :( You could workaround this by moving the plugin:shopify/graphql first in the extends array or lint GraphQL files in a seperate script.

After this change Final parser is babel-eslint for only .graphql files while @typescript-eslint/parser is set for all .ts and .tsx files. This should not cause any parser-related errors :)

New Rules

  • shopify/no-all-mocks-methods (#204)
  • shopify/no-namespace-imports Prevent namespace import declarations. (262)

[32.0.0] - 2019-11-05

  • jest/valid-title
  • jest/prefer-hooks-on-top
  • jest/require-top-level-describe
  • Enforce new-lines between groups import groups (#409)

[31.0.0] - 2019-10-23

Using @typescript-eslint/parser and @typescript-eslint/eslint-plugin

  • Breaking Change Updated from eslint-plugin-typescript to @typescript-eslint/eslint-plugin. If you have any rules defined under the typescript namespace, you will need to change those to use the new @typescript-eslint namespace.

For example:

"rules": {
  "typescript/restrict-plus-operands": "error"
}

Will become:

"rules": {
  "@typescript-eslint/restrict-plus-operands": "error"
}

Config Changes

  • Breaking Change The plugin:shopify/react is no longer a core config and must augment one of the plugin:shopify/typescript or plugin:shopify/esnext configs. See examples below

Example config for react without typescript projects:

{
  "extends": [
    "plugin:shopify/esnext",
    "plugin:shopify/react"
    // ...other configs
  ]
}

Example config for react with typescript projects:

{
  "extends": [
    "plugin:shopify/typescript",
    "plugin:shopify/react"
    // ...other configs
  ]
}
  • Note If using the plugin:shopify/typescript-type-checking augmented config, you must specify a path to your tsconfig.json file in the "project" property of "parserOptions"

New Rules

  • jest/no-standalone-expect Prevents expect statements outside of a test or it block (368)
  • jest/no-expect-resolves Avoid using expect().resolves (370)

[30.0.1] - 2019-06-24

  • bump eslint peer depndency to 6

[30.0.0] - 2019-06-24

Changed

  • Enabled jest/no-export rule (344)
  • [Major] depreciated shopify/jest/no-try-expect in favour of jest/no-try-expect (331)
  • [Major] depreciated shopify/jest/no-if in favour of jest/no-if (347)
  • [Major] Updated to eslint v6, enabled no-console and enabled no-async-promise-executor (330)
  • Enabled typescript/interface-name-prefix to prevent I prefixes in TypeScript interface names
  • Enabled jest/no-duplicate-hooks rule (344)

Fixed

  • [Patch] Fix jest/no-if from falsely reporting if statements inside of functions (331)

[29.0.2] - 2019-06-18

Changed

  • Removed react/prop-types in typescript config (309)

[29.0.1] - 2019-06-18

Changed

  • Removed import/no-namespace (308)

[29.0.0] - 2019-06-17

Changed

  • added "necessary" to shopify/jest/no-vague-titles (265)
  • shopify/jest/no-if now recognizes conditional statements (298)

Added

  • New Rules:
    • jest/no-commented-out-tests disallows commented out tests.(275)
    • jest/no-try-expect disallows expect calls in catch blocks (300)
    • node/prefer-promises/dns and node/prefer-promises/fs These rules disallow the callback API in favor of promise API for the dns and fs modules. (257)
    • jest/no-mocks-import This rule disallows manually importing from __mocks__ (246)
    • react/state-in-constructor Enforce state initialization to be in a class property. (256)
    • import/no-namespace Prevents namespace imports. (305)

Fixed

  • shopify/jest/no-if ignores if statements nested within block statements (299)
  • react-prefer-private-members from incorrectly reporting the members of a parent class if a React class is defined within its constructor. (258)

[28.0.0] - 2019-04-26

Changed

  • Reverted a previous update from eslint-plugin-typescript to @typescript-eslint/eslint-plugin. If you have any rules defined under the @typescript-eslint namespace, you will need to change those to use the older typescript namespace.

    For example:

    "rules": {
      "@typescript-eslint/restrict-plus-operands": "error"
    }

    Will become:

    "rules": {
      "typescript/restrict-plus-operands": "error"
    }

Note: This is a temporary work-around to resolve a bug in prettier-eslint and will attempt the typescript updates again when resolved.

Fixed

  • shopify/restrict-full-import "empty" array pattern (eg: const [, bar] = foo errors (#243)
  • Optimized shopify/images/no-direct-imports to be much faster in the common case (#247)
  • shopify/react-hooks-strict-return from crashing when a hook returns undefined (#251)

Added

  • updated eslint-plugin-import to version 22.4.1 which introduces the no-unused-modules rule.
  • updated eslint-plugin-jest to version 22.4.1 which introduces the no-empty-title rule.
  • shopify/react-hooks-strict-return Restrict the number of returned items from React hooks. (#237)

Removed

  • turned off node/no-extraneous-require because it duplicates reported violations from import/no-extraneous-dependencies (#240

[27.0.1] - 2019-04-10

Changed

  • shopify/jest/no-if no longer considers if statements in describe blocks as invalid. (#235)

Removed

  • turned off consistent-return (#236
  • turned off react/jsx-no-bind (#239)
  • turned off babel/camelcase in typescript config because it overlaps with @typescript-eslint/camelcase. (#238)
  • shopify/jest/no-if no longer considers if statements in describe blocks as invalid. (#235)

[27.0.0] - 2019-04-08

Added

Plugin updates and additions (#233)

Breaking Changes

  • shopify/jquery-dollar-sign-reference has been removed.
  • The eslint-comments ruleset has been removed and is now enabled by default as part of core - if you're using es5, esnext, react or typescript then you can remove the reference to eslint-comments.
  • The ava, mocha, jquery and lodash rulesets have been removed as these tools are are not commonly used at Shopify.
  • The typescript-react and typescript-prettier rulesets have been removed. Replace ["plugin:shopify/typescript-react"] with ["plugin:shopify/typescript", "plugin:shopify/react"] and replace["plugin:shopify/typescript-prettier"] with ["plugin:shopify/prettier"]
  • Updated from eslint-plugin-typescript to @typescript-eslint/eslint-plugin. If you have any rules defined under the typescript namespace, you will need to change those to use the new @typescript-eslint namespace.

    For example:

    "rules": {
      "typescript/restrict-plus-operands": "error"
    }

    Will become:

    "rules": {
      "@typescript-eslint/restrict-plus-operands": "error"
    }

    More information on this change can be found in this eslint blog post.

New rules

  • shopify/jest/no-if (#232)

Refer to the Rules of Hooks documentation to learn more about the following rules.

  • 'react-hooks/rules-of-hooks': 'error' // Only use Hooks at the top level of a React functional component or from within another custom hook.
  • 'react-hooks/exhaustive-deps': 'error' // Checks for missing useEffect dependencies

Updated Plugins

Package Old version New version
eslint-plugin-sort-class-members 1.3.1 1.4.0
eslint-plugin-promise 4.0.0 4.0.1
eslint-plugin-node 7.0.1 8.0.1
eslint-plugin-jsx-a11y 6.1.1" 6.2.1
eslint-plugin-jest 21.22.0 21.23.0
eslint-plugin-import 2.14.0 2.16.0
eslint-plugin-graphql 2.1.0-0 3.0.3
eslint-plugin-eslint-comments 3.0.1 3.1.1
eslint-plugin-babel 5.1.0 5.3.0
eslint-plugin-utils 2.1.0 2.3.0

Added Plugins

Package Version
eslint-plugin-react-hooks 1.5.0
@typescript-eslint/eslint-plugin 1.5.0
"@typescript-eslint/parser 1.5.0
babel-eslint 10.0.1

Removed Plugins

Package
eslint-plugin-mocha
eslint-plugin-ava
eslint-plugin-flowtype
eslint-plugin-chai-expect
eslint-plugin-lodash
eslint-plugin-jquery

Changed

  • jest/no-vague-titles added every and descriptive as vague words. (#221)

26.3.0 - 2019-02-21

Added

  • Updated eslint-plugin-react and enabled react/jsx-fragments rule to prefer using <> over <React.Fragment> when defining fragments (#223)

26.2.0 - 2019-02-14

Added

  • images-no-direct-imports (#219)

26.1.2 - 2019-01-02

Fixed

  • jest/no-vague-titles no longer flags when the word call is used. (#203)
  • Update eslint-plugin-prettier to 3.0.1 so it does not crash when given an unparsable file (#212)

Changed

  • jest/no-vague-titles added should and properly to vague rules and new configuration to allow words. (#208)

26.1.1 - 2018-10-31

Fixed

26.1.0 - 2018-10-30

Added

  • shopify/no-ancestor-directory-import (#149)

Fixed

  • Set TypeScript parser only on TS files. This makes sure you can extend from the typescript and react configs in either order. Previously you had to make sure typescript came first to avoid using the babel-eslint parser on typescript files. Now we suggest to extend from typescript, and then react to ensure some rules some JSX rules don't get inadventently disabled. (#200)

26.0.0 - 2018-10-26

Added

  • shopify/eslint-comments plugin with eslint-plugin-eslint-comments rules:

    • eslint-comments/disable-enable-pair,
    • eslint-comments/no-aggregating-enable
    • eslint-comments/no-duplicate-disable
    • eslint-comments/no-unlimited-disable
    • eslint-comments/no-unused-disable
    • eslint-comments/no-unused-enable
    • eslint-comments/no-restricted-disable (disabled)
    • eslint-comments/no-use (disabled)
  • shopify/jest/no-snapshots (#182)

Changed

  • Updated plugin:shopify/prettier, plugin:shopify/react, and plugin:shopify/typescript to use overrides (#173)
  • Updated import/order rule to enforce ordering of internal, parent and sibling imports (#189)
  • Updated func-style rule to allow arrow functions (#188)

Fixed

  • Rolling back eslint-plugin-graphql to 2.1.0-0 for multiple schema support (#195)

25.1.0 - 2018-10-01

Changed

  • Updated typescript-eslint-parser dependency to version 19.0.2 to support typescript-estree. (#176)

25.0.1 - 2018-09-25

Fixed

  • Restored typescript-prettier config to override prettier plugin parser. (#171)

25.0.0 - 2018-09-25

Fixed

  • Updated plugin:shopify/prettier to enable prettier linting. (#170)
  • strict-component-boundaries now consistently uses the resolved path from the app root to perform its checks. This fixes a number of false-positives. (#160)

24.2.0 - 2018-09-21

Added

  • Added plugin:shopify/graphql to module index. (#168)

Fixed

  • Updated no-vague-titles rule to fix parsing issues in getMethodName. (#167)

24.1.1 - 2018-09-19

  • Same as 24.1.0

24.1.0 - 2018-09-19

Added

  • Added shopify/graphql config using new eslint-plugin-graphql (2.1.1.) dependency. (#165)

24.0.0 - 2018-08-30

Fixed

  • plugin:shopify/flow now disables rules checked by Flow's static analyzer. (#135)
  • plugin:shopify/prettier and plugin:shopify/typescript-prettier defer missing semicolon rules to a project´s .prettierrc. (#135)
  • Updated strict-component-boundaries to exclude fixture imports. (#117)
  • Updated strict-component-boundaries to exclude imports from node_modules. (#140)
  • Updated jest/no-vague-titles to support .each syntax. (#148)

Changed

  • Namespaced prefer-pascal-case-enums and prefer-singular-enums under typescript. (#141)
  • Breaking: Updated to eslint v5.4.0. Consuming projects must be using supported node versions, we recommend ^8.10.0. See details on the v4 to v5 migration guide. (#151)

Added

23.1.0 - 2018-08-02

Fixed

  • Updated typescript-eslint-parser dependency to version 17.0.1 in order to support TypeScript 3. (#121)
  • Removed default prettier configurations. plugin:shopify/prettier and plugin:shopify/typescript-prettier now defer Prettier's config to a project's .prettierrc. (#121)

Changed

  • Included all as a vague term for no-vague-titles (#114)

23.0.0 - 2018-07-16

  • Breaking eslint-plugin-shopify will no longer install prettier as a dependency. Please ensure you have added prettier to your package.json if you wish to use it.

Added

  • shopify/jsx-prefer-fragment-wrappers (#94)
  • shopify/jest/no-vague-titles (#93)
  • shopify/strict-component-boundaries (#98)

Changed

  • Breaking Moved prettier to be a peerDependency, this avoids the potential for having multiple versions of prettier in the dependency graph. If you use prettier you will need to ensure you have it installed in your project as eslint-plugin-shopify will no longer install it for you (#107)
  • Breaking Updated typescript-eslint-parser to support typescript@2.9.1 (#102)

22.1.0 - 2018-06-08

Fixed

  • Updated eslint-plugin-sort-class-members dependency to version 1.3.1 in order to support node 10.

Added

  • shopify/prefer-pascal-case-enums (#96)
  • shopify/react-prefer-private-members (#95)

22.0.0

  • Updated dependencies
  • Added support for TypeScript 2.8

21.0.1 - 2018-04-25

  • Fixed the publish config for the package.

21.0.0 - 2018-04-25

Added

  • shopify/jsx-no-hardcoded-content now accepts a dom option that allows specifying attributes on DOM elements and Web Components to be checked for hardcoded content.

Removed

  • Breaking: turned off four rules that previously triggered errors in all cases:
    • shopify/react-type-state (TypeScript now addresses the issue this rule was meant to catch)
    • promise/always-return
    • react/no-did-mount-set-state
    • no-undefined
  • Breaking: turned off two rules in specific plugins:
    • babel/no-invalid-this (turned off for the typescript configs as TypeScript has better mechanisms for unsuring a valid this is used)
    • no-process-env (turned off for the webpack and node configs as both targets can benefit from use of process.env)

Fixed

  • Fixed an issue where various rules were not correctly resolving paths in node_modules.

20.0.0 - 2018-03-15

  • Breaking: the version of TypeScript supported by this plugin is 2.7.x (in line with typescript-eslint-parser’s TypeScript support)
  • Updated dependencies that support the new ESLint documentation URL metadata. Errors from these plugins are accompanied by a link to the documentation for the broken rule.
  • Dependencies are now strictly versioned for tighter control over the exact rules the plugin enforces.
Package old new
eslint-plugin-ava ^4.4.0 4.5.1
eslint-plugin-import ^2.8.0 2.9.0
eslint-plugin-jest ^21.5.0 21.14.1
eslint-plugin-lodash ^2.5.0 2.6.1
eslint-plugin-node ^5.2.1 6.0.1
eslint-plugin-prettier ^2.4.0 2.6.0
eslint-plugin-promise ^3.6.0 3.7.0
eslint-plugin-react ^7.5.1 7.7.0
eslint-plugin-typescript ^0.8.1 0.10.0

19.0.1 - 2018-03-12

Fixed

  • shopify/jsx-no-hardcoded-content rule now does not warn on all-whitespace strings as children. This was causing issues with indented JSX content, and is typically not an issue for different locales.

19.0.0 - 2018-01-17

Added

Changed

  • Updated dependencies to their latest versions (full details in #63)
  • Breaking: node.js minimum supported node version update to 8.9.4 (LTS).
  • Breaking: Changed eslint-config-shopify codebase to trailingComma: 'all' and drop support for Node.js 6
  • Breaking: Updated prettier to 1.9.2, introducing a change in function parens style (set to arrowParens: 'always'):

      // Before
      const foo = myArray.map(foo => {});
    
      // After
      const foo = myArray.map((foo) => {});

    ⚠️ Upgrade path

    Your project config files (package.json, .prettierrc, .eslintrc…) may need to be updated like so:

         "singleQuote": true,
         "bracketSpacing": false,
         "trailingComma": "all",
      +  "arrowParens": "always"
  • Prettified source files using the new config

18.3.1 - 2017-12-21

Changed

  • Changed eslint-config-shopify codebase to follow es5 trailingComma [#61]

18.3.0 - 2017-12-18

Added

  • Added shopify/no-debugger, which behaves the same as ESLint's no-debugger but without a fixer.

18.2.0 - 2017-12-04

Added

  • Added a typescript-prettier config to run prettier against typescript projects.

18.1.0 - 2017-12-01

Added

  • Added a typescript and typescript-react config [#54]

Changed

  • plugin:shopify/prettier will now enforce trailing commas in function parameter calls [#55]
  • comma-dangle will now enforce multi-line function parameters [#55]
  • Removed plugin:shopify/esnext as an included extension of the plugin:shopify/prettier config. plugin:shopify/esnext must now be extended by the consumer to use the plugin:shopify/prettier. [#53]

    Example (package.json):

    "eslintConfig": {
      "extends": [
        "plugin:shopify/esnext",
        "plugin:shopify/prettier"
      ]
    }

18.0.0 - 2017-10-31

Changed

  • Turned off class-methods-use-this

17.2.1 - 2017-10-30

Changed

  • Turned off babel/semi rule in prettier config

[17.2.0] - 2017-10-25

Added

  • Added a prettier config [#46]

Example:

"eslintConfig": {
  "extends": [
    "plugin:shopify/prettier"
  ]
}

Changed

  • Replace all warn with error [#48]
  • space-before-function-paren now uses asyncArrow option (eg. async () => {}) [#43]
  • Enable padding-line-between-statements for directives. [#44]

Removed

  • lines-around-directive was deprecated in ESLint v4.0.0. [#44]

[17.1.0] - 2017-09-19

Added

  • New rules (#41):
    • import/no-anonymous-default-export
    • jsx-a11y/anchor-is-valid
    • no-buffer-constructor
    • node/no-extraneous-import (disabled)
    • node/no-extraneous-require
    • for-direction
    • getter-return
    • react/boolean-prop-naming (disabled)
    • react/default-props-match-prop-types
    • react/no-redundant-should-component-update
    • react/no-typos
    • react/no-unused-state
    • react/jsx-closing-tag-location
    • array-bracket-newline (disabled)
    • array-element-newline (disabled)
    • function-paren-newline
    • padding-line-between-statements (disabled)
    • semi-style
    • switch-colon-spacing

Changed

  • Updated dependencies (#41):
    • eslint
    • babel-eslint
    • eslint-plugin-import
    • eslint-plugin-jsx-a11y
    • eslint-plugin-node
    • eslint-plugin-react
  • jquery-dollar-sign-reference no longer flags assignments from await expressions

Removed

  • jsx-a11y/href-no-hash replaced with jsx-a11y/anchor-is-valid

[17.0.0] - 2017-08-17

Changed

  • eslint upgrade to 4.3.0
  • node.js minimum supported node version update to 6.11.1 (LTS).
  • Update dependencies:
    • eslint-plugin-ava: ^4.2.0^4.2.1.
    • eslint-plugin-babel: ^4.1.1^4.1.2.
    • eslint-plugin-lodash: ^2.4.2^2.4.4.
    • eslint-plugin-mocha: ^4.9.0^4.11.0.
    • eslint-plugin-node: ^4.2.2^4.2.3.
    • eslint-plugin-react: ^7.0.0^7.0.1.

[16.0.1] - 2017-05-29

Changed

[16.0.0] - 2017-05-16

Added

Removed

[15.2.0] - 2017-03-06

Changed

  • eslint upgrade to 3.17.x

[15.1.2] - 2017-02-23

Fixed

  • jquery-dollar-sign-reference now checks assignments from LogicalExpression / BinaryExpression

[15.1.1] - 2017-01-17

Added

  • Added eslint-index package (#4)
  • Added rules-status and rules-omitted scripts (#4)
  • Added new eslint-plugin-react rules: no-array-index-key, require-default-props (#4)
  • Added new eslint-plugin-lodash rules: import-scope (#4)
  • Added new eslint-plugin-promise rules: no-return-wrap, no-nesting, no-promise-in-callback, no-callback-in-promise, avoid-new, prefer-await-to-then, prefer-await-to-callbacks (#4)

Changed

  • Updated eslint-plugin-flowtype, eslint-plugin-lodash, eslint-plugin-mocha, eslint-plugin-promise, eslint-plugin-react to their latest versions (#4)
  • Updated react/prefer-stateless-function rule to include ignorePureComponents flag (#4)

Removed

  • Removed eslint-find-rules package (#4)

Pre-15.1.1 Changelog

Changes were originally tracked in Shopify's JavaScript monorepo.