From be9f6bed8336a6c923c97696d6e54e54c4e4dff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Pr=C3=A9vost?= Date: Mon, 4 Mar 2019 17:16:50 -0500 Subject: [PATCH] Add cli in the repo to truly become a MONOREPO :tada: --- cli/.eslintignore | 1 + cli/.eslintrc | 3 + cli/.gitignore | 6 + cli/LICENSE.md | 9 + cli/README.md | 173 + cli/bin/run | 4 + cli/bin/run.cmd | 3 + cli/examples/core/accent.json | 24 + cli/examples/core/core.rb | 49 + cli/examples/core/translations.json | 6 + cli/examples/ember/accent.json | 10 + cli/examples/ember/translations/en.json | 5 + cli/examples/ember/translations/fr.json | 5 + cli/examples/phoenix/accent.json | 10 + cli/examples/phoenix/priv/en/my-file.po | 6 + cli/examples/phoenix/priv/fr/my-file.po | 6 + cli/examples/rails-with-aigu/.aigu.yml | 2 + cli/examples/rails-with-aigu/Gemfile | 3 + cli/examples/rails-with-aigu/Gemfile.lock | 17 + cli/examples/rails-with-aigu/accent.json | 29 + .../config/locales/my_file.en.yml | 4 + .../config/locales/my_file.fr.yml | 4 + cli/examples/rails/accent.json | 10 + .../rails/config/locales/en/my_file.yml | 4 + .../rails/config/locales/fr/my_file.yml | 4 + cli/examples/react/accent.json | 10 + .../react/src/locales/accent/admin.json | 6 + .../react/src/locales/accent/common.json | 239 ++ cli/examples/react/src/locales/en/admin.json | 70 + cli/examples/react/src/locales/en/common.json | 239 ++ cli/examples/react/src/locales/fr/admin.json | 6 + cli/examples/react/src/locales/fr/common.json | 239 ++ cli/package-lock.json | 3641 +++++++++++++++++ cli/package.json | 73 + cli/src/base.ts | 41 + cli/src/commands/export.ts | 55 + cli/src/commands/jipt.ts | 57 + cli/src/commands/stats.ts | 18 + cli/src/commands/sync.ts | 149 + cli/src/index.ts | 1 + cli/src/services/config.ts | 41 + .../services/document-jipt-paths-fetcher.ts | 26 + cli/src/services/document-paths-fetcher.ts | 22 + cli/src/services/document.ts | 162 + .../services/formatters/commit-operation.ts | 55 + .../services/formatters/document-export.ts | 13 + cli/src/services/formatters/hook-runner.ts | 17 + .../formatters/project-add-translations.ts | 10 + cli/src/services/formatters/project-export.ts | 10 + cli/src/services/formatters/project-stats.ts | 84 + cli/src/services/formatters/project-sync.ts | 10 + cli/src/services/hook-runner.ts | 32 + cli/src/services/project-fetcher.ts | 65 + cli/src/services/tree.ts | 17 + cli/src/types/config.ts | 8 + cli/src/types/document-config.ts | 26 + cli/src/types/document-path.ts | 5 + cli/src/types/operation-response.ts | 4 + cli/src/types/operation.ts | 4 + cli/src/types/project.ts | 31 + cli/tsconfig.json | 29 + cli/tslint.json | 21 + 62 files changed, 5933 insertions(+) create mode 100644 cli/.eslintignore create mode 100644 cli/.eslintrc create mode 100644 cli/.gitignore create mode 100644 cli/LICENSE.md create mode 100644 cli/README.md create mode 100755 cli/bin/run create mode 100644 cli/bin/run.cmd create mode 100644 cli/examples/core/accent.json create mode 100644 cli/examples/core/core.rb create mode 100644 cli/examples/core/translations.json create mode 100644 cli/examples/ember/accent.json create mode 100644 cli/examples/ember/translations/en.json create mode 100644 cli/examples/ember/translations/fr.json create mode 100644 cli/examples/phoenix/accent.json create mode 100644 cli/examples/phoenix/priv/en/my-file.po create mode 100644 cli/examples/phoenix/priv/fr/my-file.po create mode 100644 cli/examples/rails-with-aigu/.aigu.yml create mode 100644 cli/examples/rails-with-aigu/Gemfile create mode 100644 cli/examples/rails-with-aigu/Gemfile.lock create mode 100644 cli/examples/rails-with-aigu/accent.json create mode 100644 cli/examples/rails-with-aigu/config/locales/my_file.en.yml create mode 100644 cli/examples/rails-with-aigu/config/locales/my_file.fr.yml create mode 100644 cli/examples/rails/accent.json create mode 100644 cli/examples/rails/config/locales/en/my_file.yml create mode 100644 cli/examples/rails/config/locales/fr/my_file.yml create mode 100644 cli/examples/react/accent.json create mode 100644 cli/examples/react/src/locales/accent/admin.json create mode 100644 cli/examples/react/src/locales/accent/common.json create mode 100644 cli/examples/react/src/locales/en/admin.json create mode 100644 cli/examples/react/src/locales/en/common.json create mode 100644 cli/examples/react/src/locales/fr/admin.json create mode 100644 cli/examples/react/src/locales/fr/common.json create mode 100644 cli/package-lock.json create mode 100644 cli/package.json create mode 100644 cli/src/base.ts create mode 100644 cli/src/commands/export.ts create mode 100644 cli/src/commands/jipt.ts create mode 100644 cli/src/commands/stats.ts create mode 100644 cli/src/commands/sync.ts create mode 100644 cli/src/index.ts create mode 100644 cli/src/services/config.ts create mode 100644 cli/src/services/document-jipt-paths-fetcher.ts create mode 100644 cli/src/services/document-paths-fetcher.ts create mode 100644 cli/src/services/document.ts create mode 100644 cli/src/services/formatters/commit-operation.ts create mode 100644 cli/src/services/formatters/document-export.ts create mode 100644 cli/src/services/formatters/hook-runner.ts create mode 100644 cli/src/services/formatters/project-add-translations.ts create mode 100644 cli/src/services/formatters/project-export.ts create mode 100644 cli/src/services/formatters/project-stats.ts create mode 100644 cli/src/services/formatters/project-sync.ts create mode 100644 cli/src/services/hook-runner.ts create mode 100644 cli/src/services/project-fetcher.ts create mode 100644 cli/src/services/tree.ts create mode 100644 cli/src/types/config.ts create mode 100644 cli/src/types/document-config.ts create mode 100644 cli/src/types/document-path.ts create mode 100644 cli/src/types/operation-response.ts create mode 100644 cli/src/types/operation.ts create mode 100644 cli/src/types/project.ts create mode 100644 cli/tsconfig.json create mode 100644 cli/tslint.json diff --git a/cli/.eslintignore b/cli/.eslintignore new file mode 100644 index 00000000..502167fa --- /dev/null +++ b/cli/.eslintignore @@ -0,0 +1 @@ +/lib diff --git a/cli/.eslintrc b/cli/.eslintrc new file mode 100644 index 00000000..e56091ba --- /dev/null +++ b/cli/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "oclif" +} diff --git a/cli/.gitignore b/cli/.gitignore new file mode 100644 index 00000000..e96166a1 --- /dev/null +++ b/cli/.gitignore @@ -0,0 +1,6 @@ +*-debug.log +*-error.log +.oclif.manifest.json +/lib +/node_modules +/tmp diff --git a/cli/LICENSE.md b/cli/LICENSE.md new file mode 100644 index 00000000..a64b5852 --- /dev/null +++ b/cli/LICENSE.md @@ -0,0 +1,9 @@ +Copyright (c) 2018, Mirego All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + Neither the name of the Mirego nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cli/README.md b/cli/README.md new file mode 100644 index 00000000..1c3d13a6 --- /dev/null +++ b/cli/README.md @@ -0,0 +1,173 @@ +Accent CLI +====== + +[![Version](https://img.shields.io/npm/v/accent-cli.svg)](https://npmjs.org/package/accent-cli) +[![Build Status](https://img.shields.io/travis/v/accent-cli.svg?branch=master)](https://travis-ci.com/mirego/accent-cli) + + +* [Usage](#usage) +* [Configuration](#configuration) +* [Commands](#commands) +* [License](#license) +* [About Mirego](#about-mirego) + + +# Usage + +```sh-session +$ npm install -g accent-cli +$ accent COMMAND +running command... +$ accent (-v|--version|version) +accent-cli/0.6.0 darwin-x64 node-v9.5.0 +$ accent --help [COMMAND] +USAGE + $ accent COMMAND +... +``` + + +# Configuration + +accent-cli reads from a `accent.json` file. The file should contain valid JSON representing the configuration of your project. + +## Example + +``` +{ + "apiUrl": "http://your.accent.instance", + "apiKey": "2nziVSaa8yUJxLkwoZA", + "files": [ + { + "language": "fr", + "format": "json", + "source": "localization/fr/*.json", + "target": "localization/%slug%/%original_file_name%.json", + "hooks": { + "afterSync": "touch sync-done.txt" + } + } + ] +} +``` + +## Document configuration + +Each operation section `sync` and `addTranslations` can contain the following object: + +- `language`: The identifier of the document’s language +- `format`: The format of the document +- `source`: The path of the document. This can contain glob pattern (See [the node glob library] used as a dependancy (https://github.com/isaacs/node-glob)) +- `target`: Path of the target languages +- `hooks`: List of hooks to be run + +## Hooks + +Here is a list of available hooks. Those are self-explanatory + +- `beforeSync` +- `afterSync` +- `beforeExport` +- `afterExport` + +# Commands + +* [`accent export`](#accent-export) +* [`accent help [COMMAND]`](#accent-help-command) +* [`accent jipt PSEUDOLANGUAGENAME`](#accent-jipt-pseudolanguagename) +* [`accent stats`](#accent-stats) +* [`accent sync`](#accent-sync) + +## `accent export` + +Export files from Accent and write them to your local filesystem + +``` +USAGE + $ accent export + +OPTIONS + --order-by=index|key-asc [default: index] Will be used in the export call as the order of the keys + +EXAMPLE + $ accent export +``` + +## `accent help [COMMAND]` + +display help for accent + +``` +USAGE + $ accent help [COMMAND] + +ARGUMENTS + COMMAND command to show help for + +OPTIONS + --all see all commands in CLI +``` + +_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v2.1.4/src/commands/help.ts)_ + +## `accent jipt PSEUDOLANGUAGENAME` + +Export jipt files from Accent and write them to your local filesystem + +``` +USAGE + $ accent jipt PSEUDOLANGUAGENAME + +ARGUMENTS + PSEUDOLANGUAGENAME The pseudo language for in-place-translation-editing + +EXAMPLE + $ accent jipt +``` + +## `accent stats` + +Fetch stats from the API and display it beautifully + +``` +USAGE + $ accent stats + +EXAMPLE + $ accent stats +``` + +## `accent sync` + +Sync files in Accent and write them to your local filesystem + +``` +USAGE + $ accent sync + +OPTIONS + --add-translations Add translations in Accent to help translators if you already have translated + strings + + --merge-type=smart|passive|force [default: smart] Will be used in the add translations call as the "merge_type" param + + --order-by=index|key-asc [default: index] Will be used in the export call as the order of the keys + + --sync-type=smart|passive [default: smart] Will be used in the sync call as the "sync_type" param + + --write Write the file from the export _after_ the operation + +EXAMPLE + $ accent sync +``` + + +# License + +`accent-cli` is © 2019 [Mirego](http://www.mirego.com) and may be freely distributed under the [New BSD license](http://opensource.org/licenses/BSD-3-Clause). See the [`LICENSE.md`](https://github.com/mirego/accent-cli/blob/master/LICENSE.md) file. + +# About Mirego + +[Mirego](http://mirego.com) is a team of passionate people who believe that work is a place where you can innovate and have fun. We’re a team of [talented people](http://life.mirego.com) who imagine and build beautiful Web and mobile applications. We come together to share ideas and [change the world](http://mirego.org). + +We also [love open-source software](http://open.mirego.com) and we try to give back to the community as much as we can. diff --git a/cli/bin/run b/cli/bin/run new file mode 100755 index 00000000..3c4ae3ac --- /dev/null +++ b/cli/bin/run @@ -0,0 +1,4 @@ +#!/usr/bin/env node + +require('@oclif/command').run() +.catch(require('@oclif/errors/handle')) diff --git a/cli/bin/run.cmd b/cli/bin/run.cmd new file mode 100644 index 00000000..968fc307 --- /dev/null +++ b/cli/bin/run.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\run" %* diff --git a/cli/examples/core/accent.json b/cli/examples/core/accent.json new file mode 100644 index 00000000..325fe5a2 --- /dev/null +++ b/cli/examples/core/accent.json @@ -0,0 +1,24 @@ +{ + "files": [ + { + "language": "fr", + "format": "json", + "source": "core/*.json", + "target": "core/%original_file_name%-%slug%.json", + "hooks": { + "beforeSync": [ + "rm -rf core", + "mkdir -p core", + "ruby core.rb unmerge translations.json fr > core/core-is-awesome.json" + ], + "beforeAddTranslations": [ + "ruby core.rb unmerge translations.json en > core/core-is-awesome-en.json" + ], + "afterExport": [ + "ruby core.rb merge core/core-is-awesome-en.json core/core-is-awesome-fr.json > translations.json", + "rm -rf core" + ] + } + } + ] +} diff --git a/cli/examples/core/core.rb b/cli/examples/core/core.rb new file mode 100644 index 00000000..147f6b4b --- /dev/null +++ b/cli/examples/core/core.rb @@ -0,0 +1,49 @@ +# Merge and unmerge files to be "core translations" compliant and Accent compliant. + +# ## Merge +# The file used in this command contains en and fr translations and outputs +# "key" => value in the specified language. +# +# Given the file en.json: +# {"key": "foo"} +# Given the file fr.json: +# {"key": "bar"} +# ruby core.rb merge en.json fr.json +# { +# "key": { +# "en": "bar", +# "fr": "foo" +# } +# } +# +# ## Unmerge +# The file used in this command contains en and fr translations and outputs +# "key" => value in the specified language. +# +# Given the file: +# { +# "key": { +# "en": "bar", +# "fr": "foo" +# } +# } +# `ruby core.rb unmerge file.json fr` +# +# { +# "key": "foo" +# } + +require 'json' + +if ARGV[0] === 'merge' + en_json = JSON.parse(File.read(ARGV[1])) + fr_json = JSON.parse(File.read(ARGV[2])) + + output = en_json.each_with_object({}) { |(key, value), memo| memo[key] = {fr: fr_json[key], en: value} } + puts JSON.pretty_generate(output) +end + +if ARGV[0] === 'unmerge' + output = JSON.parse(File.read(ARGV[1])).each_with_object({}) { |(key, value), memo| memo[key] = value[ARGV[2]] } + puts JSON.pretty_generate(output) +end diff --git a/cli/examples/core/translations.json b/cli/examples/core/translations.json new file mode 100644 index 00000000..321a4931 --- /dev/null +++ b/cli/examples/core/translations.json @@ -0,0 +1,6 @@ +{ + "key": { + "fr": "valeur", + "en": "value" + } +} diff --git a/cli/examples/ember/accent.json b/cli/examples/ember/accent.json new file mode 100644 index 00000000..3fe433c6 --- /dev/null +++ b/cli/examples/ember/accent.json @@ -0,0 +1,10 @@ +{ + "files": [ + { + "language": "en", + "format": "json", + "source": "translations/en.json", + "target": "translations/%slug%.json" + } + ] +} diff --git a/cli/examples/ember/translations/en.json b/cli/examples/ember/translations/en.json new file mode 100644 index 00000000..b9be177c --- /dev/null +++ b/cli/examples/ember/translations/en.json @@ -0,0 +1,5 @@ +{ + "key": { + "nested": "Value" + } +} diff --git a/cli/examples/ember/translations/fr.json b/cli/examples/ember/translations/fr.json new file mode 100644 index 00000000..6eb96ffc --- /dev/null +++ b/cli/examples/ember/translations/fr.json @@ -0,0 +1,5 @@ +{ + "key": { + "nested": "Valeur" + } +} diff --git a/cli/examples/phoenix/accent.json b/cli/examples/phoenix/accent.json new file mode 100644 index 00000000..e0172706 --- /dev/null +++ b/cli/examples/phoenix/accent.json @@ -0,0 +1,10 @@ +{ + "files": [ + { + "language": "en", + "format": "gettext", + "source": "priv/en/*.po", + "target": "priv/%slug%/%original_file_name%.po" + } + ] +} diff --git a/cli/examples/phoenix/priv/en/my-file.po b/cli/examples/phoenix/priv/en/my-file.po new file mode 100644 index 00000000..5c2d23da --- /dev/null +++ b/cli/examples/phoenix/priv/en/my-file.po @@ -0,0 +1,6 @@ +msgid "" +msgstr "" +"Language: en" + +msgid "key" +msgstr "Value" diff --git a/cli/examples/phoenix/priv/fr/my-file.po b/cli/examples/phoenix/priv/fr/my-file.po new file mode 100644 index 00000000..200ce70d --- /dev/null +++ b/cli/examples/phoenix/priv/fr/my-file.po @@ -0,0 +1,6 @@ +msgid "" +msgstr "" +"Language: fr" + +msgid "key" +msgstr "Valeur" diff --git a/cli/examples/rails-with-aigu/.aigu.yml b/cli/examples/rails-with-aigu/.aigu.yml new file mode 100644 index 00000000..171cfa23 --- /dev/null +++ b/cli/examples/rails-with-aigu/.aigu.yml @@ -0,0 +1,2 @@ +output-directory: config/locales +input-directory: config/locales diff --git a/cli/examples/rails-with-aigu/Gemfile b/cli/examples/rails-with-aigu/Gemfile new file mode 100644 index 00000000..b85b8e88 --- /dev/null +++ b/cli/examples/rails-with-aigu/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' + +gem 'aigu' diff --git a/cli/examples/rails-with-aigu/Gemfile.lock b/cli/examples/rails-with-aigu/Gemfile.lock new file mode 100644 index 00000000..2e3d5cf0 --- /dev/null +++ b/cli/examples/rails-with-aigu/Gemfile.lock @@ -0,0 +1,17 @@ +GEM + remote: https://rubygems.org/ + specs: + aigu (1.2) + nokogiri (~> 1.6) + mini_portile2 (2.3.0) + nokogiri (1.8.5) + mini_portile2 (~> 2.3.0) + +PLATFORMS + ruby + +DEPENDENCIES + aigu + +BUNDLED WITH + 1.16.2 diff --git a/cli/examples/rails-with-aigu/accent.json b/cli/examples/rails-with-aigu/accent.json new file mode 100644 index 00000000..0592be87 --- /dev/null +++ b/cli/examples/rails-with-aigu/accent.json @@ -0,0 +1,29 @@ +{ + "files": [ + { + "language": "en", + "format": "json", + "source": "aigu/*.json", + "target": "aigu/%original_file_name%-%slug%.json", + "hooks": { + "beforeSync": [ + "rm -rf aigu", + "mkdir -p aigu", + "aigu rails-export --locale=en --output-file=aigu/aigu-is-awesome.json >/dev/null 2>&1" + ], + "beforeAddTranslations": [ + "aigu rails-export --locale=fr --output-file=aigu/aigu-is-awesome-fr.json >/dev/null 2>&1" + ], + "beforeExport": [ + "rm -rf aigu", + "mkdir -p aigu" + ], + "afterExport": [ + "aigu rails-import --locale=en --input-file=aigu/aigu-is-awesome-en.json >/dev/null 2>&1", + "aigu rails-import --locale=fr --input-file=aigu/aigu-is-awesome-fr.json >/dev/null 2>&1", + "rm -rf aigu" + ] + } + } + ] +} diff --git a/cli/examples/rails-with-aigu/config/locales/my_file.en.yml b/cli/examples/rails-with-aigu/config/locales/my_file.en.yml new file mode 100644 index 00000000..a6b12385 --- /dev/null +++ b/cli/examples/rails-with-aigu/config/locales/my_file.en.yml @@ -0,0 +1,4 @@ +--- +en: + my_file: + key: Value diff --git a/cli/examples/rails-with-aigu/config/locales/my_file.fr.yml b/cli/examples/rails-with-aigu/config/locales/my_file.fr.yml new file mode 100644 index 00000000..9f8c35a1 --- /dev/null +++ b/cli/examples/rails-with-aigu/config/locales/my_file.fr.yml @@ -0,0 +1,4 @@ +--- +fr: + my_file: + key: Valeur diff --git a/cli/examples/rails/accent.json b/cli/examples/rails/accent.json new file mode 100644 index 00000000..79bddcdd --- /dev/null +++ b/cli/examples/rails/accent.json @@ -0,0 +1,10 @@ +{ + "files": [ + { + "language": "en", + "format": "rails_yml", + "source": "config/locales/en/*.yml", + "target": "config/locales/%slug%/%original_file_name%.yml" + } + ] +} diff --git a/cli/examples/rails/config/locales/en/my_file.yml b/cli/examples/rails/config/locales/en/my_file.yml new file mode 100644 index 00000000..a6b12385 --- /dev/null +++ b/cli/examples/rails/config/locales/en/my_file.yml @@ -0,0 +1,4 @@ +--- +en: + my_file: + key: Value diff --git a/cli/examples/rails/config/locales/fr/my_file.yml b/cli/examples/rails/config/locales/fr/my_file.yml new file mode 100644 index 00000000..9f8c35a1 --- /dev/null +++ b/cli/examples/rails/config/locales/fr/my_file.yml @@ -0,0 +1,4 @@ +--- +fr: + my_file: + key: Valeur diff --git a/cli/examples/react/accent.json b/cli/examples/react/accent.json new file mode 100644 index 00000000..0d76d536 --- /dev/null +++ b/cli/examples/react/accent.json @@ -0,0 +1,10 @@ +{ + "files": [ + { + "language": "fr", + "format": "json", + "source": "src/locales/fr/*.json", + "target": "src/locales/%slug%/%original_file_name%.json" + } + ] +} diff --git a/cli/examples/react/src/locales/accent/admin.json b/cli/examples/react/src/locales/accent/admin.json new file mode 100644 index 00000000..98fd9bd5 --- /dev/null +++ b/cli/examples/react/src/locales/accent/admin.json @@ -0,0 +1,6 @@ +{ + "nav": { + "organizations": "{^nav.organizations@admin}", + "reservations": "{^nav.reservations@admin}" + } +} diff --git a/cli/examples/react/src/locales/accent/common.json b/cli/examples/react/src/locales/accent/common.json new file mode 100644 index 00000000..94cf4b25 --- /dev/null +++ b/cli/examples/react/src/locales/accent/common.json @@ -0,0 +1,239 @@ +{ + "navigation": { + "switchLanguage": { + "en": "{acc:navigation.switchLanguage.en@common}", + "fr": "{acc:navigation.switchLanguage.fr@common}" + }, + "search": "{acc:navigation.search@common}", + "admin": { + "organizations": "{acc:navigation.admin.organizations@common}", + "reservations": "{acc:navigation.admin.reservations@common}", + "title": "{acc:navigation.admin.title@common}" + }, + "owner": { + "equipments": "{acc:navigation.owner.equipments@common}", + "parkingLots": "{acc:navigation.owner.parkingLots@common}", + "reservations": "{acc:navigation.owner.reservations@common}", + "title": "{acc:navigation.owner.title@common}" + }, + "renter": { + "reservations": "{acc:navigation.renter.reservations@common}", + "title": "{acc:navigation.renter.title@common}" + }, + "account": { + "administration": "{acc:navigation.account.administration@common}", + "organization": "{acc:navigation.account.organization@common}" + }, + "logout": "{acc:navigation.logout@common}", + "login": "{acc:navigation.login@common}" + }, + "languages": { + "english": { + "title": "{acc:languages.english.title@common}", + "code": "{acc:languages.english.code@common}" + }, + "french": { + "title": "{acc:languages.french.title@common}", + "code": "{acc:languages.french.code@common}" + } + }, + "mileage": { + "KILOMETERS": "{acc:mileage.KILOMETERS@common}", + "MILES": "{acc:mileage.MILES@common}" + }, + "notFound": { + "goHome": "{acc:notFound.goHome@common}", + "message": "{acc:notFound.message@common}", + "title": "{acc:notFound.title@common}" + }, + "reservations": { + "activities": { + "chronology": { + "application": "{acc:reservations.activities.chronology.application@common}", + "date": "{acc:reservations.activities.chronology.date@common}", + "synchronization": "{acc:reservations.activities.chronology.synchronization@common}", + "title": "{acc:reservations.activities.chronology.title@common}" + }, + "damages": { + "date": "{acc:reservations.activities.damages.date@common}", + "noDamages": "{acc:reservations.activities.damages.noDamages@common}", + "title": "{acc:reservations.activities.damages.title@common}" + }, + "inspection": { + "noConditionReports": "{acc:reservations.activities.inspection.noConditionReports@common}", + "title": "{acc:reservations.activities.inspection.title@common}" + }, + "licencePlate": { + "title": "{acc:reservations.activities.licencePlate.title@common}" + }, + "location": { + "addressTitle": "{acc:reservations.activities.location.addressTitle@common}", + "error": "{acc:reservations.activities.location.error@common}", + "notFound": "{acc:reservations.activities.location.notFound@common}", + "notProvided": "{acc:reservations.activities.location.notProvided@common}", + "title": "{acc:reservations.activities.location.title@common}" + }, + "odometer": { + "notProdived": "{acc:reservations.activities.odometer.notProdived@common}", + "title": "{acc:reservations.activities.odometer.title@common}" + }, + "review": { + "reasons": { + "alreadyPacked": "{acc:reservations.activities.review.reasons.alreadyPacked@common}", + "dirty": "{acc:reservations.activities.review.reasons.dirty@common}", + "damaged": "{acc:reservations.activities.review.reasons.damaged@common}", + "snow": "{acc:reservations.activities.review.reasons.snow@common}", + "copled": "{acc:reservations.activities.review.reasons.copled@common}", + "notCompliant": "{acc:reservations.activities.review.reasons.notCompliant@common}", + "other": "{acc:reservations.activities.review.reasons.other@common}" + }, + "title": "{acc:reservations.activities.review.title@common}" + } + }, + "assignees": { + "invitationList": { + "empty": "{acc:reservations.assignees.invitationList.empty@common}" + }, + "sendInvite": { + "form": { + "actions": { + "submit": { + "caption": "{acc:reservations.assignees.sendInvite.form.actions.submit.caption@common}" + } + }, + "errors": { + "failed": "{acc:reservations.assignees.sendInvite.form.errors.failed@common}" + }, + "fields": { + "driverName": { + "errors": { + "required": "{acc:reservations.assignees.sendInvite.form.fields.driverName.errors.required@common}" + }, + "label": "{acc:reservations.assignees.sendInvite.form.fields.driverName.label@common}", + "placeholder": "{acc:reservations.assignees.sendInvite.form.fields.driverName.placeholder@common}" + }, + "phoneNumber": { + "errors": { + "invalid": "{acc:reservations.assignees.sendInvite.form.fields.phoneNumber.errors.invalid@common}", + "required": "{acc:reservations.assignees.sendInvite.form.fields.phoneNumber.errors.required@common}" + }, + "label": "{acc:reservations.assignees.sendInvite.form.fields.phoneNumber.label@common}", + "placeholder": "{acc:reservations.assignees.sendInvite.form.fields.phoneNumber.placeholder@common}" + } + } + } + } + }, + "stateFilter": { + "all": "{acc:reservations.stateFilter.all@common}", + "current": "{acc:reservations.stateFilter.current@common}", + "cancelled": "{acc:reservations.stateFilter.cancelled@common}", + "done": "{acc:reservations.stateFilter.done@common}", + "upcoming": "{acc:reservations.stateFilter.upcoming@common}", + "late_activation": "{acc:reservations.stateFilter.late_activation@common}", + "late_deactivation": "{acc:reservations.stateFilter.late_deactivation@common}" + }, + "statusBadge": { + "activated": "{acc:reservations.statusBadge.activated@common}", + "deactivated": "{acc:reservations.statusBadge.deactivated@common}", + "lateActivation": "{acc:reservations.statusBadge.lateActivation@common}", + "lateDeactivation": "{acc:reservations.statusBadge.lateDeactivation@common}", + "upcoming": "{acc:reservations.statusBadge.upcoming@common}" + } + }, + "search": "{acc:search@common}", + "searchMap": { + "departure": "{acc:searchMap.departure@common}" + }, + "timeAgo": "{acc:timeAgo@common}", + "errors": { + "overlap_availabilities": "{acc:errors.overlap_availabilities@common}", + "overlap_reservations": "{acc:errors.overlap_reservations@common}", + "equipment_not_available": "{acc:errors.equipment_not_available@common}" + }, + "form": { + "actions": { + "delete": { + "caption": "{acc:form.actions.delete.caption@common}" + }, + "cancel": { + "caption": "{acc:form.actions.cancel.caption@common}" + } + } + }, + "currency": { + "prefixSymbol": "{acc:currency.prefixSymbol@common}", + "suffixSymbol": "{acc:currency.suffixSymbol@common}" + }, + "trailerTypes": { + "dry_van": "{acc:trailerTypes.dry_van@common}", + "plate_dry_van": "{acc:trailerTypes.plate_dry_van@common}", + "storage_van": "{acc:trailerTypes.storage_van@common}", + "reefer_van": "{acc:trailerTypes.reefer_van@common}", + "heated_van": "{acc:trailerTypes.heated_van@common}", + "flatbed": "{acc:trailerTypes.flatbed@common}", + "dropdeck": "{acc:trailerTypes.dropdeck@common}" + }, + "country": { + "canada": { + "title": "{acc:country.canada.title@common}", + "code": "{acc:country.canada.code@common}", + "province": { + "ontario": { + "title": "{acc:country.canada.province.ontario.title@common}", + "code": "{acc:country.canada.province.ontario.code@common}" + }, + "quebec": { + "title": "{acc:country.canada.province.quebec.title@common}", + "code": "{acc:country.canada.province.quebec.code@common}" + }, + "britishColumbia": { + "title": "{acc:country.canada.province.britishColumbia.title@common}", + "code": "{acc:country.canada.province.britishColumbia.code@common}" + }, + "alberta": { + "title": "{acc:country.canada.province.alberta.title@common}", + "code": "{acc:country.canada.province.alberta.code@common}" + }, + "manitoba": { + "title": "{acc:country.canada.province.manitoba.title@common}", + "code": "{acc:country.canada.province.manitoba.code@common}" + }, + "saskatchewan": { + "title": "{acc:country.canada.province.saskatchewan.title@common}", + "code": "{acc:country.canada.province.saskatchewan.code@common}" + }, + "novaScotia": { + "title": "{acc:country.canada.province.novaScotia.title@common}", + "code": "{acc:country.canada.province.novaScotia.code@common}" + }, + "newBrunswick": { + "title": "{acc:country.canada.province.newBrunswick.title@common}", + "code": "{acc:country.canada.province.newBrunswick.code@common}" + }, + "newfoundlandAndLabrador": { + "title": "{acc:country.canada.province.newfoundlandAndLabrador.title@common}", + "code": "{acc:country.canada.province.newfoundlandAndLabrador.code@common}" + }, + "princeEdwardIsland": { + "title": "{acc:country.canada.province.princeEdwardIsland.title@common}", + "code": "{acc:country.canada.province.princeEdwardIsland.code@common}" + }, + "northwestTerritories": { + "title": "{acc:country.canada.province.northwestTerritories.title@common}", + "code": "{acc:country.canada.province.northwestTerritories.code@common}" + }, + "nunavut": { + "title": "{acc:country.canada.province.nunavut.title@common}", + "code": "{acc:country.canada.province.nunavut.code@common}" + }, + "yukon": { + "title": "{acc:country.canada.province.yukon.title@common}", + "code": "{acc:country.canada.province.yukon.code@common}" + } + } + } + }, + "appTitle": "{acc:appTitle@common}", + "fatalError": "{acc:fatalError@common}" +} diff --git a/cli/examples/react/src/locales/en/admin.json b/cli/examples/react/src/locales/en/admin.json new file mode 100644 index 00000000..1ca1d4ed --- /dev/null +++ b/cli/examples/react/src/locales/en/admin.json @@ -0,0 +1,70 @@ +{ + "edit": { + "actions": { + "actAsOrganization": "Manage" + }, + "errors": { + "organizationNotFound": "The organization doesn’t exist" + }, + "title": "Edit Organization" + }, + "form": { + "actions": { + "submit": { + "caption": "Submit" + } + }, + "fields": { + "email": { + "errors": { + "invalid": "Must be a valid email address" + }, + "label": "Email Address" + }, + "isOwner": { + "label": "Owner" + }, + "isRenter": { + "label": "Renter" + }, + "name": { + "errors": { + "required": "You must enter a name" + }, + "label": "Name" + }, + "phoneNumber": { + "errors": { + "invalid": "Must be in the form of: +15553219876" + }, + "label": "Phone Number" + } + }, + "sections": { + "informations": { + "title": "Informations" + } + } + }, + "index": { + "actions": { + "new": "New Organization" + }, + "alerts": { + "editOrganizationSuccess": "The organization was updated with success", + "newOrganizationSuccess": "The organization was created with success", + "noOrganization": "There are currently no organizations" + }, + "organizationList": { + "header": { + "email": "Email Address", + "name": "Name", + "phoneNumber": "Phone Number" + } + }, + "title": "Organizations" + }, + "new": { + "title": "New Organization" + } +} diff --git a/cli/examples/react/src/locales/en/common.json b/cli/examples/react/src/locales/en/common.json new file mode 100644 index 00000000..2e154c87 --- /dev/null +++ b/cli/examples/react/src/locales/en/common.json @@ -0,0 +1,239 @@ +{ + "appTitle": "vHub", + "fatalError": "An unexpected error has happened. Please try again later.", + "navigation": { + "admin": { + "organizations": "Organizations", + "reservations": "Reservations", + "title": "Admin" + }, + "owner": { + "equipments": "Equipments", + "parkingLots": "Parking Lots", + "reservations": "Reservations", + "title": "Owner" + }, + "renter": { + "reservations": "Reservations", + "title": "Renter" + }, + "account": { + "administration": "Administration", + "organization": "Manage Organization" + }, + "login": "Login", + "logout": "Logout", + "switchLanguage": { + "en": "English", + "fr": "Français" + }, + "search": "Search" + }, + "languages": { + "english": { + "title": "English", + "code": "en" + }, + "french": { + "title": "French", + "code": "fr" + } + }, + "mileage": { + "KILOMETERS": "km", + "MILES": "mi" + }, + "notFound": { + "goHome": "Go back to homepage", + "message": "The page you are trying to reach is not available or does not exist.", + "title": "Page Not Found" + }, + "reservations": { + "activities": { + "chronology": { + "application": "Device time", + "date": "{{date, DD-MM-YYYY, H:mm}}", + "synchronization": "Synchronized at", + "title": "Chronology" + }, + "damages": { + "date": "{{date, D MMMM YYYY, H:mm}}", + "noDamages": "No damage declared", + "title": "Damages" + }, + "inspection": { + "noConditionReports": "No condition reports declared", + "title": "Inspection" + }, + "licencePlate": { + "title": "License Plate" + }, + "location": { + "addressTitle": "Driver’s position", + "error": "Cannot resolve the address. Try again later.", + "notFound": "No addresses were found at this location", + "notProvided": "Not provided", + "title": "Location" + }, + "odometer": { + "notProdived": "No information was provided.", + "title": "Odometer" + }, + "review": { + "reasons": { + "alreadyPacked": "Not empty", + "dirty": "Dirty interior", + "damaged": "Severely damaged", + "snow": "Covered with snow", + "copled": "Coupled or inaccessible", + "notCompliant": "Not road compliant", + "other": "Other" + }, + "title": "Review" + } + }, + "assignees": { + "invitationList": { + "empty": "No invitations were sent yet" + }, + "sendInvite": { + "form": { + "actions": { + "submit": { + "caption": "Send" + } + }, + "errors": { + "failed": "We cannot send the SMS at the moment. Try again later." + }, + "fields": { + "driverName": { + "errors": { + "required": "You must enter a name" + }, + "label": "Name", + "placeholder": "John Doe" + }, + "phoneNumber": { + "errors": { + "invalid": "Must be in the form of: +15553219876", + "required": "You must enter a phone number" + }, + "label": "Phone Number", + "placeholder": "+15553219876" + } + } + } + } + }, + "stateFilter": { + "all": "All", + "current": "In Progress", + "cancelled": "Cancelled", + "done": "Done", + "upcoming": "Upcoming", + "late_activation": "Late activation", + "late_deactivation": "Late deactivation" + }, + "statusBadge": { + "activated": "Activated at {{date, DD/MM/YYYY HH:mm}}", + "deactivated": "Deactivated at {{date, DD/MM/YYYY HH:mm}}", + "lateActivation": "Late activation {{date, DD/MM/YYYY}}", + "lateDeactivation": "Late deactivation {{date, DD/MM/YYYY}}", + "upcoming": "Upcoming" + } + }, + "search": "Search", + "searchMap": { + "departure": "Departure" + }, + "timeAgo": "{{distance}} ago", + "errors": { + "overlap_availabilities": "Selected dates overlap an existing availability", + "overlap_reservations": "Selected dates overlap an existing reservation", + "equipment_not_available": "The equipment is not available for those dates" + }, + "form": { + "actions": { + "delete": { + "caption": "Delete" + }, + "cancel": { + "caption": "Cancel" + } + } + }, + "currency": { + "prefixSymbol": "$", + "suffixSymbol": "" + }, + "trailerTypes": { + "dry_van": "Dry Van", + "plate_dry_van": "Plate Dry Van", + "storage_van": "Storage Van", + "reefer_van": "Reefer Van", + "heated_van": "Heated Van", + "flatbed": "Flatbed", + "dropdeck": "Dropdeck" + }, + "country": { + "canada": { + "title": "Canada", + "code": "CA", + "province": { + "ontario": { + "title": "Ontario", + "code": "ON" + }, + "quebec": { + "title": "Quebec", + "code": "QC" + }, + "britishColumbia": { + "title": "British Columbia", + "code": "BC" + }, + "alberta": { + "title": "Alberta", + "code": "AB" + }, + "manitoba": { + "title": "Manitoba", + "code": "MB" + }, + "saskatchewan": { + "title": "Saskatchewan", + "code": "SK" + }, + "novaScotia": { + "title": "Nova Scotia", + "code": "NS" + }, + "newBrunswick": { + "title": "New Brunswick", + "code": "NB" + }, + "newfoundlandAndLabrador": { + "title": "Newfoundland and Labrador", + "code": "NL" + }, + "princeEdwardIsland": { + "title": "Prince Edward Island", + "code": "PE" + }, + "northwestTerritories": { + "title": "Northwest Territories", + "code": "NT" + }, + "nunavut": { + "title": "Nunavut", + "code": "NU" + }, + "yukon": { + "title": "Yukon", + "code": "YT" + } + } + } + } +} diff --git a/cli/examples/react/src/locales/fr/admin.json b/cli/examples/react/src/locales/fr/admin.json new file mode 100644 index 00000000..a6cf2352 --- /dev/null +++ b/cli/examples/react/src/locales/fr/admin.json @@ -0,0 +1,6 @@ +{ + "nav": { + "organizations": "Organisations", + "reservations": "Réservations" + } +} diff --git a/cli/examples/react/src/locales/fr/common.json b/cli/examples/react/src/locales/fr/common.json new file mode 100644 index 00000000..2192ab76 --- /dev/null +++ b/cli/examples/react/src/locales/fr/common.json @@ -0,0 +1,239 @@ +{ + "appTitle": "vHub", + "fatalError": "Une erreur inattendue est survenue. Veuillez réessayer plus tard.", + "navigation": { + "admin": { + "organizations": "Organisations", + "reservations": "Réservations", + "title": "Admin" + }, + "owner": { + "equipments": "Équipements", + "parkingLots": "Cours de stationnement", + "reservations": "Réservations", + "title": "Propriétaire" + }, + "renter": { + "reservations": "Réservations", + "title": "Locataire" + }, + "account": { + "administration": "Administration", + "organization": "Gérer mon organisation" + }, + "logout": "Déconnexion", + "login": "Connexion", + "switchLanguage": { + "en": "English", + "fr": "Français" + }, + "search": "Rechercher" + }, + "languages": { + "english": { + "title": "Anglais", + "code": "en" + }, + "french": { + "title": "Français", + "code": "fr" + } + }, + "mileage": { + "KILOMETERS": "km", + "MILES": "mi" + }, + "notFound": { + "goHome": "Retourner à la page d’accueil", + "message": "La page que vous tentiez d’atteindre n’est pas disponible ou n’existe pas.", + "title": "Page introuvable" + }, + "reservations": { + "activities": { + "chronology": { + "application": "Heure de l’appareil", + "date": "{{date, DD-MM-YYYY, H:mm}}", + "synchronization": "Synchronisé à", + "title": "Chronologie" + }, + "damages": { + "date": "{{date, D MMMM YYYY, H:mm}}", + "noDamages": "Aucun dommage déclaré", + "title": "Dommages" + }, + "inspection": { + "noConditionReports": "Aucun rapport de condition déclaré", + "title": "Inspection" + }, + "licencePlate": { + "title": "Plaque d’immatriculation" + }, + "location": { + "addressTitle": "Position du conducteur", + "error": "Impossible de résoudre l’adresse. Réessayez plus tard.", + "notFound": "Aucune adresse trouvée à cet emplacement", + "notProvided": "Non fourni", + "title": "Emplacement" + }, + "odometer": { + "notProdived": "Aucune information fournie.", + "title": "Odomètre" + }, + "review": { + "reasons": { + "alreadyPacked": "Pas vide", + "dirty": "Intérieur sale", + "damaged": "Très endommagé", + "snow": "Couverte de neige", + "copled": "Couplée ou inaccessible", + "notCompliant": "Non conforme pour circuler", + "other": "Autre" + }, + "title": "Critique" + } + }, + "assignees": { + "invitationList": { + "empty": "Aucune invitation n’a encore été envoyée" + }, + "sendInvite": { + "form": { + "actions": { + "submit": { + "caption": "Envoyer" + } + }, + "errors": { + "failed": "Impossible d’envoyer un SMS pour le moment, veuillez réessayer plus tard." + }, + "fields": { + "driverName": { + "errors": { + "required": "Vous devez entrer un nom" + }, + "label": "Nom", + "placeholder": "Jean Tremblay" + }, + "phoneNumber": { + "errors": { + "invalid": "Doit respecter le format suivant: +15553219876", + "required": "Vous devez entrer un numéro de téléphone" + }, + "label": "Numéro de téléphone", + "placeholder": "+15553219876" + } + } + } + } + }, + "stateFilter": { + "all": "Toutes", + "current": "En cours", + "cancelled": "Annulées", + "done": "Terminées", + "upcoming": "À venir", + "late_activation": "Non activées", + "late_deactivation": "Non désactivées" + }, + "statusBadge": { + "activated": "Activée le {{date, DD\/MM\/YYYY HH:mm}}", + "deactivated": "Désactivée le {{date, DD\/MM\/YYYY HH:mm}}", + "lateActivation": "Activation en retard {{date, DD\/MM\/YYYY}}", + "lateDeactivation": "Désactivation en retard {{date, DD\/MM\/YYYY}}", + "upcoming": "À venir" + } + }, + "search": "Rechercher", + "searchMap": { + "departure": "Départ" + }, + "timeAgo": "Il y a {{distance}}", + "errors": { + "overlap_availabilities": "Les dates sélectionnées chevauchent une autre disponibilité", + "overlap_reservations": "Les dates sélectionnées chevauchent une réservation", + "equipment_not_available": "L’équipement n'est pas disponible pour ces dates" + }, + "form": { + "actions": { + "delete": { + "caption": "Supprimer" + }, + "cancel": { + "caption": "Annuler" + } + } + }, + "currency": { + "prefixSymbol": "", + "suffixSymbol": " $" + }, + "trailerTypes": { + "dry_van": "Fourgon sec", + "plate_dry_van": "Fourgon sec plate", + "storage_van": "Fourgon d'entreposage", + "reefer_van": "Fourgon réfrigéré", + "heated_van": "Fourgon chauffé", + "flatbed": "Plateforme", + "dropdeck": "Plateforme surbaissée" + }, + "country": { + "canada": { + "title": "Canada", + "code": "CA", + "province": { + "ontario": { + "title": "Ontario", + "code": "ON" + }, + "quebec": { + "title": "Québec", + "code": "QC" + }, + "britishColumbia": { + "title": "Colombie-Britannique", + "code": "BC" + }, + "alberta": { + "title": "Alberta", + "code": "AB" + }, + "manitoba": { + "title": "Manitoba", + "code": "MB" + }, + "saskatchewan": { + "title": "Saskatchewan", + "code": "SK" + }, + "novaScotia": { + "title": "Nouvelle-Écosse", + "code": "NS" + }, + "newBrunswick": { + "title": "Nouveau-Brunswick", + "code": "NB" + }, + "newfoundlandAndLabrador": { + "title": "Terre-Neuve-et-Labrador", + "code": "NL" + }, + "princeEdwardIsland": { + "title": "Île-du-Prince-Édouard", + "code": "PE" + }, + "northwestTerritories": { + "title": "Territoires du Nord-Ouest", + "code": "NT" + }, + "nunavut": { + "title": "Nunavut", + "code": "NU" + }, + "yukon": { + "title": "Yukon", + "code": "YT" + } + } + } + } +} diff --git a/cli/package-lock.json b/cli/package-lock.json new file mode 100644 index 00000000..7e3aeb4d --- /dev/null +++ b/cli/package-lock.json @@ -0,0 +1,3641 @@ +{ + "name": "accent-cli", + "version": "0.6.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@fimbul/bifrost": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.17.0.tgz", + "integrity": "sha512-gVTkJAOef5HtN6LPmrtt5fAUmBywwlgmObsU3FBhPoNeXPLaIl2zywXkJEtvvVLQnaFmtff3x+wIj5lHRCDE3Q==", + "dev": true, + "requires": { + "@fimbul/ymir": "0.17.0", + "get-caller-file": "2.0.1", + "tslib": "1.9.3", + "tsutils": "3.7.0" + } + }, + "@fimbul/ymir": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@fimbul/ymir/-/ymir-0.17.0.tgz", + "integrity": "sha512-xMXM9KTXRLHLVS6dnX1JhHNEkmWHcAVCQ/4+DA1KKwC/AFnGHzu/7QfQttEPgw3xplT+ILf9e3i64jrFwB3JtA==", + "dev": true, + "requires": { + "inversify": "5.0.1", + "reflect-metadata": "0.1.13", + "tslib": "1.9.3" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" + } + }, + "@oclif/color": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@oclif/color/-/color-0.0.0.tgz", + "integrity": "sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw==", + "requires": { + "ansi-styles": "3.2.1", + "supports-color": "5.5.0", + "tslib": "1.9.3" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "@oclif/command": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.6.tgz", + "integrity": "sha512-XBj13dw13qrRzUfAc4d6b8PlZXALFglJ8xydX34aazLJCzeP8mtTcAJTi6ylTwWVhIW2HDO9npTd4FviDY279g==", + "requires": { + "@oclif/errors": "1.2.2", + "@oclif/parser": "3.7.0", + "debug": "4.1.0", + "semver": "5.6.0" + }, + "dependencies": { + "@oclif/errors": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", + "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", + "requires": { + "clean-stack": "1.3.0", + "fs-extra": "7.0.1", + "indent-string": "3.2.0", + "strip-ansi": "5.0.0", + "wrap-ansi": "4.0.0" + } + }, + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "requires": { + "ms": "2.1.1" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "requires": { + "ansi-regex": "4.0.0" + } + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "requires": { + "ansi-styles": "3.2.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + } + } + }, + "@oclif/config": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.9.0.tgz", + "integrity": "sha512-R9HJvS7x4Ff/VFGlg8b7hxFnuC77y7znr1iXwRay4Jhd/EFJyZRT9d9SHzA6TS8lz9vDTW93xOFakT9AXld4Kg==", + "requires": { + "debug": "4.1.0", + "tslib": "1.9.3" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "requires": { + "ms": "2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@oclif/dev-cli": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@oclif/dev-cli/-/dev-cli-1.21.0.tgz", + "integrity": "sha512-Hgxzcn0bCFvY1y8CDy5ic0/5iEPZJwe4/xDNZ5/+qJiNQ7ShW0tsStzOjfgufGe7jwAPZQenejOgx1EPr4bV1w==", + "dev": true, + "requires": { + "@oclif/command": "1.5.6", + "@oclif/config": "1.12.0", + "@oclif/errors": "1.2.2", + "@oclif/plugin-help": "2.1.4", + "cli-ux": "4.9.3", + "debug": "4.1.1", + "fs-extra": "7.0.1", + "lodash": "4.17.11", + "normalize-package-data": "2.4.0", + "qqjs": "0.3.10", + "tslib": "1.9.3" + }, + "dependencies": { + "@oclif/config": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.12.0.tgz", + "integrity": "sha512-RB6A+N7Dq5DcFOQEhPpB8DdXtMQm2VDgdtgBKUdot815tj4gW7nDmRZBEwU85x4Xhep7Dx3tpaXobA6bFlSOWg==", + "dev": true, + "requires": { + "debug": "4.1.1", + "tslib": "1.9.3" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "2.1.1" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "@oclif/errors": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", + "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", + "dev": true, + "requires": { + "clean-stack": "1.3.0", + "fs-extra": "7.0.1", + "indent-string": "3.2.0", + "strip-ansi": "5.0.0", + "wrap-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "4.0.0" + } + } + } + }, + "@oclif/linewrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", + "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" + }, + "@oclif/parser": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.7.0.tgz", + "integrity": "sha512-CtRbCBJQ8prt9o3nCTSRi/UEw68t7mUf19vu3QKbh6sGc6BkD7OAX6Hfjxif636LSlR+N8eh3PELw9SxHdJcbQ==", + "requires": { + "@oclif/linewrap": "1.0.0", + "chalk": "2.4.1", + "tslib": "1.9.3" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + } + } + }, + "@oclif/plugin-help": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.1.4.tgz", + "integrity": "sha512-wG4eR/UxYangQlyn4XvslVV4wpBNQrEC/PvRibQq+0jNop/7zfK3jdWuK5PVB0mxZfhPwBSMZzV/3ur6DN+Bbg==", + "requires": { + "@oclif/command": "1.5.6", + "chalk": "2.4.1", + "indent-string": "3.2.0", + "lodash.template": "4.4.0", + "string-width": "2.1.1", + "strip-ansi": "5.0.0", + "widest-line": "2.0.1", + "wrap-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "requires": { + "ansi-regex": "4.0.0" + } + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "requires": { + "ansi-styles": "3.2.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + } + } + }, + "@oclif/plugin-not-found": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-1.2.2.tgz", + "integrity": "sha512-SPlmiJFmTFltQT/owdzQwKgq6eq5AEKVwVK31JqbzK48bRWvEL1Ye60cgztXyZ4bpPn2Fl+KeL3FWFQX41qJuA==", + "requires": { + "@oclif/color": "0.0.0", + "@oclif/command": "1.5.6", + "cli-ux": "4.9.3", + "fast-levenshtein": "2.0.6", + "lodash": "4.17.11" + }, + "dependencies": { + "@oclif/errors": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", + "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", + "requires": { + "clean-stack": "1.3.0", + "fs-extra": "7.0.1", + "indent-string": "3.2.0", + "strip-ansi": "5.0.0", + "wrap-ansi": "4.0.0" + }, + "dependencies": { + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" + } + } + }, + "@oclif/screen": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz", + "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==" + }, + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "requires": { + "ansicolors": "0.3.2", + "redeyed": "2.1.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "clean-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.0.0.tgz", + "integrity": "sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A==" + }, + "cli-ux": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz", + "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==", + "requires": { + "@oclif/errors": "1.2.2", + "@oclif/linewrap": "1.0.0", + "@oclif/screen": "1.0.4", + "ansi-escapes": "3.1.0", + "ansi-styles": "3.2.1", + "cardinal": "2.1.1", + "chalk": "2.4.1", + "clean-stack": "2.0.0", + "extract-stack": "1.0.0", + "fs-extra": "7.0.1", + "hyperlinker": "1.0.0", + "indent-string": "3.2.0", + "is-wsl": "1.1.0", + "lodash": "4.17.11", + "password-prompt": "1.0.7", + "semver": "5.6.0", + "strip-ansi": "5.0.0", + "supports-color": "5.5.0", + "supports-hyperlinks": "1.0.1", + "treeify": "1.1.0", + "tslib": "1.9.3" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.6.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "password-prompt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.0.7.tgz", + "integrity": "sha1-jid0jTQAvJyRQNWt5wXft6632Ro=", + "requires": { + "ansi-escapes": "3.1.0", + "cross-spawn": "6.0.5" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "requires": { + "esprima": "4.0.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "requires": { + "ansi-regex": "4.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "requires": { + "ansi-styles": "3.2.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + } + } + }, + "@oclif/screen": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz", + "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==" + }, + "@oclif/test": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@oclif/test/-/test-1.0.1.tgz", + "integrity": "sha512-wZVqv5PErZEH3LKLzBP8bLuNmtKTxFjm7WtdvBRoi8x+R0OqjYKgEWzpv2Y/RXxma7yRPzEl3HYy76IoN9x6Pw==", + "dev": true, + "requires": { + "fancy-test": "1.0.1" + } + }, + "@oclif/tslint": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@oclif/tslint/-/tslint-3.1.1.tgz", + "integrity": "sha512-B1ZWbgzwxDhNZLzVnn+JjyFf9u+J9wNwsz/ZX9YvA9edRYcdiJz9JikCttGPi35V0NU0TUV4UqTqo/q/wQ06jQ==", + "dev": true, + "requires": { + "tslint-eslint-rules": "5.4.0", + "tslint-xo": "0.9.0" + } + }, + "@types/chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.2.tgz", + "integrity": "sha512-D8uQwKYUw2KESkorZ27ykzXgvkDJYXVEihGklgfp5I4HUP8D6IxtcdLTMB1emjQiWzV7WZ5ihm1cxIzVwjoleQ==", + "dev": true + }, + "@types/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-viw/LG++yGW9GP7ggfDpR+qpBz/NHFEbRTWNumTzebeUlURwfX+sjQfdfbiEoxXgJrj+1G8p4VN/bLquur7Hmg==" + }, + "@types/events": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" + }, + "@types/form-data": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", + "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", + "requires": { + "@types/node": "9.6.0" + } + }, + "@types/fs-extra": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz", + "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==", + "requires": { + "@types/node": "9.6.0" + } + }, + "@types/glob": { + "version": "5.0.35", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz", + "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==", + "requires": { + "@types/events": "1.2.0", + "@types/minimatch": "3.0.3", + "@types/node": "9.6.0" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/mocha": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.0.0.tgz", + "integrity": "sha512-ZS0vBV7Jn5Z/Q4T3VXauEKMDCV8nWOtJJg90OsDylkYJiQwcWtKuLzohWzrthBkerUF7DLMmJcwOPEP0i/AOXw==", + "dev": true + }, + "@types/node": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.0.tgz", + "integrity": "sha512-h3YZbOq2+ZoDFI1z8Zx0Ck/xRWkOESVaLdgLdd/c25mMQ1Y2CAkILu9ny5A15S5f32gGcQdaUIZ2jzYr8D7IFg==" + }, + "@types/node-fetch": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-1.6.7.tgz", + "integrity": "sha1-UhB46PDGmhWOUCIAWsqS0mIPbVc=", + "requires": { + "@types/node": "9.6.0" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.1" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + } + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "requires": { + "ansicolors": "0.3.2", + "redeyed": "2.1.1" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" + }, + "cli-ux": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz", + "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==", + "requires": { + "@oclif/errors": "1.2.2", + "@oclif/linewrap": "1.0.0", + "@oclif/screen": "1.0.4", + "ansi-escapes": "3.1.0", + "ansi-styles": "3.2.1", + "cardinal": "2.1.1", + "chalk": "2.4.1", + "clean-stack": "2.0.0", + "extract-stack": "1.0.0", + "fs-extra": "7.0.1", + "hyperlinker": "1.0.0", + "indent-string": "3.2.0", + "is-wsl": "1.1.0", + "lodash": "4.17.11", + "password-prompt": "1.0.7", + "semver": "5.6.0", + "strip-ansi": "5.0.0", + "supports-color": "5.5.0", + "supports-hyperlinks": "1.0.1", + "treeify": "1.1.0", + "tslib": "1.9.3" + }, + "dependencies": { + "@oclif/errors": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", + "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", + "requires": { + "clean-stack": "1.3.0", + "fs-extra": "7.0.1", + "indent-string": "3.2.0", + "strip-ansi": "5.0.0", + "wrap-ansi": "4.0.0" + }, + "dependencies": { + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" + } + } + }, + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" + }, + "clean-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.0.0.tgz", + "integrity": "sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A==" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "requires": { + "ansi-regex": "4.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "3.0.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "requires": { + "ansi-styles": "3.2.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.5.0", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "requires": { + "xregexp": "4.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + } + }, + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "requires": { + "esutils": "1.1.6", + "isarray": "0.0.1" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "dev": true + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "6.0.5", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "extract-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-1.0.0.tgz", + "integrity": "sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=" + }, + "fancy-test": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fancy-test/-/fancy-test-1.0.1.tgz", + "integrity": "sha512-P9Dzt3gUQaswx54yIVVbMGucK9oz4ChDTxeN5MjgKGl9/3iE6xlXfBoHi0dvNam9xpZabhLLPPoalhkVmg3U3A==", + "dev": true, + "requires": { + "lodash": "4.17.5", + "stdout-stderr": "0.1.7" + } + }, + "fast-glob": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz", + "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.1", + "micromatch": "3.1.10" + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.7", + "mime-types": "2.1.21" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-caller-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.1.tgz", + "integrity": "sha512-SpOZHfz845AH0wJYVuZk2jWDqFmu7Xubsx+ldIpwzy5pDUpu7OJHK7QYNSA2NPlDSKQwM1GFaAkciOWjjW92Sg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.0", + "glob": "7.1.3", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-call": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.2.3.tgz", + "integrity": "sha512-IkwGruHVHATmnonLKMGX5tkpM0KSn/C240o8/OfBsESRaJacykSia+akhD0d3fljQ5rQPXtBvSrVShAsj+EOUQ==", + "dev": true, + "requires": { + "content-type": "1.0.4", + "debug": "3.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "tunnel-agent": "0.6.0" + } + }, + "hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==" + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inversify": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", + "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "load-json-file": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.1.0.tgz", + "integrity": "sha512-+ggO8OpTviHQ/zoyFxLJglsu1CylXUt1vpGa+mIUeesCkTC0G+JO6rdTS1/WcGBZDC7Nejo1aZ9MxbqflpmO6Q==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "requires": { + "lodash._reinterpolate": "3.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "merge2": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", + "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "1.37.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.5.tgz", + "integrity": "sha512-3MM3UjZ5p8EJrYpG7s+29HAI9G7sTzKEe4+w37Dg0QP7qL4XGsV+Q2xet2cE37AqdgN1OtYQB6Vl98YiPV3PgA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.4" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "password-prompt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.0.7.tgz", + "integrity": "sha1-jid0jTQAvJyRQNWt5wXft6632Ro=", + "requires": { + "ansi-escapes": "3.1.0", + "cross-spawn": "6.0.5" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prettier": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.3.tgz", + "integrity": "sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "qqjs": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/qqjs/-/qqjs-0.3.10.tgz", + "integrity": "sha1-rjr3y0xCQkLbSqm5LELSn6kQFWI=", + "dev": true, + "requires": { + "chalk": "2.4.1", + "debug": "3.1.0", + "execa": "0.10.0", + "fs-extra": "6.0.1", + "get-stream": "3.0.0", + "glob": "7.1.3", + "globby": "8.0.1", + "http-call": "5.2.3", + "load-json-file": "5.1.0", + "pkg-dir": "2.0.0", + "tar-fs": "1.16.3", + "tmp": "0.0.33", + "write-json-file": "2.3.0" + }, + "dependencies": { + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "requires": { + "esprima": "4.0.0" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "1.0.6" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.3" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.3" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "stdout-stderr": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/stdout-stderr/-/stdout-stderr-0.1.7.tgz", + "integrity": "sha512-MtlU5F96BKMAkT9Ojw86n9ghv/b7iUo3AKc2pUeAJb1ZGujCHIM3mW3u5qvY64FbWFD1d3Sb9V1bNsQYcjCBWQ==", + "dev": true, + "requires": { + "strip-ansi": "4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "requires": { + "has-flag": "3.0.0" + } + }, + "supports-hyperlinks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", + "requires": { + "has-flag": "2.0.0", + "supports-color": "5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + } + } + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "requires": { + "chownr": "1.1.1", + "mkdirp": "0.5.1", + "pump": "1.0.3", + "tar-stream": "1.6.2" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "1.2.2", + "buffer-alloc": "1.2.0", + "end-of-stream": "1.4.1", + "fs-constants": "1.0.0", + "readable-stream": "2.3.6", + "to-buffer": "1.1.1", + "xtend": "4.0.1" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "buffer-from": "1.1.1", + "diff": "3.5.0", + "make-error": "1.3.5", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.5.9", + "yn": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "tslint": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.4.1", + "commander": "2.19.0", + "diff": "3.5.0", + "glob": "7.1.3", + "js-yaml": "3.12.0", + "minimatch": "3.0.4", + "resolve": "1.8.1", + "semver": "5.5.0", + "tslib": "1.9.3", + "tsutils": "2.29.0" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + } + } + }, + "tslint-config-prettier": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz", + "integrity": "sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw==" + }, + "tslint-consistent-codestyle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.15.0.tgz", + "integrity": "sha512-6BNDBbZh2K0ibRXe70Mkl9gfVttxQ3t3hqV1BRDfpIcjrUoOgD946iH4SrXp+IggDgeMs3dJORjD5tqL5j4jXg==", + "dev": true, + "requires": { + "@fimbul/bifrost": "0.17.0", + "tslib": "1.9.3", + "tsutils": "2.29.0" + }, + "dependencies": { + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + } + } + }, + "tslint-eslint-rules": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", + "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "dev": true, + "requires": { + "doctrine": "0.7.2", + "tslib": "1.9.0", + "tsutils": "3.7.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + } + } + }, + "tslint-microsoft-contrib": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", + "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", + "dev": true, + "requires": { + "tsutils": "2.28.0" + }, + "dependencies": { + "tsutils": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", + "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + } + } + }, + "tslint-xo": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/tslint-xo/-/tslint-xo-0.9.0.tgz", + "integrity": "sha512-Zk5jBdQVUaHEmR9TUoh1TJOjjCr7/nRplA+jDZBvucyBMx65pt0unTr6H/0HvrtSlucFvOMYsyBZE1W8b4AOig==", + "dev": true, + "requires": { + "tslint-consistent-codestyle": "1.15.0", + "tslint-eslint-rules": "5.4.0", + "tslint-microsoft-contrib": "5.2.1" + } + }, + "tsutils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.7.0.tgz", + "integrity": "sha512-n+e+3q7Jx2kfZw7tjfI9axEIWBY0sFMOlC+1K70X0SeXpO/UYSB+PN+E9tIJNqViB7oiXQdqD7dNchnvoneZew==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "2.1.1" + } + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "5.0.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "pify": "3.0.0", + "sort-keys": "2.0.0", + "write-file-atomic": "2.4.2" + } + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/cli/package.json b/cli/package.json new file mode 100644 index 00000000..326c9dea --- /dev/null +++ b/cli/package.json @@ -0,0 +1,73 @@ +{ + "name": "accent-cli", + "version": "0.6.0", + "author": "Simon Prévost", + "description": "Accent CLI", + "bin": { + "accent": "./bin/run" + }, + "dependencies": { + "@oclif/command": "1.5.6", + "@oclif/config": "1.9.0", + "@oclif/plugin-help": "2.1.4", + "@oclif/plugin-not-found": "1.2.2", + "@types/decamelize": "1.2.0", + "@types/form-data": "2.2.1", + "@types/fs-extra": "5.0.1", + "@types/glob": "5.0.35", + "@types/node-fetch": "1.6.7", + "chalk": "2.4.1", + "cli-ux": "4.9.3", + "decamelize": "2.0.0", + "form-data": "2.3.3", + "glob": "7.1.3", + "node-fetch": "2.3.0", + "tslib": "1.9.3", + "tslint-config-prettier": "1.17.0" + }, + "devDependencies": { + "@oclif/dev-cli": "1.21.0", + "@oclif/test": "1.0.1", + "@oclif/tslint": "3.1.1", + "@types/chai": "4.1.2", + "@types/mocha": "5.0.0", + "@types/node": "9.6.0", + "chai": "4.1.2", + "globby": "8.0.1", + "mocha": "5.0.5", + "prettier": "1.15.3", + "ts-node": "7.0.1", + "tslint": "5.11.0", + "typescript": "3.2.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "files": [ + ".oclif.manifest.json", + "/bin", + "/lib" + ], + "keywords": [ + "oclif" + ], + "license": "MIT", + "main": "lib/index.js", + "oclif": { + "commands": "./lib/commands", + "bin": "accent", + "plugins": [ + "@oclif/plugin-help", + "@oclif/plugin-not-found" + ] + }, + "scripts": { + "build": "rm -rf lib && tsc", + "clean": "rm -f .oclif.manifest.json", + "lint": "tslint --project tsconfig.json 'src/**/*.{ts,tsx}'", + "fix": "tslint --project tsconfig.json --fix 'src/**/*.{ts,tsx}'", + "prepublishOnly": "npm run build && oclif-dev readme && oclif-dev manifest", + "prettier": "prettier --single-quote --no-bracket-spacing --no-semi --write './src/**/*.{js,json,ts,tsx,gql}'" + }, + "types": "lib/index.d.ts" +} diff --git a/cli/src/base.ts b/cli/src/base.ts new file mode 100644 index 00000000..1c36e419 --- /dev/null +++ b/cli/src/base.ts @@ -0,0 +1,41 @@ +// Vendor +import Command from '@oclif/command' +import {error} from '@oclif/errors' +import chalk from 'chalk' +import cli from 'cli-ux' + +// Services +import ConfigFetcher from './services/config' +import ProjectFetcher from './services/project-fetcher' + +// Types +import {Project} from './types/project' + +const sleep = (ms: number) => + new Promise((resolve: () => void) => setTimeout(resolve, ms)) + +export default abstract class extends Command { + public projectConfig: ConfigFetcher = new ConfigFetcher() + public project?: Project + + public async init() { + const config = this.projectConfig.config + if (!config.apiUrl) error('You must set an API url in your config') + if (!config.apiKey) error('You must set an API key in your config') + + // Fetch project from the GraphQL API. + cli.action.start(chalk.white('Fetch config')) + await sleep(1000) + const fetcher = new ProjectFetcher() + this.project = await fetcher.fetch(config) + cli.action.stop(chalk.green('✓')) + console.log('') + } + + public async refreshProject() { + const config = this.projectConfig.config + + const fetcher = new ProjectFetcher() + this.project = await fetcher.fetch(config) + } +} diff --git a/cli/src/commands/export.ts b/cli/src/commands/export.ts new file mode 100644 index 00000000..1d34f80d --- /dev/null +++ b/cli/src/commands/export.ts @@ -0,0 +1,55 @@ +// Command +import {flags} from '@oclif/command' +import Command from '../base' + +// Formatters +import ExportFormatter from '../services/formatters/project-export' + +// Services +import DocumentPathsFetcher from '../services/document-paths-fetcher' +import DocumentExportFormatter from '../services/formatters/document-export' +import HookRunner from '../services/hook-runner' + +// Types +import {Hooks} from '../types/document-config' + +export default class Export extends Command { + public static description = + 'Export files from Accent and write them to your local filesystem' + + public static examples = [`$ accent export`] + + public static args = [] + public static flags = { + 'order-by': flags.string({ + default: 'index', + description: 'Will be used in the export call as the order of the keys', + options: ['index', 'key-asc'] + }) + } + + public async run() { + const {flags} = this.parse(Export) + + const documents = this.projectConfig.files() + const formatter = new DocumentExportFormatter() + + // From all the documentConfigs, do the export, write to local file and log the results. + new ExportFormatter().log() + + for (const document of documents) { + await new HookRunner(document).run(Hooks.beforeExport) + + const targets = new DocumentPathsFetcher().fetch(this.project!, document) + + await Promise.all( + targets.map(({path, language, documentPath}) => { + formatter.log(path) + return document.export(path, language, documentPath, flags) + }) + ) + + await new HookRunner(document).run(Hooks.afterExport) + } + } +} diff --git a/cli/src/commands/jipt.ts b/cli/src/commands/jipt.ts new file mode 100644 index 00000000..c68d7a71 --- /dev/null +++ b/cli/src/commands/jipt.ts @@ -0,0 +1,57 @@ +// Command +import Command from '../base' + +// Formatters +import ExportFormatter from '../services/formatters/project-export' + +// Services +import DocumentJiptPathsFetcher from '../services/document-jipt-paths-fetcher' +import DocumentExportFormatter from '../services/formatters/document-export' +import HookRunner from '../services/hook-runner' + +// Types +import {Hooks} from '../types/document-config' + +export default class Jipt extends Command { + public static description = + 'Export jipt files from Accent and write them to your local filesystem' + + public static examples = [`$ accent jipt`] + + public static args = [ + { + description: 'The pseudo language for in-place-translation-editing', + name: 'pseudoLanguageName', + required: true + } + ] + public static flags = {} + + public async run() { + const {args} = this.parse(Jipt) + const documents = this.projectConfig.files() + const formatter = new DocumentExportFormatter() + + // From all the documentConfigs, do the export, write to local file and log the results. + new ExportFormatter().log() + + for (const document of documents) { + await new HookRunner(document).run(Hooks.beforeExport) + + const targets = new DocumentJiptPathsFetcher().fetch( + this.project!, + document, + args.pseudoLanguageName + ) + + await Promise.all( + targets.map(({path, documentPath}) => { + formatter.log(path) + return document.exportJipt(path, documentPath) + }) + ) + + await new HookRunner(document).run(Hooks.afterExport) + } + } +} diff --git a/cli/src/commands/stats.ts b/cli/src/commands/stats.ts new file mode 100644 index 00000000..3c031a99 --- /dev/null +++ b/cli/src/commands/stats.ts @@ -0,0 +1,18 @@ +// Command +import Command from '../base' + +// Services +import Formatter from '../services/formatters/project-stats' + +export default class Stats extends Command { + public static description = + 'Fetch stats from the API and display it beautifully' + + public static examples = [`$ accent stats`] + + public async run() { + const formatter = new Formatter(this.project!) + + formatter.log() + } +} diff --git a/cli/src/commands/sync.ts b/cli/src/commands/sync.ts new file mode 100644 index 00000000..ced7ec7f --- /dev/null +++ b/cli/src/commands/sync.ts @@ -0,0 +1,149 @@ +// Vendor +import {flags} from '@oclif/command' +import {existsSync} from 'fs' + +// Command +import Command from '../base' + +// Formatters +import AddTranslationsFormatter from '../services/formatters/project-add-translations' +import ExportFormatter from '../services/formatters/project-export' +import SyncFormatter from '../services/formatters/project-sync' + +// Services +import Document from '../services/document' +import DocumentPathsFetcher from '../services/document-paths-fetcher' +import CommitOperationFormatter from '../services/formatters/commit-operation' +import DocumentExportFormatter from '../services/formatters/document-export' +import HookRunner from '../services/hook-runner' + +// Types +import {Hooks} from '../types/document-config' + +export default class Sync extends Command { + public static description = + 'Sync files in Accent and write them to your local filesystem' + + public static examples = [`$ accent sync`] + + public static args = [] + + public static flags = { + 'add-translations': flags.boolean({ + description: + 'Add translations in Accent to help translators if you already have translated strings' + }), + 'merge-type': flags.string({ + default: 'smart', + description: + 'Will be used in the add translations call as the "merge_type" param', + options: ['smart', 'passive', 'force'] + }), + 'order-by': flags.string({ + default: 'index', + description: 'Will be used in the export call as the order of the keys', + options: ['index', 'key-asc'] + }), + 'sync-type': flags.string({ + default: 'smart', + description: 'Will be used in the sync call as the "sync_type" param', + options: ['smart', 'passive'] + }), + write: flags.boolean({ + description: 'Write the file from the export _after_ the operation' + }) + } + + public async run() { + const {flags} = this.parse(Sync) + + const documents = this.projectConfig.files() + + // From all the documentConfigs, do the sync or peek operations and log the results. + new SyncFormatter().log() + + for (const document of documents) { + await new HookRunner(document).run(Hooks.beforeSync) + + await Promise.all(this.syncDocumentConfig(document)) + + await new HookRunner(document).run(Hooks.afterSync) + } + + if (flags['add-translations']) { + new AddTranslationsFormatter().log() + + for (const document of documents) { + await new HookRunner(document).run(Hooks.beforeAddTranslations) + + await Promise.all(this.addTranslationsDocumentConfig(document)) + + await new HookRunner(document).run(Hooks.afterAddTranslations) + } + } + + if (!flags.write) return + // After syncing the files in Accent, the list of documents could have changed. + await this.refreshProject() + + const formatter = new DocumentExportFormatter() + + // From all the documentConfigs, do the export, write to local file and log the results. + new ExportFormatter().log() + + for (const document of documents) { + await new HookRunner(document).run(Hooks.beforeExport) + + const targets = new DocumentPathsFetcher().fetch(this.project!, document) + + await Promise.all( + targets.map(({path, language, documentPath}) => { + formatter.log(path) + return document.export(path, language, documentPath, flags) + }) + ) + + await new HookRunner(document).run(Hooks.afterExport) + } + } + + private syncDocumentConfig(document: Document) { + const {flags} = this.parse(Sync) + const formatter = new CommitOperationFormatter() + + return document.paths.map(async path => { + const operations = await document.sync(path, flags) + + if (operations.sync && !operations.peek) formatter.logSync(path) + if (operations.peek) formatter.logPeek(path, operations.peek) + + return operations + }) + } + + private addTranslationsDocumentConfig(document: Document) { + const {flags} = this.parse(Sync) + const formatter = new CommitOperationFormatter() + + const targets = new DocumentPathsFetcher() + .fetch(this.project!, document) + .filter(({language}) => language !== document.config.language) + .filter(({path}) => existsSync(path)) + + return targets.map(async ({path, language, documentPath}) => { + const operations = await document.addTranslations( + path, + language, + documentPath, + flags + ) + + if (operations.addTranslations && !operations.peek) { + formatter.logAddTranslations(path) + } + if (operations.peek) formatter.logPeek(path, operations.peek) + + return operations + }) + } +} diff --git a/cli/src/index.ts b/cli/src/index.ts new file mode 100644 index 00000000..4caa481e --- /dev/null +++ b/cli/src/index.ts @@ -0,0 +1 @@ +export {run} from '@oclif/command' diff --git a/cli/src/services/config.ts b/cli/src/services/config.ts new file mode 100644 index 00000000..58ab646a --- /dev/null +++ b/cli/src/services/config.ts @@ -0,0 +1,41 @@ +// Vendor +import {error} from '@oclif/errors' +import * as fs from 'fs-extra' + +// Services +import Document from './document' + +// Types +import {Config} from '../types/config' + +export default class ConfigFetcher { + public readonly config: Config + + constructor() { + this.config = fs.readJsonSync('accent.json') + this.config.apiKey = this.config.apiKey || process.env.ACCENT_API_KEY! + this.config.apiUrl = this.config.apiUrl || process.env.ACCENT_API_URL! + + if (!this.config.apiKey) { + error( + 'You must have an apiKey key in the config or the ACCENT_API_KEY environment variable' + ) + } + + if (!this.config.apiUrl) { + error( + 'You must have an apiUrl key in the config or the ACCENT_API_URL environment variable' + ) + } + + if (!this.config.files) { + error('You must have at least 1 document set in your config') + } + } + + public files(): Document[] { + return this.config.files.map( + documentConfig => new Document(documentConfig, this.config) + ) + } +} diff --git a/cli/src/services/document-jipt-paths-fetcher.ts b/cli/src/services/document-jipt-paths-fetcher.ts new file mode 100644 index 00000000..be1b9f4f --- /dev/null +++ b/cli/src/services/document-jipt-paths-fetcher.ts @@ -0,0 +1,26 @@ +// Types +import {DocumentPath} from '../types/document-path' +import {Project} from '../types/project' +import Document from './document' + +export default class DocumentJiptPathsFetcher { + public fetch( + project: Project, + document: Document, + pseudoLanguageName: string + ): DocumentPath[] { + return project.documents.entries + .map(({path}) => path) + .map(path => { + const parsedTarget = document.target + .replace('%slug%', pseudoLanguageName) + .replace('%original_file_name%', path) + + return { + documentPath: path, + language: pseudoLanguageName, + path: parsedTarget + } + }) + } +} diff --git a/cli/src/services/document-paths-fetcher.ts b/cli/src/services/document-paths-fetcher.ts new file mode 100644 index 00000000..d34e342d --- /dev/null +++ b/cli/src/services/document-paths-fetcher.ts @@ -0,0 +1,22 @@ +// Types +import {DocumentPath} from '../types/document-path' +import {Project} from '../types/project' +import Document from './document' + +export default class DocumentPathsFetcher { + public fetch(project: Project, document: Document): DocumentPath[] { + const languageSlugs = project.revisions.map(({language}) => language.slug) + const documentPaths = project.documents.entries.map(({path}) => path) + return languageSlugs.reduce((memo: DocumentPath[], slug) => { + documentPaths.forEach(path => { + const parsedTarget = document.target + .replace('%slug%', slug) + .replace('%original_file_name%', path) + + memo.push({documentPath: path, path: parsedTarget, language: slug}) + }) + + return memo + }, []) + } +} diff --git a/cli/src/services/document.ts b/cli/src/services/document.ts new file mode 100644 index 00000000..b38316af --- /dev/null +++ b/cli/src/services/document.ts @@ -0,0 +1,162 @@ +// Vendor +import * as FormData from 'form-data' +import * as fs from 'fs-extra' +import fetch, {Response} from 'node-fetch' +import * as path from 'path' + +// Services +import Tree from './tree' + +// Types +import {Config} from '../types/config' +import {DocumentConfig} from '../types/document-config' +import {OperationResponse} from '../types/operation-response' + +const enum OperationName { + Sync = 'sync', + AddTranslation = 'addTranslations' +} + +export default class Document { + public paths: string[] + public readonly apiKey: string + public readonly apiUrl: string + public readonly config: DocumentConfig + public readonly target: string + + constructor(documentConfig: DocumentConfig, config: Config) { + this.config = documentConfig + this.apiKey = config.apiKey + this.apiUrl = config.apiUrl + this.target = this.config.target + this.paths = new Tree(this.config).list() + } + + public refreshPaths() { + this.paths = new Tree(this.config).list() + } + + public async sync(file: string, options: any) { + const formData = new FormData() + formData.append('file', fs.createReadStream(file)) + formData.append('document_path', this.parseDocumentName(file)) + formData.append('document_format', this.config.format) + formData.append('language', this.config.language) + + let url = `${this.apiUrl}/sync` + if (!options.write) url = `${url}/peek` + if (options['sync-type']) formData.append('sync_type', options['sync-type']) + + const response = await fetch(url, { + body: formData, + headers: this.authorizationHeader(), + method: 'POST' + }) + + return this.handleResponse(response, options, OperationName.Sync) + } + + public async addTranslations( + file: string, + language: string, + documentPath: string, + options: any + ) { + const formData = new FormData() + + formData.append('file', fs.createReadStream(file)) + formData.append('document_path', documentPath) + formData.append('document_format', this.config.format) + formData.append('language', language) + + let url = `${this.apiUrl}/add-translations` + if (!options.write) url = `${url}/peek` + if (options['merge-type']) { + formData.append('merge_type', options['merge-type']) + } + + const response = await fetch(url, { + body: formData, + headers: this.authorizationHeader(), + method: 'POST' + }) + + return this.handleResponse(response, options, OperationName.AddTranslation) + } + + public async export( + file: string, + language: string, + documentPath: string, + options: any + ) { + language = language || this.config.language + + const query = [ + ['document_path', documentPath], + ['document_format', this.config.format], + ['order_by', options['order-by']], + ['language', language] + ] + .map(([name, value]) => `${name}=${value}`) + .join('&') + + const url = `${this.apiUrl}/export?${query}` + const response = await fetch(url, { + headers: this.authorizationHeader() + }) + + return this.writeResponseToFile(response, file) + } + + public async exportJipt(file: string, documentPath: string) { + const query = [ + ['document_path', documentPath], + ['document_format', this.config.format] + ] + .map(([name, value]) => `${name}=${value}`) + .join('&') + + const url = `${this.apiUrl}/jipt-export?${query}` + const response = await fetch(url, { + headers: this.authorizationHeader() + }) + + return this.writeResponseToFile(response, file) + } + + private authorizationHeader() { + return {authorization: `Bearer ${this.apiKey}`} + } + + private parseDocumentName(file: string): string { + return path.basename(file).replace(path.extname(file), '') + } + + private writeResponseToFile(response: Response, file: string) { + return new Promise((resolve, reject) => { + const fileStream = fs.createWriteStream(file, {autoClose: true}) + response.body.pipe(fileStream) + response.body.on('error', reject) + fileStream.on('finish', resolve) + }) + } + + private async handleResponse( + response: Response, + options: any, + operationName: OperationName + ): Promise { + if (options.write) { + if (response.status >= 400) { + return {[operationName]: {success: false}, peek: false} + } + + return {[operationName]: {success: true}, peek: false} + } else { + const {data} = await response.json() + + return {peek: data, [operationName]: {success: true}} + } + } +} diff --git a/cli/src/services/formatters/commit-operation.ts b/cli/src/services/formatters/commit-operation.ts new file mode 100644 index 00000000..377266ee --- /dev/null +++ b/cli/src/services/formatters/commit-operation.ts @@ -0,0 +1,55 @@ +// Vendor +import chalk from 'chalk' + +// Types +import {PeekOperation} from '../../types/operation' + +// Constants +const MASTER_ONLY_ACTIONS = ['new', 'renew', 'remove'] + +export default class CommitOperationFormatter { + public logSync(path: string) { + console.log(' ', chalk.white(path)) + console.log(' ', chalk.green('✓ Successfully synced the files in Accent')) + console.log('') + } + + public logAddTranslations(path: string) { + console.log(' ', chalk.white(path)) + console.log(' ', chalk.green('✓ Successfully add translations in Accent')) + console.log('') + } + + public logPeek(path: string, operations: PeekOperation) { + console.log(' ', chalk.white(path)) + + if (!Object.keys(operations.stats).length) { + console.log(' ', chalk.gray('~~ No changes for this file ~~')) + } + + Object.entries(operations.stats).map((stat, index) => { + let actions = Object.entries(stat[1]) + if (index > 0) { + actions = actions.filter( + ([action]) => !MASTER_ONLY_ACTIONS.includes(action) + ) + } + + actions.map(([action, name]) => { + console.log( + ' ', + chalk.bold(this.formatAction(action)), + ':', + chalk.bold.white(name) + ) + }) + }) + + console.log('') + } + + private formatAction(action: string) { + const capitalized = action.charAt(0).toUpperCase() + action.slice(1) + return capitalized.replace(/_/g, ' ') + } +} diff --git a/cli/src/services/formatters/document-export.ts b/cli/src/services/formatters/document-export.ts new file mode 100644 index 00000000..3a3df649 --- /dev/null +++ b/cli/src/services/formatters/document-export.ts @@ -0,0 +1,13 @@ +// Vendor +import chalk from 'chalk' + +export default class DocumentExportFormatter { + public log(path: string) { + console.log(' ', chalk.white(path)) + console.log( + ' ', + chalk.green('✓ Successfully write the locale files from Accent') + ) + console.log('') + } +} diff --git a/cli/src/services/formatters/hook-runner.ts b/cli/src/services/formatters/hook-runner.ts new file mode 100644 index 00000000..eda477df --- /dev/null +++ b/cli/src/services/formatters/hook-runner.ts @@ -0,0 +1,17 @@ +// Vendor +import chalk from 'chalk' +import * as decamelize from 'decamelize' + +const capitalizeFirstLetter = (str: string) => + str.charAt(0).toUpperCase() + str.slice(1) + +export default class HookRunnerFomatter { + public log(name: string, commands: string[]) { + const operation = capitalizeFirstLetter(decamelize(name, ' ')) + console.log(chalk.yellow('➤ '), chalk.bold(chalk.yellow(`${operation}:`))) + commands.forEach(command => { + console.log(' ', chalk.yellow(command)) + }) + console.log('') + } +} diff --git a/cli/src/services/formatters/project-add-translations.ts b/cli/src/services/formatters/project-add-translations.ts new file mode 100644 index 00000000..b73bc6bf --- /dev/null +++ b/cli/src/services/formatters/project-add-translations.ts @@ -0,0 +1,10 @@ +// Vendor +import chalk from 'chalk' + +export default class ProjectAddTranslationsFormatter { + public log() { + console.log(chalk.magenta('Adding translations paths')) + + console.log('') + } +} diff --git a/cli/src/services/formatters/project-export.ts b/cli/src/services/formatters/project-export.ts new file mode 100644 index 00000000..33368193 --- /dev/null +++ b/cli/src/services/formatters/project-export.ts @@ -0,0 +1,10 @@ +// Vendor +import chalk from 'chalk' + +export default class ProjectExportFormatter { + public log() { + console.log(chalk.magenta('Writing files')) + + console.log('') + } +} diff --git a/cli/src/services/formatters/project-stats.ts b/cli/src/services/formatters/project-stats.ts new file mode 100644 index 00000000..d2b2644b --- /dev/null +++ b/cli/src/services/formatters/project-stats.ts @@ -0,0 +1,84 @@ +// Vendor +import chalk from 'chalk' + +// Types +import {Document, Project, Revision} from '../../types/project' + +export default class ProjectStatsFormatter { + private readonly project: Project + + constructor(project: Project) { + this.project = project + } + + public log() { + const translationsCount = this.project.revisions.reduce( + (memo, revision: Revision) => memo + revision.translationsCount, + 0 + ) + const conflictsCount = this.project.revisions.reduce( + (memo, revision: Revision) => memo + revision.conflictsCount, + 0 + ) + const reviewedCount = this.project.revisions.reduce( + (memo, revision: Revision) => memo + revision.reviewedCount, + 0 + ) + + console.log(chalk.magenta('Last synced')) + console.log(' ', chalk.white.bold(this.project.lastSyncedAt)) + + console.log('') + + console.log(chalk.magenta('Master language')) + console.log( + ' ', + chalk.white.bold(this.project.language.name) + + ' – ' + + this.project.language.slug + ) + + console.log('') + + if (this.project.revisions.length > 1) { + console.log( + chalk.magenta(`Translations (${this.project.revisions.length - 1})`) + ) + this.project.revisions.forEach((revision: Revision) => { + if (this.project.language.id !== revision.language.id) { + console.log( + ' ', + chalk.white.bold(revision.language.name) + + ' – ' + + revision.language.slug + ) + console.log('') + } + }) + } + + console.log(chalk.magenta('Documents')) + this.project.documents.entries.forEach((document: Document) => { + console.log( + ' ', + chalk.gray('Format:'), + chalk.white.bold(document.format) + ) + console.log(' ', chalk.gray('Path:'), chalk.white.bold(document.path)) + console.log('') + }) + + console.log(chalk.magenta('Strings')) + console.log( + ' ', + chalk.white('# Strings:'), + chalk.white(`${translationsCount}`) + ) + console.log( + ' ', + chalk.green('✓ Reviewed:'), + chalk.green(`${reviewedCount}`) + ) + console.log(' ', chalk.red('× In review:'), chalk.red(`${conflictsCount}`)) + } +} diff --git a/cli/src/services/formatters/project-sync.ts b/cli/src/services/formatters/project-sync.ts new file mode 100644 index 00000000..a8449cb7 --- /dev/null +++ b/cli/src/services/formatters/project-sync.ts @@ -0,0 +1,10 @@ +// Vendor +import chalk from 'chalk' + +export default class ProjectSyncFormatter { + public log() { + console.log(chalk.magenta('Syncing sources')) + + console.log('') + } +} diff --git a/cli/src/services/hook-runner.ts b/cli/src/services/hook-runner.ts new file mode 100644 index 00000000..667cb646 --- /dev/null +++ b/cli/src/services/hook-runner.ts @@ -0,0 +1,32 @@ +// Vendor +import {execSync} from 'child_process' + +// Formatters +import Formatter from './formatters/hook-runner' + +// Types +import {HookConfig, Hooks} from '../types/document-config' +import Document from './document' + +export default class HookRunner { + public readonly hooks?: HookConfig + private readonly document: Document + + constructor(document: Document) { + this.document = document + this.hooks = document.config.hooks + } + + public async run(name: Hooks) { + if (!this.hooks) return null + const hooks = this.hooks[name] + + if (hooks) { + new Formatter().log(name, hooks) + + hooks.forEach(execSync) + } + + return this.document.refreshPaths() + } +} diff --git a/cli/src/services/project-fetcher.ts b/cli/src/services/project-fetcher.ts new file mode 100644 index 00000000..7a9e8041 --- /dev/null +++ b/cli/src/services/project-fetcher.ts @@ -0,0 +1,65 @@ +// Vendor +import {error} from '@oclif/errors' +import fetch from 'node-fetch' + +// Types +import {Config} from '../types/config' +import {Project} from '../types/project' + +export default class ProjectFetcher { + public async fetch(config: Config): Promise { + const response = await this.graphql(config) + const data = await response.json() + + if (!data.data) { + error(`Can not find the project for the key: ${config.apiKey}`) + } + + return data.data && data.data.viewer.project + } + + private graphql(config: Config) { + const query = `query ProjectDetails($project_id: ID!) { + viewer { + project(id: $project_id) { + id + name + lastSyncedAt + + language { + id + name + slug + } + documents { + entries { + id + path + format + } + } + revisions { + id + translationsCount + conflictsCount + reviewedCount + language { + id + name + slug + } + } + } + } + }` + + return fetch(`${config.apiUrl}/graphql`, { + body: JSON.stringify({query}), + headers: { + 'Content-Type': 'application/json', + authorization: `Bearer ${config.apiKey}` + }, + method: 'POST' + }) + } +} diff --git a/cli/src/services/tree.ts b/cli/src/services/tree.ts new file mode 100644 index 00000000..e5da8ffd --- /dev/null +++ b/cli/src/services/tree.ts @@ -0,0 +1,17 @@ +// Vendor +import * as glob from 'glob' + +// Types +import {DocumentConfig} from '../types/document-config' + +export default class Tree { + private readonly document: DocumentConfig + + constructor(document: DocumentConfig) { + this.document = document + } + + public list(): string[] { + return glob.sync(this.document.source, {}) + } +} diff --git a/cli/src/types/config.ts b/cli/src/types/config.ts new file mode 100644 index 00000000..e73e7a48 --- /dev/null +++ b/cli/src/types/config.ts @@ -0,0 +1,8 @@ +// Types +import {DocumentConfig} from './document-config' + +export interface Config { + apiUrl: string + apiKey: string + files: DocumentConfig[] +} diff --git a/cli/src/types/document-config.ts b/cli/src/types/document-config.ts new file mode 100644 index 00000000..bb988d17 --- /dev/null +++ b/cli/src/types/document-config.ts @@ -0,0 +1,26 @@ +export enum Hooks { + beforeAddTranslations = 'beforeAddTranslations', + afterAddTranslations = 'afterAddTranslations', + beforeExport = 'beforeExport', + afterExport = 'afterExport', + beforeSync = 'beforeSync', + afterSync = 'afterSync' +} + +export interface HookConfig { + [Hooks.beforeAddTranslations]: string[] + [Hooks.afterAddTranslations]: string[] + [Hooks.beforeExport]: string[] + [Hooks.afterExport]: string[] + [Hooks.beforeSync]: string[] + [Hooks.afterSync]: string[] +} + +export interface DocumentConfig { + name: string + language: string + format: string + source: string + target: string + hooks?: HookConfig +} diff --git a/cli/src/types/document-path.ts b/cli/src/types/document-path.ts new file mode 100644 index 00000000..61cdd24e --- /dev/null +++ b/cli/src/types/document-path.ts @@ -0,0 +1,5 @@ +export interface DocumentPath { + path: string + language: string + documentPath: string +} diff --git a/cli/src/types/operation-response.ts b/cli/src/types/operation-response.ts new file mode 100644 index 00000000..2a43e608 --- /dev/null +++ b/cli/src/types/operation-response.ts @@ -0,0 +1,4 @@ +export interface OperationResponse { + peek: any + [x: string]: any +} diff --git a/cli/src/types/operation.ts b/cli/src/types/operation.ts new file mode 100644 index 00000000..cfce4e3f --- /dev/null +++ b/cli/src/types/operation.ts @@ -0,0 +1,4 @@ +export interface PeekOperation { + operations: any[] + stats: any +} diff --git a/cli/src/types/project.ts b/cli/src/types/project.ts new file mode 100644 index 00000000..d1cab198 --- /dev/null +++ b/cli/src/types/project.ts @@ -0,0 +1,31 @@ +export interface Language { + id: string + name: string + slug: string +} + +export interface Revision { + id: string + language: Language + translationsCount: number + conflictsCount: number + reviewedCount: number +} + +export interface Document { + path: string + format: string +} + +export interface PaginatedDocuments { + entries: Document[] +} + +export interface Project { + id: string + name: string + lastSyncedAt: string + language: Language + revisions: Revision[] + documents: PaginatedDocuments +} diff --git a/cli/tsconfig.json b/cli/tsconfig.json new file mode 100644 index 00000000..01c671e9 --- /dev/null +++ b/cli/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "allowJs": false, + "allowUnreachableCode": false, + "allowSyntheticDefaultImports": true, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "importHelpers": true, + "module": "commonjs", + "outDir": "./lib", + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noEmit": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "rootDirs": [ + "./src" + ], + "skipLibCheck": true, + "strict": true, + "target": "es2017" + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "node_modules/**/*" + ] +} diff --git a/cli/tslint.json b/cli/tslint.json new file mode 100644 index 00000000..30cc7a4f --- /dev/null +++ b/cli/tslint.json @@ -0,0 +1,21 @@ +{ + "extends": ["@oclif/tslint", "tslint:latest", "tslint-config-prettier"], + "rules": { + "no-implicit-dependencies": false, + "no-submodule-imports": false, + "no-console": false, + "variable-name": [ + true, + "ban-keywords", + "check-format", + "allow-leading-underscore", + "allow-pascal-case" + ], + "prefer-const": true, + "no-empty-interface": false, + "interface-name": false, + "no-shadowed-variable": false, + "curly": [true, "ignore-same-line"], + "no-empty": false + } +}