diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..19b12a3 --- /dev/null +++ b/.babelrc @@ -0,0 +1,25 @@ +{ + "presets": [ + [ + "env", + { + "node": 6 + } + ] + ], + + "plugins": [ + "transform-runtime", + "transform-flow-strip-types", + "transform-object-rest-spread", + "inline-package-json" + ], + "env": { + // jest needs this + "test": { + "plugins": [ + "transform-es2015-modules-commonjs" + ] + } + } +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..03ab589 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +; http://EditorConfig.org + +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[package.json] +indent_size = 2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..2c189a3 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +flow-typed/* +dist/* +flow-coverage/* +coverage/* diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f006e5d --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,114 @@ +module.exports = { + root: true, + + extends: [ + 'airbnb', + 'plugin:flowtype/recommended', + 'plugin:jest/recommended', + ], + + plugins: [ + 'flowtype', + 'jest', + ], + + env: { + 'jest': true, + }, + + // overrides the airbnb ruleset + rules: { + // 4-space indent + 'indent': ['error', 4, { SwitchCase: 1 }], + + // require space before function opening parenthesis + 'space-before-function-paren': ['error', 'always'], + + // allow console methods + 'no-console': 'off', + + // quote all or no props in an object, disallow mixing + 'quote-props': ['error', 'consistent'], + + // never assign to a fn param, but allow assignment to its props + 'no-param-reassign': ['error', { 'props': false }], + + // allow padded blocks + 'padded-blocks': 'off', + + // enforce braces + 'curly': ['error', 'all'], + + // check that when we import default from our own code, there's a default export + 'import/default': 'error', + + // check that named imports exist in the exports + 'import/named': 'error', + + // check that wildcard imports '* as foo' exist when dereferenced + 'import/namespace': 'error', + + // check that external modules are referenced directly in package.json + // as dependencies, devDependencies or optionalDependencies. + 'import/no-extraneous-dependencies': ['error', { + 'devDependencies': true, + 'optionalDependencies': true, + }], + + // disallow use of exported name as name of default import, + // as it's likely you missed some brackets. + 'import/no-named-as-default': 'error', + + // imports always come first + 'import/imports-first': ['error', ''], + + // disallow use of exported name as property on the default export, + // as this is likely to confuse. + 'import/no-named-as-default-member': 'error', + + // ensure imports are in a consistent order: + 'import/order': ['error', { + 'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + }], + + // must separate imports from rest of code + 'import/newline-after-import': 'error', + + // import must include extensions for all files except these + "import/extensions": [ + "error", + "always", + { + "js": "never", + "jsx": "never", + "es": "never" + } + ], + + // allow dynamic requires + "import/no-dynamic-require": 'off', + + // allow 'require' anywhere + 'global-require': 'off', + + 'no-underscore-dangle': ['error', { + 'allowAfterThis': false, + 'allow': [ + '__', // for Ramda's R.__ + ], + }], + + 'no-warning-comments': [ + 'warn', { + 'terms': ['::TODO::'], + 'location': 'start', + } + ], + + 'generator-star-spacing': ['error', { 'before': true, 'after': true }], + }, + + // add as they're encountered + globals: { + }, +}; diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..1d5bc50 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,26 @@ +# for third-party modules that use flow, you need to let flow do its thing: +# so you shouldn't ignore the entirety of node_modules. +# however, you might have to adjust the [ignore] etc sections HERE +# to account for what those modules need. for example, if a module +# uses a magic marker to ignore certain flow errors, you need to include +# that magic string HERE too. +[ignore] +/dist/.* + +# error in a json file +/node_modules/conventional-changelog-core/.* + +# error in src/lib/flow.js +/node_modules/flow-coverage-report/.* + +[include] + +[libs] +flow-typed/ + +[options] +# we import eg config files via variable +module.ignore_non_literal_requires=true + +# used by flow-coverage-report +suppress_comment=.*\\$FLOW_FIXME diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7979964 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +/dist/ +/flow-coverage/ +/coverage/ +npm-debug.log diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..8c73982 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 David Smith + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3092e2e --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# riw + +riw ("`react-intl` workflow") is a set of command-line tools and a library to help you work with `react-intl` in a React app. Use it to: + +- Define target locales for your app: the locales into which you translate the app. +- Extract `react-intl` message descriptors from your React components, directly or indirectly. +- Check for duplicates in your `react-intl` message descriptor ids. +- Manage translations for each target locale. +- Generate JSON files for your translations, to include in your app. + +This project is not associated with the `react-intl` project. + +The word "riw" seems to be Welsh for slope or hill, and rhymes with the English word "drew". + +There's an example repository, [`riw-example`](https://github.com/avaragado/riw-example), showing (in its commit history) how to migrate a simple React app with hard-coded strings to `react-intl`, and then how to use riw with it. + + +## Which problems doesn't riw solve? + +- riw doesn't perform any automated text translation or interface with any translators or translation services. It tells you which messages need translating, lets you update its translations database with the translations once you have them, and produces shippable, `react-intl`-compatible JSON files for each locale you want to support. + +- riw doesn't provide a mechanism for generating unique `react-intl` message descriptor ids. How you define these depends on your app's requirements. However, it does let you identify any duplicate ids. ([See the FAQ](doc/faq.md) for a possible naming scheme.) + +- riw doesn't import the generated JSON locale files into your app or plug them into `react-intl`'s `IntlProvider`. You implement this behaviour yourself. + + +## Assumptions + +riw assumes you're familiar with `react-intl`, and that your app already uses a build system of some kind (for example, webpack). + + +## TL;DR + +1. `yarn add --dev riw` +1. Add to `package.json`: + ```json5 + "riw": { + "defaultLocale": "en-US", // locale of the source strings + "targetLocales": ["fr-FR", "pt-BR", ...], // other locales the app should support + } + ``` +1. `yarn run riw db init` – initialise empty db at `src/locale/riw-db.json` +1. `yarn run riw app translate` – outputs `src/locale/[locale].json` and `src/locale/TODO-untranslated.json` (might need to add a `.babelrc` in your app) +1. Update your app to import strings from `src/locale/[locale].json` for each target locale, and plug them into `react-intl`'s `IntlProvider` at the appropriate time. +1. LOOP: +1. Translate everything in the `TODO-untranslated.json` file. Meanwhile, keep developing your app in the usual way. +1. `yarn run riw db import TODO-with-translations.json` if you have a file of them in the right format, or +1. `yarn run riw db update ` to update the db string by string. +1. `yarn run riw app translate` +1. Go to LOOP. + +Check everything into source control. There are no temporary files. + +## More information + +- [Installing, configuring and using riw](doc/tutorial.md) +- [Configuration settings](doc/config.md) +- [FAQ/troubleshooting](doc/faq.md) +- [Using riw programmatically](doc/library.md) +- [Example repository showing how to add react-intl and riw to a React app](https://github.com/avaragado/riw-example) diff --git a/doc/config.md b/doc/config.md new file mode 100644 index 0000000..41cea9a --- /dev/null +++ b/doc/config.md @@ -0,0 +1,114 @@ +# riw configuration + +## Location + +You can place riw configuration in: + +- **Either** a configuration file of your choosing (which you specify with the `--config` option whenever you run the `riw` command) +- **Or** the file `.riw-config.js` at the root of your package (in the same directory as your `package.json`) +- **Or** under the `riw` key in your `package.json` + +The `riw` command looks for configuration in the order shown above. If you include configuration in more than one location, only the first configuration found is used. + +Your configuration settings override the built-in defaults. To see the full configuration in use, including your overrides, use the `riw print-config` command (with the `--config` option if necessary). + + +## Configuration file type + +If you use a standalone configuration file (either `.riw-config.js` or one you specify using `--config`), riw expects this to be a node module that exports an object. + +For the `package.json` file's `riw` key, you may use only JSON data. + + +## Configuration options + +For options with type `Path` or `Glob`, the string value is a filesystem path. Relative paths are treated as relative to the configuration file. + +### `defaultLocale` + +- Type: `LocaleId` +- Default value: `en-US` + +The locale id that riw assigns to every `react-intl` message descriptor's `defaultMessage`. + +### `targetLocales` + +- Type: `LocaleId[]` +- Default value: `[]` + +The locales you want to translate to for this app. The riw translations database may contain locales not in this list (because apps can share databases). + +### `translationsDatabaseFile` + +- Type: `Path` +- Default value: `src/locale/riw-db.json` + +The filesystem path to the translations database used by riw. Multiple apps can share the same translations database, with different target locales. + +### `sourceDirs` + +- Type: `Glob[]` +- Default value: `['src/**/*.js']` +- Ignored if `inputMode` is not `source`. + +Array of glob patterns identifying your source files. + +When `inputMode` is `source`, riw parses all files matching this pattern looking for `react-intl` message descriptors to translate. (riw uses `babel-plugin-react-intl` to perform the parsing.) + + +### `collateDir` + +- Type: `Path` +- Default value: `tmp/babel-plugin-react-intl` +- Ignored if `inputMode` is not `json`. + +The filesystem path to a directory containing JSON files (in any tree structure). Each file is assumed to contain the output of `babel-plugin-react-intl`: an array of `react-intl` message descriptors. + +When `inputMode` is `json`, riw collates these JSON files for translation and does not read your source files. + + +### `inputMode` + +- Type: `source` | `json` +- Default value: `source` + +How riw should locate the `react-intl` message descriptors to translate. + +- Use `source` and set `sourceDirs` if you want riw to extract message descriptors from your source files using `babel-plugin-react-intl`. +- Use `json` and set `collateDir` if you want riw to use message descriptors already extracted from your source files by another process, for example webpack. + +### `translationsOutputFile` + +- Type: `Path` +- Default value: `src/locale/[locale].json` +- Ignored if `outputMode` is `no-file`. + +The filesystem path template that identifies where riw saves translations. Use the placeholder `[locale]` literally: riw replaces this as necessary. + +- When `outputMode` is `file-per-locale`, riw replaces `[locale]` with the appropriate locale id. +- When `outputMode` is `single-file`, riw replaces `[locale]` with the literal string `locales`. + + +### `todoFile` + +- Type: `Path` +- Default value: `src/locale/TODO-untranslated.json` +- Ignored if `outputMode` is `no-file`. + +The filesystem path that identifies where riw saves message descriptor and locale data for messages that still need to be translated into some or all of your target locales. + + +### `outputMode` + +- Type: `single-file` | `file-per-locale` | `no-file` +- Default value: `file-per-locale` + +How riw outputs translated strings for your app. + +riw processes your app's `react-intl` message descriptors (found according to `inputMode`) and the configured translations database to discover matching translations. This setting determines whether and how riw should write those translations to disk. + +- Use `single-file` and set `translationsOutputFile` if you want riw to save translations for all locales in one file. This option is best if your app ships with every locale embedded statically (for example, an app built with Electron). +- Use `file-per-locale` and set `translationsOutputFile` if you want riw to save translations for each locale in a separate file. This option is best if your app loads locale information on demand (for example, a web app). +- Use `no-file` and ignore `translationsOutputFile` if you don't want riw to save the translations. This option is best if you're using the riw API directly. + +If `outputMode` is `single-file` or `file-per-locale`, riw saves message descriptor and locale data for untranslated messages in the configured `todoFile`. If `outputMode` is `no-file`, this data is not saved to a file. diff --git a/doc/developer-notes.md b/doc/developer-notes.md new file mode 100644 index 0000000..7bd0aa8 --- /dev/null +++ b/doc/developer-notes.md @@ -0,0 +1,68 @@ +# Developer notes + +## Building and testing + +The package uses [`nps`](https://www.npmjs.com/package/nps) as a layer above npm scripts. See [`package-scripts.js`](../package-scripts.js) for all the build targets. Common targets: + +```bash +$ nps b # or nps build - full build with linting and tests +$ nps b.q # or nps build.quick - build without linting or tests +$ nps l # or nps lint - lint js and check flow types +$ nps l.j # or nps lint.js - lint js only +$ nps t # or nps test - run tests +$ nps t.w # or nps test.watch - test with watch +$ nps f # or nps flow - check flow types +$ nps f.t # or nps flow.typed - update all third-party types via flow-typed +``` + + +## Tests + +The lower-level modules have unit tests, usually based on Jest snapshots. Some of the wiring of these modules also has tests. + +The CLI currently has no tests. + + +## CLI versus library + +The CLI code in `src/bin` uses riw as a library and doesn't delve into the riw innards: only what's exported by `src/index.js` and `src/types.js`. + + +## Variable naming scheme and Flow types + +This repo uses a Hungarian-style naming scheme for variables. This is in addition to [Flow](https://flowtype.org/) types. + +There's a one-to-many mapping between Flow types and variable naming prefixes. For example, both `fabs` and `dabs` variables have type `AbsolutePath`. Not all kinds of variable in the scheme have a dedicated Flow type. Not all Flow types have a naming prefix. + +| Prefix | Flow | Meaning | +| --- | --- | --- | +| `s` | `string` | A plain string | +| `ar` | `Array` | An array of something. eg `ars` is `string[]` (alternate: `s` suffix) | +| `ct` | `number` | An integer number usually indicating a total of some kind | +| `ix` | `number` | An integer index usually into an array for looping purposes, starts at 0 | +| `num` | `number` | An arbitrary number, not a `ct` or an `ix` | +| `is` | `boolean` | True or false | +| `has` | `boolean` | True or false | +| `are` | `boolean` | True or false | +| `json` | `string` | A JSON string (NOT an object) | +| `path` | `Path` | Either a relative or an absolute path, to a file or directory | +| `pabs` | `AbsolutePath` | Absolute path to file or directory | +| `prel` | `RelativePath` | Relative path to file or directory | +| `fabs` | `AbsolutePath` | Absolute path to file, eg `/foo/bar/baz.txt` | +| `frel` | `RelativePath` | Relative path to file, eg `bar/baz.txt` | +| `dabs` | `AbsolutePath` | Absolute path to directory, eg `/foo/bar/` | +| `drel` | `RelativePath` | Relative path to directory, eg `bar/` | +| `db` | `TranslationsDB` | An riw translation database object | +| `opt` | `Object` | An options object; may have a more specific Flow type in some circumstances | +| `quad` | `TranslationQuad` | A tuple describing a default message, description, locale and translation | +| `lid` | `LocaleId` | A locale id, eg `en-gb` or `pt-br` | +| `md` | `MessageDescriptorWithFile` | A `react-intl` message descriptor plus a `file` property indicating the file the message descriptor came from | +| `mdu` | `UntranslatedMessageDescriptor` | A `react-intl` message descriptor plus a `locale` property indicating a locale to which the message descriptor is not yet translated | +| `mdt` | `TranslatedMessageDescriptor` | A `defaultMessage` and (optional) `description` as in a message descriptor, plus a `locale` property and a `translation` property with the message translated to that locale | + + +The `ar` prefix may be used before any of these to indicate an array of that type. For example, `ars` means an array of strings, and `armdt` means an array of translated message descriptors. + +Using both prefixes and Flow types is somewhat redundant, but it helps to have an easy way to name things even if you're locking down the type. Also, some types are simple aliases (eg `AbsolutePath` is just an alias for `string`), and Flow doesn't care if you mix aliases corresponding to the underlying type, so a naming scheme helps here too. + +Functions are often named with a prefix to indicate the return type, and with a suffix to identify the argument type. Usage here is less consistent than with variables, especially as many functions are higher-order and every variation of `createFooMakerFactoryBuilder` is ugly. diff --git a/doc/faq.md b/doc/faq.md new file mode 100644 index 0000000..4fd0baa --- /dev/null +++ b/doc/faq.md @@ -0,0 +1,110 @@ +# FAQ/troubleshooting + +## I get "unexpected token" and a stack trace when I run `riw app translate` + +This might indicate your app doesn't have a `.babelrc` file appropriate to your source files. This can happen if you put all your configuration for babel inside your webpack `babel-loader` configuration. + +riw runs babel itself, to extract your `react-intl` message descriptors, but relies on your app's own babel configuration for the additional presets and plugins your app requires. + +To fix: + +- **Either** add a simple `.babelrc` file appropriate for your source files +- **Or** set up your webpack configuration to use `babel-plugin-react-intl`, and configure riw to pick up your message descriptors from the JSON files output by this plugin. See the `inputMode` setting in [riw configuration](./config.md). In this case you need to create a build in your usual way, using webpack, before running `riw app translate`. + + +## I've made the tiniest change to a default message or a description and the translation is lost! + +It's not lost: it's still in the translations database. But `riw app translate` looks in that database for identical string matches only. riw must work this way as the tiniest change to a default message or a description likely invalidates the translation of that message. It's better for an app to fall back to the message in the default locale than to show a translation that might be out of date in a potentially confusing or dangerous way. + +If you know the default message or description has changed in a way that doesn't affect the translation – for example, if you've changed the name of an argument in braces, or just fixed a typo in a description – then you can edit the database manually (it's just a JSON file). Be sure to rename any changed argument for all locales. + + +## Should I use descriptions or not? + +In `react-intl`, descriptions in message descriptors are optional. This means they're optional with riw too. + +The goal of a description is to give context to a translator. In many cases this is unnecessary. For example, with a message "Are you sure you want to delete the image?" a translator might not need any additional context. + +Context is more important with short messages, especially where words in the default locale act as both verbs and nouns, for example. Also, where messages include arguments in braces, it's often helpful to explain what the argument represents. + +Example: the word "Email" is used in en-gb in multiple ways: + +- noun: A single email, as in "I've sent you an email" +- noun: Multiple emails, as in "I have too much email". +- noun: An email mailbox or email client, as in "Look in your email" +- noun: An email address, as in "What's your email?" +- verb: To send email, as in "Email me". + +If you ask a translator to translate the string "Email", which sense do you mean? Without context, the translator must guess. Don't assume that the translation for one sense can be reused for all other senses, in all other locales you support. + +If there is any chance of ambiguity, add a description. + + +## Can I use objects as descriptions, as `react-intl` allows this? + +Not yet. At the moment, only string descriptions work. + + +## How do I ensure message descriptor ids are unique? + +Each `react-intl` message descriptor must include an id that uniquely identifies the message within your app. It uses this id to identify which string to display. However, `react-intl` does not impose or recommend any naming scheme for ids. riw helps by pointing out, as part of the output of `riw app translate`, if you've used the same id more than once. + +You might want to use a naming scheme to make it easy to select unique ids. + +`react-intl` and riw treat ids as completely opaque: you're free to use whichever naming scheme makes sense for your app. One possible naming scheme is based on the component's location in your repository. For example, you might have a repository that looks like this (ignoring irrelevant files): + +``` +src +├── route1 +│   └── components +│ ├── MyComponent1.js +│ └── MyComponent2.js +├── route2 +│   └── components +│ └── MyComponent1.js +└── route3 + └── components + ├── MyComponent1.js + ├── MyComponent2.js + └── MyComponent3.js +``` + +Your id algorithm could be: + +1. Take the path to the component file within the repository. For example, `src/route2/components/MyComponent1.js`. +1. Remove the `src/` prefix and `.js` suffix: `route2/components/MyComponent1` +1. Add a suffix, unique within the component, for each string used by the component: `route2/components/MyComponent1/title`, `route2/components/MyComponent1/button/cancel`, `route2/components/MyComponent1/button/ok`, and so on. + +Translation services typically also require or allow you to supply an id with each string that needs translation. This is another way to include some context with a string to help translators understand its usage. For example, the ids used above include `button` to indicate the string corresponds to a button label (and these are almost always verbs). + + +## How do I check the translations returned by a translator/translation service? + +Translations need two kinds of checks: **sanity** checks and **quality** checks. + +Only a native speaker of the language – who should be someone other than the translator – can perform a reliable quality check. With some translation services you can request a quality check as part of the process. If you don't do this, and don't include your own quality check as part of your integration process for newly translated strings, then you're forcing your users and potential users to check the quality of your translations, and you're relying on them to report any issues. + +In contrast, careful developers can perform sanity checks of translations even if they don't understand the language. Here's a rough checklist: + +- Check for "translations" that are just the default message copied and pasted. This might indicate the translator couldn't understand the default message. Query these with the translation service (in particular, you may have paid for this non-translation). +- Check for broken HTML entities. For example, you might see `& mdash;` or `&mdash` instead of `—`. You can fix these with care. +- Check for broken HTML tags. For example, you might see ``. You can fix these safely, but make sure you only change content inside the tags: between the `<` and the next `>`. +- Check for unexpected newlines. For example, you might see a CR or LF in a translation where the default message had no such character. The presence of these might not matter – it depends on the usage – but it might indicate the translator struggled with the translation. Consider removing these rogue characters or replacing with spaces. +- Check for translation or mangling of your product name. Typically you won't want to translate a product name, but translators often don't realise this or don't recognise your product name. In some cases you might by contrast _require_ a localised product name (for example, for legal reasons). +- Check for mangled arguments. For example, where the default message `Hello { name }!` has become `Bonjour name!` or `Bonjour { name }}!`. You can fix these with care. +- Check for translated arguments. For example, where the default message `Hello { name }!` has become `Bonjour { nom }!`. You can fix these with care. +- Check for proper formatting of more complex ICU Message syntax. For example, where the default message `{numFiles, plural, one {one file} other {# files}}` has become something like `{numFiles, Plural, ein {eine Datei} andere {# Dateien}}` (too many parts translated) or `{numFiles, plural, um {one file} outros {# files}}` (the wrong parts translated). This indicates the translator doesn't understand ICU Message syntax. You can fix the "too many parts translated" case, with care, but can't fix the "wrong parts translated" case: query these with the translation service. + + +## What happens with branching and merging? + +You can continue to use riw on branched code. riw doesn't hold any internal persistent state that might send it wonky on branches. There might conceivably be issues if different versions of riw are used on different branches. + +riw needs to be able to read its configuration, your `react-intl` message descriptors, and its translations database, and it needs to be able to write to its translations database and its output files: as long as this is all possible, riw is happy. + +When you merge two branches, you may see conflicts as usual. + +- Conflicts inside the riw translations database: you need to fix these manually. It's just a JSON file. +- Conflicts inside the riw configuration: you need to fix these manually. In `package.json` this is simple JSON. Elsewhere, it's JavaScript exporting an object. +- Conflicts inside the riw output files: ignore these, and run `riw app translate` once conflicts elsewhere are resolved. + diff --git a/doc/library.md b/doc/library.md new file mode 100644 index 0000000..b3039b7 --- /dev/null +++ b/doc/library.md @@ -0,0 +1,16 @@ +# Using riw programmatically + +This document assumes you've read [Installing, configuring and using riw](doc/tutorial.md). + + +```js +import createRIW from 'riw'; + +const riw = createRIW(configOverrides); + +// riw.db.update(...) +// riw.db.find(...) +// etc +``` + +::TODO:: diff --git a/doc/tutorial.md b/doc/tutorial.md new file mode 100644 index 0000000..64c29aa --- /dev/null +++ b/doc/tutorial.md @@ -0,0 +1,281 @@ +# Installing, configuring and using riw + +## Overview + +A React app usually consists of a large number of components. Each component may display messages to the user. When we internationalise a component with `react-intl` we typically remove these strings from the innards of a render method and define them separately, but nearby, as `react-intl` message descriptors: objects with a unique id, default message (the string), and optional description (important context for translators). + +Default message strings within message descriptors typically have three purposes: + +- As **fallbacks**, for use if `react-intl` can't find a string with the correct message descriptor id from the currently defined id/string mappings plugged into `IntlProvider`. +- As strings in the **default locale** (AKA base locale, master locale, source locale). If your developers or UX engineers use `en-GB` for these strings, consciously or unconsciously, your default locale is `en-GB`. +- As the **translation source**, together with any associated descriptions, supplied to a translation service. + +With `react-intl`, to translate a component you need to: + +1. Extract each "default locale" string for that component +1. Find a translation for that string in each locale you want your app to support +1. Store the translation in a file your app can load at the right time and then plug in to `IntlProvider`. + +**riw helps you do all three**. It can't perform the translation itself, but it can look up translations already performed (it maintains a database), and it outputs the strings that still need to be translated. + +riw also gives you housekeeping tools: for checking how complete your translations are, for modifying its database, and so on. + +Importantly, riw fits into your current development process and does not constrain it. Used at appropriate times, riw can ensure you ship only the translations you need, and never ship any out-of-date translations. + + +## Concepts and jargon + +- **App**: The software being translated. Usually equivalent to an npm module with a `package.json` file. Each app has its own riw configuration settings, and several apps may share a translations database. + +- **Translations database**: The JSON file containing the master list of default messages and any associated descriptions, plus the available translations of those messages into one or more locales. riw reads and writes to this database. One database may be used by one or more app. + +- **Default locale**: The locale of your app's `react-intl` default messages (the `defaultMessage` strings of message descriptors). This is usually but not necessarily a user-selectable locale for your app. + +- **Target locale**: A locale you want your app to support (other than the default locale). + +- **Locale id**: This document uses `ll-tt` format for locale ids: lower case for locale and for territory/region, with a dash as separator. You can use any string format you want, eg `lll_TTT`, BUT you must be consistent. In particular, you must use the same format in your app and for the translations database. + +## Using riw + +If you enjoy scrolling through diffs, the [riw-example](https://github.com/avaragado/riw-example) repostory shows how to take a simple React app with hardcoded strings, internationalise it with `react-intl`, and then use it with riw. + +Meanwhile, here's the view from 10,000 feet: + +1. Install riw +1. Define your riw configuration settings – primarily the default and target locales +1. Initialise the riw translations database +1. Initialise the riw output files +1. Update your app to load strings from the output files +1. Forever: + 1. Translate the untranslated strings, while continuing to develop the app normally + 1. Update the riw translations database + 1. Regenerate the riw output files + 1. Maybe ship + +Let's look at each of these in turn. + +### ➊ Install riw + +You can install riw as a package dependency or globally. + +```bash +$ yarn add --dev riw # or yarn global add riw +``` + +or + +```bash +$ npm install --save-dev riw # use npm -g for global +``` + +If installed globally, `riw` does NOT defer to a local package dependency if there is one. These instructions assume you've installed riw as a package dependency. + +Installing riw gives you a script for use from the command line, and a [library for use programmatically](./library.md). + +The script is installed at `node_modules/.bin/riw`. Users of `yarn` can run the script easily: + +```bash +$ yarn run riw +``` + +### ➋ Define your riw configuration settings + +riw has a small number of [configuration settings](./config.md), and you can store them in one of several locations: + +| Location | Description | +| --- | --- | +| Under the `riw` key of your `package.json` file | Recommended | +| As the default export of a module `.riw-config.js` in the same directory as your `package.json` file | Use this if you need to derive any configuration settings programmatically | +| As the default export of a module elsewhere | Use this if you can't use either method above. You'll need to run the `riw` command with the `--config` option to locate the file. | + +riw doesn't combine these locations: if you specify `--config`, riw won't look in `package.json` or `.riw-config.js`. If you omit `--config` and there's a `.riw-config` file, riw won't look in `package.json`. + +riw uses the configuration from one of these locations to override the default settings. See [riw configuration](./config.md) for all the settings and their defaults. + +Make sure you check your configuration settings into git, or whichever source control system you use. + +Once riw is installed, you can see the current configuration settings in full using `riw print-config`. For example: + +``` +$ riw print-config +{ + "rootDir": "/Users/avaragado/my-react-app", + "defaultLocale": "en-US", + "targetLocales": [], + "translationsDatabaseFile": "src/locale/riw-db.json", + "sourceDirs": [ + "src/**/*.js" + ], + "collateDir": "tmp/babel-plugin-react-intl", + "inputMode": "source", + "translationsOutputFile": "src/locale/[locale].json", + "outputMode": "file-per-locale", + "todoFile": "src/locale/TODO-untranslated.json", + "configFile": "/Users/avaragado/my-react-app/package.json" +} +``` + +Relative paths in your configuration settings are treated as relative to the `rootDir` output by `riw print-config`. + +The most likely settings you'll want to override are: + +- `targetLocales`: The value is an array of locale ids. For example: `["fr-FR", "pt-BR"]` for French in France, and Brazilian Portuguese. +- `defaultLocale`: this defaults to `en-US` but your app might use another locale. + + +### ➌ Initialise the riw translations database + +Many apps can share a translations database, potentially reducing translation costs. If you already have a translations database, include the path in your riw configuration settings and ignore this section. + +If you don't already have a translations database, set one up now: + +```bash +$ riw db init +``` + +With the default configuration settings, you'll now have a small file `src/locale/riw-db.json`. Check the file into source control. + +Later, we'll explore what you can do with the database. + + +### ➍ Initialise the riw output files + +Now we have some configuration settings and a database, we can run riw's most interesting command: + +```bash +$ riw app translate +``` + +Depending on the size of your app, this might take some time to complete. This command: + +1. Finds all `react-intl` message descriptors in your app. (By default, it uses the `react-intl` babel plugin to extract them from your code. If you have a build system that already does this, you can instead configure riw to pick up the JSON files this plugin outputs.) +1. Reports any duplicate message descriptor ids it finds. (`react-intl` leaves ids up to you, and it's easy to accidentally duplicate them, leading to confusing messages in your app.) +1. Looks up every message descriptor's defaultMessage and description (if present) in the translations database, for each of your app's target locales. + - If a match is found, it's output in the appropriate locale file. + - If no match is found, it's added to the TODO file. +1. Reports all the results. + +(If you see an "unexpected token" error with a stack trace on running `riw app translate`, you might need to add a `.babelrc` file. [See the FAQ](./faq.md).) + +Here's some example output: + +```bash +✔ Found 943 message descriptors from 711 files +✔ No duplicate message descriptor ids +✖ Missing translations: 4715 +✔ Saved /Users/avaragado/my-react-app/src/locale/fr-FR.json +✔ Saved /Users/avaragado/my-react-app/src/locale/es-ES.json +✔ Saved /Users/avaragado/my-react-app/src/locale/de-DE.json +✔ Saved /Users/avaragado/my-react-app/src/locale/pt-BR.json +✔ Saved /Users/avaragado/my-react-app/src/locale/ja-JP.json +✔ Saved /Users/avaragado/my-react-app/src/locale/en-US.json +✔ Saved /Users/avaragado/my-react-app/src/locale/TODO-untranslated.json +``` + +Unsurprisingly, as your translations database is empty, you have lots of missing translations! If you look at the files in `src/locale`, you'll see that most of them are small: empty objects, `{}`. + +However, the file for your default locale is complete: it contains mappings from `react-intl` id to strings for all the default messages currently defined in your code. + +All the missing translations are in the TODO file, by default `src/locale/TODO-untranslated.json`, as an array of objects. Each object includes the `react-intl` id, default message and description (if defined), plus the file the message came from and the locale it needs to be translated into. Here's an example: + +```json +{ + "id": "app.greeting", + "defaultMessage": "Welcome to my wonderful app", + "description": "Main body heading after user logs in", + "file": "/Users/avaragado/my-react-app/src/components/Welcome.js", + "locale": "fr-FR" +}, +``` + +Check all these files into your source control system. + +### ➎ Update your app to load strings from the output files + +... and plug those strings and the current locale into the `react-intl` `IntlProvider` component. + +How you do this depends on your app. + +- You might load the strings for each locale **dynamically** using `require.ensure` or another mechanism. This is most appropriate for web apps, to reduce startup payload. +- You might load all strings **statically**. This is most appropriate for Electron-based apps, where startup payload isn't as much of an issue. In this case, you might want to configure riw with `outputMode` set to `single-file`: in this mode, riw puts all strings for all locales in a single JSON file. + +If your app uses `redux` to manage state, we recommend you store all (currently loaded) strings in state, indexed by locale, together with a record of the current locale. Use the `connect` function from `react-redux` with suitable state selectors to supply `IntlProvider` with the strings for the current locale. + +This connected component should render something like this: + +```jsx + + ... + +``` + +where `idLocale` is the locale id, and `messages` is the object of id/string mappings for that locale. + +Setting the `key` prop to `idLocale` ensures that when the locale id changes, the **entire subtree** correctly rerenders. See [`react-intl` issue 243](https://github.com/yahoo/react-intl/issues/243#issuecomment-166030664) for a discussion. + +### ➏.➊ Translate the untranslated strings, while continuing to develop the app normally + +Depending on your translation service and the number of translations required, it might take hours or days to translate the strings. You can continue developing your app while translation takes place. Bear in mind this might obsolete some of the translations in progress, but it doesn't affect how you use riw. + +Different translation services have different requirements. The objects in the TODO file should contain everything your translators need. + +(For reasons of sanity, we recommend you don't overlap requests to your translation service: wait until one request is complete before sending another. Consider reducing each request to a smaller batch of strings if you start feeling the urge to overlap requests.) + +### ➏.➋ Update the riw translations database + +**Caution** Sanity check all results from translators. [See the FAQ](./faq.md) for tips. + +Translation services return completed translations in different ways. riw needs this data for each string: + +- The string in the default locale that was supplied to the translation service +- The description that was supplied to the translation service, if any +- The locale for the translation +- The result of the translation + +The ideal format: a JSON file with an array of objects, where each object has _at least_ the properties `defaultMessage`, `description` (if supplied to translators), `locale`, and `translation`. (The TODO file, augmented with a `translation` property for each object, works well.) + +If you have a file in the ideal format, say `TODO-with-translations.json`, you can update the translations database with the command: + +```bash +$ riw db import TODO-with-translations.json +``` + +If you can't produce a file in the suitable format for `riw db import`, you can update the database string by string using `riw db update`. For example: + +```bash +$ riw db update --defaultMessage "Welcome to my wonderful app" --description "Main body heading after user logs in" --locale fr-FR --translation "Bienvenue dans ma merveilleuse application" +``` + +Check any changes to the translations database into source control. + +Other useful `riw db` commands: + +- `riw db list` shows entries matching certain criteria +- `riw db delete` deletes entries matching certain criteria +- `riw db status` shows information about the database such as the locales it contains and how complete each locale is + +Use `riw db --help` for usage information. + +### ➏.➌ Regenerate the riw output files + +After updating the translations database, regenerate the output files to bring them up to date: + +```bash +$ riw app translate +``` + +Take a look at the output files in `src/locale/` to see how they've changed, and remember to check them into source control. + +As this command extracts default messages from your source files, and those source files may have changed since you last ran the command, the TODO file generated this time may not be empty even if you fully translated the last TODO file. + +At any time you can run `riw app status` to see the current state of your output files. This command warns if it thinks you need to run `riw app translate` – for example, if it looks like the database or the source files have changed since you last ran `riw app translate`, or if your riw configuration has changed. + +If you remove a target locale, `riw app translate` does not remove that locale's output file, and `riw app status` ignores it. You can remove it if you want. + +### ➏.➍ Maybe ship + +The best time to ship a release is just after running `riw app translate`. All the generated files correspond to the source files at the time you run the command, and so contain only those strings you need, and no out-of-date strings in any locale. + +Conversely, it's unwise to ship without running `riw app translate`: you may be shipping redundant and out-of-date strings. + +After shipping (or not), the cycle begins again: translate untranslated strings and develop the app normally (back to ➏.➊). diff --git a/flow-typed/npm/babel-cli_vx.x.x.js b/flow-typed/npm/babel-cli_vx.x.x.js new file mode 100644 index 0000000..f3b497c --- /dev/null +++ b/flow-typed/npm/babel-cli_vx.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: 7d849cdb4b364b1c958375acccf2cf3c +// flow-typed version: <>/babel-cli_v^6.24.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-cli' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-cli' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-cli/bin/babel-doctor' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/_babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/dir' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/file' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/index' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-cli/bin/babel-doctor.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>; +} +declare module 'babel-cli/bin/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>; +} +declare module 'babel-cli/bin/babel-node.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-node'>; +} +declare module 'babel-cli/bin/babel.js' { + declare module.exports: $Exports<'babel-cli/bin/babel'>; +} +declare module 'babel-cli/index' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/index.js' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/lib/_babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/_babel-node'>; +} +declare module 'babel-cli/lib/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>; +} +declare module 'babel-cli/lib/babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-node'>; +} +declare module 'babel-cli/lib/babel/dir.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/dir'>; +} +declare module 'babel-cli/lib/babel/file.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/file'>; +} +declare module 'babel-cli/lib/babel/index.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/index'>; +} +declare module 'babel-cli/lib/babel/util.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/util'>; +} diff --git a/flow-typed/npm/babel-core_vx.x.x.js b/flow-typed/npm/babel-core_vx.x.x.js new file mode 100644 index 0000000..2fe823c --- /dev/null +++ b/flow-typed/npm/babel-core_vx.x.x.js @@ -0,0 +1,227 @@ +// flow-typed signature: 618de834b2dc29cb3524980de4a785b7 +// flow-typed version: <>/babel-core_v^6.24.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-core' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-core' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-core/lib/api/browser' { + declare module.exports: any; +} + +declare module 'babel-core/lib/api/node' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/get-possible-plugin-names' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/get-possible-preset-names' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/merge' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/normalize-ast' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/resolve-from-possible-names' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/resolve-plugin' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/resolve-preset' { + declare module.exports: any; +} + +declare module 'babel-core/lib/helpers/resolve' { + declare module.exports: any; +} + +declare module 'babel-core/lib/store' { + declare module.exports: any; +} + +declare module 'babel-core/lib/tools/build-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/logger' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/metadata' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/build-config-chain' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/config' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/index' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/option-manager' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/parsers' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/file/options/removed' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/pipeline' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin-pass' { + declare module.exports: any; +} + +declare module 'babel-core/lib/transformation/plugin' { + declare module.exports: any; +} + +declare module 'babel-core/lib/util' { + declare module.exports: any; +} + +declare module 'babel-core/register' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-core/index' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/index.js' { + declare module.exports: $Exports<'babel-core'>; +} +declare module 'babel-core/lib/api/browser.js' { + declare module.exports: $Exports<'babel-core/lib/api/browser'>; +} +declare module 'babel-core/lib/api/node.js' { + declare module.exports: $Exports<'babel-core/lib/api/node'>; +} +declare module 'babel-core/lib/helpers/get-possible-plugin-names.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/get-possible-plugin-names'>; +} +declare module 'babel-core/lib/helpers/get-possible-preset-names.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/get-possible-preset-names'>; +} +declare module 'babel-core/lib/helpers/merge.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/merge'>; +} +declare module 'babel-core/lib/helpers/normalize-ast.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/normalize-ast'>; +} +declare module 'babel-core/lib/helpers/resolve-from-possible-names.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/resolve-from-possible-names'>; +} +declare module 'babel-core/lib/helpers/resolve-plugin.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/resolve-plugin'>; +} +declare module 'babel-core/lib/helpers/resolve-preset.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/resolve-preset'>; +} +declare module 'babel-core/lib/helpers/resolve.js' { + declare module.exports: $Exports<'babel-core/lib/helpers/resolve'>; +} +declare module 'babel-core/lib/store.js' { + declare module.exports: $Exports<'babel-core/lib/store'>; +} +declare module 'babel-core/lib/tools/build-external-helpers.js' { + declare module.exports: $Exports<'babel-core/lib/tools/build-external-helpers'>; +} +declare module 'babel-core/lib/transformation/file/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/index'>; +} +declare module 'babel-core/lib/transformation/file/logger.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/logger'>; +} +declare module 'babel-core/lib/transformation/file/metadata.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/metadata'>; +} +declare module 'babel-core/lib/transformation/file/options/build-config-chain.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/build-config-chain'>; +} +declare module 'babel-core/lib/transformation/file/options/config.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/config'>; +} +declare module 'babel-core/lib/transformation/file/options/index.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/index'>; +} +declare module 'babel-core/lib/transformation/file/options/option-manager.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/option-manager'>; +} +declare module 'babel-core/lib/transformation/file/options/parsers.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/parsers'>; +} +declare module 'babel-core/lib/transformation/file/options/removed.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/file/options/removed'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/block-hoist.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/block-hoist'>; +} +declare module 'babel-core/lib/transformation/internal-plugins/shadow-functions.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/internal-plugins/shadow-functions'>; +} +declare module 'babel-core/lib/transformation/pipeline.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/pipeline'>; +} +declare module 'babel-core/lib/transformation/plugin-pass.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin-pass'>; +} +declare module 'babel-core/lib/transformation/plugin.js' { + declare module.exports: $Exports<'babel-core/lib/transformation/plugin'>; +} +declare module 'babel-core/lib/util.js' { + declare module.exports: $Exports<'babel-core/lib/util'>; +} +declare module 'babel-core/register.js' { + declare module.exports: $Exports<'babel-core/register'>; +} diff --git a/flow-typed/npm/babel-eslint_vx.x.x.js b/flow-typed/npm/babel-eslint_vx.x.x.js new file mode 100644 index 0000000..ac799c6 --- /dev/null +++ b/flow-typed/npm/babel-eslint_vx.x.x.js @@ -0,0 +1,73 @@ +// flow-typed signature: a5f6e885fd84e3b58ec64b63e5128366 +// flow-typed version: <>/babel-eslint_v^7.2.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-eslint' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-eslint' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-eslint/babylon-to-espree/attachComments' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/convertTemplateType' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/index' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/toAST' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/toToken' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/toTokens' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-eslint/babylon-to-espree/attachComments.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/attachComments'>; +} +declare module 'babel-eslint/babylon-to-espree/convertTemplateType.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/convertTemplateType'>; +} +declare module 'babel-eslint/babylon-to-espree/index.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/index'>; +} +declare module 'babel-eslint/babylon-to-espree/toAST.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toAST'>; +} +declare module 'babel-eslint/babylon-to-espree/toToken.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toToken'>; +} +declare module 'babel-eslint/babylon-to-espree/toTokens.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toTokens'>; +} +declare module 'babel-eslint/index' { + declare module.exports: $Exports<'babel-eslint'>; +} +declare module 'babel-eslint/index.js' { + declare module.exports: $Exports<'babel-eslint'>; +} diff --git a/flow-typed/npm/babel-jest_vx.x.x.js b/flow-typed/npm/babel-jest_vx.x.x.js new file mode 100644 index 0000000..ad4f3b9 --- /dev/null +++ b/flow-typed/npm/babel-jest_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: a64f0ce14b98975fe9ca133bd36d6893 +// flow-typed version: <>/babel-jest_v^19.0.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-jest' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-jest' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-jest/build/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-jest/build/index.js' { + declare module.exports: $Exports<'babel-jest/build/index'>; +} diff --git a/flow-typed/npm/babel-plugin-inline-package-json_vx.x.x.js b/flow-typed/npm/babel-plugin-inline-package-json_vx.x.x.js new file mode 100644 index 0000000..13b4fbb --- /dev/null +++ b/flow-typed/npm/babel-plugin-inline-package-json_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 55533a3e7abe6ffc2ae267732d4b1d1f +// flow-typed version: <>/babel-plugin-inline-package-json_v^2.0.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-inline-package-json' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-inline-package-json' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-inline-package-json/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-inline-package-json/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-inline-package-json/lib/index'>; +} diff --git a/flow-typed/npm/babel-plugin-react-intl_vx.x.x.js b/flow-typed/npm/babel-plugin-react-intl_vx.x.x.js new file mode 100644 index 0000000..9fec390 --- /dev/null +++ b/flow-typed/npm/babel-plugin-react-intl_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: e73b99a7599c68043f7fbfe67b071127 +// flow-typed version: <>/babel-plugin-react-intl_v^2.3.1/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-react-intl' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-react-intl' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-react-intl/lib/index' { + declare module.exports: any; +} + +declare module 'babel-plugin-react-intl/lib/print-icu-message' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-react-intl/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-react-intl/lib/index'>; +} +declare module 'babel-plugin-react-intl/lib/print-icu-message.js' { + declare module.exports: $Exports<'babel-plugin-react-intl/lib/print-icu-message'>; +} diff --git a/flow-typed/npm/babel-plugin-transform-es2015-modules-commonjs_vx.x.x.js b/flow-typed/npm/babel-plugin-transform-es2015-modules-commonjs_vx.x.x.js new file mode 100644 index 0000000..83fb698 --- /dev/null +++ b/flow-typed/npm/babel-plugin-transform-es2015-modules-commonjs_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 27fce3237a111f108f27bf9de1d84c3b +// flow-typed version: <>/babel-plugin-transform-es2015-modules-commonjs_v^6.24.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-es2015-modules-commonjs' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-es2015-modules-commonjs' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-es2015-modules-commonjs/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-es2015-modules-commonjs/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-es2015-modules-commonjs/lib/index'>; +} diff --git a/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js b/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js new file mode 100644 index 0000000..a31b46b --- /dev/null +++ b/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: e855abd2ed4bfd505cdf68b6704f2d77 +// flow-typed version: <>/babel-plugin-transform-flow-strip-types_v^6.22.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-flow-strip-types' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-flow-strip-types' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-flow-strip-types/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-flow-strip-types/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-flow-strip-types/lib/index'>; +} diff --git a/flow-typed/npm/babel-plugin-transform-object-rest-spread_vx.x.x.js b/flow-typed/npm/babel-plugin-transform-object-rest-spread_vx.x.x.js new file mode 100644 index 0000000..e8483b6 --- /dev/null +++ b/flow-typed/npm/babel-plugin-transform-object-rest-spread_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 193398c91c12e0da7d0c64670de40ec5 +// flow-typed version: <>/babel-plugin-transform-object-rest-spread_v^6.23.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-object-rest-spread' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-object-rest-spread' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-object-rest-spread/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-object-rest-spread/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-object-rest-spread/lib/index'>; +} diff --git a/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js b/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js new file mode 100644 index 0000000..65bdb1a --- /dev/null +++ b/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 419c89d695665968fac7f6c8f0e67eb3 +// flow-typed version: <>/babel-plugin-transform-runtime_v^6.23.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-transform-runtime' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-transform-runtime' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-transform-runtime/lib/definitions' { + declare module.exports: any; +} + +declare module 'babel-plugin-transform-runtime/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-transform-runtime/lib/definitions.js' { + declare module.exports: $Exports<'babel-plugin-transform-runtime/lib/definitions'>; +} +declare module 'babel-plugin-transform-runtime/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-transform-runtime/lib/index'>; +} diff --git a/flow-typed/npm/babel-polyfill_vx.x.x.js b/flow-typed/npm/babel-polyfill_vx.x.x.js new file mode 100644 index 0000000..9e7c111 --- /dev/null +++ b/flow-typed/npm/babel-polyfill_vx.x.x.js @@ -0,0 +1,67 @@ +// flow-typed signature: 81fc1253b811ace77143aa0b251c7e62 +// flow-typed version: <>/babel-polyfill_v^6.23.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-polyfill' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-polyfill' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-polyfill/browser' { + declare module.exports: any; +} + +declare module 'babel-polyfill/dist/polyfill' { + declare module.exports: any; +} + +declare module 'babel-polyfill/dist/polyfill.min' { + declare module.exports: any; +} + +declare module 'babel-polyfill/lib/index' { + declare module.exports: any; +} + +declare module 'babel-polyfill/scripts/postpublish' { + declare module.exports: any; +} + +declare module 'babel-polyfill/scripts/prepublish' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-polyfill/browser.js' { + declare module.exports: $Exports<'babel-polyfill/browser'>; +} +declare module 'babel-polyfill/dist/polyfill.js' { + declare module.exports: $Exports<'babel-polyfill/dist/polyfill'>; +} +declare module 'babel-polyfill/dist/polyfill.min.js' { + declare module.exports: $Exports<'babel-polyfill/dist/polyfill.min'>; +} +declare module 'babel-polyfill/lib/index.js' { + declare module.exports: $Exports<'babel-polyfill/lib/index'>; +} +declare module 'babel-polyfill/scripts/postpublish.js' { + declare module.exports: $Exports<'babel-polyfill/scripts/postpublish'>; +} +declare module 'babel-polyfill/scripts/prepublish.js' { + declare module.exports: $Exports<'babel-polyfill/scripts/prepublish'>; +} diff --git a/flow-typed/npm/babel-preset-env_vx.x.x.js b/flow-typed/npm/babel-preset-env_vx.x.x.js new file mode 100644 index 0000000..1c4fb4e --- /dev/null +++ b/flow-typed/npm/babel-preset-env_vx.x.x.js @@ -0,0 +1,74 @@ +// flow-typed signature: 057cc70abffff730e1ed088135cfb3a4 +// flow-typed version: <>/babel-preset-env_v^1.2.2/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-env' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-env' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-env/data/built-in-features' { + declare module.exports: any; +} + +declare module 'babel-preset-env/data/plugin-features' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/default-includes' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/index' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/module-transformations' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/normalize-options' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/transform-polyfill-require-plugin' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-env/data/built-in-features.js' { + declare module.exports: $Exports<'babel-preset-env/data/built-in-features'>; +} +declare module 'babel-preset-env/data/plugin-features.js' { + declare module.exports: $Exports<'babel-preset-env/data/plugin-features'>; +} +declare module 'babel-preset-env/lib/default-includes.js' { + declare module.exports: $Exports<'babel-preset-env/lib/default-includes'>; +} +declare module 'babel-preset-env/lib/index.js' { + declare module.exports: $Exports<'babel-preset-env/lib/index'>; +} +declare module 'babel-preset-env/lib/module-transformations.js' { + declare module.exports: $Exports<'babel-preset-env/lib/module-transformations'>; +} +declare module 'babel-preset-env/lib/normalize-options.js' { + declare module.exports: $Exports<'babel-preset-env/lib/normalize-options'>; +} +declare module 'babel-preset-env/lib/transform-polyfill-require-plugin.js' { + declare module.exports: $Exports<'babel-preset-env/lib/transform-polyfill-require-plugin'>; +} diff --git a/flow-typed/npm/babel-runtime_vx.x.x.js b/flow-typed/npm/babel-runtime_vx.x.x.js new file mode 100644 index 0000000..ee727f9 --- /dev/null +++ b/flow-typed/npm/babel-runtime_vx.x.x.js @@ -0,0 +1,1691 @@ +// flow-typed signature: 5977d83fab1b805f8b82638782f647e3 +// flow-typed version: <>/babel-runtime_v^6.23.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-runtime' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-runtime' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-runtime/core-js' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/concat' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/copy-within' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/entries' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/every' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/fill' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/filter' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/find-index' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/find' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/for-each' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/from' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/includes' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/index-of' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/join' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/keys' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/last-index-of' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/map' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/of' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/pop' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/push' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/reduce-right' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/reduce' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/reverse' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/shift' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/slice' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/some' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/sort' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/splice' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/unshift' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/array/values' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/asap' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/clear-immediate' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/error/is-error' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/get-iterator' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/is-iterable' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/json/stringify' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/map' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/acosh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/asinh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/atanh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/cbrt' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/clz32' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/cosh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/expm1' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/fround' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/hypot' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/iaddh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/imul' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/imulh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/isubh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/log10' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/log1p' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/log2' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/sign' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/sinh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/tanh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/trunc' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/math/umulh' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/epsilon' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/is-finite' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/is-integer' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/is-nan' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/is-safe-integer' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/max-safe-integer' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/min-safe-integer' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/parse-float' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/number/parse-int' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/assign' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/create' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/define-properties' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/define-property' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/entries' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/freeze' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/get-own-property-descriptor' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/get-own-property-descriptors' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/get-own-property-names' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/get-own-property-symbols' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/get-prototype-of' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/is-extensible' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/is-frozen' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/is-sealed' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/is' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/keys' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/prevent-extensions' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/seal' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/set-prototype-of' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/object/values' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/observable' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/promise' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/apply' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/construct' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/define-metadata' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/define-property' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/delete-metadata' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/delete-property' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/enumerate' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/get-metadata-keys' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/get-metadata' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/get-own-metadata-keys' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/get-own-metadata' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/get-own-property-descriptor' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/get-prototype-of' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/get' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/has-metadata' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/has-own-metadata' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/has' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/is-extensible' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/metadata' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/own-keys' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/prevent-extensions' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/set-prototype-of' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/reflect/set' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/regexp/escape' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/set-immediate' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/set' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/at' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/code-point-at' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/ends-with' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/from-code-point' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/includes' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/match-all' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/pad-end' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/pad-left' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/pad-right' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/pad-start' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/raw' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/repeat' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/starts-with' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/trim-end' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/trim-left' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/trim-right' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/trim-start' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/string/trim' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/async-iterator' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/for' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/has-instance' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/is-concat-spreadable' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/iterator' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/key-for' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/match' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/observable' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/replace' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/search' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/species' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/split' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/to-primitive' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/to-string-tag' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/symbol/unscopables' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/system/global' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/weak-map' { + declare module.exports: any; +} + +declare module 'babel-runtime/core-js/weak-set' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_async-generator-delegate' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_async-generator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_async-iterator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_async-to-generator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_class-call-check' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_create-class' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_defaults' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_define-enumerable-properties' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_define-property' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_extends' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_get' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_inherits' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_instanceof' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_interop-require-default' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_interop-require-wildcard' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_jsx' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_new-arrow-check' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_object-destructuring-empty' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_object-without-properties' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_possible-constructor-return' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_self-global' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_set' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_sliced-to-array-loose' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_sliced-to-array' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_tagged-template-literal-loose' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_tagged-template-literal' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_temporal-ref' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_temporal-undefined' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_to-array' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_to-consumable-array' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/_typeof' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/async-generator-delegate' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/async-generator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/async-iterator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/async-to-generator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/asyncGenerator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/asyncGeneratorDelegate' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/asyncIterator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/asyncToGenerator' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/class-call-check' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/classCallCheck' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/create-class' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/createClass' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/defaults' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/define-enumerable-properties' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/define-property' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/defineEnumerableProperties' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/defineProperty' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/extends' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/get' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/inherits' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/instanceof' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/interop-require-default' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/interop-require-wildcard' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/interopRequireDefault' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/interopRequireWildcard' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/jsx' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/new-arrow-check' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/newArrowCheck' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/object-destructuring-empty' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/object-without-properties' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/objectDestructuringEmpty' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/objectWithoutProperties' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/possible-constructor-return' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/possibleConstructorReturn' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/self-global' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/selfGlobal' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/set' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/sliced-to-array-loose' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/sliced-to-array' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/slicedToArray' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/slicedToArrayLoose' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/tagged-template-literal-loose' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/tagged-template-literal' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/taggedTemplateLiteral' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/taggedTemplateLiteralLoose' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/temporal-ref' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/temporal-undefined' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/temporalRef' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/temporalUndefined' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/to-array' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/to-consumable-array' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/toArray' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/toConsumableArray' { + declare module.exports: any; +} + +declare module 'babel-runtime/helpers/typeof' { + declare module.exports: any; +} + +declare module 'babel-runtime/regenerator/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-runtime/core-js.js' { + declare module.exports: $Exports<'babel-runtime/core-js'>; +} +declare module 'babel-runtime/core-js/array/concat.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/concat'>; +} +declare module 'babel-runtime/core-js/array/copy-within.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/copy-within'>; +} +declare module 'babel-runtime/core-js/array/entries.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/entries'>; +} +declare module 'babel-runtime/core-js/array/every.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/every'>; +} +declare module 'babel-runtime/core-js/array/fill.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/fill'>; +} +declare module 'babel-runtime/core-js/array/filter.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/filter'>; +} +declare module 'babel-runtime/core-js/array/find-index.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/find-index'>; +} +declare module 'babel-runtime/core-js/array/find.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/find'>; +} +declare module 'babel-runtime/core-js/array/for-each.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/for-each'>; +} +declare module 'babel-runtime/core-js/array/from.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/from'>; +} +declare module 'babel-runtime/core-js/array/includes.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/includes'>; +} +declare module 'babel-runtime/core-js/array/index-of.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/index-of'>; +} +declare module 'babel-runtime/core-js/array/join.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/join'>; +} +declare module 'babel-runtime/core-js/array/keys.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/keys'>; +} +declare module 'babel-runtime/core-js/array/last-index-of.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/last-index-of'>; +} +declare module 'babel-runtime/core-js/array/map.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/map'>; +} +declare module 'babel-runtime/core-js/array/of.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/of'>; +} +declare module 'babel-runtime/core-js/array/pop.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/pop'>; +} +declare module 'babel-runtime/core-js/array/push.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/push'>; +} +declare module 'babel-runtime/core-js/array/reduce-right.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/reduce-right'>; +} +declare module 'babel-runtime/core-js/array/reduce.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/reduce'>; +} +declare module 'babel-runtime/core-js/array/reverse.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/reverse'>; +} +declare module 'babel-runtime/core-js/array/shift.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/shift'>; +} +declare module 'babel-runtime/core-js/array/slice.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/slice'>; +} +declare module 'babel-runtime/core-js/array/some.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/some'>; +} +declare module 'babel-runtime/core-js/array/sort.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/sort'>; +} +declare module 'babel-runtime/core-js/array/splice.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/splice'>; +} +declare module 'babel-runtime/core-js/array/unshift.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/unshift'>; +} +declare module 'babel-runtime/core-js/array/values.js' { + declare module.exports: $Exports<'babel-runtime/core-js/array/values'>; +} +declare module 'babel-runtime/core-js/asap.js' { + declare module.exports: $Exports<'babel-runtime/core-js/asap'>; +} +declare module 'babel-runtime/core-js/clear-immediate.js' { + declare module.exports: $Exports<'babel-runtime/core-js/clear-immediate'>; +} +declare module 'babel-runtime/core-js/error/is-error.js' { + declare module.exports: $Exports<'babel-runtime/core-js/error/is-error'>; +} +declare module 'babel-runtime/core-js/get-iterator.js' { + declare module.exports: $Exports<'babel-runtime/core-js/get-iterator'>; +} +declare module 'babel-runtime/core-js/is-iterable.js' { + declare module.exports: $Exports<'babel-runtime/core-js/is-iterable'>; +} +declare module 'babel-runtime/core-js/json/stringify.js' { + declare module.exports: $Exports<'babel-runtime/core-js/json/stringify'>; +} +declare module 'babel-runtime/core-js/map.js' { + declare module.exports: $Exports<'babel-runtime/core-js/map'>; +} +declare module 'babel-runtime/core-js/math/acosh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/acosh'>; +} +declare module 'babel-runtime/core-js/math/asinh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/asinh'>; +} +declare module 'babel-runtime/core-js/math/atanh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/atanh'>; +} +declare module 'babel-runtime/core-js/math/cbrt.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/cbrt'>; +} +declare module 'babel-runtime/core-js/math/clz32.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/clz32'>; +} +declare module 'babel-runtime/core-js/math/cosh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/cosh'>; +} +declare module 'babel-runtime/core-js/math/expm1.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/expm1'>; +} +declare module 'babel-runtime/core-js/math/fround.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/fround'>; +} +declare module 'babel-runtime/core-js/math/hypot.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/hypot'>; +} +declare module 'babel-runtime/core-js/math/iaddh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/iaddh'>; +} +declare module 'babel-runtime/core-js/math/imul.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/imul'>; +} +declare module 'babel-runtime/core-js/math/imulh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/imulh'>; +} +declare module 'babel-runtime/core-js/math/isubh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/isubh'>; +} +declare module 'babel-runtime/core-js/math/log10.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/log10'>; +} +declare module 'babel-runtime/core-js/math/log1p.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/log1p'>; +} +declare module 'babel-runtime/core-js/math/log2.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/log2'>; +} +declare module 'babel-runtime/core-js/math/sign.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/sign'>; +} +declare module 'babel-runtime/core-js/math/sinh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/sinh'>; +} +declare module 'babel-runtime/core-js/math/tanh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/tanh'>; +} +declare module 'babel-runtime/core-js/math/trunc.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/trunc'>; +} +declare module 'babel-runtime/core-js/math/umulh.js' { + declare module.exports: $Exports<'babel-runtime/core-js/math/umulh'>; +} +declare module 'babel-runtime/core-js/number/epsilon.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/epsilon'>; +} +declare module 'babel-runtime/core-js/number/is-finite.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/is-finite'>; +} +declare module 'babel-runtime/core-js/number/is-integer.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/is-integer'>; +} +declare module 'babel-runtime/core-js/number/is-nan.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/is-nan'>; +} +declare module 'babel-runtime/core-js/number/is-safe-integer.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/is-safe-integer'>; +} +declare module 'babel-runtime/core-js/number/max-safe-integer.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/max-safe-integer'>; +} +declare module 'babel-runtime/core-js/number/min-safe-integer.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/min-safe-integer'>; +} +declare module 'babel-runtime/core-js/number/parse-float.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/parse-float'>; +} +declare module 'babel-runtime/core-js/number/parse-int.js' { + declare module.exports: $Exports<'babel-runtime/core-js/number/parse-int'>; +} +declare module 'babel-runtime/core-js/object/assign.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/assign'>; +} +declare module 'babel-runtime/core-js/object/create.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/create'>; +} +declare module 'babel-runtime/core-js/object/define-properties.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/define-properties'>; +} +declare module 'babel-runtime/core-js/object/define-property.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/define-property'>; +} +declare module 'babel-runtime/core-js/object/entries.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/entries'>; +} +declare module 'babel-runtime/core-js/object/freeze.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/freeze'>; +} +declare module 'babel-runtime/core-js/object/get-own-property-descriptor.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-descriptor'>; +} +declare module 'babel-runtime/core-js/object/get-own-property-descriptors.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-descriptors'>; +} +declare module 'babel-runtime/core-js/object/get-own-property-names.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-names'>; +} +declare module 'babel-runtime/core-js/object/get-own-property-symbols.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/get-own-property-symbols'>; +} +declare module 'babel-runtime/core-js/object/get-prototype-of.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/get-prototype-of'>; +} +declare module 'babel-runtime/core-js/object/is-extensible.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/is-extensible'>; +} +declare module 'babel-runtime/core-js/object/is-frozen.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/is-frozen'>; +} +declare module 'babel-runtime/core-js/object/is-sealed.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/is-sealed'>; +} +declare module 'babel-runtime/core-js/object/is.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/is'>; +} +declare module 'babel-runtime/core-js/object/keys.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/keys'>; +} +declare module 'babel-runtime/core-js/object/prevent-extensions.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/prevent-extensions'>; +} +declare module 'babel-runtime/core-js/object/seal.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/seal'>; +} +declare module 'babel-runtime/core-js/object/set-prototype-of.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/set-prototype-of'>; +} +declare module 'babel-runtime/core-js/object/values.js' { + declare module.exports: $Exports<'babel-runtime/core-js/object/values'>; +} +declare module 'babel-runtime/core-js/observable.js' { + declare module.exports: $Exports<'babel-runtime/core-js/observable'>; +} +declare module 'babel-runtime/core-js/promise.js' { + declare module.exports: $Exports<'babel-runtime/core-js/promise'>; +} +declare module 'babel-runtime/core-js/reflect/apply.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/apply'>; +} +declare module 'babel-runtime/core-js/reflect/construct.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/construct'>; +} +declare module 'babel-runtime/core-js/reflect/define-metadata.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/define-metadata'>; +} +declare module 'babel-runtime/core-js/reflect/define-property.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/define-property'>; +} +declare module 'babel-runtime/core-js/reflect/delete-metadata.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/delete-metadata'>; +} +declare module 'babel-runtime/core-js/reflect/delete-property.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/delete-property'>; +} +declare module 'babel-runtime/core-js/reflect/enumerate.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/enumerate'>; +} +declare module 'babel-runtime/core-js/reflect/get-metadata-keys.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-metadata-keys'>; +} +declare module 'babel-runtime/core-js/reflect/get-metadata.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-metadata'>; +} +declare module 'babel-runtime/core-js/reflect/get-own-metadata-keys.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-own-metadata-keys'>; +} +declare module 'babel-runtime/core-js/reflect/get-own-metadata.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-own-metadata'>; +} +declare module 'babel-runtime/core-js/reflect/get-own-property-descriptor.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-own-property-descriptor'>; +} +declare module 'babel-runtime/core-js/reflect/get-prototype-of.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/get-prototype-of'>; +} +declare module 'babel-runtime/core-js/reflect/get.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/get'>; +} +declare module 'babel-runtime/core-js/reflect/has-metadata.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/has-metadata'>; +} +declare module 'babel-runtime/core-js/reflect/has-own-metadata.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/has-own-metadata'>; +} +declare module 'babel-runtime/core-js/reflect/has.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/has'>; +} +declare module 'babel-runtime/core-js/reflect/is-extensible.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/is-extensible'>; +} +declare module 'babel-runtime/core-js/reflect/metadata.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/metadata'>; +} +declare module 'babel-runtime/core-js/reflect/own-keys.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/own-keys'>; +} +declare module 'babel-runtime/core-js/reflect/prevent-extensions.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/prevent-extensions'>; +} +declare module 'babel-runtime/core-js/reflect/set-prototype-of.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/set-prototype-of'>; +} +declare module 'babel-runtime/core-js/reflect/set.js' { + declare module.exports: $Exports<'babel-runtime/core-js/reflect/set'>; +} +declare module 'babel-runtime/core-js/regexp/escape.js' { + declare module.exports: $Exports<'babel-runtime/core-js/regexp/escape'>; +} +declare module 'babel-runtime/core-js/set-immediate.js' { + declare module.exports: $Exports<'babel-runtime/core-js/set-immediate'>; +} +declare module 'babel-runtime/core-js/set.js' { + declare module.exports: $Exports<'babel-runtime/core-js/set'>; +} +declare module 'babel-runtime/core-js/string/at.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/at'>; +} +declare module 'babel-runtime/core-js/string/code-point-at.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/code-point-at'>; +} +declare module 'babel-runtime/core-js/string/ends-with.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/ends-with'>; +} +declare module 'babel-runtime/core-js/string/from-code-point.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/from-code-point'>; +} +declare module 'babel-runtime/core-js/string/includes.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/includes'>; +} +declare module 'babel-runtime/core-js/string/match-all.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/match-all'>; +} +declare module 'babel-runtime/core-js/string/pad-end.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/pad-end'>; +} +declare module 'babel-runtime/core-js/string/pad-left.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/pad-left'>; +} +declare module 'babel-runtime/core-js/string/pad-right.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/pad-right'>; +} +declare module 'babel-runtime/core-js/string/pad-start.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/pad-start'>; +} +declare module 'babel-runtime/core-js/string/raw.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/raw'>; +} +declare module 'babel-runtime/core-js/string/repeat.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/repeat'>; +} +declare module 'babel-runtime/core-js/string/starts-with.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/starts-with'>; +} +declare module 'babel-runtime/core-js/string/trim-end.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/trim-end'>; +} +declare module 'babel-runtime/core-js/string/trim-left.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/trim-left'>; +} +declare module 'babel-runtime/core-js/string/trim-right.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/trim-right'>; +} +declare module 'babel-runtime/core-js/string/trim-start.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/trim-start'>; +} +declare module 'babel-runtime/core-js/string/trim.js' { + declare module.exports: $Exports<'babel-runtime/core-js/string/trim'>; +} +declare module 'babel-runtime/core-js/symbol.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol'>; +} +declare module 'babel-runtime/core-js/symbol/async-iterator.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/async-iterator'>; +} +declare module 'babel-runtime/core-js/symbol/for.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/for'>; +} +declare module 'babel-runtime/core-js/symbol/has-instance.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/has-instance'>; +} +declare module 'babel-runtime/core-js/symbol/is-concat-spreadable.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/is-concat-spreadable'>; +} +declare module 'babel-runtime/core-js/symbol/iterator.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/iterator'>; +} +declare module 'babel-runtime/core-js/symbol/key-for.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/key-for'>; +} +declare module 'babel-runtime/core-js/symbol/match.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/match'>; +} +declare module 'babel-runtime/core-js/symbol/observable.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/observable'>; +} +declare module 'babel-runtime/core-js/symbol/replace.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/replace'>; +} +declare module 'babel-runtime/core-js/symbol/search.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/search'>; +} +declare module 'babel-runtime/core-js/symbol/species.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/species'>; +} +declare module 'babel-runtime/core-js/symbol/split.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/split'>; +} +declare module 'babel-runtime/core-js/symbol/to-primitive.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/to-primitive'>; +} +declare module 'babel-runtime/core-js/symbol/to-string-tag.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/to-string-tag'>; +} +declare module 'babel-runtime/core-js/symbol/unscopables.js' { + declare module.exports: $Exports<'babel-runtime/core-js/symbol/unscopables'>; +} +declare module 'babel-runtime/core-js/system/global.js' { + declare module.exports: $Exports<'babel-runtime/core-js/system/global'>; +} +declare module 'babel-runtime/core-js/weak-map.js' { + declare module.exports: $Exports<'babel-runtime/core-js/weak-map'>; +} +declare module 'babel-runtime/core-js/weak-set.js' { + declare module.exports: $Exports<'babel-runtime/core-js/weak-set'>; +} +declare module 'babel-runtime/helpers/_async-generator-delegate.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_async-generator-delegate'>; +} +declare module 'babel-runtime/helpers/_async-generator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_async-generator'>; +} +declare module 'babel-runtime/helpers/_async-iterator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_async-iterator'>; +} +declare module 'babel-runtime/helpers/_async-to-generator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_async-to-generator'>; +} +declare module 'babel-runtime/helpers/_class-call-check.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_class-call-check'>; +} +declare module 'babel-runtime/helpers/_create-class.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_create-class'>; +} +declare module 'babel-runtime/helpers/_defaults.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_defaults'>; +} +declare module 'babel-runtime/helpers/_define-enumerable-properties.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_define-enumerable-properties'>; +} +declare module 'babel-runtime/helpers/_define-property.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_define-property'>; +} +declare module 'babel-runtime/helpers/_extends.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_extends'>; +} +declare module 'babel-runtime/helpers/_get.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_get'>; +} +declare module 'babel-runtime/helpers/_inherits.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_inherits'>; +} +declare module 'babel-runtime/helpers/_instanceof.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_instanceof'>; +} +declare module 'babel-runtime/helpers/_interop-require-default.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_interop-require-default'>; +} +declare module 'babel-runtime/helpers/_interop-require-wildcard.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_interop-require-wildcard'>; +} +declare module 'babel-runtime/helpers/_jsx.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_jsx'>; +} +declare module 'babel-runtime/helpers/_new-arrow-check.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_new-arrow-check'>; +} +declare module 'babel-runtime/helpers/_object-destructuring-empty.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_object-destructuring-empty'>; +} +declare module 'babel-runtime/helpers/_object-without-properties.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_object-without-properties'>; +} +declare module 'babel-runtime/helpers/_possible-constructor-return.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_possible-constructor-return'>; +} +declare module 'babel-runtime/helpers/_self-global.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_self-global'>; +} +declare module 'babel-runtime/helpers/_set.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_set'>; +} +declare module 'babel-runtime/helpers/_sliced-to-array-loose.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_sliced-to-array-loose'>; +} +declare module 'babel-runtime/helpers/_sliced-to-array.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_sliced-to-array'>; +} +declare module 'babel-runtime/helpers/_tagged-template-literal-loose.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_tagged-template-literal-loose'>; +} +declare module 'babel-runtime/helpers/_tagged-template-literal.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_tagged-template-literal'>; +} +declare module 'babel-runtime/helpers/_temporal-ref.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_temporal-ref'>; +} +declare module 'babel-runtime/helpers/_temporal-undefined.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_temporal-undefined'>; +} +declare module 'babel-runtime/helpers/_to-array.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_to-array'>; +} +declare module 'babel-runtime/helpers/_to-consumable-array.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_to-consumable-array'>; +} +declare module 'babel-runtime/helpers/_typeof.js' { + declare module.exports: $Exports<'babel-runtime/helpers/_typeof'>; +} +declare module 'babel-runtime/helpers/async-generator-delegate.js' { + declare module.exports: $Exports<'babel-runtime/helpers/async-generator-delegate'>; +} +declare module 'babel-runtime/helpers/async-generator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/async-generator'>; +} +declare module 'babel-runtime/helpers/async-iterator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/async-iterator'>; +} +declare module 'babel-runtime/helpers/async-to-generator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/async-to-generator'>; +} +declare module 'babel-runtime/helpers/asyncGenerator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/asyncGenerator'>; +} +declare module 'babel-runtime/helpers/asyncGeneratorDelegate.js' { + declare module.exports: $Exports<'babel-runtime/helpers/asyncGeneratorDelegate'>; +} +declare module 'babel-runtime/helpers/asyncIterator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/asyncIterator'>; +} +declare module 'babel-runtime/helpers/asyncToGenerator.js' { + declare module.exports: $Exports<'babel-runtime/helpers/asyncToGenerator'>; +} +declare module 'babel-runtime/helpers/class-call-check.js' { + declare module.exports: $Exports<'babel-runtime/helpers/class-call-check'>; +} +declare module 'babel-runtime/helpers/classCallCheck.js' { + declare module.exports: $Exports<'babel-runtime/helpers/classCallCheck'>; +} +declare module 'babel-runtime/helpers/create-class.js' { + declare module.exports: $Exports<'babel-runtime/helpers/create-class'>; +} +declare module 'babel-runtime/helpers/createClass.js' { + declare module.exports: $Exports<'babel-runtime/helpers/createClass'>; +} +declare module 'babel-runtime/helpers/defaults.js' { + declare module.exports: $Exports<'babel-runtime/helpers/defaults'>; +} +declare module 'babel-runtime/helpers/define-enumerable-properties.js' { + declare module.exports: $Exports<'babel-runtime/helpers/define-enumerable-properties'>; +} +declare module 'babel-runtime/helpers/define-property.js' { + declare module.exports: $Exports<'babel-runtime/helpers/define-property'>; +} +declare module 'babel-runtime/helpers/defineEnumerableProperties.js' { + declare module.exports: $Exports<'babel-runtime/helpers/defineEnumerableProperties'>; +} +declare module 'babel-runtime/helpers/defineProperty.js' { + declare module.exports: $Exports<'babel-runtime/helpers/defineProperty'>; +} +declare module 'babel-runtime/helpers/extends.js' { + declare module.exports: $Exports<'babel-runtime/helpers/extends'>; +} +declare module 'babel-runtime/helpers/get.js' { + declare module.exports: $Exports<'babel-runtime/helpers/get'>; +} +declare module 'babel-runtime/helpers/inherits.js' { + declare module.exports: $Exports<'babel-runtime/helpers/inherits'>; +} +declare module 'babel-runtime/helpers/instanceof.js' { + declare module.exports: $Exports<'babel-runtime/helpers/instanceof'>; +} +declare module 'babel-runtime/helpers/interop-require-default.js' { + declare module.exports: $Exports<'babel-runtime/helpers/interop-require-default'>; +} +declare module 'babel-runtime/helpers/interop-require-wildcard.js' { + declare module.exports: $Exports<'babel-runtime/helpers/interop-require-wildcard'>; +} +declare module 'babel-runtime/helpers/interopRequireDefault.js' { + declare module.exports: $Exports<'babel-runtime/helpers/interopRequireDefault'>; +} +declare module 'babel-runtime/helpers/interopRequireWildcard.js' { + declare module.exports: $Exports<'babel-runtime/helpers/interopRequireWildcard'>; +} +declare module 'babel-runtime/helpers/jsx.js' { + declare module.exports: $Exports<'babel-runtime/helpers/jsx'>; +} +declare module 'babel-runtime/helpers/new-arrow-check.js' { + declare module.exports: $Exports<'babel-runtime/helpers/new-arrow-check'>; +} +declare module 'babel-runtime/helpers/newArrowCheck.js' { + declare module.exports: $Exports<'babel-runtime/helpers/newArrowCheck'>; +} +declare module 'babel-runtime/helpers/object-destructuring-empty.js' { + declare module.exports: $Exports<'babel-runtime/helpers/object-destructuring-empty'>; +} +declare module 'babel-runtime/helpers/object-without-properties.js' { + declare module.exports: $Exports<'babel-runtime/helpers/object-without-properties'>; +} +declare module 'babel-runtime/helpers/objectDestructuringEmpty.js' { + declare module.exports: $Exports<'babel-runtime/helpers/objectDestructuringEmpty'>; +} +declare module 'babel-runtime/helpers/objectWithoutProperties.js' { + declare module.exports: $Exports<'babel-runtime/helpers/objectWithoutProperties'>; +} +declare module 'babel-runtime/helpers/possible-constructor-return.js' { + declare module.exports: $Exports<'babel-runtime/helpers/possible-constructor-return'>; +} +declare module 'babel-runtime/helpers/possibleConstructorReturn.js' { + declare module.exports: $Exports<'babel-runtime/helpers/possibleConstructorReturn'>; +} +declare module 'babel-runtime/helpers/self-global.js' { + declare module.exports: $Exports<'babel-runtime/helpers/self-global'>; +} +declare module 'babel-runtime/helpers/selfGlobal.js' { + declare module.exports: $Exports<'babel-runtime/helpers/selfGlobal'>; +} +declare module 'babel-runtime/helpers/set.js' { + declare module.exports: $Exports<'babel-runtime/helpers/set'>; +} +declare module 'babel-runtime/helpers/sliced-to-array-loose.js' { + declare module.exports: $Exports<'babel-runtime/helpers/sliced-to-array-loose'>; +} +declare module 'babel-runtime/helpers/sliced-to-array.js' { + declare module.exports: $Exports<'babel-runtime/helpers/sliced-to-array'>; +} +declare module 'babel-runtime/helpers/slicedToArray.js' { + declare module.exports: $Exports<'babel-runtime/helpers/slicedToArray'>; +} +declare module 'babel-runtime/helpers/slicedToArrayLoose.js' { + declare module.exports: $Exports<'babel-runtime/helpers/slicedToArrayLoose'>; +} +declare module 'babel-runtime/helpers/tagged-template-literal-loose.js' { + declare module.exports: $Exports<'babel-runtime/helpers/tagged-template-literal-loose'>; +} +declare module 'babel-runtime/helpers/tagged-template-literal.js' { + declare module.exports: $Exports<'babel-runtime/helpers/tagged-template-literal'>; +} +declare module 'babel-runtime/helpers/taggedTemplateLiteral.js' { + declare module.exports: $Exports<'babel-runtime/helpers/taggedTemplateLiteral'>; +} +declare module 'babel-runtime/helpers/taggedTemplateLiteralLoose.js' { + declare module.exports: $Exports<'babel-runtime/helpers/taggedTemplateLiteralLoose'>; +} +declare module 'babel-runtime/helpers/temporal-ref.js' { + declare module.exports: $Exports<'babel-runtime/helpers/temporal-ref'>; +} +declare module 'babel-runtime/helpers/temporal-undefined.js' { + declare module.exports: $Exports<'babel-runtime/helpers/temporal-undefined'>; +} +declare module 'babel-runtime/helpers/temporalRef.js' { + declare module.exports: $Exports<'babel-runtime/helpers/temporalRef'>; +} +declare module 'babel-runtime/helpers/temporalUndefined.js' { + declare module.exports: $Exports<'babel-runtime/helpers/temporalUndefined'>; +} +declare module 'babel-runtime/helpers/to-array.js' { + declare module.exports: $Exports<'babel-runtime/helpers/to-array'>; +} +declare module 'babel-runtime/helpers/to-consumable-array.js' { + declare module.exports: $Exports<'babel-runtime/helpers/to-consumable-array'>; +} +declare module 'babel-runtime/helpers/toArray.js' { + declare module.exports: $Exports<'babel-runtime/helpers/toArray'>; +} +declare module 'babel-runtime/helpers/toConsumableArray.js' { + declare module.exports: $Exports<'babel-runtime/helpers/toConsumableArray'>; +} +declare module 'babel-runtime/helpers/typeof.js' { + declare module.exports: $Exports<'babel-runtime/helpers/typeof'>; +} +declare module 'babel-runtime/regenerator/index.js' { + declare module.exports: $Exports<'babel-runtime/regenerator/index'>; +} diff --git a/flow-typed/npm/chalk_v1.x.x.js b/flow-typed/npm/chalk_v1.x.x.js new file mode 100644 index 0000000..e115e1e --- /dev/null +++ b/flow-typed/npm/chalk_v1.x.x.js @@ -0,0 +1,114 @@ +// flow-typed signature: 7b4e29a4fd2be533e1822c1b0aade79b +// flow-typed version: 549b484575/chalk_v1.x.x/flow_>=v0.21.x + +type $npm$chalk$StyleElement = { + open: string; + close: string; +}; + +type $npm$chalk$Chain = $npm$chalk$Style & (...text: string[]) => string; + +type $npm$chalk$Style = { + // General + reset: $npm$chalk$Chain; + bold: $npm$chalk$Chain; + dim: $npm$chalk$Chain; + italic: $npm$chalk$Chain; + underline: $npm$chalk$Chain; + inverse: $npm$chalk$Chain; + strikethrough: $npm$chalk$Chain; + + // Text colors + black: $npm$chalk$Chain; + red: $npm$chalk$Chain; + green: $npm$chalk$Chain; + yellow: $npm$chalk$Chain; + blue: $npm$chalk$Chain; + magenta: $npm$chalk$Chain; + cyan: $npm$chalk$Chain; + white: $npm$chalk$Chain; + gray: $npm$chalk$Chain; + grey: $npm$chalk$Chain; + + // Background colors + bgBlack: $npm$chalk$Chain; + bgRed: $npm$chalk$Chain; + bgGreen: $npm$chalk$Chain; + bgYellow: $npm$chalk$Chain; + bgBlue: $npm$chalk$Chain; + bgMagenta: $npm$chalk$Chain; + bgCyan: $npm$chalk$Chain; + bgWhite: $npm$chalk$Chain; +}; + +type $npm$chalk$StyleMap = { + // General + reset: $npm$chalk$StyleElement; + bold: $npm$chalk$StyleElement; + dim: $npm$chalk$StyleElement; + italic: $npm$chalk$StyleElement; + underline: $npm$chalk$StyleElement; + inverse: $npm$chalk$StyleElement; + strikethrough: $npm$chalk$StyleElement; + + // Text colors + black: $npm$chalk$StyleElement; + red: $npm$chalk$StyleElement; + green: $npm$chalk$StyleElement; + yellow: $npm$chalk$StyleElement; + blue: $npm$chalk$StyleElement; + magenta: $npm$chalk$StyleElement; + cyan: $npm$chalk$StyleElement; + white: $npm$chalk$StyleElement; + gray: $npm$chalk$StyleElement; + + // Background colors + bgBlack: $npm$chalk$StyleElement; + bgRed: $npm$chalk$StyleElement; + bgGreen: $npm$chalk$StyleElement; + bgYellow: $npm$chalk$StyleElement; + bgBlue: $npm$chalk$StyleElement; + bgMagenta: $npm$chalk$StyleElement; + bgCyan: $npm$chalk$StyleElement; + bgWhite: $npm$chalk$StyleElement; +}; + +declare module "chalk" { + declare var enabled: boolean; + declare var supportsColor: boolean; + declare var styles: $npm$chalk$StyleMap; + + declare function stripColor(value: string): any; + declare function hasColor(str: string): boolean; + + // General + declare var reset: $npm$chalk$Chain; + declare var bold: $npm$chalk$Chain; + declare var dim: $npm$chalk$Chain; + declare var italic: $npm$chalk$Chain; + declare var underline: $npm$chalk$Chain; + declare var inverse: $npm$chalk$Chain; + declare var strikethrough: $npm$chalk$Chain; + + // Text colors + declare var black: $npm$chalk$Chain; + declare var red: $npm$chalk$Chain; + declare var green: $npm$chalk$Chain; + declare var yellow: $npm$chalk$Chain; + declare var blue: $npm$chalk$Chain; + declare var magenta: $npm$chalk$Chain; + declare var cyan: $npm$chalk$Chain; + declare var white: $npm$chalk$Chain; + declare var gray: $npm$chalk$Chain; + declare var grey: $npm$chalk$Chain; + + // Background colors + declare var bgBlack: $npm$chalk$Chain; + declare var bgRed: $npm$chalk$Chain; + declare var bgGreen: $npm$chalk$Chain; + declare var bgYellow: $npm$chalk$Chain; + declare var bgBlue: $npm$chalk$Chain; + declare var bgMagenta: $npm$chalk$Chain; + declare var bgCyan: $npm$chalk$Chain; + declare var bgWhite: $npm$chalk$Chain; +} diff --git a/flow-typed/npm/concurrently_vx.x.x.js b/flow-typed/npm/concurrently_vx.x.x.js new file mode 100644 index 0000000..c1667ff --- /dev/null +++ b/flow-typed/npm/concurrently_vx.x.x.js @@ -0,0 +1,60 @@ +// flow-typed signature: 7d2dbc3e59e9954e8c7719d162a6af19 +// flow-typed version: <>/concurrently_v^3.4.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'concurrently' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'concurrently' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'concurrently/src/main' { + declare module.exports: any; +} + +declare module 'concurrently/test/support/signal' { + declare module.exports: any; +} + +declare module 'concurrently/test/test-functional' { + declare module.exports: any; +} + +declare module 'concurrently/test/utils' { + declare module.exports: any; +} + +declare module 'concurrently/tst' { + declare module.exports: any; +} + +// Filename aliases +declare module 'concurrently/src/main.js' { + declare module.exports: $Exports<'concurrently/src/main'>; +} +declare module 'concurrently/test/support/signal.js' { + declare module.exports: $Exports<'concurrently/test/support/signal'>; +} +declare module 'concurrently/test/test-functional.js' { + declare module.exports: $Exports<'concurrently/test/test-functional'>; +} +declare module 'concurrently/test/utils.js' { + declare module.exports: $Exports<'concurrently/test/utils'>; +} +declare module 'concurrently/tst.js' { + declare module.exports: $Exports<'concurrently/tst'>; +} diff --git a/flow-typed/npm/eslint-config-airbnb_vx.x.x.js b/flow-typed/npm/eslint-config-airbnb_vx.x.x.js new file mode 100644 index 0000000..fc3385a --- /dev/null +++ b/flow-typed/npm/eslint-config-airbnb_vx.x.x.js @@ -0,0 +1,73 @@ +// flow-typed signature: 4a64c2ee58dc3dd1bd3facdbbc7cd5de +// flow-typed version: <>/eslint-config-airbnb_v^14.1.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint-config-airbnb' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint-config-airbnb' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint-config-airbnb/base' { + declare module.exports: any; +} + +declare module 'eslint-config-airbnb/legacy' { + declare module.exports: any; +} + +declare module 'eslint-config-airbnb/rules/react-a11y' { + declare module.exports: any; +} + +declare module 'eslint-config-airbnb/rules/react' { + declare module.exports: any; +} + +declare module 'eslint-config-airbnb/test/test-base' { + declare module.exports: any; +} + +declare module 'eslint-config-airbnb/test/test-react-order' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint-config-airbnb/base.js' { + declare module.exports: $Exports<'eslint-config-airbnb/base'>; +} +declare module 'eslint-config-airbnb/index' { + declare module.exports: $Exports<'eslint-config-airbnb'>; +} +declare module 'eslint-config-airbnb/index.js' { + declare module.exports: $Exports<'eslint-config-airbnb'>; +} +declare module 'eslint-config-airbnb/legacy.js' { + declare module.exports: $Exports<'eslint-config-airbnb/legacy'>; +} +declare module 'eslint-config-airbnb/rules/react-a11y.js' { + declare module.exports: $Exports<'eslint-config-airbnb/rules/react-a11y'>; +} +declare module 'eslint-config-airbnb/rules/react.js' { + declare module.exports: $Exports<'eslint-config-airbnb/rules/react'>; +} +declare module 'eslint-config-airbnb/test/test-base.js' { + declare module.exports: $Exports<'eslint-config-airbnb/test/test-base'>; +} +declare module 'eslint-config-airbnb/test/test-react-order.js' { + declare module.exports: $Exports<'eslint-config-airbnb/test/test-react-order'>; +} diff --git a/flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js b/flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js new file mode 100644 index 0000000..a63f26b --- /dev/null +++ b/flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js @@ -0,0 +1,319 @@ +// flow-typed signature: d014c5b1e54a6c1c87734c7c885c2d65 +// flow-typed version: <>/eslint-plugin-flowtype_v^2.30.3/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint-plugin-flowtype' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint-plugin-flowtype' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint-plugin-flowtype/bin/readmeAssertions' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/booleanStyle' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/defineFlowType' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/delimiterDangle' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/genericSpacing' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/noDupeKeys' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/noWeakTypes' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/objectTypeDelimiter' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/requireParameterType' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/requireReturnType' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/requireVariableType' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/semi' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/sortKeys' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/typeIdMatch' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/useFlowType' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/rules/validSyntax' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/getParameterName' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/getTokenAfterParens' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/isFlowFile' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/quoteName' { + declare module.exports: any; +} + +declare module 'eslint-plugin-flowtype/dist/utilities/spacingFixers' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint-plugin-flowtype/bin/readmeAssertions.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/bin/readmeAssertions'>; +} +declare module 'eslint-plugin-flowtype/dist/index.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/index'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/booleanStyle.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/booleanStyle'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/defineFlowType.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/defineFlowType'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/delimiterDangle.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/delimiterDangle'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/genericSpacing.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/genericSpacing'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/noDupeKeys.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noDupeKeys'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/noWeakTypes.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noWeakTypes'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/objectTypeDelimiter.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/objectTypeDelimiter'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/requireParameterType.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireParameterType'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/requireReturnType.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireReturnType'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/requireVariableType.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireVariableType'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/semi.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/semi'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/sortKeys.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/sortKeys'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/index.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/index'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/typeIdMatch.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeIdMatch'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/useFlowType.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/useFlowType'>; +} +declare module 'eslint-plugin-flowtype/dist/rules/validSyntax.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/validSyntax'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/getParameterName.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/getParameterName'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/getTokenAfterParens.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/getTokenAfterParens'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/index.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/index'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/isFlowFile.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/isFlowFile'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/quoteName.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/quoteName'>; +} +declare module 'eslint-plugin-flowtype/dist/utilities/spacingFixers.js' { + declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/spacingFixers'>; +} diff --git a/flow-typed/npm/eslint-plugin-import_vx.x.x.js b/flow-typed/npm/eslint-plugin-import_vx.x.x.js new file mode 100644 index 0000000..9c9e3af --- /dev/null +++ b/flow-typed/npm/eslint-plugin-import_vx.x.x.js @@ -0,0 +1,326 @@ +// flow-typed signature: 6aa72b267b236a84ef1428e7844f0925 +// flow-typed version: <>/eslint-plugin-import_v^2.2.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint-plugin-import' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint-plugin-import' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint-plugin-import/config/electron' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/config/errors' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/config/react-native' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/config/react' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/config/recommended' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/config/stage-0' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/config/warnings' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/core/importType' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/core/staticRequire' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/ExportMap' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/importDeclaration' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/default' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/export' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/extensions' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/first' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/imports-first' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/max-dependencies' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/named' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/namespace' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/newline-after-import' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-absolute-path' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-amd' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-commonjs' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-deprecated' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-duplicates' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-dynamic-require' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-extraneous-dependencies' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-internal-modules' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-mutable-exports' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-named-as-default-member' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-named-as-default' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-named-default' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-namespace' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-nodejs-modules' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-restricted-paths' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-unassigned-import' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-unresolved' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/no-webpack-loader-syntax' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/order' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/prefer-default-export' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/lib/rules/unambiguous' { + declare module.exports: any; +} + +declare module 'eslint-plugin-import/memo-parser/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint-plugin-import/config/electron.js' { + declare module.exports: $Exports<'eslint-plugin-import/config/electron'>; +} +declare module 'eslint-plugin-import/config/errors.js' { + declare module.exports: $Exports<'eslint-plugin-import/config/errors'>; +} +declare module 'eslint-plugin-import/config/react-native.js' { + declare module.exports: $Exports<'eslint-plugin-import/config/react-native'>; +} +declare module 'eslint-plugin-import/config/react.js' { + declare module.exports: $Exports<'eslint-plugin-import/config/react'>; +} +declare module 'eslint-plugin-import/config/recommended.js' { + declare module.exports: $Exports<'eslint-plugin-import/config/recommended'>; +} +declare module 'eslint-plugin-import/config/stage-0.js' { + declare module.exports: $Exports<'eslint-plugin-import/config/stage-0'>; +} +declare module 'eslint-plugin-import/config/warnings.js' { + declare module.exports: $Exports<'eslint-plugin-import/config/warnings'>; +} +declare module 'eslint-plugin-import/lib/core/importType.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/core/importType'>; +} +declare module 'eslint-plugin-import/lib/core/staticRequire.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/core/staticRequire'>; +} +declare module 'eslint-plugin-import/lib/ExportMap.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/ExportMap'>; +} +declare module 'eslint-plugin-import/lib/importDeclaration.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/importDeclaration'>; +} +declare module 'eslint-plugin-import/lib/index.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/index'>; +} +declare module 'eslint-plugin-import/lib/rules/default.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/default'>; +} +declare module 'eslint-plugin-import/lib/rules/export.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/export'>; +} +declare module 'eslint-plugin-import/lib/rules/extensions.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/extensions'>; +} +declare module 'eslint-plugin-import/lib/rules/first.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/first'>; +} +declare module 'eslint-plugin-import/lib/rules/imports-first.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/imports-first'>; +} +declare module 'eslint-plugin-import/lib/rules/max-dependencies.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/max-dependencies'>; +} +declare module 'eslint-plugin-import/lib/rules/named.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/named'>; +} +declare module 'eslint-plugin-import/lib/rules/namespace.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/namespace'>; +} +declare module 'eslint-plugin-import/lib/rules/newline-after-import.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/newline-after-import'>; +} +declare module 'eslint-plugin-import/lib/rules/no-absolute-path.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-absolute-path'>; +} +declare module 'eslint-plugin-import/lib/rules/no-amd.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-amd'>; +} +declare module 'eslint-plugin-import/lib/rules/no-commonjs.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-commonjs'>; +} +declare module 'eslint-plugin-import/lib/rules/no-deprecated.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-deprecated'>; +} +declare module 'eslint-plugin-import/lib/rules/no-duplicates.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-duplicates'>; +} +declare module 'eslint-plugin-import/lib/rules/no-dynamic-require.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-dynamic-require'>; +} +declare module 'eslint-plugin-import/lib/rules/no-extraneous-dependencies.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-extraneous-dependencies'>; +} +declare module 'eslint-plugin-import/lib/rules/no-internal-modules.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-internal-modules'>; +} +declare module 'eslint-plugin-import/lib/rules/no-mutable-exports.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-mutable-exports'>; +} +declare module 'eslint-plugin-import/lib/rules/no-named-as-default-member.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-named-as-default-member'>; +} +declare module 'eslint-plugin-import/lib/rules/no-named-as-default.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-named-as-default'>; +} +declare module 'eslint-plugin-import/lib/rules/no-named-default.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-named-default'>; +} +declare module 'eslint-plugin-import/lib/rules/no-namespace.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-namespace'>; +} +declare module 'eslint-plugin-import/lib/rules/no-nodejs-modules.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-nodejs-modules'>; +} +declare module 'eslint-plugin-import/lib/rules/no-restricted-paths.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-restricted-paths'>; +} +declare module 'eslint-plugin-import/lib/rules/no-unassigned-import.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-unassigned-import'>; +} +declare module 'eslint-plugin-import/lib/rules/no-unresolved.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-unresolved'>; +} +declare module 'eslint-plugin-import/lib/rules/no-webpack-loader-syntax.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/no-webpack-loader-syntax'>; +} +declare module 'eslint-plugin-import/lib/rules/order.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/order'>; +} +declare module 'eslint-plugin-import/lib/rules/prefer-default-export.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/prefer-default-export'>; +} +declare module 'eslint-plugin-import/lib/rules/unambiguous.js' { + declare module.exports: $Exports<'eslint-plugin-import/lib/rules/unambiguous'>; +} +declare module 'eslint-plugin-import/memo-parser/index.js' { + declare module.exports: $Exports<'eslint-plugin-import/memo-parser/index'>; +} diff --git a/flow-typed/npm/eslint-plugin-jest_vx.x.x.js b/flow-typed/npm/eslint-plugin-jest_vx.x.x.js new file mode 100644 index 0000000..f0406e3 --- /dev/null +++ b/flow-typed/npm/eslint-plugin-jest_vx.x.x.js @@ -0,0 +1,60 @@ +// flow-typed signature: aee0ee26c71489b73597d33b1da68273 +// flow-typed version: <>/eslint-plugin-jest_v^19.0.1/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint-plugin-jest' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint-plugin-jest' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint-plugin-jest/build/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jest/build/rules/no-disabled-tests' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jest/build/rules/no-focused-tests' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jest/build/rules/no-identical-title' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jest/build/rules/types' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint-plugin-jest/build/index.js' { + declare module.exports: $Exports<'eslint-plugin-jest/build/index'>; +} +declare module 'eslint-plugin-jest/build/rules/no-disabled-tests.js' { + declare module.exports: $Exports<'eslint-plugin-jest/build/rules/no-disabled-tests'>; +} +declare module 'eslint-plugin-jest/build/rules/no-focused-tests.js' { + declare module.exports: $Exports<'eslint-plugin-jest/build/rules/no-focused-tests'>; +} +declare module 'eslint-plugin-jest/build/rules/no-identical-title.js' { + declare module.exports: $Exports<'eslint-plugin-jest/build/rules/no-identical-title'>; +} +declare module 'eslint-plugin-jest/build/rules/types.js' { + declare module.exports: $Exports<'eslint-plugin-jest/build/rules/types'>; +} diff --git a/flow-typed/npm/eslint-plugin-jsx-a11y_vx.x.x.js b/flow-typed/npm/eslint-plugin-jsx-a11y_vx.x.x.js new file mode 100644 index 0000000..61dc97e --- /dev/null +++ b/flow-typed/npm/eslint-plugin-jsx-a11y_vx.x.x.js @@ -0,0 +1,1411 @@ +// flow-typed signature: e24d7ec837b23f24131144aea80db077 +// flow-typed version: <>/eslint-plugin-jsx-a11y_v^4.0.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint-plugin-jsx-a11y' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint-plugin-jsx-a11y' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint-plugin-jsx-a11y/__mocks__/genInteractives' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__mocks__/IdentifierMock' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__mocks__/JSXAttributeMock' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__mocks__/JSXElementMock' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__mocks__/JSXExpressionContainerMock' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/__util__/parserOptionsMapper' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/index-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/accessible-emoji-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-has-content-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-activedescendant-has-tabindex-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-props-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-proptypes-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-role-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-unsupported-elements-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/click-events-have-key-events-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/heading-has-content-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/href-no-hash-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/html-has-lang-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/iframe-has-title-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/img-has-alt-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/img-redundant-alt-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-for-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/lang-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/mouse-events-have-key-events-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-onchange-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-redundant-roles-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-static-element-interactions-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/onclick-has-focus-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/onclick-has-role-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/role-has-required-aria-props-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/role-supports-aria-props-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/scope-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/tabindex-no-positive-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/getSuggestion-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/getTabIndex-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveElement-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveRole-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/parserOptionsMapper-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/schemas-test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/flow/eslint' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/accessible-emoji' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/anchor-has-content' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-activedescendant-has-tabindex' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-proptypes' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-role' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-unsupported-elements' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/click-events-have-key-events' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/heading-has-content' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/href-no-hash' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/html-has-lang' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/iframe-has-title' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/img-has-alt' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/img-redundant-alt' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/label-has-for' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/lang' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/mouse-events-have-key-events' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-access-key' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-autofocus' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-distracting-elements' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-onchange' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-redundant-roles' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-static-element-interactions' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/onclick-has-focus' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/onclick-has-role' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/role-has-required-aria-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/role-supports-aria-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/scope' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/rules/tabindex-no-positive' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/getImplicitRole' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/getSuggestion' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/getTabIndex' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/a' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/area' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/article' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/aside' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/body' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/button' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/datalist' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/details' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/dialog' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/dl' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/form' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h1' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h2' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h3' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h4' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h5' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h6' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/hr' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/img' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/input' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/li' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/link' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/menu' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/menuitem' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/meter' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/nav' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/ol' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/option' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/output' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/progress' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/section' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/select' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/tbody' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/textarea' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/tfoot' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/thead' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/ul' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/isHiddenFromScreenReader' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/isInteractiveElement' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/isInteractiveRole' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/lib/util/schemas' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/scripts/addRuleToIndex' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/scripts/boilerplate/doc' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/scripts/boilerplate/rule' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/scripts/boilerplate/test' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/scripts/create-rule' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/accessible-emoji' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/anchor-has-content' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-activedescendant-has-tabindex' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-proptypes' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-role' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-unsupported-elements' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/click-events-have-key-events' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/heading-has-content' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/href-no-hash' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/html-has-lang' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/iframe-has-title' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/img-has-alt' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/img-redundant-alt' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/label-has-for' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/lang' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/mouse-events-have-key-events' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/no-access-key' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/no-autofocus' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/no-distracting-elements' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/no-onchange' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/no-redundant-roles' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/no-static-element-interactions' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/onclick-has-focus' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/onclick-has-role' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/role-has-required-aria-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/role-supports-aria-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/scope' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/rules/tabindex-no-positive' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/getImplicitRole' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/getSuggestion' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/getTabIndex' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/a' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/area' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/article' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/aside' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/body' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/button' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/datalist' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/details' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/dialog' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/dl' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/form' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h1' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h2' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h3' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h4' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h5' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h6' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/hr' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/img' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/index' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/input' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/li' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/link' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/menu' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/menuitem' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/meter' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/nav' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/ol' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/option' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/output' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/progress' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/section' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/select' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/tbody' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/textarea' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/tfoot' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/thead' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/ul' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/isHiddenFromScreenReader' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/isInteractiveElement' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/isInteractiveRole' { + declare module.exports: any; +} + +declare module 'eslint-plugin-jsx-a11y/src/util/schemas' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint-plugin-jsx-a11y/__mocks__/genInteractives.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__mocks__/genInteractives'>; +} +declare module 'eslint-plugin-jsx-a11y/__mocks__/IdentifierMock.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__mocks__/IdentifierMock'>; +} +declare module 'eslint-plugin-jsx-a11y/__mocks__/JSXAttributeMock.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__mocks__/JSXAttributeMock'>; +} +declare module 'eslint-plugin-jsx-a11y/__mocks__/JSXElementMock.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__mocks__/JSXElementMock'>; +} +declare module 'eslint-plugin-jsx-a11y/__mocks__/JSXExpressionContainerMock.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__mocks__/JSXExpressionContainerMock'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/__util__/parserOptionsMapper.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/__util__/parserOptionsMapper'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/index-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/index-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/accessible-emoji-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/accessible-emoji-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-has-content-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/anchor-has-content-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-activedescendant-has-tabindex-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-props-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-props-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-proptypes-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-proptypes-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-role-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-role-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-unsupported-elements-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/aria-unsupported-elements-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/click-events-have-key-events-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/click-events-have-key-events-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/heading-has-content-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/heading-has-content-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/href-no-hash-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/href-no-hash-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/html-has-lang-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/html-has-lang-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/iframe-has-title-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/iframe-has-title-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/img-has-alt-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/img-has-alt-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/img-redundant-alt-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/img-redundant-alt-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-for-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/label-has-for-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/lang-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/lang-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/mouse-events-have-key-events-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/mouse-events-have-key-events-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/no-access-key-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/no-autofocus-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/no-distracting-elements-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-onchange-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/no-onchange-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-redundant-roles-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/no-redundant-roles-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/no-static-element-interactions-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/no-static-element-interactions-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/onclick-has-focus-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/onclick-has-focus-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/onclick-has-role-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/onclick-has-role-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/role-has-required-aria-props-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/role-has-required-aria-props-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/role-supports-aria-props-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/role-supports-aria-props-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/scope-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/scope-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/rules/tabindex-no-positive-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/rules/tabindex-no-positive-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/getSuggestion-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/util/getSuggestion-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/getTabIndex-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/util/getTabIndex-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveElement-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveElement-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveRole-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/util/isInteractiveRole-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/parserOptionsMapper-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/util/parserOptionsMapper-test'>; +} +declare module 'eslint-plugin-jsx-a11y/__tests__/src/util/schemas-test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/__tests__/src/util/schemas-test'>; +} +declare module 'eslint-plugin-jsx-a11y/flow/eslint.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/flow/eslint'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/index.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/index'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/accessible-emoji.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/accessible-emoji'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/anchor-has-content.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/anchor-has-content'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-activedescendant-has-tabindex.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/aria-activedescendant-has-tabindex'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-props.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/aria-props'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-proptypes.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/aria-proptypes'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-role.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/aria-role'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/aria-unsupported-elements.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/aria-unsupported-elements'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/click-events-have-key-events.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/click-events-have-key-events'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/heading-has-content.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/heading-has-content'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/href-no-hash.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/href-no-hash'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/html-has-lang.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/html-has-lang'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/iframe-has-title.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/iframe-has-title'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/img-has-alt.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/img-has-alt'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/img-redundant-alt.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/img-redundant-alt'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/label-has-for.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/label-has-for'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/lang.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/lang'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/mouse-events-have-key-events.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/mouse-events-have-key-events'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-access-key.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/no-access-key'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-autofocus.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/no-autofocus'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-distracting-elements.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/no-distracting-elements'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-onchange.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/no-onchange'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-redundant-roles.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/no-redundant-roles'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/no-static-element-interactions.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/no-static-element-interactions'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/onclick-has-focus.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/onclick-has-focus'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/onclick-has-role.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/onclick-has-role'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/role-has-required-aria-props.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/role-has-required-aria-props'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/role-supports-aria-props.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/role-supports-aria-props'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/scope.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/scope'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/rules/tabindex-no-positive.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/rules/tabindex-no-positive'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/getImplicitRole.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/getImplicitRole'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/getSuggestion.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/getSuggestion'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/getTabIndex.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/getTabIndex'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/a.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/a'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/area.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/area'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/article.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/article'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/aside.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/aside'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/body.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/body'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/button.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/button'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/datalist.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/datalist'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/details.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/details'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/dialog.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/dialog'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/dl.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/dl'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/form.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/form'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h1.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h1'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h2.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h2'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h3.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h3'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h4.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h4'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h5.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h5'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h6.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/h6'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/hr.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/hr'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/img.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/img'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/index.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/index'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/input.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/input'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/li.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/li'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/link.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/link'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/menu.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/menu'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/menuitem.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/menuitem'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/meter.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/meter'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/nav.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/nav'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/ol.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/ol'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/option.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/option'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/output.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/output'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/progress.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/progress'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/section.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/section'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/select.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/select'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/tbody.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/tbody'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/textarea.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/textarea'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/tfoot.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/tfoot'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/thead.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/thead'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/implicitRoles/ul.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/implicitRoles/ul'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/isHiddenFromScreenReader.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/isHiddenFromScreenReader'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/isInteractiveElement.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/isInteractiveElement'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/isInteractiveRole.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/isInteractiveRole'>; +} +declare module 'eslint-plugin-jsx-a11y/lib/util/schemas.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/lib/util/schemas'>; +} +declare module 'eslint-plugin-jsx-a11y/scripts/addRuleToIndex.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/scripts/addRuleToIndex'>; +} +declare module 'eslint-plugin-jsx-a11y/scripts/boilerplate/doc.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/scripts/boilerplate/doc'>; +} +declare module 'eslint-plugin-jsx-a11y/scripts/boilerplate/rule.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/scripts/boilerplate/rule'>; +} +declare module 'eslint-plugin-jsx-a11y/scripts/boilerplate/test.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/scripts/boilerplate/test'>; +} +declare module 'eslint-plugin-jsx-a11y/scripts/create-rule.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/scripts/create-rule'>; +} +declare module 'eslint-plugin-jsx-a11y/src/index.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/index'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/accessible-emoji.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/accessible-emoji'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/anchor-has-content.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/anchor-has-content'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-activedescendant-has-tabindex.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/aria-activedescendant-has-tabindex'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-props.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/aria-props'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-proptypes.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/aria-proptypes'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-role.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/aria-role'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/aria-unsupported-elements.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/aria-unsupported-elements'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/click-events-have-key-events.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/click-events-have-key-events'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/heading-has-content.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/heading-has-content'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/href-no-hash.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/href-no-hash'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/html-has-lang.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/html-has-lang'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/iframe-has-title.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/iframe-has-title'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/img-has-alt.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/img-has-alt'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/img-redundant-alt.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/img-redundant-alt'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/label-has-for.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/label-has-for'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/lang.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/lang'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/mouse-events-have-key-events.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/mouse-events-have-key-events'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/no-access-key.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/no-access-key'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/no-autofocus.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/no-autofocus'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/no-distracting-elements.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/no-distracting-elements'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/no-onchange.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/no-onchange'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/no-redundant-roles.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/no-redundant-roles'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/no-static-element-interactions.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/no-static-element-interactions'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/onclick-has-focus.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/onclick-has-focus'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/onclick-has-role.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/onclick-has-role'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/role-has-required-aria-props.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/role-has-required-aria-props'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/role-supports-aria-props.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/role-supports-aria-props'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/scope.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/scope'>; +} +declare module 'eslint-plugin-jsx-a11y/src/rules/tabindex-no-positive.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/rules/tabindex-no-positive'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/getImplicitRole.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/getImplicitRole'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/getSuggestion.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/getSuggestion'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/getTabIndex.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/getTabIndex'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/a.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/a'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/area.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/area'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/article.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/article'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/aside.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/aside'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/body.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/body'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/button.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/button'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/datalist.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/datalist'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/details.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/details'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/dialog.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/dialog'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/dl.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/dl'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/form.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/form'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h1.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/h1'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h2.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/h2'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h3.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/h3'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h4.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/h4'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h5.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/h5'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/h6.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/h6'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/hr.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/hr'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/img.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/img'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/index.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/index'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/input.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/input'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/li.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/li'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/link.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/link'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/menu.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/menu'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/menuitem.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/menuitem'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/meter.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/meter'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/nav.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/nav'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/ol.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/ol'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/option.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/option'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/output.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/output'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/progress.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/progress'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/section.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/section'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/select.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/select'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/tbody.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/tbody'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/textarea.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/textarea'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/tfoot.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/tfoot'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/thead.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/thead'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/implicitRoles/ul.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/implicitRoles/ul'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/isHiddenFromScreenReader.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/isHiddenFromScreenReader'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/isInteractiveElement.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/isInteractiveElement'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/isInteractiveRole.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/isInteractiveRole'>; +} +declare module 'eslint-plugin-jsx-a11y/src/util/schemas.js' { + declare module.exports: $Exports<'eslint-plugin-jsx-a11y/src/util/schemas'>; +} diff --git a/flow-typed/npm/eslint-plugin-react_vx.x.x.js b/flow-typed/npm/eslint-plugin-react_vx.x.x.js new file mode 100644 index 0000000..7a8b684 --- /dev/null +++ b/flow-typed/npm/eslint-plugin-react_vx.x.x.js @@ -0,0 +1,500 @@ +// flow-typed signature: 7e445ccb42a17d652635190d95adddc0 +// flow-typed version: <>/eslint-plugin-react_v^6.10.3/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint-plugin-react' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint-plugin-react' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint-plugin-react/lib/rules/display-name' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/forbid-component-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/forbid-elements' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/forbid-foreign-prop-types' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/forbid-prop-types' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-boolean-value' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-closing-bracket-location' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-curly-spacing' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-equals-spacing' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-filename-extension' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-first-prop-new-line' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-handler-names' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-indent-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-indent' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-key' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-max-props-per-line' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-no-bind' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-no-duplicate-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-no-literals' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-no-target-blank' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-no-undef' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-pascal-case' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-sort-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-space-before-closing' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-tag-spacing' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-uses-react' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-uses-vars' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/jsx-wrap-multilines' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-array-index-key' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-children-prop' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-comment-textnodes' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-danger-with-children' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-danger' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-deprecated' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-did-mount-set-state' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-did-update-set-state' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-direct-mutation-state' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-find-dom-node' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-is-mounted' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-multi-comp' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-render-return-value' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-set-state' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-string-refs' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-unescaped-entities' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-unknown-property' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/no-unused-prop-types' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/prefer-es6-class' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/prefer-stateless-function' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/prop-types' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/react-in-jsx-scope' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/require-default-props' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/require-extension' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/require-optimization' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/require-render-return' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/self-closing-comp' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/sort-comp' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/sort-prop-types' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/style-prop-object' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/void-dom-elements-no-children' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/rules/wrap-multilines' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/util/annotations' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/util/Components' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/util/pragma' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/util/variable' { + declare module.exports: any; +} + +declare module 'eslint-plugin-react/lib/util/version' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint-plugin-react/index' { + declare module.exports: $Exports<'eslint-plugin-react'>; +} +declare module 'eslint-plugin-react/index.js' { + declare module.exports: $Exports<'eslint-plugin-react'>; +} +declare module 'eslint-plugin-react/lib/rules/display-name.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/display-name'>; +} +declare module 'eslint-plugin-react/lib/rules/forbid-component-props.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-component-props'>; +} +declare module 'eslint-plugin-react/lib/rules/forbid-elements.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-elements'>; +} +declare module 'eslint-plugin-react/lib/rules/forbid-foreign-prop-types.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-foreign-prop-types'>; +} +declare module 'eslint-plugin-react/lib/rules/forbid-prop-types.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-prop-types'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-boolean-value.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-boolean-value'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-closing-bracket-location.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-closing-bracket-location'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-curly-spacing.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-curly-spacing'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-equals-spacing.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-equals-spacing'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-filename-extension.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-filename-extension'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-first-prop-new-line.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-first-prop-new-line'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-handler-names.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-handler-names'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-indent-props.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-indent-props'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-indent.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-indent'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-key.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-key'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-max-props-per-line.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-max-props-per-line'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-no-bind.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-bind'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-no-duplicate-props.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-duplicate-props'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-no-literals.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-literals'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-no-target-blank.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-target-blank'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-no-undef.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-undef'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-pascal-case.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-pascal-case'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-sort-props.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-sort-props'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-space-before-closing.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-space-before-closing'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-tag-spacing.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-tag-spacing'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-uses-react.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-uses-react'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-uses-vars.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-uses-vars'>; +} +declare module 'eslint-plugin-react/lib/rules/jsx-wrap-multilines.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-wrap-multilines'>; +} +declare module 'eslint-plugin-react/lib/rules/no-array-index-key.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-array-index-key'>; +} +declare module 'eslint-plugin-react/lib/rules/no-children-prop.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-children-prop'>; +} +declare module 'eslint-plugin-react/lib/rules/no-comment-textnodes.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-comment-textnodes'>; +} +declare module 'eslint-plugin-react/lib/rules/no-danger-with-children.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-danger-with-children'>; +} +declare module 'eslint-plugin-react/lib/rules/no-danger.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-danger'>; +} +declare module 'eslint-plugin-react/lib/rules/no-deprecated.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-deprecated'>; +} +declare module 'eslint-plugin-react/lib/rules/no-did-mount-set-state.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-did-mount-set-state'>; +} +declare module 'eslint-plugin-react/lib/rules/no-did-update-set-state.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-did-update-set-state'>; +} +declare module 'eslint-plugin-react/lib/rules/no-direct-mutation-state.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-direct-mutation-state'>; +} +declare module 'eslint-plugin-react/lib/rules/no-find-dom-node.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-find-dom-node'>; +} +declare module 'eslint-plugin-react/lib/rules/no-is-mounted.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-is-mounted'>; +} +declare module 'eslint-plugin-react/lib/rules/no-multi-comp.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-multi-comp'>; +} +declare module 'eslint-plugin-react/lib/rules/no-render-return-value.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-render-return-value'>; +} +declare module 'eslint-plugin-react/lib/rules/no-set-state.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-set-state'>; +} +declare module 'eslint-plugin-react/lib/rules/no-string-refs.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-string-refs'>; +} +declare module 'eslint-plugin-react/lib/rules/no-unescaped-entities.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unescaped-entities'>; +} +declare module 'eslint-plugin-react/lib/rules/no-unknown-property.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unknown-property'>; +} +declare module 'eslint-plugin-react/lib/rules/no-unused-prop-types.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unused-prop-types'>; +} +declare module 'eslint-plugin-react/lib/rules/prefer-es6-class.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prefer-es6-class'>; +} +declare module 'eslint-plugin-react/lib/rules/prefer-stateless-function.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prefer-stateless-function'>; +} +declare module 'eslint-plugin-react/lib/rules/prop-types.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prop-types'>; +} +declare module 'eslint-plugin-react/lib/rules/react-in-jsx-scope.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/react-in-jsx-scope'>; +} +declare module 'eslint-plugin-react/lib/rules/require-default-props.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-default-props'>; +} +declare module 'eslint-plugin-react/lib/rules/require-extension.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-extension'>; +} +declare module 'eslint-plugin-react/lib/rules/require-optimization.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-optimization'>; +} +declare module 'eslint-plugin-react/lib/rules/require-render-return.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-render-return'>; +} +declare module 'eslint-plugin-react/lib/rules/self-closing-comp.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/self-closing-comp'>; +} +declare module 'eslint-plugin-react/lib/rules/sort-comp.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/sort-comp'>; +} +declare module 'eslint-plugin-react/lib/rules/sort-prop-types.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/sort-prop-types'>; +} +declare module 'eslint-plugin-react/lib/rules/style-prop-object.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/style-prop-object'>; +} +declare module 'eslint-plugin-react/lib/rules/void-dom-elements-no-children.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/void-dom-elements-no-children'>; +} +declare module 'eslint-plugin-react/lib/rules/wrap-multilines.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/rules/wrap-multilines'>; +} +declare module 'eslint-plugin-react/lib/util/annotations.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/util/annotations'>; +} +declare module 'eslint-plugin-react/lib/util/Components.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/util/Components'>; +} +declare module 'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket'>; +} +declare module 'eslint-plugin-react/lib/util/pragma.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/util/pragma'>; +} +declare module 'eslint-plugin-react/lib/util/variable.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/util/variable'>; +} +declare module 'eslint-plugin-react/lib/util/version.js' { + declare module.exports: $Exports<'eslint-plugin-react/lib/util/version'>; +} diff --git a/flow-typed/npm/eslint_vx.x.x.js b/flow-typed/npm/eslint_vx.x.x.js new file mode 100644 index 0000000..2beb296 --- /dev/null +++ b/flow-typed/npm/eslint_vx.x.x.js @@ -0,0 +1,2293 @@ +// flow-typed signature: 115f233c5a36ed54fc1a88d6b221fcea +// flow-typed version: <>/eslint_v^3.18.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint/bin/eslint' { + declare module.exports: any; +} + +declare module 'eslint/conf/cli-options' { + declare module.exports: any; +} + +declare module 'eslint/conf/environments' { + declare module.exports: any; +} + +declare module 'eslint/conf/eslint-all' { + declare module.exports: any; +} + +declare module 'eslint/conf/eslint-recommended' { + declare module.exports: any; +} + +declare module 'eslint/lib/api' { + declare module.exports: any; +} + +declare module 'eslint/lib/ast-utils' { + declare module.exports: any; +} + +declare module 'eslint/lib/cli-engine' { + declare module.exports: any; +} + +declare module 'eslint/lib/cli' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path-analyzer' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path-segment' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path-state' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/debug-helpers' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/fork-context' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/id-generator' { + declare module.exports: any; +} + +declare module 'eslint/lib/config' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/autoconfig' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-file' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-initializer' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-ops' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-rule' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-validator' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/environments' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/plugins' { + declare module.exports: any; +} + +declare module 'eslint/lib/eslint' { + declare module.exports: any; +} + +declare module 'eslint/lib/file-finder' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/checkstyle' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/codeframe' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/compact' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/html' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/jslint-xml' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/json' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/junit' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/stylish' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/table' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/tap' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/unix' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/visualstudio' { + declare module.exports: any; +} + +declare module 'eslint/lib/ignored-paths' { + declare module.exports: any; +} + +declare module 'eslint/lib/internal-rules/internal-consistent-docs-description' { + declare module.exports: any; +} + +declare module 'eslint/lib/internal-rules/internal-no-invalid-meta' { + declare module.exports: any; +} + +declare module 'eslint/lib/load-rules' { + declare module.exports: any; +} + +declare module 'eslint/lib/logging' { + declare module.exports: any; +} + +declare module 'eslint/lib/options' { + declare module.exports: any; +} + +declare module 'eslint/lib/rule-context' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/accessor-pairs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/array-bracket-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/array-callback-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/arrow-body-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/arrow-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/arrow-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/block-scoped-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/block-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/brace-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/callback-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/camelcase' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/capitalized-comments' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/class-methods-use-this' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/comma-dangle' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/comma-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/comma-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/complexity' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/computed-property-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/consistent-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/consistent-this' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/constructor-super' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/curly' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/default-case' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/dot-location' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/dot-notation' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/eol-last' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/eqeqeq' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-call-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-name-matching' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-names' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/generator-star-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/global-require' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/guard-for-in' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/handle-callback-err' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/id-blacklist' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/id-length' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/id-match' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/indent' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/init-declarations' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/jsx-quotes' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/key-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/keyword-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/line-comment-position' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/linebreak-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/lines-around-comment' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/lines-around-directive' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-depth' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-len' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-lines' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-nested-callbacks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-params' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-statements-per-line' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-statements' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/multiline-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/new-cap' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/new-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/newline-after-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/newline-before-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/newline-per-chained-call' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-alert' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-array-constructor' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-await-in-loop' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-bitwise' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-caller' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-case-declarations' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-catch-shadow' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-class-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-compare-neg-zero' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-cond-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-confusing-arrow' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-console' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-const-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-constant-condition' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-continue' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-control-regex' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-debugger' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-delete-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-div-regex' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-dupe-args' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-dupe-class-members' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-dupe-keys' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-duplicate-case' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-duplicate-imports' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-else-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty-character-class' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty-function' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty-pattern' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-eq-null' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-eval' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-ex-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extend-native' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-bind' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-boolean-cast' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-label' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-semi' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-fallthrough' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-floating-decimal' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-func-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-global-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-implicit-coercion' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-implicit-globals' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-implied-eval' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-inline-comments' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-inner-declarations' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-invalid-regexp' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-invalid-this' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-irregular-whitespace' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-iterator' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-label-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-labels' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-lone-blocks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-lonely-if' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-loop-func' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-magic-numbers' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-mixed-operators' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-mixed-requires' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-mixed-spaces-and-tabs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multi-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multi-spaces' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multi-str' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multiple-empty-lines' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-native-reassign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-negated-condition' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-negated-in-lhs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-nested-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-func' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-object' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-require' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-symbol' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-wrappers' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-obj-calls' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-octal-escape' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-octal' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-param-reassign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-path-concat' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-plusplus' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-process-env' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-process-exit' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-proto' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-prototype-builtins' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-redeclare' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-regex-spaces' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-globals' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-imports' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-modules' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-properties' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-syntax' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-return-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-return-await' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-script-url' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-self-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-self-compare' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-sequences' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-shadow-restricted-names' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-shadow' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-spaced-func' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-sparse-arrays' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-sync' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-tabs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-template-curly-in-string' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-this-before-super' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-throw-literal' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-trailing-spaces' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-undef-init' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-undef' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-undefined' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-underscore-dangle' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unexpected-multiline' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unmodified-loop-condition' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unneeded-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unreachable' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unsafe-finally' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unsafe-negation' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unused-expressions' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unused-labels' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unused-vars' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-use-before-define' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-call' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-computed-key' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-concat' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-constructor' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-escape' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-rename' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-void' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-warning-comments' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-whitespace-before-property' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-with' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/nonblock-statement-body-position' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-curly-newline' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-curly-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-property-newline' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-shorthand' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/one-var-declaration-per-line' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/one-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/operator-assignment' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/operator-linebreak' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/padded-blocks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-arrow-callback' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-const' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-destructuring' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-numeric-literals' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-promise-reject-errors' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-reflect' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-rest-params' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-spread' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-template' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/quote-props' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/quotes' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/radix' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/require-await' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/require-jsdoc' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/require-yield' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/rest-spread-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/semi-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/semi' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/sort-imports' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/sort-keys' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/sort-vars' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-before-blocks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-before-function-paren' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-in-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-infix-ops' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-unary-ops' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/spaced-comment' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/strict' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/symbol-description' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/template-curly-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/template-tag-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/unicode-bom' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/use-isnan' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/valid-jsdoc' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/valid-typeof' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/vars-on-top' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/wrap-iife' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/wrap-regex' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/yield-star-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/yoda' { + declare module.exports: any; +} + +declare module 'eslint/lib/testers/event-generator-tester' { + declare module.exports: any; +} + +declare module 'eslint/lib/testers/rule-tester' { + declare module.exports: any; +} + +declare module 'eslint/lib/timing' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/backward-token-comment-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/backward-token-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/cursors' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/decorative-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/filter-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/forward-token-comment-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/forward-token-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/index' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/limit-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/padded-token-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/skip-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/utils' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/comment-event-generator' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/fix-tracker' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/glob-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/glob' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/hash' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/keywords' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/module-resolver' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/node-event-generator' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/npm-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/path-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/patterns/letters' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/rule-fixer' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/source-code-fixer' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/source-code-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/source-code' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/traverser' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/xml-escape' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint/bin/eslint.js' { + declare module.exports: $Exports<'eslint/bin/eslint'>; +} +declare module 'eslint/conf/cli-options.js' { + declare module.exports: $Exports<'eslint/conf/cli-options'>; +} +declare module 'eslint/conf/environments.js' { + declare module.exports: $Exports<'eslint/conf/environments'>; +} +declare module 'eslint/conf/eslint-all.js' { + declare module.exports: $Exports<'eslint/conf/eslint-all'>; +} +declare module 'eslint/conf/eslint-recommended.js' { + declare module.exports: $Exports<'eslint/conf/eslint-recommended'>; +} +declare module 'eslint/lib/api.js' { + declare module.exports: $Exports<'eslint/lib/api'>; +} +declare module 'eslint/lib/ast-utils.js' { + declare module.exports: $Exports<'eslint/lib/ast-utils'>; +} +declare module 'eslint/lib/cli-engine.js' { + declare module.exports: $Exports<'eslint/lib/cli-engine'>; +} +declare module 'eslint/lib/cli.js' { + declare module.exports: $Exports<'eslint/lib/cli'>; +} +declare module 'eslint/lib/code-path-analysis/code-path-analyzer.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-analyzer'>; +} +declare module 'eslint/lib/code-path-analysis/code-path-segment.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-segment'>; +} +declare module 'eslint/lib/code-path-analysis/code-path-state.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-state'>; +} +declare module 'eslint/lib/code-path-analysis/code-path.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path'>; +} +declare module 'eslint/lib/code-path-analysis/debug-helpers.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/debug-helpers'>; +} +declare module 'eslint/lib/code-path-analysis/fork-context.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/fork-context'>; +} +declare module 'eslint/lib/code-path-analysis/id-generator.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/id-generator'>; +} +declare module 'eslint/lib/config.js' { + declare module.exports: $Exports<'eslint/lib/config'>; +} +declare module 'eslint/lib/config/autoconfig.js' { + declare module.exports: $Exports<'eslint/lib/config/autoconfig'>; +} +declare module 'eslint/lib/config/config-file.js' { + declare module.exports: $Exports<'eslint/lib/config/config-file'>; +} +declare module 'eslint/lib/config/config-initializer.js' { + declare module.exports: $Exports<'eslint/lib/config/config-initializer'>; +} +declare module 'eslint/lib/config/config-ops.js' { + declare module.exports: $Exports<'eslint/lib/config/config-ops'>; +} +declare module 'eslint/lib/config/config-rule.js' { + declare module.exports: $Exports<'eslint/lib/config/config-rule'>; +} +declare module 'eslint/lib/config/config-validator.js' { + declare module.exports: $Exports<'eslint/lib/config/config-validator'>; +} +declare module 'eslint/lib/config/environments.js' { + declare module.exports: $Exports<'eslint/lib/config/environments'>; +} +declare module 'eslint/lib/config/plugins.js' { + declare module.exports: $Exports<'eslint/lib/config/plugins'>; +} +declare module 'eslint/lib/eslint.js' { + declare module.exports: $Exports<'eslint/lib/eslint'>; +} +declare module 'eslint/lib/file-finder.js' { + declare module.exports: $Exports<'eslint/lib/file-finder'>; +} +declare module 'eslint/lib/formatters/checkstyle.js' { + declare module.exports: $Exports<'eslint/lib/formatters/checkstyle'>; +} +declare module 'eslint/lib/formatters/codeframe.js' { + declare module.exports: $Exports<'eslint/lib/formatters/codeframe'>; +} +declare module 'eslint/lib/formatters/compact.js' { + declare module.exports: $Exports<'eslint/lib/formatters/compact'>; +} +declare module 'eslint/lib/formatters/html.js' { + declare module.exports: $Exports<'eslint/lib/formatters/html'>; +} +declare module 'eslint/lib/formatters/jslint-xml.js' { + declare module.exports: $Exports<'eslint/lib/formatters/jslint-xml'>; +} +declare module 'eslint/lib/formatters/json.js' { + declare module.exports: $Exports<'eslint/lib/formatters/json'>; +} +declare module 'eslint/lib/formatters/junit.js' { + declare module.exports: $Exports<'eslint/lib/formatters/junit'>; +} +declare module 'eslint/lib/formatters/stylish.js' { + declare module.exports: $Exports<'eslint/lib/formatters/stylish'>; +} +declare module 'eslint/lib/formatters/table.js' { + declare module.exports: $Exports<'eslint/lib/formatters/table'>; +} +declare module 'eslint/lib/formatters/tap.js' { + declare module.exports: $Exports<'eslint/lib/formatters/tap'>; +} +declare module 'eslint/lib/formatters/unix.js' { + declare module.exports: $Exports<'eslint/lib/formatters/unix'>; +} +declare module 'eslint/lib/formatters/visualstudio.js' { + declare module.exports: $Exports<'eslint/lib/formatters/visualstudio'>; +} +declare module 'eslint/lib/ignored-paths.js' { + declare module.exports: $Exports<'eslint/lib/ignored-paths'>; +} +declare module 'eslint/lib/internal-rules/internal-consistent-docs-description.js' { + declare module.exports: $Exports<'eslint/lib/internal-rules/internal-consistent-docs-description'>; +} +declare module 'eslint/lib/internal-rules/internal-no-invalid-meta.js' { + declare module.exports: $Exports<'eslint/lib/internal-rules/internal-no-invalid-meta'>; +} +declare module 'eslint/lib/load-rules.js' { + declare module.exports: $Exports<'eslint/lib/load-rules'>; +} +declare module 'eslint/lib/logging.js' { + declare module.exports: $Exports<'eslint/lib/logging'>; +} +declare module 'eslint/lib/options.js' { + declare module.exports: $Exports<'eslint/lib/options'>; +} +declare module 'eslint/lib/rule-context.js' { + declare module.exports: $Exports<'eslint/lib/rule-context'>; +} +declare module 'eslint/lib/rules.js' { + declare module.exports: $Exports<'eslint/lib/rules'>; +} +declare module 'eslint/lib/rules/accessor-pairs.js' { + declare module.exports: $Exports<'eslint/lib/rules/accessor-pairs'>; +} +declare module 'eslint/lib/rules/array-bracket-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/array-bracket-spacing'>; +} +declare module 'eslint/lib/rules/array-callback-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/array-callback-return'>; +} +declare module 'eslint/lib/rules/arrow-body-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/arrow-body-style'>; +} +declare module 'eslint/lib/rules/arrow-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/arrow-parens'>; +} +declare module 'eslint/lib/rules/arrow-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/arrow-spacing'>; +} +declare module 'eslint/lib/rules/block-scoped-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/block-scoped-var'>; +} +declare module 'eslint/lib/rules/block-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/block-spacing'>; +} +declare module 'eslint/lib/rules/brace-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/brace-style'>; +} +declare module 'eslint/lib/rules/callback-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/callback-return'>; +} +declare module 'eslint/lib/rules/camelcase.js' { + declare module.exports: $Exports<'eslint/lib/rules/camelcase'>; +} +declare module 'eslint/lib/rules/capitalized-comments.js' { + declare module.exports: $Exports<'eslint/lib/rules/capitalized-comments'>; +} +declare module 'eslint/lib/rules/class-methods-use-this.js' { + declare module.exports: $Exports<'eslint/lib/rules/class-methods-use-this'>; +} +declare module 'eslint/lib/rules/comma-dangle.js' { + declare module.exports: $Exports<'eslint/lib/rules/comma-dangle'>; +} +declare module 'eslint/lib/rules/comma-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/comma-spacing'>; +} +declare module 'eslint/lib/rules/comma-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/comma-style'>; +} +declare module 'eslint/lib/rules/complexity.js' { + declare module.exports: $Exports<'eslint/lib/rules/complexity'>; +} +declare module 'eslint/lib/rules/computed-property-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/computed-property-spacing'>; +} +declare module 'eslint/lib/rules/consistent-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/consistent-return'>; +} +declare module 'eslint/lib/rules/consistent-this.js' { + declare module.exports: $Exports<'eslint/lib/rules/consistent-this'>; +} +declare module 'eslint/lib/rules/constructor-super.js' { + declare module.exports: $Exports<'eslint/lib/rules/constructor-super'>; +} +declare module 'eslint/lib/rules/curly.js' { + declare module.exports: $Exports<'eslint/lib/rules/curly'>; +} +declare module 'eslint/lib/rules/default-case.js' { + declare module.exports: $Exports<'eslint/lib/rules/default-case'>; +} +declare module 'eslint/lib/rules/dot-location.js' { + declare module.exports: $Exports<'eslint/lib/rules/dot-location'>; +} +declare module 'eslint/lib/rules/dot-notation.js' { + declare module.exports: $Exports<'eslint/lib/rules/dot-notation'>; +} +declare module 'eslint/lib/rules/eol-last.js' { + declare module.exports: $Exports<'eslint/lib/rules/eol-last'>; +} +declare module 'eslint/lib/rules/eqeqeq.js' { + declare module.exports: $Exports<'eslint/lib/rules/eqeqeq'>; +} +declare module 'eslint/lib/rules/func-call-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-call-spacing'>; +} +declare module 'eslint/lib/rules/func-name-matching.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-name-matching'>; +} +declare module 'eslint/lib/rules/func-names.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-names'>; +} +declare module 'eslint/lib/rules/func-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-style'>; +} +declare module 'eslint/lib/rules/generator-star-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/generator-star-spacing'>; +} +declare module 'eslint/lib/rules/global-require.js' { + declare module.exports: $Exports<'eslint/lib/rules/global-require'>; +} +declare module 'eslint/lib/rules/guard-for-in.js' { + declare module.exports: $Exports<'eslint/lib/rules/guard-for-in'>; +} +declare module 'eslint/lib/rules/handle-callback-err.js' { + declare module.exports: $Exports<'eslint/lib/rules/handle-callback-err'>; +} +declare module 'eslint/lib/rules/id-blacklist.js' { + declare module.exports: $Exports<'eslint/lib/rules/id-blacklist'>; +} +declare module 'eslint/lib/rules/id-length.js' { + declare module.exports: $Exports<'eslint/lib/rules/id-length'>; +} +declare module 'eslint/lib/rules/id-match.js' { + declare module.exports: $Exports<'eslint/lib/rules/id-match'>; +} +declare module 'eslint/lib/rules/indent.js' { + declare module.exports: $Exports<'eslint/lib/rules/indent'>; +} +declare module 'eslint/lib/rules/init-declarations.js' { + declare module.exports: $Exports<'eslint/lib/rules/init-declarations'>; +} +declare module 'eslint/lib/rules/jsx-quotes.js' { + declare module.exports: $Exports<'eslint/lib/rules/jsx-quotes'>; +} +declare module 'eslint/lib/rules/key-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/key-spacing'>; +} +declare module 'eslint/lib/rules/keyword-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/keyword-spacing'>; +} +declare module 'eslint/lib/rules/line-comment-position.js' { + declare module.exports: $Exports<'eslint/lib/rules/line-comment-position'>; +} +declare module 'eslint/lib/rules/linebreak-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/linebreak-style'>; +} +declare module 'eslint/lib/rules/lines-around-comment.js' { + declare module.exports: $Exports<'eslint/lib/rules/lines-around-comment'>; +} +declare module 'eslint/lib/rules/lines-around-directive.js' { + declare module.exports: $Exports<'eslint/lib/rules/lines-around-directive'>; +} +declare module 'eslint/lib/rules/max-depth.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-depth'>; +} +declare module 'eslint/lib/rules/max-len.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-len'>; +} +declare module 'eslint/lib/rules/max-lines.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-lines'>; +} +declare module 'eslint/lib/rules/max-nested-callbacks.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-nested-callbacks'>; +} +declare module 'eslint/lib/rules/max-params.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-params'>; +} +declare module 'eslint/lib/rules/max-statements-per-line.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-statements-per-line'>; +} +declare module 'eslint/lib/rules/max-statements.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-statements'>; +} +declare module 'eslint/lib/rules/multiline-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/multiline-ternary'>; +} +declare module 'eslint/lib/rules/new-cap.js' { + declare module.exports: $Exports<'eslint/lib/rules/new-cap'>; +} +declare module 'eslint/lib/rules/new-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/new-parens'>; +} +declare module 'eslint/lib/rules/newline-after-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/newline-after-var'>; +} +declare module 'eslint/lib/rules/newline-before-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/newline-before-return'>; +} +declare module 'eslint/lib/rules/newline-per-chained-call.js' { + declare module.exports: $Exports<'eslint/lib/rules/newline-per-chained-call'>; +} +declare module 'eslint/lib/rules/no-alert.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-alert'>; +} +declare module 'eslint/lib/rules/no-array-constructor.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-array-constructor'>; +} +declare module 'eslint/lib/rules/no-await-in-loop.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-await-in-loop'>; +} +declare module 'eslint/lib/rules/no-bitwise.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-bitwise'>; +} +declare module 'eslint/lib/rules/no-caller.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-caller'>; +} +declare module 'eslint/lib/rules/no-case-declarations.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-case-declarations'>; +} +declare module 'eslint/lib/rules/no-catch-shadow.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-catch-shadow'>; +} +declare module 'eslint/lib/rules/no-class-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-class-assign'>; +} +declare module 'eslint/lib/rules/no-compare-neg-zero.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-compare-neg-zero'>; +} +declare module 'eslint/lib/rules/no-cond-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-cond-assign'>; +} +declare module 'eslint/lib/rules/no-confusing-arrow.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-confusing-arrow'>; +} +declare module 'eslint/lib/rules/no-console.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-console'>; +} +declare module 'eslint/lib/rules/no-const-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-const-assign'>; +} +declare module 'eslint/lib/rules/no-constant-condition.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-constant-condition'>; +} +declare module 'eslint/lib/rules/no-continue.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-continue'>; +} +declare module 'eslint/lib/rules/no-control-regex.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-control-regex'>; +} +declare module 'eslint/lib/rules/no-debugger.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-debugger'>; +} +declare module 'eslint/lib/rules/no-delete-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-delete-var'>; +} +declare module 'eslint/lib/rules/no-div-regex.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-div-regex'>; +} +declare module 'eslint/lib/rules/no-dupe-args.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-dupe-args'>; +} +declare module 'eslint/lib/rules/no-dupe-class-members.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-dupe-class-members'>; +} +declare module 'eslint/lib/rules/no-dupe-keys.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-dupe-keys'>; +} +declare module 'eslint/lib/rules/no-duplicate-case.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-case'>; +} +declare module 'eslint/lib/rules/no-duplicate-imports.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-imports'>; +} +declare module 'eslint/lib/rules/no-else-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-else-return'>; +} +declare module 'eslint/lib/rules/no-empty-character-class.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty-character-class'>; +} +declare module 'eslint/lib/rules/no-empty-function.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty-function'>; +} +declare module 'eslint/lib/rules/no-empty-pattern.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty-pattern'>; +} +declare module 'eslint/lib/rules/no-empty.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty'>; +} +declare module 'eslint/lib/rules/no-eq-null.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-eq-null'>; +} +declare module 'eslint/lib/rules/no-eval.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-eval'>; +} +declare module 'eslint/lib/rules/no-ex-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-ex-assign'>; +} +declare module 'eslint/lib/rules/no-extend-native.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extend-native'>; +} +declare module 'eslint/lib/rules/no-extra-bind.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-bind'>; +} +declare module 'eslint/lib/rules/no-extra-boolean-cast.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-boolean-cast'>; +} +declare module 'eslint/lib/rules/no-extra-label.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-label'>; +} +declare module 'eslint/lib/rules/no-extra-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-parens'>; +} +declare module 'eslint/lib/rules/no-extra-semi.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-semi'>; +} +declare module 'eslint/lib/rules/no-fallthrough.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-fallthrough'>; +} +declare module 'eslint/lib/rules/no-floating-decimal.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-floating-decimal'>; +} +declare module 'eslint/lib/rules/no-func-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-func-assign'>; +} +declare module 'eslint/lib/rules/no-global-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-global-assign'>; +} +declare module 'eslint/lib/rules/no-implicit-coercion.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-implicit-coercion'>; +} +declare module 'eslint/lib/rules/no-implicit-globals.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-implicit-globals'>; +} +declare module 'eslint/lib/rules/no-implied-eval.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-implied-eval'>; +} +declare module 'eslint/lib/rules/no-inline-comments.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-inline-comments'>; +} +declare module 'eslint/lib/rules/no-inner-declarations.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-inner-declarations'>; +} +declare module 'eslint/lib/rules/no-invalid-regexp.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-invalid-regexp'>; +} +declare module 'eslint/lib/rules/no-invalid-this.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-invalid-this'>; +} +declare module 'eslint/lib/rules/no-irregular-whitespace.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-irregular-whitespace'>; +} +declare module 'eslint/lib/rules/no-iterator.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-iterator'>; +} +declare module 'eslint/lib/rules/no-label-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-label-var'>; +} +declare module 'eslint/lib/rules/no-labels.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-labels'>; +} +declare module 'eslint/lib/rules/no-lone-blocks.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-lone-blocks'>; +} +declare module 'eslint/lib/rules/no-lonely-if.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-lonely-if'>; +} +declare module 'eslint/lib/rules/no-loop-func.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-loop-func'>; +} +declare module 'eslint/lib/rules/no-magic-numbers.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-magic-numbers'>; +} +declare module 'eslint/lib/rules/no-mixed-operators.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-mixed-operators'>; +} +declare module 'eslint/lib/rules/no-mixed-requires.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-mixed-requires'>; +} +declare module 'eslint/lib/rules/no-mixed-spaces-and-tabs.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-mixed-spaces-and-tabs'>; +} +declare module 'eslint/lib/rules/no-multi-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multi-assign'>; +} +declare module 'eslint/lib/rules/no-multi-spaces.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multi-spaces'>; +} +declare module 'eslint/lib/rules/no-multi-str.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multi-str'>; +} +declare module 'eslint/lib/rules/no-multiple-empty-lines.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multiple-empty-lines'>; +} +declare module 'eslint/lib/rules/no-native-reassign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-native-reassign'>; +} +declare module 'eslint/lib/rules/no-negated-condition.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-negated-condition'>; +} +declare module 'eslint/lib/rules/no-negated-in-lhs.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-negated-in-lhs'>; +} +declare module 'eslint/lib/rules/no-nested-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-nested-ternary'>; +} +declare module 'eslint/lib/rules/no-new-func.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-func'>; +} +declare module 'eslint/lib/rules/no-new-object.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-object'>; +} +declare module 'eslint/lib/rules/no-new-require.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-require'>; +} +declare module 'eslint/lib/rules/no-new-symbol.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-symbol'>; +} +declare module 'eslint/lib/rules/no-new-wrappers.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-wrappers'>; +} +declare module 'eslint/lib/rules/no-new.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new'>; +} +declare module 'eslint/lib/rules/no-obj-calls.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-obj-calls'>; +} +declare module 'eslint/lib/rules/no-octal-escape.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-octal-escape'>; +} +declare module 'eslint/lib/rules/no-octal.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-octal'>; +} +declare module 'eslint/lib/rules/no-param-reassign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-param-reassign'>; +} +declare module 'eslint/lib/rules/no-path-concat.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-path-concat'>; +} +declare module 'eslint/lib/rules/no-plusplus.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-plusplus'>; +} +declare module 'eslint/lib/rules/no-process-env.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-process-env'>; +} +declare module 'eslint/lib/rules/no-process-exit.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-process-exit'>; +} +declare module 'eslint/lib/rules/no-proto.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-proto'>; +} +declare module 'eslint/lib/rules/no-prototype-builtins.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-prototype-builtins'>; +} +declare module 'eslint/lib/rules/no-redeclare.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-redeclare'>; +} +declare module 'eslint/lib/rules/no-regex-spaces.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-regex-spaces'>; +} +declare module 'eslint/lib/rules/no-restricted-globals.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-globals'>; +} +declare module 'eslint/lib/rules/no-restricted-imports.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-imports'>; +} +declare module 'eslint/lib/rules/no-restricted-modules.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-modules'>; +} +declare module 'eslint/lib/rules/no-restricted-properties.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-properties'>; +} +declare module 'eslint/lib/rules/no-restricted-syntax.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-syntax'>; +} +declare module 'eslint/lib/rules/no-return-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-return-assign'>; +} +declare module 'eslint/lib/rules/no-return-await.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-return-await'>; +} +declare module 'eslint/lib/rules/no-script-url.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-script-url'>; +} +declare module 'eslint/lib/rules/no-self-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-self-assign'>; +} +declare module 'eslint/lib/rules/no-self-compare.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-self-compare'>; +} +declare module 'eslint/lib/rules/no-sequences.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-sequences'>; +} +declare module 'eslint/lib/rules/no-shadow-restricted-names.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-shadow-restricted-names'>; +} +declare module 'eslint/lib/rules/no-shadow.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-shadow'>; +} +declare module 'eslint/lib/rules/no-spaced-func.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-spaced-func'>; +} +declare module 'eslint/lib/rules/no-sparse-arrays.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-sparse-arrays'>; +} +declare module 'eslint/lib/rules/no-sync.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-sync'>; +} +declare module 'eslint/lib/rules/no-tabs.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-tabs'>; +} +declare module 'eslint/lib/rules/no-template-curly-in-string.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-template-curly-in-string'>; +} +declare module 'eslint/lib/rules/no-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-ternary'>; +} +declare module 'eslint/lib/rules/no-this-before-super.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-this-before-super'>; +} +declare module 'eslint/lib/rules/no-throw-literal.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-throw-literal'>; +} +declare module 'eslint/lib/rules/no-trailing-spaces.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-trailing-spaces'>; +} +declare module 'eslint/lib/rules/no-undef-init.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-undef-init'>; +} +declare module 'eslint/lib/rules/no-undef.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-undef'>; +} +declare module 'eslint/lib/rules/no-undefined.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-undefined'>; +} +declare module 'eslint/lib/rules/no-underscore-dangle.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-underscore-dangle'>; +} +declare module 'eslint/lib/rules/no-unexpected-multiline.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unexpected-multiline'>; +} +declare module 'eslint/lib/rules/no-unmodified-loop-condition.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unmodified-loop-condition'>; +} +declare module 'eslint/lib/rules/no-unneeded-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unneeded-ternary'>; +} +declare module 'eslint/lib/rules/no-unreachable.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unreachable'>; +} +declare module 'eslint/lib/rules/no-unsafe-finally.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-finally'>; +} +declare module 'eslint/lib/rules/no-unsafe-negation.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-negation'>; +} +declare module 'eslint/lib/rules/no-unused-expressions.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unused-expressions'>; +} +declare module 'eslint/lib/rules/no-unused-labels.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unused-labels'>; +} +declare module 'eslint/lib/rules/no-unused-vars.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unused-vars'>; +} +declare module 'eslint/lib/rules/no-use-before-define.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-use-before-define'>; +} +declare module 'eslint/lib/rules/no-useless-call.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-call'>; +} +declare module 'eslint/lib/rules/no-useless-computed-key.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-computed-key'>; +} +declare module 'eslint/lib/rules/no-useless-concat.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-concat'>; +} +declare module 'eslint/lib/rules/no-useless-constructor.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-constructor'>; +} +declare module 'eslint/lib/rules/no-useless-escape.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-escape'>; +} +declare module 'eslint/lib/rules/no-useless-rename.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-rename'>; +} +declare module 'eslint/lib/rules/no-useless-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-return'>; +} +declare module 'eslint/lib/rules/no-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-var'>; +} +declare module 'eslint/lib/rules/no-void.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-void'>; +} +declare module 'eslint/lib/rules/no-warning-comments.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-warning-comments'>; +} +declare module 'eslint/lib/rules/no-whitespace-before-property.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-whitespace-before-property'>; +} +declare module 'eslint/lib/rules/no-with.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-with'>; +} +declare module 'eslint/lib/rules/nonblock-statement-body-position.js' { + declare module.exports: $Exports<'eslint/lib/rules/nonblock-statement-body-position'>; +} +declare module 'eslint/lib/rules/object-curly-newline.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-curly-newline'>; +} +declare module 'eslint/lib/rules/object-curly-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-curly-spacing'>; +} +declare module 'eslint/lib/rules/object-property-newline.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-property-newline'>; +} +declare module 'eslint/lib/rules/object-shorthand.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-shorthand'>; +} +declare module 'eslint/lib/rules/one-var-declaration-per-line.js' { + declare module.exports: $Exports<'eslint/lib/rules/one-var-declaration-per-line'>; +} +declare module 'eslint/lib/rules/one-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/one-var'>; +} +declare module 'eslint/lib/rules/operator-assignment.js' { + declare module.exports: $Exports<'eslint/lib/rules/operator-assignment'>; +} +declare module 'eslint/lib/rules/operator-linebreak.js' { + declare module.exports: $Exports<'eslint/lib/rules/operator-linebreak'>; +} +declare module 'eslint/lib/rules/padded-blocks.js' { + declare module.exports: $Exports<'eslint/lib/rules/padded-blocks'>; +} +declare module 'eslint/lib/rules/prefer-arrow-callback.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-arrow-callback'>; +} +declare module 'eslint/lib/rules/prefer-const.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-const'>; +} +declare module 'eslint/lib/rules/prefer-destructuring.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-destructuring'>; +} +declare module 'eslint/lib/rules/prefer-numeric-literals.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-numeric-literals'>; +} +declare module 'eslint/lib/rules/prefer-promise-reject-errors.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-promise-reject-errors'>; +} +declare module 'eslint/lib/rules/prefer-reflect.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-reflect'>; +} +declare module 'eslint/lib/rules/prefer-rest-params.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-rest-params'>; +} +declare module 'eslint/lib/rules/prefer-spread.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-spread'>; +} +declare module 'eslint/lib/rules/prefer-template.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-template'>; +} +declare module 'eslint/lib/rules/quote-props.js' { + declare module.exports: $Exports<'eslint/lib/rules/quote-props'>; +} +declare module 'eslint/lib/rules/quotes.js' { + declare module.exports: $Exports<'eslint/lib/rules/quotes'>; +} +declare module 'eslint/lib/rules/radix.js' { + declare module.exports: $Exports<'eslint/lib/rules/radix'>; +} +declare module 'eslint/lib/rules/require-await.js' { + declare module.exports: $Exports<'eslint/lib/rules/require-await'>; +} +declare module 'eslint/lib/rules/require-jsdoc.js' { + declare module.exports: $Exports<'eslint/lib/rules/require-jsdoc'>; +} +declare module 'eslint/lib/rules/require-yield.js' { + declare module.exports: $Exports<'eslint/lib/rules/require-yield'>; +} +declare module 'eslint/lib/rules/rest-spread-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/rest-spread-spacing'>; +} +declare module 'eslint/lib/rules/semi-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/semi-spacing'>; +} +declare module 'eslint/lib/rules/semi.js' { + declare module.exports: $Exports<'eslint/lib/rules/semi'>; +} +declare module 'eslint/lib/rules/sort-imports.js' { + declare module.exports: $Exports<'eslint/lib/rules/sort-imports'>; +} +declare module 'eslint/lib/rules/sort-keys.js' { + declare module.exports: $Exports<'eslint/lib/rules/sort-keys'>; +} +declare module 'eslint/lib/rules/sort-vars.js' { + declare module.exports: $Exports<'eslint/lib/rules/sort-vars'>; +} +declare module 'eslint/lib/rules/space-before-blocks.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-before-blocks'>; +} +declare module 'eslint/lib/rules/space-before-function-paren.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-before-function-paren'>; +} +declare module 'eslint/lib/rules/space-in-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-in-parens'>; +} +declare module 'eslint/lib/rules/space-infix-ops.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-infix-ops'>; +} +declare module 'eslint/lib/rules/space-unary-ops.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-unary-ops'>; +} +declare module 'eslint/lib/rules/spaced-comment.js' { + declare module.exports: $Exports<'eslint/lib/rules/spaced-comment'>; +} +declare module 'eslint/lib/rules/strict.js' { + declare module.exports: $Exports<'eslint/lib/rules/strict'>; +} +declare module 'eslint/lib/rules/symbol-description.js' { + declare module.exports: $Exports<'eslint/lib/rules/symbol-description'>; +} +declare module 'eslint/lib/rules/template-curly-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/template-curly-spacing'>; +} +declare module 'eslint/lib/rules/template-tag-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/template-tag-spacing'>; +} +declare module 'eslint/lib/rules/unicode-bom.js' { + declare module.exports: $Exports<'eslint/lib/rules/unicode-bom'>; +} +declare module 'eslint/lib/rules/use-isnan.js' { + declare module.exports: $Exports<'eslint/lib/rules/use-isnan'>; +} +declare module 'eslint/lib/rules/valid-jsdoc.js' { + declare module.exports: $Exports<'eslint/lib/rules/valid-jsdoc'>; +} +declare module 'eslint/lib/rules/valid-typeof.js' { + declare module.exports: $Exports<'eslint/lib/rules/valid-typeof'>; +} +declare module 'eslint/lib/rules/vars-on-top.js' { + declare module.exports: $Exports<'eslint/lib/rules/vars-on-top'>; +} +declare module 'eslint/lib/rules/wrap-iife.js' { + declare module.exports: $Exports<'eslint/lib/rules/wrap-iife'>; +} +declare module 'eslint/lib/rules/wrap-regex.js' { + declare module.exports: $Exports<'eslint/lib/rules/wrap-regex'>; +} +declare module 'eslint/lib/rules/yield-star-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/yield-star-spacing'>; +} +declare module 'eslint/lib/rules/yoda.js' { + declare module.exports: $Exports<'eslint/lib/rules/yoda'>; +} +declare module 'eslint/lib/testers/event-generator-tester.js' { + declare module.exports: $Exports<'eslint/lib/testers/event-generator-tester'>; +} +declare module 'eslint/lib/testers/rule-tester.js' { + declare module.exports: $Exports<'eslint/lib/testers/rule-tester'>; +} +declare module 'eslint/lib/timing.js' { + declare module.exports: $Exports<'eslint/lib/timing'>; +} +declare module 'eslint/lib/token-store/backward-token-comment-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/backward-token-comment-cursor'>; +} +declare module 'eslint/lib/token-store/backward-token-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/backward-token-cursor'>; +} +declare module 'eslint/lib/token-store/cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/cursor'>; +} +declare module 'eslint/lib/token-store/cursors.js' { + declare module.exports: $Exports<'eslint/lib/token-store/cursors'>; +} +declare module 'eslint/lib/token-store/decorative-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/decorative-cursor'>; +} +declare module 'eslint/lib/token-store/filter-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/filter-cursor'>; +} +declare module 'eslint/lib/token-store/forward-token-comment-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/forward-token-comment-cursor'>; +} +declare module 'eslint/lib/token-store/forward-token-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/forward-token-cursor'>; +} +declare module 'eslint/lib/token-store/index.js' { + declare module.exports: $Exports<'eslint/lib/token-store/index'>; +} +declare module 'eslint/lib/token-store/limit-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/limit-cursor'>; +} +declare module 'eslint/lib/token-store/padded-token-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/padded-token-cursor'>; +} +declare module 'eslint/lib/token-store/skip-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/skip-cursor'>; +} +declare module 'eslint/lib/token-store/utils.js' { + declare module.exports: $Exports<'eslint/lib/token-store/utils'>; +} +declare module 'eslint/lib/util/comment-event-generator.js' { + declare module.exports: $Exports<'eslint/lib/util/comment-event-generator'>; +} +declare module 'eslint/lib/util/fix-tracker.js' { + declare module.exports: $Exports<'eslint/lib/util/fix-tracker'>; +} +declare module 'eslint/lib/util/glob-util.js' { + declare module.exports: $Exports<'eslint/lib/util/glob-util'>; +} +declare module 'eslint/lib/util/glob.js' { + declare module.exports: $Exports<'eslint/lib/util/glob'>; +} +declare module 'eslint/lib/util/hash.js' { + declare module.exports: $Exports<'eslint/lib/util/hash'>; +} +declare module 'eslint/lib/util/keywords.js' { + declare module.exports: $Exports<'eslint/lib/util/keywords'>; +} +declare module 'eslint/lib/util/module-resolver.js' { + declare module.exports: $Exports<'eslint/lib/util/module-resolver'>; +} +declare module 'eslint/lib/util/node-event-generator.js' { + declare module.exports: $Exports<'eslint/lib/util/node-event-generator'>; +} +declare module 'eslint/lib/util/npm-util.js' { + declare module.exports: $Exports<'eslint/lib/util/npm-util'>; +} +declare module 'eslint/lib/util/path-util.js' { + declare module.exports: $Exports<'eslint/lib/util/path-util'>; +} +declare module 'eslint/lib/util/patterns/letters.js' { + declare module.exports: $Exports<'eslint/lib/util/patterns/letters'>; +} +declare module 'eslint/lib/util/rule-fixer.js' { + declare module.exports: $Exports<'eslint/lib/util/rule-fixer'>; +} +declare module 'eslint/lib/util/source-code-fixer.js' { + declare module.exports: $Exports<'eslint/lib/util/source-code-fixer'>; +} +declare module 'eslint/lib/util/source-code-util.js' { + declare module.exports: $Exports<'eslint/lib/util/source-code-util'>; +} +declare module 'eslint/lib/util/source-code.js' { + declare module.exports: $Exports<'eslint/lib/util/source-code'>; +} +declare module 'eslint/lib/util/traverser.js' { + declare module.exports: $Exports<'eslint/lib/util/traverser'>; +} +declare module 'eslint/lib/util/xml-escape.js' { + declare module.exports: $Exports<'eslint/lib/util/xml-escape'>; +} diff --git a/flow-typed/npm/find-up_vx.x.x.js b/flow-typed/npm/find-up_vx.x.x.js new file mode 100644 index 0000000..47807b5 --- /dev/null +++ b/flow-typed/npm/find-up_vx.x.x.js @@ -0,0 +1,33 @@ +// flow-typed signature: b8b9296e6d8d1b1cfceba633433974b2 +// flow-typed version: <>/find-up_v^2.1.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'find-up' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'find-up' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ + + +// Filename aliases +declare module 'find-up/index' { + declare module.exports: $Exports<'find-up'>; +} +declare module 'find-up/index.js' { + declare module.exports: $Exports<'find-up'>; +} diff --git a/flow-typed/npm/flow-bin_v0.x.x.js b/flow-typed/npm/flow-bin_v0.x.x.js new file mode 100644 index 0000000..c538e20 --- /dev/null +++ b/flow-typed/npm/flow-bin_v0.x.x.js @@ -0,0 +1,6 @@ +// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 +// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x + +declare module "flow-bin" { + declare module.exports: string; +} diff --git a/flow-typed/npm/flow-copy-source_vx.x.x.js b/flow-typed/npm/flow-copy-source_vx.x.x.js new file mode 100644 index 0000000..00bddd7 --- /dev/null +++ b/flow-typed/npm/flow-copy-source_vx.x.x.js @@ -0,0 +1,53 @@ +// flow-typed signature: 051a890ccba6f3ac23b3efa90a1206c7 +// flow-typed version: <>/flow-copy-source_v^1.1.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'flow-copy-source' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'flow-copy-source' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'flow-copy-source/bin/flow-copy-source' { + declare module.exports: any; +} + +declare module 'flow-copy-source/src/index' { + declare module.exports: any; +} + +declare module 'flow-copy-source/src/kefir-copy-file' { + declare module.exports: any; +} + +declare module 'flow-copy-source/src/kefir-glob' { + declare module.exports: any; +} + +// Filename aliases +declare module 'flow-copy-source/bin/flow-copy-source.js' { + declare module.exports: $Exports<'flow-copy-source/bin/flow-copy-source'>; +} +declare module 'flow-copy-source/src/index.js' { + declare module.exports: $Exports<'flow-copy-source/src/index'>; +} +declare module 'flow-copy-source/src/kefir-copy-file.js' { + declare module.exports: $Exports<'flow-copy-source/src/kefir-copy-file'>; +} +declare module 'flow-copy-source/src/kefir-glob.js' { + declare module.exports: $Exports<'flow-copy-source/src/kefir-glob'>; +} diff --git a/flow-typed/npm/flow-coverage-report_vx.x.x.js b/flow-typed/npm/flow-coverage-report_vx.x.x.js new file mode 100644 index 0000000..4ddf29a --- /dev/null +++ b/flow-typed/npm/flow-coverage-report_vx.x.x.js @@ -0,0 +1,641 @@ +// flow-typed signature: 123e917a8638011e7a64ddb691ab6501 +// flow-typed version: <>/flow-coverage-report_v^0.3.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'flow-coverage-report' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'flow-coverage-report' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'flow-coverage-report/assets/codemirror-annotatescrollbar-addon' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/codemirror-javascript-mode' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/codemirror-simplescrollbars-addon' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/codemirror' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/flow-highlight-source' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/jquery-3.1.0.min' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/semantic-tablesort' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/assets/semantic.min' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/bin/flow-coverage-report' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/cli/args' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/cli/config' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/cli/index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/body-coverage-sourcefile' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/body-coverage-summary' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/coverage-file-table-head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/coverage-file-table-row' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/coverage-meter-bar' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/coverage-summary-table' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/footer' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/components/html-report-page' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/flow' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/promisified' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/report-html' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/report-json' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/lib/report-text' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/fixtures' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-flow' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-package-index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-exec' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-file' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-glob' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-mkdirp' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/common' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-body-coverage-sourcefile' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-body-coverage-summary' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-file-table-head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-file-table-row' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-meter-bar' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-summary-table' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-footer' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-html-report-page' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-report-html' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-report-json' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/dist/test/unit/test-report-text' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/cli/args' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/cli/config' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/cli/index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/body-coverage-sourcefile' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/body-coverage-summary' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/coverage-file-table-head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/coverage-file-table-row' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/coverage-meter-bar' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/coverage-summary-table' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/footer' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/components/html-report-page' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/flow' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/promisified' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/report-html' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/report-json' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/lib/report-text' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/fixtures' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-flow' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-package-index' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-exec' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-file' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-glob' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-mkdirp' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/common' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-body-coverage-sourcefile' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-body-coverage-summary' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-file-table-head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-file-table-row' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-meter-bar' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-summary-table' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-footer' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-head' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-html-report-page' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-report-html' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-report-json' { + declare module.exports: any; +} + +declare module 'flow-coverage-report/src/test/unit/test-report-text' { + declare module.exports: any; +} + +// Filename aliases +declare module 'flow-coverage-report/assets/codemirror-annotatescrollbar-addon.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/codemirror-annotatescrollbar-addon'>; +} +declare module 'flow-coverage-report/assets/codemirror-javascript-mode.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/codemirror-javascript-mode'>; +} +declare module 'flow-coverage-report/assets/codemirror-simplescrollbars-addon.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/codemirror-simplescrollbars-addon'>; +} +declare module 'flow-coverage-report/assets/codemirror.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/codemirror'>; +} +declare module 'flow-coverage-report/assets/flow-highlight-source.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/flow-highlight-source'>; +} +declare module 'flow-coverage-report/assets/index.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/index'>; +} +declare module 'flow-coverage-report/assets/jquery-3.1.0.min.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/jquery-3.1.0.min'>; +} +declare module 'flow-coverage-report/assets/semantic-tablesort.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/semantic-tablesort'>; +} +declare module 'flow-coverage-report/assets/semantic.min.js' { + declare module.exports: $Exports<'flow-coverage-report/assets/semantic.min'>; +} +declare module 'flow-coverage-report/bin/flow-coverage-report.js' { + declare module.exports: $Exports<'flow-coverage-report/bin/flow-coverage-report'>; +} +declare module 'flow-coverage-report/dist/lib/cli/args.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/cli/args'>; +} +declare module 'flow-coverage-report/dist/lib/cli/config.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/cli/config'>; +} +declare module 'flow-coverage-report/dist/lib/cli/index.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/cli/index'>; +} +declare module 'flow-coverage-report/dist/lib/components/body-coverage-sourcefile.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/body-coverage-sourcefile'>; +} +declare module 'flow-coverage-report/dist/lib/components/body-coverage-summary.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/body-coverage-summary'>; +} +declare module 'flow-coverage-report/dist/lib/components/coverage-file-table-head.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/coverage-file-table-head'>; +} +declare module 'flow-coverage-report/dist/lib/components/coverage-file-table-row.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/coverage-file-table-row'>; +} +declare module 'flow-coverage-report/dist/lib/components/coverage-meter-bar.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/coverage-meter-bar'>; +} +declare module 'flow-coverage-report/dist/lib/components/coverage-summary-table.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/coverage-summary-table'>; +} +declare module 'flow-coverage-report/dist/lib/components/footer.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/footer'>; +} +declare module 'flow-coverage-report/dist/lib/components/head.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/head'>; +} +declare module 'flow-coverage-report/dist/lib/components/html-report-page.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/components/html-report-page'>; +} +declare module 'flow-coverage-report/dist/lib/flow.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/flow'>; +} +declare module 'flow-coverage-report/dist/lib/index.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/index'>; +} +declare module 'flow-coverage-report/dist/lib/promisified.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/promisified'>; +} +declare module 'flow-coverage-report/dist/lib/report-html.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/report-html'>; +} +declare module 'flow-coverage-report/dist/lib/report-json.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/report-json'>; +} +declare module 'flow-coverage-report/dist/lib/report-text.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/lib/report-text'>; +} +declare module 'flow-coverage-report/dist/test/unit/fixtures.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/fixtures'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-flow.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-flow'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-index.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-index'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-package-index.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-package-index'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-exec.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-promisified/test-exec'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-file.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-promisified/test-file'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-glob.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-promisified/test-glob'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-promisified/test-mkdirp.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-promisified/test-mkdirp'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/common.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/common'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-body-coverage-sourcefile.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-body-coverage-sourcefile'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-body-coverage-summary.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-body-coverage-summary'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-file-table-head.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-file-table-head'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-file-table-row.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-file-table-row'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-meter-bar.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-meter-bar'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-summary-table.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-coverage-summary-table'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-footer.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-footer'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-head.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-head'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-react-components/test-html-report-page.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-react-components/test-html-report-page'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-report-html.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-report-html'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-report-json.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-report-json'>; +} +declare module 'flow-coverage-report/dist/test/unit/test-report-text.js' { + declare module.exports: $Exports<'flow-coverage-report/dist/test/unit/test-report-text'>; +} +declare module 'flow-coverage-report/src/lib/cli/args.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/cli/args'>; +} +declare module 'flow-coverage-report/src/lib/cli/config.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/cli/config'>; +} +declare module 'flow-coverage-report/src/lib/cli/index.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/cli/index'>; +} +declare module 'flow-coverage-report/src/lib/components/body-coverage-sourcefile.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/body-coverage-sourcefile'>; +} +declare module 'flow-coverage-report/src/lib/components/body-coverage-summary.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/body-coverage-summary'>; +} +declare module 'flow-coverage-report/src/lib/components/coverage-file-table-head.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/coverage-file-table-head'>; +} +declare module 'flow-coverage-report/src/lib/components/coverage-file-table-row.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/coverage-file-table-row'>; +} +declare module 'flow-coverage-report/src/lib/components/coverage-meter-bar.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/coverage-meter-bar'>; +} +declare module 'flow-coverage-report/src/lib/components/coverage-summary-table.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/coverage-summary-table'>; +} +declare module 'flow-coverage-report/src/lib/components/footer.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/footer'>; +} +declare module 'flow-coverage-report/src/lib/components/head.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/head'>; +} +declare module 'flow-coverage-report/src/lib/components/html-report-page.jsx' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/components/html-report-page'>; +} +declare module 'flow-coverage-report/src/lib/flow.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/flow'>; +} +declare module 'flow-coverage-report/src/lib/index.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/index'>; +} +declare module 'flow-coverage-report/src/lib/promisified.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/promisified'>; +} +declare module 'flow-coverage-report/src/lib/report-html.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/report-html'>; +} +declare module 'flow-coverage-report/src/lib/report-json.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/report-json'>; +} +declare module 'flow-coverage-report/src/lib/report-text.js' { + declare module.exports: $Exports<'flow-coverage-report/src/lib/report-text'>; +} +declare module 'flow-coverage-report/src/test/unit/fixtures.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/fixtures'>; +} +declare module 'flow-coverage-report/src/test/unit/test-flow.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-flow'>; +} +declare module 'flow-coverage-report/src/test/unit/test-index.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-index'>; +} +declare module 'flow-coverage-report/src/test/unit/test-package-index.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-package-index'>; +} +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-exec.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-promisified/test-exec'>; +} +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-file.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-promisified/test-file'>; +} +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-glob.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-promisified/test-glob'>; +} +declare module 'flow-coverage-report/src/test/unit/test-promisified/test-mkdirp.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-promisified/test-mkdirp'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/common.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/common'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-body-coverage-sourcefile.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-body-coverage-sourcefile'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-body-coverage-summary.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-body-coverage-summary'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-file-table-head.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-coverage-file-table-head'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-file-table-row.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-coverage-file-table-row'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-meter-bar.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-coverage-meter-bar'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-coverage-summary-table.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-coverage-summary-table'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-footer.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-footer'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-head.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-head'>; +} +declare module 'flow-coverage-report/src/test/unit/test-react-components/test-html-report-page.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-react-components/test-html-report-page'>; +} +declare module 'flow-coverage-report/src/test/unit/test-report-html.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-report-html'>; +} +declare module 'flow-coverage-report/src/test/unit/test-report-json.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-report-json'>; +} +declare module 'flow-coverage-report/src/test/unit/test-report-text.js' { + declare module.exports: $Exports<'flow-coverage-report/src/test/unit/test-report-text'>; +} diff --git a/flow-typed/npm/flow-typed_vx.x.x.js b/flow-typed/npm/flow-typed_vx.x.x.js new file mode 100644 index 0000000..6f37804 --- /dev/null +++ b/flow-typed/npm/flow-typed_vx.x.x.js @@ -0,0 +1,158 @@ +// flow-typed signature: db575f34958efc4c94f56b8dfbce1e6e +// flow-typed version: <>/flow-typed_v^2.0.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'flow-typed' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'flow-typed' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'flow-typed/dist/cli' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/create-stub' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/install' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/runTests' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/search' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/update-cache' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/update' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/validateDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/version' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/codeSign' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/fileUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/flowProjectUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/git' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/github' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/libDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/node' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/npmProjectUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/semver' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/stubUtils' { + declare module.exports: any; +} + +// Filename aliases +declare module 'flow-typed/dist/cli.js' { + declare module.exports: $Exports<'flow-typed/dist/cli'>; +} +declare module 'flow-typed/dist/commands/create-stub.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/create-stub'>; +} +declare module 'flow-typed/dist/commands/install.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/install'>; +} +declare module 'flow-typed/dist/commands/runTests.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/runTests'>; +} +declare module 'flow-typed/dist/commands/search.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/search'>; +} +declare module 'flow-typed/dist/commands/update-cache.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/update-cache'>; +} +declare module 'flow-typed/dist/commands/update.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/update'>; +} +declare module 'flow-typed/dist/commands/validateDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/validateDefs'>; +} +declare module 'flow-typed/dist/commands/version.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/version'>; +} +declare module 'flow-typed/dist/lib/codeSign.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/codeSign'>; +} +declare module 'flow-typed/dist/lib/fileUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/fileUtils'>; +} +declare module 'flow-typed/dist/lib/flowProjectUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/flowProjectUtils'>; +} +declare module 'flow-typed/dist/lib/git.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/git'>; +} +declare module 'flow-typed/dist/lib/github.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/github'>; +} +declare module 'flow-typed/dist/lib/libDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/libDefs'>; +} +declare module 'flow-typed/dist/lib/node.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/node'>; +} +declare module 'flow-typed/dist/lib/npmProjectUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/npmProjectUtils'>; +} +declare module 'flow-typed/dist/lib/semver.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/semver'>; +} +declare module 'flow-typed/dist/lib/stubUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/stubUtils'>; +} diff --git a/flow-typed/npm/glob_vx.x.x.js b/flow-typed/npm/glob_vx.x.x.js new file mode 100644 index 0000000..9e229a5 --- /dev/null +++ b/flow-typed/npm/glob_vx.x.x.js @@ -0,0 +1,46 @@ +// flow-typed signature: 0093cb33cb6d512c3d885a6142a96a34 +// flow-typed version: <>/glob_v^7.1.1/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'glob' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'glob' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'glob/common' { + declare module.exports: any; +} + +declare module 'glob/glob' { + declare module.exports: any; +} + +declare module 'glob/sync' { + declare module.exports: any; +} + +// Filename aliases +declare module 'glob/common.js' { + declare module.exports: $Exports<'glob/common'>; +} +declare module 'glob/glob.js' { + declare module.exports: $Exports<'glob/glob'>; +} +declare module 'glob/sync.js' { + declare module.exports: $Exports<'glob/sync'>; +} diff --git a/flow-typed/npm/jest_v19.x.x.js b/flow-typed/npm/jest_v19.x.x.js new file mode 100644 index 0000000..fd4797c --- /dev/null +++ b/flow-typed/npm/jest_v19.x.x.js @@ -0,0 +1,449 @@ +// flow-typed signature: adc2f239806ddd8eb09272d1b4e23cb9 +// flow-typed version: 7dc2a8971e/jest_v19.x.x/flow_>=v0.33.x + +type JestMockFn = { + (...args: Array): any, + /** + * An object for introspecting mock calls + */ + mock: { + /** + * An array that represents all calls that have been made into this mock + * function. Each call is represented by an array of arguments that were + * passed during the call. + */ + calls: Array>, + /** + * An array that contains all the object instances that have been + * instantiated from this mock function. + */ + instances: mixed, + }, + /** + * Resets all information stored in the mockFn.mock.calls and + * mockFn.mock.instances arrays. Often this is useful when you want to clean + * up a mock's usage data between two assertions. + */ + mockClear(): Function, + /** + * Resets all information stored in the mock. This is useful when you want to + * completely restore a mock back to its initial state. + */ + mockReset(): Function, + /** + * Accepts a function that should be used as the implementation of the mock. + * The mock itself will still record all calls that go into and instances + * that come from itself -- the only difference is that the implementation + * will also be executed when the mock is called. + */ + mockImplementation(fn: Function): JestMockFn, + /** + * Accepts a function that will be used as an implementation of the mock for + * one call to the mocked function. Can be chained so that multiple function + * calls produce different results. + */ + mockImplementationOnce(fn: Function): JestMockFn, + /** + * Just a simple sugar function for returning `this` + */ + mockReturnThis(): void, + /** + * Deprecated: use jest.fn(() => value) instead + */ + mockReturnValue(value: any): JestMockFn, + /** + * Sugar for only returning a value once inside your mock + */ + mockReturnValueOnce(value: any): JestMockFn, +} + +type JestAsymmetricEqualityType = { + /** + * A custom Jasmine equality tester + */ + asymmetricMatch(value: mixed): boolean, +} + +type JestCallsType = { + allArgs(): mixed, + all(): mixed, + any(): boolean, + count(): number, + first(): mixed, + mostRecent(): mixed, + reset(): void, +} + +type JestClockType = { + install(): void, + mockDate(date: Date): void, + tick(): void, + uninstall(): void, +} + +type JestMatcherResult = { + message?: string | ()=>string, + pass: boolean, +} + +type JestMatcher = (actual: any, expected: any) => JestMatcherResult; + +type JestExpectType = { + not: JestExpectType, + /** + * If you have a mock function, you can use .lastCalledWith to test what + * arguments it was last called with. + */ + lastCalledWith(...args: Array): void, + /** + * toBe just checks that a value is what you expect. It uses === to check + * strict equality. + */ + toBe(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toBeCalled(): void, + /** + * Use .toBeCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toBeCalledWith(...args: Array): void, + /** + * Using exact equality with floating point numbers is a bad idea. Rounding + * means that intuitive things fail. + */ + toBeCloseTo(num: number, delta: any): void, + /** + * Use .toBeDefined to check that a variable is not undefined. + */ + toBeDefined(): void, + /** + * Use .toBeFalsy when you don't care what a value is, you just want to + * ensure a value is false in a boolean context. + */ + toBeFalsy(): void, + /** + * To compare floating point numbers, you can use toBeGreaterThan. + */ + toBeGreaterThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeGreaterThanOrEqual. + */ + toBeGreaterThanOrEqual(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThan. + */ + toBeLessThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThanOrEqual. + */ + toBeLessThanOrEqual(number: number): void, + /** + * Use .toBeInstanceOf(Class) to check that an object is an instance of a + * class. + */ + toBeInstanceOf(cls: Class<*>): void, + /** + * .toBeNull() is the same as .toBe(null) but the error messages are a bit + * nicer. + */ + toBeNull(): void, + /** + * Use .toBeTruthy when you don't care what a value is, you just want to + * ensure a value is true in a boolean context. + */ + toBeTruthy(): void, + /** + * Use .toBeUndefined to check that a variable is undefined. + */ + toBeUndefined(): void, + /** + * Use .toContain when you want to check that an item is in a list. For + * testing the items in the list, this uses ===, a strict equality check. + */ + toContain(item: any): void, + /** + * Use .toContainEqual when you want to check that an item is in a list. For + * testing the items in the list, this matcher recursively checks the + * equality of all fields, rather than checking for object identity. + */ + toContainEqual(item: any): void, + /** + * Use .toEqual when you want to check that two objects have the same value. + * This matcher recursively checks the equality of all fields, rather than + * checking for object identity. + */ + toEqual(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toHaveBeenCalled(): void, + /** + * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact + * number of times. + */ + toHaveBeenCalledTimes(number: number): void, + /** + * Use .toHaveBeenCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toHaveBeenCalledWith(...args: Array): void, + /** + * Check that an object has a .length property and it is set to a certain + * numeric value. + */ + toHaveLength(number: number): void, + /** + * + */ + toHaveProperty(propPath: string, value?: any): void, + /** + * Use .toMatch to check that a string matches a regular expression. + */ + toMatch(regexp: RegExp): void, + /** + * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. + */ + toMatchObject(object: Object): void, + /** + * This ensures that a React component matches the most recent snapshot. + */ + toMatchSnapshot(name?: string): void, + /** + * Use .toThrow to test that a function throws when it is called. + */ + toThrow(message?: string | Error): void, + /** + * Use .toThrowError to test that a function throws a specific error when it + * is called. The argument can be a string for the error message, a class for + * the error, or a regex that should match the error. + */ + toThrowError(message?: string | Error | RegExp): void, + /** + * Use .toThrowErrorMatchingSnapshot to test that a function throws a error + * matching the most recent snapshot when it is called. + */ + toThrowErrorMatchingSnapshot(): void, +} + +type JestObjectType = { + /** + * Disables automatic mocking in the module loader. + * + * After this method is called, all `require()`s will return the real + * versions of each module (rather than a mocked version). + */ + disableAutomock(): JestObjectType, + /** + * An un-hoisted version of disableAutomock + */ + autoMockOff(): JestObjectType, + /** + * Enables automatic mocking in the module loader. + */ + enableAutomock(): JestObjectType, + /** + * An un-hoisted version of enableAutomock + */ + autoMockOn(): JestObjectType, + /** + * Resets the state of all mocks. Equivalent to calling .mockReset() on every + * mocked function. + */ + resetAllMocks(): JestObjectType, + /** + * Removes any pending timers from the timer system. + */ + clearAllTimers(): void, + /** + * The same as `mock` but not moved to the top of the expectation by + * babel-jest. + */ + doMock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * The same as `unmock` but not moved to the top of the expectation by + * babel-jest. + */ + dontMock(moduleName: string): JestObjectType, + /** + * Returns a new, unused mock function. Optionally takes a mock + * implementation. + */ + fn(implementation?: Function): JestMockFn, + /** + * Determines if the given function is a mocked function. + */ + isMockFunction(fn: Function): boolean, + /** + * Given the name of a module, use the automatic mocking system to generate a + * mocked version of the module for you. + */ + genMockFromModule(moduleName: string): any, + /** + * Mocks a module with an auto-mocked version when it is being required. + * + * The second argument can be used to specify an explicit module factory that + * is being run instead of using Jest's automocking feature. + * + * The third argument can be used to create virtual mocks -- mocks of modules + * that don't exist anywhere in the system. + */ + mock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * Resets the module registry - the cache of all required modules. This is + * useful to isolate modules where local state might conflict between tests. + */ + resetModules(): JestObjectType, + /** + * Exhausts the micro-task queue (usually interfaced in node via + * process.nextTick). + */ + runAllTicks(): void, + /** + * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), + * setInterval(), and setImmediate()). + */ + runAllTimers(): void, + /** + * Exhausts all tasks queued by setImmediate(). + */ + runAllImmediates(): void, + /** + * Executes only the macro task queue (i.e. all tasks queued by setTimeout() + * or setInterval() and setImmediate()). + */ + runTimersToTime(msToRun: number): void, + /** + * Executes only the macro-tasks that are currently pending (i.e., only the + * tasks that have been queued by setTimeout() or setInterval() up to this + * point) + */ + runOnlyPendingTimers(): void, + /** + * Explicitly supplies the mock object that the module system should return + * for the specified module. Note: It is recommended to use jest.mock() + * instead. + */ + setMock(moduleName: string, moduleExports: any): JestObjectType, + /** + * Indicates that the module system should never return a mocked version of + * the specified module from require() (e.g. that it should always return the + * real module). + */ + unmock(moduleName: string): JestObjectType, + /** + * Instructs Jest to use fake versions of the standard timer functions + * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, + * setImmediate and clearImmediate). + */ + useFakeTimers(): JestObjectType, + /** + * Instructs Jest to use the real versions of the standard timer functions. + */ + useRealTimers(): JestObjectType, + /** + * Creates a mock function similar to jest.fn but also tracks calls to + * object[methodName]. + */ + spyOn(object: Object, methodName: string): JestMockFn, +} + +type JestSpyType = { + calls: JestCallsType, +} + +/** Runs this function after every test inside this context */ +declare function afterEach(fn: Function): void; +/** Runs this function before every test inside this context */ +declare function beforeEach(fn: Function): void; +/** Runs this function after all tests have finished inside this context */ +declare function afterAll(fn: Function): void; +/** Runs this function before any tests have started inside this context */ +declare function beforeAll(fn: Function): void; +/** A context for grouping tests together */ +declare function describe(name: string, fn: Function): void; + +/** An individual test unit */ +declare var it: { + /** + * An individual test unit + * + * @param {string} Name of Test + * @param {Function} Test + */ + (name: string, fn?: Function): ?Promise, + /** + * Only run this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + only(name: string, fn?: Function): ?Promise, + /** + * Skip running this test + * + * @param {string} Name of Test + * @param {Function} Test + */ + skip(name: string, fn?: Function): ?Promise, + /** + * Run the test concurrently + * + * @param {string} Name of Test + * @param {Function} Test + */ + concurrent(name: string, fn?: Function): ?Promise, +}; +declare function fit(name: string, fn: Function): ?Promise; +/** An individual test unit */ +declare var test: typeof it; +/** A disabled group of tests */ +declare var xdescribe: typeof describe; +/** A focused group of tests */ +declare var fdescribe: typeof describe; +/** A disabled individual test */ +declare var xit: typeof it; +/** A disabled individual test */ +declare var xtest: typeof it; + +/** The expect function is used every time you want to test a value */ +declare var expect: { + /** The object that you want to make assertions against */ + (value: any): JestExpectType, + /** Add additional Jasmine matchers to Jest's roster */ + extend(matchers: {[name:string]: JestMatcher}): void, + /** Add a module that formats application-specific data structures. */ + addSnapshotSerializer(serializer: (input: Object) => string): void, + assertions(expectedAssertions: number): void, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + objectContaining(value: Object): void, + /** Matches any received string that contains the exact expected string. */ + stringContaining(value: string): void, + stringMatching(value: string | RegExp): void, +}; + +// TODO handle return type +// http://jasmine.github.io/2.4/introduction.html#section-Spies +declare function spyOn(value: mixed, method: string): Object; + +/** Holds all functions related to manipulating test runner */ +declare var jest: JestObjectType + +/** + * The global Jamine object, this is generally not exposed as the public API, + * using features inside here could break in later versions of Jest. + */ +declare var jasmine: { + DEFAULT_TIMEOUT_INTERVAL: number, + any(value: mixed): JestAsymmetricEqualityType, + anything(): void, + arrayContaining(value: Array): void, + clock(): JestClockType, + createSpy(name: string): JestSpyType, + createSpyObj(baseName: string, methodNames: Array): {[methodName: string]: JestSpyType}, + objectContaining(value: Object): void, + stringMatching(value: string): void, +} diff --git a/flow-typed/npm/jest_vx.x.x.js b/flow-typed/npm/jest_vx.x.x.js new file mode 100644 index 0000000..4dfaf25 --- /dev/null +++ b/flow-typed/npm/jest_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 025dd27faac2d1859339c29e52980c87 +// flow-typed version: <>/jest_v^19.0.2/flow_v0.40.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'jest' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'jest' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'jest/bin/jest' { + declare module.exports: any; +} + +declare module 'jest/build/jest' { + declare module.exports: any; +} + +// Filename aliases +declare module 'jest/bin/jest.js' { + declare module.exports: $Exports<'jest/bin/jest'>; +} +declare module 'jest/build/jest.js' { + declare module.exports: $Exports<'jest/build/jest'>; +} diff --git a/flow-typed/npm/mkdirp_v0.5.x.js b/flow-typed/npm/mkdirp_v0.5.x.js new file mode 100644 index 0000000..e26f9a4 --- /dev/null +++ b/flow-typed/npm/mkdirp_v0.5.x.js @@ -0,0 +1,13 @@ +// flow-typed signature: 82aa0feffc2bbd64dce3bec492f5d601 +// flow-typed version: 3315d89a00/mkdirp_v0.5.x/flow_>=v0.25.0 + +declare module 'mkdirp' { + declare type Options = number | { mode?: number; fs?: mixed }; + + declare type Callback = (err: ?Error, path: ?string) => void; + + declare module.exports: { + (path: string, options?: Options | Callback, callback?: Callback): void; + sync(path: string, options?: Options): void; + }; +} diff --git a/flow-typed/npm/mock-fs_vx.x.x.js b/flow-typed/npm/mock-fs_vx.x.x.js new file mode 100644 index 0000000..dbb42db --- /dev/null +++ b/flow-typed/npm/mock-fs_vx.x.x.js @@ -0,0 +1,214 @@ +// flow-typed signature: 18fab0a61f79575dd9ee78fdfa8613dc +// flow-typed version: <>/mock-fs_v^4.2.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'mock-fs' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'mock-fs' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'mock-fs/benchmarks/read-integration-mock' { + declare module.exports: any; +} + +declare module 'mock-fs/benchmarks/read-integration-real' { + declare module.exports: any; +} + +declare module 'mock-fs/benchmarks/read-mock' { + declare module.exports: any; +} + +declare module 'mock-fs/benchmarks/read-real' { + declare module.exports: any; +} + +declare module 'mock-fs/benchmarks/write-integration-mock' { + declare module.exports: any; +} + +declare module 'mock-fs/benchmarks/write-integration-real' { + declare module.exports: any; +} + +declare module 'mock-fs/benchmarks/write-mock' { + declare module.exports: any; +} + +declare module 'mock-fs/benchmarks/write-real' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/binding' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/descriptor' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/directory' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/error' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/file' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/filesystem' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/index' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/item' { + declare module.exports: any; +} + +declare module 'mock-fs/lib/symlink' { + declare module.exports: any; +} + +declare module 'mock-fs/test/helper' { + declare module.exports: any; +} + +declare module 'mock-fs/test/integration/filecount' { + declare module.exports: any; +} + +declare module 'mock-fs/test/integration/filecount.spec' { + declare module.exports: any; +} + +declare module 'mock-fs/test/lib/binding.spec' { + declare module.exports: any; +} + +declare module 'mock-fs/test/lib/descriptor.spec' { + declare module.exports: any; +} + +declare module 'mock-fs/test/lib/directory.spec' { + declare module.exports: any; +} + +declare module 'mock-fs/test/lib/file.spec' { + declare module.exports: any; +} + +declare module 'mock-fs/test/lib/filesystem.spec' { + declare module.exports: any; +} + +declare module 'mock-fs/test/lib/index.spec' { + declare module.exports: any; +} + +declare module 'mock-fs/test/lib/item.spec' { + declare module.exports: any; +} + +// Filename aliases +declare module 'mock-fs/benchmarks/read-integration-mock.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/read-integration-mock'>; +} +declare module 'mock-fs/benchmarks/read-integration-real.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/read-integration-real'>; +} +declare module 'mock-fs/benchmarks/read-mock.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/read-mock'>; +} +declare module 'mock-fs/benchmarks/read-real.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/read-real'>; +} +declare module 'mock-fs/benchmarks/write-integration-mock.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/write-integration-mock'>; +} +declare module 'mock-fs/benchmarks/write-integration-real.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/write-integration-real'>; +} +declare module 'mock-fs/benchmarks/write-mock.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/write-mock'>; +} +declare module 'mock-fs/benchmarks/write-real.js' { + declare module.exports: $Exports<'mock-fs/benchmarks/write-real'>; +} +declare module 'mock-fs/lib/binding.js' { + declare module.exports: $Exports<'mock-fs/lib/binding'>; +} +declare module 'mock-fs/lib/descriptor.js' { + declare module.exports: $Exports<'mock-fs/lib/descriptor'>; +} +declare module 'mock-fs/lib/directory.js' { + declare module.exports: $Exports<'mock-fs/lib/directory'>; +} +declare module 'mock-fs/lib/error.js' { + declare module.exports: $Exports<'mock-fs/lib/error'>; +} +declare module 'mock-fs/lib/file.js' { + declare module.exports: $Exports<'mock-fs/lib/file'>; +} +declare module 'mock-fs/lib/filesystem.js' { + declare module.exports: $Exports<'mock-fs/lib/filesystem'>; +} +declare module 'mock-fs/lib/index.js' { + declare module.exports: $Exports<'mock-fs/lib/index'>; +} +declare module 'mock-fs/lib/item.js' { + declare module.exports: $Exports<'mock-fs/lib/item'>; +} +declare module 'mock-fs/lib/symlink.js' { + declare module.exports: $Exports<'mock-fs/lib/symlink'>; +} +declare module 'mock-fs/test/helper.js' { + declare module.exports: $Exports<'mock-fs/test/helper'>; +} +declare module 'mock-fs/test/integration/filecount.js' { + declare module.exports: $Exports<'mock-fs/test/integration/filecount'>; +} +declare module 'mock-fs/test/integration/filecount.spec.js' { + declare module.exports: $Exports<'mock-fs/test/integration/filecount.spec'>; +} +declare module 'mock-fs/test/lib/binding.spec.js' { + declare module.exports: $Exports<'mock-fs/test/lib/binding.spec'>; +} +declare module 'mock-fs/test/lib/descriptor.spec.js' { + declare module.exports: $Exports<'mock-fs/test/lib/descriptor.spec'>; +} +declare module 'mock-fs/test/lib/directory.spec.js' { + declare module.exports: $Exports<'mock-fs/test/lib/directory.spec'>; +} +declare module 'mock-fs/test/lib/file.spec.js' { + declare module.exports: $Exports<'mock-fs/test/lib/file.spec'>; +} +declare module 'mock-fs/test/lib/filesystem.spec.js' { + declare module.exports: $Exports<'mock-fs/test/lib/filesystem.spec'>; +} +declare module 'mock-fs/test/lib/index.spec.js' { + declare module.exports: $Exports<'mock-fs/test/lib/index.spec'>; +} +declare module 'mock-fs/test/lib/item.spec.js' { + declare module.exports: $Exports<'mock-fs/test/lib/item.spec'>; +} diff --git a/flow-typed/npm/nps_vx.x.x.js b/flow-typed/npm/nps_vx.x.x.js new file mode 100644 index 0000000..fb1d595 --- /dev/null +++ b/flow-typed/npm/nps_vx.x.x.js @@ -0,0 +1,130 @@ +// flow-typed signature: fed37203b8c7992cd457595f681657bd +// flow-typed version: <>/nps_v^5.0.4/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'nps' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'nps' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'nps/dist/__mocks__/console' { + declare module.exports: any; +} + +declare module 'nps/dist/__mocks__/find-up' { + declare module.exports: any; +} + +declare module 'nps/dist/__mocks__/get-logger' { + declare module.exports: any; +} + +declare module 'nps/dist/__mocks__/readline-sync' { + declare module.exports: any; +} + +declare module 'nps/dist/bin-utils/autocomplete-get-scripts' { + declare module.exports: any; +} + +declare module 'nps/dist/bin-utils/index' { + declare module.exports: any; +} + +declare module 'nps/dist/bin-utils/initialize/index' { + declare module.exports: any; +} + +declare module 'nps/dist/bin-utils/parser' { + declare module.exports: any; +} + +declare module 'nps/dist/bin/nps' { + declare module.exports: any; +} + +declare module 'nps/dist/get-logger' { + declare module.exports: any; +} + +declare module 'nps/dist/get-script-to-run' { + declare module.exports: any; +} + +declare module 'nps/dist/get-scripts-from-config' { + declare module.exports: any; +} + +declare module 'nps/dist/index' { + declare module.exports: any; +} + +declare module 'nps/dist/kebab-and-camel-casify' { + declare module.exports: any; +} + +declare module 'nps/dist/resolve-script-object-to-string' { + declare module.exports: any; +} + +// Filename aliases +declare module 'nps/dist/__mocks__/console.js' { + declare module.exports: $Exports<'nps/dist/__mocks__/console'>; +} +declare module 'nps/dist/__mocks__/find-up.js' { + declare module.exports: $Exports<'nps/dist/__mocks__/find-up'>; +} +declare module 'nps/dist/__mocks__/get-logger.js' { + declare module.exports: $Exports<'nps/dist/__mocks__/get-logger'>; +} +declare module 'nps/dist/__mocks__/readline-sync.js' { + declare module.exports: $Exports<'nps/dist/__mocks__/readline-sync'>; +} +declare module 'nps/dist/bin-utils/autocomplete-get-scripts.js' { + declare module.exports: $Exports<'nps/dist/bin-utils/autocomplete-get-scripts'>; +} +declare module 'nps/dist/bin-utils/index.js' { + declare module.exports: $Exports<'nps/dist/bin-utils/index'>; +} +declare module 'nps/dist/bin-utils/initialize/index.js' { + declare module.exports: $Exports<'nps/dist/bin-utils/initialize/index'>; +} +declare module 'nps/dist/bin-utils/parser.js' { + declare module.exports: $Exports<'nps/dist/bin-utils/parser'>; +} +declare module 'nps/dist/bin/nps.js' { + declare module.exports: $Exports<'nps/dist/bin/nps'>; +} +declare module 'nps/dist/get-logger.js' { + declare module.exports: $Exports<'nps/dist/get-logger'>; +} +declare module 'nps/dist/get-script-to-run.js' { + declare module.exports: $Exports<'nps/dist/get-script-to-run'>; +} +declare module 'nps/dist/get-scripts-from-config.js' { + declare module.exports: $Exports<'nps/dist/get-scripts-from-config'>; +} +declare module 'nps/dist/index.js' { + declare module.exports: $Exports<'nps/dist/index'>; +} +declare module 'nps/dist/kebab-and-camel-casify.js' { + declare module.exports: $Exports<'nps/dist/kebab-and-camel-casify'>; +} +declare module 'nps/dist/resolve-script-object-to-string.js' { + declare module.exports: $Exports<'nps/dist/resolve-script-object-to-string'>; +} diff --git a/flow-typed/npm/ora_vx.x.x.js b/flow-typed/npm/ora_vx.x.x.js new file mode 100644 index 0000000..94ee173 --- /dev/null +++ b/flow-typed/npm/ora_vx.x.x.js @@ -0,0 +1,33 @@ +// flow-typed signature: d87f635467667e61f2d821603fc3ad63 +// flow-typed version: <>/ora_v^1.1.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'ora' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'ora' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ + + +// Filename aliases +declare module 'ora/index' { + declare module.exports: $Exports<'ora'>; +} +declare module 'ora/index.js' { + declare module.exports: $Exports<'ora'>; +} diff --git a/flow-typed/npm/outdent_vx.x.x.js b/flow-typed/npm/outdent_vx.x.x.js new file mode 100644 index 0000000..44c5295 --- /dev/null +++ b/flow-typed/npm/outdent_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: e0df8b720013794eb37f38fe72fc2fef +// flow-typed version: <>/outdent_v^0.3.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'outdent' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'outdent' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'outdent/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'outdent/lib/index.js' { + declare module.exports: $Exports<'outdent/lib/index'>; +} diff --git a/flow-typed/npm/ramda_vx.x.x.js b/flow-typed/npm/ramda_vx.x.x.js new file mode 100644 index 0000000..1d866c8 --- /dev/null +++ b/flow-typed/npm/ramda_vx.x.x.js @@ -0,0 +1,2215 @@ +// flow-typed signature: 1b0fd38e4f7800d6900c17784b1ab63a +// flow-typed version: <>/ramda_v^0.23.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'ramda' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'ramda' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'ramda/dist/ramda' { + declare module.exports: any; +} + +declare module 'ramda/dist/ramda.min' { + declare module.exports: any; +} + +declare module 'ramda/src/__' { + declare module.exports: any; +} + +declare module 'ramda/src/add' { + declare module.exports: any; +} + +declare module 'ramda/src/addIndex' { + declare module.exports: any; +} + +declare module 'ramda/src/adjust' { + declare module.exports: any; +} + +declare module 'ramda/src/all' { + declare module.exports: any; +} + +declare module 'ramda/src/allPass' { + declare module.exports: any; +} + +declare module 'ramda/src/always' { + declare module.exports: any; +} + +declare module 'ramda/src/and' { + declare module.exports: any; +} + +declare module 'ramda/src/any' { + declare module.exports: any; +} + +declare module 'ramda/src/anyPass' { + declare module.exports: any; +} + +declare module 'ramda/src/ap' { + declare module.exports: any; +} + +declare module 'ramda/src/aperture' { + declare module.exports: any; +} + +declare module 'ramda/src/append' { + declare module.exports: any; +} + +declare module 'ramda/src/apply' { + declare module.exports: any; +} + +declare module 'ramda/src/applySpec' { + declare module.exports: any; +} + +declare module 'ramda/src/ascend' { + declare module.exports: any; +} + +declare module 'ramda/src/assoc' { + declare module.exports: any; +} + +declare module 'ramda/src/assocPath' { + declare module.exports: any; +} + +declare module 'ramda/src/binary' { + declare module.exports: any; +} + +declare module 'ramda/src/bind' { + declare module.exports: any; +} + +declare module 'ramda/src/both' { + declare module.exports: any; +} + +declare module 'ramda/src/call' { + declare module.exports: any; +} + +declare module 'ramda/src/chain' { + declare module.exports: any; +} + +declare module 'ramda/src/clamp' { + declare module.exports: any; +} + +declare module 'ramda/src/clone' { + declare module.exports: any; +} + +declare module 'ramda/src/comparator' { + declare module.exports: any; +} + +declare module 'ramda/src/complement' { + declare module.exports: any; +} + +declare module 'ramda/src/compose' { + declare module.exports: any; +} + +declare module 'ramda/src/composeK' { + declare module.exports: any; +} + +declare module 'ramda/src/composeP' { + declare module.exports: any; +} + +declare module 'ramda/src/concat' { + declare module.exports: any; +} + +declare module 'ramda/src/cond' { + declare module.exports: any; +} + +declare module 'ramda/src/construct' { + declare module.exports: any; +} + +declare module 'ramda/src/constructN' { + declare module.exports: any; +} + +declare module 'ramda/src/contains' { + declare module.exports: any; +} + +declare module 'ramda/src/converge' { + declare module.exports: any; +} + +declare module 'ramda/src/countBy' { + declare module.exports: any; +} + +declare module 'ramda/src/curry' { + declare module.exports: any; +} + +declare module 'ramda/src/curryN' { + declare module.exports: any; +} + +declare module 'ramda/src/dec' { + declare module.exports: any; +} + +declare module 'ramda/src/defaultTo' { + declare module.exports: any; +} + +declare module 'ramda/src/descend' { + declare module.exports: any; +} + +declare module 'ramda/src/difference' { + declare module.exports: any; +} + +declare module 'ramda/src/differenceWith' { + declare module.exports: any; +} + +declare module 'ramda/src/dissoc' { + declare module.exports: any; +} + +declare module 'ramda/src/dissocPath' { + declare module.exports: any; +} + +declare module 'ramda/src/divide' { + declare module.exports: any; +} + +declare module 'ramda/src/drop' { + declare module.exports: any; +} + +declare module 'ramda/src/dropLast' { + declare module.exports: any; +} + +declare module 'ramda/src/dropLastWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/dropRepeats' { + declare module.exports: any; +} + +declare module 'ramda/src/dropRepeatsWith' { + declare module.exports: any; +} + +declare module 'ramda/src/dropWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/either' { + declare module.exports: any; +} + +declare module 'ramda/src/empty' { + declare module.exports: any; +} + +declare module 'ramda/src/eqBy' { + declare module.exports: any; +} + +declare module 'ramda/src/eqProps' { + declare module.exports: any; +} + +declare module 'ramda/src/equals' { + declare module.exports: any; +} + +declare module 'ramda/src/evolve' { + declare module.exports: any; +} + +declare module 'ramda/src/F' { + declare module.exports: any; +} + +declare module 'ramda/src/filter' { + declare module.exports: any; +} + +declare module 'ramda/src/find' { + declare module.exports: any; +} + +declare module 'ramda/src/findIndex' { + declare module.exports: any; +} + +declare module 'ramda/src/findLast' { + declare module.exports: any; +} + +declare module 'ramda/src/findLastIndex' { + declare module.exports: any; +} + +declare module 'ramda/src/flatten' { + declare module.exports: any; +} + +declare module 'ramda/src/flip' { + declare module.exports: any; +} + +declare module 'ramda/src/forEach' { + declare module.exports: any; +} + +declare module 'ramda/src/forEachObjIndexed' { + declare module.exports: any; +} + +declare module 'ramda/src/fromPairs' { + declare module.exports: any; +} + +declare module 'ramda/src/groupBy' { + declare module.exports: any; +} + +declare module 'ramda/src/groupWith' { + declare module.exports: any; +} + +declare module 'ramda/src/gt' { + declare module.exports: any; +} + +declare module 'ramda/src/gte' { + declare module.exports: any; +} + +declare module 'ramda/src/has' { + declare module.exports: any; +} + +declare module 'ramda/src/hasIn' { + declare module.exports: any; +} + +declare module 'ramda/src/head' { + declare module.exports: any; +} + +declare module 'ramda/src/identical' { + declare module.exports: any; +} + +declare module 'ramda/src/identity' { + declare module.exports: any; +} + +declare module 'ramda/src/ifElse' { + declare module.exports: any; +} + +declare module 'ramda/src/inc' { + declare module.exports: any; +} + +declare module 'ramda/src/indexBy' { + declare module.exports: any; +} + +declare module 'ramda/src/indexOf' { + declare module.exports: any; +} + +declare module 'ramda/src/init' { + declare module.exports: any; +} + +declare module 'ramda/src/insert' { + declare module.exports: any; +} + +declare module 'ramda/src/insertAll' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_aperture' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_arity' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_arrayFromIterator' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_assign' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_checkForMethod' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_clone' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_cloneRegExp' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_complement' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_concat' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_contains' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_containsWith' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_createPartialApplicator' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_curry1' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_curry2' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_curry3' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_curryN' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_dispatchable' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_dropLast' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_dropLastWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_equals' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_filter' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_flatCat' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_forceReduced' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_functionName' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_functionsWith' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_has' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_identity' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_indexOf' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isArguments' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isArray' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isFunction' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isInteger' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isNumber' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isObject' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isPlaceholder' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isRegExp' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isString' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_isTransformer' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_makeFlat' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_map' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_objectAssign' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_of' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_pipe' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_pipeP' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_quote' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_reduce' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_reduced' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_Set' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_stepCat' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_toISOString' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_toString' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xall' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xany' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xaperture' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xchain' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xdrop' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xdropLast' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xdropLastWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xdropRepeatsWith' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xdropWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xfBase' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xfilter' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xfind' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xfindIndex' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xfindLast' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xfindLastIndex' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xmap' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xreduceBy' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xtake' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xtakeWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/internal/_xwrap' { + declare module.exports: any; +} + +declare module 'ramda/src/intersection' { + declare module.exports: any; +} + +declare module 'ramda/src/intersectionWith' { + declare module.exports: any; +} + +declare module 'ramda/src/intersperse' { + declare module.exports: any; +} + +declare module 'ramda/src/into' { + declare module.exports: any; +} + +declare module 'ramda/src/invert' { + declare module.exports: any; +} + +declare module 'ramda/src/invertObj' { + declare module.exports: any; +} + +declare module 'ramda/src/invoker' { + declare module.exports: any; +} + +declare module 'ramda/src/is' { + declare module.exports: any; +} + +declare module 'ramda/src/isArrayLike' { + declare module.exports: any; +} + +declare module 'ramda/src/isEmpty' { + declare module.exports: any; +} + +declare module 'ramda/src/isNil' { + declare module.exports: any; +} + +declare module 'ramda/src/join' { + declare module.exports: any; +} + +declare module 'ramda/src/juxt' { + declare module.exports: any; +} + +declare module 'ramda/src/keys' { + declare module.exports: any; +} + +declare module 'ramda/src/keysIn' { + declare module.exports: any; +} + +declare module 'ramda/src/last' { + declare module.exports: any; +} + +declare module 'ramda/src/lastIndexOf' { + declare module.exports: any; +} + +declare module 'ramda/src/length' { + declare module.exports: any; +} + +declare module 'ramda/src/lens' { + declare module.exports: any; +} + +declare module 'ramda/src/lensIndex' { + declare module.exports: any; +} + +declare module 'ramda/src/lensPath' { + declare module.exports: any; +} + +declare module 'ramda/src/lensProp' { + declare module.exports: any; +} + +declare module 'ramda/src/lift' { + declare module.exports: any; +} + +declare module 'ramda/src/liftN' { + declare module.exports: any; +} + +declare module 'ramda/src/lt' { + declare module.exports: any; +} + +declare module 'ramda/src/lte' { + declare module.exports: any; +} + +declare module 'ramda/src/map' { + declare module.exports: any; +} + +declare module 'ramda/src/mapAccum' { + declare module.exports: any; +} + +declare module 'ramda/src/mapAccumRight' { + declare module.exports: any; +} + +declare module 'ramda/src/mapObjIndexed' { + declare module.exports: any; +} + +declare module 'ramda/src/match' { + declare module.exports: any; +} + +declare module 'ramda/src/mathMod' { + declare module.exports: any; +} + +declare module 'ramda/src/max' { + declare module.exports: any; +} + +declare module 'ramda/src/maxBy' { + declare module.exports: any; +} + +declare module 'ramda/src/mean' { + declare module.exports: any; +} + +declare module 'ramda/src/median' { + declare module.exports: any; +} + +declare module 'ramda/src/memoize' { + declare module.exports: any; +} + +declare module 'ramda/src/merge' { + declare module.exports: any; +} + +declare module 'ramda/src/mergeAll' { + declare module.exports: any; +} + +declare module 'ramda/src/mergeWith' { + declare module.exports: any; +} + +declare module 'ramda/src/mergeWithKey' { + declare module.exports: any; +} + +declare module 'ramda/src/min' { + declare module.exports: any; +} + +declare module 'ramda/src/minBy' { + declare module.exports: any; +} + +declare module 'ramda/src/modulo' { + declare module.exports: any; +} + +declare module 'ramda/src/multiply' { + declare module.exports: any; +} + +declare module 'ramda/src/nAry' { + declare module.exports: any; +} + +declare module 'ramda/src/negate' { + declare module.exports: any; +} + +declare module 'ramda/src/none' { + declare module.exports: any; +} + +declare module 'ramda/src/not' { + declare module.exports: any; +} + +declare module 'ramda/src/nth' { + declare module.exports: any; +} + +declare module 'ramda/src/nthArg' { + declare module.exports: any; +} + +declare module 'ramda/src/objOf' { + declare module.exports: any; +} + +declare module 'ramda/src/of' { + declare module.exports: any; +} + +declare module 'ramda/src/omit' { + declare module.exports: any; +} + +declare module 'ramda/src/once' { + declare module.exports: any; +} + +declare module 'ramda/src/or' { + declare module.exports: any; +} + +declare module 'ramda/src/over' { + declare module.exports: any; +} + +declare module 'ramda/src/pair' { + declare module.exports: any; +} + +declare module 'ramda/src/partial' { + declare module.exports: any; +} + +declare module 'ramda/src/partialRight' { + declare module.exports: any; +} + +declare module 'ramda/src/partition' { + declare module.exports: any; +} + +declare module 'ramda/src/path' { + declare module.exports: any; +} + +declare module 'ramda/src/pathEq' { + declare module.exports: any; +} + +declare module 'ramda/src/pathOr' { + declare module.exports: any; +} + +declare module 'ramda/src/pathSatisfies' { + declare module.exports: any; +} + +declare module 'ramda/src/pick' { + declare module.exports: any; +} + +declare module 'ramda/src/pickAll' { + declare module.exports: any; +} + +declare module 'ramda/src/pickBy' { + declare module.exports: any; +} + +declare module 'ramda/src/pipe' { + declare module.exports: any; +} + +declare module 'ramda/src/pipeK' { + declare module.exports: any; +} + +declare module 'ramda/src/pipeP' { + declare module.exports: any; +} + +declare module 'ramda/src/pluck' { + declare module.exports: any; +} + +declare module 'ramda/src/prepend' { + declare module.exports: any; +} + +declare module 'ramda/src/product' { + declare module.exports: any; +} + +declare module 'ramda/src/project' { + declare module.exports: any; +} + +declare module 'ramda/src/prop' { + declare module.exports: any; +} + +declare module 'ramda/src/propEq' { + declare module.exports: any; +} + +declare module 'ramda/src/propIs' { + declare module.exports: any; +} + +declare module 'ramda/src/propOr' { + declare module.exports: any; +} + +declare module 'ramda/src/props' { + declare module.exports: any; +} + +declare module 'ramda/src/propSatisfies' { + declare module.exports: any; +} + +declare module 'ramda/src/range' { + declare module.exports: any; +} + +declare module 'ramda/src/reduce' { + declare module.exports: any; +} + +declare module 'ramda/src/reduceBy' { + declare module.exports: any; +} + +declare module 'ramda/src/reduced' { + declare module.exports: any; +} + +declare module 'ramda/src/reduceRight' { + declare module.exports: any; +} + +declare module 'ramda/src/reduceWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/reject' { + declare module.exports: any; +} + +declare module 'ramda/src/remove' { + declare module.exports: any; +} + +declare module 'ramda/src/repeat' { + declare module.exports: any; +} + +declare module 'ramda/src/replace' { + declare module.exports: any; +} + +declare module 'ramda/src/reverse' { + declare module.exports: any; +} + +declare module 'ramda/src/scan' { + declare module.exports: any; +} + +declare module 'ramda/src/sequence' { + declare module.exports: any; +} + +declare module 'ramda/src/set' { + declare module.exports: any; +} + +declare module 'ramda/src/slice' { + declare module.exports: any; +} + +declare module 'ramda/src/sort' { + declare module.exports: any; +} + +declare module 'ramda/src/sortBy' { + declare module.exports: any; +} + +declare module 'ramda/src/sortWith' { + declare module.exports: any; +} + +declare module 'ramda/src/split' { + declare module.exports: any; +} + +declare module 'ramda/src/splitAt' { + declare module.exports: any; +} + +declare module 'ramda/src/splitEvery' { + declare module.exports: any; +} + +declare module 'ramda/src/splitWhen' { + declare module.exports: any; +} + +declare module 'ramda/src/subtract' { + declare module.exports: any; +} + +declare module 'ramda/src/sum' { + declare module.exports: any; +} + +declare module 'ramda/src/symmetricDifference' { + declare module.exports: any; +} + +declare module 'ramda/src/symmetricDifferenceWith' { + declare module.exports: any; +} + +declare module 'ramda/src/T' { + declare module.exports: any; +} + +declare module 'ramda/src/tail' { + declare module.exports: any; +} + +declare module 'ramda/src/take' { + declare module.exports: any; +} + +declare module 'ramda/src/takeLast' { + declare module.exports: any; +} + +declare module 'ramda/src/takeLastWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/takeWhile' { + declare module.exports: any; +} + +declare module 'ramda/src/tap' { + declare module.exports: any; +} + +declare module 'ramda/src/test' { + declare module.exports: any; +} + +declare module 'ramda/src/times' { + declare module.exports: any; +} + +declare module 'ramda/src/toLower' { + declare module.exports: any; +} + +declare module 'ramda/src/toPairs' { + declare module.exports: any; +} + +declare module 'ramda/src/toPairsIn' { + declare module.exports: any; +} + +declare module 'ramda/src/toString' { + declare module.exports: any; +} + +declare module 'ramda/src/toUpper' { + declare module.exports: any; +} + +declare module 'ramda/src/transduce' { + declare module.exports: any; +} + +declare module 'ramda/src/transpose' { + declare module.exports: any; +} + +declare module 'ramda/src/traverse' { + declare module.exports: any; +} + +declare module 'ramda/src/trim' { + declare module.exports: any; +} + +declare module 'ramda/src/tryCatch' { + declare module.exports: any; +} + +declare module 'ramda/src/type' { + declare module.exports: any; +} + +declare module 'ramda/src/unapply' { + declare module.exports: any; +} + +declare module 'ramda/src/unary' { + declare module.exports: any; +} + +declare module 'ramda/src/uncurryN' { + declare module.exports: any; +} + +declare module 'ramda/src/unfold' { + declare module.exports: any; +} + +declare module 'ramda/src/union' { + declare module.exports: any; +} + +declare module 'ramda/src/unionWith' { + declare module.exports: any; +} + +declare module 'ramda/src/uniq' { + declare module.exports: any; +} + +declare module 'ramda/src/uniqBy' { + declare module.exports: any; +} + +declare module 'ramda/src/uniqWith' { + declare module.exports: any; +} + +declare module 'ramda/src/unless' { + declare module.exports: any; +} + +declare module 'ramda/src/unnest' { + declare module.exports: any; +} + +declare module 'ramda/src/until' { + declare module.exports: any; +} + +declare module 'ramda/src/update' { + declare module.exports: any; +} + +declare module 'ramda/src/useWith' { + declare module.exports: any; +} + +declare module 'ramda/src/values' { + declare module.exports: any; +} + +declare module 'ramda/src/valuesIn' { + declare module.exports: any; +} + +declare module 'ramda/src/view' { + declare module.exports: any; +} + +declare module 'ramda/src/when' { + declare module.exports: any; +} + +declare module 'ramda/src/where' { + declare module.exports: any; +} + +declare module 'ramda/src/whereEq' { + declare module.exports: any; +} + +declare module 'ramda/src/without' { + declare module.exports: any; +} + +declare module 'ramda/src/xprod' { + declare module.exports: any; +} + +declare module 'ramda/src/zip' { + declare module.exports: any; +} + +declare module 'ramda/src/zipObj' { + declare module.exports: any; +} + +declare module 'ramda/src/zipWith' { + declare module.exports: any; +} + +declare module 'ramda/tmp-test-bundle' { + declare module.exports: any; +} + +// Filename aliases +declare module 'ramda/dist/ramda.js' { + declare module.exports: $Exports<'ramda/dist/ramda'>; +} +declare module 'ramda/dist/ramda.min.js' { + declare module.exports: $Exports<'ramda/dist/ramda.min'>; +} +declare module 'ramda/index' { + declare module.exports: $Exports<'ramda'>; +} +declare module 'ramda/index.js' { + declare module.exports: $Exports<'ramda'>; +} +declare module 'ramda/src/__.js' { + declare module.exports: $Exports<'ramda/src/__'>; +} +declare module 'ramda/src/add.js' { + declare module.exports: $Exports<'ramda/src/add'>; +} +declare module 'ramda/src/addIndex.js' { + declare module.exports: $Exports<'ramda/src/addIndex'>; +} +declare module 'ramda/src/adjust.js' { + declare module.exports: $Exports<'ramda/src/adjust'>; +} +declare module 'ramda/src/all.js' { + declare module.exports: $Exports<'ramda/src/all'>; +} +declare module 'ramda/src/allPass.js' { + declare module.exports: $Exports<'ramda/src/allPass'>; +} +declare module 'ramda/src/always.js' { + declare module.exports: $Exports<'ramda/src/always'>; +} +declare module 'ramda/src/and.js' { + declare module.exports: $Exports<'ramda/src/and'>; +} +declare module 'ramda/src/any.js' { + declare module.exports: $Exports<'ramda/src/any'>; +} +declare module 'ramda/src/anyPass.js' { + declare module.exports: $Exports<'ramda/src/anyPass'>; +} +declare module 'ramda/src/ap.js' { + declare module.exports: $Exports<'ramda/src/ap'>; +} +declare module 'ramda/src/aperture.js' { + declare module.exports: $Exports<'ramda/src/aperture'>; +} +declare module 'ramda/src/append.js' { + declare module.exports: $Exports<'ramda/src/append'>; +} +declare module 'ramda/src/apply.js' { + declare module.exports: $Exports<'ramda/src/apply'>; +} +declare module 'ramda/src/applySpec.js' { + declare module.exports: $Exports<'ramda/src/applySpec'>; +} +declare module 'ramda/src/ascend.js' { + declare module.exports: $Exports<'ramda/src/ascend'>; +} +declare module 'ramda/src/assoc.js' { + declare module.exports: $Exports<'ramda/src/assoc'>; +} +declare module 'ramda/src/assocPath.js' { + declare module.exports: $Exports<'ramda/src/assocPath'>; +} +declare module 'ramda/src/binary.js' { + declare module.exports: $Exports<'ramda/src/binary'>; +} +declare module 'ramda/src/bind.js' { + declare module.exports: $Exports<'ramda/src/bind'>; +} +declare module 'ramda/src/both.js' { + declare module.exports: $Exports<'ramda/src/both'>; +} +declare module 'ramda/src/call.js' { + declare module.exports: $Exports<'ramda/src/call'>; +} +declare module 'ramda/src/chain.js' { + declare module.exports: $Exports<'ramda/src/chain'>; +} +declare module 'ramda/src/clamp.js' { + declare module.exports: $Exports<'ramda/src/clamp'>; +} +declare module 'ramda/src/clone.js' { + declare module.exports: $Exports<'ramda/src/clone'>; +} +declare module 'ramda/src/comparator.js' { + declare module.exports: $Exports<'ramda/src/comparator'>; +} +declare module 'ramda/src/complement.js' { + declare module.exports: $Exports<'ramda/src/complement'>; +} +declare module 'ramda/src/compose.js' { + declare module.exports: $Exports<'ramda/src/compose'>; +} +declare module 'ramda/src/composeK.js' { + declare module.exports: $Exports<'ramda/src/composeK'>; +} +declare module 'ramda/src/composeP.js' { + declare module.exports: $Exports<'ramda/src/composeP'>; +} +declare module 'ramda/src/concat.js' { + declare module.exports: $Exports<'ramda/src/concat'>; +} +declare module 'ramda/src/cond.js' { + declare module.exports: $Exports<'ramda/src/cond'>; +} +declare module 'ramda/src/construct.js' { + declare module.exports: $Exports<'ramda/src/construct'>; +} +declare module 'ramda/src/constructN.js' { + declare module.exports: $Exports<'ramda/src/constructN'>; +} +declare module 'ramda/src/contains.js' { + declare module.exports: $Exports<'ramda/src/contains'>; +} +declare module 'ramda/src/converge.js' { + declare module.exports: $Exports<'ramda/src/converge'>; +} +declare module 'ramda/src/countBy.js' { + declare module.exports: $Exports<'ramda/src/countBy'>; +} +declare module 'ramda/src/curry.js' { + declare module.exports: $Exports<'ramda/src/curry'>; +} +declare module 'ramda/src/curryN.js' { + declare module.exports: $Exports<'ramda/src/curryN'>; +} +declare module 'ramda/src/dec.js' { + declare module.exports: $Exports<'ramda/src/dec'>; +} +declare module 'ramda/src/defaultTo.js' { + declare module.exports: $Exports<'ramda/src/defaultTo'>; +} +declare module 'ramda/src/descend.js' { + declare module.exports: $Exports<'ramda/src/descend'>; +} +declare module 'ramda/src/difference.js' { + declare module.exports: $Exports<'ramda/src/difference'>; +} +declare module 'ramda/src/differenceWith.js' { + declare module.exports: $Exports<'ramda/src/differenceWith'>; +} +declare module 'ramda/src/dissoc.js' { + declare module.exports: $Exports<'ramda/src/dissoc'>; +} +declare module 'ramda/src/dissocPath.js' { + declare module.exports: $Exports<'ramda/src/dissocPath'>; +} +declare module 'ramda/src/divide.js' { + declare module.exports: $Exports<'ramda/src/divide'>; +} +declare module 'ramda/src/drop.js' { + declare module.exports: $Exports<'ramda/src/drop'>; +} +declare module 'ramda/src/dropLast.js' { + declare module.exports: $Exports<'ramda/src/dropLast'>; +} +declare module 'ramda/src/dropLastWhile.js' { + declare module.exports: $Exports<'ramda/src/dropLastWhile'>; +} +declare module 'ramda/src/dropRepeats.js' { + declare module.exports: $Exports<'ramda/src/dropRepeats'>; +} +declare module 'ramda/src/dropRepeatsWith.js' { + declare module.exports: $Exports<'ramda/src/dropRepeatsWith'>; +} +declare module 'ramda/src/dropWhile.js' { + declare module.exports: $Exports<'ramda/src/dropWhile'>; +} +declare module 'ramda/src/either.js' { + declare module.exports: $Exports<'ramda/src/either'>; +} +declare module 'ramda/src/empty.js' { + declare module.exports: $Exports<'ramda/src/empty'>; +} +declare module 'ramda/src/eqBy.js' { + declare module.exports: $Exports<'ramda/src/eqBy'>; +} +declare module 'ramda/src/eqProps.js' { + declare module.exports: $Exports<'ramda/src/eqProps'>; +} +declare module 'ramda/src/equals.js' { + declare module.exports: $Exports<'ramda/src/equals'>; +} +declare module 'ramda/src/evolve.js' { + declare module.exports: $Exports<'ramda/src/evolve'>; +} +declare module 'ramda/src/F.js' { + declare module.exports: $Exports<'ramda/src/F'>; +} +declare module 'ramda/src/filter.js' { + declare module.exports: $Exports<'ramda/src/filter'>; +} +declare module 'ramda/src/find.js' { + declare module.exports: $Exports<'ramda/src/find'>; +} +declare module 'ramda/src/findIndex.js' { + declare module.exports: $Exports<'ramda/src/findIndex'>; +} +declare module 'ramda/src/findLast.js' { + declare module.exports: $Exports<'ramda/src/findLast'>; +} +declare module 'ramda/src/findLastIndex.js' { + declare module.exports: $Exports<'ramda/src/findLastIndex'>; +} +declare module 'ramda/src/flatten.js' { + declare module.exports: $Exports<'ramda/src/flatten'>; +} +declare module 'ramda/src/flip.js' { + declare module.exports: $Exports<'ramda/src/flip'>; +} +declare module 'ramda/src/forEach.js' { + declare module.exports: $Exports<'ramda/src/forEach'>; +} +declare module 'ramda/src/forEachObjIndexed.js' { + declare module.exports: $Exports<'ramda/src/forEachObjIndexed'>; +} +declare module 'ramda/src/fromPairs.js' { + declare module.exports: $Exports<'ramda/src/fromPairs'>; +} +declare module 'ramda/src/groupBy.js' { + declare module.exports: $Exports<'ramda/src/groupBy'>; +} +declare module 'ramda/src/groupWith.js' { + declare module.exports: $Exports<'ramda/src/groupWith'>; +} +declare module 'ramda/src/gt.js' { + declare module.exports: $Exports<'ramda/src/gt'>; +} +declare module 'ramda/src/gte.js' { + declare module.exports: $Exports<'ramda/src/gte'>; +} +declare module 'ramda/src/has.js' { + declare module.exports: $Exports<'ramda/src/has'>; +} +declare module 'ramda/src/hasIn.js' { + declare module.exports: $Exports<'ramda/src/hasIn'>; +} +declare module 'ramda/src/head.js' { + declare module.exports: $Exports<'ramda/src/head'>; +} +declare module 'ramda/src/identical.js' { + declare module.exports: $Exports<'ramda/src/identical'>; +} +declare module 'ramda/src/identity.js' { + declare module.exports: $Exports<'ramda/src/identity'>; +} +declare module 'ramda/src/ifElse.js' { + declare module.exports: $Exports<'ramda/src/ifElse'>; +} +declare module 'ramda/src/inc.js' { + declare module.exports: $Exports<'ramda/src/inc'>; +} +declare module 'ramda/src/indexBy.js' { + declare module.exports: $Exports<'ramda/src/indexBy'>; +} +declare module 'ramda/src/indexOf.js' { + declare module.exports: $Exports<'ramda/src/indexOf'>; +} +declare module 'ramda/src/init.js' { + declare module.exports: $Exports<'ramda/src/init'>; +} +declare module 'ramda/src/insert.js' { + declare module.exports: $Exports<'ramda/src/insert'>; +} +declare module 'ramda/src/insertAll.js' { + declare module.exports: $Exports<'ramda/src/insertAll'>; +} +declare module 'ramda/src/internal/_aperture.js' { + declare module.exports: $Exports<'ramda/src/internal/_aperture'>; +} +declare module 'ramda/src/internal/_arity.js' { + declare module.exports: $Exports<'ramda/src/internal/_arity'>; +} +declare module 'ramda/src/internal/_arrayFromIterator.js' { + declare module.exports: $Exports<'ramda/src/internal/_arrayFromIterator'>; +} +declare module 'ramda/src/internal/_assign.js' { + declare module.exports: $Exports<'ramda/src/internal/_assign'>; +} +declare module 'ramda/src/internal/_checkForMethod.js' { + declare module.exports: $Exports<'ramda/src/internal/_checkForMethod'>; +} +declare module 'ramda/src/internal/_clone.js' { + declare module.exports: $Exports<'ramda/src/internal/_clone'>; +} +declare module 'ramda/src/internal/_cloneRegExp.js' { + declare module.exports: $Exports<'ramda/src/internal/_cloneRegExp'>; +} +declare module 'ramda/src/internal/_complement.js' { + declare module.exports: $Exports<'ramda/src/internal/_complement'>; +} +declare module 'ramda/src/internal/_concat.js' { + declare module.exports: $Exports<'ramda/src/internal/_concat'>; +} +declare module 'ramda/src/internal/_contains.js' { + declare module.exports: $Exports<'ramda/src/internal/_contains'>; +} +declare module 'ramda/src/internal/_containsWith.js' { + declare module.exports: $Exports<'ramda/src/internal/_containsWith'>; +} +declare module 'ramda/src/internal/_createPartialApplicator.js' { + declare module.exports: $Exports<'ramda/src/internal/_createPartialApplicator'>; +} +declare module 'ramda/src/internal/_curry1.js' { + declare module.exports: $Exports<'ramda/src/internal/_curry1'>; +} +declare module 'ramda/src/internal/_curry2.js' { + declare module.exports: $Exports<'ramda/src/internal/_curry2'>; +} +declare module 'ramda/src/internal/_curry3.js' { + declare module.exports: $Exports<'ramda/src/internal/_curry3'>; +} +declare module 'ramda/src/internal/_curryN.js' { + declare module.exports: $Exports<'ramda/src/internal/_curryN'>; +} +declare module 'ramda/src/internal/_dispatchable.js' { + declare module.exports: $Exports<'ramda/src/internal/_dispatchable'>; +} +declare module 'ramda/src/internal/_dropLast.js' { + declare module.exports: $Exports<'ramda/src/internal/_dropLast'>; +} +declare module 'ramda/src/internal/_dropLastWhile.js' { + declare module.exports: $Exports<'ramda/src/internal/_dropLastWhile'>; +} +declare module 'ramda/src/internal/_equals.js' { + declare module.exports: $Exports<'ramda/src/internal/_equals'>; +} +declare module 'ramda/src/internal/_filter.js' { + declare module.exports: $Exports<'ramda/src/internal/_filter'>; +} +declare module 'ramda/src/internal/_flatCat.js' { + declare module.exports: $Exports<'ramda/src/internal/_flatCat'>; +} +declare module 'ramda/src/internal/_forceReduced.js' { + declare module.exports: $Exports<'ramda/src/internal/_forceReduced'>; +} +declare module 'ramda/src/internal/_functionName.js' { + declare module.exports: $Exports<'ramda/src/internal/_functionName'>; +} +declare module 'ramda/src/internal/_functionsWith.js' { + declare module.exports: $Exports<'ramda/src/internal/_functionsWith'>; +} +declare module 'ramda/src/internal/_has.js' { + declare module.exports: $Exports<'ramda/src/internal/_has'>; +} +declare module 'ramda/src/internal/_identity.js' { + declare module.exports: $Exports<'ramda/src/internal/_identity'>; +} +declare module 'ramda/src/internal/_indexOf.js' { + declare module.exports: $Exports<'ramda/src/internal/_indexOf'>; +} +declare module 'ramda/src/internal/_isArguments.js' { + declare module.exports: $Exports<'ramda/src/internal/_isArguments'>; +} +declare module 'ramda/src/internal/_isArray.js' { + declare module.exports: $Exports<'ramda/src/internal/_isArray'>; +} +declare module 'ramda/src/internal/_isFunction.js' { + declare module.exports: $Exports<'ramda/src/internal/_isFunction'>; +} +declare module 'ramda/src/internal/_isInteger.js' { + declare module.exports: $Exports<'ramda/src/internal/_isInteger'>; +} +declare module 'ramda/src/internal/_isNumber.js' { + declare module.exports: $Exports<'ramda/src/internal/_isNumber'>; +} +declare module 'ramda/src/internal/_isObject.js' { + declare module.exports: $Exports<'ramda/src/internal/_isObject'>; +} +declare module 'ramda/src/internal/_isPlaceholder.js' { + declare module.exports: $Exports<'ramda/src/internal/_isPlaceholder'>; +} +declare module 'ramda/src/internal/_isRegExp.js' { + declare module.exports: $Exports<'ramda/src/internal/_isRegExp'>; +} +declare module 'ramda/src/internal/_isString.js' { + declare module.exports: $Exports<'ramda/src/internal/_isString'>; +} +declare module 'ramda/src/internal/_isTransformer.js' { + declare module.exports: $Exports<'ramda/src/internal/_isTransformer'>; +} +declare module 'ramda/src/internal/_makeFlat.js' { + declare module.exports: $Exports<'ramda/src/internal/_makeFlat'>; +} +declare module 'ramda/src/internal/_map.js' { + declare module.exports: $Exports<'ramda/src/internal/_map'>; +} +declare module 'ramda/src/internal/_objectAssign.js' { + declare module.exports: $Exports<'ramda/src/internal/_objectAssign'>; +} +declare module 'ramda/src/internal/_of.js' { + declare module.exports: $Exports<'ramda/src/internal/_of'>; +} +declare module 'ramda/src/internal/_pipe.js' { + declare module.exports: $Exports<'ramda/src/internal/_pipe'>; +} +declare module 'ramda/src/internal/_pipeP.js' { + declare module.exports: $Exports<'ramda/src/internal/_pipeP'>; +} +declare module 'ramda/src/internal/_quote.js' { + declare module.exports: $Exports<'ramda/src/internal/_quote'>; +} +declare module 'ramda/src/internal/_reduce.js' { + declare module.exports: $Exports<'ramda/src/internal/_reduce'>; +} +declare module 'ramda/src/internal/_reduced.js' { + declare module.exports: $Exports<'ramda/src/internal/_reduced'>; +} +declare module 'ramda/src/internal/_Set.js' { + declare module.exports: $Exports<'ramda/src/internal/_Set'>; +} +declare module 'ramda/src/internal/_stepCat.js' { + declare module.exports: $Exports<'ramda/src/internal/_stepCat'>; +} +declare module 'ramda/src/internal/_toISOString.js' { + declare module.exports: $Exports<'ramda/src/internal/_toISOString'>; +} +declare module 'ramda/src/internal/_toString.js' { + declare module.exports: $Exports<'ramda/src/internal/_toString'>; +} +declare module 'ramda/src/internal/_xall.js' { + declare module.exports: $Exports<'ramda/src/internal/_xall'>; +} +declare module 'ramda/src/internal/_xany.js' { + declare module.exports: $Exports<'ramda/src/internal/_xany'>; +} +declare module 'ramda/src/internal/_xaperture.js' { + declare module.exports: $Exports<'ramda/src/internal/_xaperture'>; +} +declare module 'ramda/src/internal/_xchain.js' { + declare module.exports: $Exports<'ramda/src/internal/_xchain'>; +} +declare module 'ramda/src/internal/_xdrop.js' { + declare module.exports: $Exports<'ramda/src/internal/_xdrop'>; +} +declare module 'ramda/src/internal/_xdropLast.js' { + declare module.exports: $Exports<'ramda/src/internal/_xdropLast'>; +} +declare module 'ramda/src/internal/_xdropLastWhile.js' { + declare module.exports: $Exports<'ramda/src/internal/_xdropLastWhile'>; +} +declare module 'ramda/src/internal/_xdropRepeatsWith.js' { + declare module.exports: $Exports<'ramda/src/internal/_xdropRepeatsWith'>; +} +declare module 'ramda/src/internal/_xdropWhile.js' { + declare module.exports: $Exports<'ramda/src/internal/_xdropWhile'>; +} +declare module 'ramda/src/internal/_xfBase.js' { + declare module.exports: $Exports<'ramda/src/internal/_xfBase'>; +} +declare module 'ramda/src/internal/_xfilter.js' { + declare module.exports: $Exports<'ramda/src/internal/_xfilter'>; +} +declare module 'ramda/src/internal/_xfind.js' { + declare module.exports: $Exports<'ramda/src/internal/_xfind'>; +} +declare module 'ramda/src/internal/_xfindIndex.js' { + declare module.exports: $Exports<'ramda/src/internal/_xfindIndex'>; +} +declare module 'ramda/src/internal/_xfindLast.js' { + declare module.exports: $Exports<'ramda/src/internal/_xfindLast'>; +} +declare module 'ramda/src/internal/_xfindLastIndex.js' { + declare module.exports: $Exports<'ramda/src/internal/_xfindLastIndex'>; +} +declare module 'ramda/src/internal/_xmap.js' { + declare module.exports: $Exports<'ramda/src/internal/_xmap'>; +} +declare module 'ramda/src/internal/_xreduceBy.js' { + declare module.exports: $Exports<'ramda/src/internal/_xreduceBy'>; +} +declare module 'ramda/src/internal/_xtake.js' { + declare module.exports: $Exports<'ramda/src/internal/_xtake'>; +} +declare module 'ramda/src/internal/_xtakeWhile.js' { + declare module.exports: $Exports<'ramda/src/internal/_xtakeWhile'>; +} +declare module 'ramda/src/internal/_xwrap.js' { + declare module.exports: $Exports<'ramda/src/internal/_xwrap'>; +} +declare module 'ramda/src/intersection.js' { + declare module.exports: $Exports<'ramda/src/intersection'>; +} +declare module 'ramda/src/intersectionWith.js' { + declare module.exports: $Exports<'ramda/src/intersectionWith'>; +} +declare module 'ramda/src/intersperse.js' { + declare module.exports: $Exports<'ramda/src/intersperse'>; +} +declare module 'ramda/src/into.js' { + declare module.exports: $Exports<'ramda/src/into'>; +} +declare module 'ramda/src/invert.js' { + declare module.exports: $Exports<'ramda/src/invert'>; +} +declare module 'ramda/src/invertObj.js' { + declare module.exports: $Exports<'ramda/src/invertObj'>; +} +declare module 'ramda/src/invoker.js' { + declare module.exports: $Exports<'ramda/src/invoker'>; +} +declare module 'ramda/src/is.js' { + declare module.exports: $Exports<'ramda/src/is'>; +} +declare module 'ramda/src/isArrayLike.js' { + declare module.exports: $Exports<'ramda/src/isArrayLike'>; +} +declare module 'ramda/src/isEmpty.js' { + declare module.exports: $Exports<'ramda/src/isEmpty'>; +} +declare module 'ramda/src/isNil.js' { + declare module.exports: $Exports<'ramda/src/isNil'>; +} +declare module 'ramda/src/join.js' { + declare module.exports: $Exports<'ramda/src/join'>; +} +declare module 'ramda/src/juxt.js' { + declare module.exports: $Exports<'ramda/src/juxt'>; +} +declare module 'ramda/src/keys.js' { + declare module.exports: $Exports<'ramda/src/keys'>; +} +declare module 'ramda/src/keysIn.js' { + declare module.exports: $Exports<'ramda/src/keysIn'>; +} +declare module 'ramda/src/last.js' { + declare module.exports: $Exports<'ramda/src/last'>; +} +declare module 'ramda/src/lastIndexOf.js' { + declare module.exports: $Exports<'ramda/src/lastIndexOf'>; +} +declare module 'ramda/src/length.js' { + declare module.exports: $Exports<'ramda/src/length'>; +} +declare module 'ramda/src/lens.js' { + declare module.exports: $Exports<'ramda/src/lens'>; +} +declare module 'ramda/src/lensIndex.js' { + declare module.exports: $Exports<'ramda/src/lensIndex'>; +} +declare module 'ramda/src/lensPath.js' { + declare module.exports: $Exports<'ramda/src/lensPath'>; +} +declare module 'ramda/src/lensProp.js' { + declare module.exports: $Exports<'ramda/src/lensProp'>; +} +declare module 'ramda/src/lift.js' { + declare module.exports: $Exports<'ramda/src/lift'>; +} +declare module 'ramda/src/liftN.js' { + declare module.exports: $Exports<'ramda/src/liftN'>; +} +declare module 'ramda/src/lt.js' { + declare module.exports: $Exports<'ramda/src/lt'>; +} +declare module 'ramda/src/lte.js' { + declare module.exports: $Exports<'ramda/src/lte'>; +} +declare module 'ramda/src/map.js' { + declare module.exports: $Exports<'ramda/src/map'>; +} +declare module 'ramda/src/mapAccum.js' { + declare module.exports: $Exports<'ramda/src/mapAccum'>; +} +declare module 'ramda/src/mapAccumRight.js' { + declare module.exports: $Exports<'ramda/src/mapAccumRight'>; +} +declare module 'ramda/src/mapObjIndexed.js' { + declare module.exports: $Exports<'ramda/src/mapObjIndexed'>; +} +declare module 'ramda/src/match.js' { + declare module.exports: $Exports<'ramda/src/match'>; +} +declare module 'ramda/src/mathMod.js' { + declare module.exports: $Exports<'ramda/src/mathMod'>; +} +declare module 'ramda/src/max.js' { + declare module.exports: $Exports<'ramda/src/max'>; +} +declare module 'ramda/src/maxBy.js' { + declare module.exports: $Exports<'ramda/src/maxBy'>; +} +declare module 'ramda/src/mean.js' { + declare module.exports: $Exports<'ramda/src/mean'>; +} +declare module 'ramda/src/median.js' { + declare module.exports: $Exports<'ramda/src/median'>; +} +declare module 'ramda/src/memoize.js' { + declare module.exports: $Exports<'ramda/src/memoize'>; +} +declare module 'ramda/src/merge.js' { + declare module.exports: $Exports<'ramda/src/merge'>; +} +declare module 'ramda/src/mergeAll.js' { + declare module.exports: $Exports<'ramda/src/mergeAll'>; +} +declare module 'ramda/src/mergeWith.js' { + declare module.exports: $Exports<'ramda/src/mergeWith'>; +} +declare module 'ramda/src/mergeWithKey.js' { + declare module.exports: $Exports<'ramda/src/mergeWithKey'>; +} +declare module 'ramda/src/min.js' { + declare module.exports: $Exports<'ramda/src/min'>; +} +declare module 'ramda/src/minBy.js' { + declare module.exports: $Exports<'ramda/src/minBy'>; +} +declare module 'ramda/src/modulo.js' { + declare module.exports: $Exports<'ramda/src/modulo'>; +} +declare module 'ramda/src/multiply.js' { + declare module.exports: $Exports<'ramda/src/multiply'>; +} +declare module 'ramda/src/nAry.js' { + declare module.exports: $Exports<'ramda/src/nAry'>; +} +declare module 'ramda/src/negate.js' { + declare module.exports: $Exports<'ramda/src/negate'>; +} +declare module 'ramda/src/none.js' { + declare module.exports: $Exports<'ramda/src/none'>; +} +declare module 'ramda/src/not.js' { + declare module.exports: $Exports<'ramda/src/not'>; +} +declare module 'ramda/src/nth.js' { + declare module.exports: $Exports<'ramda/src/nth'>; +} +declare module 'ramda/src/nthArg.js' { + declare module.exports: $Exports<'ramda/src/nthArg'>; +} +declare module 'ramda/src/objOf.js' { + declare module.exports: $Exports<'ramda/src/objOf'>; +} +declare module 'ramda/src/of.js' { + declare module.exports: $Exports<'ramda/src/of'>; +} +declare module 'ramda/src/omit.js' { + declare module.exports: $Exports<'ramda/src/omit'>; +} +declare module 'ramda/src/once.js' { + declare module.exports: $Exports<'ramda/src/once'>; +} +declare module 'ramda/src/or.js' { + declare module.exports: $Exports<'ramda/src/or'>; +} +declare module 'ramda/src/over.js' { + declare module.exports: $Exports<'ramda/src/over'>; +} +declare module 'ramda/src/pair.js' { + declare module.exports: $Exports<'ramda/src/pair'>; +} +declare module 'ramda/src/partial.js' { + declare module.exports: $Exports<'ramda/src/partial'>; +} +declare module 'ramda/src/partialRight.js' { + declare module.exports: $Exports<'ramda/src/partialRight'>; +} +declare module 'ramda/src/partition.js' { + declare module.exports: $Exports<'ramda/src/partition'>; +} +declare module 'ramda/src/path.js' { + declare module.exports: $Exports<'ramda/src/path'>; +} +declare module 'ramda/src/pathEq.js' { + declare module.exports: $Exports<'ramda/src/pathEq'>; +} +declare module 'ramda/src/pathOr.js' { + declare module.exports: $Exports<'ramda/src/pathOr'>; +} +declare module 'ramda/src/pathSatisfies.js' { + declare module.exports: $Exports<'ramda/src/pathSatisfies'>; +} +declare module 'ramda/src/pick.js' { + declare module.exports: $Exports<'ramda/src/pick'>; +} +declare module 'ramda/src/pickAll.js' { + declare module.exports: $Exports<'ramda/src/pickAll'>; +} +declare module 'ramda/src/pickBy.js' { + declare module.exports: $Exports<'ramda/src/pickBy'>; +} +declare module 'ramda/src/pipe.js' { + declare module.exports: $Exports<'ramda/src/pipe'>; +} +declare module 'ramda/src/pipeK.js' { + declare module.exports: $Exports<'ramda/src/pipeK'>; +} +declare module 'ramda/src/pipeP.js' { + declare module.exports: $Exports<'ramda/src/pipeP'>; +} +declare module 'ramda/src/pluck.js' { + declare module.exports: $Exports<'ramda/src/pluck'>; +} +declare module 'ramda/src/prepend.js' { + declare module.exports: $Exports<'ramda/src/prepend'>; +} +declare module 'ramda/src/product.js' { + declare module.exports: $Exports<'ramda/src/product'>; +} +declare module 'ramda/src/project.js' { + declare module.exports: $Exports<'ramda/src/project'>; +} +declare module 'ramda/src/prop.js' { + declare module.exports: $Exports<'ramda/src/prop'>; +} +declare module 'ramda/src/propEq.js' { + declare module.exports: $Exports<'ramda/src/propEq'>; +} +declare module 'ramda/src/propIs.js' { + declare module.exports: $Exports<'ramda/src/propIs'>; +} +declare module 'ramda/src/propOr.js' { + declare module.exports: $Exports<'ramda/src/propOr'>; +} +declare module 'ramda/src/props.js' { + declare module.exports: $Exports<'ramda/src/props'>; +} +declare module 'ramda/src/propSatisfies.js' { + declare module.exports: $Exports<'ramda/src/propSatisfies'>; +} +declare module 'ramda/src/range.js' { + declare module.exports: $Exports<'ramda/src/range'>; +} +declare module 'ramda/src/reduce.js' { + declare module.exports: $Exports<'ramda/src/reduce'>; +} +declare module 'ramda/src/reduceBy.js' { + declare module.exports: $Exports<'ramda/src/reduceBy'>; +} +declare module 'ramda/src/reduced.js' { + declare module.exports: $Exports<'ramda/src/reduced'>; +} +declare module 'ramda/src/reduceRight.js' { + declare module.exports: $Exports<'ramda/src/reduceRight'>; +} +declare module 'ramda/src/reduceWhile.js' { + declare module.exports: $Exports<'ramda/src/reduceWhile'>; +} +declare module 'ramda/src/reject.js' { + declare module.exports: $Exports<'ramda/src/reject'>; +} +declare module 'ramda/src/remove.js' { + declare module.exports: $Exports<'ramda/src/remove'>; +} +declare module 'ramda/src/repeat.js' { + declare module.exports: $Exports<'ramda/src/repeat'>; +} +declare module 'ramda/src/replace.js' { + declare module.exports: $Exports<'ramda/src/replace'>; +} +declare module 'ramda/src/reverse.js' { + declare module.exports: $Exports<'ramda/src/reverse'>; +} +declare module 'ramda/src/scan.js' { + declare module.exports: $Exports<'ramda/src/scan'>; +} +declare module 'ramda/src/sequence.js' { + declare module.exports: $Exports<'ramda/src/sequence'>; +} +declare module 'ramda/src/set.js' { + declare module.exports: $Exports<'ramda/src/set'>; +} +declare module 'ramda/src/slice.js' { + declare module.exports: $Exports<'ramda/src/slice'>; +} +declare module 'ramda/src/sort.js' { + declare module.exports: $Exports<'ramda/src/sort'>; +} +declare module 'ramda/src/sortBy.js' { + declare module.exports: $Exports<'ramda/src/sortBy'>; +} +declare module 'ramda/src/sortWith.js' { + declare module.exports: $Exports<'ramda/src/sortWith'>; +} +declare module 'ramda/src/split.js' { + declare module.exports: $Exports<'ramda/src/split'>; +} +declare module 'ramda/src/splitAt.js' { + declare module.exports: $Exports<'ramda/src/splitAt'>; +} +declare module 'ramda/src/splitEvery.js' { + declare module.exports: $Exports<'ramda/src/splitEvery'>; +} +declare module 'ramda/src/splitWhen.js' { + declare module.exports: $Exports<'ramda/src/splitWhen'>; +} +declare module 'ramda/src/subtract.js' { + declare module.exports: $Exports<'ramda/src/subtract'>; +} +declare module 'ramda/src/sum.js' { + declare module.exports: $Exports<'ramda/src/sum'>; +} +declare module 'ramda/src/symmetricDifference.js' { + declare module.exports: $Exports<'ramda/src/symmetricDifference'>; +} +declare module 'ramda/src/symmetricDifferenceWith.js' { + declare module.exports: $Exports<'ramda/src/symmetricDifferenceWith'>; +} +declare module 'ramda/src/T.js' { + declare module.exports: $Exports<'ramda/src/T'>; +} +declare module 'ramda/src/tail.js' { + declare module.exports: $Exports<'ramda/src/tail'>; +} +declare module 'ramda/src/take.js' { + declare module.exports: $Exports<'ramda/src/take'>; +} +declare module 'ramda/src/takeLast.js' { + declare module.exports: $Exports<'ramda/src/takeLast'>; +} +declare module 'ramda/src/takeLastWhile.js' { + declare module.exports: $Exports<'ramda/src/takeLastWhile'>; +} +declare module 'ramda/src/takeWhile.js' { + declare module.exports: $Exports<'ramda/src/takeWhile'>; +} +declare module 'ramda/src/tap.js' { + declare module.exports: $Exports<'ramda/src/tap'>; +} +declare module 'ramda/src/test.js' { + declare module.exports: $Exports<'ramda/src/test'>; +} +declare module 'ramda/src/times.js' { + declare module.exports: $Exports<'ramda/src/times'>; +} +declare module 'ramda/src/toLower.js' { + declare module.exports: $Exports<'ramda/src/toLower'>; +} +declare module 'ramda/src/toPairs.js' { + declare module.exports: $Exports<'ramda/src/toPairs'>; +} +declare module 'ramda/src/toPairsIn.js' { + declare module.exports: $Exports<'ramda/src/toPairsIn'>; +} +declare module 'ramda/src/toString.js' { + declare module.exports: $Exports<'ramda/src/toString'>; +} +declare module 'ramda/src/toUpper.js' { + declare module.exports: $Exports<'ramda/src/toUpper'>; +} +declare module 'ramda/src/transduce.js' { + declare module.exports: $Exports<'ramda/src/transduce'>; +} +declare module 'ramda/src/transpose.js' { + declare module.exports: $Exports<'ramda/src/transpose'>; +} +declare module 'ramda/src/traverse.js' { + declare module.exports: $Exports<'ramda/src/traverse'>; +} +declare module 'ramda/src/trim.js' { + declare module.exports: $Exports<'ramda/src/trim'>; +} +declare module 'ramda/src/tryCatch.js' { + declare module.exports: $Exports<'ramda/src/tryCatch'>; +} +declare module 'ramda/src/type.js' { + declare module.exports: $Exports<'ramda/src/type'>; +} +declare module 'ramda/src/unapply.js' { + declare module.exports: $Exports<'ramda/src/unapply'>; +} +declare module 'ramda/src/unary.js' { + declare module.exports: $Exports<'ramda/src/unary'>; +} +declare module 'ramda/src/uncurryN.js' { + declare module.exports: $Exports<'ramda/src/uncurryN'>; +} +declare module 'ramda/src/unfold.js' { + declare module.exports: $Exports<'ramda/src/unfold'>; +} +declare module 'ramda/src/union.js' { + declare module.exports: $Exports<'ramda/src/union'>; +} +declare module 'ramda/src/unionWith.js' { + declare module.exports: $Exports<'ramda/src/unionWith'>; +} +declare module 'ramda/src/uniq.js' { + declare module.exports: $Exports<'ramda/src/uniq'>; +} +declare module 'ramda/src/uniqBy.js' { + declare module.exports: $Exports<'ramda/src/uniqBy'>; +} +declare module 'ramda/src/uniqWith.js' { + declare module.exports: $Exports<'ramda/src/uniqWith'>; +} +declare module 'ramda/src/unless.js' { + declare module.exports: $Exports<'ramda/src/unless'>; +} +declare module 'ramda/src/unnest.js' { + declare module.exports: $Exports<'ramda/src/unnest'>; +} +declare module 'ramda/src/until.js' { + declare module.exports: $Exports<'ramda/src/until'>; +} +declare module 'ramda/src/update.js' { + declare module.exports: $Exports<'ramda/src/update'>; +} +declare module 'ramda/src/useWith.js' { + declare module.exports: $Exports<'ramda/src/useWith'>; +} +declare module 'ramda/src/values.js' { + declare module.exports: $Exports<'ramda/src/values'>; +} +declare module 'ramda/src/valuesIn.js' { + declare module.exports: $Exports<'ramda/src/valuesIn'>; +} +declare module 'ramda/src/view.js' { + declare module.exports: $Exports<'ramda/src/view'>; +} +declare module 'ramda/src/when.js' { + declare module.exports: $Exports<'ramda/src/when'>; +} +declare module 'ramda/src/where.js' { + declare module.exports: $Exports<'ramda/src/where'>; +} +declare module 'ramda/src/whereEq.js' { + declare module.exports: $Exports<'ramda/src/whereEq'>; +} +declare module 'ramda/src/without.js' { + declare module.exports: $Exports<'ramda/src/without'>; +} +declare module 'ramda/src/xprod.js' { + declare module.exports: $Exports<'ramda/src/xprod'>; +} +declare module 'ramda/src/zip.js' { + declare module.exports: $Exports<'ramda/src/zip'>; +} +declare module 'ramda/src/zipObj.js' { + declare module.exports: $Exports<'ramda/src/zipObj'>; +} +declare module 'ramda/src/zipWith.js' { + declare module.exports: $Exports<'ramda/src/zipWith'>; +} +declare module 'ramda/tmp-test-bundle.js' { + declare module.exports: $Exports<'ramda/tmp-test-bundle'>; +} diff --git a/flow-typed/npm/rimraf_vx.x.x.js b/flow-typed/npm/rimraf_vx.x.x.js new file mode 100644 index 0000000..09d3677 --- /dev/null +++ b/flow-typed/npm/rimraf_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 4ec35b2341463f8d43cf2c122732c032 +// flow-typed version: <>/rimraf_v^2.6.1/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'rimraf' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'rimraf' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'rimraf/bin' { + declare module.exports: any; +} + +declare module 'rimraf/rimraf' { + declare module.exports: any; +} + +// Filename aliases +declare module 'rimraf/bin.js' { + declare module.exports: $Exports<'rimraf/bin'>; +} +declare module 'rimraf/rimraf.js' { + declare module.exports: $Exports<'rimraf/rimraf'>; +} diff --git a/flow-typed/npm/standard-version_vx.x.x.js b/flow-typed/npm/standard-version_vx.x.x.js new file mode 100644 index 0000000..d9f4440 --- /dev/null +++ b/flow-typed/npm/standard-version_vx.x.x.js @@ -0,0 +1,52 @@ +// flow-typed signature: 12037aecf6de78a9b360027cd2edcbb8 +// flow-typed version: <>/standard-version_v^4.0.0/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'standard-version' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'standard-version' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'standard-version/bin/cli' { + declare module.exports: any; +} + +declare module 'standard-version/command' { + declare module.exports: any; +} + +declare module 'standard-version/test' { + declare module.exports: any; +} + +// Filename aliases +declare module 'standard-version/bin/cli.js' { + declare module.exports: $Exports<'standard-version/bin/cli'>; +} +declare module 'standard-version/command.js' { + declare module.exports: $Exports<'standard-version/command'>; +} +declare module 'standard-version/index' { + declare module.exports: $Exports<'standard-version'>; +} +declare module 'standard-version/index.js' { + declare module.exports: $Exports<'standard-version'>; +} +declare module 'standard-version/test.js' { + declare module.exports: $Exports<'standard-version/test'>; +} diff --git a/flow-typed/npm/yargs_vx.x.x.js b/flow-typed/npm/yargs_vx.x.x.js new file mode 100644 index 0000000..d4d9a35 --- /dev/null +++ b/flow-typed/npm/yargs_vx.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: db754f16904a2088cd19fd3f0931655a +// flow-typed version: <>/yargs_v^7.0.2/flow_v0.42.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'yargs' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'yargs' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'yargs/lib/apply-extends' { + declare module.exports: any; +} + +declare module 'yargs/lib/argsert' { + declare module.exports: any; +} + +declare module 'yargs/lib/assign' { + declare module.exports: any; +} + +declare module 'yargs/lib/command' { + declare module.exports: any; +} + +declare module 'yargs/lib/completion' { + declare module.exports: any; +} + +declare module 'yargs/lib/levenshtein' { + declare module.exports: any; +} + +declare module 'yargs/lib/obj-filter' { + declare module.exports: any; +} + +declare module 'yargs/lib/usage' { + declare module.exports: any; +} + +declare module 'yargs/lib/validation' { + declare module.exports: any; +} + +declare module 'yargs/lib/yerror' { + declare module.exports: any; +} + +declare module 'yargs/yargs' { + declare module.exports: any; +} + +// Filename aliases +declare module 'yargs/index' { + declare module.exports: $Exports<'yargs'>; +} +declare module 'yargs/index.js' { + declare module.exports: $Exports<'yargs'>; +} +declare module 'yargs/lib/apply-extends.js' { + declare module.exports: $Exports<'yargs/lib/apply-extends'>; +} +declare module 'yargs/lib/argsert.js' { + declare module.exports: $Exports<'yargs/lib/argsert'>; +} +declare module 'yargs/lib/assign.js' { + declare module.exports: $Exports<'yargs/lib/assign'>; +} +declare module 'yargs/lib/command.js' { + declare module.exports: $Exports<'yargs/lib/command'>; +} +declare module 'yargs/lib/completion.js' { + declare module.exports: $Exports<'yargs/lib/completion'>; +} +declare module 'yargs/lib/levenshtein.js' { + declare module.exports: $Exports<'yargs/lib/levenshtein'>; +} +declare module 'yargs/lib/obj-filter.js' { + declare module.exports: $Exports<'yargs/lib/obj-filter'>; +} +declare module 'yargs/lib/usage.js' { + declare module.exports: $Exports<'yargs/lib/usage'>; +} +declare module 'yargs/lib/validation.js' { + declare module.exports: $Exports<'yargs/lib/validation'>; +} +declare module 'yargs/lib/yerror.js' { + declare module.exports: $Exports<'yargs/lib/yerror'>; +} +declare module 'yargs/yargs.js' { + declare module.exports: $Exports<'yargs/yargs'>; +} diff --git a/package-scripts.js b/package-scripts.js new file mode 100644 index 0000000..1ace7d5 --- /dev/null +++ b/package-scripts.js @@ -0,0 +1,27 @@ +// this must be module.exports style +module.exports = { + scripts: { + build: { + default: 'nps clean && nps lint && nps test && nps build.es5 && nps flow.copySource', + quick: 'nps clean && nps build.es5 && nps flow.copySource', + es5: 'babel --copy-files --out-dir dist --ignore __tests__ src', + }, + release: 'standard-version', + lint: { + default: 'concurrently "nps lint.js" "nps flow"', + js: 'eslint src', + }, + test: { + default: 'LOGLEVEL=silent jest', + watch: 'LOGLEVEL=silent jest --watch', + coverageReport: 'LOGLEVEL=silent jest --coverage', + }, + clean: 'rimraf dist coverage flow-coverage', + flow: { + default: 'flow --show-all-errors; test $? -eq 0 -o $? -eq 2', + typed: 'flow-typed update', + coverageReport: 'flow-coverage-report -i \'src/**/*.js\' -t html -t text', + copySource: 'flow-copy-source src dist', + }, + }, +}; diff --git a/package.json b/package.json index 4b68568..4def6d6 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,90 @@ { - "name": "react-intl-workflow", - "version": "0.0.1", - "description": "Workflow helpers for react-intl", - "main": "index.js", - "repository": {}, - "author": "David Smith ", - "license": "MIT" + "name": "riw", + "version": "0.4.0", + "description": "react-intl workflow helper and translations database", + "keywords": [ + "react-intl", + "i18n", + "internationalisation", + "internationalization", + "l10n", + "localisation", + "localization", + "translation", + "react", + "cli", + "console", + "terminal", + "term" + ], + "main": "./dist/index.js", + "bin": { + "riw": "./dist/bin/riw.js" + }, + "files": [ + "dist/", + "doc/" + ], + "homepage": "https://github.com/avaragado/riw#readme", + "repository": "avaragado/riw", + "bugs": "https://github.com/avaragado/riw/issues", + "author": { + "name": "David Smith", + "email": "riw@avaragado.org", + "url": "https://avaragado.org" + }, + "license": "MIT", + "scripts": { + "start": "nps", + "test": "nps test" + }, + "devDependencies": { + "babel-cli": "^6.24.0", + "babel-eslint": "^7.2.0", + "babel-jest": "^19.0.0", + "babel-plugin-inline-package-json": "^2.0.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.0", + "babel-plugin-transform-flow-strip-types": "^6.22.0", + "babel-plugin-transform-object-rest-spread": "^6.23.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-preset-env": "^1.2.2", + "concurrently": "^3.4.0", + "eslint": "^3.18.0", + "eslint-config-airbnb": "^14.1.0", + "eslint-plugin-flowtype": "^2.30.3", + "eslint-plugin-import": "^2.2.0", + "eslint-plugin-jest": "^19.0.1", + "eslint-plugin-jsx-a11y": "^4.0.0", + "eslint-plugin-react": "^6.10.3", + "flow-bin": "^0.42.0", + "flow-copy-source": "^1.1.0", + "flow-coverage-report": "^0.3.0", + "flow-typed": "^2.0.0", + "jest": "^19.0.2", + "mock-fs": "^4.2.0", + "nps": "^5.0.4", + "rimraf": "^2.6.1", + "standard-version": "^4.0.0" + }, + "dependencies": { + "babel-core": "^6.24.0", + "babel-plugin-react-intl": "^2.3.1", + "babel-polyfill": "^6.23.0", + "babel-runtime": "^6.23.0", + "chalk": "^1.1.3", + "find-up": "^2.1.0", + "glob": "^7.1.1", + "mkdirp": "^0.5.1", + "ora": "^1.1.0", + "outdent": "^0.3.0", + "ramda": "^0.23.0", + "yargs": "^7.0.2" + }, + "jest": { + "testPathIgnorePatterns": [ + "/node_modules/", + "/fixtures/", + "/helpers/" + ] + } } diff --git a/src/bin/commands/app-commands/status.js b/src/bin/commands/app-commands/status.js new file mode 100755 index 0000000..ee944a9 --- /dev/null +++ b/src/bin/commands/app-commands/status.js @@ -0,0 +1,183 @@ +// @flow + +import type yargs from 'yargs'; + +import outdent from 'outdent'; +import ora from 'ora'; +import chalk from 'chalk'; +import sum from 'ramda/src/sum'; +import sortBy from 'ramda/src/sortBy'; +import reverse from 'ramda/src/reverse'; + +import type { RIW, AppStatusResult } from '../../..'; +import log from '../../../lib/log'; +import { createHandlerWithRIW, createBar } from '../../utils'; + +export const command = 'status'; +export const desc = 'Show information about translations in your app'; + +const here = `app ${command}`; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} + + Shows information about the translations in your app. + Indicates if you should run "riw app translate". + `) + .options({ + missing: { + alias: 'm', + boolean: true, + group: 'Command options', + desc: outdent` + Show missing translations, grouped by locale + `, + }, + }); + +const ctCharBar = 60; +const sAbsent = chalk.red('(absent)'); +const sTotal = 'TOTAL'; + +const bold = x => chalk.bold(x); +const sFromLidAr = arlid => arlid.map(bold).join(', '); + +const absent = (ct: ?number) => ( + ct == null + ? ` ${sAbsent}` + : '' +); + +const createPadder = (...ars: string[]) => { + const ctChar = Math.max.apply(null, ars.map(s => s.length)) + 2; + + return (sLabel: string) => sLabel.padEnd(ctChar); +}; + +export const handler = createHandlerWithRIW((riw: RIW) => { + const spinner = ora('Gathering information...').start(); + + // keep flow happy + const { + default: ctDefault, + target, + todo, + dateInputNewest, + dateTodo, + dateDB, + dateConfig, + }: AppStatusResult = riw.app.status(); + + if (ctDefault == null) { + spinner.fail(outdent` + No locale output file(s) found. Run "riw app translate". + `); + return; + } + + if (todo == null) { + spinner.fail(outdent` + No todo file found. Run "riw app translate". + `); + return; + } + + const isTargetAbsent = lid => target[lid] === null; + + const arlidTarget = reverse(sortBy(lid => target[lid] || 0, Object.keys(target))); + const arlidTargetAbsent = arlidTarget.filter(isTargetAbsent); + let isShowingWarning = false; + + if (arlidTargetAbsent.length > 0) { + isShowingWarning = true; + spinner.fail(outdent` + Missing file or key for ${sFromLidAr(arlidTargetAbsent)}. + `); + } + + if (dateInputNewest > dateTodo) { + isShowingWarning = true; + spinner.fail(outdent` + Message descriptors in your source may have changed since you last built riw's output files. + `); + } + + if (dateDB > dateTodo) { + isShowingWarning = true; + spinner.fail(outdent` + Translations may have changed since you last built riw's output files. + `); + } + + if (dateConfig > dateTodo) { + isShowingWarning = true; + spinner.fail(outdent` + riw configuration may have changed since you last built riw's output files. + `); + } + + if (isShowingWarning) { + spinner.fail(outdent` + Run ${chalk.bold('riw app translate')} to regenerate output files. + `); + } + + spinner.stop(); + + const padder = createPadder(sTotal, riw.config.defaultLocale, ...arlidTarget); + + const ctMessageHave = ctDefault + sum(arlidTarget.map(lid => target[lid] || 0)); + const ctMessageWant = ctDefault * (1 + riw.config.targetLocales.length); + const pctComplete = Math.round((100 * ctMessageHave) / ctMessageWant); + + const barTarget = createBar(ctDefault, ctCharBar); + const barTotal = createBar(ctMessageWant, ctCharBar); + + const arlidTodo = Object.keys(todo || {}); + const ctTodo = todo == null ? 0 : sum(arlidTodo.map(lid => todo[lid].length)); + + const summaryDefault = `- ${ + chalk.bold(padder(riw.config.defaultLocale)) + }${ + barTarget(ctDefault) + } ${ + chalk.dim('total messages') + }`; + + const summaryTarget = lid => `- ${ + chalk.bold(padder(lid)) + }${ + barTarget(target[lid] || 0) + }${ + absent(target[lid]) + }`; + + const summaryTotal = `- ${ + chalk.bold(padder(sTotal)) + }${ + barTotal(ctMessageHave) + } ${pctComplete}% complete`; + + log(outdent` + + App settings: + - Default locale: ${sFromLidAr([riw.config.defaultLocale])} + - Target locales: ${sFromLidAr(riw.config.targetLocales)} + + Current output file(s) for these locales: + ${summaryDefault} + ${arlidTarget.map(summaryTarget).join('\n')} + ${summaryTotal} + + `); + + if (ctTodo > 0) { + log(outdent` + Todo file contains: + - ${chalk.bold(ctTodo.toString())} messages to translate + - ${chalk.bold(arlidTodo.length.toString())} locales – ${sFromLidAr(arlidTodo)} + + `); + } +}); diff --git a/src/bin/commands/app-commands/translate.js b/src/bin/commands/app-commands/translate.js new file mode 100755 index 0000000..e2048b9 --- /dev/null +++ b/src/bin/commands/app-commands/translate.js @@ -0,0 +1,133 @@ +// @flow + +import path from 'path'; + +import type yargs from 'yargs'; + +import outdent from 'outdent'; +import ora from 'ora'; +import chalk from 'chalk'; + +import type { AbsolutePath, MessageDescriptorWithFile } from '../../../types'; +import type { RIW, Config, AppTranslateSpec, TranslationLookupResult, DuplicateIdData } from '../../..'; +import log from '../../../lib/log'; +import { createHandlerWithRIW, createBar } from '../../utils'; + +export const command = 'translate'; +export const desc = 'Generate JSON containing translations for the app'; + +const here = `app ${command}`; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} + + Generates one or more JSON files containing translated strings for your app, + and a JSON file containing the strings that still need translation. + + To generate this data riw combines your translation database with the + react-intl message descriptors in your app. + + Your riw configuration settings determine how riw looks for message descriptors, + and where the final files are saved. See configuration documentation for details. + `); + +const sfrelFromFabsFromConfig = (config: Config) => (fabs: AbsolutePath) => + chalk.green(path.relative(config.rootDir, fabs)); + +export const handler = createHandlerWithRIW((riw: RIW) => { + const sfrelFromFabs = sfrelFromFabsFromConfig(riw.config); + + const spinner = ora(); + let ctFile; + let numFile = 0; + let ctMD = 0; + let bar; + + const opt: AppTranslateSpec = { + on: { + start: () => { + spinner.text = { + source: 'Finding component source files...', + json: 'Finding JSON message descriptor files...', + }[riw.config.inputMode]; + + spinner.start(); + }, + startExtract: (arfabs) => { + ctFile = arfabs.length; + bar = createBar(ctFile); + spinner.text = `Processing ${ctFile} files...`; + }, + startExtractFile: (fabs) => { + numFile += 1; + spinner.text = `${bar(numFile)} [${ctMD}] ${sfrelFromFabs(fabs)}`; + }, + endExtractFile: ({ armd, fabs }) => { + ctMD += armd.length; + spinner.text = `${bar(numFile)} [${ctMD}] ${sfrelFromFabs(fabs)}`; + spinner.render(); + }, + endExtract: (armd: MessageDescriptorWithFile[]) => { + spinner.succeed( + `Found ${chalk.bold( + armd.length.toString(), + 'message descriptors', + )} from ${chalk.bold( + numFile.toString(), + 'files', + )}`, + ); + }, + startDupCheck: () => { + spinner.text = 'Checking for duplicate message descriptor ids...'; + spinner.start(); + }, + endDupCheck: (dups: DuplicateIdData[]) => { + if (dups.length) { + spinner.fail(`Duplicate message descriptor ids (${dups.length}):`); + log(dups.map( + dup => outdent` + ${outdent} + - ${chalk.red.bold(dup.id)} used in: + ${dup.files.map(sfrelFromFabs).join('\n ')} + `, + ).join('\n')); + + } else { + spinner.succeed('No duplicate message descriptor ids'); + } + }, + startLookup: () => { + spinner.text = 'Finding translations...'; + spinner.start(); + }, + endLookup: (translation: TranslationLookupResult) => { + const { todos } = translation; + + if (riw.config.targetLocales.length === 0) { + spinner.fail('No translations: Define "targetLocales" in your riw configuration'); + + } else if (todos.length) { + spinner.fail(`Missing translations: ${todos.length}`); + + } else { + spinner.succeed('All messages have translations for every locale'); + } + }, + fileSaved: (fabs: AbsolutePath) => { + spinner.succeed(`Saved ${fabs}`); + }, + end: () => { + spinner.stop(); + }, + }, + }; + + try { + riw.app.translate(opt); + + } catch (err) { + // ignore; + } +}); diff --git a/src/bin/commands/app.js b/src/bin/commands/app.js new file mode 100755 index 0000000..7e117e1 --- /dev/null +++ b/src/bin/commands/app.js @@ -0,0 +1,8 @@ +// @flow + +import type yargs from 'yargs'; + +export const command = 'app '; +export const desc = 'Manage translations for this app'; + +export const builder = (yyargs: yargs.Argv) => yyargs.commandDir('app-commands').strict(); diff --git a/src/bin/commands/db-commands/delete.js b/src/bin/commands/db-commands/delete.js new file mode 100755 index 0000000..37d5d01 --- /dev/null +++ b/src/bin/commands/db-commands/delete.js @@ -0,0 +1,138 @@ +// @flow + +import type yargs from 'yargs'; + +import outdent from 'outdent'; +import chalk from 'chalk'; +import pick from 'ramda/src/pick'; + +import type { RIW, DBListSpec } from '../../..'; +import log from '../../../lib/log'; +import { createHandlerWithRIW, prettifyMdtAr } from '../../utils'; + +export const command = 'delete'; +export const desc = 'Delete translation database entries matching options'; + +const here = `db ${command}`; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} + [--defaultMessage ] + [--description ] + [--locale ] + [--dry-run] + + Deletes translation database entries matching all of the options supplied. + Omitted options match any value. + + At least one of --defaultMessage, --description, --locale and --translation + must be supplied. + + Use --dry-run to show what would be deleted instead of deleting it. + `) + .example( + outdent` + $0 ${here} + --defaultMessage "Hello {name}" + + `, + 'Deletes all database entries for the defaultMessage "Hello {name}"', + ) + .example( + outdent` + $0 ${here} + --locale fr-fr + + `, + 'Deletes all database entries for translations into fr-fr', + ) + .options({ + 'defaultMessage': { + alias: 'm', + string: true, + group: 'Command options', + desc: outdent` + Delete entries matching the string being translated. + Omit to match any string. + `, + }, + + 'description': { + alias: 'd', + string: true, + group: 'Command options', + desc: outdent` + Delete entries with this description. + Omit to match any description. + `, + }, + + 'locale': { + alias: 'l', + string: true, + group: 'Command options', + desc: outdent` + Delete entries with this locale. + Omit to match any locale. + `, + }, + + 'translation': { + alias: 't', + string: true, + group: 'Command options', + desc: outdent` + Delete entries with this translated string. + Omit to match any translated string. + `, + }, + + 'dry-run': { + alias: 'n', + boolean: true, + group: 'Command options', + desc: outdent` + Show what would be deleted without deleting anything. + `, + }, + }); + +export const handler = createHandlerWithRIW((riw: RIW, argv: yargs.Argv) => { + if (!(argv.defaultMessage || argv.description || argv.locale || argv.translation)) { + log.error('You must supply an option.'); + process.exit(); + } + + const opt: DBListSpec = { + match: pick(['defaultMessage', 'description', 'locale', 'translation'], argv), + }; + + if (argv.dryRun) { + let armdt; + + try { + armdt = riw.db.list(opt); + + } catch (err) { + return; + } + + if (armdt.length > 0) { + log(chalk.bold(`To be deleted [${armdt.length.toString()}]:\n`)); + log(prettifyMdtAr(armdt)); + + } else { + log(chalk.bold('No matches')); + } + + } else { + try { + riw.db.delete(opt); + + } catch (err) { + // ignore; + } + } +}); diff --git a/src/bin/commands/db-commands/import.js b/src/bin/commands/db-commands/import.js new file mode 100755 index 0000000..a63d0f3 --- /dev/null +++ b/src/bin/commands/db-commands/import.js @@ -0,0 +1,90 @@ +// @flow + +import fs from 'fs'; + +import type yargs from 'yargs'; + +import chalk from 'chalk'; +import outdent from 'outdent'; +import compose from 'ramda/src/compose'; +import chain from 'ramda/src/chain'; +import map from 'ramda/src/map'; +import pick from 'ramda/src/pick'; +import groupBy from 'ramda/src/groupBy'; + +import type { RIW, DBUpdateSpec } from '../../..'; +import log from '../../../lib/log'; +import { createHandlerWithRIW } from '../../utils'; + +const cmd = 'import'; + +export const command = `${cmd} `; +export const desc = 'Update translations in the riw database in bulk'; + +const here = `db ${cmd}`; + +const groupValidity = tr => ( + tr.defaultMessage && tr.locale && tr.translation + ? 'valid' + : 'invalid' +); + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} ... + + Updates the translations database with the contents of each . + Each file must be in JSON format, and must consist of an array of objects. + Each object should have these keys: + + - "defaultMessage" Mandatory. The string in the default locale. + - "description" Optional. The description for the string. + - "locale" Mandatory. The locale for the translation. + - "translation" Mandatory. The defaultMessage, translated to the locale. + + Any other keys are ignored. Objects without all mandatory keys are ignored. + + The "defaultMessage" and "description" properties identify the string being translated. + They must be exactly as in the TODO file of untranslated messages output by the + "riw app translate" command. + `) + .example( + outdent` + $0 ${here} TODO-with-translations.json + + `, + 'Imports all translations from the file.', + ) + .example( + outdent` + $0 ${here} foo.json bar.json + + `, + 'Imports all translations from each file in turn.', + ) + .coerce('file', compose( + groupBy(groupValidity), + chain(compose(JSON.parse, fs.readFileSync)), + )); + +export const handler = createHandlerWithRIW((riw: RIW, argv: yargs.Argv) => { + const { valid = [], invalid = [] } = argv.file; + + const opt: DBUpdateSpec = { + translations: map( + pick(['defaultMessage', 'description', 'locale', 'translation']), + valid, + ), + }; + + try { + riw.db.update(opt); + log(outdent` + - Imported ${chalk.bold(valid.length.toString())} translation(s). + - Ignored ${chalk.bold(invalid.length.toString())} object(s) missing required keys. + `); + + } catch (err) { + // ignore; + } +}); diff --git a/src/bin/commands/db-commands/init.js b/src/bin/commands/db-commands/init.js new file mode 100755 index 0000000..85d5474 --- /dev/null +++ b/src/bin/commands/db-commands/init.js @@ -0,0 +1,29 @@ +// @flow + +import type yargs from 'yargs'; + +import outdent from 'outdent'; +import chalk from 'chalk'; + +import log from '../../../lib/log'; +import type { RIW } from '../../..'; +import { createHandlerWithRIW } from '../../utils'; + +export const command = 'init'; +export const desc = 'Create an empty riw translations database in the configured location'; + +const here = `db ${command}`; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} + + Creates an empty riw translations database. + `); + +export const handler = createHandlerWithRIW((riw: RIW) => { + riw.db.init(); + + log('Created empty riw database file ', chalk.bold(riw.config.translationsDatabaseFile)); + log('We recommend you check this file into git.'); +}); diff --git a/src/bin/commands/db-commands/list.js b/src/bin/commands/db-commands/list.js new file mode 100755 index 0000000..dacd3f7 --- /dev/null +++ b/src/bin/commands/db-commands/list.js @@ -0,0 +1,135 @@ +// @flow + +import type yargs from 'yargs'; + +import outdent from 'outdent'; +import chalk from 'chalk'; +import pick from 'ramda/src/pick'; + +import type { RIW, DBListSpec } from '../../..'; +import log from '../../../lib/log'; +import { createHandlerWithRIW, prettifyMdtAr } from '../../utils'; + +export const command = 'list'; +export const desc = 'Show translation database entries matching options'; + +const here = `db ${command}`; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} + [--defaultMessage ] + [--description ] + [--locale ] + [--json] + + Lists translation database entries matching all of the options supplied. + Omitted options match any value. + + Each database entry comprises the string in the default locale, the description + for that string, the locale of the translated string, and the translated string itself. + `) + .example( + outdent` + $0 ${here} + --defaultMessage "Hello {name}" + + `, + 'Lists all database entries for the defaultMessage "Hello {name}", and outputs in readable form', + ) + .example( + outdent` + $0 ${here} + --locale fr-fr + --json + + `, + 'Lists all database entries for translations into fr-fr, and outputs as JSON', + ) + .example( + outdent` + $0 ${here} + --description _ + --locale pt-br + + `, + 'Lists all database entries for translations into pt-br with the default description, _, and outputs in readable form', + ) + .options({ + defaultMessage: { + alias: 'm', + string: true, + group: 'Command options', + desc: outdent` + List entries matching the string being translated. + Omit to match any string. + `, + }, + + description: { + alias: 'd', + string: true, + group: 'Command options', + desc: outdent` + List entries with this description. + Omit to match any description. + `, + }, + + locale: { + alias: 'l', + string: true, + group: 'Command options', + desc: outdent` + List entries with this locale. + Omit to match any locale. + `, + }, + + translation: { + alias: 't', + string: true, + group: 'Command options', + desc: outdent` + List entries with this translated string. + Omit to match any translated string. + `, + }, + + json: { + boolean: true, + group: 'Command options', + desc: outdent` + Output entries in JSON format as an array of + { defaultMessage, ?description, locale, translation } objects. + Omit to output in human-readable form. + `, + }, + }); + +export const handler = createHandlerWithRIW((riw: RIW, argv: yargs.Argv) => { + const opt: DBListSpec = { + match: pick(['defaultMessage', 'description', 'locale', 'translation'], argv), + }; + + let armdt; + + try { + armdt = riw.db.list(opt); + + } catch (err) { + return; + } + + if (argv.json) { + console.log(JSON.stringify(armdt, null, 4)); + + } else if (armdt.length > 0) { + log(chalk.bold(`\nMatches [${armdt.length.toString()}]:\n`)); + log(prettifyMdtAr(armdt)); + + } else { + log(chalk.bold('No matches')); + } +}); diff --git a/src/bin/commands/db-commands/status.js b/src/bin/commands/db-commands/status.js new file mode 100755 index 0000000..acdde83 --- /dev/null +++ b/src/bin/commands/db-commands/status.js @@ -0,0 +1,98 @@ +// @flow + +import type yargs from 'yargs'; + +import outdent from 'outdent'; +import chalk from 'chalk'; + +import type { RIW, DBStatusResult } from '../../..'; +import log from '../../../lib/log'; +import { createHandlerWithRIW, createBar } from '../../utils'; + +export const command = 'status'; +export const desc = 'Show information about translations in the database'; + +const here = `db ${command}`; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} + + Shows information about default locale strings and their translations in the database. + `) + .options({ + missing: { + alias: 'm', + boolean: true, + group: 'Command options', + desc: outdent` + Show missing translations, grouped by locale + `, + }, + }); + +const bold = x => chalk.bold(x); + +export const handler = createHandlerWithRIW((riw: RIW, argv: yargs.Argv) => { + let status: DBStatusResult; + + try { + status = riw.db.status(); + + } catch (err) { + return; + } + + if (status.default.length === 0) { + log(outdent` + Database is empty. + Use ${chalk.bold('riw db update')} or ${chalk.bold('riw db import')} to add entries. + `); + + return; + } + + const arlid = Object.keys(status.locale).sort( + (lid1, lid2) => status.locale[lid2].has.length - status.locale[lid1].has.length, + ); + const ctCharMax = Math.max.apply(null, arlid.map(lid => lid.length)); + const bar = createBar(status.default.length, 60); + + const summary = lid => `- ${chalk.bold(lid.padEnd(ctCharMax + 2))}${bar(status.locale[lid].has.length)}`; + + const missingPair = pair => ` - ${chalk.bold.blue(pair[0])} ${chalk.dim(pair[1])}`; + + const missing = lid => outdent` + - ${chalk.bold(lid)} [${status.locale[lid].missing.length}] + ${status.locale[lid].missing.map(missingPair).join('\n')} + + `; + + const hasMissing = lid => status.locale[lid].missing.length > 0; + + log(outdent` + Database contains: + - ${chalk.bold(status.default.length.toString())} distinct message/description pairs + - ${chalk.bold(arlid.length.toString())} locales with translations – ${arlid.map(bold).join(', ')} + + Locale summary: + ${arlid.map(summary).join('\n')} + `); + + if (argv.missing) { + const arlidMissing = arlid.filter(hasMissing); + + if (arlidMissing.length > 0) { + log(outdent` + + Missing translations: + ${arlidMissing.map(missing).join('\n')} + `); + } else { + log(outdent` + + 🎉 There are no missing translations. + `); + } + } +}); diff --git a/src/bin/commands/db-commands/update.js b/src/bin/commands/db-commands/update.js new file mode 100755 index 0000000..92cad32 --- /dev/null +++ b/src/bin/commands/db-commands/update.js @@ -0,0 +1,114 @@ +// @flow + +import type yargs from 'yargs'; + +import outdent from 'outdent'; +import pick from 'ramda/src/pick'; + +import type { RIW, DBUpdateSpec } from '../../..'; +import { createHandlerWithRIW } from '../../utils'; + +export const command = 'update'; +export const desc = 'Add or edit a translation in the riw database'; + +const here = `db ${command}`; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${here} + --defaultMessage [--description ] + --locale --translation + + Update the translation for (optionally disambiguated by ) + in the default locale to in the locale. + `) + .example( + outdent` + $0 ${here} + --defaultMessage "Hello {name}" + --locale fr-fr + --translation "Bonjour {name}" + + `, + 'Update the fr-fr translation for a welcome message.', + ) + .example( + outdent` + $0 ${here} + --defaultMessage "Export" + --description "The button a user presses to start exporting data" + --locale fr-fr + --translation "Exporter" + + `, + 'Update the fr-fr translation for a button, with a description to disambiguate meaning.', + ) + .example( + outdent` + $0 ${here} + --defaultMessage "Export" + --description "The section heading describing an export" + --locale fr-fr + --translation "Exportation" + + `, + 'Update the fr-fr translation for a label, with a description to disambiguate meaning.', + ) + .options({ + defaultMessage: { + alias: 'm', + string: true, + demandOption: true, + group: 'Command options', + desc: outdent` + The string that's being translated, in the default locale. + `, + }, + + description: { + alias: 'd', + string: true, + group: 'Command options', + desc: outdent` + The description for the string being translated. + Required IF you use the 'description' field in react-intl message descriptors, + AND if you use the same 'defaultMessage' in several places, + AND you need different translations for these identical defaultMessages. + `, + }, + + locale: { + alias: 'l', + string: true, + demandOption: true, + group: 'Command options', + desc: outdent` + The locale ID of the translated string. + `, + }, + + translation: { + alias: 't', + string: true, + demandOption: true, + group: 'Command options', + desc: outdent` + The translated string. + `, + }, + }); + +export const handler = createHandlerWithRIW((riw: RIW, argv: yargs.Argv) => { + const opt: DBUpdateSpec = { + translations: [ + pick(['defaultMessage', 'description', 'locale', 'translation'], argv), + ], + }; + + try { + riw.db.update(opt); + + } catch (err) { + // ignore + } +}); diff --git a/src/bin/commands/db.js b/src/bin/commands/db.js new file mode 100755 index 0000000..bcddd95 --- /dev/null +++ b/src/bin/commands/db.js @@ -0,0 +1,8 @@ +// @flow + +import type yargs from 'yargs'; + +export const command = 'db '; +export const desc = 'Manage the riw translations database'; + +export const builder = (yyargs: yargs.Argv) => yyargs.commandDir('db-commands').strict(); diff --git a/src/bin/commands/print-config.js b/src/bin/commands/print-config.js new file mode 100755 index 0000000..8b823d3 --- /dev/null +++ b/src/bin/commands/print-config.js @@ -0,0 +1,23 @@ +// @flow + +import type yargs from 'yargs'; +import outdent from 'outdent'; + +import type { RIW } from '../..'; +import { createHandlerWithRIW } from '../utils'; + +export const command = 'print-config'; +export const desc = 'Output the configuration used, in JSON format, taking defaults into account'; + +export const builder = (yyargs: yargs.Argv) => yyargs + .usage(outdent` + $0 ${command} + + Outputs the configuration settings used by the riw command, in JSON format. + This includes both the default settings and the overrides supplied by your configuration file. + `); + +export const handler = createHandlerWithRIW((riw: RIW) => { + // this uses plain config.log to make it easier to copy. + console.log(JSON.stringify(riw.config, null, 4)); +}); diff --git a/src/bin/commands/version.js b/src/bin/commands/version.js new file mode 100755 index 0000000..c5df62b --- /dev/null +++ b/src/bin/commands/version.js @@ -0,0 +1,16 @@ +// @flow + +import chalk from 'chalk'; + +import log from '../../lib/log'; + +// babel-plugin-inline-package-json@2.0.0 only supports require, and only in this icky form. +const name = require('../../../package.json').name; +const version = require('../../../package.json').version; + +export const command = 'version'; +export const desc = 'Print version information'; + +export const handler = () => { + log(chalk.bold(name), ' ', version); +}; diff --git a/src/bin/riw.js b/src/bin/riw.js new file mode 100755 index 0000000..e108346 --- /dev/null +++ b/src/bin/riw.js @@ -0,0 +1,44 @@ +#!/usr/bin/env node +// @flow + +import 'babel-polyfill'; +import yargs from 'yargs'; +import outdent from 'outdent'; + +import { fabsConfigPackageForCWD } from '../lib/config'; + +// if config not specified, need to see if we can find an enclosing package. +const optsExtra = {}; + +if (!yargs.argv.config) { + const fabsConfigPackage = fabsConfigPackageForCWD(); + + if (fabsConfigPackage === null) { + optsExtra.demandOption = outdent` + + Can't find a package.json in the ancestry of the current directory. + Either cd inside an npm package and redo the command, or use the --config option. + `; + } +} + +yargs // eslint-disable-line no-unused-expressions + .commandDir('commands') + .demandCommand(1, 'Please supply a command.') + .help() + .wrap(yargs.terminalWidth()) + .strict() + .options({ + 'config': { + alias: 'c', + global: true, + string: true, + nargs: 1, + desc: outdent` + Configuration filename (absolute, or relative to current dir). + Omit to use .riw-config.js in package root, or package.json key "riw". + `, + ...optsExtra, + }, + }) + .argv; diff --git a/src/bin/utils/__tests__/__snapshots__/createBar.test.js.snap b/src/bin/utils/__tests__/__snapshots__/createBar.test.js.snap new file mode 100644 index 0000000..d8d98e5 --- /dev/null +++ b/src/bin/utils/__tests__/__snapshots__/createBar.test.js.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`bin/utils/createBar 01 1`] = `"  0/100"`; + +exports[`bin/utils/createBar 02 1`] = `"⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ 200/200"`; + +exports[`bin/utils/createBar 03 1`] = `"⣿⣿⣿⣿⣿  50/100"`; + +exports[`bin/utils/createBar 04 1`] = `"⣿⣿⡆  19/80"`; + +exports[`bin/utils/createBar 05 1`] = `"⣿⣿⡇  20/80"`; + +exports[`bin/utils/createBar 06 1`] = `"  1/100"`; + +exports[`bin/utils/createBar 07 1`] = `"⡀  2/100"`; + +exports[`bin/utils/createBar 08 1`] = `"⣿⣿⣿⣿⣿⡆  54/100"`; diff --git a/src/bin/utils/__tests__/createBar.test.js b/src/bin/utils/__tests__/createBar.test.js new file mode 100644 index 0000000..d1c12e7 --- /dev/null +++ b/src/bin/utils/__tests__/createBar.test.js @@ -0,0 +1,96 @@ +// @flow + +import createBar from '../createBar'; + +type Fixture = { + name: string, + in: { + ctTotal: number, + ctChar: number, + num: number, + }, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: { + ctTotal: 100, + ctChar: 10, + num: 0, + }, + }, + + { + name: '02', + in: { + ctTotal: 200, + ctChar: 20, + num: 200, + }, + }, + + { + name: '03', + in: { + ctTotal: 100, + ctChar: 10, + num: 50, + }, + }, + + { + name: '04', + in: { + ctTotal: 80, + ctChar: 10, + num: 19, + }, + }, + + { + name: '05', + in: { + ctTotal: 80, + ctChar: 10, + num: 20, + }, + }, + + { + name: '06', + in: { + ctTotal: 100, + ctChar: 10, + num: 1, + }, + }, + + { + name: '07', + in: { + ctTotal: 100, + ctChar: 10, + num: 2, + }, + }, + + { + name: '08', + in: { + ctTotal: 100, + ctChar: 10, + num: 54, + }, + }, +]; + +describe('bin/utils/createBar', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = createBar(fixture.in.ctTotal, fixture.in.ctChar)(fixture.in.num); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/bin/utils/createBar.js b/src/bin/utils/createBar.js new file mode 100644 index 0000000..3b7fbf4 --- /dev/null +++ b/src/bin/utils/createBar.js @@ -0,0 +1,18 @@ +// @flow + +import chalk from 'chalk'; + +const sBlock = '⣿'; +const arsPart = ['', '⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷']; + +export default (ctTotal: number, ctChar: number = 20) => { + const ctBlockPerNum = ctChar / ctTotal; + const ctPipPerNum = (ctChar * arsPart.length) / ctTotal; + + const bar = num => sBlock.repeat(num * ctBlockPerNum); + const part = num => arsPart[Math.floor(num * ctPipPerNum) % arsPart.length]; + const barspace = num => (bar(num) + part(num)).padEnd(ctChar); + const slash = num => `${num}/${ctTotal}`; + + return (num: number) => `${chalk.green(barspace(num))} ${chalk.dim(slash(num))}`; +}; diff --git a/src/bin/utils/createHandlerWithRIW.js b/src/bin/utils/createHandlerWithRIW.js new file mode 100644 index 0000000..5dc9ee2 --- /dev/null +++ b/src/bin/utils/createHandlerWithRIW.js @@ -0,0 +1,21 @@ +// @flow + +import type yargs from 'yargs'; + +import type { RIW } from '../../'; +import { createRIW, configFromPath, configFromPackage } from '../../'; + +type Handler = (riw: RIW, argv: yargs.Argv) => void; + +export default (handler: Handler) => (argv: yargs.Argv) => { + const config = argv.config + ? configFromPath(argv.config) + : configFromPackage(); + + if (config) { + return handler(createRIW(config), argv); + } + + // we've already output an error message. + return null; +}; diff --git a/src/bin/utils/index.js b/src/bin/utils/index.js new file mode 100644 index 0000000..acff8f2 --- /dev/null +++ b/src/bin/utils/index.js @@ -0,0 +1,11 @@ +// @flow + +import createHandlerWithRIW from './createHandlerWithRIW'; +import createBar from './createBar'; +import prettifyMdtAr from './prettifyMdtAr'; + +export { + createBar, + createHandlerWithRIW, + prettifyMdtAr, +}; diff --git a/src/bin/utils/prettifyMdtAr.js b/src/bin/utils/prettifyMdtAr.js new file mode 100755 index 0000000..db2762c --- /dev/null +++ b/src/bin/utils/prettifyMdtAr.js @@ -0,0 +1,55 @@ +// @flow + +import chalk from 'chalk'; +import pick from 'ramda/src/pick'; +import groupBy from 'ramda/src/groupBy'; +import compose from 'ramda/src/compose'; +import join from 'ramda/src/join'; +import chain from 'ramda/src/chain'; +import values from 'ramda/src/values'; +import dropLast from 'ramda/src/dropLast'; + +import type { TranslatedMessageDescriptor } from '../../types'; + +const grouper = compose( + JSON.stringify, + pick(['defaultMessage', 'description']), +); + +const formatHeaderFromMdt = mdt => [ + ' - ', + chalk.dim('"'), + chalk.bold.blue(mdt.defaultMessage), + chalk.dim('"'), + ' ', + chalk.dim(mdt.description || ''), + '\n', +]; + +const formatLineFromMdt = mdt => [ + ' ', + chalk.green(mdt.locale), + ' ', + chalk.dim('"'), + chalk.bold.green(mdt.translation), + chalk.dim('"'), + '\n', +]; + +const formatGroupFromMdtAr = armdt => [ + ...formatHeaderFromMdt(armdt[0]), + ...chain(formatLineFromMdt, armdt), + '\n', +]; + +type Prettifier = TranslatedMessageDescriptor[] => string; + +const prettify: Prettifier = compose( + join(''), + dropLast(1), // we don't need the very last \n + chain(formatGroupFromMdtAr), + values, + groupBy(grouper), +); + +export default prettify; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..039982c --- /dev/null +++ b/src/index.js @@ -0,0 +1,50 @@ +// @flow +// main entry point + +import compose from 'ramda/src/compose'; + +import type { Config, ConfigSparseWithSource } from './lib/config'; +import type { + RIW, + AppTranslateSpec, + AppTranslateResult, + AppStatusResult, + TranslationLookupResult, + DuplicateIdData, + TranslationsDB, + DBListSpec, + DBStatusResult, + DBUpdateSpec, +} from './lib/riw'; +import type { Notifier } from './lib/notify'; + +import { configResolve, configFromPath, configFromPackage } from './lib/config'; +import { riwFromConfig, sDescriptionDefault } from './lib/riw'; + +const createRIW = (compose( + riwFromConfig, + configResolve, +): (config: ConfigSparseWithSource) => RIW); + +export type { + Config, + ConfigSparseWithSource, + Notifier, + RIW, + AppTranslateSpec, + AppTranslateResult, + AppStatusResult, + TranslationLookupResult, + DuplicateIdData, + TranslationsDB, + DBListSpec, + DBStatusResult, + DBUpdateSpec, +}; + +export { + createRIW, + configFromPath, + configFromPackage, + sDescriptionDefault, +}; diff --git a/src/lib/config-helper/__tests__/__snapshots__/arfabsInputJSON.test.js.snap b/src/lib/config-helper/__tests__/__snapshots__/arfabsInputJSON.test.js.snap new file mode 100644 index 0000000..2cba87e --- /dev/null +++ b/src/lib/config-helper/__tests__/__snapshots__/arfabsInputJSON.test.js.snap @@ -0,0 +1,47 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/config-helper/arfabsInputJSON 01 empty dir -> empty array 1`] = `Array []`; + +exports[`lib/config-helper/arfabsInputJSON 02 collateDir elsewhere -> empty array 1`] = `Array []`; + +exports[`lib/config-helper/arfabsInputJSON 03 flat files, collateDir rel 1`] = ` +Array [ + "/fixtures/dir/a.json", + "/fixtures/dir/aa.json", + "/fixtures/dir/b.json", + "/fixtures/dir/bb.json", + "/fixtures/dir/c.json", +] +`; + +exports[`lib/config-helper/arfabsInputJSON 04 flat files, collateDir abs 1`] = ` +Array [ + "/fixtures/dir/a.json", + "/fixtures/dir/aa.json", + "/fixtures/dir/b.json", + "/fixtures/dir/bb.json", + "/fixtures/dir/c.json", +] +`; + +exports[`lib/config-helper/arfabsInputJSON 05 nested files, collateDir rel 1`] = ` +Array [ + "/fixtures/dir/a.json", + "/fixtures/dir/bs/b1.json", + "/fixtures/dir/bs/b2.json", + "/fixtures/dir/bs/b3.json", + "/fixtures/dir/bs/bbs/b4.json", + "/fixtures/dir/bs/bbs/b5.json", +] +`; + +exports[`lib/config-helper/arfabsInputJSON 06 nested files, collateDir rel to parent of configFile 1`] = ` +Array [ + "/fixtures/dir/a.json", + "/fixtures/dir/bs/b1.json", + "/fixtures/dir/bs/b2.json", + "/fixtures/dir/bs/b3.json", + "/fixtures/dir/bs/bbs/b4.json", + "/fixtures/dir/bs/bbs/b5.json", +] +`; diff --git a/src/lib/config-helper/__tests__/__snapshots__/arfabsInputSource.test.js.snap b/src/lib/config-helper/__tests__/__snapshots__/arfabsInputSource.test.js.snap new file mode 100644 index 0000000..7829ce1 --- /dev/null +++ b/src/lib/config-helper/__tests__/__snapshots__/arfabsInputSource.test.js.snap @@ -0,0 +1,37 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/config-helper/arfabsInputSource 01 empty dir -> empty array 1`] = `Array []`; + +exports[`lib/config-helper/arfabsInputSource 02 sourceDirs elsewhere -> empty array 1`] = `Array []`; + +exports[`lib/config-helper/arfabsInputSource 03 flat files, sourceDirs rel 1`] = ` +Array [ + "/fixtures/dir/a.js", + "/fixtures/dir/b.js", +] +`; + +exports[`lib/config-helper/arfabsInputSource 04 flat files, sourceDirs abs 1`] = ` +Array [ + "/fixtures/dir/a.js", + "/fixtures/dir/b.js", +] +`; + +exports[`lib/config-helper/arfabsInputSource 05 nested files, multiple sourceDirs rel 1`] = ` +Array [ + "/fixtures/dir/a/aa.js", + "/fixtures/dir/a/ab.js", + "/fixtures/dir/b/ba.js", + "/fixtures/dir/b/bb.js", +] +`; + +exports[`lib/config-helper/arfabsInputSource 06 nested files, multiple sourceDirs rel to parent of configFile 1`] = ` +Array [ + "/fixtures/dir/a/aa.js", + "/fixtures/dir/a/ab.js", + "/fixtures/dir/b/ba.js", + "/fixtures/dir/b/bb.js", +] +`; diff --git a/src/lib/config-helper/__tests__/arfabsInputJSON.test.js b/src/lib/config-helper/__tests__/arfabsInputJSON.test.js new file mode 100644 index 0000000..55cce4e --- /dev/null +++ b/src/lib/config-helper/__tests__/arfabsInputJSON.test.js @@ -0,0 +1,131 @@ +// @flow + +import path from 'path'; + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../config'; +import { configResolve } from '../../config'; + +import arfabsInputJSON from '../arfabsInputJSON'; + +type Tree = { [key: string]: string | Tree }; + +type Fixture = { + name: string, + in: Tree, + cfg: ConfigSparseWithSource, +}; + +const fixtures: Fixture[] = [ + { + name: '01 empty dir -> empty array', + in: {}, // empty dir + cfg: { + rootDir: '/fixtures', + collateDir: 'dir', + }, + }, + + { + name: '02 collateDir elsewhere -> empty array', + in: { + 'a.json': '[]', + 'b.json': '[]', + }, + cfg: { + rootDir: '/fixtures', + // collateDir default is not under dir, so result is empty array + }, + }, + + { + name: '03 flat files, collateDir rel', + in: { + 'a.json': '[]', + 'aa.json': '[]', + 'b.json': '[]', + 'bb.json': '[]', + 'c.json': '[]', + }, + cfg: { + rootDir: '/fixtures', + collateDir: 'dir', + }, + }, + + { + name: '04 flat files, collateDir abs', + in: { + 'a.json': '[]', + 'aa.json': '[]', + 'b.json': '[]', + 'bb.json': '[]', + 'c.json': '[]', + }, + cfg: { + rootDir: '/foobar', + collateDir: path.resolve('/fixtures', 'dir'), + }, + }, + + { + name: '05 nested files, collateDir rel', + in: { + 'a.json': '[]', + 'bs': { + 'b1.json': '[]', + 'b2.json': '[]', + 'b3.json': '[]', + 'bbs': { + 'b4.json': '[]', + 'b5.json': '[]', + }, + }, + }, + cfg: { + rootDir: '/fixtures', + collateDir: 'dir', + }, + }, + + { + name: '06 nested files, collateDir rel to parent of configFile', + in: { + 'a.json': '[]', + 'bs': { + 'b1.json': '[]', + 'b2.json': '[]', + 'b3.json': '[]', + 'bbs': { + 'b4.json': '[]', + 'b5.json': '[]', + }, + }, + }, + cfg: { + configFile: '/fixtures/package.json', + collateDir: 'dir', + }, + }, +]; + +describe('lib/config-helper/arfabsInputJSON', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + '/fixtures': { + 'dir': fixture.in, + }, + }); + + const cfg = configResolve(fixture.cfg); + + const received = arfabsInputJSON(cfg); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/config-helper/__tests__/arfabsInputSource.test.js b/src/lib/config-helper/__tests__/arfabsInputSource.test.js new file mode 100644 index 0000000..5c0ad53 --- /dev/null +++ b/src/lib/config-helper/__tests__/arfabsInputSource.test.js @@ -0,0 +1,127 @@ +// @flow + +import path from 'path'; + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../config'; +import { configResolve } from '../../config'; + +import arfabsInputSource from '../arfabsInputSource'; + +type Tree = { [key: string]: string | Tree }; + +type Fixture = { + name: string, + in: Tree, + cfg: ConfigSparseWithSource, +}; + +const fixtures: Fixture[] = [ + { + name: '01 empty dir -> empty array', + in: {}, // empty dir + cfg: { + rootDir: '/fixtures', + sourceDirs: ['dir/**/*.js'], + }, + }, + + { + name: '02 sourceDirs elsewhere -> empty array', + in: { + 'a.js': '//', + 'b.js': '//', + }, + cfg: { + rootDir: '/fixtures', + // sourceDirs default not under dir, so result is empty array + }, + }, + + { + name: '03 flat files, sourceDirs rel', + in: { + 'a.js': '//', + 'b.js': '//', + }, + cfg: { + rootDir: '/fixtures', + sourceDirs: ['dir/**/*.js'], + }, + }, + + { + name: '04 flat files, sourceDirs abs', + in: { + 'a.js': '//', + 'b.js': '//', + }, + cfg: { + rootDir: '/foobar', + sourceDirs: [path.resolve('/fixtures', 'dir', '**/*.js')], + }, + }, + + { + name: '05 nested files, multiple sourceDirs rel', + in: { + a: { + 'aa.js': '//', + 'ab.js': '//', + }, + b: { + 'ba.js': '//', + 'bb.js': '//', + 'bc': { + 'bcd.js': '//', + }, + }, + }, + cfg: { + rootDir: '/fixtures', + sourceDirs: ['dir/a/*.js', 'dir/b/*.js'], + }, + }, + + { + name: '06 nested files, multiple sourceDirs rel to parent of configFile', + in: { + a: { + 'aa.js': '//', + 'ab.js': '//', + }, + b: { + 'ba.js': '//', + 'bb.js': '//', + 'bc': { + 'bcd.js': '//', + }, + }, + }, + cfg: { + configFile: '/fixtures/package.json', + sourceDirs: ['dir/a/*.js', 'dir/b/*.js'], + }, + }, +]; + +describe('lib/config-helper/arfabsInputSource', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + '/fixtures': { + dir: fixture.in, + }, + }); + + const cfg = configResolve(fixture.cfg); + + const received = arfabsInputSource(cfg); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/config-helper/arfabsInputJSON.js b/src/lib/config-helper/arfabsInputJSON.js new file mode 100644 index 0000000..bd9eb52 --- /dev/null +++ b/src/lib/config-helper/arfabsInputJSON.js @@ -0,0 +1,18 @@ +// @flow + +import path from 'path'; + +import glob from 'glob'; + +import type { FilesFromConfig } from './'; + +const arfabsInputJSON: FilesFromConfig = config => + glob.sync( + '**/*.json', + { + cwd: path.resolve(config.rootDir, config.collateDir), + absolute: true, + }, + ); + +export default arfabsInputJSON; diff --git a/src/lib/config-helper/arfabsInputSource.js b/src/lib/config-helper/arfabsInputSource.js new file mode 100644 index 0000000..46d876e --- /dev/null +++ b/src/lib/config-helper/arfabsInputSource.js @@ -0,0 +1,20 @@ +// @flow + +import glob from 'glob'; +import chain from 'ramda/src/chain'; + +import type { Glob } from '../../types'; +import type { FilesFromConfig } from './'; + +const arfabsInputSource: FilesFromConfig = config => chain( + (sGlob: Glob) => glob.sync( + sGlob, + { + cwd: config.rootDir, + absolute: true, + }, + ), + config.sourceDirs, +); + +export default arfabsInputSource; diff --git a/src/lib/config-helper/index.js b/src/lib/config-helper/index.js new file mode 100644 index 0000000..7f95438 --- /dev/null +++ b/src/lib/config-helper/index.js @@ -0,0 +1,16 @@ +// @flow + +import type { AbsolutePath } from '../../types'; +import type { Config } from '../config'; + +import arfabsInputJSON from './arfabsInputJSON'; +import arfabsInputSource from './arfabsInputSource'; +import translationsOutputFile from './translationsOutputFile'; + +export type FilesFromConfig = (config: Config) => AbsolutePath[]; + +export { + arfabsInputJSON, + arfabsInputSource, + translationsOutputFile, +}; diff --git a/src/lib/config-helper/translationsOutputFile/__tests__/ForSingleFile.test.js b/src/lib/config-helper/translationsOutputFile/__tests__/ForSingleFile.test.js new file mode 100644 index 0000000..d33d1af --- /dev/null +++ b/src/lib/config-helper/translationsOutputFile/__tests__/ForSingleFile.test.js @@ -0,0 +1,63 @@ +// @flow + +import path from 'path'; + +import type { AbsolutePath } from '../../../../types'; +import type { ConfigSparse, ConfigSparseWithSource } from '../../../config'; +import { configResolve } from '../../../config'; +import tof from '../'; + +const configBase: ConfigSparse = { + // common for these tests: + translationsOutputFile: 'dummy', + outputMode: 'single-file', +}; + +type Fixture = { + name: string, + configOverride: ConfigSparseWithSource, + out: AbsolutePath, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + configOverride: { + configFile: '/a/b/c/foo.js', + translationsOutputFile: 'x/y/foo-[locale]-bar.json', + }, + out: '/a/b/c/x/y/foo-locales-bar.json', + }, + + { + name: '02', + configOverride: { + configFile: '/aa/foo.js', + translationsOutputFile: 'bb/[locale].json', + }, + out: '/aa/bb/locales.json', + }, + + { + name: '03', + configOverride: { + translationsOutputFile: 'bb/[locale].json', + }, + out: path.resolve('bb/locales.json'), + }, +]; + +describe('lib/translationsOutputFile/forSingleFile', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const cfg = configResolve({ + ...configBase, + ...fixture.configOverride, + }); + + const received = tof(cfg).forSingleFile(); + + expect(received).toBe(fixture.out); + }); + }); +}); diff --git a/src/lib/config-helper/translationsOutputFile/__tests__/fromLid.test.js b/src/lib/config-helper/translationsOutputFile/__tests__/fromLid.test.js new file mode 100644 index 0000000..9031d37 --- /dev/null +++ b/src/lib/config-helper/translationsOutputFile/__tests__/fromLid.test.js @@ -0,0 +1,67 @@ +// @flow + +import path from 'path'; + +import type { AbsolutePath, LocaleId } from '../../../../types'; +import type { ConfigSparse, ConfigSparseWithSource } from '../../../config'; +import { configResolve } from '../../../config'; +import tof from '../'; + +const configBase: ConfigSparse = { + // common for these tests: + translationsOutputFile: 'dummy', + outputMode: 'file-per-locale', +}; + +type Fixture = { + name: string, + configOverride: ConfigSparseWithSource, + in: LocaleId, + out: AbsolutePath, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + configOverride: { + configFile: '/a/b/c/foo.js', + translationsOutputFile: 'x/y/foo-[locale]-bar.json', + }, + in: 'aa-aa', + out: '/a/b/c/x/y/foo-aa-aa-bar.json', + }, + + { + name: '02', + configOverride: { + configFile: '/aa/foo.js', + translationsOutputFile: 'bb/[locale].json', + }, + in: 'xx-yy', + out: '/aa/bb/xx-yy.json', + }, + + { + name: '03', + configOverride: { + translationsOutputFile: 'bb/[locale].json', + }, + in: 'xx-yy', + out: path.resolve('bb/xx-yy.json'), + }, +]; + +describe('lib/translationsOutputFile/fromLid', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const cfg = configResolve({ + ...configBase, + ...fixture.configOverride, + }); + + const received = tof(cfg).fromLid(fixture.in); + + expect(received).toBe(fixture.out); + }); + }); +}); diff --git a/src/lib/config-helper/translationsOutputFile/__tests__/hasPlaceholder.test.js b/src/lib/config-helper/translationsOutputFile/__tests__/hasPlaceholder.test.js new file mode 100644 index 0000000..6f58281 --- /dev/null +++ b/src/lib/config-helper/translationsOutputFile/__tests__/hasPlaceholder.test.js @@ -0,0 +1,51 @@ +// @flow + +import type { ConfigSparse, ConfigSparseWithSource } from '../../../config'; +import { configResolve } from '../../../config'; +import tof from '../'; + +const configBase: ConfigSparse = { + // common for these tests: + translationsOutputFile: 'dummy', +}; + +type Fixture = { + name: string, + configOverride: ConfigSparseWithSource, + out: boolean, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + configOverride: { + configFile: '/a/b/c/foo.js', + translationsOutputFile: 'x/y/foo-[locale]-bar.json', + }, + out: true, + }, + + { + name: '02 file-per-locale replaces placeholder with locale', + configOverride: { + configFile: '/aa/foo.js', + translationsOutputFile: 'bb/wibble.json', + }, + out: false, + }, +]; + +describe('lib/translationsOutputFile/hasPlaceholder', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const cfg = configResolve({ + ...configBase, + ...fixture.configOverride, + }); + + const received = tof(cfg).hasPlaceholder(); + + expect(received).toBe(fixture.out); + }); + }); +}); diff --git a/src/lib/config-helper/translationsOutputFile/index.js b/src/lib/config-helper/translationsOutputFile/index.js new file mode 100644 index 0000000..0878384 --- /dev/null +++ b/src/lib/config-helper/translationsOutputFile/index.js @@ -0,0 +1,22 @@ +// @flow + +import path from 'path'; + +import type { Config } from '../../config'; + +const sPlaceholder = '[locale]'; +const sSingle = 'locales'; + +export default (config: Config) => { + const replace = (str: string) => path.resolve( + config.rootDir, + config.translationsOutputFile.replace(sPlaceholder, str), + ); + + return { + sPlaceholder, + hasPlaceholder: () => config.translationsOutputFile.includes(sPlaceholder), + fromLid: replace, + forSingleFile: () => replace(sSingle), + }; +}; diff --git a/src/lib/config/fromPackage/__tests__/fabsConfigPackageForCWD.test.js b/src/lib/config/fromPackage/__tests__/fabsConfigPackageForCWD.test.js new file mode 100644 index 0000000..2d69fb5 --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fabsConfigPackageForCWD.test.js @@ -0,0 +1,45 @@ +// @flow + +// these tests can't use mock-fs as the code uses require to allow users +// to write node modules that export configuration, and those modules might +// need other resources, eg babel. mock-fs 4.1.x replaces the ENTIRE filesystem, +// it doesn't overlay a mock one on the real one -- so those modules and the node +// core have no access to files not mocked. + +import path from 'path'; + +import type { AbsolutePath } from '../../../../types'; +import fabsConfigPackageForCWD from '../fabsConfigPackageForCWD'; + +describe('lib/config/fromPackage/fabsConfigPackageForCWD', () => { + let cwd; + + beforeEach(() => { + cwd = process.cwd(); + }); + + afterEach(() => { + process.chdir(cwd); + }); + + const dabs: AbsolutePath = path.resolve(__dirname, 'fixtures', '04'); + const fabsExpected = path.resolve(dabs, '.riw-config.js'); + + it('returns the path to the package .riw-config.js from a subdir even though file does not exist', () => { + process.chdir(path.resolve(dabs, 'subdir')); + + expect(fabsConfigPackageForCWD()).toBe(fabsExpected); + }); + + it('returns the path to the package .riw-config.js from the package root even though file does not exist', () => { + process.chdir(dabs); + + expect(fabsConfigPackageForCWD()).toBe(fabsExpected); + }); + + it('should return null if no root dir found', () => { + process.chdir(path.resolve('/tmp')); + + expect(fabsConfigPackageForCWD()).toBeNull(); + }); +}); diff --git a/src/lib/config/fromPackage/__tests__/fabsConfigPackageFromPackageJSONFabs.test.js b/src/lib/config/fromPackage/__tests__/fabsConfigPackageFromPackageJSONFabs.test.js new file mode 100644 index 0000000..738a84e --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fabsConfigPackageFromPackageJSONFabs.test.js @@ -0,0 +1,17 @@ +// @flow + +import type { AbsolutePath } from '../../../../types'; +import fabsConfigPackageFromPackageJSONFabs from '../fabsConfigPackageFromPackageJSONFabs'; + +describe('lib/config/fabsConfigPackageFromPackageJSONFabs', () => { + it('should return the path to the .riw-config.js file alongside a package.json', () => { + const fabsTest: AbsolutePath = '/foo/bar/package.json'; + const fabsExpected: AbsolutePath = '/foo/bar/.riw-config.js'; + + expect(fabsConfigPackageFromPackageJSONFabs(fabsTest)).toBe(fabsExpected); + }); + + it('should return null if null passed in', () => { + expect(fabsConfigPackageFromPackageJSONFabs(null)).toBeNull(); + }); +}); diff --git a/src/lib/config/fromPackage/__tests__/fabsPackageJSONFromDabs.test.js b/src/lib/config/fromPackage/__tests__/fabsPackageJSONFromDabs.test.js new file mode 100644 index 0000000..986e713 --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fabsPackageJSONFromDabs.test.js @@ -0,0 +1,47 @@ +// @flow + +import path from 'path'; + +import mock from 'mock-fs'; + +import type { AbsolutePath } from '../../../../types'; +import fabsPackageJSONFromDabs from '../fabsPackageJSONFromDabs'; + +describe('lib/config/fromPackage/fabsPackageJSONFromDabs', () => { + afterEach(() => { + mock.restore(); + }); + + it('should return the path to the closest package.json from a subdir', () => { + mock({ + fixture: { + 'package.json': '{}', + 'dir': { + 'sub': {}, + }, + }, + }); + + const dabsTest: AbsolutePath = path.resolve('fixture', 'dir', 'sub'); + const fabsExpected: AbsolutePath = path.resolve('fixture', 'package.json'); + + expect(fabsPackageJSONFromDabs(dabsTest)).toBe(fabsExpected); + }); + + it('should return the path to the package.json in the same dir', () => { + mock({ + fixture: { + 'package.json': '{}', + }, + }); + + const dabsTest: AbsolutePath = path.resolve('fixture'); + const fabsExpected: AbsolutePath = path.resolve('fixture', 'package.json'); + + expect(fabsPackageJSONFromDabs(dabsTest)).toBe(fabsExpected); + }); + + it('should return null if no root dir found', () => { + expect(fabsPackageJSONFromDabs('/tmp')).toBeNull(); + }); +}); diff --git a/src/lib/config/fromPackage/__tests__/fixtures/01/.riw-config.js b/src/lib/config/fromPackage/__tests__/fixtures/01/.riw-config.js new file mode 100644 index 0000000..86a4974 --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fixtures/01/.riw-config.js @@ -0,0 +1,3 @@ +module.exports = { + keyFromRIWConfig: true, +}; diff --git a/src/lib/config/fromPackage/__tests__/fixtures/01/package.json b/src/lib/config/fromPackage/__tests__/fixtures/01/package.json new file mode 100644 index 0000000..78f828a --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fixtures/01/package.json @@ -0,0 +1,5 @@ +{ + "riw": { + "keyFromPackageJSON": true + } +} diff --git a/src/lib/config/fromPackage/__tests__/fixtures/02/package.json b/src/lib/config/fromPackage/__tests__/fixtures/02/package.json new file mode 100644 index 0000000..78f828a --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fixtures/02/package.json @@ -0,0 +1,5 @@ +{ + "riw": { + "keyFromPackageJSON": true + } +} diff --git a/src/lib/config/fromPackage/__tests__/fixtures/03/package.json b/src/lib/config/fromPackage/__tests__/fixtures/03/package.json new file mode 100644 index 0000000..b66b410 --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fixtures/03/package.json @@ -0,0 +1,4 @@ +{ + "no-riw-key": { + } +} diff --git a/src/lib/config/fromPackage/__tests__/fixtures/04/package.json b/src/lib/config/fromPackage/__tests__/fixtures/04/package.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/fixtures/04/package.json @@ -0,0 +1 @@ +{} diff --git a/src/lib/config/fromPackage/__tests__/index.test.js b/src/lib/config/fromPackage/__tests__/index.test.js new file mode 100644 index 0000000..01d399c --- /dev/null +++ b/src/lib/config/fromPackage/__tests__/index.test.js @@ -0,0 +1,70 @@ +// @flow + +// these tests can't use mock-fs as the code uses require to allow users +// to write node modules that export configuration, and those modules might +// need other resources, eg babel. mock-fs 4.1.x replaces the ENTIRE filesystem, +// it doesn't overlay a mock one on the real one -- so those modules and the node +// core have no access to files not mocked. + +import path from 'path'; + +import configFromPackage from '../'; + +const dabsFixtures = path.resolve(__dirname, 'fixtures'); + +describe('lib/config/fromPackage', () => { + let cwd; + + beforeEach(() => { + cwd = process.cwd(); + }); + + afterEach(() => { + process.chdir(cwd); + }); + + it('should return the package .riw-config if present, ignoring package.json', () => { + const dabs = path.resolve(dabsFixtures, '01'); + const fabs = path.resolve(dabs, '.riw-config.js'); + + process.chdir(dabs); + + const configOverride = require(fabs); + + expect(configFromPackage()).toEqual({ + ...configOverride, + configFile: fabs, + }); + }); + + it('should return the package.json riw key if present and no .riw-config', () => { + const dabs = path.resolve(dabsFixtures, '02'); + const fabs = path.resolve(dabs, 'package.json'); + + process.chdir(dabs); + + const configOverride = require(fabs).riw; + + expect(configFromPackage()).toEqual({ + ...configOverride, + configFile: fabs, + }); + }); + + it('should return very little if no .riw-config and package.json has no riw key', () => { + const dabs = path.resolve(dabsFixtures, '03'); + const fabs = path.resolve(dabs, 'package.json'); + + process.chdir(dabs); + + expect(configFromPackage()).toEqual({ + configFile: fabs, + }); + }); + + it('should return null if no root dir found', () => { + process.chdir(path.resolve('/tmp')); + + expect(configFromPackage()).toBeNull(); + }); +}); diff --git a/src/lib/config/fromPackage/fabsConfigPackageForCWD.js b/src/lib/config/fromPackage/fabsConfigPackageForCWD.js new file mode 100644 index 0000000..b1e5612 --- /dev/null +++ b/src/lib/config/fromPackage/fabsConfigPackageForCWD.js @@ -0,0 +1,13 @@ +// @flow + +import compose from 'ramda/src/compose'; + +import fabsPackageJSONFromDabs from './fabsPackageJSONFromDabs'; +import fabsConfigPackageFromPackageJSONFabs from './fabsConfigPackageFromPackageJSONFabs'; + +export default compose( + fabsConfigPackageFromPackageJSONFabs, + fabsPackageJSONFromDabs, + () => process.cwd(), +); + diff --git a/src/lib/config/fromPackage/fabsConfigPackageFromPackageJSONFabs.js b/src/lib/config/fromPackage/fabsConfigPackageFromPackageJSONFabs.js new file mode 100644 index 0000000..7cb6f29 --- /dev/null +++ b/src/lib/config/fromPackage/fabsConfigPackageFromPackageJSONFabs.js @@ -0,0 +1,11 @@ +// @flow + +import path from 'path'; + +import type { AbsolutePath } from '../../../types'; + +export default (fabsPackageJSON: ?AbsolutePath): ?AbsolutePath => ( + fabsPackageJSON + ? path.resolve(path.dirname(fabsPackageJSON), '.riw-config.js') + : null + ); diff --git a/src/lib/config/fromPackage/fabsPackageJSONFromDabs.js b/src/lib/config/fromPackage/fabsPackageJSONFromDabs.js new file mode 100644 index 0000000..90cb350 --- /dev/null +++ b/src/lib/config/fromPackage/fabsPackageJSONFromDabs.js @@ -0,0 +1,8 @@ +// @flow + +import findUp from 'find-up'; + +import type { AbsolutePath } from '../../../types'; + +export default (cwd: AbsolutePath): ?AbsolutePath => findUp.sync('package.json', { cwd }); + diff --git a/src/lib/config/fromPackage/index.js b/src/lib/config/fromPackage/index.js new file mode 100644 index 0000000..d46c149 --- /dev/null +++ b/src/lib/config/fromPackage/index.js @@ -0,0 +1,38 @@ +// @flow + +import type { ConfigSparse, ConfigSparseWithSource } from '../../config'; +import log from '../../log'; + +import fabsPackageJSONFromDabs from './fabsPackageJSONFromDabs'; +import fabsConfigPackageFromPackageJSONFabs from './fabsConfigPackageFromPackageJSONFabs'; + +export default (): ?ConfigSparseWithSource => { + const fabsPackageJSON = fabsPackageJSONFromDabs(process.cwd()); + const fabsConfigPackage = fabsConfigPackageFromPackageJSONFabs(fabsPackageJSON); + + if (!fabsPackageJSON || !fabsConfigPackage) { + log.error('riw', 'Unable to find package root'); + return null; + } + + try { + return { + ...(require(fabsConfigPackage): ConfigSparse), + configFile: fabsConfigPackage, + }; + + } catch (err) { + // fabsPackageJSON exists as we hunted the fs for it above: + // but it might not have the riw key. + const config: ConfigSparse = require(fabsPackageJSON).riw; + + if (!config) { + log.warn('No riw app config found. You probably want to add some configuration.'); + } + + return { + ...config, + configFile: fabsPackageJSON, + }; + } +}; diff --git a/src/lib/config/fromPath/__tests__/fixtures/01/test-config.js b/src/lib/config/fromPath/__tests__/fixtures/01/test-config.js new file mode 100644 index 0000000..2b6fe51 --- /dev/null +++ b/src/lib/config/fromPath/__tests__/fixtures/01/test-config.js @@ -0,0 +1,3 @@ +module.exports = { + somethingExtra: true, +}; diff --git a/src/lib/config/fromPath/__tests__/index.test.js b/src/lib/config/fromPath/__tests__/index.test.js new file mode 100644 index 0000000..905bdf7 --- /dev/null +++ b/src/lib/config/fromPath/__tests__/index.test.js @@ -0,0 +1,58 @@ +// @flow + +// these tests can't use mock-fs as the code uses require to allow users +// to write node modules that export configuration, and those modules might +// need other resources, eg babel. mock-fs 4.1.x replaces the ENTIRE filesystem, +// it doesn't overlay a mock one on the real one -- so those modules and the node +// core have no access to files not mocked. + +import path from 'path'; + +import configFromPath from '../'; + +const dabsFixtures = path.resolve(__dirname, 'fixtures'); + +const frelF02Good = path.join('01', 'test-config.js'); +const frelF02Bad = path.join('01', 'test-config-missing.js'); +const fabsF02Good = path.resolve(dabsFixtures, frelF02Good); +const fabsF02Bad = path.resolve(dabsFixtures, frelF02Bad); + +const configOverrideF02 = require(fabsF02Good); + +describe('lib/config/fromPath', () => { + let cwd; + + beforeEach(() => { + cwd = process.cwd(); + }); + + afterEach(() => { + process.chdir(cwd); + }); + + it('should return the merged config: absolute, good file', () => { + expect(configFromPath(fabsF02Good)).toEqual({ + ...configOverrideF02, + configFile: fabsF02Good, + }); + }); + + it('should return the merged config: relative, good file', () => { + process.chdir(dabsFixtures); + + expect(configFromPath(frelF02Good)).toEqual({ + ...configOverrideF02, + configFile: fabsF02Good, + }); + }); + + it('should return null: absolute, missing file', () => { + expect(configFromPath(fabsF02Bad)).toBeNull(); + }); + + it('should return null: relative, missing file', () => { + process.chdir(dabsFixtures); + + expect(configFromPath(frelF02Bad)).toBeNull(); + }); +}); diff --git a/src/lib/config/fromPath/index.js b/src/lib/config/fromPath/index.js new file mode 100644 index 0000000..274929b --- /dev/null +++ b/src/lib/config/fromPath/index.js @@ -0,0 +1,23 @@ +// @flow + +import path from 'path'; +import chalk from 'chalk'; + +import type { Path, AbsolutePath } from '../../../types'; +import type { ConfigSparse, ConfigSparseWithSource } from '../../config'; +import log from '../../log'; + +export default (pathConfig: Path): ?ConfigSparseWithSource => { + const fabs: AbsolutePath = path.resolve(pathConfig); + + try { + return { + ...(require(fabs): ConfigSparse), + configFile: fabs, + }; + + } catch (err) { + log.error('File not found: ', chalk.bold(fabs)); + return null; + } +}; diff --git a/src/lib/config/index.js b/src/lib/config/index.js new file mode 100644 index 0000000..9a81825 --- /dev/null +++ b/src/lib/config/index.js @@ -0,0 +1,52 @@ +// @flow + +import type { AbsolutePath, LocaleId, Path, Glob } from '../../types'; +import configDefault from './resolve/configDefault'; +import fabsConfigPackageForCWD from './fromPackage/fabsConfigPackageForCWD'; +import configFromPath from './fromPath'; +import configFromPackage from './fromPackage'; +import configResolve from './resolve'; + +export type InputMode = 'source' | 'json'; +export type OutputMode = 'single-file' | 'file-per-locale' | 'no-file'; + +export type ConfigSparse = { + defaultLocale?: LocaleId, + targetLocales?: LocaleId[], + translationsDatabaseFile?: Path, + sourceDirs?: Glob[], + collateDir?: Path, + inputMode?: InputMode, + translationsOutputFile?: Path, + outputMode?: OutputMode, + todoFile?: Path, +}; + +type ConfigSource = { + configFile?: AbsolutePath, + rootDir?: AbsolutePath, +}; + +export type ConfigSparseWithSource = ConfigSource & ConfigSparse; + +export type Config = { + rootDir: AbsolutePath, + configFile?: AbsolutePath, // remains optional as API user might not have one + defaultLocale: LocaleId, + targetLocales: LocaleId[], + translationsDatabaseFile: Path, + sourceDirs: Glob[], + collateDir: Path, + inputMode: InputMode, + translationsOutputFile: Path, + outputMode: OutputMode, + todoFile: Path, +}; + +export { + configDefault, + fabsConfigPackageForCWD, + configFromPath, + configFromPackage, + configResolve, +}; diff --git a/src/lib/config/resolve/__tests__/__snapshots__/index.test.js.snap b/src/lib/config/resolve/__tests__/__snapshots__/index.test.js.snap new file mode 100644 index 0000000..c529474 --- /dev/null +++ b/src/lib/config/resolve/__tests__/__snapshots__/index.test.js.snap @@ -0,0 +1,71 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/config/resolve 01 empty input config 1`] = ` +Object { + "collateDir": "tmp/babel-plugin-react-intl", + "defaultLocale": "en-US", + "inputMode": "source", + "outputMode": "file-per-locale", + "rootDir": ".", + "sourceDirs": Array [ + "src/**/*.js", + ], + "targetLocales": Array [], + "todoFile": "src/locale/TODO-untranslated.json", + "translationsDatabaseFile": "src/locale/riw-db.json", + "translationsOutputFile": "src/locale/[locale].json", +} +`; + +exports[`lib/config/resolve 02 empty input config with configFile 1`] = ` +Object { + "collateDir": "tmp/babel-plugin-react-intl", + "configFile": "/foo/bar/package.json", + "defaultLocale": "en-US", + "inputMode": "source", + "outputMode": "file-per-locale", + "rootDir": "/foo/bar", + "sourceDirs": Array [ + "src/**/*.js", + ], + "targetLocales": Array [], + "todoFile": "src/locale/TODO-untranslated.json", + "translationsDatabaseFile": "src/locale/riw-db.json", + "translationsOutputFile": "src/locale/[locale].json", +} +`; + +exports[`lib/config/resolve 03 empty input config with rootDir 1`] = ` +Object { + "collateDir": "tmp/babel-plugin-react-intl", + "defaultLocale": "en-US", + "inputMode": "source", + "outputMode": "file-per-locale", + "rootDir": "/foo/bar", + "sourceDirs": Array [ + "src/**/*.js", + ], + "targetLocales": Array [], + "todoFile": "src/locale/TODO-untranslated.json", + "translationsDatabaseFile": "src/locale/riw-db.json", + "translationsOutputFile": "src/locale/[locale].json", +} +`; + +exports[`lib/config/resolve 04 empty input config with both configFile and rootDir 1`] = ` +Object { + "collateDir": "tmp/babel-plugin-react-intl", + "configFile": "/a/b/c/package.json", + "defaultLocale": "en-US", + "inputMode": "source", + "outputMode": "file-per-locale", + "rootDir": "/foo/bar", + "sourceDirs": Array [ + "src/**/*.js", + ], + "targetLocales": Array [], + "todoFile": "src/locale/TODO-untranslated.json", + "translationsDatabaseFile": "src/locale/riw-db.json", + "translationsOutputFile": "src/locale/[locale].json", +} +`; diff --git a/src/lib/config/resolve/__tests__/index.test.js b/src/lib/config/resolve/__tests__/index.test.js new file mode 100644 index 0000000..3b078ad --- /dev/null +++ b/src/lib/config/resolve/__tests__/index.test.js @@ -0,0 +1,48 @@ +// @flow + +import type { ConfigSparseWithSource } from '../../'; +import configResolve from '../'; + +type Fixture = { + name: string, + in: ConfigSparseWithSource, +}; + +const fixtures: Fixture[] = [ + { + name: '01 empty input config', + in: {}, + }, + + { + name: '02 empty input config with configFile', + in: { + configFile: '/foo/bar/package.json', + }, + }, + + { + name: '03 empty input config with rootDir', + in: { + rootDir: '/foo/bar', + }, + }, + + { + name: '04 empty input config with both configFile and rootDir', + in: { + configFile: '/a/b/c/package.json', + rootDir: '/foo/bar', + }, + }, +]; + +describe('lib/config/resolve', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = configResolve(fixture.in); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/config/resolve/configDefault.js b/src/lib/config/resolve/configDefault.js new file mode 100644 index 0000000..24092cd --- /dev/null +++ b/src/lib/config/resolve/configDefault.js @@ -0,0 +1,16 @@ +// @flow + +import type { Config } from '../'; + +export default ({ + rootDir: '.', + defaultLocale: 'en-US', + targetLocales: [], + translationsDatabaseFile: 'src/locale/riw-db.json', + sourceDirs: ['src/**/*.js'], + collateDir: 'tmp/babel-plugin-react-intl', + inputMode: 'source', + translationsOutputFile: 'src/locale/[locale].json', + outputMode: 'file-per-locale', + todoFile: 'src/locale/TODO-untranslated.json', +}: Config); diff --git a/src/lib/config/resolve/index.js b/src/lib/config/resolve/index.js new file mode 100644 index 0000000..d36914e --- /dev/null +++ b/src/lib/config/resolve/index.js @@ -0,0 +1,19 @@ +// @flow + +import path from 'path'; + +import type { Config, ConfigSparseWithSource } from '../../config'; + +import configDefault from './configDefault'; + +const maybeAddRootDir = ({ configFile, rootDir }) => ( + configFile && !rootDir + ? { rootDir: path.dirname(configFile) } + : {} +); + +export default (config: ConfigSparseWithSource): Config => ({ + ...configDefault, + ...config, + ...maybeAddRootDir(config), +}); diff --git a/src/lib/log/index.js b/src/lib/log/index.js new file mode 100644 index 0000000..6d319a8 --- /dev/null +++ b/src/lib/log/index.js @@ -0,0 +1,12 @@ +// @flow + +import chalk from 'chalk'; + +const log = process.env.LOGLEVEL === 'silent' + ? () => {} + : (...ars: string[]) => console.log(ars.join('')); + +log.warn = (...ars) => log(chalk.red('WARNING '), ...ars); +log.error = (...ars) => log(chalk.red.bold('ERROR '), ...ars); + +export default log; diff --git a/src/lib/notify/__tests__/makeNotifier.test.js b/src/lib/notify/__tests__/makeNotifier.test.js new file mode 100644 index 0000000..029ecab --- /dev/null +++ b/src/lib/notify/__tests__/makeNotifier.test.js @@ -0,0 +1,31 @@ +// @flow + +import makeNotifier from '../'; + +describe('lib/notify/makeNotifier', () => { + it('returns input, and does not call function if not defined', () => { + const handler = jest.fn(); + + const notify = makeNotifier({ + aa: handler, + }); + + const received = notify('bb')(123); + + expect(received).toBe(123); + expect(handler.mock.calls.length).toBe(0); + }); + + it('returns input, and calls function if defined', () => { + const handler = jest.fn(); + + const notify = makeNotifier({ + aa: handler, + }); + + const received = notify('aa')(123); + + expect(received).toBe(123); + expect(handler.mock.calls).toEqual([[123]]); + }); +}); diff --git a/src/lib/notify/index.js b/src/lib/notify/index.js new file mode 100644 index 0000000..faf09e6 --- /dev/null +++ b/src/lib/notify/index.js @@ -0,0 +1,17 @@ +// @flow + +type HandlerMap = { + [key: string]: (input: any) => any, +}; + +export type Notifier = (sEvent: string) => (data: *) => *; + +type NotifierFactory = (on?: HandlerMap) => Notifier; + +export default (on => sEvent => (data) => { + if (on && on[sEvent]) { + on[sEvent](data); + } + + return data; +}: NotifierFactory); diff --git a/src/lib/riw/app/index.js b/src/lib/riw/app/index.js new file mode 100644 index 0000000..40d3aa5 --- /dev/null +++ b/src/lib/riw/app/index.js @@ -0,0 +1,34 @@ +// @flow + +import type { Config } from '../../config'; + +import type { + AppStatusResult, +} from './status'; +import type { + AppTranslateSpec, + AppTranslateResult, + TranslationLookupResult, + DuplicateIdData, +} from './translate'; + +import status from './status'; +import translate from './translate'; + +export type { + AppStatusResult, + AppTranslateSpec, + AppTranslateResult, + TranslationLookupResult, + DuplicateIdData, +}; + +export type App = {| + status: () => AppStatusResult, + translate: (opt: AppTranslateSpec) => AppTranslateResult, +|}; + +export default (config: Config): App => ({ + status: status(config), + translate: translate(config), +}); diff --git a/src/lib/riw/app/status/__tests__/__snapshots__/ctDistinctForLocales.test.js.snap b/src/lib/riw/app/status/__tests__/__snapshots__/ctDistinctForLocales.test.js.snap new file mode 100644 index 0000000..ab50b77 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/__snapshots__/ctDistinctForLocales.test.js.snap @@ -0,0 +1,89 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/status/ctDistinctForLocales 01 1`] = ` +Object { + "default": null, + "target": Object { + "bb-bb": null, + "cc-cc": null, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 01a 1`] = ` +Object { + "default": null, + "target": Object { + "bb-bb": null, + "cc-cc": null, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 02 1`] = ` +Object { + "default": null, + "target": Object { + "bb-bb": 0, + "cc-cc": null, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 02a 1`] = ` +Object { + "default": null, + "target": Object { + "bb-bb": 0, + "cc-cc": null, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 03 1`] = ` +Object { + "default": 3, + "target": Object { + "bb-bb": 2, + "cc-cc": 1, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 03a 1`] = ` +Object { + "default": 3, + "target": Object { + "bb-bb": 2, + "cc-cc": 1, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 04 1`] = ` +Object { + "default": 2, + "target": Object { + "bb-bb": 2, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 04a 1`] = ` +Object { + "default": 2, + "target": Object { + "bb-bb": 2, + }, +} +`; + +exports[`lib/riw/app/status/ctDistinctForLocales 04b 1`] = ` +Object { + "default": null, + "target": Object { + "bb-bb": null, + "cc-cc": null, + }, +} +`; diff --git a/src/lib/riw/app/status/__tests__/__snapshots__/dateConfig.test.js.snap b/src/lib/riw/app/status/__tests__/__snapshots__/dateConfig.test.js.snap new file mode 100644 index 0000000..53ef290 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/__snapshots__/dateConfig.test.js.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/status/dateConfig 01 1`] = ` +Object { + "dateConfig": 0, +} +`; + +exports[`lib/riw/app/status/dateConfig 02 1`] = ` +Object { + "dateConfig": 1970-01-01T00:00:02.000Z, +} +`; diff --git a/src/lib/riw/app/status/__tests__/__snapshots__/dateDB.test.js.snap b/src/lib/riw/app/status/__tests__/__snapshots__/dateDB.test.js.snap new file mode 100644 index 0000000..68e9fe3 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/__snapshots__/dateDB.test.js.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/status/dateDB 01 1`] = ` +Object { + "dateDB": 0, +} +`; + +exports[`lib/riw/app/status/dateDB 02 1`] = ` +Object { + "dateDB": 1970-01-01T00:00:02.000Z, +} +`; diff --git a/src/lib/riw/app/status/__tests__/__snapshots__/dateInputNewest.test.js.snap b/src/lib/riw/app/status/__tests__/__snapshots__/dateInputNewest.test.js.snap new file mode 100644 index 0000000..96ee3b9 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/__snapshots__/dateInputNewest.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/status/dateInputNewest 01 1`] = ` +Object { + "dateInputNewest": 0, +} +`; + +exports[`lib/riw/app/status/dateInputNewest 02 1`] = ` +Object { + "dateInputNewest": 1970-01-01T00:00:05.000Z, +} +`; + +exports[`lib/riw/app/status/dateInputNewest 03 1`] = ` +Object { + "dateInputNewest": 0, +} +`; + +exports[`lib/riw/app/status/dateInputNewest 04 1`] = ` +Object { + "dateInputNewest": 1970-01-01T00:00:05.000Z, +} +`; diff --git a/src/lib/riw/app/status/__tests__/__snapshots__/dateMTimeFromFabs.test.js.snap b/src/lib/riw/app/status/__tests__/__snapshots__/dateMTimeFromFabs.test.js.snap new file mode 100644 index 0000000..81f6b5f --- /dev/null +++ b/src/lib/riw/app/status/__tests__/__snapshots__/dateMTimeFromFabs.test.js.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/status/dateMTimeFromFabs returns 0 if file does not exist 1`] = `0`; + +exports[`lib/riw/app/status/dateMTimeFromFabs returns mtime if file exists 1`] = `1970-01-01T00:00:02.000Z`; diff --git a/src/lib/riw/app/status/__tests__/__snapshots__/dateTodo.test.js.snap b/src/lib/riw/app/status/__tests__/__snapshots__/dateTodo.test.js.snap new file mode 100644 index 0000000..48b0957 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/__snapshots__/dateTodo.test.js.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/status/dateTodo 01 1`] = ` +Object { + "dateTodo": 0, +} +`; + +exports[`lib/riw/app/status/dateTodo 02 1`] = ` +Object { + "dateTodo": 1970-01-01T00:00:02.000Z, +} +`; diff --git a/src/lib/riw/app/status/__tests__/__snapshots__/todo.test.js.snap b/src/lib/riw/app/status/__tests__/__snapshots__/todo.test.js.snap new file mode 100644 index 0000000..71ae313 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/__snapshots__/todo.test.js.snap @@ -0,0 +1,55 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/status/todo 01 1`] = ` +Object { + "todo": null, +} +`; + +exports[`lib/riw/app/status/todo 02 1`] = ` +Object { + "todo": Object { + "xx-xx": Array [ + Object { + "defaultMessage": "aa", + "description": "aa desc", + "id": "md1", + "locale": "xx-xx", + }, + Object { + "defaultMessage": "bb", + "description": "bb desc", + "id": "md2", + "locale": "xx-xx", + }, + ], + "yy-yy": Array [ + Object { + "defaultMessage": "aa", + "description": "aa desc", + "id": "md1", + "locale": "yy-yy", + }, + ], + "zz-zz": Array [ + Object { + "defaultMessage": "aa", + "description": "aa desc", + "id": "md1", + "locale": "zz-zz", + }, + Object { + "defaultMessage": "cc", + "description": "cc desc", + "id": "md3", + "locale": "zz-zz", + }, + Object { + "defaultMessage": "dd", + "id": "md4", + "locale": "zz-zz", + }, + ], + }, +} +`; diff --git a/src/lib/riw/app/status/__tests__/ctDistinctForLocales.test.js b/src/lib/riw/app/status/__tests__/ctDistinctForLocales.test.js new file mode 100644 index 0000000..21a4747 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/ctDistinctForLocales.test.js @@ -0,0 +1,236 @@ +// @flow + +import mock from 'mock-fs'; + +import type { ConfigSparse, ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import ctDistinctForLocales from '../ctDistinctForLocales'; + +const stringify = obj => JSON.stringify(obj, null, 4); + +const cfgBase: ConfigSparseWithSource = { + translationsOutputFile: 'fixtures/dir/[locale].json', +}; + +type Fixture = { + name: string, + cfgOverride: ConfigSparse, + in: { [key: string]: string }, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + cfgOverride: { + outputMode: 'file-per-locale', + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc'], + }, + in: {}, // empty dir + }, + + { + name: '01a', + cfgOverride: { + outputMode: 'single-file', + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc'], + }, + in: {}, // empty dir + }, + + { + name: '02', + cfgOverride: { + outputMode: 'file-per-locale', + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc'], + }, + in: { + 'bb-bb.json': stringify({}), + }, + }, + + { + name: '02a', + cfgOverride: { + outputMode: 'single-file', + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc'], + }, + in: { + 'locales.json': stringify({ + 'bb-bb': {}, + }), + 'aa-aa.json': stringify({ + 'id1': 'string1', + }), + }, + }, + + { + name: '03', + cfgOverride: { + outputMode: 'file-per-locale', + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc'], + }, + in: { + 'aa-aa.json': stringify({ + 'id1': 'string1', + 'id2': 'string2', + 'id3': 'string3', + }), + 'bb-bb.json': stringify({ + 'id1': 'string1', + 'id2': 'string2', + }), + 'cc-cc.json': stringify({ + 'id1': 'string1', + }), + 'dd-dd.json': stringify({ + 'id2': 'string2', + 'id3': 'string3', + }), + }, + }, + + { + name: '03a', + cfgOverride: { + outputMode: 'single-file', + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc'], + }, + in: { + 'locales.json': stringify({ + 'aa-aa': { + 'id1': 'string1', + 'id2': 'string2', + 'id3': 'string3', + }, + 'bb-bb': { + 'id1': 'string1', + 'id2': 'string2', + }, + 'cc-cc': { + 'id1': 'string1', + }, + 'dd-dd': { + 'id2': 'string2', + 'id3': 'string3', + }, + }), + }, + }, + + { + name: '04', + cfgOverride: { + outputMode: 'file-per-locale', + defaultLocale: 'dd-dd', + targetLocales: ['bb-bb'], + }, + in: { + 'aa-aa.json': stringify({ + 'id1': 'string1', + 'id2': 'string2', + 'id3': 'string3', + }), + 'bb-bb.json': stringify({ + 'id1': 'string1', + 'id2': 'string2', + }), + 'cc-cc.json': stringify({ + 'id1': 'string1', + + }), + 'dd-dd.json': stringify({ + 'id2': 'string2', + 'id3': 'string3', + }), + }, + }, + + { + name: '04a', + cfgOverride: { + outputMode: 'single-file', + defaultLocale: 'dd-dd', + targetLocales: ['bb-bb'], + }, + in: { + 'locales.json': stringify({ + 'aa-aa': { + 'id1': 'string1', + 'id2': 'string2', + 'id3': 'string3', + }, + 'bb-bb': { + 'id1': 'string1', + 'id2': 'string2', + }, + 'cc-cc': { + 'id1': 'string1', + }, + 'dd-dd': { + 'id2': 'string2', + 'id3': 'string3', + }, + }), + }, + }, + + { + name: '04b', + cfgOverride: { + outputMode: 'no-file', + defaultLocale: 'dd-dd', + targetLocales: ['bb-bb', 'cc-cc'], + }, + in: { + 'locales.json': stringify({ + 'aa-aa': { + 'id1': 'string1', + 'id2': 'string2', + 'id3': 'string3', + }, + 'bb-bb': { + 'id1': 'string1', + 'id2': 'string2', + }, + 'cc-cc': { + 'id1': 'string1', + }, + 'dd-dd': { + 'id2': 'string2', + 'id3': 'string3', + }, + }), + }, + }, +]; + +describe('lib/riw/app/status/ctDistinctForLocales', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + fixtures: { + dir: fixture.in, + }, + }); + + const cfg = configResolve({ + ...cfgBase, + ...fixture.cfgOverride, + }); + + const received = ctDistinctForLocales(cfg); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/status/__tests__/dateConfig.test.js b/src/lib/riw/app/status/__tests__/dateConfig.test.js new file mode 100644 index 0000000..76fbc5c --- /dev/null +++ b/src/lib/riw/app/status/__tests__/dateConfig.test.js @@ -0,0 +1,55 @@ +// @flow + +import path from 'path'; + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import dateConfig from '../dateConfig'; + +const cfg: ConfigSparseWithSource = { + configFile: path.resolve('fixtures/dir/config.json'), +}; + +type Fixture = { + name: string, + in: { + [key: string]: any, + }, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: {}, + }, + { + name: '02', + in: { + 'config.json': mock.file({ + content: '{}', + mtime: new Date(2000), + }), + }, + }, +]; + +describe('lib/riw/app/status/dateConfig', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + fixtures: { + dir: fixture.in, + }, + }); + + const received = dateConfig(configResolve(cfg)); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/status/__tests__/dateDB.test.js b/src/lib/riw/app/status/__tests__/dateDB.test.js new file mode 100644 index 0000000..40583a7 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/dateDB.test.js @@ -0,0 +1,53 @@ +// @flow + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import dateDB from '../dateDB'; + +const cfg: ConfigSparseWithSource = { + translationsDatabaseFile: 'fixtures/dir/db.json', +}; + +type Fixture = { + name: string, + in: { + [key: string]: any, + }, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: {}, + }, + { + name: '02', + in: { + 'db.json': mock.file({ + content: '[]', + mtime: new Date(2000), + }), + }, + }, +]; + +describe('lib/riw/app/status/dateDB', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + fixtures: { + dir: fixture.in, + }, + }); + + const received = dateDB(configResolve(cfg)); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/status/__tests__/dateInputNewest.test.js b/src/lib/riw/app/status/__tests__/dateInputNewest.test.js new file mode 100644 index 0000000..eb9342d --- /dev/null +++ b/src/lib/riw/app/status/__tests__/dateInputNewest.test.js @@ -0,0 +1,108 @@ +// @flow + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import dateInputNewest from '../dateInputNewest'; + +type Fixture = { + name: string, + cfg: ConfigSparseWithSource, + in: { + [key: string]: any, + }, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + cfg: { + inputMode: 'source', + sourceDirs: ['fixtures/src/*.js'], + }, + in: {}, + }, + + { + name: '02', + cfg: { + inputMode: 'source', + sourceDirs: ['fixtures/src/*.js'], + }, + in: { + 'foo.js': mock.file({ + content: '//', + mtime: new Date(2000), + }), + 'bar.js': mock.file({ + content: '//', + mtime: new Date(1000), + }), + 'baz.js': mock.file({ + content: '//', + mtime: new Date(5000), + }), + 'quux.js': mock.file({ + content: '//', + mtime: new Date(3000), + }), + }, + }, + + { + name: '03', + cfg: { + inputMode: 'json', + collateDir: 'fixtures/src', + }, + in: {}, + }, + + { + name: '04', + cfg: { + inputMode: 'json', + collateDir: 'fixtures/src', + }, + in: { + 'foo.json': mock.file({ + content: '[]', + mtime: new Date(2000), + }), + 'bar.json': mock.file({ + content: '[]', + mtime: new Date(1000), + }), + 'baz.json': mock.file({ + content: '[]', + mtime: new Date(5000), + }), + 'quux.json': mock.file({ + content: '[]', + mtime: new Date(3000), + }), + }, + }, +]; + +describe('lib/riw/app/status/dateInputNewest', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + fixtures: { + src: fixture.in, + }, + }); + + const cfg = configResolve(fixture.cfg); + + const received = dateInputNewest(cfg); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/status/__tests__/dateMTimeFromFabs.test.js b/src/lib/riw/app/status/__tests__/dateMTimeFromFabs.test.js new file mode 100644 index 0000000..b495d7a --- /dev/null +++ b/src/lib/riw/app/status/__tests__/dateMTimeFromFabs.test.js @@ -0,0 +1,38 @@ +// @flow + +import path from 'path'; + +import mock from 'mock-fs'; + +import dateMTimeFromFabs from '../dateMTimeFromFabs'; + +describe('lib/riw/app/status/dateMTimeFromFabs', () => { + it('returns 0 if file does not exist', () => { + mock({ + fixtures: {}, + }); + + const received = dateMTimeFromFabs(path.resolve('fixtures', 'nope.json')); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + + it('returns mtime if file exists', () => { + mock({ + fixtures: { + 'foo.json': mock.file({ + content: '[]', + mtime: new Date(2000), + }), + }, + }); + + const received = dateMTimeFromFabs(path.resolve('fixtures', 'foo.json')); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); +}); diff --git a/src/lib/riw/app/status/__tests__/dateTodo.test.js b/src/lib/riw/app/status/__tests__/dateTodo.test.js new file mode 100644 index 0000000..8387136 --- /dev/null +++ b/src/lib/riw/app/status/__tests__/dateTodo.test.js @@ -0,0 +1,53 @@ +// @flow + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import dateTodo from '../dateTodo'; + +const cfgBase: ConfigSparseWithSource = { + todoFile: 'fixtures/dir/TODO.json', +}; + +type Fixture = { + name: string, + in: { + [key: string]: any, + }, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: {}, + }, + { + name: '02', + in: { + 'TODO.json': mock.file({ + content: '[]', + mtime: new Date(2000), + }), + }, + }, +]; + +describe('lib/riw/app/status/dateTodo', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + fixtures: { + dir: fixture.in, + }, + }); + + const received = dateTodo(configResolve(cfgBase)); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/status/__tests__/todo.test.js b/src/lib/riw/app/status/__tests__/todo.test.js new file mode 100644 index 0000000..612ed7b --- /dev/null +++ b/src/lib/riw/app/status/__tests__/todo.test.js @@ -0,0 +1,73 @@ +// @flow + +import mock from 'mock-fs'; + +import type { UntranslatedMessageDescriptor } from '../../../../../types'; +import type { ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import todo from '../todo'; + +const stringify = obj => JSON.stringify(obj, null, 4); + +const cfgBase: ConfigSparseWithSource = { + todoFile: 'fixtures/dir/TODO.json', +}; + +type Fixture = { + name: string, + in: ?UntranslatedMessageDescriptor[], +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: null, + }, + + { + name: '02', + in: [ + { id: 'md1', defaultMessage: 'aa', description: 'aa desc', locale: 'xx-xx' }, + { id: 'md1', defaultMessage: 'aa', description: 'aa desc', locale: 'yy-yy' }, + { id: 'md1', defaultMessage: 'aa', description: 'aa desc', locale: 'zz-zz' }, + { id: 'md2', defaultMessage: 'bb', description: 'bb desc', locale: 'xx-xx' }, + { id: 'md3', defaultMessage: 'cc', description: 'cc desc', locale: 'zz-zz' }, + { id: 'md4', defaultMessage: 'dd', locale: 'zz-zz' }, + ], + }, +]; + +describe('lib/riw/app/status/todo', () => { + it('returns null for missing file', () => { + mock({ + fixtures: { + dir: {}, + }, + }); + + const received = todo(configResolve(cfgBase)); + + mock.restore(); + + expect(received).toEqual({ todo: null }); + }); + + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + fixtures: { + dir: { + 'TODO.json': stringify(fixture.in), + }, + }, + }); + + const received = todo(configResolve(cfgBase)); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/status/ctDistinctForLocales.js b/src/lib/riw/app/status/ctDistinctForLocales.js new file mode 100644 index 0000000..f96b646 --- /dev/null +++ b/src/lib/riw/app/status/ctDistinctForLocales.js @@ -0,0 +1,59 @@ +// @flow + +import compose from 'ramda/src/compose'; +import map from 'ramda/src/map'; +import zipObj from 'ramda/src/zipObj'; +import pathOr from 'ramda/src/pathOr'; +import repeat from 'ramda/src/repeat'; + +import type { LocaleId } from '../../../../types'; +import type { OutputMode, Config } from '../../../config'; +import { translationsOutputFile } from '../../../config-helper'; + +import loadJSONOrNull from './loadJSONOrNull'; + +type Reader = (config: Config) => { + default: ?number, + target: { + [key: LocaleId]: ?number, + }, +}; + +type ReaderMap = { [key: OutputMode]: Reader }; + +const ctKeyOrNull = (obj: ?Object): ?number => ( + obj ? Object.keys(obj).length : null +); + +const readerByMode: ReaderMap = { + 'file-per-locale': config => compose( + tof => map( + compose(ctKeyOrNull, loadJSONOrNull, tof.fromLid), + [config.defaultLocale, ...config.targetLocales], + ), + () => translationsOutputFile(config), + )(), + + 'single-file': config => compose( + map(ctKeyOrNull), + obj => map( + lid => pathOr(null, [lid], obj), + [config.defaultLocale, ...config.targetLocales], + ), + loadJSONOrNull, + () => translationsOutputFile(config).forSingleFile(), + )(), + + 'no-file': config => repeat(null, config.targetLocales.length + 1), +}; + +const reader: Reader = config => compose( + ([ctDefault, ...arctTarget]) => ({ + default: ctDefault, + target: zipObj(config.targetLocales, arctTarget), + }), + rdr => rdr(config), + () => readerByMode[config.outputMode], +)(); + +export default reader; diff --git a/src/lib/riw/app/status/dateConfig.js b/src/lib/riw/app/status/dateConfig.js new file mode 100644 index 0000000..22ae8dc --- /dev/null +++ b/src/lib/riw/app/status/dateConfig.js @@ -0,0 +1,20 @@ +// @flow + +import compose from 'ramda/src/compose'; +import prop from 'ramda/src/prop'; + +import type { Config } from '../../../config'; + +import dateMTimeFromFabs from './dateMTimeFromFabs'; + +type Result = (config: Config) => { + dateConfig: number, +}; + +const result: Result = compose( + dateConfig => ({ dateConfig }), + dateMTimeFromFabs, + prop('configFile'), +); + +export default result; diff --git a/src/lib/riw/app/status/dateDB.js b/src/lib/riw/app/status/dateDB.js new file mode 100644 index 0000000..93654bf --- /dev/null +++ b/src/lib/riw/app/status/dateDB.js @@ -0,0 +1,24 @@ +// @flow + +import path from 'path'; + +import compose from 'ramda/src/compose'; + +import type { Config } from '../../../config'; + +import dateMTimeFromFabs from './dateMTimeFromFabs'; + +type Result = (config: Config) => { + dateDB: number, +}; + +const result: Result = compose( + dateDB => ({ dateDB }), + dateMTimeFromFabs, + (config: Config) => path.resolve( + config.rootDir, + config.translationsDatabaseFile, + ), +); + +export default result; diff --git a/src/lib/riw/app/status/dateInputNewest.js b/src/lib/riw/app/status/dateInputNewest.js new file mode 100644 index 0000000..c2ece2b --- /dev/null +++ b/src/lib/riw/app/status/dateInputNewest.js @@ -0,0 +1,25 @@ +// @flow + +import fs from 'fs'; + +import compose from 'ramda/src/compose'; +import map from 'ramda/src/map'; +import prop from 'ramda/src/prop'; +import reduce from 'ramda/src/reduce'; +import max from 'ramda/src/max'; + +import type { AbsolutePath } from '../../../../types'; +import type { InputMode, Config } from '../../../config'; +import { arfabsInputJSON, arfabsInputSource } from '../../../config-helper'; + +const arfabsFindByMode: { [key: InputMode]: (config: Config) => AbsolutePath[] } = { + source: arfabsInputSource, + json: arfabsInputJSON, +}; + +export default (config: Config): { dateInputNewest: number } => compose( + dateInputNewest => ({ dateInputNewest }), + reduce(max, 0), + map(compose(prop('mtime'), fs.statSync)), + () => arfabsFindByMode[config.inputMode](config), +)(); diff --git a/src/lib/riw/app/status/dateMTimeFromFabs.js b/src/lib/riw/app/status/dateMTimeFromFabs.js new file mode 100644 index 0000000..e078b33 --- /dev/null +++ b/src/lib/riw/app/status/dateMTimeFromFabs.js @@ -0,0 +1,14 @@ +// @flow + +import fs from 'fs'; + +import type { AbsolutePath } from '../../../../types'; + +export default (fabs: AbsolutePath): number => { + try { + return fs.statSync(fabs).mtime; + + } catch (err) { + return 0; + } +}; diff --git a/src/lib/riw/app/status/dateTodo.js b/src/lib/riw/app/status/dateTodo.js new file mode 100644 index 0000000..6a229fd --- /dev/null +++ b/src/lib/riw/app/status/dateTodo.js @@ -0,0 +1,24 @@ +// @flow + +import path from 'path'; + +import compose from 'ramda/src/compose'; + +import type { Config } from '../../../config'; + +import dateMTimeFromFabs from './dateMTimeFromFabs'; + +type Result = (config: Config) => { + dateTodo: number, +}; + +const result: Result = compose( + dateTodo => ({ dateTodo }), + dateMTimeFromFabs, + (config: Config) => path.resolve( + config.rootDir, + config.todoFile, + ), +); + +export default result; diff --git a/src/lib/riw/app/status/index.js b/src/lib/riw/app/status/index.js new file mode 100644 index 0000000..e4b658a --- /dev/null +++ b/src/lib/riw/app/status/index.js @@ -0,0 +1,41 @@ +// @flow + +import type { Config } from '../../../config'; +import type { + LocaleId, + UntranslatedMessageDescriptor, +} from '../../../../types'; + +import ctDistinctForLocales from './ctDistinctForLocales'; +import todo from './todo'; +import dateInputNewest from './dateInputNewest'; +import dateTodo from './dateTodo'; +import dateDB from './dateDB'; +import dateConfig from './dateConfig'; + +export type AppStatusResult = { + default: ?number, + target: { + [key: LocaleId]: ?number, + }, + todo: null | { + [key: LocaleId]: UntranslatedMessageDescriptor[], + }, + dateInputNewest: number, + dateTodo: number, + dateDB: number, + dateConfig: number, +}; + +type Status = (config: Config) => () => AppStatusResult; + +const status: Status = config => () => ({ + ...ctDistinctForLocales(config), + ...todo(config), + ...dateInputNewest(config), + ...dateTodo(config), + ...dateDB(config), + ...dateConfig(config), +}); + +export default status; diff --git a/src/lib/riw/app/status/loadJSONOrNull.js b/src/lib/riw/app/status/loadJSONOrNull.js new file mode 100644 index 0000000..e5c351e --- /dev/null +++ b/src/lib/riw/app/status/loadJSONOrNull.js @@ -0,0 +1,18 @@ +// @flow + +import fs from 'fs'; + +import type { AbsolutePath } from '../../../../types'; + +type Result = Object | any[] | null; + +export default (fabs: AbsolutePath): Result => { + try { + // not using require to avoid caching issues + return JSON.parse(fs.readFileSync(fabs).toString()); + + } catch (err) { + return null; + } +}; + diff --git a/src/lib/riw/app/status/todo.js b/src/lib/riw/app/status/todo.js new file mode 100644 index 0000000..180dda3 --- /dev/null +++ b/src/lib/riw/app/status/todo.js @@ -0,0 +1,33 @@ +// @flow + +import path from 'path'; + +import compose from 'ramda/src/compose'; +import groupBy from 'ramda/src/groupBy'; +import prop from 'ramda/src/prop'; + +import type { LocaleId, UntranslatedMessageDescriptor } from '../../../../types'; +import type { Config } from '../../../config'; + +import loadJSONOrNull from './loadJSONOrNull'; + +type Result = (config: Config) => { + todo: null | { + [key: LocaleId]: UntranslatedMessageDescriptor[], + }, +}; + +const result: Result = compose( + todo => ({ todo }), + (armdu: ?UntranslatedMessageDescriptor[]) => (armdu == null + ? null + : groupBy(prop('locale'), armdu) + ), + loadJSONOrNull, + (config: Config) => path.resolve( + config.rootDir, + config.todoFile, + ), +); + +export default result; diff --git a/src/lib/riw/app/translate/__tests__/__snapshots__/extract.json.test.js.snap b/src/lib/riw/app/translate/__tests__/__snapshots__/extract.json.test.js.snap new file mode 100644 index 0000000..b448d01 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/__snapshots__/extract.json.test.js.snap @@ -0,0 +1,79 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/translate/extract.json 01 1`] = `Array []`; + +exports[`lib/riw/app/translate/extract.json 02 1`] = `Array []`; + +exports[`lib/riw/app/translate/extract.json 03 1`] = ` +Array [ + Object { + "defaultMessage": "a.1!", + "file": "/fixtures/dir/a.json", + "id": "a.1", + }, + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.json", + "id": "a.1", + }, + Object { + "defaultMessage": "b.1!", + "file": "/fixtures/dir/b.json", + "id": "b.1", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.json", + "id": "b.2", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.json", + "id": "b.2", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.json", + "id": "c.1", + }, +] +`; + +exports[`lib/riw/app/translate/extract.json 04 1`] = ` +Array [ + Object { + "defaultMessage": "a.1!", + "file": "/fixtures/dir/a.json", + "id": "a.1", + }, + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.json", + "id": "a.1", + }, + Object { + "defaultMessage": "b.1!", + "file": "/fixtures/dir/b.json", + "id": "b.1", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.json", + "id": "b.2", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.json", + "id": "b.2", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.json", + "id": "c.1", + }, +] +`; diff --git a/src/lib/riw/app/translate/__tests__/__snapshots__/extract.source.test.js.snap b/src/lib/riw/app/translate/__tests__/__snapshots__/extract.source.test.js.snap new file mode 100644 index 0000000..9fe8602 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/__snapshots__/extract.source.test.js.snap @@ -0,0 +1,69 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/translate/extract.source 01 1`] = `Array []`; + +exports[`lib/riw/app/translate/extract.source 02 1`] = `Array []`; + +exports[`lib/riw/app/translate/extract.source 03 1`] = ` +Array [ + Object { + "defaultMessage": "a.1!", + "description": undefined, + "file": "/fixtures/03/a.js", + "id": "a.1", + }, + Object { + "defaultMessage": "b.1!", + "description": undefined, + "file": "/fixtures/03/b.js", + "id": "b.1", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/03/b.js", + "id": "b.2", + }, +] +`; + +exports[`lib/riw/app/translate/extract.source 04 1`] = ` +Array [ + Object { + "defaultMessage": "a.1!", + "description": undefined, + "file": "/fixtures/04/a.js", + "id": "a.1", + }, + Object { + "defaultMessage": "a.1 again!", + "description": undefined, + "file": "/fixtures/04/aa.js", + "id": "a.1", + }, + Object { + "defaultMessage": "b.1!", + "description": undefined, + "file": "/fixtures/04/b.js", + "id": "b.1", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/04/b.js", + "id": "b.2", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/04/bb.js", + "id": "b.2", + }, + Object { + "defaultMessage": "c.1!", + "description": undefined, + "file": "/fixtures/04/c.js", + "id": "c.1", + }, +] +`; diff --git a/src/lib/riw/app/translate/__tests__/__snapshots__/findDuplicateIds.test.js.snap b/src/lib/riw/app/translate/__tests__/__snapshots__/findDuplicateIds.test.js.snap new file mode 100644 index 0000000..ee0a4f9 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/__snapshots__/findDuplicateIds.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/translate/findDuplicateIds 01 1`] = `Array []`; + +exports[`lib/riw/app/translate/findDuplicateIds 02 1`] = `Array []`; + +exports[`lib/riw/app/translate/findDuplicateIds 03 1`] = ` +Array [ + Object { + "arfabs": Array [ + "a", + "aa", + ], + "id": "a.1", + }, + Object { + "arfabs": Array [ + "b", + "bb", + "bbb", + ], + "id": "b.2", + }, +] +`; diff --git a/src/lib/riw/app/translate/__tests__/__snapshots__/findTranslations.test.js.snap b/src/lib/riw/app/translate/__tests__/__snapshots__/findTranslations.test.js.snap new file mode 100644 index 0000000..951d45a --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/__snapshots__/findTranslations.test.js.snap @@ -0,0 +1,157 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/translate/findTranslations 01 nothing gets nothing 1`] = ` +Object { + "locale": Object {}, + "todos": Array [], +} +`; + +exports[`lib/riw/app/translate/findTranslations 02 no db: md misses 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a", + }, + }, + "todos": Array [ + Object { + "defaultMessage": "a", + "file": "/a.js", + "id": "md1", + "locale": "en-up", + }, + ], +} +`; + +exports[`lib/riw/app/translate/findTranslations 03 db missing target locale: md ignored 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a", + }, + }, + "todos": Array [], +} +`; + +exports[`lib/riw/app/translate/findTranslations 04 db has missing defaultMessage: md misses 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a", + }, + }, + "todos": Array [ + Object { + "defaultMessage": "a", + "description": "a desc", + "file": "/a.js", + "id": "md1", + "locale": "en-up", + }, + ], +} +`; + +exports[`lib/riw/app/translate/findTranslations 05 db has missing defined description: md misses 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a", + }, + }, + "todos": Array [ + Object { + "defaultMessage": "a", + "description": "a desc", + "file": "/a.js", + "id": "md1", + "locale": "en-up", + }, + ], +} +`; + +exports[`lib/riw/app/translate/findTranslations 06 db has missing locale: md misses 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a", + }, + }, + "todos": Array [ + Object { + "defaultMessage": "a", + "description": "a desc", + "file": "/a.js", + "id": "md1", + "locale": "en-up", + }, + ], +} +`; + +exports[`lib/riw/app/translate/findTranslations 07 simple match works 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a", + }, + "en-up": Object { + "md1": "A", + }, + }, + "todos": Array [], +} +`; + +exports[`lib/riw/app/translate/findTranslations 08 no description with default works 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a", + }, + "en-up": Object { + "md1": "A", + }, + }, + "todos": Array [], +} +`; + +exports[`lib/riw/app/translate/findTranslations 09 simple multi 1`] = ` +Object { + "locale": Object { + "en-aa": Object { + "md1": "a1", + "md2": "c1", + "md3": "a1", + }, + "en-ne": Object { + "md1": "1A", + }, + "en-up": Object { + "md1": "A1", + "md2": "C1", + "md3": "A1 DESC", + }, + }, + "todos": Array [ + Object { + "defaultMessage": "c1", + "file": "/c.js", + "id": "md2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "a1", + "description": "a1 desc", + "file": "/a.js", + "id": "md3", + "locale": "en-ne", + }, + ], +} +`; diff --git a/src/lib/riw/app/translate/__tests__/__snapshots__/index.test.js.snap b/src/lib/riw/app/translate/__tests__/__snapshots__/index.test.js.snap new file mode 100644 index 0000000..74ef95c --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/__snapshots__/index.test.js.snap @@ -0,0 +1,482 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/app/translate 01 1`] = ` +Object { + "armd": Array [], + "dups": Array [], + "translation": Object { + "locale": Object {}, + "todos": Array [], + }, +} +`; + +exports[`lib/riw/app/translate 01 2`] = ` +Array [ + "en-ne.json", + "en-up.json", + "en-us.json", + "todo.json", +] +`; + +exports[`lib/riw/app/translate 01 3`] = ` +Array [ + Object {}, + Object {}, + Object {}, + Array [], +] +`; + +exports[`lib/riw/app/translate 02 1`] = ` +Object { + "armd": Array [], + "dups": Array [], + "translation": Object { + "locale": Object {}, + "todos": Array [], + }, +} +`; + +exports[`lib/riw/app/translate 02 2`] = ` +Array [ + "en-ne.json", + "en-up.json", + "en-us.json", + "todo.json", +] +`; + +exports[`lib/riw/app/translate 02 3`] = ` +Array [ + Object {}, + Object {}, + Object {}, + Array [], +] +`; + +exports[`lib/riw/app/translate 03 1`] = ` +Object { + "armd": Array [ + Object { + "defaultMessage": "a.1!", + "description": undefined, + "file": "/fixtures/dir/a.js", + "id": "a.1", + }, + Object { + "defaultMessage": "a.1 again!", + "description": undefined, + "file": "/fixtures/dir/aa.js", + "id": "a.1", + }, + Object { + "defaultMessage": "b.1!", + "description": undefined, + "file": "/fixtures/dir/b.js", + "id": "b.1", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.js", + "id": "b.2", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.js", + "id": "b.2", + }, + Object { + "defaultMessage": "c.1!", + "description": undefined, + "file": "/fixtures/dir/c.js", + "id": "c.1", + }, + ], + "dups": Array [ + Object { + "arfabs": Array [ + "/fixtures/dir/a.js", + "/fixtures/dir/aa.js", + ], + "id": "a.1", + }, + Object { + "arfabs": Array [ + "/fixtures/dir/b.js", + "/fixtures/dir/bb.js", + ], + "id": "b.2", + }, + ], + "translation": Object { + "locale": Object { + "en-ne": Object { + "a.1": "!1.a", + "b.1": "!1.b", + }, + "en-up": Object { + "a.1": "A.1!", + "b.2": "B.2!", + }, + "en-us": Object { + "a.1": "a.1 again!", + "b.1": "b.1!", + "b.2": "b.2 again!", + "c.1": "c.1!", + }, + }, + "todos": Array [ + Object { + "defaultMessage": "a.1 again!", + "description": undefined, + "file": "/fixtures/dir/aa.js", + "id": "a.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "a.1 again!", + "description": undefined, + "file": "/fixtures/dir/aa.js", + "id": "a.1", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.1!", + "description": undefined, + "file": "/fixtures/dir/b.js", + "id": "b.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.js", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.js", + "id": "b.2", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.js", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "c.1!", + "description": undefined, + "file": "/fixtures/dir/c.js", + "id": "c.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "c.1!", + "description": undefined, + "file": "/fixtures/dir/c.js", + "id": "c.1", + "locale": "en-ne", + }, + ], + }, +} +`; + +exports[`lib/riw/app/translate 03 2`] = ` +Array [ + "en-ne.json", + "en-up.json", + "en-us.json", + "todo.json", +] +`; + +exports[`lib/riw/app/translate 03 3`] = ` +Array [ + Object { + "a.1": "!1.a", + "b.1": "!1.b", + }, + Object { + "a.1": "A.1!", + "b.2": "B.2!", + }, + Object { + "a.1": "a.1 again!", + "b.1": "b.1!", + "b.2": "b.2 again!", + "c.1": "c.1!", + }, + Array [ + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.js", + "id": "a.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.js", + "id": "a.1", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.1!", + "file": "/fixtures/dir/b.js", + "id": "b.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.js", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.js", + "id": "b.2", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.js", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.js", + "id": "c.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.js", + "id": "c.1", + "locale": "en-ne", + }, + ], +] +`; + +exports[`lib/riw/app/translate 04 1`] = ` +Object { + "armd": Array [ + Object { + "defaultMessage": "a.1!", + "file": "/fixtures/dir/a.json", + "id": "a.1", + }, + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.json", + "id": "a.1", + }, + Object { + "defaultMessage": "b.1!", + "file": "/fixtures/dir/b.json", + "id": "b.1", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.json", + "id": "b.2", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.json", + "id": "b.2", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.json", + "id": "c.1", + }, + ], + "dups": Array [ + Object { + "arfabs": Array [ + "/fixtures/dir/a.json", + "/fixtures/dir/aa.json", + ], + "id": "a.1", + }, + Object { + "arfabs": Array [ + "/fixtures/dir/b.json", + "/fixtures/dir/bb.json", + ], + "id": "b.2", + }, + ], + "translation": Object { + "locale": Object { + "en-ne": Object { + "a.1": "!1.a", + "b.1": "!1.b", + }, + "en-up": Object { + "a.1": "A.1!", + "b.2": "B.2!", + }, + "en-us": Object { + "a.1": "a.1 again!", + "b.1": "b.1!", + "b.2": "b.2 again!", + "c.1": "c.1!", + }, + }, + "todos": Array [ + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.json", + "id": "a.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.json", + "id": "a.1", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.1!", + "file": "/fixtures/dir/b.json", + "id": "b.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.json", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.json", + "id": "b.2", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.json", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.json", + "id": "c.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.json", + "id": "c.1", + "locale": "en-ne", + }, + ], + }, +} +`; + +exports[`lib/riw/app/translate 04 2`] = ` +Array [ + "en-ne.json", + "en-up.json", + "en-us.json", + "todo.json", +] +`; + +exports[`lib/riw/app/translate 04 3`] = ` +Array [ + Object { + "a.1": "!1.a", + "b.1": "!1.b", + }, + Object { + "a.1": "A.1!", + "b.2": "B.2!", + }, + Object { + "a.1": "a.1 again!", + "b.1": "b.1!", + "b.2": "b.2 again!", + "c.1": "c.1!", + }, + Array [ + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.json", + "id": "a.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "a.1 again!", + "file": "/fixtures/dir/aa.json", + "id": "a.1", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.1!", + "file": "/fixtures/dir/b.json", + "id": "b.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2!", + "description": "b.2 desc", + "file": "/fixtures/dir/b.json", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.json", + "id": "b.2", + "locale": "en-up", + }, + Object { + "defaultMessage": "b.2 again!", + "description": "b.2 again desc", + "file": "/fixtures/dir/bb.json", + "id": "b.2", + "locale": "en-ne", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.json", + "id": "c.1", + "locale": "en-up", + }, + Object { + "defaultMessage": "c.1!", + "file": "/fixtures/dir/c.json", + "id": "c.1", + "locale": "en-ne", + }, + ], +] +`; diff --git a/src/lib/riw/app/translate/__tests__/extract.json.test.js b/src/lib/riw/app/translate/__tests__/extract.json.test.js new file mode 100644 index 0000000..c48bbd2 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/extract.json.test.js @@ -0,0 +1,174 @@ +// @flow + +import path from 'path'; + +import mock from 'mock-fs'; +import outdent from 'outdent'; + +import type { ConfigSparse, ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import { armdExtractJSON } from '../extract'; + +const cfgBase: ConfigSparseWithSource = { + rootDir: '/fixtures', + sourceDirs: ['dir/**/*.js'], +}; + +const notify = () => x => x; + +type Fixture = { + name: string, + in: { [key: string]: string }, + configOverride?: ConfigSparse, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: {}, // empty dir + }, + + { + name: '02', + in: { + 'a.json': '[]', + 'b.json': '[]', + }, + }, + + { + name: '03', + in: { + 'a.json': outdent` + [ + { + "id": "a.1", + "defaultMessage": "a.1!" + } + ] + `, + 'aa.json': outdent` + [ + { + "id": "a.1", + "defaultMessage": "a.1 again!" + } + ] + `, + 'b.json': outdent` + [ + { + "id": "b.1", + "defaultMessage": "b.1!" + }, + { + "id": "b.2", + "description": "b.2 desc", + "defaultMessage": "b.2!" + } + ] + `, + 'bb.json': outdent` + [ + { + "id": "b.2", + "description": "b.2 again desc", + "defaultMessage": "b.2 again!" + } + ] + `, + 'c.json': outdent` + [ + { + "id": "c.1", + "defaultMessage": "c.1!" + } + ] + `, + }, + configOverride: { + collateDir: 'dir', + inputMode: 'json', + }, + }, + + { + name: '04', + in: { + 'a.json': outdent` + [ + { + "id": "a.1", + "defaultMessage": "a.1!" + } + ] + `, + 'aa.json': outdent` + [ + { + "id": "a.1", + "defaultMessage": "a.1 again!" + } + ] + `, + 'b.json': outdent` + [ + { + "id": "b.1", + "defaultMessage": "b.1!" + }, + { + "id": "b.2", + "description": "b.2 desc", + "defaultMessage": "b.2!" + } + ] + `, + 'bb.json': outdent` + [ + { + "id": "b.2", + "description": "b.2 again desc", + "defaultMessage": "b.2 again!" + } + ] + `, + 'c.json': outdent` + [ + { + "id": "c.1", + "defaultMessage": "c.1!" + } + ] + `, + }, + configOverride: { + collateDir: path.resolve('/fixtures', 'dir'), + inputMode: 'json', + }, + }, +]; + +describe('lib/riw/app/translate/extract.json', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + '/fixtures': { + dir: fixture.in, + }, + }); + + const cfg = configResolve({ + ...cfgBase, + ...fixture.configOverride, + }); + + const received = armdExtractJSON(notify)(cfg); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/translate/__tests__/extract.source.test.js b/src/lib/riw/app/translate/__tests__/extract.source.test.js new file mode 100644 index 0000000..0103d04 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/extract.source.test.js @@ -0,0 +1,148 @@ +// @flow + +import mock from 'mock-fs'; +import outdent from 'outdent'; + +import type { ConfigSparse } from '../../../../config'; +import { configResolve } from '../../../../config'; + +import { armdExtractSource } from '../extract'; + +const notify = () => x => x; + +type Fixture = { + name: string, + in: { [key: string]: string }, + configOverride?: ConfigSparse, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: {}, // empty dir + }, + + { + name: '02', + in: { + 'a.js': 'export default a => a;', + 'b.js': 'export default b => b + 1;', + }, + }, + + { + name: '03', + in: { + 'a.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + a1: { + id: 'a.1', + defaultMessage: 'a.1!', + }, + }); + `, + 'b.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + b1: { + id: 'b.1', + defaultMessage: 'b.1!', + }, + b2: { + id: 'b.2', + description: 'b.2 desc', + defaultMessage: 'b.2!', + }, + }); + `, + }, + }, + + { + name: '04', + in: { + 'a.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + a1: { + id: 'a.1', + defaultMessage: 'a.1!', + }, + }); + `, + 'aa.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + a1again: { + id: 'a.1', + defaultMessage: 'a.1 again!', + }, + }); + `, + 'b.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + b1: { + id: 'b.1', + defaultMessage: 'b.1!', + }, + b2: { + id: 'b.2', + description: 'b.2 desc', + defaultMessage: 'b.2!', + }, + }); + `, + 'bb.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + b2again: { + id: 'b.2', + description: 'b.2 again desc', + defaultMessage: 'b.2 again!', + }, + }); + `, + 'c.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + c1: { + id: 'c.1', + defaultMessage: 'c.1!', + }, + }); + `, + }, + }, +]; + +describe('lib/riw/app/translate/extract.source', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + '/fixtures': { + [fixture.name]: fixture.in, + }, + }); + + const cfg = configResolve({ + sourceDirs: [`/fixtures/${fixture.name}/**/*.js`], + ...fixture.configOverride, + }); + + const received = armdExtractSource(notify)(cfg); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/translate/__tests__/findDuplicateIds.test.js b/src/lib/riw/app/translate/__tests__/findDuplicateIds.test.js new file mode 100644 index 0000000..e4736e5 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/findDuplicateIds.test.js @@ -0,0 +1,95 @@ +// @flow + +import type { MessageDescriptorWithFile } from '../../../../../types'; +import findDuplicateIds from '../findDuplicateIds'; + +const notify = () => x => x; + +type Fixture = { + name: string, + in: MessageDescriptorWithFile[], +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: [], + }, + + { + name: '02', + in: [ + { + id: 'a.1', + defaultMessage: 'a.1!', + file: 'a', + }, + { + id: 'b.1', + defaultMessage: 'b.1!', + file: 'b', + }, + { + id: 'b.2', + description: 'b.2 desc', + defaultMessage: 'b.2!', + file: 'b', + }, + ], + }, + + { + name: '03', + in: [ + { + id: 'a.1', + defaultMessage: 'a.1!', + file: 'a', + }, + { + id: 'a.1', + defaultMessage: 'a.1 again!', + file: 'aa', + }, + { + id: 'b.1', + defaultMessage: 'b.1!', + file: 'b', + }, + { + id: 'b.2', + description: 'b.2 desc', + defaultMessage: 'b.2!', + file: 'b', + }, + { + id: 'b.2', + description: 'b.2 again desc', + defaultMessage: 'b.2 again!', + file: 'bb', + }, + { + id: 'b.2', + description: 'b.2 again again desc', + defaultMessage: 'b.2 again again!', + file: 'bbb', + }, + { + id: 'c.1', + defaultMessage: 'c.1!', + file: 'c', + }, + ], + }, +]; + +describe('lib/riw/app/translate/findDuplicateIds', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + + const received = findDuplicateIds(notify)(fixture.in); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/translate/__tests__/findTranslations.test.js b/src/lib/riw/app/translate/__tests__/findTranslations.test.js new file mode 100644 index 0000000..d6ece2b --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/findTranslations.test.js @@ -0,0 +1,275 @@ +// @flow + +import type { MessageDescriptorWithFile } from '../../../../../types'; +import type { ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; +import type { TranslationsDB } from '../../../db'; + +import findTranslations from '../findTranslations'; + +const notify = () => x => x; + +type Fixture = { + name: string, + db: TranslationsDB, + armd: MessageDescriptorWithFile[], + configOverride: ConfigSparseWithSource, +}; + +const fixtures: Fixture[] = [ + { + name: '01 nothing gets nothing', + db: { + version: 1, + data: { + }, + }, + armd: [], + configOverride: { + defaultLocale: 'en-aa', + }, + }, + + { + name: '02 no db: md misses', + db: { + version: 1, + data: { + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + targetLocales: ['en-up'], + }, + }, + + { + name: '03 db missing target locale: md ignored', + db: { + version: 1, + data: { + 'a': { + '_': { + 'en-up': 'A', + }, + }, + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + }, + }, + + { + name: '04 db has missing defaultMessage: md misses', + db: { + version: 1, + data: { + 'NOT': { + 'a desc': { + 'en-up': 'A', + }, + }, + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a', + description: 'a desc', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + targetLocales: ['en-up'], + }, + }, + + { + name: '05 db has missing defined description: md misses', + db: { + version: 1, + data: { + 'a': { + '_': { + 'en-up': 'A', + }, + 'NOT': { + 'en-up': 'A NOT', + }, + }, + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a', + description: 'a desc', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + targetLocales: ['en-up'], + }, + }, + + { + name: '06 db has missing locale: md misses', + db: { + version: 1, + data: { + 'a': { + 'a desc': { + 'en-zz': 'zz A', + }, + }, + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a', + description: 'a desc', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + targetLocales: ['en-up'], + }, + }, + + { + name: '07 simple match works', + db: { + version: 1, + data: { + 'a': { + 'a desc': { + 'en-up': 'A', + }, + }, + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a', + description: 'a desc', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + targetLocales: ['en-up'], + }, + }, + + { + name: '08 no description with default works', + db: { + version: 1, + data: { + 'a': { + '_': { + 'en-up': 'A', + }, + }, + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + targetLocales: ['en-up'], + }, + }, + + { + name: '09 simple multi', + db: { + version: 1, + data: { + 'a1': { + '_': { + 'en-up': 'A1', + 'en-ne': '1A', + }, + 'a1 desc': { + 'en-up': 'A1 DESC', + }, + }, + 'b1': { + '_': { + 'en-up': 'B1', + 'en-ne': '1B', + }, + }, + 'c1': { + '_': { + 'en-up': 'C1', + 'en-zz': 'zz C1', + }, + 'NOT': { + 'en-up': 'C1 NOT', + }, + }, + }, + }, + armd: [ + { + id: 'md1', + defaultMessage: 'a1', + file: '/a.js', + }, + { + id: 'md2', + defaultMessage: 'c1', + file: '/c.js', + }, + { + id: 'md3', + defaultMessage: 'a1', + description: 'a1 desc', + file: '/a.js', + }, + ], + configOverride: { + defaultLocale: 'en-aa', + targetLocales: ['en-up', 'en-ne'], + }, + }, +]; + +describe('lib/riw/app/translate/findTranslations', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const cfg = configResolve(fixture.configOverride); + + const received = findTranslations(cfg, notify, fixture.db)(fixture.armd); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/translate/__tests__/index.test.js b/src/lib/riw/app/translate/__tests__/index.test.js new file mode 100644 index 0000000..0a10b02 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/index.test.js @@ -0,0 +1,216 @@ +// @flow + +import fs from 'fs'; + +import mock from 'mock-fs'; +import outdent from 'outdent'; + +import type { ConfigSparse, ConfigSparseWithSource } from '../../../../config'; +import { configResolve } from '../../../../config'; +import type { TranslationsDB } from '../../../db'; + +import translate from '../'; + +const stringify = obj => JSON.stringify(obj, null, 4); +const parse = frel => JSON.parse(fs.readFileSync(frel).toString()); + +const db: TranslationsDB = { + version: 1, + data: { + 'a.1!': { + '_': { + 'en-up': 'A.1!', + 'en-ne': '!1.a', + }, + }, + 'b.1!': { + '_': { + 'en-ne': '!1.b', + }, + }, + 'b.2!': { + 'b.2 desc': { + 'en-up': 'B.2!', + }, + }, + }, +}; + +const cfgBase: ConfigSparseWithSource = { + rootDir: '/fixtures', + defaultLocale: 'en-us', + targetLocales: ['en-up', 'en-ne'], + translationsDatabaseFile: 'db.json', + sourceDirs: ['dir/**/*.js'], + translationsOutputFile: 'locale/[locale].json', + outputMode: 'file-per-locale', + todoFile: 'locale/todo.json', +}; + +type Fixture = { + name: string, + in: { [key: string]: string }, + configOverride?: ConfigSparse, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: {}, // empty + }, + + { + name: '02', + in: { + 'a.js': 'export default a => a;', + 'b.js': 'export default b => b + 1;', + }, + }, + + { + name: '03', + in: { + 'a.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + a1: { + id: 'a.1', + defaultMessage: 'a.1!', + }, + }); + `, + 'aa.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + a1again: { + id: 'a.1', + defaultMessage: 'a.1 again!', + }, + }); + `, + 'b.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + b1: { + id: 'b.1', + defaultMessage: 'b.1!', + }, + b2: { + id: 'b.2', + description: 'b.2 desc', + defaultMessage: 'b.2!', + }, + }); + `, + 'bb.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + b2again: { + id: 'b.2', + description: 'b.2 again desc', + defaultMessage: 'b.2 again!', + }, + }); + `, + 'c.js': outdent` + import { defineMessages } from 'react-intl'; + + const msg = defineMessages({ + c1: { + id: 'c.1', + defaultMessage: 'c.1!', + }, + }); + `, + }, + }, + + { + name: '04', + in: { + 'a.json': outdent` + [ + { + "id": "a.1", + "defaultMessage": "a.1!" + } + ] + `, + 'aa.json': outdent` + [ + { + "id": "a.1", + "defaultMessage": "a.1 again!" + } + ] + `, + 'b.json': outdent` + [ + { + "id": "b.1", + "defaultMessage": "b.1!" + }, + { + "id": "b.2", + "description": "b.2 desc", + "defaultMessage": "b.2!" + } + ] + `, + 'bb.json': outdent` + [ + { + "id": "b.2", + "description": "b.2 again desc", + "defaultMessage": "b.2 again!" + } + ] + `, + 'c.json': outdent` + [ + { + "id": "c.1", + "defaultMessage": "c.1!" + } + ] + `, + }, + configOverride: { + collateDir: 'dir', + inputMode: 'json', + }, + }, +]; + +describe('lib/riw/app/translate', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + '/fixtures': { + 'dir': fixture.in, + 'db.json': stringify(db), + 'locale': {}, + }, + }); + + const cfg = configResolve({ + ...cfgBase, + ...fixture.configOverride, + }); + + const received = translate(cfg)({}); + const arfrel = fs.readdirSync('/fixtures/locale'); + const contents = arfrel.map(frel => parse(`/fixtures/locale/${frel}`)); + + mock.restore(); + + expect(received).toMatchSnapshot(); + expect(arfrel).toMatchSnapshot(); + expect(contents).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/app/translate/__tests__/writeTodo.test.js b/src/lib/riw/app/translate/__tests__/writeTodo.test.js new file mode 100644 index 0000000..cb14947 --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/writeTodo.test.js @@ -0,0 +1,207 @@ +// @flow + +import fs from 'fs'; + +import mock from 'mock-fs'; + +import type { TranslationLookupResult } from '../findTranslations'; +import { configResolve } from '../../../../config'; + +import writeTodo from '../writeTodo'; + +const parse = frel => JSON.parse(fs.readFileSync(frel).toString()); +const notify = () => x => x; + +describe('lib/riw/app/translate/writeTodo', () => { + afterEach(() => { + mock.restore(); + }); + + it('01 throws if it cannot create the parent directory', () => { + const translation: TranslationLookupResult = { + locale: {}, + todos: [], + }; + const cfg = configResolve({ + outputMode: 'file-per-locale', + todoFile: 'fixtures/dir/foobar/md-todo.json', + }); + + mock({ + fixtures: { + 'dir': mock.directory({ + mode: 0o555, // cannot write + items: {}, + }), + }, + }); + + expect(() => { + writeTodo(cfg, notify)(translation); + }).toThrowError('EACCES'); + }); + + it('02 writes a file, if configured as file-per-locale', () => { + const translation: TranslationLookupResult = { + locale: {}, + todos: [ + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'bb-bb' }, + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'cc-cc' }, + { id: 's.2', defaultMessage: 'aa-aa s.2', description: 's.2 desc', locale: 'cc-cc' }, + ], + }; + + const cfg = configResolve({ + outputMode: 'file-per-locale', + todoFile: 'fixtures/dir/md-todo.json', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + expect(() => { + writeTodo(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual(['md-todo.json']); + + expect(parse('fixtures/dir/md-todo.json')).toEqual(translation.todos); + }); + + it('03 writes a file, if configured as single-file', () => { + const translation: TranslationLookupResult = { + locale: {}, + todos: [ + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'bb-bb' }, + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'cc-cc' }, + { id: 's.2', defaultMessage: 'aa-aa s.2', description: 's.2 desc', locale: 'cc-cc' }, + ], + }; + + const cfg = configResolve({ + outputMode: 'single-file', + todoFile: 'fixtures/dir/md-todo.json', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + expect(() => { + writeTodo(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual(['md-todo.json']); + + expect(parse('fixtures/dir/md-todo.json')).toEqual(translation.todos); + }); + + it('04 writes no file if configured as no-file', () => { + const translation: TranslationLookupResult = { + locale: { + 'aa-aa': { + 's.1': 'aa-aa s.1', + 's.2': 'aa-aa s.2', + }, + 'bb-bb': { + 's.1': 'bb-bb s.1', + 's.2': 'bb-bb s.2', + }, + 'cc-cc': { + 's.1': 'cc-cc s.1', + 's.2': 'cc-cc s.2', + }, + }, + todos: [], + }; + + const cfg = configResolve({ + outputMode: 'no-file', + todoFile: 'fixtures/dir/md-todo.json', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + expect(() => { + writeTodo(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual([]); + }); + + it('05 overwrites existing file', () => { + const translation: TranslationLookupResult = { + locale: {}, + todos: [ + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'bb-bb' }, + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'cc-cc' }, + { id: 's.2', defaultMessage: 'aa-aa s.2', description: 's.2 desc', locale: 'cc-cc' }, + ], + }; + + const cfg = configResolve({ + outputMode: 'single-file', + todoFile: 'fixtures/dir/md-todo.json', + }); + + mock({ + fixtures: { + 'dir': { + 'md-todo.json': 'OLD', + }, + }, + }); + + expect(() => { + writeTodo(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual(['md-todo.json']); + + expect(parse('fixtures/dir/md-todo.json')).toEqual(translation.todos); + }); + + it('06 returns its input', () => { + const translation: TranslationLookupResult = { + locale: {}, + todos: [ + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'bb-bb' }, + { id: 's.1', defaultMessage: 'aa-aa s.1', description: 's.1 desc', locale: 'cc-cc' }, + { id: 's.2', defaultMessage: 'aa-aa s.2', description: 's.2 desc', locale: 'cc-cc' }, + ], + }; + + const cfg = configResolve({ + outputMode: 'single-file', + todoFile: 'fixtures/dir/md-todo.json', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + const received = writeTodo(cfg, notify)(translation); + + expect(received).toEqual(translation); + }); + +}); diff --git a/src/lib/riw/app/translate/__tests__/writeTranslations.test.js b/src/lib/riw/app/translate/__tests__/writeTranslations.test.js new file mode 100644 index 0000000..c11bd6e --- /dev/null +++ b/src/lib/riw/app/translate/__tests__/writeTranslations.test.js @@ -0,0 +1,286 @@ +// @flow + +import fs from 'fs'; + +import mock from 'mock-fs'; + +import type { TranslationLookupResult } from '../findTranslations'; +import { configResolve } from '../../../../config'; + +import writeTranslations from '../writeTranslations'; + +const parse = frel => JSON.parse(fs.readFileSync(frel).toString()); +const notify = () => x => x; + +describe('lib/riw/app/translate/writeTranslations', () => { + afterEach(() => { + mock.restore(); + }); + + it('01 throws if config missing placeholder', () => { + const translation: TranslationLookupResult = { + locale: {}, + todos: [], + }; + const cfg = configResolve({ + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb'], + translationsOutputFile: '/no/placeholder/here', + outputMode: 'file-per-locale', + }); + + expect(() => { + writeTranslations(cfg, notify)(translation); + }).toThrowError('translationsOutputFile'); + }); + + it('02 throws if it cannot create the parent directory', () => { + const translation: TranslationLookupResult = { + locale: {}, + todos: [], + }; + const cfg = configResolve({ + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb'], + translationsOutputFile: 'fixtures/dir/foobar/[locale].json', + outputMode: 'file-per-locale', + }); + + mock({ + fixtures: { + 'dir': mock.directory({ + mode: 0o555, // cannot write + items: {}, + }), + }, + }); + + expect(() => { + writeTranslations(cfg, notify)(translation); + }).toThrowError('EACCES'); + }); + + it('03 writes a file for each target locale, including default, if so configured', () => { + const translation: TranslationLookupResult = { + locale: { + 'aa-aa': { + 's.1': 'aa-aa s.1', + 's.2': 'aa-aa s.2', + }, + 'bb-bb': { + 's.1': 'bb-bb s.1', + 's.2': 'bb-bb s.2', + }, + 'cc-cc': { + 's.1': 'cc-cc s.1', + 's.2': 'cc-cc s.2', + }, + }, + todos: [], + }; + + const cfg = configResolve({ + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc', 'xx-xx'], + translationsOutputFile: 'fixtures/dir/s-[locale].json', + outputMode: 'file-per-locale', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + expect(() => { + writeTranslations(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual(['s-aa-aa.json', 's-bb-bb.json', 's-cc-cc.json', 's-xx-xx.json']); + + expect(parse('fixtures/dir/s-aa-aa.json')).toEqual(translation.locale['aa-aa']); + expect(parse('fixtures/dir/s-bb-bb.json')).toEqual(translation.locale['bb-bb']); + expect(parse('fixtures/dir/s-cc-cc.json')).toEqual(translation.locale['cc-cc']); + expect(parse('fixtures/dir/s-xx-xx.json')).toEqual({}); + }); + + it('04 writes a single file for all target locales, including default, if so configured', () => { + const translation: TranslationLookupResult = { + locale: { + 'aa-aa': { + 's.1': 'aa-aa s.1', + 's.2': 'aa-aa s.2', + }, + 'bb-bb': { + 's.1': 'bb-bb s.1', + 's.2': 'bb-bb s.2', + }, + 'cc-cc': { + 's.1': 'cc-cc s.1', + 's.2': 'cc-cc s.2', + }, + }, + todos: [], + }; + + const cfg = configResolve({ + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc', 'xx-xx'], + translationsOutputFile: 'fixtures/dir/s-[locale].json', + outputMode: 'single-file', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + expect(() => { + writeTranslations(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual(['s-locales.json']); + + const localeRebuilt = JSON.parse(fs.readFileSync('fixtures/dir/s-locales.json').toString()); + + expect(localeRebuilt).toEqual({ + ...translation.locale, + 'xx-xx': {}, + }); + }); + + it('05 writes no files if so configured', () => { + const translation: TranslationLookupResult = { + locale: { + 'aa-aa': { + 's.1': 'aa-aa s.1', + 's.2': 'aa-aa s.2', + }, + 'bb-bb': { + 's.1': 'bb-bb s.1', + 's.2': 'bb-bb s.2', + }, + 'cc-cc': { + 's.1': 'cc-cc s.1', + 's.2': 'cc-cc s.2', + }, + }, + todos: [], + }; + + const cfg = configResolve({ + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc', 'xx-xx'], + translationsOutputFile: 'fixtures/dir/[locale].json', + outputMode: 'no-file', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + expect(() => { + writeTranslations(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual([]); + }); + + it('06 overwrites existing files', () => { + const translation: TranslationLookupResult = { + locale: { + 'aa-aa': { + 's.1': 'aa-aa s.1', + 's.2': 'aa-aa s.2', + }, + 'bb-bb': { + 's.1': 'bb-bb s.1', + 's.2': 'bb-bb s.2', + }, + 'cc-cc': { + 's.1': 'cc-cc s.1', + 's.2': 'cc-cc s.2', + }, + }, + todos: [], + }; + + const cfg = configResolve({ + defaultLocale: 'aa-aa', + targetLocales: ['bb-bb', 'cc-cc', 'xx-xx'], + translationsOutputFile: 'fixtures/dir/s-[locale].json', + outputMode: 'file-per-locale', + }); + + mock({ + fixtures: { + 'dir': { + 's-aa-aa.json': 'OLD', + 's-bb-bb.json': 'OLD', + 'another': 'foo', + }, + }, + }); + + expect(() => { + writeTranslations(cfg, notify)(translation); + }).not.toThrow(); + + const arfrel = fs.readdirSync('fixtures/dir'); + + expect(arfrel).toEqual(['another', 's-aa-aa.json', 's-bb-bb.json', 's-cc-cc.json', 's-xx-xx.json']); + + expect(parse('fixtures/dir/s-aa-aa.json')).toEqual(translation.locale['aa-aa']); + expect(parse('fixtures/dir/s-bb-bb.json')).toEqual(translation.locale['bb-bb']); + expect(parse('fixtures/dir/s-cc-cc.json')).toEqual(translation.locale['cc-cc']); + expect(parse('fixtures/dir/s-xx-xx.json')).toEqual({}); + + expect(fs.readFileSync('fixtures/dir/another').toString()).toEqual('foo'); + }); + + it('07 returns its input', () => { + const translation: TranslationLookupResult = { + locale: { + 'aa-aa': { + 's.1': 'aa-aa s.1', + 's.2': 'aa-aa s.2', + }, + 'bb-bb': { + 's.1': 'bb-bb s.1', + 's.2': 'bb-bb s.2', + }, + 'cc-cc': { + 's.1': 'cc-cc s.1', + 's.2': 'cc-cc s.2', + }, + }, + todos: [], + }; + + const cfg = configResolve({ + defaultLocale: 'aa-aa', + translationsOutputFile: 'fixtures/dir/s-[locale].json', + outputMode: 'file-per-locale', + }); + + mock({ + fixtures: { + 'dir': {}, // empty dir + }, + }); + + const received = writeTranslations(cfg, notify)(translation); + + expect(received).toEqual(translation); + }); + +}); diff --git a/src/lib/riw/app/translate/armdFromJSONFabs.js b/src/lib/riw/app/translate/armdFromJSONFabs.js new file mode 100644 index 0000000..a17a210 --- /dev/null +++ b/src/lib/riw/app/translate/armdFromJSONFabs.js @@ -0,0 +1,14 @@ +// @flow + +import fs from 'fs'; + +import compose from 'ramda/src/compose'; + +import type { MessageDescriptorsFromFile } from './extract'; + +const armdFromJSONFabs: MessageDescriptorsFromFile = compose( + JSON.parse, + fs.readFileSync, +); + +export default armdFromJSONFabs; diff --git a/src/lib/riw/app/translate/armdFromSourceFabs.js b/src/lib/riw/app/translate/armdFromSourceFabs.js new file mode 100644 index 0000000..e3ba60c --- /dev/null +++ b/src/lib/riw/app/translate/armdFromSourceFabs.js @@ -0,0 +1,31 @@ +// @flow + +import { transformFileSync, type babel } from 'babel-core'; +import pluginReactIntl from 'babel-plugin-react-intl'; +import pathOr from 'ramda/src/pathOr'; +import compose from 'ramda/src/compose'; + +import type { AbsolutePath } from '../../../../types'; +import log from '../../../log'; + +import type { MessageDescriptorsFromFile } from './extract'; + + +const outputBabelFromFabs = (fabs: AbsolutePath): babel.BabelFileResult => { + try { + return transformFileSync(fabs, { + plugins: [pluginReactIntl], + }); + + } catch (err) { + log.error(err); + throw err; + } +}; + +const armdFromFabs: MessageDescriptorsFromFile = compose( + pathOr([], ['metadata', 'react-intl', 'messages']), + outputBabelFromFabs, +); + +export default armdFromFabs; diff --git a/src/lib/riw/app/translate/extract.js b/src/lib/riw/app/translate/extract.js new file mode 100644 index 0000000..6916c8a --- /dev/null +++ b/src/lib/riw/app/translate/extract.js @@ -0,0 +1,41 @@ +// @flow + +import chain from 'ramda/src/chain'; +import compose from 'ramda/src/compose'; +import map from 'ramda/src/map'; +import prop from 'ramda/src/prop'; + +import type { MessageDescriptor, AbsolutePath, MessageDescriptorWithFile } from '../../../../types'; +import type { Config } from '../../../config'; +import type { FilesFromConfig } from '../../../config-helper'; +import type { Notifier } from '../../../notify'; +import { arfabsInputJSON, arfabsInputSource } from '../../../config-helper'; + +import armdFromJSONFabs from './armdFromJSONFabs'; +import armdfromSourceFabs from './armdFromSourceFabs'; + +export type MessageDescriptorsFromFile = (fabs: AbsolutePath) => MessageDescriptor[]; + +type MDExtractor = (arfabsFromConfig: FilesFromConfig, armdFromFabs: MessageDescriptorsFromFile) => + (notify: Notifier) => (config: Config) => MessageDescriptorWithFile[]; + +const armdExtract: MDExtractor = (arfabsFromConfig, armdFromFabs) => notify => compose( + notify('endExtract'), + chain(prop('armd')), + map(compose( + notify('endExtractFile'), + fabs => ({ + fabs, + armd: map( + md => ({ ...md, file: fabs }: MessageDescriptorWithFile), + armdFromFabs(fabs), + ), + }), + notify('startExtractFile'), + )), + notify('startExtract'), + arfabsFromConfig, +); + +export const armdExtractSource = armdExtract(arfabsInputSource, armdfromSourceFabs); +export const armdExtractJSON = armdExtract(arfabsInputJSON, armdFromJSONFabs); diff --git a/src/lib/riw/app/translate/findDuplicateIds.js b/src/lib/riw/app/translate/findDuplicateIds.js new file mode 100644 index 0000000..cbeba6f --- /dev/null +++ b/src/lib/riw/app/translate/findDuplicateIds.js @@ -0,0 +1,35 @@ +// @flow + +import compose from 'ramda/src/compose'; +import map from 'ramda/src/map'; +import reduce from 'ramda/src/reduce'; +import toPairs from 'ramda/src/toPairs'; +import filter from 'ramda/src/filter'; + +import type { MessageId, AbsolutePath, MessageDescriptorWithFile } from '../../../../types'; +import type { Notifier } from '../../../notify'; + +export type DuplicateIdData = {| + id: MessageId, + files: AbsolutePath[], +|}; + +type DuplicateFinder = (notify: Notifier) => (armd: MessageDescriptorWithFile[]) + => DuplicateIdData[]; + +const find: DuplicateFinder = notify => compose( + notify('endDupCheck'), + map(([id, arfabs]) => ({ id, arfabs })), + toPairs, + filter(arfabs => arfabs.length > 1), + reduce( + (arfabsById, md: MessageDescriptorWithFile) => { + arfabsById[md.id] = (arfabsById[md.id] || []).concat(md.file); + return arfabsById; + }, + {}, + ), + notify('startDupCheck'), +); + +export default find; diff --git a/src/lib/riw/app/translate/findTranslations.js b/src/lib/riw/app/translate/findTranslations.js new file mode 100644 index 0000000..b984bbf --- /dev/null +++ b/src/lib/riw/app/translate/findTranslations.js @@ -0,0 +1,95 @@ +// @flow + +import chain from 'ramda/src/chain'; +import compose from 'ramda/src/compose'; +import map from 'ramda/src/map'; +import reduce from 'ramda/src/reduce'; +import pathOr from 'ramda/src/pathOr'; +import assocPath from 'ramda/src/assocPath'; + +import type { + LocaleId, + MessageId, + TranslatedMessage, + MessageDescriptorWithFile, + UntranslatedMessageDescriptor, +} from '../../../../types'; +import type { Config } from '../../../config'; +import type { Notifier } from '../../../notify'; +import type { TranslationsDB } from '../../db'; +import { sDescriptionDefault } from '../../'; + +type LocaleMapper = (config: Config) => (md: MessageDescriptorWithFile) => + UntranslatedMessageDescriptor; + +type Lookup = {| + mdu: UntranslatedMessageDescriptor, + result: TranslatedMessage | null, +|}; + +export type TranslationLookupResult = {| + locale: { + [key: LocaleId]: { + [key: MessageId]: TranslatedMessage, + }, + }, + todos: UntranslatedMessageDescriptor[], +|}; + +type LookerUpper = (config: Config, db: TranslationsDB) => + (mdu: UntranslatedMessageDescriptor) => Lookup; + +type LookupReducer = (acc: TranslationLookupResult, lookup: Lookup) => + TranslationLookupResult; + +type TranslationFinder = ( + config: Config, + notify: Notifier, + db: TranslationsDB +) => (armd: MessageDescriptorWithFile[]) => TranslationLookupResult; + + +const resultEmpty: TranslationLookupResult = { + locale: {}, + todos: [], +}; + +const eachLocale: LocaleMapper = config => md => map( + locale => ({ ...md, locale }), + config.targetLocales.concat(config.defaultLocale), +); + +const includeLookup: LookerUpper = (config, db) => mdu => ({ + mdu, + result: mdu.locale === config.defaultLocale + ? mdu.defaultMessage + : pathOr(null, [ + 'data', + mdu.defaultMessage, + mdu.description || sDescriptionDefault, + mdu.locale, + ], db), +}); + +const reduceLookup: LookupReducer = (acc, lookup) => { + const { mdu, result } = lookup; + + if (result) { + return assocPath(['locale', mdu.locale, mdu.id], result, acc); + } + + return ({ + locale: acc.locale, + todos: acc.todos.concat(mdu), + }: TranslationLookupResult); +}; + +const find: TranslationFinder = (config, notify, db) => compose( + notify('endLookup'), + reduce(reduceLookup, resultEmpty), + map(includeLookup(config, db)), + chain(eachLocale(config)), + notify('startLookup'), +); + +export default find; diff --git a/src/lib/riw/app/translate/index.js b/src/lib/riw/app/translate/index.js new file mode 100644 index 0000000..f98f1af --- /dev/null +++ b/src/lib/riw/app/translate/index.js @@ -0,0 +1,72 @@ +// @flow + +import compose from 'ramda/src/compose'; + +import type { + AbsolutePath, + MessageDescriptorWithFile, +} from '../../../../types'; +import type { Config } from '../../../config'; +import type { Notifier } from '../../../notify'; +import makeNotifier from '../../../notify'; + +import db from '../../db'; + +import type { TranslationLookupResult } from './findTranslations'; +import type { DuplicateIdData } from './findDuplicateIds'; +import { armdExtractSource, armdExtractJSON } from './extract'; +import ardupFind from './findDuplicateIds'; +import findTranslations from './findTranslations'; +import writeTranslations from './writeTranslations'; +import writeTodo from './writeTodo'; + +export type { + TranslationLookupResult, + DuplicateIdData, +}; + +export type AppTranslateResult = { + armd: MessageDescriptorWithFile[], + dups: DuplicateIdData[], + translation: TranslationLookupResult, +}; + +export type AppTranslateSpec = { + on?: { + start?: () => void, + startExtract?: (arfabsSource: AbsolutePath[]) => void, + startExtractFile?: (fabsSource: AbsolutePath) => void, + endExtractFile?: ({ armd: MessageDescriptorWithFile[], fabs: AbsolutePath }) => void, + endExtract?: (MessageDescriptorWithFile[]) => void, + startDupCheck?: (armd: MessageDescriptorWithFile[]) => void, + endDupCheck?: (dups: DuplicateIdData[]) => void, + startLookup?: (armd: MessageDescriptorWithFile[]) => void, + endLookup?: (translation: TranslationLookupResult) => void, + fileSaved?: (fabs: AbsolutePath) => void, + end?: (result: AppTranslateResult) => void, + }, +}; + +type Processor = (config: Config, notify: Notifier) => AppTranslateResult; + +const process: Processor = (config, notify) => compose( + notify('end'), + armd => ({ + armd, + dups: ardupFind(notify)(armd), + translation: compose( + writeTodo(config, notify), + writeTranslations(config, notify), + findTranslations(config, notify, db(config).read()), + )(armd), + }), + { + source: armdExtractSource(notify), + json: armdExtractJSON(notify), + }[config.inputMode], + notify('start'), +)(config); + +export default (config: Config) => + (opt: AppTranslateSpec): AppTranslateResult => + process(config, makeNotifier(opt.on)); diff --git a/src/lib/riw/app/translate/writeTodo.js b/src/lib/riw/app/translate/writeTodo.js new file mode 100644 index 0000000..18a6fc4 --- /dev/null +++ b/src/lib/riw/app/translate/writeTodo.js @@ -0,0 +1,37 @@ +// @flow + +import fs from 'fs'; +import path from 'path'; +import chalk from 'chalk'; + +import mkdirp from 'mkdirp'; + +import type { Config } from '../../../config'; +import log from '../../../log'; + +import type { TranslationLookupResult } from './findTranslations'; + +const stringify = obj => JSON.stringify(obj, null, 4); + +export default (config: Config, notify: string => string => string) => + (translation: TranslationLookupResult) => { + const { todoFile: pathOut, rootDir } = config; + + const fabsOut = path.resolve(rootDir, pathOut); + const dabsOut = path.dirname(fabsOut); + + try { + mkdirp.sync(dabsOut); + + } catch (err) { + log.error('Unable to create directory ', chalk.bold(dabsOut), ' for riw TODO file.'); + throw err; + } + + if (config.outputMode !== 'no-file') { + fs.writeFileSync(fabsOut, stringify(translation.todos)); + notify('fileSaved')(fabsOut); + } + + return translation; + }; diff --git a/src/lib/riw/app/translate/writeTranslations.js b/src/lib/riw/app/translate/writeTranslations.js new file mode 100644 index 0000000..4e60e37 --- /dev/null +++ b/src/lib/riw/app/translate/writeTranslations.js @@ -0,0 +1,89 @@ +// @flow + +import fs from 'fs'; +import path from 'path'; +import chalk from 'chalk'; + +import mkdirp from 'mkdirp'; + +import type { AbsolutePath, LocaleId } from '../../../../types'; +import log from '../../../log'; +import type { OutputMode, Config } from '../../../config'; +import { translationsOutputFile } from '../../../config-helper'; + +import type { TranslationLookupResult } from './findTranslations'; + +type Notifier = (name: string) => (fabs: AbsolutePath) => AbsolutePath; +type Writer = ( + config: Config, + notify: Notifier, + tof: { + fromLid: (lid: LocaleId) => AbsolutePath, + forSingleFile: () => AbsolutePath, + }, + translation: TranslationLookupResult, +) => void; + +type WriterMap = { [key: OutputMode]: Writer }; + +const stringify = obj => JSON.stringify(obj, null, 4); + +const arlidInclude = (config: Config): LocaleId[] => + config.targetLocales.concat(config.defaultLocale); + +const arWriterByMode: WriterMap = { + 'file-per-locale': (config, notify, tof, translation) => { + arlidInclude(config).forEach((lid) => { + const json = stringify(translation.locale[lid] || {}); + const fabs = tof.fromLid(lid); + + fs.writeFileSync(fabs, json); + notify('fileSaved')(fabs); + }); + }, + + 'single-file': (config, notify, tof, translation) => { + const data = arlidInclude(config).reduce( + (dataAcc, lid) => { + dataAcc[lid] = translation.locale[lid] || {}; + return dataAcc; + }, + {}, + ); + + const json = stringify(data); + const fabs = tof.forSingleFile(); + + fs.writeFileSync(fabs, json); + notify('fileSaved')(fabs); + }, + + 'no-file': () => {}, +}; + +export default (config: Config, notify: Notifier) => + (translation: TranslationLookupResult) => { + const tof = translationsOutputFile(config); + const { translationsOutputFile: pathOut } = config; + + if (!tof.hasPlaceholder()) { + log.error('The ', chalk.bold(tof.sPlaceholder), ' placeholder is missing from your ', chalk.bold('translationsOutputFile'), ' setting.'); + log.error('Current setting: ', chalk.bold(pathOut)); + + throw new Error(`Configuration error: translationsOutputFile needs "${tof.sPlaceholder}`); + } + + const dabsOut = path.dirname(tof.forSingleFile()); + + try { + mkdirp.sync(dabsOut); + + } catch (err) { + log.error('Unable to create directory ', chalk.bold(dabsOut), ' for riw translation file(s).'); + throw err; + } + + arWriterByMode[config.outputMode](config, notify, tof, translation); + + return translation; + }; diff --git a/src/lib/riw/db/__tests__/__snapshots__/delete.test.js.snap b/src/lib/riw/db/__tests__/__snapshots__/delete.test.js.snap new file mode 100644 index 0000000..5c78725 --- /dev/null +++ b/src/lib/riw/db/__tests__/__snapshots__/delete.test.js.snap @@ -0,0 +1,95 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/db/delete 01 defaultMessage match 1`] = ` +Object { + "data": Object { + "one": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 one", + "bb-bb": "[bb-bb]1 one", + }, + "desc2": Object { + "aa-aa": "[aa-aa]2 one", + "bb-bb": "[bb-bb]2 one", + }, + }, + "three": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 three", + "cc-cc": "[cc-cc]1 three", + }, + }, + }, + "version": 1, +} +`; + +exports[`lib/riw/db/delete 02 description match 1`] = ` +Object { + "data": Object { + "one": Object { + "desc2": Object { + "aa-aa": "[aa-aa]2 one", + "bb-bb": "[bb-bb]2 one", + }, + }, + }, + "version": 1, +} +`; + +exports[`lib/riw/db/delete 03 locale match 1`] = ` +Object { + "data": Object { + "one": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 one", + }, + "desc2": Object { + "aa-aa": "[aa-aa]2 one", + }, + }, + "three": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 three", + "cc-cc": "[cc-cc]1 three", + }, + }, + "two": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 two", + }, + }, + }, + "version": 1, +} +`; + +exports[`lib/riw/db/delete 04 translation match 1`] = ` +Object { + "data": Object { + "one": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 one", + "bb-bb": "[bb-bb]1 one", + }, + "desc2": Object { + "aa-aa": "[aa-aa]2 one", + "bb-bb": "[bb-bb]2 one", + }, + }, + "three": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 three", + }, + }, + "two": Object { + "desc1": Object { + "aa-aa": "[aa-aa]1 two", + "bb-bb": "[bb-bb]1 two", + }, + }, + }, + "version": 1, +} +`; diff --git a/src/lib/riw/db/__tests__/__snapshots__/list.test.js.snap b/src/lib/riw/db/__tests__/__snapshots__/list.test.js.snap new file mode 100644 index 0000000..cf0e910 --- /dev/null +++ b/src/lib/riw/db/__tests__/__snapshots__/list.test.js.snap @@ -0,0 +1,130 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/db/list 01 defaultMessage match 1`] = ` +Array [ + Object { + "defaultMessage": "two", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 two", + }, + Object { + "defaultMessage": "two", + "description": "desc1", + "locale": "bb-bb", + "translation": "[bb-bb]1 two", + }, +] +`; + +exports[`lib/riw/db/list 02 description match 1`] = ` +Array [ + Object { + "defaultMessage": "one", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 one", + }, + Object { + "defaultMessage": "one", + "description": "desc1", + "locale": "bb-bb", + "translation": "[bb-bb]1 one", + }, + Object { + "defaultMessage": "two", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 two", + }, + Object { + "defaultMessage": "two", + "description": "desc1", + "locale": "bb-bb", + "translation": "[bb-bb]1 two", + }, + Object { + "defaultMessage": "three", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 three", + }, + Object { + "defaultMessage": "three", + "description": "desc1", + "locale": "cc-cc", + "translation": "[cc-cc]1 three", + }, +] +`; + +exports[`lib/riw/db/list 03 locale match 1`] = ` +Array [ + Object { + "defaultMessage": "one", + "description": "desc1", + "locale": "bb-bb", + "translation": "[bb-bb]1 one", + }, + Object { + "defaultMessage": "one", + "description": "desc2", + "locale": "bb-bb", + "translation": "[bb-bb]2 one", + }, + Object { + "defaultMessage": "two", + "description": "desc1", + "locale": "bb-bb", + "translation": "[bb-bb]1 two", + }, +] +`; + +exports[`lib/riw/db/list 04 translation match 1`] = ` +Array [ + Object { + "defaultMessage": "three", + "description": "desc1", + "locale": "cc-cc", + "translation": "[cc-cc]1 three", + }, +] +`; + +exports[`lib/riw/db/list 05 defaultMessage match for message without desc 1`] = ` +Array [ + Object { + "defaultMessage": "four", + "locale": "aa-aa", + "translation": "[aa-aa]no desc four", + }, +] +`; + +exports[`lib/riw/db/list 06 match with two criteria 1`] = ` +Array [ + Object { + "defaultMessage": "one", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 one", + }, + Object { + "defaultMessage": "one", + "description": "desc2", + "locale": "aa-aa", + "translation": "[aa-aa]2 one", + }, +] +`; + +exports[`lib/riw/db/list 07 match message with default desc 1`] = ` +Array [ + Object { + "defaultMessage": "four", + "locale": "aa-aa", + "translation": "[aa-aa]no desc four", + }, +] +`; diff --git a/src/lib/riw/db/__tests__/__snapshots__/update.test.js.snap b/src/lib/riw/db/__tests__/__snapshots__/update.test.js.snap new file mode 100644 index 0000000..070c68a --- /dev/null +++ b/src/lib/riw/db/__tests__/__snapshots__/update.test.js.snap @@ -0,0 +1,75 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/db/update 01 empty db, no messages to update 1`] = ` +Object { + "data": Object {}, + "version": 1, +} +`; + +exports[`lib/riw/db/update 02 adding new message 1`] = ` +Object { + "data": Object { + "hello": Object { + "desc1": Object { + "en-re": "olleh", + }, + }, + }, + "version": 1, +} +`; + +exports[`lib/riw/db/update 03 updating message, same locale 1`] = ` +Object { + "data": Object { + "hello": Object { + "desc1": Object { + "en-re": "NEW olleh", + }, + }, + }, + "version": 1, +} +`; + +exports[`lib/riw/db/update 04 updating message, new locale 1`] = ` +Object { + "data": Object { + "hello": Object { + "desc1": Object { + "en-UPPER": "HELLO", + "en-re": "olleh", + }, + }, + }, + "version": 1, +} +`; + +exports[`lib/riw/db/update 05 several messages at once 1`] = ` +Object { + "data": Object { + "foo": Object { + "desc1": Object { + "en-re": "oof", + }, + "desc2": Object { + "en-UPPER": "FOO", + }, + }, + "goodbye": Object { + "desc1": Object { + "en-re": "eybdoog", + }, + }, + "hello": Object { + "desc1": Object { + "en-UPPER": "HELLO", + "en-re": "olleh", + }, + }, + }, + "version": 1, +} +`; diff --git a/src/lib/riw/db/__tests__/delete.test.js b/src/lib/riw/db/__tests__/delete.test.js new file mode 100644 index 0000000..1120737 --- /dev/null +++ b/src/lib/riw/db/__tests__/delete.test.js @@ -0,0 +1,112 @@ +// @flow + +import fs from 'fs'; + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../config'; +import { configResolve } from '../../../config'; + +import type { TranslationsDB, DBListSpec } from '../'; +import del from '../delete'; + +const frelDB = 'db.json'; + +const cfgBase: ConfigSparseWithSource = { + translationsDatabaseFile: frelDB, +}; + +const db: TranslationsDB = { + version: 1, + data: { + 'one': { + 'desc1': { + 'aa-aa': '[aa-aa]1 one', + 'bb-bb': '[bb-bb]1 one', + }, + 'desc2': { + 'aa-aa': '[aa-aa]2 one', + 'bb-bb': '[bb-bb]2 one', + }, + }, + 'two': { + 'desc1': { + 'aa-aa': '[aa-aa]1 two', + 'bb-bb': '[bb-bb]1 two', + }, + }, + 'three': { + 'desc1': { + 'aa-aa': '[aa-aa]1 three', + 'cc-cc': '[cc-cc]1 three', + }, + }, + }, +}; + +const jsonDB = JSON.stringify(db, null, 4); + +type Fixture = { + name: string, + opt: DBListSpec, +}; + +const fixtures: Fixture[] = [ + { + name: '01 defaultMessage match', + opt: { + match: { + defaultMessage: 'two', + }, + }, + }, + + { + name: '02 description match', + opt: { + match: { + description: 'desc1', + }, + }, + }, + + { + name: '03 locale match', + opt: { + match: { + locale: 'bb-bb', + }, + }, + }, + + { + name: '04 translation match', + opt: { + match: { + translation: '[cc-cc]1 three', + }, + }, + }, +]; + +describe('lib/riw/db/delete', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + [frelDB]: jsonDB, + }); + + const cfg = configResolve(cfgBase); + + del(cfg)(fixture.opt); + + const dbOut: TranslationsDB = JSON.parse( + fs.readFileSync(frelDB).toString(), + ); + + mock.restore(); + + expect(dbOut).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/db/__tests__/init.test.js b/src/lib/riw/db/__tests__/init.test.js new file mode 100644 index 0000000..789b733 --- /dev/null +++ b/src/lib/riw/db/__tests__/init.test.js @@ -0,0 +1,41 @@ +// @flow + +import fs from 'fs'; + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../config'; +import { configResolve } from '../../../config'; + +import init from '../init'; +import dbEmpty from '../meta/dbEmpty'; + +const frelDB = 'db.json'; + +const cfgBase: ConfigSparseWithSource = { + translationsDatabaseFile: frelDB, +}; + +const stringify = obj => JSON.stringify(obj, null, 4); + +describe('lib/riw/db/init', () => { + beforeEach(() => { + mock({ + fixture: {}, + }); + }); + + afterEach(() => { + mock.restore(); + }); + + it('writes empty database', () => { + const cfg = configResolve(cfgBase); + + init(cfg)(); + + const content = fs.readFileSync(frelDB).toString(); + + expect(content).toEqual(stringify(dbEmpty)); + }); +}); diff --git a/src/lib/riw/db/__tests__/list.test.js b/src/lib/riw/db/__tests__/list.test.js new file mode 100644 index 0000000..f947324 --- /dev/null +++ b/src/lib/riw/db/__tests__/list.test.js @@ -0,0 +1,139 @@ +// @flow + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../config'; +import { configResolve } from '../../../config'; + +import type { TranslationsDB, DBListSpec } from '../'; +import list from '../list'; + +const frelDB = 'db.json'; + +const cfgBase: ConfigSparseWithSource = { + translationsDatabaseFile: frelDB, +}; + +const db: TranslationsDB = { + version: 1, + data: { + 'one': { + 'desc1': { + 'aa-aa': '[aa-aa]1 one', + 'bb-bb': '[bb-bb]1 one', + }, + 'desc2': { + 'aa-aa': '[aa-aa]2 one', + 'bb-bb': '[bb-bb]2 one', + }, + }, + 'two': { + 'desc1': { + 'aa-aa': '[aa-aa]1 two', + 'bb-bb': '[bb-bb]1 two', + }, + }, + 'three': { + 'desc1': { + 'aa-aa': '[aa-aa]1 three', + 'cc-cc': '[cc-cc]1 three', + }, + }, + 'four': { + '_': { + 'aa-aa': '[aa-aa]no desc four', + }, + }, + }, +}; + +const jsonDB = JSON.stringify(db, null, 4); + +type Fixture = { + name: string, + opt: DBListSpec, +}; + +const fixtures: Fixture[] = [ + { + name: '01 defaultMessage match', + opt: { + match: { + defaultMessage: 'two', + }, + }, + }, + + { + name: '02 description match', + opt: { + match: { + description: 'desc1', + }, + }, + }, + + { + name: '03 locale match', + opt: { + match: { + locale: 'bb-bb', + }, + }, + }, + + { + name: '04 translation match', + opt: { + match: { + translation: '[cc-cc]1 three', + }, + }, + }, + + { + name: '05 defaultMessage match for message without desc', + opt: { + match: { + defaultMessage: 'four', + }, + }, + }, + + { + name: '06 match with two criteria', + opt: { + match: { + defaultMessage: 'one', + locale: 'aa-aa', + }, + }, + }, + + { + name: '07 match message with default desc', + opt: { + match: { + description: '_', + }, + }, + }, +]; + +describe('lib/riw/db/list', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + [frelDB]: jsonDB, + }); + + const cfg = configResolve(cfgBase); + + const received = list(cfg)(fixture.opt); + + mock.restore(); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/db/__tests__/update.test.js b/src/lib/riw/db/__tests__/update.test.js new file mode 100644 index 0000000..1865367 --- /dev/null +++ b/src/lib/riw/db/__tests__/update.test.js @@ -0,0 +1,165 @@ +// @flow + +import fs from 'fs'; + +import mock from 'mock-fs'; + +import type { ConfigSparseWithSource } from '../../../config'; +import { configResolve } from '../../../config'; + +import type { TranslationsDB } from '../'; +import type { DBUpdateSpec } from '../update'; +import update from '../update'; + +const frelDB = 'db.json'; + +const cfg: ConfigSparseWithSource = { + translationsDatabaseFile: frelDB, +}; + +type Fixture = { + name: string, + in: TranslationsDB, + opt: DBUpdateSpec, +}; + +const fixtures: Fixture[] = [ + { + name: '01 empty db, no messages to update', + in: { + version: 1, + data: {}, + }, + opt: { + translations: [], + }, + }, + + { + name: '02 adding new message', + in: { + version: 1, + data: {}, + }, + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-re', + translation: 'olleh', + }, + ], + }, + }, + + { + name: '03 updating message, same locale', + in: { + version: 1, + data: { + 'hello': { + 'desc1': { + 'en-re': 'OLD olleh', + }, + }, + }, + }, + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-re', + translation: 'NEW olleh', + }, + ], + }, + }, + + { + name: '04 updating message, new locale', + in: { + version: 1, + data: { + 'hello': { + 'desc1': { + 'en-re': 'olleh', + }, + }, + }, + }, + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-UPPER', + translation: 'HELLO', + }, + ], + }, + }, + + { + name: '05 several messages at once', + in: { + version: 1, + data: { + 'hello': { + 'desc1': { + 'en-re': 'olleh', + }, + }, + }, + }, + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-UPPER', + translation: 'HELLO', + }, + { + defaultMessage: 'goodbye', + description: 'desc1', + locale: 'en-re', + translation: 'eybdoog', + }, + { + defaultMessage: 'foo', + description: 'desc1', + locale: 'en-re', + translation: 'oof', + }, + { + defaultMessage: 'foo', + description: 'desc2', + locale: 'en-UPPER', + translation: 'FOO', + }, + ], + }, + }, +]; + +describe('lib/riw/db/update', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + mock({ + [frelDB]: JSON.stringify(fixture.in), + }); + + update(configResolve(cfg))(fixture.opt); + + const dbOut: TranslationsDB = JSON.parse( + fs.readFileSync(frelDB).toString(), + ); + + mock.restore(); + + expect(dbOut).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/db/delete.js b/src/lib/riw/db/delete.js new file mode 100644 index 0000000..75ef626 --- /dev/null +++ b/src/lib/riw/db/delete.js @@ -0,0 +1,21 @@ +// @flow + +import compose from 'ramda/src/compose'; + +import type { Config } from '../../config'; + +import dbRead from './rw/dbRead'; +import writeFromDB from './rw/writeFromDB'; +import arquadFromDB from './transform/arquadFromDB'; +import dbFromQuadAr from './transform/dbFromQuadAr'; +import arquadDeleteFromQuadAr from './transform/arquadDeleteFromQuadAr'; + +import type { DBListSpec } from './'; + +export default (config: Config) => (opt?: DBListSpec) => compose( + writeFromDB(config), + dbFromQuadAr, + arquadDeleteFromQuadAr(opt), + arquadFromDB, + dbRead(config), +)(); diff --git a/src/lib/riw/db/index.js b/src/lib/riw/db/index.js new file mode 100644 index 0000000..38bc1d8 --- /dev/null +++ b/src/lib/riw/db/index.js @@ -0,0 +1,59 @@ +// @flow + +import type { + LocaleId, + DefaultMessage, + Description, + TranslatedMessage, + TranslatedMessageDescriptor, +} from '../../../types'; +import type { Config } from '../../config'; + +import type { DBUpdateSpec } from './update'; +import type { DBListSpec } from './list'; +import type { DBStatusResult } from './status'; +import type { TranslationMatchSpec } from './util/makeQuadMatcher'; +import dbRead from './rw/dbRead'; +import init from './init'; +import list from './list'; +import status from './status'; +import update from './update'; +import del from './delete'; + +export type Version = number; + +export type TranslationsDB = { + version: Version, + data: { + [key: DefaultMessage]: { + [key: Description]: { + [key: LocaleId]: TranslatedMessage, + }, + }, + }, +}; + +export type { + DBUpdateSpec, + DBListSpec, + DBStatusResult, + TranslationMatchSpec, +}; + +export type DB = {| + init: () => void, + read: () => TranslationsDB, + list: (opt: DBListSpec) => TranslatedMessageDescriptor[], + status: () => DBStatusResult, + update: (opt: DBUpdateSpec) => void, + delete: (opt: DBListSpec) => void, +|}; + +export default (config: Config) => ({ + init: init(config), + read: dbRead(config), + list: list(config), + status: status(config), + update: update(config), + delete: del(config), +}); diff --git a/src/lib/riw/db/init.js b/src/lib/riw/db/init.js new file mode 100644 index 0000000..a5b991b --- /dev/null +++ b/src/lib/riw/db/init.js @@ -0,0 +1,9 @@ +// @flow + +import type { Config } from '../../config'; + +import dbEmpty from './meta/dbEmpty'; +import writeFromDB from './rw/writeFromDB'; + +export default (config: Config) => () => + writeFromDB(config, { allowOverwrite: false })(dbEmpty); diff --git a/src/lib/riw/db/list.js b/src/lib/riw/db/list.js new file mode 100644 index 0000000..d85078a --- /dev/null +++ b/src/lib/riw/db/list.js @@ -0,0 +1,23 @@ +// @flow + +import compose from 'ramda/src/compose'; + +import type { Config } from '../../config'; + +import dbRead from './rw/dbRead'; +import arquadFromDB from './transform/arquadFromDB'; +import arquadFilterFromQuadAr from './transform/arquadFilterFromQuadAr'; +import armdtFromQuadAr from './transform/armdtFromQuadAr'; + +import type { TranslationMatchSpec } from './util/makeQuadMatcher'; + +export type DBListSpec = { + match: TranslationMatchSpec, +}; + +export default (config: Config) => (opt?: DBListSpec) => compose( + armdtFromQuadAr, + arquadFilterFromQuadAr(opt), + arquadFromDB, + dbRead(config), +)(); diff --git a/src/lib/riw/db/meta/__tests__/dbEmpty.test.js b/src/lib/riw/db/meta/__tests__/dbEmpty.test.js new file mode 100644 index 0000000..7524e04 --- /dev/null +++ b/src/lib/riw/db/meta/__tests__/dbEmpty.test.js @@ -0,0 +1,15 @@ +// @flow + +import version from '../version'; +import dbEmpty from '../dbEmpty'; + +describe('lib/riw/db/meta/dbEmpty', () => { + it('has the current version', () => { + expect(dbEmpty.version).toEqual(version); + }); + + it('has empty data', () => { + expect(dbEmpty.data).toEqual({}); + }); +}); + diff --git a/src/lib/riw/db/meta/dbEmpty.js b/src/lib/riw/db/meta/dbEmpty.js new file mode 100644 index 0000000..8667911 --- /dev/null +++ b/src/lib/riw/db/meta/dbEmpty.js @@ -0,0 +1,11 @@ +// @flow + +import type { TranslationsDB } from '../'; +import version from './version'; + +const dbEmpty: TranslationsDB = { + version, + data: {}, +}; + +export default dbEmpty; diff --git a/src/lib/riw/db/meta/version.js b/src/lib/riw/db/meta/version.js new file mode 100644 index 0000000..13eb2e6 --- /dev/null +++ b/src/lib/riw/db/meta/version.js @@ -0,0 +1,7 @@ +// @flow + +import type { Version } from '../'; + +const numVersion: Version = 1; + +export default numVersion; diff --git a/src/lib/riw/db/rw/__tests__/dbRead.test.js b/src/lib/riw/db/rw/__tests__/dbRead.test.js new file mode 100644 index 0000000..120421e --- /dev/null +++ b/src/lib/riw/db/rw/__tests__/dbRead.test.js @@ -0,0 +1,63 @@ +// @flow + +import mock from 'mock-fs'; + +import { configResolve } from '../../../../config'; +import type { TranslationsDB } from '../../'; + +import dbRead from '../dbRead'; + +const db: TranslationsDB = { + version: 1, + data: {}, +}; + +const stringify = obj => JSON.stringify(obj, null, 4); + +describe('lib/riw/db/rw/dbRead', () => { + beforeEach(() => { + mock({ + fixtures: { + '01': {}, // empty dir + '02': { + 'riw-db.json': 'not actually json', + }, + '03': { + 'riw-db.json': stringify(db), + }, + }, + }); + }); + + afterEach(() => { + mock.restore(); + }); + + it('fails to read a missing file', () => { + const cfg = configResolve({ + translationsDatabaseFile: 'fixtures/01/riw-db.json', + }); + + expect(() => { + dbRead(cfg)(); + }).toThrowError(/ENOENT/); + }); + + it("throws if the file content isn't JSON", () => { + const cfg = configResolve({ + translationsDatabaseFile: 'fixtures/02/riw-db.json', + }); + + expect(() => { + dbRead(cfg)(); + }).toThrowError(/Unexpected token/); + }); + + it('returns valid object if found', () => { + const cfg = configResolve({ + translationsDatabaseFile: 'fixtures/03/riw-db.json', + }); + + expect(dbRead(cfg)()).toEqual(db); + }); +}); diff --git a/src/lib/riw/db/rw/__tests__/writeFromDB.test.js b/src/lib/riw/db/rw/__tests__/writeFromDB.test.js new file mode 100644 index 0000000..7ef01f4 --- /dev/null +++ b/src/lib/riw/db/rw/__tests__/writeFromDB.test.js @@ -0,0 +1,72 @@ +// @flow + +import fs from 'fs'; + +import mock from 'mock-fs'; + +import { configResolve } from '../../../../config'; + +import type { TranslationsDB } from '../../'; +import writeFromDB from '../writeFromDB'; + +const db: TranslationsDB = { + version: 1, + data: {}, +}; + +const stringify = obj => JSON.stringify(obj, null, 4); + +describe('lib/riw/db/rw/writeFromDB', () => { + beforeEach(() => { + mock({ + fixtures: { + '01': {}, // empty dir + '02': { + 'riw-db.json': 'before', + }, + '03': mock.directory({ + mode: 0o555, // cannot write + items: {}, + }), + }, + }); + }); + + afterEach(() => { + mock.restore(); + }); + + it('writes a new db file to an empty dir', () => { + const cfg = configResolve({ + translationsDatabaseFile: 'fixtures/01/riw-db.json', + }); + + expect(() => { + writeFromDB(cfg)(db); + }).not.toThrow(); + + const content = fs.readFileSync(cfg.translationsDatabaseFile).toString(); + + expect(content).toEqual(stringify(db)); + }); + + it("doesn't overwrite an existing db file if told not to", () => { + const cfg = configResolve({ + translationsDatabaseFile: 'fixtures/02/riw-db.json', + }); + + expect(() => { + writeFromDB(cfg, { allowOverwrite: false })(db); + }).toThrowError(/EEXIST/); + }); + + it("throws if it can't create a directory for the file", () => { + const cfg = configResolve({ + translationsDatabaseFile: 'fixtures/03/impossible/riw-db.json', + }); + + expect(() => { + writeFromDB(cfg)(db); + }).toThrowError(/EACCES/); + }); +}); diff --git a/src/lib/riw/db/rw/dbRead.js b/src/lib/riw/db/rw/dbRead.js new file mode 100644 index 0000000..1e2988d --- /dev/null +++ b/src/lib/riw/db/rw/dbRead.js @@ -0,0 +1,34 @@ +// @flow + +import fs from 'fs'; +import path from 'path'; +import chalk from 'chalk'; + +import type { Config } from '../../../config'; +import log from '../../../log'; + +import type { TranslationsDB } from '../'; + +export default (config: Config) => (): TranslationsDB => { + const { translationsDatabaseFile: pathDB, rootDir } = config; + + const pabsDB = path.resolve(rootDir, pathDB); + let sDB; + + try { + sDB = fs.readFileSync(pabsDB, 'utf8').toString(); + + } catch (err) { + log.error('Unable to read riw database file ', chalk.bold(pabsDB)); + throw err; + } + + try { + return JSON.parse(sDB); + + } catch (err) { + log.error('Unable to parse riw database file ', chalk.bold(pabsDB)); + log.error('Could be malformed JSON.'); + throw err; + } +}; diff --git a/src/lib/riw/db/rw/writeFromDB.js b/src/lib/riw/db/rw/writeFromDB.js new file mode 100644 index 0000000..f9b8d5a --- /dev/null +++ b/src/lib/riw/db/rw/writeFromDB.js @@ -0,0 +1,48 @@ +// @flow + +import fs from 'fs'; +import path from 'path'; +import chalk from 'chalk'; + +import mkdirp from 'mkdirp'; + +import type { Config } from '../../../config'; +import log from '../../../log'; + +import type { TranslationsDB } from '../'; + +type WriteOpt = { + allowOverwrite?: boolean, +}; + +const optDefault: WriteOpt = { + allowOverwrite: true, +}; + +export default (config: Config, optIn: WriteOpt = {}) => (db: TranslationsDB): void => { + const opt = { ...optDefault, ...optIn }; + const flag = opt.allowOverwrite ? 'w' : 'wx'; + + const { translationsDatabaseFile: pathDB, rootDir } = config; + + const pabsDB = path.resolve(rootDir, pathDB); + const dabsDB = path.dirname(pabsDB); + + const json = JSON.stringify(db, null, 4); + + try { + mkdirp.sync(dabsDB); + + } catch (err) { + log.error('Unable to create directory ', chalk.bold(dabsDB), ' for riw database file.'); + throw err; + } + + try { + fs.writeFileSync(pabsDB, json, { flag }); + } catch (err) { + + log.error('Unable to create riw database file ', chalk.bold(pabsDB), '. It might already exist.'); + throw err; + } +}; diff --git a/src/lib/riw/db/status.js b/src/lib/riw/db/status.js new file mode 100644 index 0000000..c9dae63 --- /dev/null +++ b/src/lib/riw/db/status.js @@ -0,0 +1,29 @@ +// @flow + +import compose from 'ramda/src/compose'; + +import type { + LocaleId, + DefaultPair, +} from '../../../types'; +import type { Config } from '../../config'; + +import dbRead from './rw/dbRead'; +import arquadFromDB from './transform/arquadFromDB'; +import arStatusByLidFromQuadAr from './transform/arStatusByLidFromQuadAr'; + +export type DBStatusResult = { + default: DefaultPair[], + locale: { + [key: LocaleId]: { + has: DefaultPair[], + missing: DefaultPair[], + }, + }, +}; + +export default (config: Config) => (): DBStatusResult => compose( + arStatusByLidFromQuadAr, + arquadFromDB, + dbRead(config), +)(); diff --git a/src/lib/riw/db/transform/__tests__/__snapshots__/arStatusByLidFromQuadAr.test.js.snap b/src/lib/riw/db/transform/__tests__/__snapshots__/arStatusByLidFromQuadAr.test.js.snap new file mode 100644 index 0000000..93d8b6d --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/__snapshots__/arStatusByLidFromQuadAr.test.js.snap @@ -0,0 +1,159 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/db/transform/arStatusByLidFromQuadAr 01 1`] = ` +Object { + "default": Array [], + "locale": Object {}, +} +`; + +exports[`lib/riw/db/transform/arStatusByLidFromQuadAr 02 1`] = ` +Object { + "default": Array [ + Array [ + "one", + "desc1", + ], + Array [ + "two", + "desc1", + ], + ], + "locale": Object { + "aa-aa": Object { + "has": Array [ + Array [ + "one", + "desc1", + ], + Array [ + "two", + "desc1", + ], + ], + "missing": Array [], + }, + }, +} +`; + +exports[`lib/riw/db/transform/arStatusByLidFromQuadAr 03 1`] = ` +Object { + "default": Array [ + Array [ + "one", + "desc1", + ], + ], + "locale": Object { + "aa-aa": Object { + "has": Array [ + Array [ + "one", + "desc1", + ], + ], + "missing": Array [], + }, + "bb-bb": Object { + "has": Array [ + Array [ + "one", + "desc1", + ], + ], + "missing": Array [], + }, + }, +} +`; + +exports[`lib/riw/db/transform/arStatusByLidFromQuadAr 04 1`] = ` +Object { + "default": Array [ + Array [ + "one", + "desc1", + ], + Array [ + "one", + "desc2", + ], + Array [ + "two", + "desc1", + ], + Array [ + "three", + "desc1", + ], + ], + "locale": Object { + "aa-aa": Object { + "has": Array [ + Array [ + "one", + "desc1", + ], + ], + "missing": Array [ + Array [ + "one", + "desc2", + ], + Array [ + "two", + "desc1", + ], + Array [ + "three", + "desc1", + ], + ], + }, + "bb-bb": Object { + "has": Array [ + Array [ + "one", + "desc1", + ], + Array [ + "one", + "desc2", + ], + Array [ + "two", + "desc1", + ], + Array [ + "three", + "desc1", + ], + ], + "missing": Array [], + }, + "cc-cc": Object { + "has": Array [ + Array [ + "three", + "desc1", + ], + ], + "missing": Array [ + Array [ + "one", + "desc1", + ], + Array [ + "one", + "desc2", + ], + Array [ + "two", + "desc1", + ], + ], + }, + }, +} +`; diff --git a/src/lib/riw/db/transform/__tests__/__snapshots__/armdtFromQuadAr.test.js.snap b/src/lib/riw/db/transform/__tests__/__snapshots__/armdtFromQuadAr.test.js.snap new file mode 100644 index 0000000..87f1ac2 --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/__snapshots__/armdtFromQuadAr.test.js.snap @@ -0,0 +1,67 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/db/transform/armdtFromQuadAr 01 no quads 1`] = `Array []`; + +exports[`lib/riw/db/transform/armdtFromQuadAr 02 some quads 1`] = ` +Array [ + Object { + "defaultMessage": "one", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 one", + }, + Object { + "defaultMessage": "one", + "description": "desc2", + "locale": "aa-aa", + "translation": "[aa-aa]2 one", + }, + Object { + "defaultMessage": "one", + "description": "desc1", + "locale": "bb-bb", + "translation": "[bb-bb]1 one", + }, + Object { + "defaultMessage": "one", + "description": "desc2", + "locale": "bb-bb", + "translation": "[bb-bb]2 one", + }, + Object { + "defaultMessage": "two", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 two", + }, + Object { + "defaultMessage": "two", + "description": "desc1", + "locale": "bb-bb", + "translation": "[bb-bb]1 two", + }, + Object { + "defaultMessage": "three", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 three", + }, + Object { + "defaultMessage": "three", + "description": "desc1", + "locale": "cc-cc", + "translation": "[cc-cc]1 three", + }, + Object { + "defaultMessage": "four", + "locale": "aa-aa", + "translation": "[aa-aa]no desc four", + }, + Object { + "defaultMessage": "four", + "description": "desc1", + "locale": "aa-aa", + "translation": "[aa-aa]1 four", + }, +] +`; diff --git a/src/lib/riw/db/transform/__tests__/__snapshots__/arquadFromDB.test.js.snap b/src/lib/riw/db/transform/__tests__/__snapshots__/arquadFromDB.test.js.snap new file mode 100644 index 0000000..61179c5 --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/__snapshots__/arquadFromDB.test.js.snap @@ -0,0 +1,38 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/db/transform/arquadFromDB 01 empty db 1`] = `Array []`; + +exports[`lib/riw/db/transform/arquadFromDB 02 lots of entries 1`] = ` +Array [ + Array [ + "hello", + "desc1", + "en-re", + "olleh", + ], + Array [ + "hello", + "desc1", + "en-UP", + "HELLO", + ], + Array [ + "hello", + "desc2", + "fr-fr", + "bonjour", + ], + Array [ + "goodbye", + "desc1", + "en-re", + "eybdoog", + ], + Array [ + "goodbye", + "desc1", + "en-UP", + "GOODBYE", + ], +] +`; diff --git a/src/lib/riw/db/transform/__tests__/__snapshots__/dbFromQuadAr.test.js.snap b/src/lib/riw/db/transform/__tests__/__snapshots__/dbFromQuadAr.test.js.snap new file mode 100644 index 0000000..f312c05 --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/__snapshots__/dbFromQuadAr.test.js.snap @@ -0,0 +1,31 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`lib/riw/db/transform/dbFromQuadAr 01 empty db 1`] = ` +Object { + "data": Object {}, + "version": 1, +} +`; + +exports[`lib/riw/db/transform/dbFromQuadAr 02 lots of entries 1`] = ` +Object { + "data": Object { + "goodbye": Object { + "desc1": Object { + "en-UP": "GOODBYE", + "en-re": "eybdoog", + }, + }, + "hello": Object { + "desc1": Object { + "en-UP": "HELLO", + "en-re": "olleh", + }, + "desc2": Object { + "fr-fr": "bonjour", + }, + }, + }, + "version": 1, +} +`; diff --git a/src/lib/riw/db/transform/__tests__/arStatusByLidFromQuadAr.test.js b/src/lib/riw/db/transform/__tests__/arStatusByLidFromQuadAr.test.js new file mode 100644 index 0000000..7932362 --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/arStatusByLidFromQuadAr.test.js @@ -0,0 +1,51 @@ +// @flow + +import type { TranslationQuad } from '../../../../../types'; +import arStatusByLidFromQuadAr from '../arStatusByLidFromQuadAr'; + +type Fixture = { + name: string, + in: TranslationQuad[], +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: [], + }, + { + name: '02', + in: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ], + }, + { + name: '03', + in: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ], + }, + { + name: '04', + in: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ['three', 'desc1', 'bb-bb', '[bb-bb]1 three'], + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], + ], + }, +]; + +describe('lib/riw/db/transform/arStatusByLidFromQuadAr', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = arStatusByLidFromQuadAr(fixture.in); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/db/transform/__tests__/armdtFromQuadAr.test.js b/src/lib/riw/db/transform/__tests__/armdtFromQuadAr.test.js new file mode 100644 index 0000000..dfc2dd4 --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/armdtFromQuadAr.test.js @@ -0,0 +1,42 @@ +// @flow + +import type { TranslationQuad } from '../../../../../types'; +import armdtFromQuadAr from '../armdtFromQuadAr'; + +type Fixture = { + name: string, + in: TranslationQuad[], +}; + +const fixtures: Fixture[] = [ + { + name: '01 no quads', + in: [], + }, + + { + name: '02 some quads', + in: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ['three', 'desc1', 'aa-aa', '[aa-aa]1 three'], + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], + ['four', '_', 'aa-aa', '[aa-aa]no desc four'], + ['four', 'desc1', 'aa-aa', '[aa-aa]1 four'], + ], + }, +]; + +describe('lib/riw/db/transform/armdtFromQuadAr', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = armdtFromQuadAr(fixture.in); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/db/transform/__tests__/arquadDeleteFromQuadAr.test.js b/src/lib/riw/db/transform/__tests__/arquadDeleteFromQuadAr.test.js new file mode 100644 index 0000000..b6969eb --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/arquadDeleteFromQuadAr.test.js @@ -0,0 +1,105 @@ +// @flow + +import type { TranslationQuad } from '../../../../../types'; +import type { DBListSpec } from '../../'; +import arquadDeleteFromQuadAr from '../arquadDeleteFromQuadAr'; + +const quadsBase = [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ['three', 'desc1', 'aa-aa', '[aa-aa]1 three'], + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], +]; + +type Fixture = { + name: string, + before: TranslationQuad[], + opt: DBListSpec, + after: TranslationQuad[], +}; + +const fixtures: Fixture[] = [ + { + name: '01 defaultMessage match', + before: quadsBase, + opt: { + match: { + defaultMessage: 'two', + }, + }, + after: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ['three', 'desc1', 'aa-aa', '[aa-aa]1 three'], + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], + ], + }, + + { + name: '02 description match', + before: quadsBase, + opt: { + match: { + description: 'desc1', + }, + }, + after: [ + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ], + }, + + { + name: '03 locale match', + before: quadsBase, + opt: { + match: { + locale: 'bb-bb', + }, + }, + after: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ['three', 'desc1', 'aa-aa', '[aa-aa]1 three'], + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], + ], + }, + + { + name: '04 translation match', + before: quadsBase, + opt: { + match: { + translation: '[cc-cc]1 three', + }, + }, + after: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ['three', 'desc1', 'aa-aa', '[aa-aa]1 three'], + ], + }, +]; + +describe('lib/riw/db/transform/arquadDeleteFromQuadAr', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const opt = fixture.opt; + + const received = arquadDeleteFromQuadAr(opt)(fixture.before); + + expect(received).toEqual(fixture.after); + }); + }); +}); diff --git a/src/lib/riw/db/transform/__tests__/arquadFilterFromQuadAr.test.js b/src/lib/riw/db/transform/__tests__/arquadFilterFromQuadAr.test.js new file mode 100644 index 0000000..35cc5ec --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/arquadFilterFromQuadAr.test.js @@ -0,0 +1,139 @@ +// @flow + +import type { TranslationQuad } from '../../../../../types'; +import type { DBListSpec } from '../../'; +import arquadFilterFromQuadAr from '../arquadFilterFromQuadAr'; + +const quadsBase = [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ['three', 'desc1', 'aa-aa', '[aa-aa]1 three'], + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], + ['four', '_', 'aa-aa', '[aa-aa]no desc four'], +]; + +type Fixture = { + name: string, + before: TranslationQuad[], + opt: DBListSpec, + after: TranslationQuad[], +}; + +const fixtures: Fixture[] = [ + { + name: '01 defaultMessage match', + before: quadsBase, + opt: { + match: { + defaultMessage: 'two', + }, + }, + after: [ + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ], + }, + + { + name: '02 description match', + before: quadsBase, + opt: { + match: { + description: 'desc1', + }, + }, + after: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['two', 'desc1', 'aa-aa', '[aa-aa]1 two'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ['three', 'desc1', 'aa-aa', '[aa-aa]1 three'], + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], + ], + }, + + { + name: '03 locale match', + before: quadsBase, + opt: { + match: { + locale: 'bb-bb', + }, + }, + after: [ + ['one', 'desc1', 'bb-bb', '[bb-bb]1 one'], + ['one', 'desc2', 'bb-bb', '[bb-bb]2 one'], + ['two', 'desc1', 'bb-bb', '[bb-bb]1 two'], + ], + }, + + { + name: '04 translation match', + before: quadsBase, + opt: { + match: { + translation: '[cc-cc]1 three', + }, + }, + after: [ + ['three', 'desc1', 'cc-cc', '[cc-cc]1 three'], + ], + }, + + { + name: '05 defaultMessage match for message without desc', + before: quadsBase, + opt: { + match: { + defaultMessage: 'four', + }, + }, + after: [ + ['four', '_', 'aa-aa', '[aa-aa]no desc four'], + ], + }, + + { + name: '06 match with two criteria', + before: quadsBase, + opt: { + match: { + defaultMessage: 'one', + locale: 'aa-aa', + }, + }, + after: [ + ['one', 'desc1', 'aa-aa', '[aa-aa]1 one'], + ['one', 'desc2', 'aa-aa', '[aa-aa]2 one'], + ], + }, + + { + name: '07 match message with default desc', + before: quadsBase, + opt: { + match: { + description: '_', + }, + }, + after: [ + ['four', '_', 'aa-aa', '[aa-aa]no desc four'], + ], + }, +]; + +describe('lib/riw/db/transform/arquadFilterFromQuadAr', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const opt = fixture.opt; + + const received = arquadFilterFromQuadAr(opt)(fixture.before); + + expect(received).toEqual(fixture.after); + }); + }); +}); diff --git a/src/lib/riw/db/transform/__tests__/arquadFromDB.test.js b/src/lib/riw/db/transform/__tests__/arquadFromDB.test.js new file mode 100644 index 0000000..2135011 --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/arquadFromDB.test.js @@ -0,0 +1,53 @@ +// @flow + +import type { TranslationsDB } from '../../'; +import arquadFromDB from '../arquadFromDB'; + +type Fixture = { + name: string, + in: TranslationsDB, +}; + +const fixtures: Fixture[] = [ + { + name: '01 empty db', + in: { + version: 1, + data: {}, + }, + }, + + { + name: '02 lots of entries', + in: { + version: 1, + data: { + 'hello': { + 'desc1': { + 'en-re': 'olleh', + 'en-UP': 'HELLO', + }, + 'desc2': { + 'fr-fr': 'bonjour', + }, + }, + 'goodbye': { + 'desc1': { + 'en-re': 'eybdoog', + 'en-UP': 'GOODBYE', + }, + }, + }, + }, + }, +]; + +describe('lib/riw/db/transform/arquadFromDB', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = arquadFromDB(fixture.in); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/db/transform/__tests__/arquadUpdateFromQuadAr.test.js b/src/lib/riw/db/transform/__tests__/arquadUpdateFromQuadAr.test.js new file mode 100644 index 0000000..82b948a --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/arquadUpdateFromQuadAr.test.js @@ -0,0 +1,191 @@ +// @flow + +import type { TranslationQuad } from '../../../../../types'; +import type { DBUpdateSpec } from '../../update'; +import arquadUpdateFromQuadAr from '../arquadUpdateFromQuadAr'; + +type Fixture = { + name: string, + before: TranslationQuad[], + opt: DBUpdateSpec, + after: TranslationQuad[], +}; + +const fixtures: Fixture[] = [ + { + name: '01 empty translations list', + before: [], + opt: { + translations: [], + }, + after: [], + }, + + { + name: '02 adding new message', + before: [], + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-re', + translation: 'olleh', + }, + ], + }, + after: [ + ['hello', 'desc1', 'en-re', 'olleh'], + ], + }, + + { + name: '03 adding message without description', + before: [], + opt: { + translations: [ + { + defaultMessage: 'hello', + locale: 'en-re', + translation: 'olleh', + }, + ], + }, + after: [ + ['hello', '_', 'en-re', 'olleh'], + ], + }, + + { + name: '04 updating message, same locale', + before: [ + ['hello', 'desc1', 'en-re', 'OLD olleh'], + ], + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-re', + translation: 'NEW olleh', + }, + ], + }, + after: [ + ['hello', 'desc1', 'en-re', 'OLD olleh'], + ['hello', 'desc1', 'en-re', 'NEW olleh'], + ], + }, + + { + name: '05 updating message without description, same locale', + before: [ + ['hello', '_', 'en-re', 'OLD olleh'], + ], + opt: { + translations: [ + { + defaultMessage: 'hello', + locale: 'en-re', + translation: 'NEW olleh', + }, + ], + }, + after: [ + ['hello', '_', 'en-re', 'OLD olleh'], + ['hello', '_', 'en-re', 'NEW olleh'], + ], + }, + + { + name: '06 updating message, new locale', + before: [ + ['hello', 'desc1', 'en-re', 'olleh'], + ], + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-UPPER', + translation: 'HELLO', + }, + ], + }, + after: [ + ['hello', 'desc1', 'en-re', 'olleh'], + ['hello', 'desc1', 'en-UPPER', 'HELLO'], + ], + }, + + { + name: '07 updating message without description, new locale', + before: [ + ['hello', '_', 'en-re', 'olleh'], + ], + opt: { + translations: [ + { + defaultMessage: 'hello', + locale: 'en-UPPER', + translation: 'HELLO', + }, + ], + }, + after: [ + ['hello', '_', 'en-re', 'olleh'], + ['hello', '_', 'en-UPPER', 'HELLO'], + ], + }, + + { + name: '08 several messages at once', + before: [ + ['hello', 'desc1', 'en-re', 'olleh'], + ], + opt: { + translations: [ + { + defaultMessage: 'hello', + description: 'desc1', + locale: 'en-UPPER', + translation: 'HELLO', + }, + { + defaultMessage: 'goodbye', + locale: 'en-re', + translation: 'eybdoog', + }, + { + defaultMessage: 'foo', + description: 'desc1', + locale: 'en-re', + translation: 'oof', + }, + { + defaultMessage: 'foo', + description: 'desc2', + locale: 'en-UPPER', + translation: 'FOO', + }, + ], + }, + after: [ + ['hello', 'desc1', 'en-re', 'olleh'], + ['hello', 'desc1', 'en-UPPER', 'HELLO'], + ['goodbye', '_', 'en-re', 'eybdoog'], + ['foo', 'desc1', 'en-re', 'oof'], + ['foo', 'desc2', 'en-UPPER', 'FOO'], + ], + }, +]; + +describe('lib/riw/db/transform/arquadUpdateFromQuadAr', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = arquadUpdateFromQuadAr(fixture.opt)(fixture.before); + + expect(received).toEqual(fixture.after); + }); + }); +}); diff --git a/src/lib/riw/db/transform/__tests__/dbFromQuadAr.test.js b/src/lib/riw/db/transform/__tests__/dbFromQuadAr.test.js new file mode 100644 index 0000000..93eac15 --- /dev/null +++ b/src/lib/riw/db/transform/__tests__/dbFromQuadAr.test.js @@ -0,0 +1,38 @@ +// @flow + +import type { TranslationQuad } from '../../../../../types'; +import dbFromQuadAr from '../dbFromQuadAr'; + +type Fixture = { + name: string, + in: TranslationQuad[], +}; + +const fixtures: Fixture[] = [ + { + name: '01 empty db', + in: [], + }, + + { + name: '02 lots of entries', + in: [ + ['hello', 'desc2', 'fr-fr', 'OVERWRITTEN bonjour'], + ['hello', 'desc1', 'en-re', 'olleh'], + ['hello', 'desc1', 'en-UP', 'HELLO'], + ['hello', 'desc2', 'fr-fr', 'bonjour'], + ['goodbye', 'desc1', 'en-re', 'eybdoog'], + ['goodbye', 'desc1', 'en-UP', 'GOODBYE'], + ], + }, +]; + +describe('lib/riw/db/transform/dbFromQuadAr', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = dbFromQuadAr(fixture.in); + + expect(received).toMatchSnapshot(); + }); + }); +}); diff --git a/src/lib/riw/db/transform/arStatusByLidFromQuadAr.js b/src/lib/riw/db/transform/arStatusByLidFromQuadAr.js new file mode 100644 index 0000000..5e843d7 --- /dev/null +++ b/src/lib/riw/db/transform/arStatusByLidFromQuadAr.js @@ -0,0 +1,57 @@ +// @flow + +import compose from 'ramda/src/compose'; +import map from 'ramda/src/map'; +import reduce from 'ramda/src/reduce'; +import difference from 'ramda/src/difference'; +import uniq from 'ramda/src/uniq'; + +import type { LocaleId, DefaultPair, TranslationQuad } from '../../../../types'; +import type { DBStatusResult } from '../'; + +type LocalePairMap = { + [key: LocaleId]: DefaultPair[], +}; + +type Intermediate = { + arpairDefault: DefaultPair[], + ararpairDefaultByLid: LocalePairMap, +} + +type StatusFromQuadAr = (arquad: TranslationQuad[]) => DBStatusResult; + +const arStatusByLidFromQuadAr: StatusFromQuadAr = compose( + (data: Intermediate): DBStatusResult => ({ + default: data.arpairDefault, + locale: map( + arpair => ({ + has: arpair, + missing: difference(data.arpairDefault, arpair), + }), + data.ararpairDefaultByLid, + ), + }), + (arquad: TranslationQuad[]): Intermediate => ({ + arpairDefault: compose( + uniq, + map((quad: TranslationQuad) => quad.slice(0, 2)), + )(arquad), + ararpairDefaultByLid: reduce( + (ararpairByLocale: LocalePairMap, quad: TranslationQuad) => { + const [defaultMessage, description, lid] = quad; + + if (lid in ararpairByLocale) { + ararpairByLocale[lid].push([defaultMessage, description]); + } else { + ararpairByLocale[lid] = [[defaultMessage, description]]; + } + + return ararpairByLocale; + }, + {}, + arquad, + ), + }), +); + +export default arStatusByLidFromQuadAr; diff --git a/src/lib/riw/db/transform/armdtFromQuadAr.js b/src/lib/riw/db/transform/armdtFromQuadAr.js new file mode 100644 index 0000000..9addc23 --- /dev/null +++ b/src/lib/riw/db/transform/armdtFromQuadAr.js @@ -0,0 +1,19 @@ +// @flow + +import map from 'ramda/src/map'; + +import type { TranslatedMessageDescriptor, TranslationQuad } from '../../../../types'; +import { sDescriptionDefault } from '../../'; + +type Transformer = (quads: TranslationQuad[]) => TranslatedMessageDescriptor[]; + +const fromQuad = (quad: TranslationQuad): TranslatedMessageDescriptor => ({ + defaultMessage: quad[0], + locale: quad[2], + translation: quad[3], + ...(quad[1] === sDescriptionDefault ? null : { description: quad[1] }), +}); + +const fromQuads: Transformer = map(fromQuad); + +export default fromQuads; diff --git a/src/lib/riw/db/transform/arquadDeleteFromQuadAr.js b/src/lib/riw/db/transform/arquadDeleteFromQuadAr.js new file mode 100644 index 0000000..65de78e --- /dev/null +++ b/src/lib/riw/db/transform/arquadDeleteFromQuadAr.js @@ -0,0 +1,16 @@ +// @flow + +import reject from 'ramda/src/reject'; + +import type { TranslationQuad } from '../../../../types'; +import makeQuadMatcher from '../util/makeQuadMatcher'; +import type { DBListSpec } from '../'; + +// eslint-disable-next-line no-unused-vars +const transformer = (opt?: DBListSpec) => (quads: TranslationQuad[]) => + (opt + ? reject(makeQuadMatcher(opt.match), quads) + : quads + ); + +export default transformer; diff --git a/src/lib/riw/db/transform/arquadFilterFromQuadAr.js b/src/lib/riw/db/transform/arquadFilterFromQuadAr.js new file mode 100644 index 0000000..75d7df4 --- /dev/null +++ b/src/lib/riw/db/transform/arquadFilterFromQuadAr.js @@ -0,0 +1,16 @@ +// @flow + +import filter from 'ramda/src/filter'; + +import type { TranslationQuad } from '../../../../types'; +import makeQuadMatcher from '../util/makeQuadMatcher'; +import type { DBListSpec } from '../'; + +// eslint-disable-next-line no-unused-vars +const transformer = (opt?: DBListSpec) => (quads: TranslationQuad[]) => + (opt + ? filter(makeQuadMatcher(opt.match), quads) + : quads + ); + +export default transformer; diff --git a/src/lib/riw/db/transform/arquadFromDB.js b/src/lib/riw/db/transform/arquadFromDB.js new file mode 100644 index 0000000..c80763e --- /dev/null +++ b/src/lib/riw/db/transform/arquadFromDB.js @@ -0,0 +1,24 @@ +// @flow + +import toPairs from 'ramda/src/toPairs'; +import chain from 'ramda/src/chain'; +import map from 'ramda/src/map'; + +import type { TranslationQuad } from '../../../../types'; +import type { TranslationsDB } from '../'; + +const quadify = obj => chain( + ([key, val]) => { + if (typeof val === 'string') { + return [[key, val]]; + } + + return map( + keys => [key, ...keys], + quadify(val), + ); + }, + toPairs(obj), +); + +export default (db: TranslationsDB): TranslationQuad[] => quadify(db.data); diff --git a/src/lib/riw/db/transform/arquadUpdateFromQuadAr.js b/src/lib/riw/db/transform/arquadUpdateFromQuadAr.js new file mode 100644 index 0000000..2264cd6 --- /dev/null +++ b/src/lib/riw/db/transform/arquadUpdateFromQuadAr.js @@ -0,0 +1,23 @@ +// @flow + +import map from 'ramda/src/map'; + +import type { TranslatedMessageDescriptor, TranslationQuad } from '../../../../types'; +import type { DBUpdateSpec } from '../update'; +import { sDescriptionDefault } from '../../'; + +const quadify = (mdt: TranslatedMessageDescriptor): TranslationQuad => [ + mdt.defaultMessage, + mdt.description || sDescriptionDefault, + mdt.locale, + mdt.translation, +]; + +// eslint-disable-next-line no-unused-vars +const transformer = (opt?: DBUpdateSpec) => (quads: TranslationQuad[]) => + (opt && opt.translations.length > 0 + ? quads.concat(map(quadify, opt.translations)) + : quads + ); + +export default transformer; diff --git a/src/lib/riw/db/transform/dbFromQuadAr.js b/src/lib/riw/db/transform/dbFromQuadAr.js new file mode 100644 index 0000000..20d974a --- /dev/null +++ b/src/lib/riw/db/transform/dbFromQuadAr.js @@ -0,0 +1,20 @@ +// @flow + +import reduce from 'ramda/src/reduce'; +import assocPath from 'ramda/src/assocPath'; + +import type { TranslationQuad } from '../../../../types'; +import type { TranslationsDB } from '../'; +import dbEmpty from '../meta/dbEmpty'; + +const unquadify = reduce( + (acc, quad) => assocPath(quad.slice(0, 3), quad[3], acc), + {}, +); + +const fromQuads = (quads: TranslationQuad[]): TranslationsDB => ({ + ...dbEmpty, + data: unquadify(quads), +}); + +export default fromQuads; diff --git a/src/lib/riw/db/update.js b/src/lib/riw/db/update.js new file mode 100644 index 0000000..a5b7c83 --- /dev/null +++ b/src/lib/riw/db/update.js @@ -0,0 +1,26 @@ +// @flow + +import compose from 'ramda/src/compose'; + +import type { + TranslatedMessageDescriptor, +} from '../../../types'; +import type { Config } from '../../config'; + +import dbRead from './rw/dbRead'; +import writeFromDB from './rw/writeFromDB'; +import arquadFromDB from './transform/arquadFromDB'; +import dbFromQuadAr from './transform/dbFromQuadAr'; +import arquadUpdateFromQuadAr from './transform/arquadUpdateFromQuadAr'; + +export type DBUpdateSpec = { + translations: TranslatedMessageDescriptor[], +}; + +export default (config: Config) => (opt?: DBUpdateSpec) => compose( + writeFromDB(config), + dbFromQuadAr, + arquadUpdateFromQuadAr(opt), + arquadFromDB, + dbRead(config), +)(); diff --git a/src/lib/riw/db/util/__tests__/makeQuadMatcher.test.js b/src/lib/riw/db/util/__tests__/makeQuadMatcher.test.js new file mode 100644 index 0000000..a7051ce --- /dev/null +++ b/src/lib/riw/db/util/__tests__/makeQuadMatcher.test.js @@ -0,0 +1,107 @@ +// @flow + +import type { TranslationQuad } from '../../../../../types'; +import type { TranslationMatchSpec } from '../makeQuadMatcher'; +import makeQuadMatcher from '../makeQuadMatcher'; + +type Fixture = { + name: string, + in: TranslationQuad, + match: TranslationMatchSpec, + out: boolean, +}; + +const fixtures: Fixture[] = [ + { + name: '01', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + defaultMessage: 'one', + }, + out: true, + }, + { + name: '02', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + defaultMessage: 'two', + }, + out: false, + }, + { + name: '03', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + description: 'desc one', + }, + out: true, + }, + { + name: '04', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + description: 'one', + }, + out: false, + }, + { + name: '05', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + locale: 'aa-bb', + }, + out: true, + }, + { + name: '06', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + locale: 'aa-bb-cc', + }, + out: false, + }, + { + name: '07', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + translation: '[aa-bb] one', + }, + out: true, + }, + { + name: '08', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + translation: 'aa', + }, + out: false, + }, + { + name: '09', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + defaultMessage: 'one', + locale: 'aa-bb', + }, + out: true, + }, + { + name: '10', + in: ['one', 'desc one', 'aa-bb', '[aa-bb] one'], + match: { + defaultMessage: 'two', + locale: 'aa-bb', + }, + out: false, + }, +]; + +describe('lib/riw/db/transform/util/makeQuadMatcher', () => { + fixtures.forEach((fixture) => { + it(fixture.name, () => { + const received = makeQuadMatcher(fixture.match)(fixture.in); + + expect(received).toEqual(fixture.out); + }); + }); +}); diff --git a/src/lib/riw/db/util/makeQuadMatcher.js b/src/lib/riw/db/util/makeQuadMatcher.js new file mode 100644 index 0000000..7705d83 --- /dev/null +++ b/src/lib/riw/db/util/makeQuadMatcher.js @@ -0,0 +1,23 @@ +// @flow + +import type { + LocaleId, + DefaultMessage, + Description, + TranslatedMessage, + TranslationQuad, +} from '../../../../types'; + +export type TranslationMatchSpec = { + defaultMessage?: DefaultMessage, + description?: Description, + locale?: LocaleId, + translation?: TranslatedMessage, +}; + +export default (match: TranslationMatchSpec) => (quad: TranslationQuad): boolean => ( + (!match.defaultMessage || quad[0] === match.defaultMessage) && + (!match.description || quad[1] === match.description) && + (!match.locale || quad[2] === match.locale) && + (!match.translation || quad[3] === match.translation) +); diff --git a/src/lib/riw/index.js b/src/lib/riw/index.js new file mode 100644 index 0000000..62817dd --- /dev/null +++ b/src/lib/riw/index.js @@ -0,0 +1,47 @@ +// @flow + +import type { Config } from '../config'; + +import type { + DB, + TranslationsDB, + DBListSpec, + DBStatusResult, + DBUpdateSpec, +} from './db'; +import type { + AppStatusResult, + AppTranslateSpec, + AppTranslateResult, + TranslationLookupResult, + DuplicateIdData, + App, +} from './app'; +import db from './db'; +import app from './app'; + +export type RIW = {| + config: Config, + db: DB, + app: App, +|}; + +export type { + AppStatusResult, + AppTranslateSpec, + AppTranslateResult, + TranslationLookupResult, + DuplicateIdData, + TranslationsDB, + DBListSpec, + DBStatusResult, + DBUpdateSpec, +}; + +export const sDescriptionDefault = '_'; + +export const riwFromConfig = (config: Config): RIW => ({ + config, + db: db(config), + app: app(config), +}); diff --git a/src/types.js b/src/types.js new file mode 100644 index 0000000..e20457a --- /dev/null +++ b/src/types.js @@ -0,0 +1,42 @@ +// @flow +// types without a more natural home + +export type AbsolutePath = string; +export type RelativePath = string; +export type Glob = string; +export type LocaleId = string; + +export type Path = AbsolutePath | RelativePath; + +export type MessageId = string; +export type DefaultMessage = string; +export type Description = string; +export type TranslatedMessage = string; + +export type DefaultPair = [DefaultMessage, Description]; +export type TranslationQuad = [DefaultMessage, Description, LocaleId, TranslatedMessage]; + +// corresponds to react-intl's message descriptor, with mandatory defaultMessage +// (supporting only string descriptions for now) +export type MessageDescriptor = { + id: MessageId, + defaultMessage: DefaultMessage, + description?: Description, +}; + +export type MessageDescriptorWithFile = MessageDescriptor & { + file: AbsolutePath, +}; + +export type UntranslatedMessageDescriptor = MessageDescriptor & { + locale: LocaleId, +}; + +// NOT an intersection with MessageDescriptor, as translations don't require the id. +// (the translations database doesn't use message descriptor ids at all.) +export type TranslatedMessageDescriptor = { + defaultMessage: DefaultMessage, + description?: Description, + locale: LocaleId, + translation: TranslatedMessage, +}; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..0ebe110 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4353 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +JSONStream@^1.0.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.0.tgz#680ab9ac6572a8a1a207e0b38721db1c77b215e5" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" + +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + +acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@4.0.4, acorn@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^1.1.0, ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.0.0.tgz#5404e93a544c4fec7f048262977bebfe3155e0c1" + dependencies: + color-convert "^1.0.0" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +aria-query@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.3.0.tgz#cb8a9984e2862711c83c80ade5b8f5ca0de2b467" + dependencies: + ast-types-flow "0.0.7" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array.prototype.find@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.0.tgz#56a9ab1edde2a7701ed6d9166acec338919d8430" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + +array.prototype.find@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.3.tgz#08c3ec33e32ec4bab362a2958e686ae92f59271d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^1.4.0, async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + dependencies: + lodash "^4.14.0" + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + +babel-cli@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.0.tgz#a05ffd210dca0c288a26d5319c5ac8669a265ad0" + dependencies: + babel-core "^6.24.0" + babel-polyfill "^6.23.0" + babel-register "^6.24.0" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.0, babel-core@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.0.tgz#8f36a0a77f5c155aed6f920b844d23ba56742a02" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.0" + babel-helpers "^6.23.0" + babel-messages "^6.23.0" + babel-register "^6.24.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-eslint@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.0.tgz#8941514b9dead06f0df71b29d5d5b193a92ee0ae" + dependencies: + babel-code-frame "^6.22.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.16.1" + lodash "^4.17.4" + +babel-generator@^6.18.0, babel-generator@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.22.0.tgz#29df56be144d81bdeac08262bfa41d2c5e91cdcd" + dependencies: + babel-helper-explode-assignable-expression "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-helper-call-delegate@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef" + dependencies: + babel-helper-hoist-variables "^6.22.0" + babel-runtime "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-define-map@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7" + dependencies: + babel-helper-function-name "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.22.0.tgz#c97bf76eed3e0bae4048121f2b9dae1a4e7d0478" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz#25742d67175c8903dbe4b6cb9d9e1fcb8dcf23a6" + dependencies: + babel-helper-get-function-arity "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-helper-get-function-arity@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz#0beb464ad69dc7347410ac6ade9f03a50634f5ce" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-helper-hoist-variables@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-helper-optimise-call-expression@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.23.0" + +babel-helper-regex@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.22.0.tgz#2186ae73278ed03b8b15ced089609da981053383" + dependencies: + babel-helper-function-name "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd" + dependencies: + babel-helper-optimise-call-expression "^6.23.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-helpers@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.23.0" + +babel-jest@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-19.0.0.tgz#59323ced99a3a84d359da219ca881074ffc6ce3f" + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^19.0.0" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-inline-package-json@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-inline-package-json/-/babel-plugin-inline-package-json-2.0.0.tgz#1f9558d96667f4b8787e807d764e6e15b4f0cd07" + +babel-plugin-istanbul@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.0.0.tgz#36bde8fbef4837e5ff0366531a2beabd7b1ffa10" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.4.2" + test-exclude "^4.0.0" + +babel-plugin-jest-hoist@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-19.0.0.tgz#4ae2a04ea612a6e73651f3fde52c178991304bea" + +babel-plugin-react-intl@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-react-intl/-/babel-plugin-react-intl-2.3.1.tgz#3d43912e824da005e08e8e8239d5ba784374bb00" + dependencies: + babel-runtime "^6.2.0" + intl-messageformat-parser "^1.2.0" + mkdirp "^0.5.1" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.22.0.tgz#194b6938ec195ad36efc4c33a971acf00d8cd35e" + dependencies: + babel-helper-remap-async-to-generator "^6.22.0" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1" + dependencies: + babel-helper-define-map "^6.23.0" + babel-helper-function-name "^6.23.0" + babel-helper-optimise-call-expression "^6.23.0" + babel-helper-replace-supers "^6.23.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.22.0" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104" + dependencies: + babel-helper-function-name "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz#bf69cd34889a41c33d90dfb740e0091ccff52f21" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz#a1911fb9b7ec7e05a43a63c5995007557bcf6a2e" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.22.0, babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz#e921aefb72c2cc26cb03d107626156413222134f" + dependencies: + babel-plugin-transform-strict-mode "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-types "^6.23.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0" + dependencies: + babel-helper-hoist-variables "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz#fd5fa63521cae8d273927c3958afd7c067733450" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc" + dependencies: + babel-helper-replace-supers "^6.22.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b" + dependencies: + babel-helper-call-delegate "^6.22.0" + babel-helper-get-function-arity "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593" + dependencies: + babel-helper-regex "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20" + dependencies: + babel-helper-regex "^6.22.0" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.22.0.tgz#d57c8335281918e54ef053118ce6eb108468084d" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.22.0" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6" + dependencies: + regenerator-transform "0.9.8" + +babel-plugin-transform-runtime@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-polyfill@^6.23.0, babel-polyfill@^6.6.1: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-env@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.2.2.tgz#1dbc4d7f8a575691d301f45fa9b2f9698b1e3b92" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^1.4.0" + electron-to-chromium "^1.2.6" + invariant "^2.2.2" + +babel-preset-jest@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-19.0.0.tgz#22d67201d02324a195811288eb38294bb3cac396" + dependencies: + babel-plugin-jest-hoist "^19.0.0" + +babel-register@^6.24.0: + version "6.24.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.0.tgz#5e89f8463ba9970356d02eb07dabe3308b080cfd" + dependencies: + babel-core "^6.24.0" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.11.6: + version "6.11.6" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.9.5" + +babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e" + +babylon@^6.16.1: + version "6.16.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +bcrypt-pbkdf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.1.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browserslist@^1.4.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.1.tgz#cc9bd193979a2a4b09fdb3df6003fefe48ccefe1" + dependencies: + caniuse-db "^1.0.30000617" + electron-to-chromium "^1.2.1" + +bser@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" + dependencies: + node-int64 "^0.4.0" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0, camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +caniuse-db@^1.0.30000617: + version "1.0.30000618" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000618.tgz#821258ff484f662864f28ffbcf849a6247acf1fa" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + +chokidar@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +circular-json@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.0.0.tgz#ef987ed3d48391ac3dab9180b406a742180d6e6a" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.0.3, cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + +colors@^1.0.3, colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" + +commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +common-tags@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0" + dependencies: + babel-runtime "^6.18.0" + +compare-func@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.10, concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concurrently@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.4.0.tgz#60662b3defde07375bae19aac0ab780ec748ba79" + dependencies: + chalk "0.5.1" + commander "2.6.0" + date-fns "^1.23.0" + lodash "^4.5.1" + rx "2.3.24" + spawn-command "^0.0.2-1" + supports-color "^3.2.3" + tree-kill "^1.1.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + +conventional-changelog-angular@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.0.tgz#3f64185978aa13ab0954c9e46a78969fd59c6801" + dependencies: + compare-func "^1.3.1" + github-url-from-git "^1.4.0" + q "^1.4.1" + +conventional-changelog-atom@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.0.tgz#67a47c66a42b2f8909ef1587c9989ae1de730b92" + dependencies: + q "^1.4.1" + +conventional-changelog-codemirror@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.1.0.tgz#7577a591dbf9b538e7a150a7ee62f65a2872b334" + dependencies: + q "^1.4.1" + +conventional-changelog-core@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.5.0.tgz#72b17509535a23d7c6cb70ad4384f74247748013" + dependencies: + conventional-changelog-writer "^1.1.0" + conventional-commits-parser "^1.0.0" + dateformat "^1.0.12" + get-pkg-repo "^1.0.0" + git-raw-commits "^1.1.0" + git-remote-origin-url "^2.0.0" + git-semver-tags "^1.1.0" + lodash "^4.0.0" + normalize-package-data "^2.3.5" + q "^1.4.1" + read-pkg "^1.1.0" + read-pkg-up "^1.0.1" + through2 "^2.0.0" + +conventional-changelog-ember@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.2.tgz#bad70a891386bc3046484a8f4f1e5aa2dc0ad208" + dependencies: + q "^1.4.1" + +conventional-changelog-eslint@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.1.0.tgz#a52411e999e0501ce500b856b0a643d0330907e2" + dependencies: + q "^1.4.1" + +conventional-changelog-express@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.1.0.tgz#55c6c841c811962036c037bdbd964a54ae310fce" + dependencies: + q "^1.4.1" + +conventional-changelog-jquery@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" + dependencies: + q "^1.4.1" + +conventional-changelog-jscs@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" + dependencies: + q "^1.4.1" + +conventional-changelog-jshint@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.1.0.tgz#00cab8e9a3317487abd94c4d84671342918d2a07" + dependencies: + compare-func "^1.3.1" + q "^1.4.1" + +conventional-changelog-writer@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-1.4.1.tgz#3f4cb4d003ebb56989d30d345893b52a43639c8e" + dependencies: + compare-func "^1.3.1" + conventional-commits-filter "^1.0.0" + dateformat "^1.0.11" + handlebars "^4.0.2" + json-stringify-safe "^5.0.1" + lodash "^4.0.0" + meow "^3.3.0" + semver "^5.0.1" + split "^1.0.0" + through2 "^2.0.0" + +conventional-changelog@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.0.tgz#8ae3fb59feb74bbee0a25833ee1f83dad4a07874" + dependencies: + conventional-changelog-angular "^1.0.0" + conventional-changelog-atom "^0.1.0" + conventional-changelog-codemirror "^0.1.0" + conventional-changelog-core "^1.3.0" + conventional-changelog-ember "^0.2.0" + conventional-changelog-eslint "^0.1.0" + conventional-changelog-express "^0.1.0" + conventional-changelog-jquery "^0.1.0" + conventional-changelog-jscs "^0.1.0" + conventional-changelog-jshint "^0.1.0" + +conventional-commits-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz#6fc2a659372bc3f2339cf9ffff7e1b0344b93039" + dependencies: + is-subset "^0.1.1" + modify-values "^1.0.0" + +conventional-commits-parser@^1.0.0, conventional-commits-parser@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz#e327b53194e1a7ad5dc63479ee9099a52b024865" + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.0" + lodash "^4.2.1" + meow "^3.3.0" + split2 "^2.0.0" + through2 "^2.0.0" + trim-off-newlines "^1.0.0" + +conventional-recommended-bump@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-0.3.0.tgz#e839de8f57cbb43445c8b4967401de0644c425d8" + dependencies: + concat-stream "^1.4.10" + conventional-commits-filter "^1.0.0" + conventional-commits-parser "^1.0.1" + git-latest-semver-tag "^1.0.0" + git-raw-commits "^1.0.0" + meow "^3.3.0" + object-assign "^4.0.1" + +convert-source-map@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" + +damerau-levenshtein@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz#ae4f4ce0b62acae10ff63a01bb08f652f5213af2" + +dargs@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + dependencies: + number-is-nan "^1.0.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-fns@^1.23.0: + version "1.27.2" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.27.2.tgz#ce82f420bc028356cc661fc55c0494a56a990c9c" + +dateformat@^1.0.11, dateformat@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +doctrine@1.5.0, doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + dependencies: + is-obj "^1.0.0" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +eastasianwidth@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.1.1.tgz#44d656de9da415694467335365fb3147b8572b7c" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +electron-to-chromium@^1.2.1, electron-to-chromium@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.2.7.tgz#4f748061407e478c76256d04496972b71f647407" + +emoji-regex@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.0.tgz#d14ef743a7dfa6eaf436882bd1920a4aed84dd94" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.5.0, es-abstract@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.0" + is-callable "^1.1.3" + is-regex "^1.0.3" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: + version "0.10.12" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" + dependencies: + d "^0.1.1" + es5-ext "^0.10.7" + es6-symbol "3" + +es6-map@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-set "~0.1.3" + es6-symbol "~3.1.0" + event-emitter "~0.3.4" + +es6-set@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-symbol "3" + event-emitter "~0.3.4" + +es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + +es6-weak-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" + dependencies: + d "^0.1.1" + es5-ext "^0.10.8" + es6-iterator "2" + es6-symbol "3" + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-airbnb-base@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.1.0.tgz#dc9b3ec70b8c74dcbe6d6257c9da3992c39ca2ca" + +eslint-config-airbnb@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-14.1.0.tgz#355d290040bbf8e00bf8b4b19f4b70cbe7c2317f" + dependencies: + eslint-config-airbnb-base "^11.1.0" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-module-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" + dependencies: + debug "2.2.0" + pkg-dir "^1.0.0" + +eslint-plugin-flowtype@^2.30.3: + version "2.30.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.30.3.tgz#57835d2c0ed388da7a2725803ec32af2f437c301" + dependencies: + lodash "^4.15.0" + +eslint-plugin-import@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.5.0" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + pkg-up "^1.0.0" + +eslint-plugin-jest@^19.0.1: + version "19.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-19.0.1.tgz#42a420e90e81aa74e162c16166e43a31b890eece" + +eslint-plugin-jsx-a11y@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-4.0.0.tgz#779bb0fe7b08da564a422624911de10061e048ee" + dependencies: + aria-query "^0.3.0" + ast-types-flow "0.0.7" + damerau-levenshtein "^1.0.0" + emoji-regex "^6.1.0" + jsx-ast-utils "^1.0.0" + object-assign "^4.0.1" + +eslint-plugin-react@^6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" + dependencies: + array.prototype.find "^2.0.1" + doctrine "^1.2.2" + has "^1.0.1" + jsx-ast-utils "^1.3.4" + object.assign "^4.0.4" + +eslint@^3.18.0: + version "3.18.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.18.0.tgz#647e985c4ae71502d20ac62c109f66d5104c8a4b" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d" + dependencies: + acorn "4.0.4" + acorn-jsx "^3.0.0" + +esprima@^2.6.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-emitter@~0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.7" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +exec-sh@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" + dependencies: + merge "^1.1.3" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fb-watchman@^1.8.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" + dependencies: + bser "1.0.2" + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + +fbjs@^0.8.4: + version "0.8.9" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.9.tgz#180247fbd347dcc9004517b904f865400a0c8f14" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + +figures@^1.3.5, figures@^1.5.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flow-bin@^0.42.0: + version "0.42.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.42.0.tgz#05dd754b6b052de7b150f9210e2160746961e3cf" + +flow-copy-source@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/flow-copy-source/-/flow-copy-source-1.1.0.tgz#0779692ff81693d304021b2d49753898a0772237" + dependencies: + fs-extra "^0.26.5" + glob "^7.0.0" + kefir "^3.2.0" + yargs "^3.32.0" + +flow-coverage-report@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/flow-coverage-report/-/flow-coverage-report-0.3.0.tgz#a22d52fc9fa9c24ae0be02712a6fe1ac156f0d93" + dependencies: + array.prototype.find "2.0.0" + babel-runtime "6.11.6" + glob "7.0.5" + minimatch "3.0.3" + mkdirp "0.5.1" + parse-json "2.2.0" + react "15.3.1" + react-dom "15.3.1" + strip-json-comments "2.0.1" + temp "0.8.3" + terminal-table "0.0.12" + yargs "5.0.0" + +flow-typed@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.0.0.tgz#b15cfb9b2b4419ab521665f84fa30d9ba646fb33" + dependencies: + babel-polyfill "^6.6.1" + colors "^1.1.2" + github "^0.2.4" + glob "^7.0.6" + lodash "^4.11.2" + md5 "^2.1.0" + mkdirp "^0.5.1" + request "^2.69.0" + rx-lite "4.0.8" + semver "^5.1.0" + table "3.7.8" + through "^2.3.8" + which "^1.2.11" + yargs "^4.2.0" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" + +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + dependencies: + null-check "^1.0.0" + +fs-extra@^0.26.5: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.17" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +gauge@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + supports-color "^0.2.0" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-pkg-repo@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.3.0.tgz#43c6b4c048b75dd604fc5388edecde557f6335df" + dependencies: + hosted-git-info "^2.1.4" + meow "^3.3.0" + normalize-package-data "^2.3.0" + parse-github-repo-url "^1.3.0" + through2 "^2.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +git-latest-semver-tag@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/git-latest-semver-tag/-/git-latest-semver-tag-1.0.2.tgz#061130cbf4274111cc6be4612b3ff3a6d93e2660" + dependencies: + git-semver-tags "^1.1.2" + meow "^3.3.0" + +git-raw-commits@^1.0.0, git-raw-commits@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.1.2.tgz#a12d8492aeba2881802d700825ed81c9f39e6f2f" + dependencies: + dargs "^4.0.1" + lodash.template "^4.0.2" + meow "^3.3.0" + split2 "^2.0.0" + through2 "^2.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^1.1.0, git-semver-tags@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.1.2.tgz#aecf9b1b2447a6b548d48647f53edba0acad879f" + dependencies: + meow "^3.3.0" + semver "^5.0.1" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + dependencies: + ini "^1.3.2" + +github-url-from-git@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" + +github@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/github/-/github-0.2.4.tgz#24fa7f0e13fa11b946af91134c51982a91ce538b" + dependencies: + mime "^1.2.11" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0, globals@^9.14.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +handlebars@^4.0.2, handlebars@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.13, iconv-lite@~0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +ignore@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.2.tgz#1c51e1ef53bab6ddc15db4d9ac4ec139eceb3410" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.3.2, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" + +intl-messageformat-parser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.2.0.tgz#5906b7f953ab7470e0dc8549097b648b991892ff" + +invariant@^2.2.0, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2, is-buffer@~1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-regex@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-text-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + dependencies: + text-extensions "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-api@^1.1.0-alpha.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.1.tgz#d36e2f1560d1a43ce304c4ff7338182de61c8f73" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-hook "^1.0.0" + istanbul-lib-instrument "^1.3.0" + istanbul-lib-report "^1.0.0-alpha.3" + istanbul-lib-source-maps "^1.1.0" + istanbul-reports "^1.0.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212" + +istanbul-lib-hook@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0.tgz#fc5367ee27f59268e8f060b0c7aaf051d9c425c5" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.3.0, istanbul-lib-instrument@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.4.2.tgz#0e2fdfac93c1dabf2e31578637dc78a19089f43e" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.0" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0-alpha.3: + version "1.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" + dependencies: + async "^1.4.2" + istanbul-lib-coverage "^1.0.0-alpha" + mkdirp "^0.5.1" + path-parse "^1.0.5" + rimraf "^2.4.3" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" + dependencies: + istanbul-lib-coverage "^1.0.0-alpha.0" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.1.tgz#9a17176bc4a6cbebdae52b2f15961d52fa623fbc" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-19.0.2.tgz#16c54c84c3270be408e06d2e8af3f3e37a885824" + +jest-cli@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-19.0.2.tgz#cc3620b62acac5f2d93a548cb6ef697d4ec85443" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^19.0.2" + jest-config "^19.0.2" + jest-environment-jsdom "^19.0.2" + jest-haste-map "^19.0.0" + jest-jasmine2 "^19.0.2" + jest-message-util "^19.0.0" + jest-regex-util "^19.0.0" + jest-resolve-dependencies "^19.0.0" + jest-runtime "^19.0.2" + jest-snapshot "^19.0.2" + jest-util "^19.0.2" + micromatch "^2.3.11" + node-notifier "^5.0.1" + slash "^1.0.0" + string-length "^1.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + +jest-config@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-19.0.2.tgz#1b9bd2db0ddd16df61c2b10a54009e1768da6411" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^19.0.2" + jest-environment-node "^19.0.2" + jest-jasmine2 "^19.0.2" + jest-regex-util "^19.0.0" + jest-resolve "^19.0.2" + jest-validate "^19.0.2" + pretty-format "^19.0.0" + +jest-diff@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-19.0.0.tgz#d1563cfc56c8b60232988fbc05d4d16ed90f063c" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^19.0.0" + pretty-format "^19.0.0" + +jest-environment-jsdom@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-19.0.2.tgz#ceda859c4a4b94ab35e4de7dab54b926f293e4a3" + dependencies: + jest-mock "^19.0.0" + jest-util "^19.0.2" + jsdom "^9.11.0" + +jest-environment-node@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-19.0.2.tgz#6e84079db87ed21d0c05e1f9669f207b116fe99b" + dependencies: + jest-mock "^19.0.0" + jest-util "^19.0.2" + +jest-file-exists@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-19.0.0.tgz#cca2e587a11ec92e24cfeab3f8a94d657f3fceb8" + +jest-haste-map@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-19.0.0.tgz#adde00b62b1fe04432a104b3254fc5004514b55e" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.5.0" + worker-farm "^1.3.1" + +jest-jasmine2@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-19.0.2.tgz#167991ac825981fb1a800af126e83afcca832c73" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^19.0.0" + jest-matchers "^19.0.0" + jest-message-util "^19.0.0" + jest-snapshot "^19.0.2" + +jest-matcher-utils@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz#5ecd9b63565d2b001f61fbf7ec4c7f537964564d" + dependencies: + chalk "^1.1.3" + pretty-format "^19.0.0" + +jest-matchers@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-19.0.0.tgz#c74ecc6ebfec06f384767ba4d6fa4a42d6755754" + dependencies: + jest-diff "^19.0.0" + jest-matcher-utils "^19.0.0" + jest-message-util "^19.0.0" + jest-regex-util "^19.0.0" + +jest-message-util@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-19.0.0.tgz#721796b89c0e4d761606f9ba8cb828a3b6246416" + dependencies: + chalk "^1.1.1" + micromatch "^2.3.11" + +jest-mock@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-19.0.0.tgz#67038641e9607ab2ce08ec4a8cb83aabbc899d01" + +jest-regex-util@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-19.0.0.tgz#b7754587112aede1456510bb1f6afe74ef598691" + +jest-resolve-dependencies@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-19.0.0.tgz#a741ad1fa094140e64ecf2642a504f834ece22ee" + dependencies: + jest-file-exists "^19.0.0" + +jest-resolve@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-19.0.2.tgz#5793575de4f07aec32f7d7ff0c6c181963eefb3c" + dependencies: + browser-resolve "^1.11.2" + jest-haste-map "^19.0.0" + resolve "^1.2.0" + +jest-runtime@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-19.0.2.tgz#d9a43e72de416d27d196fd9c7940d98fe6685407" + dependencies: + babel-core "^6.0.0" + babel-jest "^19.0.0" + babel-plugin-istanbul "^4.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^19.0.2" + jest-file-exists "^19.0.0" + jest-haste-map "^19.0.0" + jest-regex-util "^19.0.0" + jest-resolve "^19.0.2" + jest-util "^19.0.2" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + strip-bom "3.0.0" + yargs "^6.3.0" + +jest-snapshot@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-19.0.2.tgz#9c1b216214f7187c38bfd5c70b1efab16b0ff50b" + dependencies: + chalk "^1.1.3" + jest-diff "^19.0.0" + jest-file-exists "^19.0.0" + jest-matcher-utils "^19.0.0" + jest-util "^19.0.2" + natural-compare "^1.4.0" + pretty-format "^19.0.0" + +jest-util@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-19.0.2.tgz#e0a0232a2ab9e6b2b53668bdb3534c2b5977ed41" + dependencies: + chalk "^1.1.1" + graceful-fs "^4.1.6" + jest-file-exists "^19.0.0" + jest-message-util "^19.0.0" + jest-mock "^19.0.0" + jest-validate "^19.0.2" + leven "^2.0.0" + mkdirp "^0.5.1" + +jest-validate@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-19.0.2.tgz#dc534df5f1278d5b63df32b14241d4dbf7244c0c" + dependencies: + chalk "^1.1.1" + jest-matcher-utils "^19.0.0" + leven "^2.0.0" + pretty-format "^19.0.0" + +jest@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-19.0.2.tgz#b794faaf8ff461e7388f28beef559a54f20b2c10" + dependencies: + jest-cli "^19.0.2" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@^3.5.1, js-yaml@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsdom@^9.11.0: + version "9.11.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.11.0.tgz#a95b0304e521a2ca5a63c6ea47bf7708a7a84591" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonparse@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.5.tgz#9ba6297198d9f754594d62e59496ffb923778dd4" + dependencies: + acorn-jsx "^3.0.1" + object-assign "^4.1.0" + +kefir@^3.2.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/kefir/-/kefir-3.7.1.tgz#e77f56feeec46f4a2ee2997e5c3226e904877b5b" + dependencies: + symbol-observable "^1.0.1" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +leven@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.1.0, lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.template@^4.0.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash@^4.0.0, lodash@^4.11.2, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0, loose-envify@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + +manage-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/manage-path/-/manage-path-2.0.0.tgz#f4cf8457b926eeee2a83b173501414bc76eb9597" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +mime-db@~1.26.0: + version "1.26.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" + +mime-types@^2.1.12, mime-types@~2.1.7: + version "2.1.14" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" + dependencies: + mime-db "~1.26.0" + +mime@^1.2.11: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimatch@3.0.3, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mock-fs@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.2.0.tgz#ef53ae17b77e64f67816dd0467f29208a3b26e19" + +modify-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@^2.3.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +node-fetch@^1.0.1: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.0.2.tgz#4438449fe69e321f941cef943986b0797032701b" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + +node-pre-gyp@^0.6.29: + version "0.6.32" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.1" + rc "~1.1.6" + request "^2.79.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +nps@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/nps/-/nps-5.0.4.tgz#40336e7c689b17ba82a03d75c5293c165a1368ec" + dependencies: + arrify "^1.0.1" + chalk "^1.1.3" + common-tags "^1.4.0" + find-up "^2.1.0" + js-yaml "^3.7.0" + lodash "^4.17.4" + manage-path "^2.0.0" + prefix-matches "^0.0.9" + readline-sync "^1.4.6" + spawn-command-with-kill "^1.0.0" + type-detect "^4.0.0" + yargs "^6.6.0" + +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.3.9" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-keys@^1.0.10, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object.assign@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.0" + object-keys "^1.0.10" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +onetime@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.0.tgz#52aa8110e52fc5126ffc667bd8ec21c2ed209ce6" + dependencies: + mimic-fn "^1.0.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +ora@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.1.0.tgz#69aaa4a209630e43b142c5f7ff41820da87e2faf" + dependencies: + chalk "^1.1.1" + cli-cursor "^2.1.0" + cli-spinners "^1.0.0" + log-symbols "^1.0.2" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +outdent@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.3.0.tgz#fad18a9c061a0938f38e8071d16c4024423f4323" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +parse-github-repo-url@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.3.0.tgz#d4de02d68e2e60f0d6a182e7a8cb21b6f38c730b" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@2.2.0, parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +prefix-matches@^0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/prefix-matches/-/prefix-matches-0.0.9.tgz#5887019e2b9566b38917f7529b6ce0fc2c72d68c" + dependencies: + is-object "^1.0.1" + starts-with "^1.0.2" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-format@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-19.0.0.tgz#56530d32acb98a3fa4851c4e2b9d37b420684c84" + dependencies: + ansi-styles "^3.0.0" + +private@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" + dependencies: + asap "~2.0.3" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +ps-tree@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +ramda@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.23.0.tgz#ccd13fff73497a93974e3e86327bfd87bd6e8e2b" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +react-dom@15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.3.1.tgz#6d42cd2b64c8c5e0b693f3ffaec301e6e627e24e" + +react@15.3.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-15.3.1.tgz#f78501ed8c2ec6e6e31c3223652e97f1369d2bd6" + dependencies: + fbjs "^0.8.4" + loose-envify "^1.1.0" + object-assign "^4.1.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0, read-pkg@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline-sync@^1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.6.tgz#87fdacf3a15c50ee88750251b14dc5a531c59118" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" + +regenerator-runtime@^0.9.5: + version "0.9.6" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" + +regenerator-transform@0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@^2.69.0, request@^2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6, resolve@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +rx-lite@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +rx@2.3.24: + version "2.3.24" + resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" + +sane@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.5.0.tgz#a4adeae764d048621ecb27d5f9ecf513101939f3" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + +sax@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +shelljs@^0.7.5: + version "0.7.6" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-map-support@^0.4.2: + version "0.4.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322" + dependencies: + source-map "^0.5.3" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spawn-command-with-kill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/spawn-command-with-kill/-/spawn-command-with-kill-1.0.0.tgz#803ad79f2f56e44dd926183768aac2faec7d0ce6" + dependencies: + ps-tree "^1.1.0" + spawn-command "^0.0.2-1" + +spawn-command@^0.0.2-1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split2@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" + dependencies: + through2 "^2.0.2" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +split@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +standard-version@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-4.0.0.tgz#e578cefd43ab7b02944bd7569525052eac1b9787" + dependencies: + chalk "^1.1.3" + conventional-changelog "^1.1.0" + conventional-recommended-bump "^0.3.0" + figures "^1.5.0" + fs-access "^1.0.0" + object-assign "^4.1.0" + semver "^5.1.0" + yargs "^6.0.0" + +starts-with@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/starts-with/-/starts-with-1.0.2.tgz#16793a729d89d4cf3d4fb2eda2f908ae357f196f" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +string-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2, supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +symbol-observable@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +table@3.7.8, table@^3.7.8: + version "3.7.8" + resolved "https://registry.yarnpkg.com/table/-/table-3.7.8.tgz#b424433ef596851922b2fd77224a69a1951618eb" + dependencies: + bluebird "^3.1.1" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^1.0.1" + strip-ansi "^3.0.0" + tv4 "^1.2.7" + xregexp "^3.0.0" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +temp@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +terminal-table@0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/terminal-table/-/terminal-table-0.0.12.tgz#7b56d009aa6828dfdd10f11b654e79c062965fa2" + dependencies: + colors "^1.0.3" + eastasianwidth "^0.1.0" + +test-exclude@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.0.0.tgz#0ddc0100b8ae7e88b34eb4fd98a907e961991900" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +text-extensions@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" + +through2@^2.0.0, through2@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + +to-fast-properties@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +tough-cookie@^2.3.2, tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +tree-kill@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.1.0.tgz#c963dcf03722892ec59cba569e940b71954d1729" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tv4@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/tv4/-/tv4-1.2.7.tgz#bd29389afc73ade49ae5f48142b5d544bf68d120" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.0.tgz#62053883542a321f2f7b25746dc696478b18ff6b" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +ua-parser-js@^0.7.9: + version "0.7.12" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" + +uglify-js@^2.6: + version "2.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.10: + version "2.0.11" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" + +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + +whatwg-fetch@>=0.10.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.2.tgz#fe294d1d89e36c5be8b3195057f2e4bc74fc980e" + +whatwg-url@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.4.0.tgz#594f95781545c13934a62db40897c818cafa2e04" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@^1.1.1, which@^1.2.11, which@^1.2.12: + version "1.2.12" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" + dependencies: + isexe "^1.1.1" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xregexp@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-3.1.1.tgz#8ee18d75ef5c7cb3f9967f8d29414a6ca5b1a184" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + +yargs-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f" + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.1.0" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-5.0.0.tgz#3355144977d05757dbb86d6e38ec056123b3a66e" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.2.0" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^3.2.0" + +yargs@^3.32.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yargs@^4.2.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + +yargs@^6.0.0, yargs@^6.3.0, yargs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.0.2.tgz#115b97df1321823e8b8648e8968c782521221f67" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0"