├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── docs ├── Makefile ├── conf.py ├── index.rst ├── requirements.txt └── tutorial.rst ├── examples └── cookbook-ts │ └── src │ ├── __tests__ │ └── index.ts │ ├── index.ts │ ├── models.ts │ └── schema.ts ├── package.json ├── scripts └── preprocessor.js ├── src ├── __tests__ │ ├── __snapshots__ │ │ ├── reflection.ts.snap │ │ ├── types.ts.snap │ │ └── utils.ts.snap │ ├── index.ts │ ├── reflection.ts │ ├── registry.ts │ ├── types.ts │ └── utils.ts ├── converter.ts ├── index.ts ├── reflection.ts ├── registry.ts ├── sequelize.d.ts ├── types.ts └── utils.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib 3 | 4 | # Visual Studio Code workspace settings 5 | .vscode/* 6 | !.vscode/settings.json 7 | !.vscode/tasks.json 8 | !.vscode/launch.json 9 | !.vscode/extensions.json 10 | /coverage 11 | /.vscode 12 | *.sqlite -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | # Allow Travis tests to run in containers. 4 | sudo: false 5 | 6 | node_js: 7 | # - "4" 8 | - "6" 9 | - "8" 10 | 11 | cache: 12 | directories: 13 | - $HOME/.npm 14 | 15 | install: 16 | - npm config set spin=false 17 | - npm install -g coveralls 18 | - npm install 19 | - npm install sequelize@$SEQUELIZE_VERSION 20 | 21 | script: 22 | - npm run lint 23 | - npm test -- --coverage 24 | - coveralls < ./coverage/lcov.info || true # if coveralls doesn't have it covered 25 | 26 | env: 27 | # - GRAPHQL_VERSION='^0.10' 28 | # - GRAPHQL_VERSION='^0.11' 29 | - SEQUELIZE_VERSION='^4.33.3' 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017-present Graphene. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Graphene-JS](http://graphene-js.org) [![Build Status](https://travis-ci.org/graphql-js/graphene-sequelize.svg?branch=master)](https://travis-ci.org/graphql-js/graphene-sequelize) [![PyPI version](https://badge.fury.io/js/graphene-sequelize.svg)](https://badge.fury.io/js/graphene-sequelize) [![Coverage Status](https://coveralls.io/repos/graphql-js/graphene-sequelize/badge.svg?branch=master&service=github)](https://coveralls.io/github/graphql-js/graphene-sequelize?branch=master) 2 | 3 | A [Sequelize](http://docs.sequelizejs.com/) integration for [Graphene-JS](http://graphene-js.org/). 4 | 5 | ## Installation 6 | 7 | For installing Graphene Sequelize, just run this command in your shell 8 | 9 | ```bash 10 | npm install --save graphene-sequelize 11 | # or 12 | yarn add graphene-sequelize 13 | ``` 14 | 15 | ## Examples 16 | 17 | Here is a simple Sequelize model: 18 | 19 | ```js 20 | import * as Sequelize from "sequelize"; 21 | 22 | const UserModel = sequelize.define("user", { 23 | name: Sequelize.STRING, 24 | lastName: Sequelize.STRING 25 | }); 26 | ``` 27 | 28 | To create a GraphQL schema for it you simply have to write the following: 29 | 30 | ```js 31 | import { ObjectType, Field, Schema } from "graphene-js"; 32 | import { SequelizeObjectType } from "graphene-sequelize"; 33 | 34 | @SequelizeObjectType({ model: UserModel }) 35 | class User { 36 | // Fields will be populated automatically from the sequelize 37 | // model, and we can also add extra fields here. 38 | } 39 | 40 | class Query { 41 | @Field([User]) 42 | users() { 43 | return UserModel.findAll(); 44 | } 45 | } 46 | 47 | schema = new Schema({ query: Query }); 48 | ``` 49 | 50 | Then you can simply query the schema: 51 | 52 | ```js 53 | const query = ` 54 | query { 55 | users { 56 | name, 57 | lastName 58 | } 59 | } 60 | ` 61 | result = await schema.execute(query) 62 | ``` 63 | 64 | To learn more check out the following [examples](examples/): 65 | 66 | * **Schema with Filtering**: [Cookbook example](examples/cookbook) 67 | * **Relay Schema**: [Starwars Relay example](examples/starwars) 68 | 69 | ## Contributing 70 | 71 | After developing, the full test suite can be evaluated by running: 72 | 73 | ```sh 74 | yarn test --coverage 75 | ``` 76 | 77 | ### Documentation 78 | 79 | The [documentation](http://docs.graphene-js.org/projects/sequelize/en/latest/) is generated using the excellent [Sphinx](http://www.sphinx-doc.org/) and a custom theme. 80 | 81 | The documentation dependencies are installed by running: 82 | 83 | ```sh 84 | cd docs 85 | pip install -r requirements.txt 86 | ``` 87 | 88 | Then to produce a HTML version of the documentation: 89 | 90 | ```sh 91 | make html 92 | ``` 93 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | BUILDDIR = _build 9 | 10 | # Internal variables. 11 | PAPEROPT_a4 = -D latex_paper_size=a4 12 | PAPEROPT_letter = -D latex_paper_size=letter 13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 14 | # the i18n builder cannot share the environment and doctrees with the others 15 | I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . 16 | 17 | .PHONY: help 18 | help: 19 | @echo "Please use \`make ' where is one of" 20 | @echo " html to make standalone HTML files" 21 | @echo " dirhtml to make HTML files named index.html in directories" 22 | @echo " singlehtml to make a single large HTML file" 23 | @echo " pickle to make pickle files" 24 | @echo " json to make JSON files" 25 | @echo " htmlhelp to make HTML files and a HTML help project" 26 | @echo " qthelp to make HTML files and a qthelp project" 27 | @echo " applehelp to make an Apple Help Book" 28 | @echo " devhelp to make HTML files and a Devhelp project" 29 | @echo " epub to make an epub" 30 | @echo " epub3 to make an epub3" 31 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 32 | @echo " latexpdf to make LaTeX files and run them through pdflatex" 33 | @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" 34 | @echo " text to make text files" 35 | @echo " man to make manual pages" 36 | @echo " texinfo to make Texinfo files" 37 | @echo " info to make Texinfo files and run them through makeinfo" 38 | @echo " gettext to make PO message catalogs" 39 | @echo " changes to make an overview of all changed/added/deprecated items" 40 | @echo " xml to make Docutils-native XML files" 41 | @echo " pseudoxml to make pseudoxml-XML files for display purposes" 42 | @echo " linkcheck to check all external links for integrity" 43 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 44 | @echo " coverage to run coverage check of the documentation (if enabled)" 45 | @echo " dummy to check syntax errors of document sources" 46 | 47 | .PHONY: clean 48 | clean: 49 | rm -rf $(BUILDDIR)/* 50 | 51 | .PHONY: html 52 | html: 53 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 54 | @echo 55 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 56 | 57 | .PHONY: dirhtml 58 | dirhtml: 59 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 60 | @echo 61 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 62 | 63 | .PHONY: singlehtml 64 | singlehtml: 65 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 66 | @echo 67 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 68 | 69 | .PHONY: pickle 70 | pickle: 71 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 72 | @echo 73 | @echo "Build finished; now you can process the pickle files." 74 | 75 | .PHONY: json 76 | json: 77 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 78 | @echo 79 | @echo "Build finished; now you can process the JSON files." 80 | 81 | .PHONY: htmlhelp 82 | htmlhelp: 83 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 84 | @echo 85 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 86 | ".hhp project file in $(BUILDDIR)/htmlhelp." 87 | 88 | .PHONY: qthelp 89 | qthelp: 90 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp 91 | @echo 92 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ 93 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:" 94 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Graphene.qhcp" 95 | @echo "To view the help file:" 96 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Graphene.qhc" 97 | 98 | .PHONY: applehelp 99 | applehelp: 100 | $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp 101 | @echo 102 | @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." 103 | @echo "N.B. You won't be able to view it unless you put it in" \ 104 | "~/Library/Documentation/Help or install it in your application" \ 105 | "bundle." 106 | 107 | .PHONY: devhelp 108 | devhelp: 109 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp 110 | @echo 111 | @echo "Build finished." 112 | @echo "To view the help file:" 113 | @echo "# mkdir -p $$HOME/.local/share/devhelp/Graphene" 114 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Graphene" 115 | @echo "# devhelp" 116 | 117 | .PHONY: epub 118 | epub: 119 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 120 | @echo 121 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 122 | 123 | .PHONY: epub3 124 | epub3: 125 | $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 126 | @echo 127 | @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." 128 | 129 | .PHONY: latex 130 | latex: 131 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 132 | @echo 133 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 134 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 135 | "(use \`make latexpdf' here to do that automatically)." 136 | 137 | .PHONY: latexpdf 138 | latexpdf: 139 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 140 | @echo "Running LaTeX files through pdflatex..." 141 | $(MAKE) -C $(BUILDDIR)/latex all-pdf 142 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 143 | 144 | .PHONY: latexpdfja 145 | latexpdfja: 146 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 147 | @echo "Running LaTeX files through platex and dvipdfmx..." 148 | $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja 149 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 150 | 151 | .PHONY: text 152 | text: 153 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 154 | @echo 155 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 156 | 157 | .PHONY: man 158 | man: 159 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 160 | @echo 161 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 162 | 163 | .PHONY: texinfo 164 | texinfo: 165 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 166 | @echo 167 | @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." 168 | @echo "Run \`make' in that directory to run these through makeinfo" \ 169 | "(use \`make info' here to do that automatically)." 170 | 171 | .PHONY: info 172 | info: 173 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo 174 | @echo "Running Texinfo files through makeinfo..." 175 | make -C $(BUILDDIR)/texinfo info 176 | @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." 177 | 178 | .PHONY: gettext 179 | gettext: 180 | $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale 181 | @echo 182 | @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." 183 | 184 | .PHONY: changes 185 | changes: 186 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 187 | @echo 188 | @echo "The overview file is in $(BUILDDIR)/changes." 189 | 190 | .PHONY: linkcheck 191 | linkcheck: 192 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 193 | @echo 194 | @echo "Link check complete; look for any errors in the above output " \ 195 | "or in $(BUILDDIR)/linkcheck/output.txt." 196 | 197 | .PHONY: doctest 198 | doctest: 199 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 200 | @echo "Testing of doctests in the sources finished, look at the " \ 201 | "results in $(BUILDDIR)/doctest/output.txt." 202 | 203 | .PHONY: coverage 204 | coverage: 205 | $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage 206 | @echo "Testing of coverage in the sources finished, look at the " \ 207 | "results in $(BUILDDIR)/coverage/python.txt." 208 | 209 | .PHONY: xml 210 | xml: 211 | $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml 212 | @echo 213 | @echo "Build finished. The XML files are in $(BUILDDIR)/xml." 214 | 215 | .PHONY: pseudoxml 216 | pseudoxml: 217 | $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml 218 | @echo 219 | @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." 220 | 221 | .PHONY: dummy 222 | dummy: 223 | $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy 224 | @echo 225 | @echo "Build finished. Dummy builder generates no files." 226 | 227 | .PHONY: livehtml 228 | livehtml: 229 | sphinx-autobuild -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 230 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | on_rtd = os.environ.get('READTHEDOCS', None) == 'True' 4 | 5 | # -*- coding: utf-8 -*- 6 | # 7 | # Graphene documentation build configuration file, created by 8 | # sphinx-quickstart on Sun Sep 11 18:30:51 2016. 9 | # 10 | # This file is execfile()d with the current directory set to its 11 | # containing dir. 12 | # 13 | # Note that not all possible configuration values are present in this 14 | # autogenerated file. 15 | # 16 | # All configuration values have a default; values that are commented out 17 | # serve to show the default. 18 | 19 | # If extensions (or modules to document with autodoc) are in another directory, 20 | # add these directories to sys.path here. If the directory is relative to the 21 | # documentation root, use os.path.abspath to make it absolute, like shown here. 22 | # 23 | # import os 24 | # import sys 25 | # sys.path.insert(0, os.path.abspath('.')) 26 | 27 | # -- General configuration ------------------------------------------------ 28 | 29 | # If your documentation needs a minimal Sphinx version, state it here. 30 | # 31 | # needs_sphinx = '1.0' 32 | 33 | # Add any Sphinx extension module names here, as strings. They can be 34 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 35 | # ones. 36 | extensions = [ 37 | 'sphinx.ext.autodoc', 38 | 'sphinx.ext.intersphinx', 39 | 'sphinx.ext.todo', 40 | 'sphinx.ext.coverage', 41 | 'sphinx.ext.viewcode', 42 | ] 43 | if not on_rtd: 44 | extensions += [ 45 | 'sphinx.ext.githubpages', 46 | ] 47 | 48 | # Add any paths that contain templates here, relative to this directory. 49 | templates_path = ['_templates'] 50 | 51 | # The suffix(es) of source filenames. 52 | # You can specify multiple suffix as a list of string: 53 | # 54 | # source_suffix = ['.rst', '.md'] 55 | source_suffix = '.rst' 56 | 57 | # The encoding of source files. 58 | # 59 | # source_encoding = 'utf-8-sig' 60 | 61 | # The master toctree document. 62 | master_doc = 'index' 63 | 64 | # General information about the project. 65 | project = u'Graphene' 66 | copyright = u'Graphene-JS 2018' 67 | author = u'Syrus Akbary' 68 | 69 | # The version info for the project you're documenting, acts as replacement for 70 | # |version| and |release|, also used in various other places throughout the 71 | # built documents. 72 | # 73 | # The short X.Y version. 74 | version = u'1.0' 75 | # The full version, including alpha/beta/rc tags. 76 | release = u'1.0' 77 | 78 | # The language for content autogenerated by Sphinx. Refer to documentation 79 | # for a list of supported languages. 80 | # 81 | # This is also used if you do content translation via gettext catalogs. 82 | # Usually you set "language" from the command line for these cases. 83 | language = None 84 | 85 | # There are two options for replacing |today|: either, you set today to some 86 | # non-false value, then it is used: 87 | # 88 | # today = '' 89 | # 90 | # Else, today_fmt is used as the format for a strftime call. 91 | # 92 | # today_fmt = '%B %d, %Y' 93 | 94 | # List of patterns, relative to source directory, that match files and 95 | # directories to ignore when looking for source files. 96 | # This patterns also effect to html_static_path and html_extra_path 97 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 98 | 99 | # The reST default role (used for this markup: `text`) to use for all 100 | # documents. 101 | # 102 | # default_role = None 103 | 104 | # If true, '()' will be appended to :func: etc. cross-reference text. 105 | # 106 | # add_function_parentheses = True 107 | 108 | # If true, the current module name will be prepended to all description 109 | # unit titles (such as .. function::). 110 | # 111 | # add_module_names = True 112 | 113 | # If true, sectionauthor and moduleauthor directives will be shown in the 114 | # output. They are ignored by default. 115 | # 116 | # show_authors = False 117 | 118 | # The name of the Pygments (syntax highlighting) style to use. 119 | pygments_style = 'sphinx' 120 | 121 | # A list of ignored prefixes for module index sorting. 122 | # modindex_common_prefix = [] 123 | 124 | # If true, keep warnings as "system message" paragraphs in the built documents. 125 | # keep_warnings = False 126 | 127 | # If true, `todo` and `todoList` produce output, else they produce nothing. 128 | todo_include_todos = True 129 | 130 | 131 | # -- Options for HTML output ---------------------------------------------- 132 | 133 | # The theme to use for HTML and HTML Help pages. See the documentation for 134 | # a list of builtin themes. 135 | # 136 | # html_theme = 'alabaster' 137 | # if on_rtd: 138 | # html_theme = 'sphinx_rtd_theme' 139 | import sphinx_graphene_theme 140 | 141 | html_theme = "sphinx_graphene_theme" 142 | 143 | html_theme_path = [sphinx_graphene_theme.get_html_theme_path()] 144 | 145 | # Theme options are theme-specific and customize the look and feel of a theme 146 | # further. For a list of options available for each theme, see the 147 | # documentation. 148 | # 149 | # html_theme_options = {} 150 | 151 | # Add any paths that contain custom themes here, relative to this directory. 152 | # html_theme_path = [] 153 | 154 | # The name for this set of Sphinx documents. 155 | # " v documentation" by default. 156 | # 157 | # html_title = u'Graphene v1.0' 158 | 159 | # A shorter title for the navigation bar. Default is the same as html_title. 160 | # 161 | # html_short_title = None 162 | 163 | # The name of an image file (relative to this directory) to place at the top 164 | # of the sidebar. 165 | # 166 | # html_logo = None 167 | 168 | # The name of an image file (relative to this directory) to use as a favicon of 169 | # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 170 | # pixels large. 171 | # 172 | # html_favicon = None 173 | 174 | # Add any paths that contain custom static files (such as style sheets) here, 175 | # relative to this directory. They are copied after the builtin static files, 176 | # so a file named "default.css" will overwrite the builtin "default.css". 177 | html_static_path = ['_static'] 178 | 179 | # Add any extra paths that contain custom files (such as robots.txt or 180 | # .htaccess) here, relative to this directory. These files are copied 181 | # directly to the root of the documentation. 182 | # 183 | # html_extra_path = [] 184 | 185 | # If not None, a 'Last updated on:' timestamp is inserted at every page 186 | # bottom, using the given strftime format. 187 | # The empty string is equivalent to '%b %d, %Y'. 188 | # 189 | # html_last_updated_fmt = None 190 | 191 | # If true, SmartyPants will be used to convert quotes and dashes to 192 | # typographically correct entities. 193 | # 194 | # html_use_smartypants = True 195 | 196 | # Custom sidebar templates, maps document names to template names. 197 | # 198 | # html_sidebars = {} 199 | 200 | # Additional templates that should be rendered to pages, maps page names to 201 | # template names. 202 | # 203 | # html_additional_pages = {} 204 | 205 | # If false, no module index is generated. 206 | # 207 | # html_domain_indices = True 208 | 209 | # If false, no index is generated. 210 | # 211 | # html_use_index = True 212 | 213 | # If true, the index is split into individual pages for each letter. 214 | # 215 | # html_split_index = False 216 | 217 | # If true, links to the reST sources are added to the pages. 218 | # 219 | # html_show_sourcelink = True 220 | 221 | # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. 222 | # 223 | # html_show_sphinx = True 224 | 225 | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. 226 | # 227 | # html_show_copyright = True 228 | 229 | # If true, an OpenSearch description file will be output, and all pages will 230 | # contain a tag referring to it. The value of this option must be the 231 | # base URL from which the finished HTML is served. 232 | # 233 | # html_use_opensearch = '' 234 | 235 | # This is the file name suffix for HTML files (e.g. ".xhtml"). 236 | # html_file_suffix = None 237 | 238 | # Language to be used for generating the HTML full-text search index. 239 | # Sphinx supports the following languages: 240 | # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' 241 | # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' 242 | # 243 | # html_search_language = 'en' 244 | 245 | # A dictionary with options for the search language support, empty by default. 246 | # 'ja' uses this config value. 247 | # 'zh' user can custom change `jieba` dictionary path. 248 | # 249 | # html_search_options = {'type': 'default'} 250 | 251 | # The name of a javascript file (relative to the configuration directory) that 252 | # implements a search results scorer. If empty, the default will be used. 253 | # 254 | # html_search_scorer = 'scorer.js' 255 | 256 | # Output file base name for HTML help builder. 257 | htmlhelp_basename = 'Graphenedoc' 258 | 259 | # -- Options for LaTeX output --------------------------------------------- 260 | 261 | latex_elements = { 262 | # The paper size ('letterpaper' or 'a4paper'). 263 | # 264 | # 'papersize': 'letterpaper', 265 | 266 | # The font size ('10pt', '11pt' or '12pt'). 267 | # 268 | # 'pointsize': '10pt', 269 | 270 | # Additional stuff for the LaTeX preamble. 271 | # 272 | # 'preamble': '', 273 | 274 | # Latex figure (float) alignment 275 | # 276 | # 'figure_align': 'htbp', 277 | } 278 | 279 | # Grouping the document tree into LaTeX files. List of tuples 280 | # (source start file, target name, title, 281 | # author, documentclass [howto, manual, or own class]). 282 | latex_documents = [ 283 | (master_doc, 'Graphene.tex', u'Graphene Documentation', 284 | u'Syrus Akbary', 'manual'), 285 | ] 286 | 287 | # The name of an image file (relative to this directory) to place at the top of 288 | # the title page. 289 | # 290 | # latex_logo = None 291 | 292 | # For "manual" documents, if this is true, then toplevel headings are parts, 293 | # not chapters. 294 | # 295 | # latex_use_parts = False 296 | 297 | # If true, show page references after internal links. 298 | # 299 | # latex_show_pagerefs = False 300 | 301 | # If true, show URL addresses after external links. 302 | # 303 | # latex_show_urls = False 304 | 305 | # Documents to append as an appendix to all manuals. 306 | # 307 | # latex_appendices = [] 308 | 309 | # It false, will not define \strong, \code, itleref, \crossref ... but only 310 | # \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added 311 | # packages. 312 | # 313 | # latex_keep_old_macro_names = True 314 | 315 | # If false, no module index is generated. 316 | # 317 | # latex_domain_indices = True 318 | 319 | 320 | # -- Options for manual page output --------------------------------------- 321 | 322 | # One entry per manual page. List of tuples 323 | # (source start file, name, description, authors, manual section). 324 | man_pages = [ 325 | (master_doc, 'graphene', u'Graphene Documentation', 326 | [author], 1) 327 | ] 328 | 329 | # If true, show URL addresses after external links. 330 | # 331 | # man_show_urls = False 332 | 333 | 334 | # -- Options for Texinfo output ------------------------------------------- 335 | 336 | # Grouping the document tree into Texinfo files. List of tuples 337 | # (source start file, target name, title, author, 338 | # dir menu entry, description, category) 339 | texinfo_documents = [ 340 | (master_doc, 'Graphene', u'Graphene Documentation', 341 | author, 'Graphene', 'One line description of project.', 342 | 'Miscellaneous'), 343 | ] 344 | 345 | # Documents to append as an appendix to all manuals. 346 | # 347 | # texinfo_appendices = [] 348 | 349 | # If false, no module index is generated. 350 | # 351 | # texinfo_domain_indices = True 352 | 353 | # How to display URL addresses: 'footnote', 'no', or 'inline'. 354 | # 355 | # texinfo_show_urls = 'footnote' 356 | 357 | # If true, do not generate a @detailmenu in the "Top" node's menu. 358 | # 359 | # texinfo_no_detailmenu = False 360 | 361 | 362 | # -- Options for Epub output ---------------------------------------------- 363 | 364 | # Bibliographic Dublin Core info. 365 | epub_title = project 366 | epub_author = author 367 | epub_publisher = author 368 | epub_copyright = copyright 369 | 370 | # The basename for the epub file. It defaults to the project name. 371 | # epub_basename = project 372 | 373 | # The HTML theme for the epub output. Since the default themes are not 374 | # optimized for small screen space, using the same theme for HTML and epub 375 | # output is usually not wise. This defaults to 'epub', a theme designed to save 376 | # visual space. 377 | # 378 | # epub_theme = 'epub' 379 | 380 | # The language of the text. It defaults to the language option 381 | # or 'en' if the language is not set. 382 | # 383 | # epub_language = '' 384 | 385 | # The scheme of the identifier. Typical schemes are ISBN or URL. 386 | # epub_scheme = '' 387 | 388 | # The unique identifier of the text. This can be a ISBN number 389 | # or the project homepage. 390 | # 391 | # epub_identifier = '' 392 | 393 | # A unique identification for the text. 394 | # 395 | # epub_uid = '' 396 | 397 | # A tuple containing the cover image and cover page html template filenames. 398 | # 399 | # epub_cover = () 400 | 401 | # A sequence of (type, uri, title) tuples for the guide element of content.opf. 402 | # 403 | # epub_guide = () 404 | 405 | # HTML files that should be inserted before the pages created by sphinx. 406 | # The format is a list of tuples containing the path and title. 407 | # 408 | # epub_pre_files = [] 409 | 410 | # HTML files that should be inserted after the pages created by sphinx. 411 | # The format is a list of tuples containing the path and title. 412 | # 413 | # epub_post_files = [] 414 | 415 | # A list of files that should not be packed into the epub file. 416 | epub_exclude_files = ['search.html'] 417 | 418 | # The depth of the table of contents in toc.ncx. 419 | # 420 | # epub_tocdepth = 3 421 | 422 | # Allow duplicate toc entries. 423 | # 424 | # epub_tocdup = True 425 | 426 | # Choose between 'default' and 'includehidden'. 427 | # 428 | # epub_tocscope = 'default' 429 | 430 | # Fix unsupported image types using the Pillow. 431 | # 432 | # epub_fix_images = False 433 | 434 | # Scale large images. 435 | # 436 | # epub_max_image_width = 0 437 | 438 | # How to display URL addresses: 'footnote', 'no', or 'inline'. 439 | # 440 | # epub_show_urls = 'inline' 441 | 442 | # If false, no index is generated. 443 | # 444 | # epub_use_index = True 445 | 446 | 447 | # Example configuration for intersphinx: refer to the Python standard library. 448 | intersphinx_mapping = { 449 | 'https://docs.python.org/': None, 450 | 'python': ('https://docs.python.org/', None), 451 | 'graphene_django': ('http://docs.graphene-python.org/projects/django/en/latest/', None), 452 | 'graphene_sqlalchemy': ('http://docs.graphene-python.org/projects/sqlalchemy/en/latest/', None), 453 | 'graphene_gae': ('http://docs.graphene-python.org/projects/gae/en/latest/', None), 454 | } 455 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | Graphene Sequelize 2 | ================== 3 | 4 | Contents: 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | tutorial 10 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | # Required library 2 | Sphinx==1.5.3 3 | # Docs template 4 | http://graphene-js.org/sphinx_graphene_theme.zip 5 | -------------------------------------------------------------------------------- /docs/tutorial.rst: -------------------------------------------------------------------------------- 1 | Introduction tutorial - Graphene and Sequelize 2 | ============================================== 3 | 4 | Graphene has a number of additional features that are designed to make 5 | working with Sequelize *really simple*. 6 | 7 | Our primary focus here is to give a good understanding of how to connect models from Sequelize to Graphene object types. 8 | 9 | A good idea is to check the `graphene `__ documentation first. 10 | 11 | ------------ 12 | 13 | - Node or Typescript(any) 14 | - Graphene-JS 15 | 16 | Project setup 17 | ------------- 18 | 19 | .. code:: bash 20 | 21 | yarn add graphene-sequelize 22 | # or 23 | npm install graphene-sequelize 24 | 25 | 26 | Defining our models 27 | ^^^^^^^^^^^^^^^^^^^ 28 | 29 | Let's get started with these models: 30 | 31 | .. code:: typescript 32 | 33 | import * as Sequelize from "sequelize"; 34 | 35 | // We define the Sequelize Models 36 | export const sequelize = new Sequelize('database', 'username', 'password', { 37 | dialect: 'sqlite', 38 | storage: 'db.sqlite', 39 | }); 40 | 41 | export const Project = sequelize.define('project', { 42 | title: Sequelize.STRING, 43 | description: Sequelize.TEXT 44 | }) 45 | 46 | export const Task = sequelize.define('task', { 47 | title: Sequelize.STRING, 48 | description: Sequelize.TEXT, 49 | deadline: Sequelize.DATE 50 | }) 51 | 52 | 53 | GraphQL presents your objects to the world as a graph structure rather 54 | than a more hierarchical structure to which you may be accustomed. In 55 | order to create this representation, Graphene needs to know about each 56 | *type* of object which will appear in the graph. 57 | 58 | This graph also has a *root type* through which all access begins. This 59 | is the ``Query`` class below. 60 | 61 | This means, for each of our models, we are going to create a type, decorating with ``SequelizeObjectType`` 62 | 63 | After we've done that, we will list those types as fields in the ``Query`` class. 64 | 65 | 66 | .. code:: typescript 67 | 68 | import { ObjectType, Field, NonNull } from "graphene-js"; 69 | import { SequelizeObjectType } from "graphene-sequelize"; 70 | 71 | @SequelizeObjectType({model: Project}) 72 | class ProjectType { 73 | // We can add here additional files 74 | } 75 | 76 | @SequelizeObjectType({model: Task}) 77 | class TaskType { 78 | // We can add here additional files 79 | } 80 | 81 | @ObjectType() 82 | class Query { 83 | @Field(ProjectType, { args: {id: NonNull(String)}}) 84 | getProject({id}) { 85 | return Project.findById(id); 86 | } 87 | } 88 | 89 | schema = new Schema({query: Query}) 90 | 91 | 92 | Querying 93 | -------- 94 | 95 | Then we can start querying our schema: 96 | 97 | .. code:: js 98 | 99 | var result = await schema.execute('{ getProject(id: "1") { id, title } }') 100 | console.log(result.data.getProject) 101 | 102 | Congrats! You got your first graphene sequelize schema working! 103 | -------------------------------------------------------------------------------- /examples/cookbook-ts/src/__tests__/index.ts: -------------------------------------------------------------------------------- 1 | import { sequelize, Category, Ingredient } from "../models"; 2 | import schema from "../schema"; 3 | 4 | beforeAll(() => { 5 | return sequelize.sync().then(() => { 6 | Category.create({ 7 | id: 1, 8 | name: "Dairy", 9 | }); 10 | Category.create({ id: 2, name: "Meat" }); 11 | Ingredient.create({ 12 | id: 1, 13 | name: "Eggs", 14 | notes: "Good old eggs", 15 | category_id: 1, 16 | }); 17 | Ingredient.create({ 18 | id: 2, 19 | name: "Milk", 20 | notes: "Comes from a cow", 21 | category_id: 1, 22 | }); 23 | Ingredient.create({ 24 | id: 3, 25 | name: "Beef", 26 | notes: "Much like milk, this comes from a cow", 27 | category_id: 2, 28 | }); 29 | Ingredient.create({ 30 | id: 4, 31 | name: "Chicken", 32 | notes: "Definitely doesn't come from a cow", 33 | category_id: 2, 34 | }); 35 | }); 36 | }); 37 | 38 | describe("models", () => { 39 | test("has seed data correctly setup", async () => { 40 | expect(Category.count()).resolves.toEqual(2); 41 | expect(Ingredient.count()).resolves.toEqual(4); 42 | 43 | const milk = (await Ingredient.findById(2, { 44 | include: [{ model: Category, as: "category" }], 45 | })) as any; 46 | expect(milk).not.toBeNull(); 47 | expect(milk.name).toEqual("Milk"); 48 | expect(milk.notes).toEqual("Comes from a cow"); 49 | expect(milk.category.name).toEqual("Dairy"); 50 | }); 51 | }); 52 | 53 | describe("schema", () => { 54 | test("can be queried with graphql", async () => { 55 | const query = ` 56 | query GetIngredients { 57 | ingredients { 58 | id 59 | name 60 | notes 61 | category { 62 | name 63 | } 64 | } 65 | } 66 | `; 67 | const result = (await schema.execute(query)) as any; 68 | expect(result.data.ingredients).toHaveLength(4); 69 | 70 | const milk = result.data.ingredients[1]; 71 | expect(milk.name).toEqual("Milk"); 72 | expect(milk.notes).toEqual("Comes from a cow"); 73 | expect(milk.category.name).toEqual("Dairy"); 74 | }); 75 | }); 76 | -------------------------------------------------------------------------------- /examples/cookbook-ts/src/index.ts: -------------------------------------------------------------------------------- 1 | import * as express from "express"; 2 | import * as bodyParser from "body-parser"; 3 | import { graphqlExpress, graphiqlExpress } from "apollo-server-express"; 4 | 5 | import schema from "./schema"; 6 | import { sequelize, Category, Ingredient } from "./models"; 7 | 8 | sequelize.sync({ force: true }).then(() => { 9 | Category.create({ 10 | id: 1, 11 | name: "Dairy", 12 | }); 13 | Category.create({ id: 2, name: "Meat" }); 14 | Ingredient.create({ 15 | id: 1, 16 | name: "Eggs", 17 | notes: "Good old eggs", 18 | category_id: 1, 19 | }); 20 | Ingredient.create({ 21 | id: 2, 22 | name: "Milk", 23 | notes: "Comes from a cow", 24 | category_id: 1, 25 | }); 26 | Ingredient.create({ 27 | id: 3, 28 | name: "Beef", 29 | notes: "Much like milk, this comes from a cow", 30 | category_id: 2, 31 | }); 32 | Ingredient.create({ 33 | id: 4, 34 | name: "Chicken", 35 | notes: "Definitely doesn't come from a cow", 36 | category_id: 2, 37 | }); 38 | }); 39 | 40 | // Initialize the app 41 | const app = express(); 42 | 43 | // The GraphQL endpoint 44 | app.use("/graphql", bodyParser.json(), graphqlExpress({ schema })); 45 | 46 | // GraphiQL, a visual editor for queries 47 | app.use("/graphiql", graphiqlExpress({ endpointURL: "/graphql" })); 48 | 49 | // Start the server 50 | app.listen(8000, () => { 51 | // tslint:disable-next-line:no-console 52 | console.log("Go to http://localhost:8000/graphiql to run queries!"); 53 | }); 54 | -------------------------------------------------------------------------------- /examples/cookbook-ts/src/models.ts: -------------------------------------------------------------------------------- 1 | import * as Sequelize from "sequelize"; 2 | 3 | export const sequelize = new Sequelize("database", "username", "password", { 4 | dialect: "sqlite", 5 | storage: "db.sqlite", 6 | sync: { force: true }, 7 | }); 8 | 9 | export const Category = sequelize.define( 10 | "category", 11 | { 12 | name: { 13 | type: Sequelize.STRING, 14 | unique: true, 15 | }, 16 | }, 17 | { 18 | timestamps: false, 19 | tableName: "ingredients_category", 20 | } 21 | ); 22 | 23 | export const Ingredient = sequelize.define( 24 | "ingredient", 25 | { 26 | name: { 27 | type: Sequelize.STRING, 28 | unique: true, 29 | }, 30 | notes: { 31 | type: Sequelize.TEXT, 32 | defaultValue: "", 33 | }, 34 | }, 35 | { 36 | timestamps: false, 37 | tableName: "ingredients_ingredient", 38 | } 39 | ); 40 | 41 | Category.hasMany(Ingredient, { 42 | foreignKey: "category_id", 43 | }); 44 | Ingredient.belongsTo(Category, { 45 | foreignKey: "category_id", 46 | }); 47 | -------------------------------------------------------------------------------- /examples/cookbook-ts/src/schema.ts: -------------------------------------------------------------------------------- 1 | import { ObjectType, Field, NonNull, Schema } from "graphene-js"; 2 | import { SequelizeObjectType } from "../../../src"; 3 | import { Category, Ingredient } from "./models"; 4 | 5 | @SequelizeObjectType({ model: Category }) 6 | class CategoryType { 7 | // We can add here additional files 8 | } 9 | 10 | @SequelizeObjectType({ model: Ingredient }) 11 | class IngredientType { 12 | // We can add here additional files 13 | } 14 | 15 | @ObjectType() 16 | class Query { 17 | @Field(IngredientType, { args: { id: NonNull(String) } }) 18 | public async ingredient({ id }: { id: string }) { 19 | const ingredient = await Ingredient.findById(id, { 20 | include: [ 21 | { 22 | model: Category, 23 | as: "category", 24 | }, 25 | ], 26 | }); 27 | return ingredient; 28 | } 29 | @Field([IngredientType]) 30 | public async ingredients() { 31 | const ingredients = await Ingredient.findAll({ 32 | include: [ 33 | { 34 | model: Category, 35 | as: "category", 36 | }, 37 | ], 38 | }); 39 | return ingredients; 40 | } 41 | @Field(CategoryType, { args: { id: NonNull(String) } }) 42 | public async category({ id }: { id: string }) { 43 | const category = await Category.findById(id); 44 | return category; 45 | } 46 | @Field([CategoryType]) 47 | public async categories() { 48 | const categories = await Category.findAll(); 49 | return categories; 50 | } 51 | } 52 | 53 | const schema = new Schema({ query: Query }); 54 | 55 | export default schema; 56 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "graphene-sequelize", 3 | "version": "0.1.0", 4 | "description": "Graphene Sequelize integration", 5 | "main": "./lib/index.js", 6 | "typings": "./lib/index.d.ts", 7 | "scripts": { 8 | "clean": "rm -rf lib", 9 | "compile": "tsc", 10 | "watch": "tsc -w", 11 | "prepublish": "npm run clean && npm run compile", 12 | "test": "./node_modules/.bin/jest", 13 | "posttest": "npm run lint", 14 | "lint": "tslint $(find src | grep ts$)" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "graphql-js/graphene-sequelize" 19 | }, 20 | "keywords": [ 21 | "GraphQL", 22 | "Graphene", 23 | "JavaScript", 24 | "TypeScript", 25 | "Schema", 26 | "Schema Language", 27 | "Tools" 28 | ], 29 | "author": "Syrus Akbary ", 30 | "license": "MIT", 31 | "homepage": "https://github.com/graphql-js/graphene-sequelize/", 32 | "bugs": { 33 | "url": "https://github.com/graphql-js/graphene-sequelize/issues" 34 | }, 35 | "engines": { 36 | "node": ">=6.0" 37 | }, 38 | "devDependencies": { 39 | "@types/body-parser": "^1.16.8", 40 | "@types/common-tags": "^1.2.5", 41 | "@types/express": "^4.11.1", 42 | "@types/glob": "^5.0.30", 43 | "@types/graphql": "^0.9.4", 44 | "@types/inflected": "^1.1.29", 45 | "@types/jest": "^20.0.6", 46 | "@types/node": "^8.0.51", 47 | "@types/node-fetch": "^1.6.7", 48 | "@types/yargs": "^8.0.2", 49 | "ansi-regex": "^3.0.0", 50 | "apollo-server-express": "^1.3.2", 51 | "body-parser": "^1.18.2", 52 | "common-tags": "^1.4.0", 53 | "express": "^4.16.3", 54 | "jest": "^20.0.4", 55 | "jest-matcher-utils": "^20.0.3", 56 | "sequelize": "^4.33.3", 57 | "sqlite3": "^3.1.13", 58 | "ts-node": "^5.0.1", 59 | "tslint": "^5.9.1", 60 | "typescript": "^2.7.1" 61 | }, 62 | "dependencies": { 63 | "@types/sequelize": "^4.27.5", 64 | "graphene-js": "^0.5.1", 65 | "reflect-metadata": "^0.1.12" 66 | }, 67 | "jest": { 68 | "testEnvironment": "node", 69 | "setupFiles": [], 70 | "testMatch": [ 71 | "**/__tests__/**/*.(js|ts)", 72 | "**/__tests__/*.(js|ts)" 73 | ], 74 | "testPathIgnorePatterns": [ 75 | "/node_modules/", 76 | "/lib/", 77 | "/scripts/", 78 | "/scripts/preprocessor.js" 79 | ], 80 | "collectCoverageFrom": [ 81 | "src/**" 82 | ], 83 | "coveragePathIgnorePatterns": [ 84 | "/node_modules/", 85 | "/__snapshots__/", 86 | ".*.d.ts" 87 | ], 88 | "transform": { 89 | ".(js|ts)": "/scripts/preprocessor.js" 90 | }, 91 | "moduleFileExtensions": [ 92 | "ts", 93 | "js" 94 | ] 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /scripts/preprocessor.js: -------------------------------------------------------------------------------- 1 | const tsc = require("typescript"); 2 | const tsConfig = require("../tsconfig.json"); 3 | 4 | module.exports = { 5 | process(src, path) { 6 | return tsc.transpile(src, tsConfig.compilerOptions, path, []); 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /src/__tests__/__snapshots__/reflection.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Registry getSequelizeModel fails if doesn't have any model attached 1`] = ` 4 | "The target class User { 5 | } have no Sequelize type associated to it." 6 | `; 7 | 8 | exports[`Registry setSequelizeModel fails if model is already set 1`] = ` 9 | "Type class User { 10 | } already have a Sequelize model attached." 11 | `; 12 | -------------------------------------------------------------------------------- /src/__tests__/__snapshots__/types.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`utils SequelizeObjectType can overwrite field 1`] = ` 4 | Object { 5 | "createdAt": Object { 6 | "args": Array [], 7 | "deprecationReason": undefined, 8 | "description": undefined, 9 | "isDeprecated": false, 10 | "name": "createdAt", 11 | "resolve": [Function], 12 | "type": "DateTime!", 13 | }, 14 | "id": Object { 15 | "args": Array [], 16 | "deprecationReason": undefined, 17 | "description": undefined, 18 | "isDeprecated": false, 19 | "name": "id", 20 | "resolve": [Function], 21 | "type": "String", 22 | }, 23 | "lastName": Object { 24 | "args": Array [], 25 | "deprecationReason": undefined, 26 | "description": "The last name", 27 | "isDeprecated": false, 28 | "name": "lastName", 29 | "resolve": [Function], 30 | "type": "String", 31 | }, 32 | "name": Object { 33 | "args": Array [], 34 | "deprecationReason": undefined, 35 | "description": undefined, 36 | "isDeprecated": false, 37 | "name": "name", 38 | "resolve": [Function], 39 | "type": "String", 40 | }, 41 | "updatedAt": Object { 42 | "args": Array [], 43 | "deprecationReason": undefined, 44 | "description": undefined, 45 | "isDeprecated": false, 46 | "name": "updatedAt", 47 | "resolve": [Function], 48 | "type": "DateTime!", 49 | }, 50 | } 51 | `; 52 | 53 | exports[`utils SequelizeObjectType can query 1`] = ` 54 | Object { 55 | "data": Object { 56 | "allUsers": Array [ 57 | Object { 58 | "fullName": "Lee Byron", 59 | "id": 1, 60 | "lastName": "Byron", 61 | "name": "Lee", 62 | }, 63 | Object { 64 | "fullName": "Oleg Ilyenko", 65 | "id": 2, 66 | "lastName": "Ilyenko", 67 | "name": "Oleg", 68 | }, 69 | Object { 70 | "fullName": "Sashko Stubailo", 71 | "id": 3, 72 | "lastName": "Stubailo", 73 | "name": "Sashko", 74 | }, 75 | Object { 76 | "fullName": "Johannes Schickling", 77 | "id": 4, 78 | "lastName": "Schickling", 79 | "name": "Johannes", 80 | }, 81 | ], 82 | }, 83 | } 84 | `; 85 | 86 | exports[`utils SequelizeObjectType many relations can resolve 1`] = ` 87 | Object { 88 | "data": Object { 89 | "company": Object { 90 | "employees": Array [ 91 | Object { 92 | "fullName": "Lee Byron", 93 | "id": 1, 94 | }, 95 | Object { 96 | "fullName": "Oleg Ilyenko", 97 | "id": 2, 98 | }, 99 | Object { 100 | "fullName": "Sashko Stubailo", 101 | "id": 3, 102 | }, 103 | Object { 104 | "fullName": "Johannes Schickling", 105 | "id": 4, 106 | }, 107 | ], 108 | "id": 1, 109 | }, 110 | }, 111 | } 112 | `; 113 | 114 | exports[`utils SequelizeObjectType set many relations (reverse registration) 1`] = ` 115 | Object { 116 | "createdAt": Object { 117 | "args": Array [], 118 | "deprecationReason": undefined, 119 | "description": undefined, 120 | "isDeprecated": false, 121 | "name": "createdAt", 122 | "resolve": [Function], 123 | "type": "DateTime!", 124 | }, 125 | "employees": Object { 126 | "args": Array [], 127 | "deprecationReason": undefined, 128 | "description": undefined, 129 | "isDeprecated": false, 130 | "name": "employees", 131 | "resolve": [Function], 132 | "type": "[User]", 133 | }, 134 | "id": Object { 135 | "args": Array [], 136 | "deprecationReason": undefined, 137 | "description": undefined, 138 | "isDeprecated": false, 139 | "name": "id", 140 | "resolve": [Function], 141 | "type": "Int!", 142 | }, 143 | "name": Object { 144 | "args": Array [], 145 | "deprecationReason": undefined, 146 | "description": undefined, 147 | "isDeprecated": false, 148 | "name": "name", 149 | "resolve": [Function], 150 | "type": "String", 151 | }, 152 | "updatedAt": Object { 153 | "args": Array [], 154 | "deprecationReason": undefined, 155 | "description": undefined, 156 | "isDeprecated": false, 157 | "name": "updatedAt", 158 | "resolve": [Function], 159 | "type": "DateTime!", 160 | }, 161 | } 162 | `; 163 | 164 | exports[`utils SequelizeObjectType set many relations 1`] = ` 165 | Object { 166 | "createdAt": Object { 167 | "args": Array [], 168 | "deprecationReason": undefined, 169 | "description": undefined, 170 | "isDeprecated": false, 171 | "name": "createdAt", 172 | "resolve": [Function], 173 | "type": "DateTime!", 174 | }, 175 | "employees": Object { 176 | "args": Array [], 177 | "deprecationReason": undefined, 178 | "description": undefined, 179 | "isDeprecated": false, 180 | "name": "employees", 181 | "resolve": [Function], 182 | "type": "[User]", 183 | }, 184 | "id": Object { 185 | "args": Array [], 186 | "deprecationReason": undefined, 187 | "description": undefined, 188 | "isDeprecated": false, 189 | "name": "id", 190 | "resolve": [Function], 191 | "type": "Int!", 192 | }, 193 | "name": Object { 194 | "args": Array [], 195 | "deprecationReason": undefined, 196 | "description": undefined, 197 | "isDeprecated": false, 198 | "name": "name", 199 | "resolve": [Function], 200 | "type": "String", 201 | }, 202 | "updatedAt": Object { 203 | "args": Array [], 204 | "deprecationReason": undefined, 205 | "description": undefined, 206 | "isDeprecated": false, 207 | "name": "updatedAt", 208 | "resolve": [Function], 209 | "type": "DateTime!", 210 | }, 211 | } 212 | `; 213 | 214 | exports[`utils SequelizeObjectType works 1`] = ` 215 | Object { 216 | "createdAt": Object { 217 | "args": Array [], 218 | "deprecationReason": undefined, 219 | "description": undefined, 220 | "isDeprecated": false, 221 | "name": "createdAt", 222 | "resolve": [Function], 223 | "type": "DateTime!", 224 | }, 225 | "id": Object { 226 | "args": Array [], 227 | "deprecationReason": undefined, 228 | "description": undefined, 229 | "isDeprecated": false, 230 | "name": "id", 231 | "resolve": [Function], 232 | "type": "Int!", 233 | }, 234 | "lastName": Object { 235 | "args": Array [], 236 | "deprecationReason": undefined, 237 | "description": "The last name", 238 | "isDeprecated": false, 239 | "name": "lastName", 240 | "resolve": [Function], 241 | "type": "String", 242 | }, 243 | "name": Object { 244 | "args": Array [], 245 | "deprecationReason": undefined, 246 | "description": undefined, 247 | "isDeprecated": false, 248 | "name": "name", 249 | "resolve": [Function], 250 | "type": "String", 251 | }, 252 | "updatedAt": Object { 253 | "args": Array [], 254 | "deprecationReason": undefined, 255 | "description": undefined, 256 | "isDeprecated": false, 257 | "name": "updatedAt", 258 | "resolve": [Function], 259 | "type": "DateTime!", 260 | }, 261 | } 262 | `; 263 | 264 | exports[`utils SequelizeObjectType works 2`] = `"Expected to receive a Sequelize.Model. Received null instead."`; 265 | 266 | exports[`utils SequelizeObjectType works 3`] = `"Expected to receive a Registry instance. Received [object Object] instead."`; 267 | -------------------------------------------------------------------------------- /src/__tests__/__snapshots__/utils.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`utils assertRegistry fails on non registry 1`] = `"Expected to receive a Registry instance. Received [object Object] instead."`; 4 | 5 | exports[`utils assertSequelizeModel fails on model instance 1`] = `"Expected to receive a Sequelize.Model. Received a sequelize instance instead: [object SequelizeInstance:user]."`; 6 | 7 | exports[`utils assertSequelizeModel fails on non sequelize models 1`] = `"Expected to receive a Sequelize.Model. Received null instead."`; 8 | -------------------------------------------------------------------------------- /src/__tests__/index.ts: -------------------------------------------------------------------------------- 1 | import * as Index from "./../index"; 2 | 3 | describe("index", () => { 4 | test("has exported properties", () => { 5 | expect(Index).toHaveProperty("SequelizeObjectType"); 6 | expect(Index).toHaveProperty("getGlobalRegistry"); 7 | expect(Index).toHaveProperty("resetGlobalRegistry"); 8 | expect(Index).toHaveProperty("Registry"); 9 | expect(Index).toHaveProperty("getSequelizeModel"); 10 | expect(Index).toHaveProperty("setSequelizeModel"); 11 | expect(Index).toHaveProperty("assertSequelizeModel"); 12 | expect(Index).toHaveProperty("assertRegistry"); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /src/__tests__/reflection.ts: -------------------------------------------------------------------------------- 1 | jest.mock("../utils"); 2 | import { Model, assertSequelizeModel } from "../utils"; 3 | import { getSequelizeModel, setSequelizeModel } from "./../reflection"; 4 | import * as Sequelize from "sequelize"; 5 | 6 | describe("Registry", () => { 7 | test("getSequelizeModel / setSequelizeModel works", () => { 8 | class User {} 9 | const mockSequelize = new Object(); 10 | setSequelizeModel(User, mockSequelize); 11 | expect(assertSequelizeModel).toBeCalledWith(mockSequelize); 12 | expect(getSequelizeModel(User)).toBe(mockSequelize); 13 | // expect(registry.getTypeForModel(mockSequelize)).toBe(User); 14 | }); 15 | 16 | test("getSequelizeModel fails if doesn't have any model attached", () => { 17 | class User {} 18 | expect(() => getSequelizeModel(User)).toThrowErrorMatchingSnapshot(); 19 | // expect(registry.getTypeForModel(mockSequelize)).toBe(User); 20 | }); 21 | 22 | test("setSequelizeModel fails if model is already set", () => { 23 | class User {} 24 | const mockSequelize = new Object(); 25 | setSequelizeModel(User, mockSequelize); 26 | expect(() => 27 | setSequelizeModel(User, mockSequelize) 28 | ).toThrowErrorMatchingSnapshot(); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /src/__tests__/registry.ts: -------------------------------------------------------------------------------- 1 | jest.mock("../utils"); 2 | import { setSequelizeModel } from "./../reflection"; 3 | import { Model, assertSequelizeModel } from "../utils"; 4 | import { 5 | Registry, 6 | getGlobalRegistry, 7 | resetGlobalRegistry 8 | } from "./../registry"; 9 | import * as Sequelize from "sequelize"; 10 | 11 | describe("Registry", () => { 12 | test("can create registry", () => { 13 | const registry = new Registry(); 14 | class User {} 15 | const mockSequelize = new Object(); 16 | setSequelizeModel(User, mockSequelize); 17 | registry.register(User); 18 | expect(assertSequelizeModel).toBeCalledWith(mockSequelize); 19 | expect(registry.getTypeForModel(mockSequelize)).toBe(User); 20 | }); 21 | 22 | test("getTypeForModel returns null if model not in registry", () => { 23 | const registry = new Registry(); 24 | class User {} 25 | const mockSequelize = new Object(); 26 | expect(registry.getTypeForModel(mockSequelize)).toBeNull(); 27 | }); 28 | 29 | test("getGlobalRegistry returns a Registry", () => { 30 | const registry: Registry = getGlobalRegistry(); 31 | expect(registry).toBeInstanceOf(Registry); 32 | }); 33 | 34 | test("getGlobalRegistry returns the same registry if called twice", () => { 35 | const registry1: Registry = getGlobalRegistry(); 36 | const registry2: Registry = getGlobalRegistry(); 37 | expect(registry1).toBe(registry2); 38 | }); 39 | 40 | test("resetGlobalRegistry", () => { 41 | const registry1: Registry = getGlobalRegistry(); 42 | resetGlobalRegistry(); 43 | const registry2: Registry = getGlobalRegistry(); 44 | expect(registry1).not.toBe(registry2); 45 | }); 46 | }); 47 | -------------------------------------------------------------------------------- /src/__tests__/types.ts: -------------------------------------------------------------------------------- 1 | import { GraphQLObjectType } from "graphql"; 2 | import * as Sequelize from "sequelize"; 3 | import { 4 | getFields, 5 | getGraphQLType, 6 | ObjectType, 7 | Field, 8 | ID, 9 | Schema 10 | } from "graphene-js"; 11 | 12 | import { Model } from "./../utils"; 13 | import { SequelizeObjectType } from "./../types"; 14 | import { Registry } from "./../registry"; 15 | import { resetGlobalRegistry } from ".."; 16 | 17 | describe("utils", () => { 18 | const sequelize = new Sequelize("db", "username", "pass", { 19 | dialect: "sqlite", 20 | storage: ":memory:", 21 | logging: () => null 22 | }); 23 | 24 | let userModel: Model = sequelize.define("user", { 25 | name: Sequelize.STRING, 26 | lastName: { type: Sequelize.STRING, comment: "The last name" } 27 | }); 28 | 29 | let companyModel: Model = sequelize.define("company", { 30 | name: Sequelize.STRING 31 | }); 32 | 33 | // companyModel.hasOne(userModel, { as: "owner" }); 34 | companyModel.belongsToMany(userModel, { 35 | as: "employees", 36 | through: "CompanyEmployees", 37 | foreignKey: "companyId" 38 | }); 39 | 40 | const createCompany = async (employees: any[]) => { 41 | let company = await companyModel.create({ 42 | name: "GraphQL" 43 | }); 44 | await company.setEmployees(employees); 45 | return company; 46 | }; 47 | 48 | const createUsers = async () => { 49 | await userModel.create({ 50 | name: "Lee", 51 | lastName: "Byron" 52 | }); 53 | 54 | await userModel.create({ 55 | name: "Oleg", 56 | lastName: "Ilyenko" 57 | }); 58 | 59 | await userModel.create({ 60 | name: "Sashko", 61 | lastName: "Stubailo" 62 | }); 63 | 64 | await userModel.create({ 65 | name: "Johannes", 66 | lastName: "Schickling" 67 | }); 68 | }; 69 | beforeEach(async () => { 70 | resetGlobalRegistry(); 71 | await sequelize.sync(); 72 | }); 73 | 74 | afterEach(async () => { 75 | await sequelize.drop(); 76 | }); 77 | 78 | test("SequelizeObjectType works", () => { 79 | @SequelizeObjectType({ model: userModel }) 80 | class User {} 81 | 82 | expect( 83 | (getGraphQLType(User)).getFields() 84 | ).toMatchSnapshot(); 85 | }); 86 | 87 | test("SequelizeObjectType can overwrite field", () => { 88 | @SequelizeObjectType({ model: userModel }) 89 | class User { 90 | @Field(String) public id: string; 91 | } 92 | 93 | expect( 94 | (getGraphQLType(User)).getFields() 95 | ).toMatchSnapshot(); 96 | }); 97 | 98 | test("SequelizeObjectType works", () => { 99 | expect(() => { 100 | @SequelizeObjectType({ model: null }) 101 | class User {} 102 | }).toThrowErrorMatchingSnapshot(); 103 | }); 104 | 105 | test("SequelizeObjectType works", () => { 106 | expect(() => { 107 | @SequelizeObjectType({ model: userModel, registry: {} }) 108 | class User {} 109 | }).toThrowErrorMatchingSnapshot(); 110 | }); 111 | 112 | test("SequelizeObjectType can query", async () => { 113 | @SequelizeObjectType({ model: userModel }) 114 | class User { 115 | @Field(String) 116 | private fullName(this: any) { 117 | return `${this.name} ${this.lastName}`; 118 | } 119 | } 120 | 121 | @ObjectType() 122 | class Query { 123 | @Field(User, { args: { id: ID } }) 124 | private getUser({ id }: { id: string }) { 125 | return userModel.findById(id); 126 | } 127 | 128 | @Field([User]) 129 | private allUsers() { 130 | return userModel.findAll(); 131 | } 132 | } 133 | 134 | await createUsers(); 135 | 136 | const schema = new Schema({ query: Query }); 137 | const result = await schema.execute( 138 | `{ allUsers { id name lastName fullName } }` 139 | ); 140 | expect(result).toMatchSnapshot(); 141 | }); 142 | 143 | test("SequelizeObjectType set many relations", () => { 144 | @SequelizeObjectType({ model: userModel }) 145 | class User {} 146 | 147 | @SequelizeObjectType({ model: companyModel }) 148 | class Company {} 149 | 150 | expect( 151 | (getGraphQLType(Company)).getFields() 152 | ).toHaveProperty("employees"); 153 | 154 | expect( 155 | (getGraphQLType(Company)).getFields() 156 | ).toMatchSnapshot(); 157 | }); 158 | 159 | test("SequelizeObjectType set many relations (reverse registration)", () => { 160 | @SequelizeObjectType({ model: companyModel }) 161 | class Company {} 162 | 163 | @SequelizeObjectType({ model: userModel }) 164 | class User {} 165 | 166 | expect( 167 | (getGraphQLType(Company)).getFields() 168 | ).toHaveProperty("employees"); 169 | 170 | expect( 171 | (getGraphQLType(Company)).getFields() 172 | ).toMatchSnapshot(); 173 | }); 174 | 175 | test("SequelizeObjectType many relations can resolve", async () => { 176 | @SequelizeObjectType({ model: companyModel }) 177 | class Company {} 178 | 179 | @SequelizeObjectType({ model: userModel }) 180 | class User { 181 | @Field(String) 182 | private fullName(this: any) { 183 | return `${this.name} ${this.lastName}`; 184 | } 185 | } 186 | 187 | await createUsers(); 188 | let employees = await userModel.findAll(); 189 | let company = await createCompany(employees); 190 | @ObjectType() 191 | class Query { 192 | @Field(Company) 193 | protected company() { 194 | return company; 195 | } 196 | } 197 | 198 | const schema = new Schema({ query: Query }); 199 | const result = await schema.execute( 200 | `{ company { id, employees { id fullName } } }` 201 | ); 202 | expect(result).toMatchSnapshot(); 203 | }); 204 | }); 205 | -------------------------------------------------------------------------------- /src/__tests__/utils.ts: -------------------------------------------------------------------------------- 1 | import * as Sequelize from "sequelize"; 2 | import { assertSequelizeModel, assertRegistry, Model } from "./../utils"; 3 | import { Registry } from "./../registry"; 4 | 5 | describe("utils", () => { 6 | const sequelize = new Sequelize("db", "username", "pass", { 7 | dialect: "sqlite", 8 | storage: ":memory:", 9 | logging: () => null 10 | }); 11 | 12 | let model: Model = sequelize.define("user", { 13 | name: Sequelize.STRING, 14 | lastName: Sequelize.STRING 15 | }); 16 | 17 | beforeEach(async () => { 18 | await model.sync(); 19 | }); 20 | 21 | afterEach(async () => { 22 | await model.drop(); 23 | }); 24 | 25 | test("assertSequelizeModel fails on non sequelize models", () => { 26 | expect(() => assertSequelizeModel(null)).toThrowErrorMatchingSnapshot(); 27 | }); 28 | 29 | test("assertSequelizeModel fails on model instance", async () => { 30 | let user = await model.create({ name: "Peter", lastName: "Griffin" }); 31 | expect(() => assertSequelizeModel(user)).toThrowErrorMatchingSnapshot(); 32 | }); 33 | 34 | test("assertSequelizeModel succeeds on model", () => { 35 | assertSequelizeModel(model); 36 | }); 37 | 38 | test("assertRegistry fails on non registry", async () => { 39 | let registry = new Object(); 40 | expect(() => assertRegistry(registry)).toThrowErrorMatchingSnapshot(); 41 | }); 42 | 43 | test("assertRegistry succeeds on registry", () => { 44 | let registry = new Registry(); 45 | assertRegistry(registry); 46 | }); 47 | }); 48 | -------------------------------------------------------------------------------- /src/converter.ts: -------------------------------------------------------------------------------- 1 | import { ModelAssociations } from "./sequelize.d"; 2 | import * as Sequelize from "sequelize"; 3 | import { DataTypes as DT, Associations } from "sequelize"; 4 | import { 5 | Int, 6 | Float, 7 | Date, 8 | DateTime, 9 | Time, 10 | Boolean, 11 | ID, 12 | List, 13 | NonNull, 14 | Field, 15 | DynamicField, 16 | FieldConfig 17 | } from "graphene-js"; 18 | import { ModelAttributes } from "./sequelize"; 19 | import { Registry } from "."; 20 | 21 | // Hack to fix the typing issue on Sequelize 22 | // as DataTypes is written as an interface rather than a proper type structure. 23 | const DataTypes: DT = (Sequelize as any).DataTypes; 24 | 25 | type DataType = DT[keyof DT]; 26 | 27 | const ATTR_MAPPING = [ 28 | // [DataTypes.ABSTRACT, null], 29 | [DataTypes.STRING, String], 30 | [DataTypes.CHAR, String], 31 | [DataTypes.TEXT, String], 32 | [DataTypes.TINYINT, Int], 33 | [DataTypes.SMALLINT, Int], 34 | [DataTypes.MEDIUMINT, Int], 35 | [DataTypes.INTEGER, Int], 36 | [DataTypes.BIGINT, Int], 37 | [DataTypes.FLOAT, Float], 38 | [DataTypes.NUMBER, Number], 39 | [DataTypes.DATEONLY, Date], 40 | [DataTypes.TIME, Time], 41 | [DataTypes.DATE, DateTime], 42 | [DataTypes.BOOLEAN, Boolean], 43 | [DataTypes.NOW, DateTime], 44 | [DataTypes.BLOB, String], 45 | [DataTypes.DECIMAL, Float], 46 | [DataTypes.NUMERIC, Number], 47 | [DataTypes.UUID, ID], 48 | [DataTypes.UUIDV1, ID], 49 | [DataTypes.UUIDV4, ID], 50 | [DataTypes.HSTORE, null], 51 | [DataTypes.JSON, null], 52 | [DataTypes.JSONB, null], 53 | [DataTypes.VIRTUAL, null], 54 | [DataTypes.ARRAY, List], 55 | [DataTypes.NONE, null], 56 | [DataTypes.ENUM, null], 57 | [DataTypes.RANGE, List], 58 | [DataTypes.REAL, Float], 59 | [DataTypes.DOUBLE, Float], 60 | [DataTypes["DOUBLE PRECISION"], Float], 61 | [DataTypes.GEOMETRY, null] 62 | ]; 63 | 64 | export const getGrapheneTypeFromAttributeType = (type: DataType): any => { 65 | for (let [dataType, grapheneType] of ATTR_MAPPING) { 66 | // console.log(dataType); 67 | if (type instanceof dataType) { 68 | return grapheneType; 69 | } 70 | } 71 | return null; 72 | }; 73 | 74 | export type Fields = { 75 | [key: string]: (target: any, name: string) => void; 76 | }; 77 | 78 | export const attributesToFields = (attributes: ModelAttributes): Fields => { 79 | let fields: Fields = {}; 80 | for (let attrName in attributes) { 81 | let attribute = attributes[attrName]; 82 | let grapheneType = getGrapheneTypeFromAttributeType(attribute.type); 83 | if (!grapheneType) { 84 | continue; 85 | } 86 | if (attribute.allowNull === false) { 87 | grapheneType = NonNull(grapheneType); 88 | } 89 | fields[attrName] = Field(grapheneType, { description: attribute.comment }); 90 | } 91 | return fields; 92 | }; 93 | 94 | const getResolverGetter = ( 95 | model: Sequelize.Model, 96 | name: string 97 | ): Function => { 98 | return (model).prototype[ 99 | "get" + name.substr(0, 1).toUpperCase() + name.substr(1) 100 | ]; 101 | }; 102 | 103 | export const associationsToFields = ( 104 | associations: ModelAssociations, 105 | registry: Registry 106 | ): Fields => { 107 | let fields: Fields = {}; 108 | for (let associationName in associations) { 109 | let association = associations[associationName]; 110 | // let fieldType: any; 111 | // fields[associationName] = Field() 112 | switch (association.associationType) { 113 | case "HasMany": 114 | case "BelongsToMany": 115 | fields[associationName] = DynamicField((): FieldConfig | null => { 116 | let targetType = registry.getTypeForModel(association.target); 117 | if (!targetType) { 118 | return null; 119 | } 120 | let resolverGetter = getResolverGetter( 121 | association.source, 122 | associationName 123 | ); 124 | 125 | return { 126 | type: List(targetType), 127 | resolver: function(root: any) { 128 | return resolverGetter.call(root); 129 | } 130 | }; 131 | }); 132 | break; 133 | case "HasOne": 134 | case "BelongsTo": 135 | fields[associationName] = DynamicField((): FieldConfig | null => { 136 | let targetType = registry.getTypeForModel(association.target); 137 | if (!targetType) { 138 | return null; 139 | } 140 | let resolverGetter = getResolverGetter( 141 | association.source, 142 | associationName 143 | ); 144 | return { 145 | type: targetType, 146 | resolver: function(root: any) { 147 | return resolverGetter.call(root); 148 | } 149 | }; 150 | }); 151 | break; 152 | default: 153 | break; 154 | } 155 | // if () 156 | // console.log( 157 | // associationName, 158 | // association.source, 159 | // association.target, 160 | // association.as, 161 | // association.associationType 162 | // ); 163 | } 164 | return fields; 165 | }; 166 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { SequelizeObjectType, SequelizeObjectTypeConfig } from "./types"; 2 | export { getGlobalRegistry, resetGlobalRegistry, Registry } from "./registry"; 3 | export { getSequelizeModel, setSequelizeModel } from "./reflection"; 4 | export { assertSequelizeModel, assertRegistry } from "./utils"; 5 | -------------------------------------------------------------------------------- /src/reflection.ts: -------------------------------------------------------------------------------- 1 | import { Model, assertSequelizeModel } from "./utils"; 2 | import "reflect-metadata"; 3 | import * as Sequelize from "sequelize"; 4 | 5 | export const GRAPHENE_SEQUELIZE_MODEL = "graphene:sequelize:model"; 6 | 7 | // A utility funciton to get the sequelize model given a type 8 | export const getSequelizeModel = (target: any): Sequelize.Model => { 9 | const metadataType: Model = Reflect.getMetadata( 10 | GRAPHENE_SEQUELIZE_MODEL, 11 | target 12 | ); 13 | if (metadataType) { 14 | return metadataType; 15 | } 16 | throw new Error( 17 | `The target ${target} have no Sequelize type associated to it.` 18 | ); 19 | }; 20 | 21 | // An utility function to associate a Sequelize Model 22 | // with the specified target. 23 | // This method takes full advantage of the Reflection API. 24 | export const setSequelizeModel = ( 25 | target: any, 26 | model: Sequelize.Model 27 | ): void => { 28 | // Has the provided type a Sequelize Model? 29 | // Will fail if not. 30 | assertSequelizeModel(model); 31 | 32 | // First we check this type have no other model associated with it. 33 | if (Reflect.hasMetadata(GRAPHENE_SEQUELIZE_MODEL, target)) { 34 | throw new Error( 35 | `Type ${String(target)} already have a Sequelize model attached.` 36 | ); 37 | } 38 | // We define the type metadata through reflection 39 | Reflect.defineMetadata(GRAPHENE_SEQUELIZE_MODEL, model, target); 40 | }; 41 | -------------------------------------------------------------------------------- /src/registry.ts: -------------------------------------------------------------------------------- 1 | import { assertSequelizeModel, Model } from "./utils"; 2 | import * as Sequelize from "sequelize"; 3 | import { getSequelizeModel } from "./reflection"; 4 | 5 | export type RegistryMapping = Sequelize.Model[]; 6 | 7 | export class Registry { 8 | public mapping: RegistryMapping[]; 9 | constructor() { 10 | this.mapping = []; 11 | } 12 | public register(sequelizeType: any) { 13 | let model: Model = getSequelizeModel(sequelizeType); 14 | this.mapping.push(sequelizeType); 15 | } 16 | public getTypeForModel(model: Sequelize.Model) { 17 | assertSequelizeModel(model); 18 | for (let sequelizeType of this.mapping) { 19 | let sequelizeTypeModel: Model = getSequelizeModel(sequelizeType); 20 | if (sequelizeTypeModel === model) { 21 | return sequelizeType; 22 | } 23 | } 24 | return null; 25 | } 26 | } 27 | 28 | let registry: Registry | null = null; 29 | 30 | export const getGlobalRegistry = (): Registry => { 31 | if (registry === null) { 32 | registry = new Registry(); 33 | } 34 | return registry; 35 | }; 36 | 37 | export const resetGlobalRegistry = () => { 38 | registry = null; 39 | }; 40 | -------------------------------------------------------------------------------- /src/sequelize.d.ts: -------------------------------------------------------------------------------- 1 | import { Hooks, Associations, DataTypes, Model } from "sequelize"; 2 | 3 | export type ModelAttributes = { 4 | [key: string]: { 5 | type: DataTypes[keyof DataTypes]; 6 | model: Model; 7 | allowNull?: boolean; 8 | primaryKey?: boolean; 9 | fieldName: string; 10 | field: string; 11 | comment?: string; 12 | }; 13 | }; 14 | 15 | export type AssociationType = 16 | | "HasMany" 17 | | "BelongsTo" 18 | | "HasOne" 19 | | "BelongsToMany"; 20 | 21 | export type Association = { 22 | source: Model; 23 | target: Model; 24 | options: any; 25 | isSelfAssociation: boolean; 26 | as?: string; 27 | associationType: AssociationType; 28 | }; 29 | 30 | export type ModelAssociations = { 31 | [key: string]: Association; 32 | }; 33 | 34 | declare namespace sequelize { 35 | interface Model 36 | extends Hooks, 37 | Associations { 38 | attributes: ModelAttributes; 39 | associations: ModelAssociations; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import { attributesToFields, associationsToFields, Fields } from "./converter"; 2 | import { setSequelizeModel } from "./reflection"; 3 | import { assertSequelizeModel, Model, assertRegistry } from "./utils"; 4 | import { Registry, getGlobalRegistry } from "./registry"; 5 | import { getFields, ObjectTypeConfig, ObjectType } from "graphene-js"; 6 | import { ModelAttributes, ModelAssociations } from "./sequelize"; 7 | 8 | export type SequelizeObjectTypeConfig = ObjectTypeConfig & { 9 | model: Model; 10 | registry?: Registry; 11 | }; 12 | 13 | export const SequelizeObjectType = (opts: SequelizeObjectTypeConfig) => < 14 | T extends { new (...args: any[]): {}; [key: string]: any } 15 | >( 16 | target: T 17 | ): T => { 18 | let { model, registry, ...objectTypeOpts } = opts; 19 | assertSequelizeModel(model); 20 | if (!registry) { 21 | registry = getGlobalRegistry(); 22 | } else { 23 | assertRegistry(registry); 24 | } 25 | let attributes: ModelAttributes = (model as any).attributes; 26 | let associations: ModelAssociations = (model as any).associations; 27 | // console.log((model as any).associations); 28 | // console.log(target.name, model.); 29 | let modelAttributeFields: Fields = attributesToFields(attributes); 30 | let modelAssociationFields: Fields = associationsToFields( 31 | associations, 32 | registry 33 | ); 34 | let baseFields = getFields(target); 35 | let modelFields: Fields = { 36 | ...modelAttributeFields, 37 | ...modelAssociationFields 38 | }; 39 | for (let fieldName in modelFields) { 40 | if (fieldName in baseFields) { 41 | // If the field is already defined on the base 42 | // objecttype, then we just skip it to avoid conflict. 43 | continue; 44 | } 45 | let field = modelFields[fieldName]; 46 | // We setup the field 47 | field(target.prototype, fieldName); 48 | } 49 | setSequelizeModel(target, model); 50 | registry.register(target); 51 | return ObjectType(objectTypeOpts)(target); 52 | }; 53 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as Sequelize from "sequelize"; 2 | import { Registry } from "./registry"; 3 | 4 | export type Model = Sequelize.Model; 5 | 6 | export const assertSequelizeModel = (model: any) => { 7 | if (model instanceof Sequelize.Model) { 8 | throw new Error( 9 | `Expected to receive a Sequelize.Model. Received a sequelize instance instead: ${model}.` 10 | ); 11 | } 12 | if (!model || model.constructor !== Sequelize.Model.constructor) { 13 | throw new Error( 14 | `Expected to receive a Sequelize.Model. Received ${model} instead.` 15 | ); 16 | } 17 | }; 18 | 19 | export const assertRegistry = (registry: any) => { 20 | if (!(registry instanceof Registry)) { 21 | throw new Error( 22 | `Expected to receive a Registry instance. Received ${registry} instead.` 23 | ); 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2015", 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "sourceMap": true, 7 | "declaration": true, 8 | "outDir": "./lib", 9 | "removeComments": true, 10 | "strict": true, 11 | "noImplicitReturns": true, 12 | "noFallthroughCasesInSwitch": true, 13 | "noUnusedParameters": true, 14 | "allowJs": false, 15 | "allowSyntheticDefaultImports": true, 16 | "allowUnreachableCode": true, 17 | "strictPropertyInitialization": false, 18 | "experimentalDecorators": true, 19 | "emitDecoratorMetadata": true 20 | }, 21 | "include": [ 22 | "src/**/*", 23 | "test/**/*", 24 | "examples/**/*", 25 | "examples/cookbook-ts/*" 26 | ], 27 | "exclude": ["node_modules", "dist"] 28 | } 29 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "align": [false, "parameters", "arguments", "statements"], 4 | "ban": false, 5 | "class-name": true, 6 | "curly": true, 7 | "eofline": true, 8 | "indent": [true, "spaces"], 9 | "interface-name": false, 10 | "jsdoc-format": true, 11 | "label-position": true, 12 | "max-line-length": [true, 140], 13 | "member-access": true, 14 | "member-ordering": [ 15 | true, 16 | "public-before-private", 17 | "static-before-instance", 18 | "variables-before-functions" 19 | ], 20 | "no-any": false, 21 | "no-arg": true, 22 | "no-bitwise": true, 23 | "no-conditional-assignment": true, 24 | "no-consecutive-blank-lines": false, 25 | "no-console": [true, "log", "debug", "info", "time", "timeEnd", "trace"], 26 | "no-construct": true, 27 | "no-parameter-properties": true, 28 | "no-debugger": true, 29 | "no-duplicate-variable": true, 30 | "no-empty": true, 31 | "no-eval": true, 32 | "no-inferrable-types": false, 33 | "no-internal-module": true, 34 | "no-null-keyword": false, 35 | "no-require-imports": false, 36 | "no-switch-case-fall-through": true, 37 | "no-trailing-whitespace": true, 38 | "no-unused-expression": true, 39 | "no-use-before-declare": false, 40 | "no-var-keyword": true, 41 | "object-literal-sort-keys": false, 42 | "one-line": [ 43 | true, 44 | "check-open-brace", 45 | "check-catch", 46 | "check-else", 47 | "check-finally", 48 | "check-whitespace" 49 | ], 50 | "quotemark": [true, "avoid-escape"], 51 | "radix": true, 52 | "semicolon": [true, "always"], 53 | "switch-default": true, 54 | "trailing-comma": [false], 55 | "triple-equals": [true, "allow-null-check"], 56 | "typedef": [ 57 | false, 58 | "call-signature", 59 | "parameter", 60 | "arrow-parameter", 61 | "property-declaration", 62 | "variable-declaration", 63 | "member-variable-declaration" 64 | ], 65 | "typedef-whitespace": [ 66 | true, 67 | { 68 | "call-signature": "nospace", 69 | "index-signature": "nospace", 70 | "parameter": "nospace", 71 | "property-declaration": "nospace", 72 | "variable-declaration": "nospace" 73 | }, 74 | { 75 | "call-signature": "space", 76 | "index-signature": "space", 77 | "parameter": "space", 78 | "property-declaration": "space", 79 | "variable-declaration": "space" 80 | } 81 | ], 82 | "variable-name": [ 83 | true, 84 | "check-format", 85 | "allow-leading-underscore", 86 | "ban-keywords", 87 | "allow-pascal-case" 88 | ], 89 | "whitespace": [ 90 | true, 91 | "check-branch", 92 | "check-decl", 93 | "check-operator", 94 | "check-separator", 95 | "check-type" 96 | ] 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/bluebird@*": 6 | version "3.5.20" 7 | resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.20.tgz#f6363172add6f4eabb8cada53ca9af2781e8d6a1" 8 | 9 | "@types/body-parser@*", "@types/body-parser@^1.16.8": 10 | version "1.16.8" 11 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.16.8.tgz#687ec34140624a3bec2b1a8ea9268478ae8f3be3" 12 | dependencies: 13 | "@types/express" "*" 14 | "@types/node" "*" 15 | 16 | "@types/common-tags@^1.2.5": 17 | version "1.4.0" 18 | resolved "https://registry.yarnpkg.com/@types/common-tags/-/common-tags-1.4.0.tgz#28c1be61e352dde38936018984e2885caef087c1" 19 | 20 | "@types/continuation-local-storage@*": 21 | version "3.2.1" 22 | resolved "https://registry.yarnpkg.com/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#a33e0df9dce9b424d1c98fc4fdebd8578dceec7e" 23 | dependencies: 24 | "@types/node" "*" 25 | 26 | "@types/events@*": 27 | version "1.1.0" 28 | resolved "https://registry.yarnpkg.com/@types/events/-/events-1.1.0.tgz#93b1be91f63c184450385272c47b6496fd028e02" 29 | 30 | "@types/express-serve-static-core@*": 31 | version "4.11.1" 32 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz#f6f7212382d59b19d696677bcaa48a37280f5d45" 33 | dependencies: 34 | "@types/events" "*" 35 | "@types/node" "*" 36 | 37 | "@types/express@*", "@types/express@^4.11.1": 38 | version "4.11.1" 39 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.11.1.tgz#f99663b3ab32d04cb11db612ef5dd7933f75465b" 40 | dependencies: 41 | "@types/body-parser" "*" 42 | "@types/express-serve-static-core" "*" 43 | "@types/serve-static" "*" 44 | 45 | "@types/geojson@^1.0.0": 46 | version "1.0.6" 47 | resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" 48 | 49 | "@types/glob@^5.0.30": 50 | version "5.0.34" 51 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.34.tgz#ee626c9be3da877d717911c6101eee0a9871bbf4" 52 | dependencies: 53 | "@types/events" "*" 54 | "@types/minimatch" "*" 55 | "@types/node" "*" 56 | 57 | "@types/graphql@^0.9.4": 58 | version "0.9.4" 59 | resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.9.4.tgz#cdeb6bcbef9b6c584374b81aa7f48ecf3da404fa" 60 | 61 | "@types/inflected@^1.1.29": 62 | version "1.1.29" 63 | resolved "https://registry.yarnpkg.com/@types/inflected/-/inflected-1.1.29.tgz#8ef717dcf618d84584f506108ea85cd852f6d3ab" 64 | 65 | "@types/jest@^20.0.6": 66 | version "20.0.8" 67 | resolved "https://registry.yarnpkg.com/@types/jest/-/jest-20.0.8.tgz#7f8c97f73d20d3bf5448fbe33661a342002b5954" 68 | 69 | "@types/lodash@*": 70 | version "4.14.102" 71 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.102.tgz#586a3e22385fc79b07cef9c5a1c8a5387986fbc8" 72 | 73 | "@types/mime@*": 74 | version "2.0.0" 75 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" 76 | 77 | "@types/minimatch@*": 78 | version "3.0.2" 79 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.2.tgz#09c06877e478a5d5f32ce5017c2eb2b33006f6f5" 80 | 81 | "@types/node-fetch@^1.6.7": 82 | version "1.6.7" 83 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-1.6.7.tgz#521078e8f0c69a158e5022005aca92d2620f6d57" 84 | dependencies: 85 | "@types/node" "*" 86 | 87 | "@types/node@*", "@types/node@^8.0.51": 88 | version "8.5.1" 89 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5" 90 | 91 | "@types/sequelize@^4.27.5": 92 | version "4.27.5" 93 | resolved "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.27.5.tgz#3bd4019be8af888413fa95e02c98b69d019fa52f" 94 | dependencies: 95 | "@types/bluebird" "*" 96 | "@types/continuation-local-storage" "*" 97 | "@types/lodash" "*" 98 | "@types/validator" "*" 99 | 100 | "@types/serve-static@*": 101 | version "1.13.1" 102 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.1.tgz#1d2801fa635d274cd97d4ec07e26b21b44127492" 103 | dependencies: 104 | "@types/express-serve-static-core" "*" 105 | "@types/mime" "*" 106 | 107 | "@types/validator@*": 108 | version "6.3.0" 109 | resolved "https://registry.yarnpkg.com/@types/validator/-/validator-6.3.0.tgz#d7454bd67c6a933a9dbe939ae16edbf0f6894e70" 110 | 111 | "@types/yargs@^8.0.2": 112 | version "8.0.3" 113 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-8.0.3.tgz#6f0ad77792762fc69d209716dbab3201dcba56fb" 114 | 115 | abab@^1.0.3: 116 | version "1.0.4" 117 | resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" 118 | 119 | abbrev@1: 120 | version "1.1.1" 121 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 122 | 123 | accepts@~1.3.5: 124 | version "1.3.5" 125 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 126 | dependencies: 127 | mime-types "~2.1.18" 128 | negotiator "0.6.1" 129 | 130 | acorn-globals@^3.1.0: 131 | version "3.1.0" 132 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" 133 | dependencies: 134 | acorn "^4.0.4" 135 | 136 | acorn@^4.0.4: 137 | version "4.0.13" 138 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" 139 | 140 | ajv@^4.9.1: 141 | version "4.11.8" 142 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 143 | dependencies: 144 | co "^4.6.0" 145 | json-stable-stringify "^1.0.1" 146 | 147 | ajv@^5.1.0: 148 | version "5.5.2" 149 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 150 | dependencies: 151 | co "^4.6.0" 152 | fast-deep-equal "^1.0.0" 153 | fast-json-stable-stringify "^2.0.0" 154 | json-schema-traverse "^0.3.0" 155 | 156 | align-text@^0.1.1, align-text@^0.1.3: 157 | version "0.1.4" 158 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 159 | dependencies: 160 | kind-of "^3.0.2" 161 | longest "^1.0.1" 162 | repeat-string "^1.5.2" 163 | 164 | amdefine@>=0.0.4: 165 | version "1.0.1" 166 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 167 | 168 | ansi-escapes@^1.4.0: 169 | version "1.4.0" 170 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 171 | 172 | ansi-regex@^2.0.0, ansi-regex@^2.1.1: 173 | version "2.1.1" 174 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 175 | 176 | ansi-regex@^3.0.0: 177 | version "3.0.0" 178 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 179 | 180 | ansi-styles@^2.2.1: 181 | version "2.2.1" 182 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 183 | 184 | ansi-styles@^3.0.0, ansi-styles@^3.2.0: 185 | version "3.2.0" 186 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 187 | dependencies: 188 | color-convert "^1.9.0" 189 | 190 | anymatch@^1.3.0: 191 | version "1.3.2" 192 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 193 | dependencies: 194 | micromatch "^2.1.5" 195 | normalize-path "^2.0.0" 196 | 197 | apollo-cache-control@^0.0.x: 198 | version "0.0.9" 199 | resolved "https://registry.yarnpkg.com/apollo-cache-control/-/apollo-cache-control-0.0.9.tgz#77100f456fb19526d33b7f595c8ab1a2980dcbb4" 200 | dependencies: 201 | graphql-extensions "^0.0.x" 202 | 203 | apollo-server-core@^1.3.2: 204 | version "1.3.2" 205 | resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.3.2.tgz#f36855a3ebdc2d77b8b9c454380bf1d706105ffc" 206 | dependencies: 207 | apollo-cache-control "^0.0.x" 208 | apollo-tracing "^0.1.0" 209 | graphql-extensions "^0.0.x" 210 | 211 | apollo-server-express@^1.3.2: 212 | version "1.3.2" 213 | resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-1.3.2.tgz#0ff8201c0bf362804a151e1399767dae6ab7e309" 214 | dependencies: 215 | apollo-server-core "^1.3.2" 216 | apollo-server-module-graphiql "^1.3.0" 217 | 218 | apollo-server-module-graphiql@^1.3.0: 219 | version "1.3.2" 220 | resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.3.2.tgz#0a9e4c48dece3af904fee333f95f7b9817335ca7" 221 | 222 | apollo-tracing@^0.1.0: 223 | version "0.1.3" 224 | resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.1.3.tgz#6820c066bf20f9d9a4eddfc023f7c83ee2601f0b" 225 | dependencies: 226 | graphql-extensions "^0.0.x" 227 | 228 | append-transform@^0.4.0: 229 | version "0.4.0" 230 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" 231 | dependencies: 232 | default-require-extensions "^1.0.0" 233 | 234 | aproba@^1.0.3: 235 | version "1.2.0" 236 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 237 | 238 | are-we-there-yet@~1.1.2: 239 | version "1.1.4" 240 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 241 | dependencies: 242 | delegates "^1.0.0" 243 | readable-stream "^2.0.6" 244 | 245 | argparse@^1.0.7: 246 | version "1.0.9" 247 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 248 | dependencies: 249 | sprintf-js "~1.0.2" 250 | 251 | arr-diff@^2.0.0: 252 | version "2.0.0" 253 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 254 | dependencies: 255 | arr-flatten "^1.0.1" 256 | 257 | arr-flatten@^1.0.1: 258 | version "1.1.0" 259 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 260 | 261 | array-equal@^1.0.0: 262 | version "1.0.0" 263 | resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" 264 | 265 | array-flatten@1.1.1: 266 | version "1.1.1" 267 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 268 | 269 | array-unique@^0.2.1: 270 | version "0.2.1" 271 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 272 | 273 | arrify@^1.0.0, arrify@^1.0.1: 274 | version "1.0.1" 275 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 276 | 277 | asn1@~0.2.3: 278 | version "0.2.3" 279 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 280 | 281 | assert-plus@1.0.0, assert-plus@^1.0.0: 282 | version "1.0.0" 283 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 284 | 285 | assert-plus@^0.2.0: 286 | version "0.2.0" 287 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 288 | 289 | async@^1.4.0: 290 | version "1.5.2" 291 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 292 | 293 | async@^2.1.4: 294 | version "2.6.0" 295 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" 296 | dependencies: 297 | lodash "^4.14.0" 298 | 299 | asynckit@^0.4.0: 300 | version "0.4.0" 301 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 302 | 303 | aws-sign2@~0.6.0: 304 | version "0.6.0" 305 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 306 | 307 | aws-sign2@~0.7.0: 308 | version "0.7.0" 309 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 310 | 311 | aws4@^1.2.1, aws4@^1.6.0: 312 | version "1.6.0" 313 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 314 | 315 | babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: 316 | version "6.26.0" 317 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 318 | dependencies: 319 | chalk "^1.1.3" 320 | esutils "^2.0.2" 321 | js-tokens "^3.0.2" 322 | 323 | babel-core@^6.0.0, babel-core@^6.26.0: 324 | version "6.26.0" 325 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" 326 | dependencies: 327 | babel-code-frame "^6.26.0" 328 | babel-generator "^6.26.0" 329 | babel-helpers "^6.24.1" 330 | babel-messages "^6.23.0" 331 | babel-register "^6.26.0" 332 | babel-runtime "^6.26.0" 333 | babel-template "^6.26.0" 334 | babel-traverse "^6.26.0" 335 | babel-types "^6.26.0" 336 | babylon "^6.18.0" 337 | convert-source-map "^1.5.0" 338 | debug "^2.6.8" 339 | json5 "^0.5.1" 340 | lodash "^4.17.4" 341 | minimatch "^3.0.4" 342 | path-is-absolute "^1.0.1" 343 | private "^0.1.7" 344 | slash "^1.0.0" 345 | source-map "^0.5.6" 346 | 347 | babel-generator@^6.18.0, babel-generator@^6.26.0: 348 | version "6.26.0" 349 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" 350 | dependencies: 351 | babel-messages "^6.23.0" 352 | babel-runtime "^6.26.0" 353 | babel-types "^6.26.0" 354 | detect-indent "^4.0.0" 355 | jsesc "^1.3.0" 356 | lodash "^4.17.4" 357 | source-map "^0.5.6" 358 | trim-right "^1.0.1" 359 | 360 | babel-helpers@^6.24.1: 361 | version "6.24.1" 362 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 363 | dependencies: 364 | babel-runtime "^6.22.0" 365 | babel-template "^6.24.1" 366 | 367 | babel-jest@^20.0.3: 368 | version "20.0.3" 369 | resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671" 370 | dependencies: 371 | babel-core "^6.0.0" 372 | babel-plugin-istanbul "^4.0.0" 373 | babel-preset-jest "^20.0.3" 374 | 375 | babel-messages@^6.23.0: 376 | version "6.23.0" 377 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 378 | dependencies: 379 | babel-runtime "^6.22.0" 380 | 381 | babel-plugin-istanbul@^4.0.0: 382 | version "4.1.5" 383 | resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" 384 | dependencies: 385 | find-up "^2.1.0" 386 | istanbul-lib-instrument "^1.7.5" 387 | test-exclude "^4.1.1" 388 | 389 | babel-plugin-jest-hoist@^20.0.3: 390 | version "20.0.3" 391 | resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767" 392 | 393 | babel-preset-jest@^20.0.3: 394 | version "20.0.3" 395 | resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a" 396 | dependencies: 397 | babel-plugin-jest-hoist "^20.0.3" 398 | 399 | babel-register@^6.26.0: 400 | version "6.26.0" 401 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 402 | dependencies: 403 | babel-core "^6.26.0" 404 | babel-runtime "^6.26.0" 405 | core-js "^2.5.0" 406 | home-or-tmp "^2.0.0" 407 | lodash "^4.17.4" 408 | mkdirp "^0.5.1" 409 | source-map-support "^0.4.15" 410 | 411 | babel-runtime@^6.22.0, babel-runtime@^6.26.0: 412 | version "6.26.0" 413 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 414 | dependencies: 415 | core-js "^2.4.0" 416 | regenerator-runtime "^0.11.0" 417 | 418 | babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: 419 | version "6.26.0" 420 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 421 | dependencies: 422 | babel-runtime "^6.26.0" 423 | babel-traverse "^6.26.0" 424 | babel-types "^6.26.0" 425 | babylon "^6.18.0" 426 | lodash "^4.17.4" 427 | 428 | babel-traverse@^6.18.0, babel-traverse@^6.26.0: 429 | version "6.26.0" 430 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 431 | dependencies: 432 | babel-code-frame "^6.26.0" 433 | babel-messages "^6.23.0" 434 | babel-runtime "^6.26.0" 435 | babel-types "^6.26.0" 436 | babylon "^6.18.0" 437 | debug "^2.6.8" 438 | globals "^9.18.0" 439 | invariant "^2.2.2" 440 | lodash "^4.17.4" 441 | 442 | babel-types@^6.18.0, babel-types@^6.26.0: 443 | version "6.26.0" 444 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 445 | dependencies: 446 | babel-runtime "^6.26.0" 447 | esutils "^2.0.2" 448 | lodash "^4.17.4" 449 | to-fast-properties "^1.0.3" 450 | 451 | babylon@^6.18.0: 452 | version "6.18.0" 453 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 454 | 455 | balanced-match@^1.0.0: 456 | version "1.0.0" 457 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 458 | 459 | bcrypt-pbkdf@^1.0.0: 460 | version "1.0.1" 461 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 462 | dependencies: 463 | tweetnacl "^0.14.3" 464 | 465 | block-stream@*: 466 | version "0.0.9" 467 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 468 | dependencies: 469 | inherits "~2.0.0" 470 | 471 | bluebird@^3.4.6: 472 | version "3.5.1" 473 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 474 | 475 | body-parser@1.18.2, body-parser@^1.18.2: 476 | version "1.18.2" 477 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" 478 | dependencies: 479 | bytes "3.0.0" 480 | content-type "~1.0.4" 481 | debug "2.6.9" 482 | depd "~1.1.1" 483 | http-errors "~1.6.2" 484 | iconv-lite "0.4.19" 485 | on-finished "~2.3.0" 486 | qs "6.5.1" 487 | raw-body "2.3.2" 488 | type-is "~1.6.15" 489 | 490 | boom@2.x.x: 491 | version "2.10.1" 492 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 493 | dependencies: 494 | hoek "2.x.x" 495 | 496 | boom@4.x.x: 497 | version "4.3.1" 498 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 499 | dependencies: 500 | hoek "4.x.x" 501 | 502 | boom@5.x.x: 503 | version "5.2.0" 504 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 505 | dependencies: 506 | hoek "4.x.x" 507 | 508 | brace-expansion@^1.1.7: 509 | version "1.1.8" 510 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 511 | dependencies: 512 | balanced-match "^1.0.0" 513 | concat-map "0.0.1" 514 | 515 | braces@^1.8.2: 516 | version "1.8.5" 517 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 518 | dependencies: 519 | expand-range "^1.8.1" 520 | preserve "^0.2.0" 521 | repeat-element "^1.1.2" 522 | 523 | browser-resolve@^1.11.2: 524 | version "1.11.2" 525 | resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" 526 | dependencies: 527 | resolve "1.1.7" 528 | 529 | bser@1.0.2: 530 | version "1.0.2" 531 | resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" 532 | dependencies: 533 | node-int64 "^0.4.0" 534 | 535 | bser@^2.0.0: 536 | version "2.0.0" 537 | resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" 538 | dependencies: 539 | node-int64 "^0.4.0" 540 | 541 | builtin-modules@^1.0.0, builtin-modules@^1.1.1: 542 | version "1.1.1" 543 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 544 | 545 | bytes@3.0.0: 546 | version "3.0.0" 547 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 548 | 549 | callsites@^2.0.0: 550 | version "2.0.0" 551 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" 552 | 553 | camelcase@^1.0.2: 554 | version "1.2.1" 555 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 556 | 557 | camelcase@^3.0.0: 558 | version "3.0.0" 559 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 560 | 561 | caseless@~0.12.0: 562 | version "0.12.0" 563 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 564 | 565 | center-align@^0.1.1: 566 | version "0.1.3" 567 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 568 | dependencies: 569 | align-text "^0.1.3" 570 | lazy-cache "^1.0.3" 571 | 572 | chalk@^1.1.3: 573 | version "1.1.3" 574 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 575 | dependencies: 576 | ansi-styles "^2.2.1" 577 | escape-string-regexp "^1.0.2" 578 | has-ansi "^2.0.0" 579 | strip-ansi "^3.0.0" 580 | supports-color "^2.0.0" 581 | 582 | chalk@^2.3.0: 583 | version "2.3.1" 584 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" 585 | dependencies: 586 | ansi-styles "^3.2.0" 587 | escape-string-regexp "^1.0.5" 588 | supports-color "^5.2.0" 589 | 590 | ci-info@^1.0.0: 591 | version "1.1.2" 592 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" 593 | 594 | cliui@^2.1.0: 595 | version "2.1.0" 596 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 597 | dependencies: 598 | center-align "^0.1.1" 599 | right-align "^0.1.1" 600 | wordwrap "0.0.2" 601 | 602 | cliui@^3.2.0: 603 | version "3.2.0" 604 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 605 | dependencies: 606 | string-width "^1.0.1" 607 | strip-ansi "^3.0.1" 608 | wrap-ansi "^2.0.0" 609 | 610 | cls-bluebird@^2.0.1: 611 | version "2.1.0" 612 | resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.1.0.tgz#37ef1e080a8ffb55c2f4164f536f1919e7968aee" 613 | dependencies: 614 | is-bluebird "^1.0.2" 615 | shimmer "^1.1.0" 616 | 617 | co@^4.6.0: 618 | version "4.6.0" 619 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 620 | 621 | code-point-at@^1.0.0: 622 | version "1.1.0" 623 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 624 | 625 | color-convert@^1.9.0: 626 | version "1.9.1" 627 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 628 | dependencies: 629 | color-name "^1.1.1" 630 | 631 | color-name@^1.1.1: 632 | version "1.1.3" 633 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 634 | 635 | combined-stream@^1.0.5, combined-stream@~1.0.5: 636 | version "1.0.5" 637 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 638 | dependencies: 639 | delayed-stream "~1.0.0" 640 | 641 | commander@^2.12.1: 642 | version "2.14.1" 643 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" 644 | 645 | common-tags@^1.4.0: 646 | version "1.5.1" 647 | resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.5.1.tgz#e2e39931a013cd02253defeed89a1ad615a27f07" 648 | dependencies: 649 | babel-runtime "^6.26.0" 650 | 651 | concat-map@0.0.1: 652 | version "0.0.1" 653 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 654 | 655 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 656 | version "1.1.0" 657 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 658 | 659 | content-disposition@0.5.2: 660 | version "0.5.2" 661 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 662 | 663 | content-type-parser@^1.0.1: 664 | version "1.0.2" 665 | resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" 666 | 667 | content-type@~1.0.4: 668 | version "1.0.4" 669 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 670 | 671 | convert-source-map@^1.4.0, convert-source-map@^1.5.0: 672 | version "1.5.1" 673 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" 674 | 675 | cookie-signature@1.0.6: 676 | version "1.0.6" 677 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 678 | 679 | cookie@0.3.1: 680 | version "0.3.1" 681 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 682 | 683 | core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.3: 684 | version "2.5.3" 685 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" 686 | 687 | core-util-is@1.0.2, core-util-is@~1.0.0: 688 | version "1.0.2" 689 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 690 | 691 | cryptiles@2.x.x: 692 | version "2.0.5" 693 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 694 | dependencies: 695 | boom "2.x.x" 696 | 697 | cryptiles@3.x.x: 698 | version "3.1.2" 699 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 700 | dependencies: 701 | boom "5.x.x" 702 | 703 | cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": 704 | version "0.3.2" 705 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" 706 | 707 | "cssstyle@>= 0.2.37 < 0.3.0": 708 | version "0.2.37" 709 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" 710 | dependencies: 711 | cssom "0.3.x" 712 | 713 | dashdash@^1.12.0: 714 | version "1.14.1" 715 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 716 | dependencies: 717 | assert-plus "^1.0.0" 718 | 719 | debug@2.6.9, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: 720 | version "2.6.9" 721 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 722 | dependencies: 723 | ms "2.0.0" 724 | 725 | debug@^3.0.0, debug@^3.1.0: 726 | version "3.1.0" 727 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 728 | dependencies: 729 | ms "2.0.0" 730 | 731 | decamelize@^1.0.0, decamelize@^1.1.1: 732 | version "1.2.0" 733 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 734 | 735 | deep-extend@~0.4.0: 736 | version "0.4.2" 737 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 738 | 739 | deep-is@~0.1.3: 740 | version "0.1.3" 741 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 742 | 743 | default-require-extensions@^1.0.0: 744 | version "1.0.0" 745 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" 746 | dependencies: 747 | strip-bom "^2.0.0" 748 | 749 | delayed-stream@~1.0.0: 750 | version "1.0.0" 751 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 752 | 753 | delegates@^1.0.0: 754 | version "1.0.0" 755 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 756 | 757 | depd@1.1.1: 758 | version "1.1.1" 759 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" 760 | 761 | depd@^1.1.0, depd@~1.1.1, depd@~1.1.2: 762 | version "1.1.2" 763 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 764 | 765 | destroy@~1.0.4: 766 | version "1.0.4" 767 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 768 | 769 | detect-indent@^4.0.0: 770 | version "4.0.0" 771 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 772 | dependencies: 773 | repeating "^2.0.0" 774 | 775 | detect-libc@^1.0.2: 776 | version "1.0.3" 777 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 778 | 779 | diff@^3.1.0: 780 | version "3.5.0" 781 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 782 | 783 | diff@^3.2.0: 784 | version "3.4.0" 785 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" 786 | 787 | dottie@^2.0.0: 788 | version "2.0.0" 789 | resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.0.tgz#da191981c8b8d713ca0115d5898cf397c2f0ddd0" 790 | 791 | ecc-jsbn@~0.1.1: 792 | version "0.1.1" 793 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 794 | dependencies: 795 | jsbn "~0.1.0" 796 | 797 | ee-first@1.1.1: 798 | version "1.1.1" 799 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 800 | 801 | encodeurl@~1.0.2: 802 | version "1.0.2" 803 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 804 | 805 | errno@^0.1.4: 806 | version "0.1.6" 807 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" 808 | dependencies: 809 | prr "~1.0.1" 810 | 811 | error-ex@^1.2.0: 812 | version "1.3.1" 813 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 814 | dependencies: 815 | is-arrayish "^0.2.1" 816 | 817 | escape-html@~1.0.3: 818 | version "1.0.3" 819 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 820 | 821 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 822 | version "1.0.5" 823 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 824 | 825 | escodegen@^1.6.1: 826 | version "1.9.0" 827 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" 828 | dependencies: 829 | esprima "^3.1.3" 830 | estraverse "^4.2.0" 831 | esutils "^2.0.2" 832 | optionator "^0.8.1" 833 | optionalDependencies: 834 | source-map "~0.5.6" 835 | 836 | esprima@^3.1.3: 837 | version "3.1.3" 838 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 839 | 840 | esprima@^4.0.0: 841 | version "4.0.0" 842 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 843 | 844 | estraverse@^4.2.0: 845 | version "4.2.0" 846 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 847 | 848 | esutils@^2.0.2: 849 | version "2.0.2" 850 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 851 | 852 | etag@~1.8.1: 853 | version "1.8.1" 854 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 855 | 856 | exec-sh@^0.2.0: 857 | version "0.2.1" 858 | resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" 859 | dependencies: 860 | merge "^1.1.3" 861 | 862 | expand-brackets@^0.1.4: 863 | version "0.1.5" 864 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 865 | dependencies: 866 | is-posix-bracket "^0.1.0" 867 | 868 | expand-range@^1.8.1: 869 | version "1.8.2" 870 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 871 | dependencies: 872 | fill-range "^2.1.0" 873 | 874 | express@^4.16.3: 875 | version "4.16.3" 876 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" 877 | dependencies: 878 | accepts "~1.3.5" 879 | array-flatten "1.1.1" 880 | body-parser "1.18.2" 881 | content-disposition "0.5.2" 882 | content-type "~1.0.4" 883 | cookie "0.3.1" 884 | cookie-signature "1.0.6" 885 | debug "2.6.9" 886 | depd "~1.1.2" 887 | encodeurl "~1.0.2" 888 | escape-html "~1.0.3" 889 | etag "~1.8.1" 890 | finalhandler "1.1.1" 891 | fresh "0.5.2" 892 | merge-descriptors "1.0.1" 893 | methods "~1.1.2" 894 | on-finished "~2.3.0" 895 | parseurl "~1.3.2" 896 | path-to-regexp "0.1.7" 897 | proxy-addr "~2.0.3" 898 | qs "6.5.1" 899 | range-parser "~1.2.0" 900 | safe-buffer "5.1.1" 901 | send "0.16.2" 902 | serve-static "1.13.2" 903 | setprototypeof "1.1.0" 904 | statuses "~1.4.0" 905 | type-is "~1.6.16" 906 | utils-merge "1.0.1" 907 | vary "~1.1.2" 908 | 909 | extend@~3.0.0, extend@~3.0.1: 910 | version "3.0.1" 911 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 912 | 913 | extglob@^0.3.1: 914 | version "0.3.2" 915 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 916 | dependencies: 917 | is-extglob "^1.0.0" 918 | 919 | extsprintf@1.3.0: 920 | version "1.3.0" 921 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 922 | 923 | extsprintf@^1.2.0: 924 | version "1.4.0" 925 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 926 | 927 | fast-deep-equal@^1.0.0: 928 | version "1.0.0" 929 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 930 | 931 | fast-json-stable-stringify@^2.0.0: 932 | version "2.0.0" 933 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 934 | 935 | fast-levenshtein@~2.0.4: 936 | version "2.0.6" 937 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 938 | 939 | fb-watchman@^1.8.0: 940 | version "1.9.2" 941 | resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" 942 | dependencies: 943 | bser "1.0.2" 944 | 945 | fb-watchman@^2.0.0: 946 | version "2.0.0" 947 | resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" 948 | dependencies: 949 | bser "^2.0.0" 950 | 951 | filename-regex@^2.0.0: 952 | version "2.0.1" 953 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 954 | 955 | fileset@^2.0.2: 956 | version "2.0.3" 957 | resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" 958 | dependencies: 959 | glob "^7.0.3" 960 | minimatch "^3.0.3" 961 | 962 | fill-range@^2.1.0: 963 | version "2.2.3" 964 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 965 | dependencies: 966 | is-number "^2.1.0" 967 | isobject "^2.0.0" 968 | randomatic "^1.1.3" 969 | repeat-element "^1.1.2" 970 | repeat-string "^1.5.2" 971 | 972 | finalhandler@1.1.1: 973 | version "1.1.1" 974 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 975 | dependencies: 976 | debug "2.6.9" 977 | encodeurl "~1.0.2" 978 | escape-html "~1.0.3" 979 | on-finished "~2.3.0" 980 | parseurl "~1.3.2" 981 | statuses "~1.4.0" 982 | unpipe "~1.0.0" 983 | 984 | find-up@^1.0.0: 985 | version "1.1.2" 986 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 987 | dependencies: 988 | path-exists "^2.0.0" 989 | pinkie-promise "^2.0.0" 990 | 991 | find-up@^2.1.0: 992 | version "2.1.0" 993 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 994 | dependencies: 995 | locate-path "^2.0.0" 996 | 997 | for-in@^1.0.1: 998 | version "1.0.2" 999 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 1000 | 1001 | for-own@^0.1.4: 1002 | version "0.1.5" 1003 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 1004 | dependencies: 1005 | for-in "^1.0.1" 1006 | 1007 | forever-agent@~0.6.1: 1008 | version "0.6.1" 1009 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1010 | 1011 | form-data@~2.1.1: 1012 | version "2.1.4" 1013 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 1014 | dependencies: 1015 | asynckit "^0.4.0" 1016 | combined-stream "^1.0.5" 1017 | mime-types "^2.1.12" 1018 | 1019 | form-data@~2.3.1: 1020 | version "2.3.1" 1021 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" 1022 | dependencies: 1023 | asynckit "^0.4.0" 1024 | combined-stream "^1.0.5" 1025 | mime-types "^2.1.12" 1026 | 1027 | forwarded@~0.1.2: 1028 | version "0.1.2" 1029 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 1030 | 1031 | fresh@0.5.2: 1032 | version "0.5.2" 1033 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1034 | 1035 | fs.realpath@^1.0.0: 1036 | version "1.0.0" 1037 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1038 | 1039 | fstream-ignore@^1.0.5: 1040 | version "1.0.5" 1041 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 1042 | dependencies: 1043 | fstream "^1.0.0" 1044 | inherits "2" 1045 | minimatch "^3.0.0" 1046 | 1047 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 1048 | version "1.0.11" 1049 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 1050 | dependencies: 1051 | graceful-fs "^4.1.2" 1052 | inherits "~2.0.0" 1053 | mkdirp ">=0.5 0" 1054 | rimraf "2" 1055 | 1056 | gauge@~2.7.3: 1057 | version "2.7.4" 1058 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 1059 | dependencies: 1060 | aproba "^1.0.3" 1061 | console-control-strings "^1.0.0" 1062 | has-unicode "^2.0.0" 1063 | object-assign "^4.1.0" 1064 | signal-exit "^3.0.0" 1065 | string-width "^1.0.1" 1066 | strip-ansi "^3.0.1" 1067 | wide-align "^1.1.0" 1068 | 1069 | generic-pool@^3.1.8: 1070 | version "3.4.1" 1071 | resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.4.1.tgz#54103118d0cb279f77de7a0cc53396e6d0c12781" 1072 | 1073 | get-caller-file@^1.0.1: 1074 | version "1.0.2" 1075 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 1076 | 1077 | getpass@^0.1.1: 1078 | version "0.1.7" 1079 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1080 | dependencies: 1081 | assert-plus "^1.0.0" 1082 | 1083 | glob-base@^0.3.0: 1084 | version "0.3.0" 1085 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1086 | dependencies: 1087 | glob-parent "^2.0.0" 1088 | is-glob "^2.0.0" 1089 | 1090 | glob-parent@^2.0.0: 1091 | version "2.0.0" 1092 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1093 | dependencies: 1094 | is-glob "^2.0.0" 1095 | 1096 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: 1097 | version "7.1.2" 1098 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 1099 | dependencies: 1100 | fs.realpath "^1.0.0" 1101 | inflight "^1.0.4" 1102 | inherits "2" 1103 | minimatch "^3.0.4" 1104 | once "^1.3.0" 1105 | path-is-absolute "^1.0.0" 1106 | 1107 | globals@^9.18.0: 1108 | version "9.18.0" 1109 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 1110 | 1111 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 1112 | version "4.1.11" 1113 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1114 | 1115 | graphene-js@^0.5.1: 1116 | version "0.5.2" 1117 | resolved "https://registry.yarnpkg.com/graphene-js/-/graphene-js-0.5.2.tgz#4d6644d3127eda17701acaf0b6da7199492eee44" 1118 | dependencies: 1119 | graphql "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0" 1120 | graphql-iso-date "^3.5.0" 1121 | reflect-metadata "^0.1.12" 1122 | 1123 | graphql-extensions@^0.0.x: 1124 | version "0.0.8" 1125 | resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.0.8.tgz#d14d6e06db466a7f90fb97d75b657ae730278b09" 1126 | dependencies: 1127 | core-js "^2.5.3" 1128 | source-map-support "^0.5.1" 1129 | 1130 | graphql-iso-date@^3.5.0: 1131 | version "3.5.0" 1132 | resolved "https://registry.yarnpkg.com/graphql-iso-date/-/graphql-iso-date-3.5.0.tgz#55a1be0efa8d28c1453afd2eb5ce1d052189a513" 1133 | 1134 | "graphql@^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0": 1135 | version "0.12.3" 1136 | resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.12.3.tgz#11668458bbe28261c0dcb6e265f515ba79f6ce07" 1137 | dependencies: 1138 | iterall "1.1.3" 1139 | 1140 | growly@^1.3.0: 1141 | version "1.3.0" 1142 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 1143 | 1144 | handlebars@^4.0.3: 1145 | version "4.0.11" 1146 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" 1147 | dependencies: 1148 | async "^1.4.0" 1149 | optimist "^0.6.1" 1150 | source-map "^0.4.4" 1151 | optionalDependencies: 1152 | uglify-js "^2.6" 1153 | 1154 | har-schema@^1.0.5: 1155 | version "1.0.5" 1156 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 1157 | 1158 | har-schema@^2.0.0: 1159 | version "2.0.0" 1160 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 1161 | 1162 | har-validator@~4.2.1: 1163 | version "4.2.1" 1164 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 1165 | dependencies: 1166 | ajv "^4.9.1" 1167 | har-schema "^1.0.5" 1168 | 1169 | har-validator@~5.0.3: 1170 | version "5.0.3" 1171 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 1172 | dependencies: 1173 | ajv "^5.1.0" 1174 | har-schema "^2.0.0" 1175 | 1176 | has-ansi@^2.0.0: 1177 | version "2.0.0" 1178 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1179 | dependencies: 1180 | ansi-regex "^2.0.0" 1181 | 1182 | has-flag@^1.0.0: 1183 | version "1.0.0" 1184 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1185 | 1186 | has-flag@^3.0.0: 1187 | version "3.0.0" 1188 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1189 | 1190 | has-unicode@^2.0.0: 1191 | version "2.0.1" 1192 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1193 | 1194 | hawk@3.1.3, hawk@~3.1.3: 1195 | version "3.1.3" 1196 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 1197 | dependencies: 1198 | boom "2.x.x" 1199 | cryptiles "2.x.x" 1200 | hoek "2.x.x" 1201 | sntp "1.x.x" 1202 | 1203 | hawk@~6.0.2: 1204 | version "6.0.2" 1205 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 1206 | dependencies: 1207 | boom "4.x.x" 1208 | cryptiles "3.x.x" 1209 | hoek "4.x.x" 1210 | sntp "2.x.x" 1211 | 1212 | hoek@2.x.x: 1213 | version "2.16.3" 1214 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 1215 | 1216 | hoek@4.x.x: 1217 | version "4.2.0" 1218 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" 1219 | 1220 | home-or-tmp@^2.0.0: 1221 | version "2.0.0" 1222 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1223 | dependencies: 1224 | os-homedir "^1.0.0" 1225 | os-tmpdir "^1.0.1" 1226 | 1227 | hosted-git-info@^2.1.4: 1228 | version "2.5.0" 1229 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 1230 | 1231 | html-encoding-sniffer@^1.0.1: 1232 | version "1.0.2" 1233 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" 1234 | dependencies: 1235 | whatwg-encoding "^1.0.1" 1236 | 1237 | http-errors@1.6.2, http-errors@~1.6.2: 1238 | version "1.6.2" 1239 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" 1240 | dependencies: 1241 | depd "1.1.1" 1242 | inherits "2.0.3" 1243 | setprototypeof "1.0.3" 1244 | statuses ">= 1.3.1 < 2" 1245 | 1246 | http-signature@~1.1.0: 1247 | version "1.1.1" 1248 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 1249 | dependencies: 1250 | assert-plus "^0.2.0" 1251 | jsprim "^1.2.2" 1252 | sshpk "^1.7.0" 1253 | 1254 | http-signature@~1.2.0: 1255 | version "1.2.0" 1256 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1257 | dependencies: 1258 | assert-plus "^1.0.0" 1259 | jsprim "^1.2.2" 1260 | sshpk "^1.7.0" 1261 | 1262 | iconv-lite@0.4.19: 1263 | version "0.4.19" 1264 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 1265 | 1266 | inflection@1.12.0: 1267 | version "1.12.0" 1268 | resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" 1269 | 1270 | inflight@^1.0.4: 1271 | version "1.0.6" 1272 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1273 | dependencies: 1274 | once "^1.3.0" 1275 | wrappy "1" 1276 | 1277 | inherits@2, inherits@2.0.3, inherits@~2.0.0, inherits@~2.0.3: 1278 | version "2.0.3" 1279 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1280 | 1281 | ini@~1.3.0: 1282 | version "1.3.5" 1283 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1284 | 1285 | invariant@^2.2.2: 1286 | version "2.2.2" 1287 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1288 | dependencies: 1289 | loose-envify "^1.0.0" 1290 | 1291 | invert-kv@^1.0.0: 1292 | version "1.0.0" 1293 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1294 | 1295 | ipaddr.js@1.6.0: 1296 | version "1.6.0" 1297 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" 1298 | 1299 | is-arrayish@^0.2.1: 1300 | version "0.2.1" 1301 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1302 | 1303 | is-bluebird@^1.0.2: 1304 | version "1.0.2" 1305 | resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" 1306 | 1307 | is-buffer@^1.1.5: 1308 | version "1.1.6" 1309 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1310 | 1311 | is-builtin-module@^1.0.0: 1312 | version "1.0.0" 1313 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1314 | dependencies: 1315 | builtin-modules "^1.0.0" 1316 | 1317 | is-ci@^1.0.10: 1318 | version "1.0.10" 1319 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" 1320 | dependencies: 1321 | ci-info "^1.0.0" 1322 | 1323 | is-dotfile@^1.0.0: 1324 | version "1.0.3" 1325 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1326 | 1327 | is-equal-shallow@^0.1.3: 1328 | version "0.1.3" 1329 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1330 | dependencies: 1331 | is-primitive "^2.0.0" 1332 | 1333 | is-extendable@^0.1.1: 1334 | version "0.1.1" 1335 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1336 | 1337 | is-extglob@^1.0.0: 1338 | version "1.0.0" 1339 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1340 | 1341 | is-finite@^1.0.0: 1342 | version "1.0.2" 1343 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1344 | dependencies: 1345 | number-is-nan "^1.0.0" 1346 | 1347 | is-fullwidth-code-point@^1.0.0: 1348 | version "1.0.0" 1349 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1350 | dependencies: 1351 | number-is-nan "^1.0.0" 1352 | 1353 | is-glob@^2.0.0, is-glob@^2.0.1: 1354 | version "2.0.1" 1355 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1356 | dependencies: 1357 | is-extglob "^1.0.0" 1358 | 1359 | is-number@^2.1.0: 1360 | version "2.1.0" 1361 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1362 | dependencies: 1363 | kind-of "^3.0.2" 1364 | 1365 | is-number@^3.0.0: 1366 | version "3.0.0" 1367 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1368 | dependencies: 1369 | kind-of "^3.0.2" 1370 | 1371 | is-posix-bracket@^0.1.0: 1372 | version "0.1.1" 1373 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1374 | 1375 | is-primitive@^2.0.0: 1376 | version "2.0.0" 1377 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1378 | 1379 | is-typedarray@~1.0.0: 1380 | version "1.0.0" 1381 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1382 | 1383 | is-utf8@^0.2.0: 1384 | version "0.2.1" 1385 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1386 | 1387 | isarray@1.0.0, isarray@~1.0.0: 1388 | version "1.0.0" 1389 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1390 | 1391 | isexe@^2.0.0: 1392 | version "2.0.0" 1393 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1394 | 1395 | isobject@^2.0.0: 1396 | version "2.1.0" 1397 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1398 | dependencies: 1399 | isarray "1.0.0" 1400 | 1401 | isstream@~0.1.2: 1402 | version "0.1.2" 1403 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1404 | 1405 | istanbul-api@^1.1.1: 1406 | version "1.2.1" 1407 | resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" 1408 | dependencies: 1409 | async "^2.1.4" 1410 | fileset "^2.0.2" 1411 | istanbul-lib-coverage "^1.1.1" 1412 | istanbul-lib-hook "^1.1.0" 1413 | istanbul-lib-instrument "^1.9.1" 1414 | istanbul-lib-report "^1.1.2" 1415 | istanbul-lib-source-maps "^1.2.2" 1416 | istanbul-reports "^1.1.3" 1417 | js-yaml "^3.7.0" 1418 | mkdirp "^0.5.1" 1419 | once "^1.4.0" 1420 | 1421 | istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: 1422 | version "1.1.1" 1423 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" 1424 | 1425 | istanbul-lib-hook@^1.1.0: 1426 | version "1.1.0" 1427 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" 1428 | dependencies: 1429 | append-transform "^0.4.0" 1430 | 1431 | istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1: 1432 | version "1.9.1" 1433 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" 1434 | dependencies: 1435 | babel-generator "^6.18.0" 1436 | babel-template "^6.16.0" 1437 | babel-traverse "^6.18.0" 1438 | babel-types "^6.18.0" 1439 | babylon "^6.18.0" 1440 | istanbul-lib-coverage "^1.1.1" 1441 | semver "^5.3.0" 1442 | 1443 | istanbul-lib-report@^1.1.2: 1444 | version "1.1.2" 1445 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425" 1446 | dependencies: 1447 | istanbul-lib-coverage "^1.1.1" 1448 | mkdirp "^0.5.1" 1449 | path-parse "^1.0.5" 1450 | supports-color "^3.1.2" 1451 | 1452 | istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2: 1453 | version "1.2.2" 1454 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c" 1455 | dependencies: 1456 | debug "^3.1.0" 1457 | istanbul-lib-coverage "^1.1.1" 1458 | mkdirp "^0.5.1" 1459 | rimraf "^2.6.1" 1460 | source-map "^0.5.3" 1461 | 1462 | istanbul-reports@^1.1.3: 1463 | version "1.1.3" 1464 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10" 1465 | dependencies: 1466 | handlebars "^4.0.3" 1467 | 1468 | iterall@1.1.3: 1469 | version "1.1.3" 1470 | resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.3.tgz#1cbbff96204056dde6656e2ed2e2226d0e6d72c9" 1471 | 1472 | jest-changed-files@^20.0.3: 1473 | version "20.0.3" 1474 | resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8" 1475 | 1476 | jest-cli@^20.0.4: 1477 | version "20.0.4" 1478 | resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93" 1479 | dependencies: 1480 | ansi-escapes "^1.4.0" 1481 | callsites "^2.0.0" 1482 | chalk "^1.1.3" 1483 | graceful-fs "^4.1.11" 1484 | is-ci "^1.0.10" 1485 | istanbul-api "^1.1.1" 1486 | istanbul-lib-coverage "^1.0.1" 1487 | istanbul-lib-instrument "^1.4.2" 1488 | istanbul-lib-source-maps "^1.1.0" 1489 | jest-changed-files "^20.0.3" 1490 | jest-config "^20.0.4" 1491 | jest-docblock "^20.0.3" 1492 | jest-environment-jsdom "^20.0.3" 1493 | jest-haste-map "^20.0.4" 1494 | jest-jasmine2 "^20.0.4" 1495 | jest-message-util "^20.0.3" 1496 | jest-regex-util "^20.0.3" 1497 | jest-resolve-dependencies "^20.0.3" 1498 | jest-runtime "^20.0.4" 1499 | jest-snapshot "^20.0.3" 1500 | jest-util "^20.0.3" 1501 | micromatch "^2.3.11" 1502 | node-notifier "^5.0.2" 1503 | pify "^2.3.0" 1504 | slash "^1.0.0" 1505 | string-length "^1.0.1" 1506 | throat "^3.0.0" 1507 | which "^1.2.12" 1508 | worker-farm "^1.3.1" 1509 | yargs "^7.0.2" 1510 | 1511 | jest-config@^20.0.4: 1512 | version "20.0.4" 1513 | resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea" 1514 | dependencies: 1515 | chalk "^1.1.3" 1516 | glob "^7.1.1" 1517 | jest-environment-jsdom "^20.0.3" 1518 | jest-environment-node "^20.0.3" 1519 | jest-jasmine2 "^20.0.4" 1520 | jest-matcher-utils "^20.0.3" 1521 | jest-regex-util "^20.0.3" 1522 | jest-resolve "^20.0.4" 1523 | jest-validate "^20.0.3" 1524 | pretty-format "^20.0.3" 1525 | 1526 | jest-diff@^20.0.3: 1527 | version "20.0.3" 1528 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617" 1529 | dependencies: 1530 | chalk "^1.1.3" 1531 | diff "^3.2.0" 1532 | jest-matcher-utils "^20.0.3" 1533 | pretty-format "^20.0.3" 1534 | 1535 | jest-docblock@^20.0.3: 1536 | version "20.0.3" 1537 | resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712" 1538 | 1539 | jest-environment-jsdom@^20.0.3: 1540 | version "20.0.3" 1541 | resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99" 1542 | dependencies: 1543 | jest-mock "^20.0.3" 1544 | jest-util "^20.0.3" 1545 | jsdom "^9.12.0" 1546 | 1547 | jest-environment-node@^20.0.3: 1548 | version "20.0.3" 1549 | resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403" 1550 | dependencies: 1551 | jest-mock "^20.0.3" 1552 | jest-util "^20.0.3" 1553 | 1554 | jest-haste-map@^20.0.4: 1555 | version "20.0.5" 1556 | resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112" 1557 | dependencies: 1558 | fb-watchman "^2.0.0" 1559 | graceful-fs "^4.1.11" 1560 | jest-docblock "^20.0.3" 1561 | micromatch "^2.3.11" 1562 | sane "~1.6.0" 1563 | worker-farm "^1.3.1" 1564 | 1565 | jest-jasmine2@^20.0.4: 1566 | version "20.0.4" 1567 | resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1" 1568 | dependencies: 1569 | chalk "^1.1.3" 1570 | graceful-fs "^4.1.11" 1571 | jest-diff "^20.0.3" 1572 | jest-matcher-utils "^20.0.3" 1573 | jest-matchers "^20.0.3" 1574 | jest-message-util "^20.0.3" 1575 | jest-snapshot "^20.0.3" 1576 | once "^1.4.0" 1577 | p-map "^1.1.1" 1578 | 1579 | jest-matcher-utils@^20.0.3: 1580 | version "20.0.3" 1581 | resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612" 1582 | dependencies: 1583 | chalk "^1.1.3" 1584 | pretty-format "^20.0.3" 1585 | 1586 | jest-matchers@^20.0.3: 1587 | version "20.0.3" 1588 | resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60" 1589 | dependencies: 1590 | jest-diff "^20.0.3" 1591 | jest-matcher-utils "^20.0.3" 1592 | jest-message-util "^20.0.3" 1593 | jest-regex-util "^20.0.3" 1594 | 1595 | jest-message-util@^20.0.3: 1596 | version "20.0.3" 1597 | resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c" 1598 | dependencies: 1599 | chalk "^1.1.3" 1600 | micromatch "^2.3.11" 1601 | slash "^1.0.0" 1602 | 1603 | jest-mock@^20.0.3: 1604 | version "20.0.3" 1605 | resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59" 1606 | 1607 | jest-regex-util@^20.0.3: 1608 | version "20.0.3" 1609 | resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762" 1610 | 1611 | jest-resolve-dependencies@^20.0.3: 1612 | version "20.0.3" 1613 | resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a" 1614 | dependencies: 1615 | jest-regex-util "^20.0.3" 1616 | 1617 | jest-resolve@^20.0.4: 1618 | version "20.0.4" 1619 | resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5" 1620 | dependencies: 1621 | browser-resolve "^1.11.2" 1622 | is-builtin-module "^1.0.0" 1623 | resolve "^1.3.2" 1624 | 1625 | jest-runtime@^20.0.4: 1626 | version "20.0.4" 1627 | resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8" 1628 | dependencies: 1629 | babel-core "^6.0.0" 1630 | babel-jest "^20.0.3" 1631 | babel-plugin-istanbul "^4.0.0" 1632 | chalk "^1.1.3" 1633 | convert-source-map "^1.4.0" 1634 | graceful-fs "^4.1.11" 1635 | jest-config "^20.0.4" 1636 | jest-haste-map "^20.0.4" 1637 | jest-regex-util "^20.0.3" 1638 | jest-resolve "^20.0.4" 1639 | jest-util "^20.0.3" 1640 | json-stable-stringify "^1.0.1" 1641 | micromatch "^2.3.11" 1642 | strip-bom "3.0.0" 1643 | yargs "^7.0.2" 1644 | 1645 | jest-snapshot@^20.0.3: 1646 | version "20.0.3" 1647 | resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566" 1648 | dependencies: 1649 | chalk "^1.1.3" 1650 | jest-diff "^20.0.3" 1651 | jest-matcher-utils "^20.0.3" 1652 | jest-util "^20.0.3" 1653 | natural-compare "^1.4.0" 1654 | pretty-format "^20.0.3" 1655 | 1656 | jest-util@^20.0.3: 1657 | version "20.0.3" 1658 | resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad" 1659 | dependencies: 1660 | chalk "^1.1.3" 1661 | graceful-fs "^4.1.11" 1662 | jest-message-util "^20.0.3" 1663 | jest-mock "^20.0.3" 1664 | jest-validate "^20.0.3" 1665 | leven "^2.1.0" 1666 | mkdirp "^0.5.1" 1667 | 1668 | jest-validate@^20.0.3: 1669 | version "20.0.3" 1670 | resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab" 1671 | dependencies: 1672 | chalk "^1.1.3" 1673 | jest-matcher-utils "^20.0.3" 1674 | leven "^2.1.0" 1675 | pretty-format "^20.0.3" 1676 | 1677 | jest@^20.0.4: 1678 | version "20.0.4" 1679 | resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac" 1680 | dependencies: 1681 | jest-cli "^20.0.4" 1682 | 1683 | js-tokens@^3.0.0, js-tokens@^3.0.2: 1684 | version "3.0.2" 1685 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1686 | 1687 | js-yaml@^3.7.0: 1688 | version "3.10.0" 1689 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" 1690 | dependencies: 1691 | argparse "^1.0.7" 1692 | esprima "^4.0.0" 1693 | 1694 | jsbn@~0.1.0: 1695 | version "0.1.1" 1696 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1697 | 1698 | jsdom@^9.12.0: 1699 | version "9.12.0" 1700 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" 1701 | dependencies: 1702 | abab "^1.0.3" 1703 | acorn "^4.0.4" 1704 | acorn-globals "^3.1.0" 1705 | array-equal "^1.0.0" 1706 | content-type-parser "^1.0.1" 1707 | cssom ">= 0.3.2 < 0.4.0" 1708 | cssstyle ">= 0.2.37 < 0.3.0" 1709 | escodegen "^1.6.1" 1710 | html-encoding-sniffer "^1.0.1" 1711 | nwmatcher ">= 1.3.9 < 2.0.0" 1712 | parse5 "^1.5.1" 1713 | request "^2.79.0" 1714 | sax "^1.2.1" 1715 | symbol-tree "^3.2.1" 1716 | tough-cookie "^2.3.2" 1717 | webidl-conversions "^4.0.0" 1718 | whatwg-encoding "^1.0.1" 1719 | whatwg-url "^4.3.0" 1720 | xml-name-validator "^2.0.1" 1721 | 1722 | jsesc@^1.3.0: 1723 | version "1.3.0" 1724 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1725 | 1726 | json-schema-traverse@^0.3.0: 1727 | version "0.3.1" 1728 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1729 | 1730 | json-schema@0.2.3: 1731 | version "0.2.3" 1732 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1733 | 1734 | json-stable-stringify@^1.0.1: 1735 | version "1.0.1" 1736 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1737 | dependencies: 1738 | jsonify "~0.0.0" 1739 | 1740 | json-stringify-safe@~5.0.1: 1741 | version "5.0.1" 1742 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1743 | 1744 | json5@^0.5.1: 1745 | version "0.5.1" 1746 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1747 | 1748 | jsonify@~0.0.0: 1749 | version "0.0.0" 1750 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1751 | 1752 | jsprim@^1.2.2: 1753 | version "1.4.1" 1754 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1755 | dependencies: 1756 | assert-plus "1.0.0" 1757 | extsprintf "1.3.0" 1758 | json-schema "0.2.3" 1759 | verror "1.10.0" 1760 | 1761 | kind-of@^3.0.2: 1762 | version "3.2.2" 1763 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1764 | dependencies: 1765 | is-buffer "^1.1.5" 1766 | 1767 | kind-of@^4.0.0: 1768 | version "4.0.0" 1769 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1770 | dependencies: 1771 | is-buffer "^1.1.5" 1772 | 1773 | lazy-cache@^1.0.3: 1774 | version "1.0.4" 1775 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1776 | 1777 | lcid@^1.0.0: 1778 | version "1.0.0" 1779 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1780 | dependencies: 1781 | invert-kv "^1.0.0" 1782 | 1783 | leven@^2.1.0: 1784 | version "2.1.0" 1785 | resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 1786 | 1787 | levn@~0.3.0: 1788 | version "0.3.0" 1789 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1790 | dependencies: 1791 | prelude-ls "~1.1.2" 1792 | type-check "~0.3.2" 1793 | 1794 | load-json-file@^1.0.0: 1795 | version "1.1.0" 1796 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1797 | dependencies: 1798 | graceful-fs "^4.1.2" 1799 | parse-json "^2.2.0" 1800 | pify "^2.0.0" 1801 | pinkie-promise "^2.0.0" 1802 | strip-bom "^2.0.0" 1803 | 1804 | locate-path@^2.0.0: 1805 | version "2.0.0" 1806 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1807 | dependencies: 1808 | p-locate "^2.0.0" 1809 | path-exists "^3.0.0" 1810 | 1811 | lodash@^4.14.0, lodash@^4.17.4: 1812 | version "4.17.4" 1813 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1814 | 1815 | lodash@^4.17.1: 1816 | version "4.17.5" 1817 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" 1818 | 1819 | longest@^1.0.1: 1820 | version "1.0.1" 1821 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1822 | 1823 | loose-envify@^1.0.0: 1824 | version "1.3.1" 1825 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1826 | dependencies: 1827 | js-tokens "^3.0.0" 1828 | 1829 | make-error@^1.1.1: 1830 | version "1.3.4" 1831 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" 1832 | 1833 | makeerror@1.0.x: 1834 | version "1.0.11" 1835 | resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" 1836 | dependencies: 1837 | tmpl "1.0.x" 1838 | 1839 | media-typer@0.3.0: 1840 | version "0.3.0" 1841 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1842 | 1843 | merge-descriptors@1.0.1: 1844 | version "1.0.1" 1845 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1846 | 1847 | merge@^1.1.3: 1848 | version "1.2.0" 1849 | resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" 1850 | 1851 | methods@~1.1.2: 1852 | version "1.1.2" 1853 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1854 | 1855 | micromatch@^2.1.5, micromatch@^2.3.11: 1856 | version "2.3.11" 1857 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1858 | dependencies: 1859 | arr-diff "^2.0.0" 1860 | array-unique "^0.2.1" 1861 | braces "^1.8.2" 1862 | expand-brackets "^0.1.4" 1863 | extglob "^0.3.1" 1864 | filename-regex "^2.0.0" 1865 | is-extglob "^1.0.0" 1866 | is-glob "^2.0.1" 1867 | kind-of "^3.0.2" 1868 | normalize-path "^2.0.1" 1869 | object.omit "^2.0.0" 1870 | parse-glob "^3.0.4" 1871 | regex-cache "^0.4.2" 1872 | 1873 | mime-db@~1.30.0: 1874 | version "1.30.0" 1875 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 1876 | 1877 | mime-db@~1.33.0: 1878 | version "1.33.0" 1879 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 1880 | 1881 | mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: 1882 | version "2.1.17" 1883 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 1884 | dependencies: 1885 | mime-db "~1.30.0" 1886 | 1887 | mime-types@~2.1.18: 1888 | version "2.1.18" 1889 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 1890 | dependencies: 1891 | mime-db "~1.33.0" 1892 | 1893 | mime@1.4.1: 1894 | version "1.4.1" 1895 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 1896 | 1897 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 1898 | version "3.0.4" 1899 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1900 | dependencies: 1901 | brace-expansion "^1.1.7" 1902 | 1903 | minimist@0.0.8: 1904 | version "0.0.8" 1905 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1906 | 1907 | minimist@^1.1.1, minimist@^1.2.0: 1908 | version "1.2.0" 1909 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1910 | 1911 | minimist@~0.0.1: 1912 | version "0.0.10" 1913 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1914 | 1915 | "mkdirp@>=0.5 0", mkdirp@^0.5.1: 1916 | version "0.5.1" 1917 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1918 | dependencies: 1919 | minimist "0.0.8" 1920 | 1921 | moment-timezone@^0.5.4: 1922 | version "0.5.14" 1923 | resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.14.tgz#4eb38ff9538b80108ba467a458f3ed4268ccfcb1" 1924 | dependencies: 1925 | moment ">= 2.9.0" 1926 | 1927 | "moment@>= 2.9.0", moment@^2.13.0: 1928 | version "2.20.1" 1929 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" 1930 | 1931 | ms@2.0.0: 1932 | version "2.0.0" 1933 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1934 | 1935 | nan@~2.7.0: 1936 | version "2.7.0" 1937 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" 1938 | 1939 | natural-compare@^1.4.0: 1940 | version "1.4.0" 1941 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1942 | 1943 | negotiator@0.6.1: 1944 | version "0.6.1" 1945 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1946 | 1947 | node-int64@^0.4.0: 1948 | version "0.4.0" 1949 | resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" 1950 | 1951 | node-notifier@^5.0.2: 1952 | version "5.1.2" 1953 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" 1954 | dependencies: 1955 | growly "^1.3.0" 1956 | semver "^5.3.0" 1957 | shellwords "^0.1.0" 1958 | which "^1.2.12" 1959 | 1960 | node-pre-gyp@~0.6.38: 1961 | version "0.6.39" 1962 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" 1963 | dependencies: 1964 | detect-libc "^1.0.2" 1965 | hawk "3.1.3" 1966 | mkdirp "^0.5.1" 1967 | nopt "^4.0.1" 1968 | npmlog "^4.0.2" 1969 | rc "^1.1.7" 1970 | request "2.81.0" 1971 | rimraf "^2.6.1" 1972 | semver "^5.3.0" 1973 | tar "^2.2.1" 1974 | tar-pack "^3.4.0" 1975 | 1976 | nopt@^4.0.1: 1977 | version "4.0.1" 1978 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1979 | dependencies: 1980 | abbrev "1" 1981 | osenv "^0.1.4" 1982 | 1983 | normalize-package-data@^2.3.2: 1984 | version "2.4.0" 1985 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1986 | dependencies: 1987 | hosted-git-info "^2.1.4" 1988 | is-builtin-module "^1.0.0" 1989 | semver "2 || 3 || 4 || 5" 1990 | validate-npm-package-license "^3.0.1" 1991 | 1992 | normalize-path@^2.0.0, normalize-path@^2.0.1: 1993 | version "2.1.1" 1994 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1995 | dependencies: 1996 | remove-trailing-separator "^1.0.1" 1997 | 1998 | npmlog@^4.0.2: 1999 | version "4.1.2" 2000 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 2001 | dependencies: 2002 | are-we-there-yet "~1.1.2" 2003 | console-control-strings "~1.1.0" 2004 | gauge "~2.7.3" 2005 | set-blocking "~2.0.0" 2006 | 2007 | number-is-nan@^1.0.0: 2008 | version "1.0.1" 2009 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 2010 | 2011 | "nwmatcher@>= 1.3.9 < 2.0.0": 2012 | version "1.4.3" 2013 | resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" 2014 | 2015 | oauth-sign@~0.8.1, oauth-sign@~0.8.2: 2016 | version "0.8.2" 2017 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 2018 | 2019 | object-assign@^4.1.0: 2020 | version "4.1.1" 2021 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 2022 | 2023 | object.omit@^2.0.0: 2024 | version "2.0.1" 2025 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 2026 | dependencies: 2027 | for-own "^0.1.4" 2028 | is-extendable "^0.1.1" 2029 | 2030 | on-finished@~2.3.0: 2031 | version "2.3.0" 2032 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 2033 | dependencies: 2034 | ee-first "1.1.1" 2035 | 2036 | once@^1.3.0, once@^1.3.3, once@^1.4.0: 2037 | version "1.4.0" 2038 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2039 | dependencies: 2040 | wrappy "1" 2041 | 2042 | optimist@^0.6.1: 2043 | version "0.6.1" 2044 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 2045 | dependencies: 2046 | minimist "~0.0.1" 2047 | wordwrap "~0.0.2" 2048 | 2049 | optionator@^0.8.1: 2050 | version "0.8.2" 2051 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 2052 | dependencies: 2053 | deep-is "~0.1.3" 2054 | fast-levenshtein "~2.0.4" 2055 | levn "~0.3.0" 2056 | prelude-ls "~1.1.2" 2057 | type-check "~0.3.2" 2058 | wordwrap "~1.0.0" 2059 | 2060 | os-homedir@^1.0.0: 2061 | version "1.0.2" 2062 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 2063 | 2064 | os-locale@^1.4.0: 2065 | version "1.4.0" 2066 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 2067 | dependencies: 2068 | lcid "^1.0.0" 2069 | 2070 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 2071 | version "1.0.2" 2072 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 2073 | 2074 | osenv@^0.1.4: 2075 | version "0.1.4" 2076 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 2077 | dependencies: 2078 | os-homedir "^1.0.0" 2079 | os-tmpdir "^1.0.0" 2080 | 2081 | p-limit@^1.1.0: 2082 | version "1.1.0" 2083 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" 2084 | 2085 | p-locate@^2.0.0: 2086 | version "2.0.0" 2087 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 2088 | dependencies: 2089 | p-limit "^1.1.0" 2090 | 2091 | p-map@^1.1.1: 2092 | version "1.2.0" 2093 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" 2094 | 2095 | parse-glob@^3.0.4: 2096 | version "3.0.4" 2097 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 2098 | dependencies: 2099 | glob-base "^0.3.0" 2100 | is-dotfile "^1.0.0" 2101 | is-extglob "^1.0.0" 2102 | is-glob "^2.0.0" 2103 | 2104 | parse-json@^2.2.0: 2105 | version "2.2.0" 2106 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 2107 | dependencies: 2108 | error-ex "^1.2.0" 2109 | 2110 | parse5@^1.5.1: 2111 | version "1.5.1" 2112 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" 2113 | 2114 | parseurl@~1.3.2: 2115 | version "1.3.2" 2116 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 2117 | 2118 | path-exists@^2.0.0: 2119 | version "2.1.0" 2120 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 2121 | dependencies: 2122 | pinkie-promise "^2.0.0" 2123 | 2124 | path-exists@^3.0.0: 2125 | version "3.0.0" 2126 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 2127 | 2128 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 2129 | version "1.0.1" 2130 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2131 | 2132 | path-parse@^1.0.5: 2133 | version "1.0.5" 2134 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 2135 | 2136 | path-to-regexp@0.1.7: 2137 | version "0.1.7" 2138 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 2139 | 2140 | path-type@^1.0.0: 2141 | version "1.1.0" 2142 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 2143 | dependencies: 2144 | graceful-fs "^4.1.2" 2145 | pify "^2.0.0" 2146 | pinkie-promise "^2.0.0" 2147 | 2148 | performance-now@^0.2.0: 2149 | version "0.2.0" 2150 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 2151 | 2152 | performance-now@^2.1.0: 2153 | version "2.1.0" 2154 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 2155 | 2156 | pify@^2.0.0, pify@^2.3.0: 2157 | version "2.3.0" 2158 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2159 | 2160 | pinkie-promise@^2.0.0: 2161 | version "2.0.1" 2162 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 2163 | dependencies: 2164 | pinkie "^2.0.0" 2165 | 2166 | pinkie@^2.0.0: 2167 | version "2.0.4" 2168 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 2169 | 2170 | prelude-ls@~1.1.2: 2171 | version "1.1.2" 2172 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 2173 | 2174 | preserve@^0.2.0: 2175 | version "0.2.0" 2176 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 2177 | 2178 | pretty-format@^20.0.3: 2179 | version "20.0.3" 2180 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14" 2181 | dependencies: 2182 | ansi-regex "^2.1.1" 2183 | ansi-styles "^3.0.0" 2184 | 2185 | private@^0.1.7: 2186 | version "0.1.8" 2187 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 2188 | 2189 | process-nextick-args@~2.0.0: 2190 | version "2.0.0" 2191 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 2192 | 2193 | proxy-addr@~2.0.3: 2194 | version "2.0.3" 2195 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" 2196 | dependencies: 2197 | forwarded "~0.1.2" 2198 | ipaddr.js "1.6.0" 2199 | 2200 | prr@~1.0.1: 2201 | version "1.0.1" 2202 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 2203 | 2204 | punycode@^1.4.1: 2205 | version "1.4.1" 2206 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 2207 | 2208 | qs@6.5.1, qs@~6.5.1: 2209 | version "6.5.1" 2210 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 2211 | 2212 | qs@~6.4.0: 2213 | version "6.4.0" 2214 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 2215 | 2216 | randomatic@^1.1.3: 2217 | version "1.1.7" 2218 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 2219 | dependencies: 2220 | is-number "^3.0.0" 2221 | kind-of "^4.0.0" 2222 | 2223 | range-parser@~1.2.0: 2224 | version "1.2.0" 2225 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 2226 | 2227 | raw-body@2.3.2: 2228 | version "2.3.2" 2229 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" 2230 | dependencies: 2231 | bytes "3.0.0" 2232 | http-errors "1.6.2" 2233 | iconv-lite "0.4.19" 2234 | unpipe "1.0.0" 2235 | 2236 | rc@^1.1.7: 2237 | version "1.2.5" 2238 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" 2239 | dependencies: 2240 | deep-extend "~0.4.0" 2241 | ini "~1.3.0" 2242 | minimist "^1.2.0" 2243 | strip-json-comments "~2.0.1" 2244 | 2245 | read-pkg-up@^1.0.1: 2246 | version "1.0.1" 2247 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 2248 | dependencies: 2249 | find-up "^1.0.0" 2250 | read-pkg "^1.0.0" 2251 | 2252 | read-pkg@^1.0.0: 2253 | version "1.1.0" 2254 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 2255 | dependencies: 2256 | load-json-file "^1.0.0" 2257 | normalize-package-data "^2.3.2" 2258 | path-type "^1.0.0" 2259 | 2260 | readable-stream@^2.0.6, readable-stream@^2.1.4: 2261 | version "2.3.4" 2262 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" 2263 | dependencies: 2264 | core-util-is "~1.0.0" 2265 | inherits "~2.0.3" 2266 | isarray "~1.0.0" 2267 | process-nextick-args "~2.0.0" 2268 | safe-buffer "~5.1.1" 2269 | string_decoder "~1.0.3" 2270 | util-deprecate "~1.0.1" 2271 | 2272 | reflect-metadata@^0.1.12: 2273 | version "0.1.12" 2274 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" 2275 | 2276 | regenerator-runtime@^0.11.0: 2277 | version "0.11.1" 2278 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 2279 | 2280 | regex-cache@^0.4.2: 2281 | version "0.4.4" 2282 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 2283 | dependencies: 2284 | is-equal-shallow "^0.1.3" 2285 | 2286 | remove-trailing-separator@^1.0.1: 2287 | version "1.1.0" 2288 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 2289 | 2290 | repeat-element@^1.1.2: 2291 | version "1.1.2" 2292 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2293 | 2294 | repeat-string@^1.5.2: 2295 | version "1.6.1" 2296 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2297 | 2298 | repeating@^2.0.0: 2299 | version "2.0.1" 2300 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2301 | dependencies: 2302 | is-finite "^1.0.0" 2303 | 2304 | request@2.81.0: 2305 | version "2.81.0" 2306 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 2307 | dependencies: 2308 | aws-sign2 "~0.6.0" 2309 | aws4 "^1.2.1" 2310 | caseless "~0.12.0" 2311 | combined-stream "~1.0.5" 2312 | extend "~3.0.0" 2313 | forever-agent "~0.6.1" 2314 | form-data "~2.1.1" 2315 | har-validator "~4.2.1" 2316 | hawk "~3.1.3" 2317 | http-signature "~1.1.0" 2318 | is-typedarray "~1.0.0" 2319 | isstream "~0.1.2" 2320 | json-stringify-safe "~5.0.1" 2321 | mime-types "~2.1.7" 2322 | oauth-sign "~0.8.1" 2323 | performance-now "^0.2.0" 2324 | qs "~6.4.0" 2325 | safe-buffer "^5.0.1" 2326 | stringstream "~0.0.4" 2327 | tough-cookie "~2.3.0" 2328 | tunnel-agent "^0.6.0" 2329 | uuid "^3.0.0" 2330 | 2331 | request@^2.79.0: 2332 | version "2.83.0" 2333 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" 2334 | dependencies: 2335 | aws-sign2 "~0.7.0" 2336 | aws4 "^1.6.0" 2337 | caseless "~0.12.0" 2338 | combined-stream "~1.0.5" 2339 | extend "~3.0.1" 2340 | forever-agent "~0.6.1" 2341 | form-data "~2.3.1" 2342 | har-validator "~5.0.3" 2343 | hawk "~6.0.2" 2344 | http-signature "~1.2.0" 2345 | is-typedarray "~1.0.0" 2346 | isstream "~0.1.2" 2347 | json-stringify-safe "~5.0.1" 2348 | mime-types "~2.1.17" 2349 | oauth-sign "~0.8.2" 2350 | performance-now "^2.1.0" 2351 | qs "~6.5.1" 2352 | safe-buffer "^5.1.1" 2353 | stringstream "~0.0.5" 2354 | tough-cookie "~2.3.3" 2355 | tunnel-agent "^0.6.0" 2356 | uuid "^3.1.0" 2357 | 2358 | require-directory@^2.1.1: 2359 | version "2.1.1" 2360 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2361 | 2362 | require-main-filename@^1.0.1: 2363 | version "1.0.1" 2364 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 2365 | 2366 | resolve@1.1.7: 2367 | version "1.1.7" 2368 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 2369 | 2370 | resolve@^1.3.2: 2371 | version "1.5.0" 2372 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 2373 | dependencies: 2374 | path-parse "^1.0.5" 2375 | 2376 | retry-as-promised@^2.3.1: 2377 | version "2.3.2" 2378 | resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7" 2379 | dependencies: 2380 | bluebird "^3.4.6" 2381 | debug "^2.6.9" 2382 | 2383 | right-align@^0.1.1: 2384 | version "0.1.3" 2385 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 2386 | dependencies: 2387 | align-text "^0.1.1" 2388 | 2389 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 2390 | version "2.6.2" 2391 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 2392 | dependencies: 2393 | glob "^7.0.5" 2394 | 2395 | safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2396 | version "5.1.1" 2397 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 2398 | 2399 | sane@~1.6.0: 2400 | version "1.6.0" 2401 | resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775" 2402 | dependencies: 2403 | anymatch "^1.3.0" 2404 | exec-sh "^0.2.0" 2405 | fb-watchman "^1.8.0" 2406 | minimatch "^3.0.2" 2407 | minimist "^1.1.1" 2408 | walker "~1.0.5" 2409 | watch "~0.10.0" 2410 | 2411 | sax@^1.2.1: 2412 | version "1.2.4" 2413 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2414 | 2415 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 2416 | version "5.4.1" 2417 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 2418 | 2419 | semver@^5.5.0: 2420 | version "5.5.0" 2421 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 2422 | 2423 | send@0.16.2: 2424 | version "0.16.2" 2425 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 2426 | dependencies: 2427 | debug "2.6.9" 2428 | depd "~1.1.2" 2429 | destroy "~1.0.4" 2430 | encodeurl "~1.0.2" 2431 | escape-html "~1.0.3" 2432 | etag "~1.8.1" 2433 | fresh "0.5.2" 2434 | http-errors "~1.6.2" 2435 | mime "1.4.1" 2436 | ms "2.0.0" 2437 | on-finished "~2.3.0" 2438 | range-parser "~1.2.0" 2439 | statuses "~1.4.0" 2440 | 2441 | sequelize@^4.33.3: 2442 | version "4.33.3" 2443 | resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-4.33.3.tgz#e888b715004232007f9ed60d1223e64166b9b4e4" 2444 | dependencies: 2445 | bluebird "^3.4.6" 2446 | cls-bluebird "^2.0.1" 2447 | debug "^3.0.0" 2448 | depd "^1.1.0" 2449 | dottie "^2.0.0" 2450 | generic-pool "^3.1.8" 2451 | inflection "1.12.0" 2452 | lodash "^4.17.1" 2453 | moment "^2.13.0" 2454 | moment-timezone "^0.5.4" 2455 | retry-as-promised "^2.3.1" 2456 | semver "^5.5.0" 2457 | terraformer-wkt-parser "^1.1.2" 2458 | toposort-class "^1.0.1" 2459 | uuid "^3.2.1" 2460 | validator "^9.4.0" 2461 | wkx "^0.4.1" 2462 | 2463 | serve-static@1.13.2: 2464 | version "1.13.2" 2465 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 2466 | dependencies: 2467 | encodeurl "~1.0.2" 2468 | escape-html "~1.0.3" 2469 | parseurl "~1.3.2" 2470 | send "0.16.2" 2471 | 2472 | set-blocking@^2.0.0, set-blocking@~2.0.0: 2473 | version "2.0.0" 2474 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2475 | 2476 | setprototypeof@1.0.3: 2477 | version "1.0.3" 2478 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 2479 | 2480 | setprototypeof@1.1.0: 2481 | version "1.1.0" 2482 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 2483 | 2484 | shellwords@^0.1.0: 2485 | version "0.1.1" 2486 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 2487 | 2488 | shimmer@^1.1.0: 2489 | version "1.2.0" 2490 | resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.0.tgz#f966f7555789763e74d8841193685a5e78736665" 2491 | 2492 | signal-exit@^3.0.0: 2493 | version "3.0.2" 2494 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2495 | 2496 | slash@^1.0.0: 2497 | version "1.0.0" 2498 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2499 | 2500 | sntp@1.x.x: 2501 | version "1.0.9" 2502 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2503 | dependencies: 2504 | hoek "2.x.x" 2505 | 2506 | sntp@2.x.x: 2507 | version "2.1.0" 2508 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" 2509 | dependencies: 2510 | hoek "4.x.x" 2511 | 2512 | source-map-support@^0.4.15: 2513 | version "0.4.18" 2514 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 2515 | dependencies: 2516 | source-map "^0.5.6" 2517 | 2518 | source-map-support@^0.5.1, source-map-support@^0.5.3: 2519 | version "0.5.3" 2520 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" 2521 | dependencies: 2522 | source-map "^0.6.0" 2523 | 2524 | source-map@^0.4.4: 2525 | version "0.4.4" 2526 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 2527 | dependencies: 2528 | amdefine ">=0.0.4" 2529 | 2530 | source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6: 2531 | version "0.5.7" 2532 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2533 | 2534 | source-map@^0.6.0: 2535 | version "0.6.1" 2536 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2537 | 2538 | spdx-correct@~1.0.0: 2539 | version "1.0.2" 2540 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2541 | dependencies: 2542 | spdx-license-ids "^1.0.2" 2543 | 2544 | spdx-expression-parse@~1.0.0: 2545 | version "1.0.4" 2546 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2547 | 2548 | spdx-license-ids@^1.0.2: 2549 | version "1.2.2" 2550 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2551 | 2552 | sprintf-js@~1.0.2: 2553 | version "1.0.3" 2554 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2555 | 2556 | sqlite3@^3.1.13: 2557 | version "3.1.13" 2558 | resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-3.1.13.tgz#d990a05627392768de6278bafd1a31fdfe907dd9" 2559 | dependencies: 2560 | nan "~2.7.0" 2561 | node-pre-gyp "~0.6.38" 2562 | 2563 | sshpk@^1.7.0: 2564 | version "1.13.1" 2565 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 2566 | dependencies: 2567 | asn1 "~0.2.3" 2568 | assert-plus "^1.0.0" 2569 | dashdash "^1.12.0" 2570 | getpass "^0.1.1" 2571 | optionalDependencies: 2572 | bcrypt-pbkdf "^1.0.0" 2573 | ecc-jsbn "~0.1.1" 2574 | jsbn "~0.1.0" 2575 | tweetnacl "~0.14.0" 2576 | 2577 | "statuses@>= 1.3.1 < 2", statuses@~1.4.0: 2578 | version "1.4.0" 2579 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 2580 | 2581 | string-length@^1.0.1: 2582 | version "1.0.1" 2583 | resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" 2584 | dependencies: 2585 | strip-ansi "^3.0.0" 2586 | 2587 | string-width@^1.0.1, string-width@^1.0.2: 2588 | version "1.0.2" 2589 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2590 | dependencies: 2591 | code-point-at "^1.0.0" 2592 | is-fullwidth-code-point "^1.0.0" 2593 | strip-ansi "^3.0.0" 2594 | 2595 | string_decoder@~1.0.3: 2596 | version "1.0.3" 2597 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2598 | dependencies: 2599 | safe-buffer "~5.1.0" 2600 | 2601 | stringstream@~0.0.4, stringstream@~0.0.5: 2602 | version "0.0.5" 2603 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2604 | 2605 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2606 | version "3.0.1" 2607 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2608 | dependencies: 2609 | ansi-regex "^2.0.0" 2610 | 2611 | strip-bom@3.0.0: 2612 | version "3.0.0" 2613 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2614 | 2615 | strip-bom@^2.0.0: 2616 | version "2.0.0" 2617 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2618 | dependencies: 2619 | is-utf8 "^0.2.0" 2620 | 2621 | strip-json-comments@~2.0.1: 2622 | version "2.0.1" 2623 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2624 | 2625 | supports-color@^2.0.0: 2626 | version "2.0.0" 2627 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2628 | 2629 | supports-color@^3.1.2: 2630 | version "3.2.3" 2631 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 2632 | dependencies: 2633 | has-flag "^1.0.0" 2634 | 2635 | supports-color@^5.2.0: 2636 | version "5.2.0" 2637 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" 2638 | dependencies: 2639 | has-flag "^3.0.0" 2640 | 2641 | symbol-tree@^3.2.1: 2642 | version "3.2.2" 2643 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" 2644 | 2645 | tar-pack@^3.4.0: 2646 | version "3.4.1" 2647 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" 2648 | dependencies: 2649 | debug "^2.2.0" 2650 | fstream "^1.0.10" 2651 | fstream-ignore "^1.0.5" 2652 | once "^1.3.3" 2653 | readable-stream "^2.1.4" 2654 | rimraf "^2.5.1" 2655 | tar "^2.2.1" 2656 | uid-number "^0.0.6" 2657 | 2658 | tar@^2.2.1: 2659 | version "2.2.1" 2660 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2661 | dependencies: 2662 | block-stream "*" 2663 | fstream "^1.0.2" 2664 | inherits "2" 2665 | 2666 | terraformer-wkt-parser@^1.1.2: 2667 | version "1.1.2" 2668 | resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.2.tgz#336a0c8fc82094a5aff83288f69aedecd369bf0c" 2669 | dependencies: 2670 | terraformer "~1.0.5" 2671 | 2672 | terraformer@~1.0.5: 2673 | version "1.0.8" 2674 | resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.8.tgz#51e0ad89746fcf2161dc6f65aa70e42377c8b593" 2675 | dependencies: 2676 | "@types/geojson" "^1.0.0" 2677 | 2678 | test-exclude@^4.1.1: 2679 | version "4.1.1" 2680 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" 2681 | dependencies: 2682 | arrify "^1.0.1" 2683 | micromatch "^2.3.11" 2684 | object-assign "^4.1.0" 2685 | read-pkg-up "^1.0.1" 2686 | require-main-filename "^1.0.1" 2687 | 2688 | throat@^3.0.0: 2689 | version "3.2.0" 2690 | resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" 2691 | 2692 | tmpl@1.0.x: 2693 | version "1.0.4" 2694 | resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" 2695 | 2696 | to-fast-properties@^1.0.3: 2697 | version "1.0.3" 2698 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 2699 | 2700 | toposort-class@^1.0.1: 2701 | version "1.0.1" 2702 | resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" 2703 | 2704 | tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: 2705 | version "2.3.3" 2706 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 2707 | dependencies: 2708 | punycode "^1.4.1" 2709 | 2710 | tr46@~0.0.3: 2711 | version "0.0.3" 2712 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 2713 | 2714 | trim-right@^1.0.1: 2715 | version "1.0.1" 2716 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 2717 | 2718 | ts-node@^5.0.1: 2719 | version "5.0.1" 2720 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-5.0.1.tgz#78e5d1cb3f704de1b641e43b76be2d4094f06f81" 2721 | dependencies: 2722 | arrify "^1.0.0" 2723 | chalk "^2.3.0" 2724 | diff "^3.1.0" 2725 | make-error "^1.1.1" 2726 | minimist "^1.2.0" 2727 | mkdirp "^0.5.1" 2728 | source-map-support "^0.5.3" 2729 | yn "^2.0.0" 2730 | 2731 | tslib@^1.8.0, tslib@^1.8.1: 2732 | version "1.9.0" 2733 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" 2734 | 2735 | tslint@^5.9.1: 2736 | version "5.9.1" 2737 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.9.1.tgz#1255f87a3ff57eb0b0e1f0e610a8b4748046c9ae" 2738 | dependencies: 2739 | babel-code-frame "^6.22.0" 2740 | builtin-modules "^1.1.1" 2741 | chalk "^2.3.0" 2742 | commander "^2.12.1" 2743 | diff "^3.2.0" 2744 | glob "^7.1.1" 2745 | js-yaml "^3.7.0" 2746 | minimatch "^3.0.4" 2747 | resolve "^1.3.2" 2748 | semver "^5.3.0" 2749 | tslib "^1.8.0" 2750 | tsutils "^2.12.1" 2751 | 2752 | tsutils@^2.12.1: 2753 | version "2.21.1" 2754 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.21.1.tgz#5b23c263233300ed7442b4217855cbc7547c296a" 2755 | dependencies: 2756 | tslib "^1.8.1" 2757 | 2758 | tunnel-agent@^0.6.0: 2759 | version "0.6.0" 2760 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2761 | dependencies: 2762 | safe-buffer "^5.0.1" 2763 | 2764 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2765 | version "0.14.5" 2766 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2767 | 2768 | type-check@~0.3.2: 2769 | version "0.3.2" 2770 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2771 | dependencies: 2772 | prelude-ls "~1.1.2" 2773 | 2774 | type-is@~1.6.15, type-is@~1.6.16: 2775 | version "1.6.16" 2776 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 2777 | dependencies: 2778 | media-typer "0.3.0" 2779 | mime-types "~2.1.18" 2780 | 2781 | typescript@^2.7.1: 2782 | version "2.7.1" 2783 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.1.tgz#bb3682c2c791ac90e7c6210b26478a8da085c359" 2784 | 2785 | uglify-js@^2.6: 2786 | version "2.8.29" 2787 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" 2788 | dependencies: 2789 | source-map "~0.5.1" 2790 | yargs "~3.10.0" 2791 | optionalDependencies: 2792 | uglify-to-browserify "~1.0.0" 2793 | 2794 | uglify-to-browserify@~1.0.0: 2795 | version "1.0.2" 2796 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 2797 | 2798 | uid-number@^0.0.6: 2799 | version "0.0.6" 2800 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2801 | 2802 | unpipe@1.0.0, unpipe@~1.0.0: 2803 | version "1.0.0" 2804 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2805 | 2806 | util-deprecate@~1.0.1: 2807 | version "1.0.2" 2808 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2809 | 2810 | utils-merge@1.0.1: 2811 | version "1.0.1" 2812 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2813 | 2814 | uuid@^3.0.0, uuid@^3.2.1: 2815 | version "3.2.1" 2816 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" 2817 | 2818 | uuid@^3.1.0: 2819 | version "3.1.0" 2820 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 2821 | 2822 | validate-npm-package-license@^3.0.1: 2823 | version "3.0.1" 2824 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 2825 | dependencies: 2826 | spdx-correct "~1.0.0" 2827 | spdx-expression-parse "~1.0.0" 2828 | 2829 | validator@^9.4.0: 2830 | version "9.4.0" 2831 | resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.0.tgz#c503ef88f7e6b8fb7688599267b309482d81ae60" 2832 | 2833 | vary@~1.1.2: 2834 | version "1.1.2" 2835 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2836 | 2837 | verror@1.10.0: 2838 | version "1.10.0" 2839 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2840 | dependencies: 2841 | assert-plus "^1.0.0" 2842 | core-util-is "1.0.2" 2843 | extsprintf "^1.2.0" 2844 | 2845 | walker@~1.0.5: 2846 | version "1.0.7" 2847 | resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" 2848 | dependencies: 2849 | makeerror "1.0.x" 2850 | 2851 | watch@~0.10.0: 2852 | version "0.10.0" 2853 | resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" 2854 | 2855 | webidl-conversions@^3.0.0: 2856 | version "3.0.1" 2857 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 2858 | 2859 | webidl-conversions@^4.0.0: 2860 | version "4.0.2" 2861 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 2862 | 2863 | whatwg-encoding@^1.0.1: 2864 | version "1.0.3" 2865 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" 2866 | dependencies: 2867 | iconv-lite "0.4.19" 2868 | 2869 | whatwg-url@^4.3.0: 2870 | version "4.8.0" 2871 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" 2872 | dependencies: 2873 | tr46 "~0.0.3" 2874 | webidl-conversions "^3.0.0" 2875 | 2876 | which-module@^1.0.0: 2877 | version "1.0.0" 2878 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 2879 | 2880 | which@^1.2.12: 2881 | version "1.3.0" 2882 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 2883 | dependencies: 2884 | isexe "^2.0.0" 2885 | 2886 | wide-align@^1.1.0: 2887 | version "1.1.2" 2888 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 2889 | dependencies: 2890 | string-width "^1.0.2" 2891 | 2892 | window-size@0.1.0: 2893 | version "0.1.0" 2894 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 2895 | 2896 | wkx@^0.4.1: 2897 | version "0.4.2" 2898 | resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.2.tgz#776d35a634a5c22e656e4744bdeb54f83fd2ce8d" 2899 | dependencies: 2900 | "@types/node" "*" 2901 | 2902 | wordwrap@0.0.2: 2903 | version "0.0.2" 2904 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 2905 | 2906 | wordwrap@~0.0.2: 2907 | version "0.0.3" 2908 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2909 | 2910 | wordwrap@~1.0.0: 2911 | version "1.0.0" 2912 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2913 | 2914 | worker-farm@^1.3.1: 2915 | version "1.5.2" 2916 | resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" 2917 | dependencies: 2918 | errno "^0.1.4" 2919 | xtend "^4.0.1" 2920 | 2921 | wrap-ansi@^2.0.0: 2922 | version "2.1.0" 2923 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2924 | dependencies: 2925 | string-width "^1.0.1" 2926 | strip-ansi "^3.0.1" 2927 | 2928 | wrappy@1: 2929 | version "1.0.2" 2930 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2931 | 2932 | xml-name-validator@^2.0.1: 2933 | version "2.0.1" 2934 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" 2935 | 2936 | xtend@^4.0.1: 2937 | version "4.0.1" 2938 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2939 | 2940 | y18n@^3.2.1: 2941 | version "3.2.1" 2942 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2943 | 2944 | yargs-parser@^5.0.0: 2945 | version "5.0.0" 2946 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 2947 | dependencies: 2948 | camelcase "^3.0.0" 2949 | 2950 | yargs@^7.0.2: 2951 | version "7.1.0" 2952 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" 2953 | dependencies: 2954 | camelcase "^3.0.0" 2955 | cliui "^3.2.0" 2956 | decamelize "^1.1.1" 2957 | get-caller-file "^1.0.1" 2958 | os-locale "^1.4.0" 2959 | read-pkg-up "^1.0.1" 2960 | require-directory "^2.1.1" 2961 | require-main-filename "^1.0.1" 2962 | set-blocking "^2.0.0" 2963 | string-width "^1.0.2" 2964 | which-module "^1.0.0" 2965 | y18n "^3.2.1" 2966 | yargs-parser "^5.0.0" 2967 | 2968 | yargs@~3.10.0: 2969 | version "3.10.0" 2970 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 2971 | dependencies: 2972 | camelcase "^1.0.2" 2973 | cliui "^2.1.0" 2974 | decamelize "^1.0.0" 2975 | window-size "0.1.0" 2976 | 2977 | yn@^2.0.0: 2978 | version "2.0.0" 2979 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 2980 | --------------------------------------------------------------------------------