diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 1931e0e8c0..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -!.eslintrc.js -**/node_modules/** -**/VendorLib/** -**/flow-typed/** -**/gen-nodejs/** -**/build/** diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index b207975aac..0000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,623 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @noflow - * @format - */ -'use strict'; - -/* eslint nuclide-internal/no-commonjs: 0 */ -/* eslint-disable max-len */ - -module.exports = { - root: true, - - parser: 'babel-eslint', - - parserOptions: { - ecmaVersion: 7, - sourceType: 'module', - ecmaFeatures: { - globalReturn: true, - jsx: true, - experimentalObjectRestSpread: true, - }, - }, - - // https://github.com/sindresorhus/globals/blob/master/globals.json - env: { - atomtest: true, - es6: true, - jasmine: true, - jest: true, - node: true, - }, - - settings: { - react: { - // TODO: (wbinnssmith) T35336490 - // Remove this when we update to a version of eslint-plugin-react - // that automatically detects the react version: - // https://github.com/yannickcr/eslint-plugin-react/commit/dc28d2636b11aaed033454e7ff98c486c08740df - version: require('./package.json').dependencies.react, - }, - }, - - extends: ['plugin:jsx-a11y/recommended'], - - globals: { - atom: false, - document: false, - window: false, - }, - - rules: { - // Possible Errors (http://eslint.org/docs/rules/#possible-errors) - 'no-await-in-loop': 1, - 'no-cond-assign': 1, - 'no-console': 1, - 'no-constant-condition': [1, {checkLoops: false}], - 'no-control-regex': 1, - 'no-debugger': 1, - 'no-dupe-args': 1, - 'no-dupe-keys': 1, - 'no-duplicate-case': 1, - 'no-empty-character-class': 1, - 'no-empty': [1, {allowEmptyCatch: true}], - 'no-ex-assign': 1, - 'no-extra-boolean-cast': 0, // Flow actually requires us to cast to avoid sketchy null checks. - 'no-extra-parens': 0, - 'no-extra-semi': 1, - 'no-func-assign': 1, - 'no-inner-declarations': 1, - 'no-invalid-regexp': 1, - 'no-irregular-whitespace': 1, - 'no-obj-calls': 1, - 'no-prototype-builtins': 0, - 'no-regex-spaces': 1, - 'no-sparse-arrays': 1, - 'no-template-curly-in-string': 0, - 'no-unexpected-multiline': 1, - 'no-unreachable': 1, - 'no-unsafe-finally': 1, - 'no-unsafe-negation': 1, - 'use-isnan': 1, - 'valid-jsdoc': 0, - 'valid-typeof': 1, - - // Best Practices (http://eslint.org/docs/rules/#best-practices) - 'accessor-pairs': 1, - 'array-callback-return': 0, - 'block-scoped-var': 0, - 'class-methods-use-this': 0, - complexity: 0, - 'consistent-return': 0, - curly: 1, - 'default-case': 0, - 'dot-location': [1, 'property'], - 'dot-notation': 1, - eqeqeq: [1, 'always', {null: 'never'}], - 'getter-return': 2, - 'guard-for-in': 0, - 'no-alert': 0, - 'no-caller': 1, - 'no-case-declarations': 0, - 'no-div-regex': 1, - 'no-else-return': 0, - 'no-empty-function': 0, - 'no-empty-pattern': 1, - 'no-eq-null': 0, - 'no-eval': 1, - 'no-extend-native': 1, - 'no-extra-bind': 1, - 'no-extra-label': 1, - 'no-fallthrough': 1, - 'no-floating-decimal': 1, - 'no-global-assign': 1, - 'no-implicit-coercion': 1, - 'no-implicit-globals': 0, - 'no-implied-eval': 1, - 'no-invalid-this': 0, - 'no-iterator': 1, - 'no-labels': 1, - 'no-lone-blocks': 1, - 'no-loop-func': 0, - 'no-magic-numbers': 0, - 'no-multi-spaces': 1, - 'no-multi-str': 0, - 'no-new-func': 1, - 'no-new-wrappers': 1, - 'no-new': 1, - 'no-octal-escape': 1, - 'no-octal': 1, - 'no-param-reassign': 1, - 'no-proto': 1, - 'no-redeclare': [1, {builtinGlobals: true}], - 'no-restricted-properties': 0, - 'no-return-assign': 1, - 'no-return-await': 1, - 'no-script-url': 1, - 'no-self-assign': 1, - 'no-self-compare': 1, - 'no-sequences': 1, - 'no-throw-literal': 1, - 'no-unmodified-loop-condition': 0, - 'no-unused-expressions': 0, - 'no-unused-labels': 1, - 'no-useless-call': 1, - 'no-useless-concat': 1, - 'no-useless-escape': 1, - 'no-useless-return': 0, - 'no-void': 1, - 'no-warning-comments': 0, - 'no-with': 1, - 'prefer-promise-reject-errors': 1, - radix: 1, - 'require-await': 0, - // 'require-await': 1, - 'vars-on-top': 0, - 'wrap-iife': [1, 'inside'], - yoda: 1, - - // Strict Mode (http://eslint.org/docs/rules/#strict-mode) - strict: 0, - - // Variables (http://eslint.org/docs/rules/#variables) - 'init-declarations': 0, - 'no-catch-shadow': 1, - 'no-delete-var': 1, - 'no-label-var': 1, - 'no-restricted-globals': 0, - 'no-shadow-restricted-names': 1, - 'no-shadow': 1, - 'no-undef-init': 0, - 'no-undef': 1, - 'no-undefined': 0, - 'no-unused-vars': [1, {args: 'none', ignoreRestSiblings: true}], - 'no-use-before-define': 0, - - // Node.js and CommonJS (http://eslint.org/docs/rules/#nodejs-and-commonjs) - 'callback-return': 0, - 'global-require': 0, - 'handle-callback-err': 1, - 'no-mixed-requires': 1, - 'no-new-require': 1, - 'no-path-concat': 1, - 'no-process-env': 0, - 'no-process-exit': 0, - 'no-restricted-modules': 0, - 'no-sync': 0, - - // Stylistic Issues (http://eslint.org/docs/rules/#stylistic-issues) - 'array-bracket-spacing': 1, - 'block-spacing': 1, - 'brace-style': [1, '1tbs', {allowSingleLine: true}], - camelcase: 0, - 'capitalized-comments': 0, - 'comma-dangle': 0, - 'comma-spacing': 1, - 'comma-style': 1, - 'computed-property-spacing': 1, - 'consistent-this': 0, - 'eol-last': 1, - 'func-call-spacing': 1, - 'func-name-matching': 0, - 'func-names': 0, - 'func-style': 0, - 'id-blacklist': 0, - 'id-length': 0, - 'id-match': 0, - // 'indent': [1, 2, {SwitchCase: 1}], - 'jsx-quotes': [1, 'prefer-double'], - 'key-spacing': [1, {beforeColon: false, afterColon: true}], - 'keyword-spacing': 1, - 'line-comment-position': 0, - 'linebreak-style': 1, - 'lines-between-class-members': 0, - 'lines-around-comment': 0, - 'lines-around-directive': 0, - 'max-depth': 0, - // 'max-len': [1, 100, {tabWidth: 2, ignoreUrls: true}], - 'max-lines': 0, - 'max-nested-callbacks': 0, - 'max-params': 0, - 'max-statements-per-line': 0, - 'max-statements': 0, - 'multiline-ternary': 0, - 'new-cap': 0, - 'new-parens': 1, - 'newline-after-var': 0, - 'newline-before-return': 0, - 'newline-per-chained-call': 0, - 'no-array-constructor': 1, - 'no-bitwise': 1, - 'no-continue': 0, - 'no-inline-comments': 0, - 'no-lonely-if': 0, - 'no-mixed-operators': 0, - 'no-mixed-spaces-and-tabs': 1, - 'no-multi-assign': 0, - 'no-multiple-empty-lines': [1, {max: 2, maxBOF: 0, maxEOF: 1}], - 'no-negated-condition': 0, - 'no-nested-ternary': 0, - 'no-new-object': 1, - 'no-plusplus': 0, - 'no-restricted-syntax': 0, - 'no-tabs': 1, - 'no-ternary': 0, - 'no-trailing-spaces': 1, - 'no-underscore-dangle': 0, - 'no-unneeded-ternary': 0, - 'no-whitespace-before-property': 1, - 'object-curly-newline': 0, - // 'object-curly-spacing': 1, - 'object-property-newline': 0, - 'one-var-declaration-per-line': 0, - 'one-var': [1, 'never'], - 'operator-assignment': 1, - 'operator-linebreak': 0, - 'padded-blocks': [ - 1, - {blocks: 'never', classes: 'never', switches: 'never'}, - ], - // 'quote-props': [1, 'as-needed'], - quotes: [1, 'single', 'avoid-escape'], - 'require-jsdoc': 0, - // 'semi-spacing': 1, - semi: 1, - 'sort-keys': 0, - 'sort-vars': 0, - 'space-before-blocks': 1, - 'space-before-function-paren': [ - 1, - {anonymous: 'never', named: 'never', asyncArrow: 'always'}, - ], - 'space-in-parens': [1, 'never'], - 'space-infix-ops': 1, - 'space-unary-ops': 1, - 'spaced-comment': [ - 1, - 'always', - {line: {exceptions: ['-']}, block: {balanced: true, markers: [':']}}, - ], - 'template-tag-spacing': 1, - 'unicode-bom': [1, 'never'], - 'wrap-regex': 0, - - // ECMAScript 6 (http://eslint.org/docs/rules/#ecmascript-6) - 'arrow-body-style': 0, - 'arrow-parens': [1, 'as-needed'], - 'arrow-spacing': 1, - 'constructor-super': 1, - // 'generator-star-spacing': 1, - 'no-class-assign': 1, - 'no-confusing-arrow': 0, - 'no-const-assign': 1, - 'no-dupe-class-members': 1, - 'no-duplicate-imports': 0, - 'no-new-symbol': 1, - 'no-restricted-imports': 0, - 'no-this-before-super': 1, - 'no-useless-computed-key': 1, - 'no-useless-constructor': 0, - 'no-useless-rename': 1, - 'no-var': 1, - 'object-shorthand': 1, - 'prefer-arrow-callback': [1, {allowNamedFunctions: true}], - 'prefer-const': 1, - 'prefer-destructuring': 0, - 'prefer-numeric-literals': 0, - 'prefer-rest-params': 0, - 'prefer-spread': 1, - 'prefer-template': 0, - 'require-yield': 0, - 'rest-spread-spacing': 1, - 'sort-imports': 0, - 'symbol-description': 1, - 'template-curly-spacing': 1, - 'yield-star-spacing': 1, - - // dependencies (https://github.com/zertosh/eslint-plugin-dependencies) - 'dependencies/case-sensitive': 1, - 'dependencies/no-cycles': [ - 1, - { - skip: ['/VendorLib/', '/sample-[^/]+/', '/scripts/', '/spec/'], - }, - ], - 'dependencies/no-unresolved': 0, - 'dependencies/require-json-ext': 1, - - // flowtype (https://github.com/gajus/eslint-plugin-flowtype) - 'flowtype/boolean-style': 1, - 'flowtype/define-flow-type': 1, - 'flowtype/delimiter-dangle': [1, 'always-multiline'], - // 'flowtype/generic-spacing': 1, - 'flowtype/no-dupe-keys': 0, - 'flowtype/no-primitive-constructor-types': 1, - 'flowtype/no-weak-types': 0, - 'flowtype/object-type-delimiter': 0, - 'flowtype/require-parameter-type': 0, - 'flowtype/require-return-type': 0, - 'flowtype/require-valid-file-annotation': 0, - 'flowtype/require-variable-type': 0, - 'flowtype/semi': 1, - 'flowtype/sort-keys': 0, - 'flowtype/space-after-type-colon': [1, 'always', {allowLineBreak: true}], - 'flowtype/space-before-generic-bracket': 1, - 'flowtype/space-before-type-colon': 1, - 'flowtype/type-id-match': 0, - 'flowtype/union-intersection-spacing': 1, - 'flowtype/use-flow-type': 1, - 'flowtype/valid-syntax': 0, - - // Jasmine (https://github.com/tlvince/eslint-plugin-jasmine) - 'jasmine/missing-expect': 0, - 'jasmine/named-spy': 0, - 'jasmine/no-assign-spyon': 0, - 'jasmine/no-disabled-tests': 1, - 'jasmine/no-expect-in-setup-teardown': 0, - 'jasmine/no-focused-tests': 0, - 'jasmine/no-global-setup': 0, - 'jasmine/no-spec-dupes': [1, 'branch'], - 'jasmine/no-suite-callback-args': 0, - 'jasmine/no-suite-dupes': [1, 'branch'], - 'jasmine/no-unsafe-spy': 0, - 'jasmine/valid-expect': 0, - - // nuclide-internal (https://github.com/facebook/nuclide/tree/master/modules/eslint-plugin-nuclide-internal) - 'nuclide-internal/api-spelling': 1, - 'nuclide-internal/atom-apis': 1, - 'nuclide-internal/consistent-import-name': 1, - 'nuclide-internal/disallowed-modules': 1, - 'nuclide-internal/dom-apis': 1, - 'nuclide-internal/flow-fb-oss': 1, - 'nuclide-internal/import-type-style': 1, - 'nuclide-internal/jsx-simple-callback-refs': 1, - 'nuclide-internal/license-header': 1, - 'nuclide-internal/modules-dependencies': 1, - 'nuclide-internal/no-cross-atom-imports': [1, {whitelist: ['nuclide-ui']}], - 'nuclide-internal/no-unnecessary-disposable-wrapping': 1, - 'nuclide-internal/no-unobserved-gk': 1, - 'nuclide-internal/no-unresolved': 1, - 'nuclide-internal/prefer-nuclide-uri': 1, - 'nuclide-internal/react-virtualized-import': 1, - 'nuclide-internal/require-universal-disposable': 1, - 'nuclide-internal/use-nuclide-ui-components': 1, - 'nuclide-internal/no-commonjs': 1, - 'nuclide-internal/unused-subscription': 1, - - // prefer-object-spread (https://github.com/bryanrsmith/eslint-plugin-prefer-object-spread) - 'prefer-object-spread/prefer-object-spread': 1, - - // prettier (https://github.com/prettier/eslint-plugin-prettier) - 'prettier/prettier': [1, 'fb', '@format'], - - // React (https://github.com/yannickcr/eslint-plugin-react) - 'react/display-name': 0, - 'react/forbid-component-props:': 0, - 'react/forbid-prop-types': 1, - 'react/no-access-state-in-setstate': 1, - 'react/no-array-index-key': 0, - 'react/no-children-prop': 0, - 'react/no-danger': 0, - 'react/no-danger-with-children': 0, - 'react/no-deprecated': 1, - 'react/no-did-mount-set-state': 0, - 'react/no-did-update-set-state': 0, - 'react/no-direct-mutation-state': 1, - 'react/no-find-dom-node': 0, - 'react/no-is-mounted': 0, - 'react/no-multi-comp': 0, - 'react/no-render-return-value': 0, - 'react/no-set-state': 0, - - // String refs don't work correctly if multiple versions of React are at play. - 'react/no-string-refs': 1, - - 'react/no-unescaped-entities': 0, - 'react/no-unknown-property': 1, - 'react/no-unused-prop-types': 1, - 'react/no-unused-state': 1, - 'react/prefer-es6-class': 0, - 'react/prefer-stateless-function': 0, - // 'react/prefer-stateless-function': 1, - // 'react/prop-types': 1, - 'react/react-in-jsx-scope': 1, - 'react/require-default-props': 0, - 'react/require-optimization': 0, - 'react/require-render-return': 0, - 'react/self-closing-comp': 1, - 'react/sort-comp': 0, - 'react/sort-prop-types': 0, - 'react/style-prop-object': 0, - 'react/jsx-boolean-value': 0, - 'react/jsx-closing-bracket-location': [ - 1, - {selfClosing: 'tag-aligned', nonEmpty: 'after-props'}, - ], - // 'react/jsx-curly-spacing': [1, 'never'], - 'react/jsx-equals-spacing': 0, - 'react/jsx-filename-extension': 0, - 'react/jsx-first-prop-new-line': 0, - 'react/jsx-handler-names': 0, - 'react/jsx-indent': 0, - 'react/jsx-indent-props': 0, - 'react/jsx-key': 1, - 'react/jsx-max-props-per-line': 0, - 'react/jsx-no-bind': 0, - // 'react/jsx-no-bind': 1, - 'react/jsx-no-comment-textnodes': 1, - 'react/jsx-no-duplicate-props': 1, - 'react/jsx-no-literals': 0, - 'react/jsx-no-target-blank': 0, - 'react/jsx-no-undef': 1, - 'react/jsx-pascal-case': 0, - 'react/jsx-sort-props': 0, - 'react/jsx-tag-spacing': 1, - 'react/jsx-uses-react': 1, - 'react/jsx-uses-vars': 1, - 'react/jxs-wrap-multilines': 0, - - // JSX Accessibility checks - // some currently disabled to adopt incrementally, annotated 'incremental' - 'jsx-a11y/accessible-emoji': 0, - 'jsx-a11y/alt-text': 0, // incremental: error - 'jsx-a11y/anchor-has-content': 0, - 'jsx-a11y/anchor-is-valid': 0, // incremental: error - 'jsx-a11y/aria-activedescendant-has-tabindex': 0, - 'jsx-a11y/aria-props': 1, - 'jsx-a11y/aria-proptypes': 0, - 'jsx-a11y/aria-role': 0, - 'jsx-a11y/aria-unsupported-elements': 0, - 'jsx-a11y/click-events-have-key-events': 0, - 'jsx-a11y/heading-has-content': 0, - 'jsx-a11y/href-no-hash': 0, - 'jsx-a11y/html-has-lang': 0, - 'jsx-a11y/iframe-has-title': 0, - 'jsx-a11y/img-has-alt': 0, - 'jsx-a11y/img-redundant-alt': 0, - 'jsx-a11y/interactive-supports-focus': [ - 1, - { - tabbable: [ - 'button', - 'checkbox', - 'link', - 'searchbox', - 'spinbutton', - 'switch', - 'textbox', - ], - }, - ], - 'jsx-a11y/label-has-associated-control': 0, - 'jsx-a11y/label-has-for': 0, - 'jsx-a11y/lang': 0, - 'jsx-a11y/mouse-events-have-key-events': 0, - 'jsx-a11y/no-access-key': 0, - 'jsx-a11y/no-autofocus': 0, - 'jsx-a11y/no-distracting-elements': 0, - 'jsx-a11y/no-interactive-element-to-noninteractive-role': [ - 1, - { - tr: ['none', 'presentation'], - }, - ], - 'jsx-a11y/no-noninteractive-element-interactions': [ - 0, // incremental: warning - { - handlers: ['onClick'], - }, - ], - 'jsx-a11y/no-noninteractive-element-to-interactive-role': [ - 1, - { - ul: [ - 'listbox', - 'menu', - 'menubar', - 'radiogroup', - 'tablist', - 'tree', - 'treegrid', - ], - ol: [ - 'listbox', - 'menu', - 'menubar', - 'radiogroup', - 'tablist', - 'tree', - 'treegrid', - ], - li: ['menuitem', 'option', 'row', 'tab', 'treeitem'], - table: ['grid'], - td: ['gridcell'], - }, - ], - 'jsx-a11y/no-noninteractive-tabindex': 0, // incremental: error - 'jsx-a11y/no-onchange': 0, - 'jsx-a11y/no-redundant-roles': 0, - 'jsx-a11y/no-static-element-interactions': [ - 0, // incremental: warning - { - handlers: ['onClick'], - }, - ], - 'jsx-a11y/role-has-required-aria-props': 0, - 'jsx-a11y/role-supports-aria-props': 0, - 'jsx-a11y/scope': 0, - 'jsx-a11y/tabindex-no-positive': 0, - - 'unicorn/catch-error-name': 0, - 'unicorn/explicit-length-check': 0, - 'unicorn/filename-case': 0, - 'unicorn/no-abusive-eslint-disable': 0, - 'unicorn/no-process-exit': 0, - 'unicorn/throw-new-error': 2, - 'unicorn/number-literal-case': 0, - 'unicorn/escape-case': 0, - 'unicorn/no-array-instanceof': 0, - 'unicorn/no-new-buffer': 0, - 'unicorn/no-hex-escape': 0, - 'unicorn/custom-error-definition': 0, - 'unicorn/prefer-starts-ends-with': 0, - 'unicorn/prefer-type-error': 0, - 'unicorn/no-fn-reference-in-iterator': 0, - 'unicorn/import-index': 0, - 'unicorn/new-for-builtins': 0, - 'unicorn/regex-shorthand': 0, - 'unicorn/prefer-spread': 0, - 'unicorn/error-message': 0, - 'unicorn/no-unsafe-regex': 0, - 'unicorn/prefer-add-event-listener': 0, - }, - - overrides: [ - { - files: ['**/__e2e_fixtures__/**/*'], - rules: { - 'no-implicit-coercion': 0, - 'nuclide-internal/atom-apis': 0, - 'nuclide-internal/license-header': 0, - 'nuclide-internal/modules-dependencies': 0, - 'nuclide-internal/prefer-nuclide-uri': 0, - 'nuclide-internal/unused-subscription': 0, - 'nuclide-internal/no-commonjs': 0, - }, - }, - { - files: ['**/__{atom_,e2e_,}tests__/**/*', 'jest/**/*'], - rules: { - 'nuclide-internal/prefer-nuclide-uri': 0, - 'nuclide-internal/modules-dependencies': 0, - 'nuclide-internal/atom-apis': 0, - 'nuclide-internal/unused-subscription': 0, - 'no-implicit-coercion': 0, - }, - }, - { - files: ['**/*-spec.js', '**/__mocks__/**/*'], - rules: { - 'nuclide-internal/unused-subscription': 0, - }, - }, - ], - - plugins: [ - 'dependencies', - 'flowtype', - 'jasmine', - 'jsx-a11y', - 'prefer-object-spread', - 'prettier', - 'react', - 'nuclide-internal', - 'unicorn', - ], -}; diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 7da1f9608e..0000000000 --- a/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -max-line-length = 100 diff --git a/.flowconfig b/.flowconfig deleted file mode 100644 index 0f7625ea52..0000000000 --- a/.flowconfig +++ /dev/null @@ -1,52 +0,0 @@ -[include] - -[ignore] -; ignore module source to prefer declaration -/node_modules/classnames/.* -/node_modules/lru-cache/.* -/node_modules/prop-types/.* -/node_modules/react/.* -/node_modules/rxjs/.* -/node_modules/semver/.* -/node_modules/jest-validate/.* -; TODO(T28589014): re-enable flow typing of graphql module -/node_modules/graphql/.* -; annotated with `@flow` but have errors -/node_modules/\(.*/\)*fbjs/lib/.* -/modules/nuclide-node-transpiler/spec/fixtures/.* -; large dirs that are not imported -/docs/.* - -[libs] -flow-libs/ - -[options] -emoji=true -esproposal.optional_chaining=enable -experimental.const_params=true -module.use_strict=true -module.system.node.resolve_dirname=node_modules - -suppress_comment=.*\\$FlowFixMe.* -suppress_comment=.*\\$FlowIssue.* -suppress_comment=.*\\$FlowIgnore.* -; uncommenting the next line will silence flow errors about missing 'fb' modules -; suppress_comment=.*\\$FlowFB.* - -[lints] -untyped-type-import=error - -sketchy-null=error -sketchy-null-bool=off - -[strict] -deprecated-type -nonstrict-import -sketchy-null -unclear-type -unsafe-getters-setters -untyped-import -untyped-type-import - -[version] -0.84.0 diff --git a/.gitignore b/.gitignore index c91e4842f8..5b2fbc4728 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,42 @@ npm-debug.log* /docs/Gemfile.lock /modules/jest-atom-runner/build + + +######################################################## +### !!!AUTO GENERATED by "prepare_apm_release.js"!!! ### +######################################################## + +# "apm" doesn't honor ".npmignore" files. As a workaround, we merge the +# ".npmignore" content into ".gitignore": +/.eslintignore +/.eslintrc.js +/.flake8 +/.flowconfig +/CONTRIBUTING.md +/ISSUE_TEMPLATE.md +/circle.yml +/docs +/flow-libs +/flow-typed +/pkg/dev-* +/pkg/sample-* +/resources/benchmarker +/resources/nuclicons +/scripts +DEVELOPMENT +spec + +# Ignore "BUCK" files, but not "buck/" directories. +# Note: These rules get inlined into ".gitignore" for apm publishing, git will +# ignore "buck/" directories without this exclusion on case-insensitive Macs. +BUCK +!buck/ + +/pkg/fb-java-rpc/**/*.java +/pkg/fb-java-rpc/.idea +/pkg/fb-java-rpc/*.iml +/pkg/fb-java/eclipse.jdt.ls +/pkg/fb-xml/**/*.java +/pkg/fb-cquery-rpc/third-party/VendorLib + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index dde3aee273..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,63 +0,0 @@ -# Contributing to Nuclide -We want to make contributing to this project as easy and transparent as -possible. The -[Nuclide license](https://github.com/facebook/nuclide/blob/master/LICENSE) has -certain limitations around distribution. However, this does not affect your -ability to fork the project and make contributions. - -## Code of Conduct - -Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.fb.com/codeofconduct/) so that you can understand what actions will and will not be tolerated. - -## Our Development Process -Nuclide is currently developed in Facebook's internal repositories and then -exported out to GitHub by a Facebook team member. We invite you to submit pull -requests directly to GitHub and, after review, these can be merged into the -project. - -## Getting Started - -Follow this guide to start developing on Nuclide: -https://nuclide.io/docs/advanced-topics/building-from-source/ - -## atom-ide-ui - -atom-ide-ui should be developed in its own repository - see the [CONTRIBUTING.md]( -https://github.com/facebook-atom/atom-ide-ui/blob/master/CONTRIBUTING.md) -guide in https://github.com/facebook-atom/atom-ide-ui. - -## Pull Requests - -1. Fork the repo and create your branch from `master` for core changes, or -`gh-pages` for docs and website changes. -2. If you've added code that should be tested, [add tests](https://github.com/facebook/nuclide/wiki/Tips-for-Testing#writing-tests). -3. If you've changed APIs, update the documentation. -4. Ensure the test suite passes by [running `scripts/test`, or run the affected tests individually](https://github.com/facebook/nuclide/wiki/Tips-for-Testing#running-tests). -5. Make sure your JavaScript code lints by using Flow. -6. If you haven't already, complete the Contributor License Agreement ("CLA"). - -## Contributor License Agreement ("CLA") -In order to accept your pull request, we need you to submit a CLA. You only need -to do this once to work on Nuclide and on Facebook's open source projects. - -Complete your CLA here: - -## Issues -We use GitHub issues to track public bugs. Please ensure your description is -clear and has sufficient instructions to be able to reproduce the issue. - -Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe -disclosure of security bugs. In those cases, please go through the process -outlined on that page and do not file a public issue. - -## Coding Style -* Spaces for indentation rather than tabs - 2 for JavaScript, 4 for Python -* 100 character line length -* See the [project wiki](https://github.com/facebook/nuclide/wiki) for coding -practices and development tips. - -## License -By contributing to Nuclide, you agree that your contributions will be licensed -under the license outlined in the LICENSE file in the same directory as this -file. Due to certain limitations on distribution, this should not be considered -an [open source license](https://opensource.org/licenses/alphabetical). diff --git a/DEVELOPMENT b/DEVELOPMENT deleted file mode 100644 index 0c2e324251..0000000000 --- a/DEVELOPMENT +++ /dev/null @@ -1,3 +0,0 @@ -The existence of this file is used to denote that Nuclide is running from source. - -This file is *not* in `.npmignore` because the transpile script should delete it instead. diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index 0d1fbb5532..0000000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,17 +0,0 @@ -### Issue and Steps to Reproduce -Describe your issue and tell us how to reproduce it (include screenshots and/or any console messages). - -### Expected Behavior -Tell us what should happen. - -### Actual Behavior -Tell us what happens instead. - -### Versions -* Atom: -* Nuclide: -* Client OS: -* Server OS (optional): - -### Additional Details -* Installed packages (`apm ls --installed`): diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 825146408a..0000000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -nuclide.io diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md deleted file mode 100644 index ac8e316a7c..0000000000 --- a/docs/CONTRIBUTING.md +++ /dev/null @@ -1,115 +0,0 @@ -This provides guidance on how to contribute various content to `nuclide.io`. - -## Getting started - -You should only have to do these one time. - -- Rename this file to `CONTRIBUTING.md`. -- Rename `EXAMPLE-README-FOR-RUNNING-DOCS.md` to `README.md` (replacing the existing `README.md` that came with the template). -- Rename `EXAMPLE-LICENSE` to `LICENSE`. -- Checkout the [template information](./TEMPLATE-INFORMATION.md). -- Review `./_config.yml`. -- Make sure you update `title`, `description`, `tagline` and `gacode` (Google Analytics) in `./_config.yml`. - -## Basic Structure - -Most content is written in markdown. You name the file `something.md`, then have a header that looks like this: - -``` ---- -pageid: getting-started -title: Getting started with ProjectName -layout: docs -permalink: /docs/getting-started.html ---- -``` - -Customize these values for each document, blog post, etc. - -> The filename of the `.md` file doesn't actually matter; what is important is the `pageid` being unique and the `permalink` correct and unique too). - -## Landing page - -Modify `index.md` with your new or updated content. - -If you want a `GridBlock` as part of your content, you can do so directly with HTML: - -``` -
-
-
-

Your Features

- -
-
- -
-
-

More information

-

- Stuff here -

-
-
-
-``` - -or with a combination of changing `./_data/features.yml` and adding some Liquid to `index.md`, such as: - -``` -{% include content/gridblocks.html data_source=site.data.features imagealign="bottom"%} -``` - -## Blog - -To modify a blog post, edit the appropriate markdown file in `./_posts/`. - -Adding a new blog post is a four-step process. - -> Some posts have a `permalink` and `comments` in the blog post YAML header. You will not need these for new blog posts. These are an artifact of migrating the blog from Wordpress to gh-pages. - -1. Create your blog post in `./_posts/` in markdown (file extension `.md` or `.markdown`). See current posts in that folder or `./doc-type-examples/2016-04-07-blog-post-example.md` for an example of the YAML format. **If the `./_posts` directory does not exist, create it**. - - You can add a `` tag in the middle of your post such that you show only the excerpt above that tag in the main `/blog` index on your page. -1. If you have not authored a blog post before, modify the `./_data/authors.yml` file with the `author` id you used in your blog post, along with your full name and Facebook ID to get your profile picture. -1. [Run the site locally](./README.md) to test your changes. It will be at `http://127.0.0.1/blog/your-new-blog-post-title.html` -1. Push your changes to GitHub. - -## Docs - -To modify docs, edit the appropriate markdown file in `./_docs/`. - -To add docs to the site.... - -1. Add your markdown file to the `./_docs/` folder. See `./doc-type-examples/docs-hello-world.md` for an example of the YAML header format. **If the `./_docs/` directory does not exist, create it**. - - You can use folders in the `./_docs/` directory to organize your content if you want. -1. Update `_data/nav_docs.yml` to add your new document to the navigation bar. Use the `pageid` you put in your doc markdown in as the `id` in the `_data/nav_docs.yml` file. -1. [Run the site locally](./README.md) to test your changes. It will be at `http://127.0.0.1/docs/your-new-doc-permalink.html` -1. Push your changes to GitHub. - -## Header Bar - -To modify the header bar, change `./_data/nav.yml`. - -## Top Level Page - -To modify a top-level page, edit the appropriate markdown file in `./top-level/` - -If you want a top-level page (e.g., http://your-site.com/top-level.html) -- not in `/blog/` or `/docs/`.... - -1. Create a markdown file in the root `./top-level/`. See `./doc-type-examples/top-level-example.md` for more information. -1. If you want a visible link to that file, update `_data/nav.yml` to add a link to your new top-level document in the header bar. - - > This is not necessary if you just want to have a page that is linked to from another page, but not exposed as direct link to the user. - -1. [Run the site locally](./README.md) to test your changes. It will be at `http://127.0.0.1/your-top-level-page-permalink.html` -1. Push your changes to GitHub. - -## Other Changes - -- CSS: `./css/main.css` or `./_sass/*.scss`. -- Images: `./static/images/[docs | posts]/....` -- Main Blog post HTML: `./_includes/post.html` -- Main Docs HTML: `./_includes/doc.html` diff --git a/docs/Gemfile b/docs/Gemfile deleted file mode 100644 index aed0323a1b..0000000000 --- a/docs/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source 'https://rubygems.org' - -gem 'github-pages', '~> 104', group: :jekyll_plugins diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index ceea4852e0..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,84 +0,0 @@ -## User Documentation for nuclide.io - -This directory will contain the user and feature documentation for Nuclide. The documentation will be hosted on GitHub pages. - -### Contributing - -See [CONTRIBUTING.md](./CONTRIBUTING.md) for details on how to add or modify content. - -### Run the Site Locally - -The requirements for running a GitHub pages site locally is described in [GitHub help](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/#requirements). The steps below summarize these steps. - -> If you have run the site before, you can start with step 1 and then move on to step 5. - -1. Ensure that you are in the same directory where this `README.md` and the `Gemfile` file exists (e.g., it could be in `nuclide/docs` on `master`, in the root of a `gh-pages` branch, etc). The below RubyGems commands, etc. must be run from there. - -1. Make sure you have Ruby and [RubyGems](https://rubygems.org/) installed. - - > Ruby >= 2.2 is required for the gems. On the latest versions of Mac OS X, Ruby 2.0 is the - > default. Use [Homebrew](http://brew.sh) and the `brew install ruby` command (or your - > preferred upgrade mechanism) to install a newer version of Ruby for your Mac OS X system. - -1. Make sure you have [Bundler](http://bundler.io/) installed. - - ``` - # may require sudo - gem install bundler - ``` - -1. Install the project's dependencies - - ``` - # run this in the directory containing the "Gemfile" file. - bundle install - ``` - - > If you get an error when installing `nokogiri`, you may be running into the problem described - > in [this nokogiri issue](https://github.com/sparklemotion/nokogiri/issues/1483). You can - > either `brew uninstall xz` (and then `brew install xz` after the bundle is installed) or - > `xcode-select --install` (although this may not work if you have already installed command - > line tools). - -1. Run Jekyll's server. - - - On first runs or for structural changes to the documentation (e.g., new sidebar menu item), do a full build. - - ``` - # run this in the directory containing the "Gemfile" file - bundle exec jekyll serve - ``` - - - For content changes only, you can use `--incremental` for faster builds. - - ``` - bundle exec jekyll serve --incremental - ``` - - > We use `bundle exec` instead of running straight `jekyll` because `bundle exec` will always use the version of Jekyll from our `Gemfile`. Just running `jekyll` will use the system version and may not necessarily be compatible. - - - To run using an actual IP address, you can use `--host=0.0.0.0` - - ``` - # run this in the directory containing the "Gemfile" file - bundle exec jekyll serve --host=0.0.0.0 - ``` - - This will allow you to use the IP address associated with your machine in the URL. That way you could share it with other people. - - e.g., on a Mac, you can your IP address with something like `ifconfig | grep "inet " | grep -v 127.0.0.1`. - -1. Either of commands in the previous step will serve up the site on your local device at http://127.0.0.1:4000/ or http://localhost:4000. - -### Updating the Bundle - -The site depends on Github Pages and the installed bundle is based on the `github-pages` gem. -Occasionally that gem might get updated with new or changed functionality. If that is the case, -you can run: - -``` -# run this in the directory containing the "Gemfile" file -bundle update -``` - -to get the latest packages for the installation. diff --git a/docs/TEMPLATE-INFORMATION.md b/docs/TEMPLATE-INFORMATION.md deleted file mode 100644 index 9175bc0c29..0000000000 --- a/docs/TEMPLATE-INFORMATION.md +++ /dev/null @@ -1,17 +0,0 @@ -## Template Details - -First, go through `_config.yml` and adjust the available settings to your project's standard. When you make changes here, you'll have to kill the `jekyll serve` instance and restart it to see those changes, but that's only the case with the config file. - -Next, update some image assets - you'll want to update `favicon.png`, `logo.svg`, and `og_image.png` (used for Like button stories and Shares on Facbeook) in the `static` folder with your own logos. - -Next, if you're going to have docs on your site, keep the `_docs` and `docs` folders, if not, you can safely remove them (or you can safely leave them and not include them in your navigation - Jekyll renders all of this before a client views the site anyway, so there's no performance hit from just leaving it there for a future expansion). - -Same thing with a blog section, either keep or delete the `_posts` and `blog` folders. - -You can customize your homepage in three parts - the first in the homepage header, which is mostly automatically derived from the elements you insert into your config file. However, you can also specify a series of 'promotional' elements in `_data/promo.yml`. You can read that file for more information. - -The second place for your homepage is in `index.md` which contains the bulk of the main content below the header. This is all markdown if you want, but you can use HTML and Jekyll's template tags (called Liquid) in there too. Checkout this folder's index.md for an example of one common template tag that we use on our sites called gridblocks. - -The third and last place is in the `_data/powered_by.yml` and `_data/powered_by_highlight.yml` files. Both these files combine to create a section on the homepage that is intended to show a list of companies or apps that are using your project. The `powered_by_highlight` file is a list of curated companies/apps that you want to show as a highlight at the top of this section, including their logos in whatever format you want. The `powered_by` file is a more open list that is just text links to the companies/apps and can be updated via Pull Request by the community. If you don't want these sections on your homepage, just empty out both files and leave them blank. - -The last thing you'll want to do is setup your top level navigation bar. You can do this by editing `nav.yml` and keeping the existing title/href/category structure used there. Although the nav is responsive and fairly flexible design-wise, no more than 5 or 6 nav items is recommended. diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 0386252b1c..0000000000 --- a/docs/_config.yml +++ /dev/null @@ -1,99 +0,0 @@ -# Site settings -permalink: /blog/:year/:month/:day/:title/ -title: Nuclide -tagline: A unified developer experience for software development -fbappid: "" -gacode: "UA-44373548-2" -description: > - Nuclide is built as a single package on top of Atom to provide hackability and the support of an active community. - - It provides a first-class development environment for React Native, Hack and Flow projects. -logo: /static/og_image.png - -# baseurl determines the subpath of your site. For example if you're using an -# organisation.github.io/reponame/ basic site URL, then baseurl would be set -# as "/reponame". If you have a top-level domain URL, you can set it to "" or -# leave blank as it is now set to "" by default as discussed in: -# http://jekyllrb.com/news/2016/10/06/jekyll-3-3-is-here/ - -# the base hostname & protocol for your site -# If baseurl is set, then the absolute url for your site would be url/baseurl -# This was also be set to the right thing automatically for local development -# https://github.com/blog/2277-what-s-new-in-github-pages-with-jekyll-3-3 -# http://jekyllrb.com/news/2016/10/06/jekyll-3-3-is-here/ -url: "https://nuclide.io" - -# Note: There are new filters in Jekyll 3.3 to help with absolute and relative urls -# absolute_url -# relative_url -# So you will see these used throughout the Jekyll code in this template. -# no more need for | prepend: site.url | prepend: site.baseurl -# http://jekyllrb.com/news/2016/10/06/jekyll-3-3-is-here/ -# https://github.com/blog/2277-what-s-new-in-github-pages-with-jekyll-3-3 - -# The GitHub repo for your project -ghrepo: "facebook/nuclide" - -# Build settings -# Github pages now only supports Kramdown and Rouge -# https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0 -# So no need to be explicit with respect to our markdown and highlighter settings since they -# cannot change. -# kramdown also automatically generates header ID's too. But we remove any auto id suffix -# in a post processing step (js/jekyll-link-anchors.js) to make the links more readable. - -# For local development and testing, explicitly set kramdown settings that GitHub does -# https://help.github.com/articles/using-jekyll-with-pages/#defaults-you-can-change -kramdown: - input: GFM - hard_wrap: false - -# Blog posts are built into to Jekyll by default, with the `_posts` directory. -# Here you can specify other types of documentation. The names here are `docs` -# and `top-level`. This means their content will be in `_docs` and `_top-level`. -# The permalink format is also given. -# http://ben.balter.com/2015/02/20/jekyll-collections/ -collections: - docs: - output: true - permalink: /docs/:name/ - top-level: - output: true - permalink: /:name/ - -sass: - style: :compressed - -color: - # Provides colour for background of top header of homepage - primary: "#2F0F56" - # Provides colour for background of elsewhere on site - secondary: "#e4e4e4" - # A color that will work for buttons laid on top of primary colour - light: "#9B4DCA" - # Color that will work for text on top of light color - lighttext: "#fff" - # Color of text in the top header of homepage, must be legible on top of primary color - headertext: "#fff" - # Color of text on top of the secondary color background - bodytext: "#151515" - # Background of fixed nav header - headertext color is used for mini logo text - nav: "#4A148C" - # Text of links in the nav - navtext: "#c79aff" - # Color of link underlines in the main body, and hover background color for links - link: "#6223b0" - -# RSS Feed -gems: - - jekyll-feed - - jekyll-seo-tag - - jekyll-sitemap - -# Set default open graph image for all pages -defaults: - - - scope: - path: "" - values: - image: /static/og_image.png diff --git a/docs/_data/authors.yml b/docs/_data/authors.yml deleted file mode 100644 index 80182f2fc5..0000000000 --- a/docs/_data/authors.yml +++ /dev/null @@ -1,12 +0,0 @@ -zertosh: - full_name: Andres Suarez - fbid: 18700343 -matthewwithanm: - full_name: Matthew Dapena-Tretter - fbid: 100002839212206 -a20012251: - full_name: Walter Erquinigo - fbid: 750002794 -hansonw: - full_name: Hanson Wang - fbid: 505887506 diff --git a/docs/_data/features.yml b/docs/_data/features.yml deleted file mode 100644 index 81d5f2a52f..0000000000 --- a/docs/_data/features.yml +++ /dev/null @@ -1,47 +0,0 @@ -- title: Built-in Debugging - text: | - Building upon Chrome Developer Tools, Nuclide has first class debugging support for React - Native, Hack (shown here), Flow and other platforms. \\ - [**Read More**](/docs/features/debugger) - image: images/docs/promo-debugger.png - -- title: Remote Development - text: | - Connect to your remote servers, and get full access to the file tree within Nuclide. \\ - [**Get Started**](/docs/features/remote/) - image: images/docs/promo-remote-development.png - -- title: Developing JavaScript - text: | - Improve the quality of your JavaScript with built in support for [Flow](http://flowtype.org), - including autocomplete, jump-to-definition, and inline errors. \\ - [**Read More**](/docs/languages/flow/) - image: images/docs/promo-flow.png - -- title: Developing Hack - text: | - Nuclide is the first IDE with support for Hack, including autocomplete, jump-to-definition, - inline errors, and an omni-search bar for your project. \\ - [**Read More**](/docs/languages/hack/) - image: images/docs/promo-hack.png - -- title: Task Runner - text: | - Nuclide's Task Runner is a tool for building, running, testing, and debugging your Buck, Hack, and Swift projects. \\ - [**Read More**](/docs/features/task-runner/) - image: images/docs/promo-task-runner.png - -- title: Working Sets - text: | - Is your project big, but only a small subset applies to your work? Working Sets can reduce - noise. \\ - [**Read More**](/docs/features/working-sets/) - image: images/docs/promo-working-sets.png - -- title: Mercurial Support - text: | - Local changes to files in a Mercurial repo will be reflected in Atom's file tree and UI, as - Atom does natively for Git repos. \\ - [**Read More**](/docs/features/hg/) - image: images/docs/promo-mercurial.png - center: true diff --git a/docs/_data/nav.yml b/docs/_data/nav.yml deleted file mode 100644 index 4fc9bd2cd1..0000000000 --- a/docs/_data/nav.yml +++ /dev/null @@ -1,18 +0,0 @@ -- title: Docs - href: /docs/ - category: docs - -- title: Blog - href: /blog/ - category: blog - -- title: Support - href: /support/ - category: support - -- title: GitHub - href: https://github.com/facebook/nuclide - category: external - -# Use external for external links not associated with the paths of the current site. -# If a category is external, site urls, for example, are not prepended to the href, etc. diff --git a/docs/_data/nav_docs.yml b/docs/_data/nav_docs.yml deleted file mode 100644 index 85f92661f0..0000000000 --- a/docs/_data/nav_docs.yml +++ /dev/null @@ -1,48 +0,0 @@ -- title: Quick Start - items: - - id: quick-start-getting-started - - id: editor-basics -- title: About - items: - - id: editor-setup - - id: editor-keyboard-shortcuts - - id: editor-uninstall - - id: help-faq - - id: help-troubleshooting -- title: Feature Guides - items: - - id: feature-remote - - id: feature-debugger - - id: feature-task-runner - - id: feature-quick-open - - id: feature-working-sets - - id: feature-outline-view - - id: feature-context-view - - id: feature-health - - id: feature-terminal -- title: Plugins - items: - - id: feature-hg - - id: feature-toolbar - - id: feature-buck - - id: feature-format-js -- title: Languages - items: - - id: language-hack - - id: language-flow - - id: language-objective-c - - id: language-cpp - - id: language-python - - id: language-swift - - id: language-other -- title: Platforms - items: - - id: platform-ios - - id: platform-android - - id: platform-react-native - - id: platform-web -- title: Advanced Topics - items: - - id: advanced-building-from-source - - id: advanced-custom-keybindings - - id: advanced-linter-package-compatibility diff --git a/docs/_data/promo.yml b/docs/_data/promo.yml deleted file mode 100644 index 011321542f..0000000000 --- a/docs/_data/promo.yml +++ /dev/null @@ -1,12 +0,0 @@ -- type: button - href: docs/quick-start/getting-started/ - text: Getting Started -- type: button - href: docs/platforms/react-native/ - text: React Native -- type: button - href: docs/platforms/ios/ - text: iOS -- type: button - href: docs/platforms/web/ - text: Web diff --git a/docs/_docs/advanced-topics/building-from-source.md b/docs/_docs/advanced-topics/building-from-source.md deleted file mode 100644 index 26c925d758..0000000000 --- a/docs/_docs/advanced-topics/building-from-source.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -pageid: advanced-building-from-source -title: Building Nuclide From Source -layout: docs -permalink: /docs/advanced-topics/building-from-source/ ---- - -It is generally recommended to [install the released package of Nuclide](/docs/setup), but for -those willing to live on the bleeding edge, you can install Nuclide from source. - -* TOC -{:toc} - -## Mac - -### Prerequisites - -You must have the [general prerequisites](/docs/editor/setup#mac__prerequisites) installed. In -addition, you must have - -
    -
  • Xcode (for Command Line Tools)
  • -
  • -
  • Atom Shell Commands (open Atom and go to `Atom | Install Shell Commands`) installed as well.
  • -
  • The Yarn package manager (run npm install -g yarn)
  • -
- -> Xcode can be installed from the App Store. Installation can take a *long, long* time. So be patient. - -> To install Node, the easiest way is to -> [download the latest released Node package](https://nodejs.org) and go through the installer. - -You can verify all the appropriate dependencies. All the following should be in your `$PATH` environment variable (usually `usr/bin` or `usr/local/bin`). - -```bash -$ git --version -$ node --version -$ yarn --version -$ apm --version -``` - -### Building - -Run the following commands to build Nuclide from source. - -```bash -# Clone the source -$ git clone https://github.com/facebook/nuclide.git -$ cd nuclide -# Install dependencies -$ yarn --pure-lockfile -# Link the 'nuclide' package to Atom's package directory -# You could also use apm link --dev ... see Development Mode below. -$ apm link -``` - -Verify the installation: - -1. Open Atom. -2. Go to `Atom | Preferences`. -3. Click on **Packages**. -4. Verify `nuclide` is one of the packages. - -## Linux - -### Prerequisites - -You must have the [general prerequisites](/docs/editor/setup#linux__prerequisites) installed. - -

- -To install Node, see [Node.js's download page](https://nodejs.org/en/download/) for steps that work best for your setup. - -You'll also need the [Yarn](https://yarnpkg.com) package manager (run `npm install -g yarn`). - -You can verify all the appropriate dependencies. All the following should be in your `$PATH` environment variable (usually `usr/bin` or `usr/local/bin`). - -```bash -$ git --version -$ node --version -$ yarn --version -$ apm --version -``` - -### Building - -Run the following commands to build Nuclide from source. - -```bash -# Clone the source -$ git clone https://github.com/facebook/nuclide.git -$ cd nuclide -# Install dependencies -$ yarn --pure-lockfile -# Link the 'nuclide' package to Atom's package directory -# You could also use apm link --dev ... see Development Mode below. -$ apm link -``` - -Verify the installation: - -1. Open Atom. -2. Go to `File | Preferences`. -3. Click on **Packages**. -4. Verify `nuclide` is one of the packages. - -## Windows - -Building Nuclide from source is not currently supported on Windows. - -> It is possible to build Nuclide from source on Windows, but this is done with no guarantee of -> success. The feature set will also be [limited](/docs/editor/setup/#windows). - -## Development Mode - -If you have another version of Nuclide installed (e.g., the official `apm` package), but you also want to run Nuclide from source, you can `apm link --dev` then run Nuclide via `atom --dev`. This will allow something similar to a production and development installation of Nuclide. - -When you open Atom in development mode, either with the `atom --dev` from the command line or with -the `View | Developer | Open in Dev Mode...` command from within the Atom menus, your linked version -of Nuclide will load in place of any other version of Nuclide you might have installed. diff --git a/docs/_docs/advanced-topics/custom-keybindings.md b/docs/_docs/advanced-topics/custom-keybindings.md deleted file mode 100644 index 1f37c257b1..0000000000 --- a/docs/_docs/advanced-topics/custom-keybindings.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -pageid: advanced-custom-keybindings -title: Custom Keybindings -layout: docs -permalink: /docs/advanced-topics/custom-keybindings/ ---- - -Nuclide has a bunch of [built-in bindings](/docs/editor/keyboard-shortcuts) to help you be -productive from the keyboard. However, you may want to add your own keybindings for Nuclide -commands as well. This is fairly easily done with some CSON editing. - -* TOC -{:toc} - -## Keymap CSON - -To create your own keybinding, you will need to edit your `~/.atom/keymap.cson` file. If you aren't -familiar with CSON, it is the [CoffeeScript equivalent of JSON](https://github.com/bevry/cson). - -Here is an example `~/.atom/keymap.cson` file: - -```coffeescript -'.editor:not(.mini)': - 'cmd-d': 'editor:delete-line' - 'cmd-home': 'core:move-to-top' - 'cmd-end': 'core:move-to-bottom' - 'cmd-l': 'go-to-line:toggle' -``` - -Because CSON is a superset of JSON this could also be written as: - -```coffeescript -{ - '.editor:not(.mini)': { - 'cmd-d': 'editor:delete-line', - 'cmd-home': 'core:move-to-top', - 'cmd-end': 'core:move-to-bottom', - 'cmd-l': 'go-to-line:toggle' - } -} -``` - -It may not be obvious, but each key in the top-level map is a CSS selector. Values are pairs of -commands and keybindings that are applicable in an element that matches the CSS selector. The -selector `.editor:not(.mini)` matches an editor in Nuclide that is not used as a single-line input -text box. Therefore, when you want to add a keyboard shortcut for an editor, add it to the -`.editor:not(.mini)` map. - -### Platform Specific Bindings - -You can make your bindings platform specific with `.platform-xxxxx` as part of your CSS selector. -For example the Nuclide `nuclide-quick-open` CSON looks like this: - -``` -{ - ".platform-darwin atom-workspace": { - "cmd-t": "nuclide-quick-open:find-anything-via-omni-search" - }, - ".platform-win32 atom-workspace, .platform-linux atom-workspace": { - "ctrl-t": "nuclide-quick-open:find-anything-via-omni-search" - } -} -``` - -where `.platform-darwin` represents macOS, `.platform-win32` represents Windows, and `.platform-linux` represents Linux. diff --git a/docs/_docs/advanced-topics/linter-package-compatibility.md b/docs/_docs/advanced-topics/linter-package-compatibility.md deleted file mode 100644 index d2bed3549b..0000000000 --- a/docs/_docs/advanced-topics/linter-package-compatibility.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -pageid: advanced-linter-package-compatibility -title: Linter Package Compatibility -layout: docs -permalink: /docs/advanced-topics/linter-package-compatibility/ ---- - -Nuclide Diagnostics displays diagnostic messages about your code from arbitrary providers. These can be lint warnings, compiler errors, etc. - -Any package that works with the [`linter`](https://atom.io/packages/linter) package should also work with Nuclide Diagnostics. - -We discourage the use of both Nuclide Diagnostics and `linter` together, since you will see duplicate UI for reporting diagnostics. To that end, if you wish to use Nuclide Diagnostics, we recommend disabling the `linter` package. If you wish to continue using the `linter`, we recommend disabling all `nuclide-diagnostics-*` Nuclide features. Please note that doing so will disable some Nuclide capabilities such as Flow and Hack error reporting. diff --git a/docs/_docs/editor/basics.md b/docs/_docs/editor/basics.md deleted file mode 100644 index 8c9dac2134..0000000000 --- a/docs/_docs/editor/basics.md +++ /dev/null @@ -1,245 +0,0 @@ ---- -pageid: editor-basics -title: Basics -layout: docs -permalink: /docs/editor/basics/ ---- - -Nuclide is a code editor built on the backbone of [GitHub's Atom text editor](https://atom.io). -Like other code editors and IDEs, there is a familiar look and feel to Nuclide. On the left side is your project tree, which includes associated files and folders. On the right side is -the main editor that contains the code and text for files in your project. And at the bottom is a -status bar providing quick-look information such as errors, the path of the current file relative -to your project root, the type of file that is open, and other context-aware data. - -![](/static/images/docs/editor-basics-intro.png) - -* TOC -{:toc} - -## Opening - -Assuming you have it [installed](/docs/editor/setup/), Nuclide is opened by opening Atom via mouse -(Dock, Applications folder, etc.) or from the command-line in a terminal window by running: - -```bash -$ atom -``` - -> To enable opening Atom from the command-line, you will need to install shell commands from the -> either the `Atom` menu or the Atom [Command Palette](/docs/editor/basics/#command-palette). In the -> Command Palette, search for "Window: Install Shell Commands". - -To open a specific directory into the [Project Explorer](/docs/editor/basics/#project-explorer), you can add a path argument to the `atom` command. - -```bash -$ atom /path/to/your/project/ -``` - -By default, when you open Nuclide, the Home page appears. - -![](/static/images/docs/editor-basics-homepage.png) - -The Nuclide Home page gives you quick access to common Nuclide tools and features, as well as -information regarding how to provide feedback. - -## Project Explorer - -The Project Explorer is on the left side of Nuclide and contains two tabs: **File Tree** and **Source Control**. This is where you can open projects, navigate through your project to open files in the [Editing Area](#editing-area), create new files and folders, view source control information, etc. - -### Adding Projects - -The first time you open Nuclide, there will be no projects or files open. Instead you will see two options in the Project Explorer's File Tree tab: 1) **Add Project Folder**, which opens a local project, and 2) **Add Remote Project Folder**, which opens a project on a [remote machine](/docs/features/remote/). - -![](/static/images/docs/editor-basics-adding-projects.png) - -When you choose a project to open, you are choosing the root directory of that project. Upon -opening, the project's file tree appears with the root folder at the top. - - - -To remove a project from the Project Explorer, *right-click* on the root folder, and choose **Remove Project Folder**. - -### Multiple Projects - -You can have more than one project open at a time. To open a second project, *right-click* anywhere in the Project Explorer's File Tree area, and choose **Add Project Folder** or **Add Remote Project Folder**. - -> You can have both local and remote projects open at the same time. - -With multiple projects open, default searching for files and in files will span both projects. -However, features such as debugging and error checking will still occur by project. - -> For the `Find | Find In Project` task, you can add project-level granularity by specifying the -> root of the desired project as a filter for the search. - -### Open Files - -The Project Explorer's **Open Files** list displays which files are currently open, allows for quick closure of open files (click on the `x` icon of a file), and indicates which files have unsaved changes (a blue dot in front of the file name). - - - -### Changed Files - -If your project is under source control, the Project Explorer will highlight the files that have changed in your project since your last commit. - -![](/static/images/docs/editor-basics-explorer-changed-files.png) - -#### Uncommitted Changes - -Files that have had changes made to them will also appear in the **Uncommitted Changes** list at the top of the Project Explorer. - - - -#### Source Control - -Under the Project Explorer's **Source Control** tab, you can see if uncommitted changes exist or not. If you are working with a Mercurial repository, the branches are listed as well. - -### Context-Aware Menu - -A context-aware menu appears when you *right-click* in the explorer. This menu provides -options such as adding new projects, searching within the project, etc. - -![](/static/images/docs/editor-basics-explorer-context-aware.png) - -## Editing Area - -The Editing Area is the main area for working with your code and text files. Each file is represented by a -tab. You can split this area into various panes for easier modification of multiple files. -The Editing Area is also where you will find specialized tabs for the Nuclide Home page, -the settings page, etc. - -### File Navigation - -Navigating between files and within files is the same as in -[Atom](https://atom.io/docs/v1.5.0/using-atom-moving-in-atom). - -You can quickly switch between open files by using `Ctrl-Tab` to cycle right or `Ctrl-Shift-Tab` to -cycle left. - -Within files you can go straight to a line number by pressing `Ctrl-G`. If your project uses -a supported language, you can also jump to symbols with `Cmd-R` (`Ctrl-R` on Linux). - -![](/static/images/docs/editor-basics-editing-area-symbols.png) - -### Search - -Most of the searching actions are the same as -[Atom](https://atom.io/docs/v1.5.0/using-atom-find-and-replace). For example, you can search within -a file (i.e., `Cmd-F`) or throughout your entire project(s) (i.e., `Cmd-Shift-F`). - -In addition to the basic Atom searching, Nuclide adds an additional powerful search functionality -that allows you to search in various contexts. OmniSearch (`Cmd-T` on Mac and `Ctrl-T` on Linux) -provides a way to search, all at once, across your project, within your files, code symbols, etc. - -![](/static/images/docs/editor-basics-editing-omnisearch.png) - -### Context-Aware Menu - -A context-aware menu appears when you *right-click* in the Editing Area. This menu provides options such as adding and closing panes, setting and removing breakpoints, showing line-by-line blame (if that information is available), etc. - -![](/static/images/docs/editor-basics-editing-context-aware.png) - -## Status Bar - -The Nuclide status bar builds upon the -[Atom status bar package](https://github.com/atom/status-bar), adding powerful new -features, including code diagnostics and remote connection status. - -![](/static/images/docs/editor-basics-status-bar-intro.png) - -### Code Diagnostics - -If you are using a supported language that provides linting and/or type checking capabilities -(e.g., [Hack](/docs/languages/hack/) or [Flow](/docs/languages/flow/)), then code diagnostics is built directly into Nuclide for that language. - -![](/static/images/docs/editor-basics-status-bar-diagnostics.png) - -### Remote Connection Status - -If you are connected to a project on a remote machine, clicking the Remote Connection icon on -the status bar will provide information about the current status of that connection. Generally, if -all is well, the connection to the server is "healthy". - -![](/static/images/docs/editor-basics-status-bar-connection.png) - -> If you check the connection against a local project, you will get information regarding whether -> the current active file exists on the local filesystem. - -### File Encoding - -The default file encoding for Atom is `UTF-8`. Clicking on this in the status bar allows you to -change the encoding of the current file. - -### Language Selection - -Atom automatically determines the language of the current file. Normally, this is correct. However, you can change -the language, and Atom will change its syntax highlighting appropriately. - -### Branch - -Assuming your project is under source control, the status bar also shows the current branch on -which you are working. - -## Gutter - -Atom has a [gutter](https://atom.io/docs/latest/getting-started-atom-basics#basic-terminology) that -shows you information such as current line number, source control status and function/method -folding. Nuclide has added further features to the gutter, including setting breakpoints for the -debugger and showing diagnostics for supported languages. - -![](/static/images/docs/editor-basics-gutter-intro.png) - -### Code Diagnostics - -If you hover over the code diagnostics errors, an inline window appears showing the problem. - -![](/static/images/docs/editor-basics-gutter-code-diagnostics.png) - -## Preferences Pane - -Nuclide has its own set of customizable preferences and settings. - -You get to these preferences by opening the Atom Settings view via the `Cmd-,` keyboard shortcut -(`Ctrl-,` on Linux) or through the `Packages | Settings View | Open` menu option. - -A new tab opens in the [Editing Area](/docs/editor/basics/#editing-area) titled **Settings**. Select **Packages** from the list at the left of the Settings tab, and scroll down until you see `nuclide` under either **Community Packages** or **Development Packages**. - -![](/static/images/docs/editor-basics-nuclide-package.png) - -> If you linked the [Nuclide source code](https://github.com/facebook/nuclide) to Atom's development -> packages and opened Atom in development mode via the `--dev` flag, you will see the `nuclide` -> package under **Development Packages**. - -Click on **Settings** to see all of the Nuclide preferences and settings. - -![](/static/images/docs/editor-basics-nuclide-preferences.png) - -## Command Palette - -Atom is highly flexible in how you perform actions. Nuclide adds actions as well. There is a -variety of menu options, and many menu commands are equally accessible from the keyboard as well. - -The Command Palette shows you every available command available in Atom and Nuclide. - -`Cmd-Shift-P` toggles the Command Palette. - -![](/static/images/docs/editor-basics-command-palette-intro.png) - -You can narrow down the options that match your search by typing in the text box at the top of the Command Palette. - -![](/static/images/docs/editor-basics-command-palette-search.png) - -## Distraction-Free Mode - -Distraction-Free Mode enables you to eliminate any surrounding panes allowing the [Editing Area](/docs/editor/basics/#editing-area) to take over the entirety of the window without having to toggle panes off individually. - -To use Distraction-Free Mode in your project, click on the **Toggle Distraction-Free Mode** button in the [Nuclide toolbar](/docs/features/toolbar/#buttons). - -Before activating Distraction-Free Mode: - -![](/static/images/docs/editor-basics-distraction.png) - -After activating Distraction-Free Mode: - -![](/static/images/docs/editor-basics-distraction-free.png) - ->If you wish, you can activate other panes after entering Distraction-Free Mode by toggling them on with their [toolbar buttons](/docs/features/toolbar/#buttons) or the [Command Palette](#command-palette). diff --git a/docs/_docs/editor/keyboard-shortcuts.md b/docs/_docs/editor/keyboard-shortcuts.md deleted file mode 100644 index f4e145a261..0000000000 --- a/docs/_docs/editor/keyboard-shortcuts.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -pageid: editor-keyboard-shortcuts -title: Keyboard Shortcuts -layout: docs -permalink: /docs/editor/keyboard-shortcuts/ ---- - -You can perform many tasks in Nuclide from the keyboard. Below are the various keyboard shortcuts -available for the sets of functionality that Nuclide has to offer. - -> Atom has many more keyboard shortcuts available above and beyond what Nuclide offers. To -> get a complete list of the keybindings, you can go to -> `Packages | Settings View | Show Keybindngs`. - -> You can create your own [custom keybindings](/docs/advanced-topics/custom-keybindings) beyond -> those Nuclide provides. - -
- -* TOC -{:toc} - - -## Symbols - -Here is a legend of symbols that are associated with the keys shown in the keybindings. - -| Key | Symbol | -| ----|--------| -| `Alt` or `Option` on macOS | `⌥` | -| `Cmd` on macOS | `⌘` | -| `Ctrl` | `^` | -| `Shift` | `⇧` | -| `Left` | `←` | -| `Up` | `↑` | -| `Right` | `→` | -| `Down` | `↓` | -| `Backspace` | `⌫` | - -If you see a comma (`,`) in a key sequence that means *then*, as in "press this sequence, then press that -sequence". - -## Common Bindings - -These are also described in their respective sections below, but this provides a quick access table -for the most common shortcuts provided by Nuclide. - -| Key (macOS) | Key (Linux) | Description | -|-----------|-------------|-------------| -| `Cmd-T` | `Ctrl-T` | Use [OmniSearch](/docs/features/quick-open/#omnisearch) to open files, etc. | -| `Cmd-\` | `Ctrl-\` | Toggle the [Project Explorer](/docs/editor/basics/#project-explorer). | -| `Ctrl-0` | `Ctrl-0` | Toggle between the [Editing Area](/docs/editor/basics/#editing-area) and the [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree. | -| `Cmd-K,` | `Ctrl-K,` | Split the current file to the pane represented by ``, where `` is the down, up, left or right arrow. | -| `Option-Shift-D` | `Alt-Shift-D` | Open the [Code Diagnostics](/docs/editor/basics/#status-bar__code-diagnostics) window. | - -## Development - -These shortcuts provide quick access to development features such as [Code Diagnostics](/docs/editor/basics/#status-bar__code-diagnostics) (e.g, linting), etc. - -| Key (macOS) | Key (Linux) | Command | Description | -|-----------|-------------|---------|-------------| -| `Option-O`| `Alt-O` | `outline-view:toggle` | Toggles the [Outline View](/docs/features/outline-view/) for a supported file so you can easily navigate to class and function definitions. | -| `Cmd-I` | `Ctrl-I` | `nuclide-context-view:toggle` | Toggles the [Context View](/docs/features/context-view/). | - -### Hack/Flow/JavaScript - -| Key (macOS) | Key (Linux) | Command | Description | -|-----------|-------------|---------|-------------| -| `Option-Shift-Cmd-F` | `Alt-Shift-Ctrl-F` | `find-references:activate` | In projects such as Hack or Flow, this will allow you to find all the references to a selected, highlighted entity in your project. | -| `Option-Cmd-Y` | `Alt-Cmd-Y` | `nuclide-hack-symbol-provider:toggle-provider` | Allows you to search for Hack function, classes and constants within you Hack project. -| `Cmd-Shift-I` | `Ctrl-Shift-I` | `nuclide-format-js:format` | Automatically tries to insert missing `require` statements to your [Flow](/docs/languages/flow/) or [JavaScript](/docs/languages/other/#javascript) project. - - -### Code Diagnostics - -| Key (macOS) | Key (Linux) | Command | Description | -|-----------|-------------|---------|-------------| -| `Option-Shift-D` | `Alt-Shift-D` | `diagnostics:toggle-table` | Display the window showing you messages about your code. Possible messages include lint, compiler errors, etc. | -| `Option-Shift-A` | `Alt-Shift-A` | `diagnostics:fix-all-in-current-file` | Nuclide can fix certain types of problems for you automatically, including various lint problems. This will allow all those to be fixed in the current file. | -| `Option-Ctrl-<` | `Alt-Ctrl-<` | `diagnostics:go-to-first-diagnostic` | Go to the first diagnostic. | -| `Option-Ctrl->` | `Alt-Ctrl->` | `diagnostics:go-to-last-diagnostic` | Go to the last diagnostic. | -| `Option-<` | `Alt-<` | `diagnostics:go-to-previous-diagnostic` | Go to the previous diagnostic. | -| `Option-Ctrl->` | `Alt->` | `diagnostics:go-to-next-diagnostic` | Go to the next diagnostic. | - -## Project Explorer's File Tree - -The [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree tab in the left side pane is a tree of all of your project files. - -| Key (macOS) | Key (Linux) | Command | Description | Alternative | -|-----------|-------------|---------|-------------|-------------| -| `Right` | `Right` | `expand-directory` | Expand the current directory. | `Ctrl-]` | -| `Left` | `Left` | `collapse-directory` | Collapse the current directory. | `Ctrl-[` | -| `Option-Right` | `Alt-Right` | `recursive-expand-directory` | Expand all the directories from the current to the final directory child. | `Ctrl-Alt-]` | -| `Option-Left` | `Alt-Left` | `recursive-collapse-directory` | Collapse all the directories to the top parent. | `Ctrl-Alt-[` -| `Ctrl-{` | `Ctrl-{` | `recursive-collapse-all` | Collapse the entire [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree to the root. | | -| `Delete` | `Delete` | `remove` | Remove a file or directory from the tree. You will be prompted first to avoid accidental mistakes. | | -| `Cmd-\` | `Ctrl-\` | `toggle` | Toggles whether the [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree is shown. | `Cmd-K`, `Cmd-B` | -| `Home` | `Home` | `move-to-top` | Move the selection to the very top of the [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree. | | -| `End` | `End` | `move-to-bottom` | Move the selection to the very bottom of the [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree. | | -| `Enter` | `Enter` | `open-selected-entry` | Opens the selected entry in the [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree. If a directory is selected, then the directory is expanded. If a file is selected, then the file is opened in the main [Editing Area](/docs/editor/basics/#editing-area). | | -| `Cmd-K-Down` | `Ctrl-K-Down` | `open-selected-entry-down` | If a file is selected, it opens the file in the bottom pane. | | -| `Cmd-K-Right` | `Ctrl-K-Right` | `open-selected-entry-right` | If a file is selected, it opens the file in the right pane. | | -| `Cmd-K-Up` | `Ctrl-K-Up` | `open-selected-entry-up` | If a file is selected, it opens the file in the top pane. | | -| `Cmd-K-Left` | `Ctrl-K-Left` | `open-selected-entry-left` | If a file is selected, it opens the file in the left pane. | | -| `Cmd-|` | `Ctrl-|` | `reveal-active-file` | Shows the file that is currently active in the main workspace in the [Project Explorer](/docs/editor/basics/#project-explorer)'s File Tree. | `Cmd-Shift-\` (macOS) or `Ctrl-Shift-\` (Linux) -| `Ctrl-O` | `Ctrl-O` | `toggle-focus` | Toggles the focus of the current active file. | | - -## Files - -Whether switching between or searching for or within files, there are some keyboard shortcuts to -help accomplish file tasks a bit faster. - -| Key (macOS) | Key (Linux) | Command | Description | Alternative | -|-----------|-------------|---------|-------------|-------------| -| `Cmd-T` | `Ctrl-T` | `nuclide-quick-open:find-anything-via-omni-search` | Use this for a global search of anything within your project, including all files, currently open files, etc. | `Cmd-P` (macOS) or `Ctrl-P` (Linux) | -| `Option-Cmd-O` | `Alt-Ctrl-O` | `nuclide-open-filenames-provider:toggle-provider` | This lets you switch between files that are currently open in the editor. Useful for quickly accessing files if you have a bunch of files open. | -| `Option-Cmd-R` | `Alt-Ctrl-r` | `nuclide-recent-files-provider:toggle-provider` | This will show you files that you have recently opened and used in previous sessions of Nuclide. | -| `Option-Cmd-T`| `Alt-Ctrl-T` | `nuclide-fuzzy-filename-provider:toggle-provider` | This allows you to search for files based on patterns. | -| `Option-Cmd-N`| `Alt-Ctrl-N` | `nuclide-related-files:jump-to-next-related-file` | Find files related to the current file. A file is related if they have the same basename, but a different extension, for example. | - -## Task Runner - -Nuclide has support for running some common tasks on a variety of projects, like building a Buck project or debugging a React-Native one. For these tasks there is a set of useful keybord shortcuts you can use. - -| Key (macOS) | Key (Linux) | Command | Description | -|-------------|-------------|---------|-------------| -| `Cmd-B B` | `Alt-B B` | `nuclide-task-runner:build` | Executes the Build task for the currently selected Task Runner or the default one| -| `Cmd-B D` | `Alt-B D` | `nuclide-task-runner:debug` | Executes the Debug task for the currently selected Task Runner or the default one| -| `Cmd-B R` | `Alt-B R` | `nuclide-task-runner:run` | Executes the Run task for the currently selected Task Runner or the default one| -| `Cmd-B T` | `Alt-B T` | `nuclide-task-runner:test` | Executes the Test task for the currently selected Task Runner or the default one| -| `Cmd-B P` | `Alt-B P` | `nuclide-task-runner:run-selected-task` | Executes the currently selected Task| - -## Debugger - -The [Nuclide Debugger](/docs/features/debugger/) attaches to a running process. [Breakpoints](/docs/features/debugger/#basics__breakpoints) are managed in the [gutter](/docs/editor/basics/#gutter) to the left of your code and line numbers. - -| Key (macOS) | Key (Linux) | Command | Description | -|-----------|-------------|---------|-------------| -| `Option-Cmd-I` | `Alt-Ctrl-I` | `window:toggle-dev-tools` | Toggle the developer tools UI. | -| `Shift-Cmd-A` | `Shift-Ctrl-A` | `debugger:show-attach-dialog` | Shows the process attachment UI where you will choose the process on which you would like to debug (e.g., a Node process, etc.) | -| `Cmd-F8` | `Ctrl-F8` | `debugger:show-launch-dialog` | Shows the process launch UI where you will choose the process on which you would like to debug (e.g., a Node process, etc.) | -| `Cmd-Alt-J` | `Ctrl-Shift-J` | `nuclide-output:toggle` | Toggle the [Console](/docs/features/debugger/#basics__evaluation) pane. | -| `F8` | `F8` | `debugger:continue-debugging` | After stopping at a breakpoint, and possibly stepping through code, this will enable debugging to continue to the next breakpoint or end of the process. | -| `Shift-F8` | `Shift-F8` | `debugger:run-to-location` | After breaking at a certain position or breakpoint, it will continue to cursor location. | -| `F9` | `F9` | `debugger:toggle-breakpoint` | If a breakpoint is set, this will unset that breakpoint and vice-versa. | -| `F10` | `F10` | `debugger:step-over` | Step over a piece of code. For example, if you are stopped at a method call, this will execute that method without stepping through it line-by-line. | -| `F11` | `F11` | `debugger:step-into` | Step into a piece of code. For example, if you are stopped at a method call, this will go into the first line of that method. | -| `Shift-F11` | `Shift-F11` | `debugger:step-out` | If you have stepped into a piece of code, this will step out to the point on which you entered that piece of code. For example, if you stepped into a method, this will step out back to the method call itself. | -| `Shift-F5` | `Shift-F5` | `debugger:stop-debugging` | Detach debugger. | -| `Cmd-Shift-F8` | `Ctrl-Shift-F8` | `debugger:restart-debugging` | Restart the current debugging session with the same configuration settings. | - -## Editor Panes - -These are keyboard shortcuts with respect to moving currently active files in the editor around the -main panes. - -| Key (macOS) | Key (Linux) | Command | Description | -|-----------|-------------|---------|-------------| -| `Cmd-K-Down` | `Ctrl-K-Down` | `nuclide-move-pane:move-tab-to-new-pane-down` | Moves the currently active file in the editor to a bottom pane. | -| `Cmd-K-Right` | `Ctrl-K-Right` | `nuclide-move-pane:move-tab-to-new-pane-right` | Moves the currently active file in the editor to a right pane. | -| `Cmd-K-Up` | `Ctrl-K-Up` | `nuclide-move-pane:move-tab-to-new-pane-up` | Moves the currently active file in the editor to a top pane. | -| `Cmd-K-Left` | `Ctrl-K-Left` | `nuclide-move-pane:move-tab-to-new-pane-left` | Moves the currently active file in the editor to a left pane. | - -## Navigation - -These are keyboard shortcuts with respect to navigation within files, etc. - -| Key (macOS) | Key (Linux) | Command | Description | -|-----------|-------------|---------|-------------| -| `Ctrl-,` | `Ctrl-<` | `nuclide-navigation-stack:navigate-backwards` | Moves the cursor to a previous position from the current position. | -| `Ctrl-.` | `Ctrl->` | `nuclide-navigation-stack:navigate-forwards` | Moves the cursor to the next position from the current, but former, position. | - -## Miscellaneous - -These are other key-based shortcuts that are included with Nuclide, including [Hyperclick](#hyperclick), clipboard -and Nuclide health actions. - -| Key (macOS) | Key (Linux) | Command | Description | -|-----------|-------------|---------|-------------| -| `Option-Cmd-Enter` | `Alt-Ctrl-Enter` | `hyperclick:confirm-cursor` | When using [Hyperclick](#hyperclick), this will confirm the Hyperclick action you want to take. | -| `Ctrl-Option-Shift-H` | `Ctrl-Alt-Shift-H` | `nuclide-health:toggle` | Toggle the Nuclide Health tab, which show details about the Nuclide process itself (how much CPU, memory is being used, etc.). | -| `Ctrl-Option-Shift-X` | `Ctrl-Alt-Shift-X` | `nuclide-clipboard-path:copy-project-relative-path` | Copy the relative path of the current file to the clipboard. | -| `Ctrl-Shift-X` | `Ctrl-Shift-X` | `nuclide-clipboard-path:copy-absolute-path` | Copy the absolute path of the current file to the clipboard. | -| `Ctrl-Option-X` | `Ctrl-Alt-X` | `nuclide-clipboard-path:copy-repository-relative-path` | Copy the relative path of the current file starting at the root of the Mercurial repository. | - -### Hyperclick - -Hyperclick Trigger keys are configurable. - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. - -The Hyperclick Trigger key settings are right at the top and set to the defaults. You can change them by clicking on the selection bar and choosing from the provided list. - -![](/static/images/docs/editor-keyboard-shortcuts-hyperclick.png) diff --git a/docs/_docs/editor/setup.md b/docs/_docs/editor/setup.md deleted file mode 100644 index 3ee789bd1e..0000000000 --- a/docs/_docs/editor/setup.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -pageid: editor-setup -title: Setup -layout: docs -permalink: /docs/editor/setup/ ---- - -There are two supported platforms for Nuclide, [Linux](#linux) and [macOS](#macos). - -> Nuclide can be installed on [Windows](#windows), but it is -> [not fully supported](https://github.com/facebook/nuclide/issues/321). - -These instructions are for installing the released package of Nuclide. For advanced users, you can -[build from source](/docs/advanced-topics/building-from-source), but this is not officially -supported and stability is not guaranteed. - -* TOC -{:toc} - -## Quick Install - -

- -Assuming you have met all the prerequisites for your platform, the easiest way to install Nuclide is within Atom itself: - -1. Open Atom. -2. Choose `Atom | Preferences` (`Edit | Preferences` on Linux and `File | Settings` on Windows) to bring up the **Settings** tab. -3. In the **Settings** tab, select **Install** from the list at the left. -4. In the search box, type "Nuclide" and press the `Enter` key. -5. Click the **Install** button for the `nuclide` package. - -> Installing Nuclide within the Atom Packages UI is the recommended method, however you can install Nuclide from the command-line, if you wish, using: -> -```bash -$ apm install nuclide -``` -> - -Otherwise, see your installation platform below for detailed installation instructions, including -prerequisites. - -## macOS - -### Prerequisites - -

- -You can follow the [instructions on the Atom website](http://flight-manual.atom.io/getting-started/sections/installing-atom/#platform-mac). Essentially, -if you go to [Atom.io](https://atom.io/), there will be direct link to download Atom. - -### Installation - -Install Nuclide through the Atom Packages UI: - -1. Open Atom. -2. Choose `Atom | Preferences` to bring up the **Settings** tab. -3. In the **Settings** tab, select **Install** from the list at the left. -4. In the search box, type "Nuclide" and press the `Enter` key. -5. Click the **Install** button for the `nuclide` package. - -![](/static/images/docs/editor-setup-atom-install-nuclide.png) - -> Installing Nuclide within the Atom Packages UI is the recommended method, however you can install Nuclide from the command-line, if you wish, using: -> -```bash -$ apm install nuclide -``` -> - -## Linux - -### Prerequisites - -

- ->Git is required to install Atom on Linux. - -There are [instructions on the Atom website](http://flight-manual.atom.io/getting-started/sections/installing-atom/#platform-linux) for installing Atom on Linux, but it doesn't mention the Git requirement. - -Instead, follow the command-line process below which shows you the installation of all the -necessary prerequisites, including Git. - -This is an installation on Ubuntu. If you are using an RPM-based distro, you should replace the -`apt-get` commands with the appropriate `rpm` or `yum` commands. Depending on your permissions, you -may need to prefix these commands with `sudo`. - -```bash -$ sudo apt-get update -# optional -$ sudo apt-get upgrade -$ sudo apt-get install git -$ sudo add-apt-repository ppa:webupd8team/atom -$ sudo apt-get update -$ sudo apt-get install atom -# Run atom from the command-line if you want -$ atom -``` - -### Installation - -Install Nuclide through the Atom Packages UI: - -1. Open Atom. -2. Choose `Edit | Preferences` to bring up the **Settings** tab. -3. In the **Settings** tab, select **Install** from the list at the left. -4. In the search box, type "Nuclide" and press the `Enter` key. -5. Click the **Install** button for the `nuclide` package. - -> Installing Nuclide within the Atom Packages UI is the recommended method, however you can install Nuclide from the command-line, if you wish, using: -> -```bash -$ apm install nuclide -``` -> - -## Windows - -### Prerequisites - -Atom can be installed on Windows. - -

- -You can follow the [instructions on the Atom website](http://flight-manual.atom.io/getting-started/sections/installing-atom/#platform-windows). Essentially, -if you go to [Atom.io](https://atom.io/), there will be direct link to download Atom. - ->Some features of Nuclide may work on Windows, but the full Nuclide experience is [not yet supported](https://github.com/facebook/nuclide/issues/321). -> ->[Remote development](/docs/features/remote) functionality (seeing the directory tree, editing remote files, etc.) is generally successful on Windows. If you have [Hack](/docs/languages/hack) or [Flow](/docs/languages/flow) on a remote server, it is possible that you could get some of those language integrations to work as well. -> ->However, local projects may run into issues. - -### Installation - -Install Nuclide through the Atom Packages UI: - -1. Open Atom. -2. Choose `File | Settings` to bring up the **Settings** tab. -3. In the **Settings** tab, select **Install** from the list at the left. -4. In the search box, type "Nuclide" and press the `Enter` key. -5. Click the **Install** button for the `nuclide` package. - -![](/static/images/docs/editor-setup-atom-install-windows.png) - -## Post Installation - -After installation, running Atom will automatically load Nuclide. - -### Recommended Packages - -By default, Nuclide does not install all of the recommended Atom packages that enhance the Nuclide -experience. This was done purposely in order to ensure that users have to opt-in to some features -rather than obtrusively modify their work environment. - -Recommended packages include: - -- [`tool-bar`](https://atom.io/packages/tool-bar) to enable the [Nuclide toolbar](/docs/features/toolbar/). -- [`sort-lines`](https://atom.io/packages/sort-lines) to enable sorting lines of text. -- [`language-ocaml`](https://atom.io/packages/language-ocaml) to enable [OCaml](/docs/languages/other/#ocaml) language syntax highlighting. -- [`language-babel`](https://atom.io/packages/language-babel) to enable language grammar for [JS, Flow and React JS](/docs/languages/flow/), etc. -- ...and [others](https://github.com/facebook/nuclide/blob/master/package.json) under `package-deps`. - -
-In order to install all of the recommended packages: - -1. Go to `Packages | Settings View | Manage Packages`. -2. Search for the `nuclide` package, and click on the package's **Settings** button. -3. Select the **Install Recommended Packages on Startup** checkbox. - -![](/static/images/docs/editor-setup-recommended-packages.png) - -### Installing Nuclide Server - -If you want to use Nuclide for remote development, you'll also need to set up the `npm nuclide` -package. Instructions can be found in the [Remote Development docs](/docs/features/remote/). - -### Other Installations - -To benefit from all of Nuclide's features, we recommend you also install the following: - -* [Watchman](https://facebook.github.io/watchman/) - version 3.2 or above. It must be in `/usr/local/bin/` or in your `$PATH` environment variable. - ->Without Watchman, Nuclide will lose some functionality of its [Mercurial](/docs/features/hg), [Remote Development](/docs/features/remote), and [Quick Open](/docs/quick-start/getting-started/#quick-open) features. - -
- -* [Flow](/docs/languages/flow/) -* [Hack](/docs/languages/hack/) -* [Mercurial](/docs/features/hg/) diff --git a/docs/_docs/editor/uninstall.md b/docs/_docs/editor/uninstall.md deleted file mode 100644 index 32c99b2086..0000000000 --- a/docs/_docs/editor/uninstall.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -pageid: editor-uninstall -title: Uninstalling -layout: docs -permalink: /docs/editor/uninstall/ ---- - -To uninstall Nuclide, you run the Atom package manager uninstall command at the command-line: - -```bash -$ apm uninstall nuclide -``` - -> If you have a version of Nuclide prior to 0.0.35, you will need to follow a -> [different process](/docs/help/troubleshooting#uninstalling-older-versions-of-nuclide) to -> uninstall Nuclide. - -## Re-activate Disabled Core Packages - -Nuclide replaces Atom's `tree-view` package in order to support remote file systems. When -uninstalling Nuclide, you need to re-activate the `tree-view` package yourself. The following are -two ways to do that: - -* Re-activate the `tree-view` package through Atom's Settings page. - - 1. Go to `Atom | Preferences` and select **Packages** from the list at the left. - 2. Scroll down to find the `tree-view` package listed under **Core Packages**, or type "tree-view" into the search box. - 3. Click the **Enable** button. - - ![](/static/images/docs/editor-uninstall-reenable-atom-tree-view.png) - -* Edit your Atom `config.cson` file. - - 1. Open `~/.atom/config.cson`. - 2. Remove "tree-view" from the array of `disabledPackages` and save the file. - - ```coffeescript - "*": - core: - disabledPackages: [ - "tree-view" # REMOVE THIS LINE - ] - ``` diff --git a/docs/_docs/features/buck.md b/docs/_docs/features/buck.md deleted file mode 100644 index f976cf9380..0000000000 --- a/docs/_docs/features/buck.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -pageid: feature-buck -title: Buck -layout: docs -permalink: /docs/features/buck/ ---- - -Nuclide supports many common workflows with the [Buck](https://buckbuild.com/) -build system. See the [Buck website](https://buckbuild.com/setup/getting_started.html) -for instructions on how to install Buck and create a Buck project. - -* TOC -{:toc} - -## Getting Started - -First, open a Buck project (any project with a `.buckconfig` file) as a project -in Nuclide. - -> [Enabling Buck's httpserver interface](https://buckbuild.com/concept/buckconfig.html#httpserver) -> is recommended for better Buck output in Nuclide. - -If you have multiple projects open, or if your Buck project is a subdirectory -of one of your project roots, you'll need to mark the Buck project root as the -*Current Working Root*. You can do this by right-clicking on the root folder -in the file tree and selecting **Set to Current Working Root**. - -There are a few ways to trigger Buck commands from Nuclide: - -### Via the Task Runner - -Buck tasks live in the [Task Runner toolbar](/docs/features/task-runner). - -Click the **Toggle Task Runner Toolbar** button (i.e., the play icon) from the [Nuclide toolbar](/docs/features/toolbar). Alternatively, - go to `Nuclide | Task Runner | Toggle Toolbar Visibility`. - -Choose any of the Buck tasks from the Task Runner toolbar's drop-down menu. - - - -### Via the Nuclide menu - -The top-level Nuclide menu contains a **Buck** submenu. - - - -### Via Atom's Command Palette - -Open the [Command Palette](/docs/editor/basics/#command-palette) (`Cmd-Shift-P` or `Ctrl-Shift-P` on Linux/Windows) -and type "buck" in the text box: - - - -> You can use these commands to add keybindings in Atom's keymap: -> -> ``` -> 'atom-workspace': -> # note: commands are case-sensitive -> 'cmd-b': 'nuclide-task-runner:toggle-buck-toolbar' -> 'f5': 'nuclide-task-runner:buck-build' -> 'f6': 'nuclide-task-runner:buck-test' -> 'shift-cmd-k': 'nuclide-buck:open-nearest-build-file' -> ... -> ``` - -## Workflows - -Nuclide supports Buck workflows matching the corresponding Buck command-line tasks via the [Task Runner toolbar](/docs/features/task-runner). See the [Task Runner Buck guide](/docs/features/task-runner/#buck) for more information on the following Buck workflows: - -- [Build](/docs/features/task-runner/#buck__build) -- [Run](/docs/features/task-runner/#buck__run) -- [Test](/docs/features/task-runner/#buck__test) -- [Debug](/docs/features/task-runner/#buck__debug) diff --git a/docs/_docs/features/context-view.md b/docs/_docs/features/context-view.md deleted file mode 100644 index e6bd5ef241..0000000000 --- a/docs/_docs/features/context-view.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -pageid: feature-context-view -title: Context View -layout: docs -permalink: /docs/features/context-view/ ---- - -Nuclide provides a Context View to easily navigate between symbol's and their definitions in your code. - - - -
- -* TOC -{:toc} - -## Toggling - -To toggle the Context View panel, you can: - -1. Press `Cmd-I` (`Ctrl-I` on Linux). -2. Go to the `Nuclide | Context View | Toggle` menu. -3. Click on the **Toggle Context View** [button](/docs/features/toolbar/#buttons) on the [Nuclide toolbar](/docs/features/toolbar). - -## Definition Preview - -When you click on a symbol in the [Editing Area](/docs/editor/basics/#editing-area), the symbol's definition will be highlighted in the Context View panel. - -![](/static/images/docs/feature-context-view-highlight.png) - -Clicking on the **Open in main editor** button at the bottom of the Context View panel moves the cursor to that definition be it in the current file or a different one. - -> Context View currently supports [Hack](/docs/languages/hack), [Python](/docs/languages/python), [Objective-C](/docs/languages/objective-c/) and [C++](/docs/languages/cpp) files. diff --git a/docs/_docs/features/debugger.md b/docs/_docs/features/debugger.md deleted file mode 100644 index 393baef76d..0000000000 --- a/docs/_docs/features/debugger.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -pageid: feature-debugger -title: Debugger -layout: docs -permalink: /docs/features/debugger/ ---- - -One of the key features of Nuclide is its multiple-language debugging support provided with a debugger interface inspired by the familiar [Chrome DevTools](https://developer.chrome.com/devtools). The Nuclide Debugger provides many capabilities allowing you to have a productive debug loop, including inspection, watches, setting breakpoints, step in/over/out, etc. - -* TOC -{:toc} - -## Instantiation - -Attach to a running debug target via `Cmd-Shift-A` (`Ctrl-Shift-A` on Linux and Windows). You can also -toggle the Debugger through the [Command Palette](/docs/editor/basics/#command-palette) and the -[Nuclide toolbar](/docs/features/toolbar/#buttons)'s **Toggle Debugger** icon. You can also launch a new target with the debugger -attached via `Cmd-F8` (`Ctrl-F8` on Linux and Windows). - -You can also bring up the Debugger panel by choosing `Debugger -> Show` from the Nuclide menu. - -## Basics - -Nuclide supports debugging for multiple [languages](#language-specific-debugging) and -[platforms](#platform-specific-debugging). However, there are some basic debugging concepts that apply across all languages. - -### Debuggable Target - -Specific details are provided for each [language](#language-specific-debugging) or -[platform](#platform-specific-debugging), but in general, to begin debugging code in Nuclide, you -need to either launch a debug process from within Nuclide (e.g., iOS from the Buck toolbar) or -attach to a currently running process for debugging. - -After attaching to the process by clicking **Attach**, you should see the Debugger Controls to the right of the [Editing Area](/docs/editor/basics/#editing-area). - -![](/static/images/docs/feature-debugger-target-attach.png) - -### Breakpoints - -To set a breakpoint in Nuclide, you use the [gutter](/docs/editor/basics#gutter). Click to the left -of each line number in the file(s) in which you want Nuclide to break the running program. Then -as the program is running, if a line on which a breakpoint is set is hit, the program halts, and you -are able to perform debugging tasks such as [step](#basics__stepping) and -[evaluation](#basics__evaluation) from that point. - -> There is currently only one type of breakpoint called a *source breakpoint*. This is a breakpoint -> on one line of code. We are looking into ways to support functional, conditional, and other types -> of breakpoints. - -### Debugger - -The Debugger Controls are the information control center for the Nuclide Debugger. - -In addition to the specialized areas described below, it also provides mouse-clickable execution, -[stepping](#basics__stepping), and breakpoint options. - -***Call Stack*** - -The **Call Stack** area shows you where you came from to get to your current point in the code. The -top function is where you currently are, the function below the top is the one that called the -current function, and so on. Clicking on any function in the call stack will change the scope -information so that it is relevant to that function. - -***Breakpoints*** - -The **Breakpoints** area shows you all the places in your project where you have breakpoints set. If -any are highlighted, that means that you have now hit that breakpoint while running the code. Clicking on a breakpoint in this list will move your cursor to its line of code in the Editing Area. You can deactivate/reactive breakpoints by clicking the checkmark next to each one. Right-clicking in the area will give you the option to quickly remove, enable, or disable all breakpoints at once. - - - -***Unresolved Breakpoints*** - -These are breakpoints that cannot be resolved by the debugger. The most likely cause of an -unresolved breakpoint is putting a breakpoint on code that is not part of the project on which the -debugger process is attached. For some languages, this can also indicate that the program was built without debug symbols (check - your compiler flags!), or that the symbols are missing or do not match the binary being debugged. - -***Scopes*** - -The **Scopes** pane shows you information about variables based upon the current point in the running of the code. Which scopes are visible -depends on the language being debugged. - -***Watch Expressions*** - -The **Watch Expressions** area is for you to keep track of the values of global and local variables. To add a new value to track, enter it in the `add new watch expression` text box. To remove a watched variable, click the `x` icon of the variable you wish to delete. - -***Detaching*** - -You can detach the debugger from the current process by clicking "X" to close the debugger controls pane, or by clicking the "stop" button. -This will stop the entire debugging session for that process, but will not kill the target. - -### Stepping - -It is essential for any debugger to have a mechanism to step into, over, and out of code. The -Nuclide Debugger provides stepping functionality with shortcuts within the Debugger itself and -via the [keyboard](/docs/editor/keyboard-shortcuts/#debugger). - -![](/static/images/docs/feature-debugger-stepping-controls.png) - -### Evaluation - -The Nuclide Debugger supports -[REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) via the **Console** tab. - -When you hit a breakpoint during your debugging session, you can use the Console to write -expressions, call functions, etc. using the current state of the program at the breakpoint. - -> For Hack and PHP debugging, hitting a breakpoint is not necessary to use the REPL support of -> the Nuclide Debugger. If you do not hit a breakpoint, then REPL is run in the global context as -> opposed to the current stack frame if a breakpoint is hit. - -> For LLDB-based debugging, REPL runs LLDB debugger commands as opposed to evaluating code in the -> Debugger. - -*Example* - -Here we have a breakpoint before printing out the sum of the two global variables `num1` and `num2`. -This shows printing out the values of the global and local variables, writing simple expressions, -calling a function in another module (`math.add()`), and inspecting objects. - -![](/static/images/docs/feature-debugger-evaluation-ex.png) - -## Language Specific Debugging - -While the [general process](#basics) for debugging in Nuclide is similar, there are platform and -language specific debugging workflows that require discussion and illustration. - -- [Hack and PHP](/docs/languages/hack/#debugging) -- [C++](/docs/languages/cpp/#debugging) -- [Objective-C](/docs/languages/objective-c/#debugging) - - -## Platform Specific Debugging - -- [iOS](/docs/platforms/ios/#debugging) -- [Android](/docs/platforms/android/#debugging) -- [React Native](/docs/platforms/react-native/#debugging) - -Buck projects can be more easily debugged via the [Task Runner](/docs/features/task-runner/#buck). diff --git a/docs/_docs/features/format-js.md b/docs/_docs/features/format-js.md deleted file mode 100644 index bc688c56bd..0000000000 --- a/docs/_docs/features/format-js.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -pageid: feature-format-js -title: Format JS -layout: docs -permalink: /docs/features/format-js/ ---- - ->[Format-js](https://atom.io/packages/nuclide-format-js) is now available as a separate Atom package for use with Nuclide. However, it is currently experimental. For example, this currently does not handle using relative paths for the automatic requires. - -Format-js is a package with a goal of getting rid of worrying about every little formatting detail you might run across while writing -[Flow](/docs/languages/flow) or [JavaScript](/docs/languages/other/#javascript) code. For more information about the Format-js package visit the [Format-js Atom package page](https://atom.io/packages/nuclide-format-js). - -To install the Format-js package: - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide-format-js`. -3. Click **Install**. - -Currently, Format-js is focused on automatically adding, removing, and formatting, your `require` statements. - -## Auto-Require - -Adding `require` statements automatically allows you to focus on writing code without -worrying about that overhead. For example, if you try to use a variable that has not been declared -elsewhere, we will try to add it as a `require`. - -> This assumes the `require` added is a valid module. Of course, it might not be. -> However, something like the [Flow typechecker](/docs/languages/flow) should tell you when you are -> using `require` on an entity that is not a module. - -Take the following code example: - -![](/static/images/docs/feature-format-js-before.png) - -If you press `Cmd-Shift-I` (`Ctrl-Shift-I` on Linux), your code will be analyzed for types that -you are using in your code that may need to be `require`d. The possible `require`s for your code are then added. - -![](/static/images/docs/feature-format-js-after.png) - -You can then check if these are correct and modify accordingly. For example, maybe instead of -`const`, you want `var`. - -## Settings - -There are customizable settings for the Format-js package. - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide-format-js`. -3. Click on the **Settings** button for the Format-js package. - -![](/static/images/docs/feature-format-js-settings.png) - -You can also enable or disable keybindings in the Format-js settings. - -![](/static/images/docs/feature-format-js-keybindings.png) diff --git a/docs/_docs/features/health.md b/docs/_docs/features/health.md deleted file mode 100644 index ce69d986fb..0000000000 --- a/docs/_docs/features/health.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -pageid: feature-health -title: Health Statistics -layout: docs -permalink: /docs/features/health-statistics/ ---- - -Nuclide uses computing resources. We try to keep the resource usage as low as possible. One of the -features of Nuclide is a health monitor that allows you to track CPU, memory, heap usage and other -statistics. - -![](/static/images/docs/feature-health-overview.png) - -* TOC -{:toc} - -## Toggling - -To open the **Health** tab in the main [Editing Area](/docs/editor/basics/#editing-area), you have four primary -options: - -- The `Ctrl-Option-Shift-H` (macOS) or `Ctrl-Alt-Shift-H` (Linux) keyboard shortcuts -- The [Nuclide toolbar](/docs/features/toolbar) -- The [Command Palette](/docs/editor/basics/#command-palette) - -## Statistics - -The following statistics are shown in the Nuclide health monitor. If you have multiple Nuclide -sessions open, the statistics are per session and not a combination of all sessions. - -- **CPU**: How much CPU Nuclide is using. -- **Memory**: How much memory Nuclide is using. -- **Heap**: How much of the memory heap given to Node by V8 is being used by Nuclide. -- **Key Latency**: How much time between a key press and the event to occur within Nuclide. -- **Handles**: The number of active handles that still exist in Nuclide. -- **Event Loop**: How many pending requests that Nuclide has. - -The last two statistics are reported by the underlying Atom renderer process and indicate how many -processes, handles, and outstanding activities are currently being managed by Node. - -Also shown are the processes that have been spawned by Nuclide since it has been running, including -process ID (PID), bytes received, sent and the number of errors from the process. - -These statistics are provided by Node's [`process`](https://nodejs.org/api/process.html) APIs. diff --git a/docs/_docs/features/hg.md b/docs/_docs/features/hg.md deleted file mode 100644 index 5b24bb77b1..0000000000 --- a/docs/_docs/features/hg.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -pageid: feature-hg -title: Mercurial Support -layout: docs -permalink: /docs/features/hg/ ---- - -Atom provides [Git support](https://atom.io/docs/v1.5.3/using-atom-version-control-in-atom) in its -core packages. Given Facebook's heavy use of Mercurial, Nuclide extends Atom's source control -integration with support for [Mercurial](https://www.mercurial-scm.org/). - -> Nuclide's support for Mercurial is much more full-featured that its support for Git. Nuclide -> has not yet tried to extend the default support for Git provided by Atom. - -
- -* TOC -{:toc} - -## Blame - -Nuclide provides the capability to show you line-by-line -[blame (or annotate)](https://selenic.com/hg/help/annotate) for the current file within your -Mercurial repository. - -*Right-click* in the editor and select `Source Control | Toggle Blame` in the context-aware menu. - -![](/static/images/docs/feature-hg-blame-access.png) - -The [gutter](/docs/editor/basics/#gutter) displays the last commit hash on which there was a change for -the line and the user who made the change. - -![](/static/images/docs/feature-hg-blame-gutter.png) - -## File Tree Highlighting - -To the left of the [Editing Area](/docs/editor/basics/#editing-area) is Nuclide's [Project Explorer](/docs/editor/basics/#project-explorer). The Project Explorer's **File Tree** tab shows you all of the files that are in your project. In a Mercurial project, the File Tree will also show you what files have changed since your last commit. - -If a file is highlighted orange, it indicates a change in that file since your last commit. If a -folder in your project is highlighted orange, that means that files in that folder have changed -since your last commit. Green files or folders are new. Grey files or folders are ignored or -untracked. - -![](/static/images/docs/feature-hg-file-tree-highlight.png) - -## Line Modification Notifications - -This is a built-in Atom feature that displays in the [gutter](/docs/editor/basics/#gutter) showing any lines -that have been modified since the last commit. - ->This feature is not enabled by default. - -To enable this setting: - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-hg-repository`, and select the **Enables `git-diff` and `status-bar` diff stats to display added, changed, or removed lines in the editor gutter and status bar** checkbox. - -![](/static/images/docs/feature-hg-line-mod-gutter-setting.png) - -Then, if a line has been modified, you will see an orange vertical line in the gutter, and if a new line of -content has been added, you will see a green vertical line. - -![](/static/images/docs/feature-hg-line-modifications.png) - -## Added and Removed Lines - -This is a built-in Atom feature that displays in the [status bar](/docs/editor/basics/#status-bar) showing the number of lines that have been added and/or removed since the last commit. - -The **+** value is the number of lines that have been added. The **-** value is the number of lines -that have been removed. - -If you change a line (not added or removed), that counts as both an add and a removal, so you -might see something like "+1, -1" for a one line modification. - -![](/static/images/docs/feature-hg-number-of-line-changes.png) - -## Bookmark - -The [status bar](/docs/editor/basics/#status-bars) also shows the current Mercurial bookmark on -which you are currently working. - -![](/static/images/docs/feature-hg-bookmark.png) diff --git a/docs/_docs/features/outline-view.md b/docs/_docs/features/outline-view.md deleted file mode 100644 index 8bb0b2d924..0000000000 --- a/docs/_docs/features/outline-view.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -pageid: feature-outline-view -title: Outline -layout: docs -permalink: /docs/features/outline-view/ ---- - -Nuclide provides a code outline to allow for quick navigation of a code file. This can be -particularly useful for lengthy files with many classes, functions, methods, etc. - - - -* TOC -{:toc} - -## Toggling - -To toggle the **Outline** panel, you can: - -- Press `Option-O` (`Alt-O` on Linux). -- Go to the `View` menu, and select `Toggle Outline`. -- Click on the **Outline** [button](/docs/features/toolbar/#buttons) within the Nuclide [toolbar](http://nuclide.io/docs/features/toolbar/). -- Use the **Try It** button associated with the **Outline** [Quick Launch](/docs/quick-start/getting-started/#quick-launch-menu) menu in the Nuclide Home tab. - -## Navigation - -Clicking on any entity in Outline will bring you to the line in Nuclide that represents the -beginning of the definition for that entity. For example, clicking on -`function withDestinationPath` in the outline view will bring you to line 44 in the file that -defines that function. - -![](/static/images/docs/feature-outline-view-click.png) - -> Outline currently supports Hack, PHP, Flow, JavaScript, Python, C++ and JSON files. If you -> have Outline opened for a file that is not supported, you will see a message similar to -> *"Outline does not currently support..."* - -## Requirements - -In order for the Outline to work correctly, the following are required for specific languages: - -- **Hack**: The [Hack typechecker](/docs/languages/hack/#installing-hack), `hh_client`. -- **Flow**: The [Flow typechecker](/docs/languages/flow/#installing-flow), `flow`. -- **Python**: A working installation of [Python](https://www.python.org/), `python`. -- **C++**: One of the [compilers necessary for C++ Nuclide support](/docs/languages/cpp/#supported-compilers). diff --git a/docs/_docs/features/quick-open.md b/docs/_docs/features/quick-open.md deleted file mode 100644 index 65fee2b424..0000000000 --- a/docs/_docs/features/quick-open.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -pageid: feature-quick-open -title: Quick Open -layout: docs -permalink: /docs/features/quick-open/ ---- - -Nuclide goes beyond just normal file opening capabilities. Quick Open provides multiple -mechanisms to find a file, from recently opened files to a global OmniSearch that lets you search -for anything a file might contain. - -* TOC -{:toc} - -## Toggling - -There are three ways to toggle the **Quick Open** window. - -- The `Cmd-T` (macOS) or `Ctrl-T` (Linux) keyboard shortcuts -- [Command palette](/docs/editor/basics/#command-palette) searching for -`Nuclide Quick Open: Find Anything Via Omni Search` -- [Quick Launch Menu](/docs/quick-start/getting-started/#quick-launch-menu) - -![](/static/images/docs/feature-quick-open-toggle-window.png) - -> The `Hack Symbols` pane will only show if you have [Hack](/docs/languages/hack) files in your -> project. - -## OmniSearch - -*Keyboard Shortcuts*: `Cmd-T` or `Cmd-P` (`Ctrl-T` or `Ctrl-P` on Linux) - -When launching the **Quick Open** window, you will be taken to the **OmniSearch** tab. All of the -features of the other tabs are coalesced and condensed into your search results in this tab. - -![](/static/images/docs/feature-quick-open-omnisearch.png) - -## Filenames - -*Keyboard Shortcut*: `Option-Cmd-T` (`Alt-Ctrl-T` Linux) - -If you just want to search by filename (including within the path to the file) only, you can click -on the **Filenames** tab in the **Quick Open** window. - -![](/static/images/docs/feature-quick-open-filenames.png) - -## Open Files - -*Keyboard Shortcut*: `Option-Cmd-O` (`Alt-Ctrl-O` Linux) - -If you have a lot of files open in your [editor](/docs/editor/basics), you can use the **Open Files** tab of Quick Open to quickly scan a list of your currently open files. - -![](/static/images/docs/feature-quick-open-open-files.png) - -## Recent Files - -*Keyboard Shortcut*: `Option-Cmd-R` (`Alt-Ctrl-R` Linux) - -If you have recently closed a file and would like to quickly open it back up, you can use the -**Recent Files** tab of Quick Open. This tab also displays when you last opened the file(s). - -![](/static/images/docs/feature-quick-open-toggle-recent-files.png) - -## Hack Symbols - -*Keyboard Shortcut*: `Option-Cmd-Y` (`Alt-Ctrl-Y` Linux) - -If your project contains [Hack](/docs/languages/hack) code, you will get Hack language-specific -search options. Here you can search based on function (`@function-name`), class (`#class-name`), or -constant (`%constant-name`) symbols in your project. - -To access this feature, click on the **Hack Symbols** tab in the **Quick Open** window. - -![](/static/images/docs/feature-quick-open-toggle-hack-symbols.png) - -## Code Search - -*Keyboard Shortcut*: `Option-Cmd-K` (`Alt-Ctrl-K` Linux) - -The Code Search tab will help you find a piece of code within all the source files in your projects. -Internally it uses either [ripgrep](https://github.com/BurntSushi/ripgrep) (rg), -[silversearcher](https://github.com/ggreer/the_silver_searcher) (ag) or -[ack](https://beyondgrep.com/). - -By default, Nuclide will use any available tool in your PATH. -However, you can specify a default one in the *nuclide-code-search* tab in the Nuclide package -settings. We recommend ripgrep and ag because they are blazing fast. Sadly, only ripgrep works -properly on Windows. - -![](/static/images/blog/2017-08-31/quick-open.png) diff --git a/docs/_docs/features/remote.md b/docs/_docs/features/remote.md deleted file mode 100644 index 7480c168b3..0000000000 --- a/docs/_docs/features/remote.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -pageid: feature-remote -title: Remote Development -layout: docs -permalink: /docs/features/remote/ ---- - -In addition to local development, Nuclide supports remote development. Using one of -three authentication methods (Password, an SSH agent, or a private key), you can connect to a -project on a remote machine. This project is then added to your Project Explorer's [File Tree](/docs/editor/basics/#project-explorer) as a remote project where development occurs just like it would with a local project. - -* TOC -{:toc} - -## Nuclide Server - -Nuclide has two main components, the client and the optional server. The client is -[set up via an Atom `apm` package](/docs/editor/setup/) on your local machine. The -[server](#nuclide-server__setup) is set up via a Node `npm` package on any machine where you have -remote projects to which Nuclide will connect. - -### Prerequisites - -The remote machine must meet certain prerequisites before the -[remote Nuclide server](#nuclide-server__setup) can be installed. - -- [Python](https://www.python.org/) 2.7 or later. In many cases, this will already be installed by -default on your OS distribution. -
-- `node` and `npm` must be in your `$PATH` environment variable. -- [Watchman](https://facebook.github.io/watchman). The Nuclide server -requires Watchman to detect file and directory changes. Follow the Watchman -[build or install instructions](http://facebook.github.io/watchman/docs/install.html#build-install) -for your server's platform. -- SSH Daemon - The Nuclide client connects to the server via SSH, so ensure that the server exposes -an SSH daemon that you can connect to from your client machine and that you know the required credentials. You will need to have an existing private key that can be used to connect to the server. -- Port 9090-9093 exposed. *Note:* you can specify another port in the **Remote Server Command** box in -the [Connection Dialog box](#remote-connection__connection-dialog-box). - -### Setup - -The Nuclide server is installed through an [`npm` package](https://www.npmjs.com/package/nuclide) in -the Node Package Manager. - -```bash -npm install -g nuclide -``` - -> The `-g` switch to ensures Nuclide is installed as a Node global package. - -> While both the client and server packages are named `nuclide`, the `apm` package is the client -> and the `npm` package is the server. - -You do not need to explicitly start the server since the Nuclide client will attempt to do so when -it first connects through one of three authentication methods. - -## Remote Connection - -There are two ways to connect to a project on your remote server. - -If you do not have any projects currently open in Nuclide, you can click on the -**Add Remote Project Folder** button in the Project Explorer's [File Tree](/docs/editor/basics/#project-explorer). - -![](/static/images/docs/feature-remote-add-remote-project-file-tree.png) - -If you have a project already open, you can use `Nuclide | Remote Projects | Connect Remote Project...`, the `Ctrl-Shift-Cmd-C` keyboard shortcut (Mac only), or *right-click* in the Project Explorer's [File Tree](/docs/editor/basics/#project-explorer) and select **Add Remote Project Folder**. - - - -You can also go to the Nuclide Home page, and click the **Try it** button for **Remote Connection** in the [Quick Launch Menu](/docs/editor/getting-started/#quick-launch-menu). - -### Connection Dialog Box - -All the required information to connect to the remote Nuclide server is entered in the Connection -Dialog box. - -![](/static/images/docs/feature-remote-connect-dialog-box.png) - -> All of the values shown above are examples and will vary based on your own username, filesystem, -and SSH and Nuclide configuration. - -The options are as follows: - -- **Username** - the username that you use to connect to your server. -- **Server** - the address of your server. This can be a domain name based or IP address. -- **Initial Directory** - the path on your remote server that contains the project you want to open. -- **SSH Port** - the port used to connect to your server (default is 22). -- **Use ssh-agent-based authentication** - causes the server to try and talk to the ssh agent. -- **Password** - your server password, if you wish to use password authentication. -- **Private Key** - the local path to your private SSH key for this server (*Note:* If your key is -password protected you have to add it to the ssh-agent and use the ssh-agent-based authentication -option). -- **Remote Server Command** - if you have correctly [installed](#nuclide-server__setup) the -[Nuclide server](#nuclide-server), this will be `nuclide-start-server`. If not, you need to -supply the full path to the location of the script. You can either let the script pick an open port -for you from a list of predefined ports, or start the server on a specific port using the -`--port` flag. For example, in this box, you could type `nuclide-start-server --port 9099` (or -similar). - -> Only one of the three authentication options can be chosen and used. - -After supplying these options, click **Connect**. - -### Profiles - -In order to reduce the tediousness of having to specify the same connection information over and -over for machines you connect to frequently, you can use profiles. - -![](/static/images/docs/feature-remote-profiles.png) - -To create a profile, click the **+** button under the **Profiles** list on the left side of the [Connection Dialog box](#remote-connection__connection-dialog-box). - -![](/static/images/docs/feature-remote-add-profile.png) - -Any pre-filled information will be based on your *(default)* profile. Enter all of your connection -information for the new profile (similar to that in the -[Connection Dialog box](#remote-connection__connection-dialog-box)), then click **Save**. - -> `(DEFAULT)` in the **Remote Server Command** box is the default command for the Nuclide server, which -> is `nuclide-start-server`. - -## Development - -Once you have established a [remote connection](#remote-connection) and the Nuclide server is -initiated, the root folder of the project will be added to the Project Explorer's [File Tree](/docs/editor/basics/#project-explorer), underneath any other local (or other -remote) projects you currently have open. - -![](/static/images/docs/feature-remote-file-tree.png) - -Nuclide has now established a connection between your local client and the remote server, and -development can take place as normal. - -> Changes made to a remote file in Nuclide is reflected on the remote machine; changes made in the -> project on the remote server is reflected in your remote project file tree within Nuclide. diff --git a/docs/_docs/features/task-runner.md b/docs/_docs/features/task-runner.md deleted file mode 100644 index b03f732e0c..0000000000 --- a/docs/_docs/features/task-runner.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -pageid: feature-task-runner -title: Task Runner -layout: docs -permalink: /docs/features/task-runner/ ---- - -Nuclide provides the Task Runner toolbar for building, running, testing, and debugging projects. - - -* TOC -{:toc} - -## Buck - -Nuclide supports the [Build](#build), [Run](#run), [Test](#test), and [Debug](#debug) workflows for [Buck](/docs/features/buck), matching the corresponding Buck command-line tasks. - ->Your project must contain a `.buckconfig` file for the Buck tasks to be available in the Task Runner. - -Click the **Toggle Task Runner Toolbar** button on the [Nuclide toolbar](/docs/features/toolbar/#buttons) to display options for building, running, testing, and debugging your Buck project. - -### Build - -The Build task invokes [`buck build`](https://buckbuild.com/command/build.html), -displaying build output in the [Console](/docs/features/debugger/#basics__evaluation) below the [Editing Area](/docs/editor/basics/#editing-area). - -In the Task Runner toolbar's text box, type in the name of the build target exactly -as you would specify on the command-line, i.e., `//path/to/dir:target_name#flavor`. - ->The usual leading `//` is optional. - -![](/static/images/docs/feature-task-runner-buck-build.png) - -Clicking on the **Settings** button (i.e., the gear icon) opens a dialog where you can provide extra flags to Buck. - - - -Upon clicking the **Build** button (i.e., the crossed tools icon), build progress displays via a blue progress bar below the toolbar and also periodically via messages in the [Console](/docs/features/debugger/#basics__evaluation). - -Click the **Stop** button (i.e., the square icon) at any time to cancel an ongoing build. - -![](/static/images/docs/feature-task-runer-buck-build-console.png) - -C++ compilation errors will appear in both the [Console](/docs/features/debugger/#basics__evaluation) and the [Diagnostics Table](/docs/editor/basics/#code-diagnostics). Buck diagnostics are cleared upon triggering a new build. - -![](/static/images/docs/feature-task-runner-buck-build-diagnostics.png) - -### Run - -The Run task is only enabled for iOS and Android application targets ([`apple_bundle`](https://buckbuild.com/rule/android_binary.html), [`android_binary`](https://buckbuild.com/rule/android_binary.html), and [`apk_genrule`](https://buckbuild.com/rule/apk_genrule.html) rules). It invokes [`buck install --run`](https://buckbuild.com/command/install.html) and builds, installs, then runs the app. Build output will be reported as documented in the [Build workflow](#build) section above. - -![](/static/images/docs/feature-task-runner-buck-run.png) - -The iOS simulator type can be explicitly selected via the drop-down menu to the right of the toolbar's **Settings** button (i.e., the gear icon). - -### Test - -![](/static/images/docs/feature-task-runner-buck-test.png) - -The Test task invokes [`buck test`](https://buckbuild.com/command/test.html), building and running valid test targets (e.g., `cxx_test`). -Build output will be reported as documented in the [Build workflow](#build) section above. - -### Debug - -![](/static/images/docs/feature-task-runner-buck-debug.png) - -The Debug task is only enabled for the following target types: - -- iOS applications (`apple_bundle`) -- C++ unit tests (`cxx_test`) -- C++ binaries (`cxx_binary`) - -The [LLDB debugger](/docs/languages/cpp/#debugging) is invoked after a successful build in all three cases, but with slight variations. - -*iOS Applications* - -For iOS applications, the Debug task invokes [`buck install --run --wait-for-debugger`](https://buckbuild.com/command/install.html), then attaches LLDB to the simulator process once the app starts. - -As with the Run task, the iOS simulator type can be selected from the drop-down menu to the right of the toolbar's **Settings** button (i.e., the gear icon). - -*C++ unit tests* - -For C++ unit tests, LLDB is launched against the unit test binary with the `args` and `env` parameters [specified by the `cxx_test` target](https://buckbuild.com/rule/cxx_test.html) after a successful `buck build`. - -*C++ binaries* - -For C++ binaries, LLDB is launched directly against the output binary after a successful `buck build`. Extra launch arguments can be specified using the **Settings** button (i.e., the gear icon). - -## Swift - -The Task Runner toolbar can build [Swift](/docs/languages/swift) packages and run their tests. - ->Your project must contain a `Package.swift` file for the Swift tasks to be available in the Task Runner. - -Click the **Toggle Task Runner Toolbar** button on the [Nuclide toolbar](/docs/features/toolbar/#buttons) to display options for building or testing a Swift package. - -### Building a Swift package - - - -Enter the path to a Swift package's root directory, then click the **Build** button (i.e., the crossed tools icon) to build the package. (This path is not needed if your project's working root contains a Swift package.) Build output is displayed in the [Console](/docs/features/debugger/#basics__evaluation) below the [Editing Area](/docs/editor/basics/#editing-area). - -![](/static/images/docs/feature-task-runner-swift-build-output.png) - -You can customize build settings, such as whether to build the package in a *Debug* or *Release* configuration, by clicking the **Settings** button (i.e., the gear icon) to the right of the toolbar's text box. - -![](/static/images/docs/feature-task-runner-swift-build-settings.png) - -### Running a Swift package's tests - - - -Enter the path to a Swift package's root directory, then click the **Test** button (i.e., the checkmark icon) to run the package's tests. (This path is not needed if your project's working root contains a Swift package.) Test output is displayed in the [Console](/docs/features/debugger/#basics__evaluation) below the [Editing Area](/docs/editor/basics/#editing-area). - -![](/static/images/docs/feature-task-runner-swift-test-output.png) - -Clicking the **Settings** button (i.e., the gear icon) to the right of the toolbar's text box displays additional settings for running your Swift package's tests. - -## HHVM Debug Toolbar - -Nuclide provides an HHVM toolbar in the Task Runner for debugging [Hack](/docs/languages/hack) projects. You can launch the toolbar by clicking the **Toggle Task Runner Toolbar** button in the [Nuclide toolbar](/docs/features/toolbar/#buttons). - -![](/static/images/docs/feature-task-runner-hack-toolbar.png) - -> You must have a Hack or PHP file open to successfully launch the toolbar. - -You can choose either **Attach to WebServer** or **Launch Script** from the drop-down menu. If you select **Attach to WebServer**, the text box will fill automatically with the server to which you are connected. If you select **Launch Script**, the text box will fill automatically with the path of the open file. - - - -Set [breakpoints](/docs/features/debugger/#basics__breakpoints) in your code. - -Click the **Debug** button (i.e., the bug icon) to open the Debugger; it will stop at the first breakpoint. - -You can then follow the [basic Debugger information](/docs/features/debugger/#basics) and use the additional features of the [Console](/docs/languages/hack/#debugging__console), [Evaluation](/docs/languages/hack/#debugging__evaluation), [Filtering](/docs/languages/hack/#debugging__filtering) and [other HHVM-specific debugging settings]( /docs/languages/hack/#debugging__other-settings) to debug your code. - -![](/static/images/docs/feature-task-runner-hhvm-debug.png) - -In both the script and server launching/attaching scenarios, the line at which you've set a -breakpoint will highlight in blue when the breakpoint is hit. When this happens, execution of your -code is paused and you can use the Debugger Controls to step, evaluate expressions, inspect the current -call stack, etc. diff --git a/docs/_docs/features/terminal.md b/docs/_docs/features/terminal.md deleted file mode 100644 index 1f65143365..0000000000 --- a/docs/_docs/features/terminal.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -pageid: feature-terminal -title: Integrated Terminal -layout: docs -permalink: /docs/features/terminal/ ---- - -Nuclide includes support for a terminal via the excellent [xterm.js](https://github.com/xtermjs/xterm.js). It uses Nuclide's remote connection to give command-line access to project directories. Here are some notes regarding common customization issues. - -* TOC -{:toc} - -# Getting Started - -To open a new terminal window, right-click on a folder or file in the file tree and choose 'New Terminal Here'. - -You can also open a terminal by running the command `atom-ide-terminal:new-terminal` from the command-palette or via a key-binding. For example, here is a keymap.cson (menu command Atom/Keymaps) you can use to bind `ctrl-t` to create a new terminal: - -``` -'atom-text-editor': - 'ctrl-t': 'atom-ide-terminal:new-terminal' -``` -By default, this command is bound to `ctrl-shift-t` on macOS and `alt-shift-t` on Windows and Linux. - -# Copy/Paste - -Copy and Paste work in terminal from the menu commands Edit/Copy and Edit/Paste. On OS X, these commands are bound by default to Cmd-C and Cmd-V respectively, similar to editor windows in Nuclide. On Windows, these commands are bound to right-click with and without selection like Quick-Edit mode in cmd.exe. - -Some programs (e.g. emacs, tmux, vim) running in a terminal enable mouse support. This requests that the terminal forward mouse events to the program, and by default this prevents the local terminal from selecting text for copy. On a mac it is possible to temporarily override this by holding `option`/`alt` while selecting the text you want to copy. - -# Key Repeat on OS X - -OS X introduced a keyboard feature similar to iOS that affects Atom, where holding down a key offers diacritical options rather than repeating the ASCII character. If you prefer to have keys repeat in Atom/Nuclide, run the following command: - -``` -defaults write com.github.atom ApplePressAndHoldEnabled -bool false -``` - -(from [this gist](https://gist.github.com/rastasheep/bfc8266eeb58b899054c)) - -# Custom Shell - -By default, Nuclide terminal starts a new shell by running `/bin/bash --login -i`. You can customize this behavior by adding a file `$HOME/.nuclide-terminal.json` **on the machine where the shell process runs**. Here is an example you can use on OSX to start the version of bash from MacPorts: - -``` -{ - "command": [ - "/opt/local/bin/bash", - "--login" - ] -} -``` - -# Detecting Nuclide Terminal - -Nuclide terminal binds an environment variable `$TERM_PROGRAM` to the value 'nuclide'. This allows you to add special-cases to your `~/.bash_profile`, `~/.bashrc`, or similar startup script: - -``` -if [[ "$TERM_PROGRAM" == "nuclide" ]]; then - # Run Nuclide-terminal-specific initialization -else - # Run initialization for terminals other than in Nuclide -fi -``` - -For instance, if you want to use Nuclide as your editor if you've opened a terminal from within nuclide - -``` -if [[ "$TERM_PROGRAM" == "nuclide" ]]; then - export EDITOR='atom --wait' -else - export EDITOR=emacs # your favorite editor here -fi -``` - -# Scrollback - -Go to Atom > Preferences > Packages > Nuclide, expand `atom-ide-terminal`, and there is a setting there. Note that xterm.js does an eager memory allocation proportional to the size of the number here, so there is no 'unlimited' value. - -# Preserved Commands - -When you are using a terminal window, you might want a key binding to go to Atom/Nuclide rather than to the terminal. The commands bound to these keys are called 'Preserved Commands'. To add a preserved command, go to Atom > Preferences > Packages > Nuclide, expand `atom-ide-terminal`, and add the command to the list under 'Preserved Commands'. - -If you do not already know the name of the command, you can use 'key-binding-resolver:toggle' (cmd-. on mac) in a context where the command works, like another editor window, and type the key you want. The pane at the bottom of the screen will show you what you pressed and the command(s) for that key binding. - -# Setting the Title - -You can set the title of a nuclide terminal tab with an escape sequence. In `bash`, you can do the following: - -``` -echo -ne "\033]0;The Title\007" -``` - -This will set the terminal tab's title to "The Title". - -Similarly, if you wanted to have the terminal tab to always display the current directory name, in `bash` you could do something like: - -``` -PS1='\e]0;\W\a\$ ' -``` - -Tabs in Atom also have a 'path' property. E.g. you can right click a tab and `Copy Full Path`. Normally the path of a terminal tab is the original directory where the terminal was opened (e.g. right-click a file/directory and `New Terminal Here`). If you use a prompt hack like the one above and want the 'path' property to match the tile, you can set a property in `~/.nuclide-terminal.json` to make this happen: - -``` -{ - "useTitleAsPath": true -} -``` - -# Clearing the Screen - -Some terminal emulators bind `cmd-k` to clear the screen. Unfortunately, this key combination is used already for splitting windows in Atom. To avoid conflicting keybindings, we don't automatically bind this, but in your Atom > Keymap..., you can bind the command `atom-ide-terminal:clear` to get this functionality. - -Note that just binding `atom-ide-terminal:clear` to `cmd-k` will result in conflicting bindings, which manifests as needing to hit `cmd-k` twice to get it to work. To fix this, you need to unbind all commands that use `cmd-k` as a prefix. Here are the settings to put in Atom > Keymap... to get this working: - -``` -'.terminal-pane': - 'cmd-k alt-cmd-w': 'unset!' - 'cmd-k cmd-b': 'unset!' - 'cmd-k cmd-down': 'unset!' - 'cmd-k cmd-left': 'unset!' - 'cmd-k cmd-n': 'unset!' - 'cmd-k cmd-p': 'unset!' - 'cmd-k cmd-right': 'unset!' - 'cmd-k cmd-up': 'unset!' - 'cmd-k cmd-w': 'unset!' - 'cmd-k down': 'unset!' - 'cmd-k left': 'unset!' - 'cmd-k right': 'unset!' - 'cmd-k up': 'unset!' - 'cmd-k': 'atom-ide-terminal:clear' -``` - -# Binding Meta Keys - -Many terminal programs interpret `ESC`+//key// to mean `Meta`+//key//. Nuclide terminal supports a command `atom-ide-terminal:add-escape-prefix` for this scenario. When you bind a key combination to this command, the terminal sends `ESC` followed by the key with modifiers removed. - -Here is an example keymap.cson (Under the menu: Atom > Keymap...) that enables the `Command` key as `Meta` for several combinations: - -``` -'.terminal-pane': - 'cmd-b b': 'unset!' - 'cmd-b t': 'unset!' - 'cmd-b r': 'unset!' - 'cmd-b d': 'unset!' - 'cmd-b s': 'unset!' - - 'cmd-a': 'atom-ide-terminal:add-escape-prefix' - 'cmd-b': 'atom-ide-terminal:add-escape-prefix' - 'cmd-c': 'atom-ide-terminal:add-escape-prefix' - 'cmd-d': 'atom-ide-terminal:add-escape-prefix' - 'cmd-e': 'atom-ide-terminal:add-escape-prefix' - 'cmd-f': 'atom-ide-terminal:add-escape-prefix' - 'cmd-g': 'atom-ide-terminal:add-escape-prefix' - 'cmd-m': 'atom-ide-terminal:add-escape-prefix' - 'cmd-p': 'atom-ide-terminal:add-escape-prefix' - 'cmd-q': 'atom-ide-terminal:add-escape-prefix' - 'cmd-r': 'atom-ide-terminal:add-escape-prefix' - 'cmd-v': 'atom-ide-terminal:add-escape-prefix' - 'cmd-w': 'atom-ide-terminal:add-escape-prefix' - 'cmd-x': 'atom-ide-terminal:add-escape-prefix' - 'cmd-y': 'atom-ide-terminal:add-escape-prefix' - 'cmd-z': 'atom-ide-terminal:add-escape-prefix' - 'cmd-.': 'atom-ide-terminal:add-escape-prefix' - 'cmd-/': 'atom-ide-terminal:add-escape-prefix' - 'cmd-\\': 'atom-ide-terminal:add-escape-prefix' -``` - -Note that `cmd-b` is a prefix for several commands, all of which must be unbound to make `cmd-b` work as a standalone key binding. - -You can achieve a similar effect for the `Option` key by using `alt` instead of `cmd` in these key bindings. diff --git a/docs/_docs/features/toolbar.md b/docs/_docs/features/toolbar.md deleted file mode 100644 index d9b31a235d..0000000000 --- a/docs/_docs/features/toolbar.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -pageid: feature-toolbar -title: Toolbar -layout: docs -permalink: /docs/features/toolbar/ ---- - -Nuclide customizes the [tool-bar community Atom package](https://atom.io/packages/tool-bar) for its -specific use. The Nuclide Toolbar provides quick launch access to many common features including -the [Debugger](), Diagnostics, etc. - -By default, the Nuclide Toolbar is not installed. - -> Internally to Facebook the Toolbar is installed, by default. However, at this point, we did not -> want to presume to install other community packages without the user opting in. - -
- -* TOC -{:toc} - -## Installing - -The Nuclide Toolbar can be installed as part of installing the -[recommended packages](/docs/editor/setup/#post-installation__recommended-packages) through the -Nuclide package settings or it can be installed separately through the normal Atom package -installation process. - -### Singular package - -If you would prefer not to have all of the recommended Nuclide packages installed, you can install -the Toolbar separately. - -1. Go to `Packages | Settings View | Install Packages/Themes`. -2. In the `Search packages` text box, type "tool-bar".

-![](/static/images/docs/feature-toolbar-find-package.png) - -3. Click the **Install** button for the `tool-bar` package. - -The Toolbar will be added to your Nuclide environment (normally either at the top or along the left side of your Atom window). - -### Toggling - -You can toggle the Nuclide Toolbar either through `Packages | Tool Bar | Toggle` or by pressing `Cmd-Option-T` -(`Ctrl-Alt-T` on Linux). - -## Buttons - -The Nuclide Toolbar has buttons that, when clicked, take you to a specific feature of Nuclide. - -| ![](/static/images/docs/feature-toolbar-button-diagnostics.png) | Toggle [Diagnostics](/docs/editor/basics/#status-bar__code-diagnostics) Table | -| ![](/static/images/docs/feature-toolbar-button-outline-view.png) | Toggle [Outline View](/docs/features/outline-view/) | -| | Toggle [Context View](/docs/features/context-view) | -| | Toggle [Task Runner Toolbar](/docs/features/task-runner) | -| | Toggle [Debugger](/docs/features/debugger/) | -| ![](/static/images/docs/feature-toolbar-button-test-runner.png) | Toggle Test Runner | -| | Toggle [Console](/docs/features/debugger/#basics__evaluation) | -| | Toggle [Distraction-Free Mode](/docs/editor/basics/#distraction-free-mode) | -| ![](/static/images/docs/feature-toolbar-button-nuclide-settings.png) | Open [Nuclide Settings](/docs/editor/basics/#preferences-pane) | -| ![](/static/images/docs/feature-toolbar-button-nuclide-health.png) | Toggle [Nuclide health stats](/docs/features/health-statistics/) | - - -## Uninstalling - -You can uninstall the Nuclide Toolbar by following the normal Atom package uninstall mechanism. - -1. Go to `Packages | Settings View | Update Packages/Themes`. -2. Click the **Uninstall** button under the `tool-bar` package. - -> If you [uninstall Nuclide](/docs/editor/uninstall/), the `tool-bar` package is *not* uninstalled. diff --git a/docs/_docs/features/working-sets.md b/docs/_docs/features/working-sets.md deleted file mode 100644 index 3df01c5e2f..0000000000 --- a/docs/_docs/features/working-sets.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -pageid: feature-working-sets -title: Working Sets -layout: docs -permalink: /docs/features/working-sets/ ---- - -It can be common to have a -[large project](/docs/editor/basics/#project-explorer__adding-projects) with a root folder -that has a bunch of children folders and files underneath it. However, your work in that project may only exist in one or a few of the files within the project. The rest of the files are just noise in the [File Tree](/docs/editor/basics/#project-explorer). - -Working Sets allow you to select a subset of folders or files in your project that you -are interested in, hiding all of the other folders and files to display a sparser File Tree. - -* TOC -{:toc} - -## Defining Working Sets - -To define a Working Set, go to the upper right corner of the [Project Explorer](/docs/editor/basics/#project-explorer). As -you move your mouse there, you will see a **+** button appear. - -![](/static/images/docs/feature-working-set-begin.png) - -Clicking on the **+** button toggles the File Tree to allow for selecting folders and files to add to the Working Set you are currently creating. - -After selecting all the folders and files that you want, enter a name for the Working Set in the text box next to the checkmark. - -![](/static/images/docs/feature-working-set-add.png) - -> Click on the **-** button to cancel the creation of the Working Set. - -Once you create the Working Set you will see the File Tree reduced to only those files and folders -that you selected. - -![](/static/images/docs/feature-working-set-created.png) - -You can create as many Working Sets as you like. Just click on the **+** button again. Every time you -create a new Working Set, you will see the entirety of the project tree again for choosing files -and folders. - -> Files and folders can overlap in Working Sets. This might be useful when -> [toggling Working Sets](#toggling-working-sets). - -## Toggling Working Sets - -By default, all Working Sets are active as you create them. This means all of the files and folders -for every Working Set is shown combined in the File Tree. - -Here is an example of three Working Sets shown. - -![](/static/images/docs/feature-working-set-all-working-sets.png) - -However, you can toggle which Working Sets are active. - -![](/static/images/docs/feature-working-set-select-active.png) - -> You can also press `Ctrl-S` or go to `Nuclide | Working Sets | Select Active` to choose your -> active Working Sets. - -To deactivate a Working Set, click on its name. You will see the check mark -disappear, and the folders and files of that Working Set will be removed from the File Tree. - -![](/static/images/docs/feature-working-set-deactivate.png) - -> Pressing `Ctrl-Shift-S` or going to `Nuclide | Working Sets | Toggle Last Selected` will allow -> you to toggle between the full project tree and the currently active Working Set(s). - -## Editing Working Sets - -You can also edit and delete Working Sets. - -![](/static/images/docs/feature-working-set-edit.png) - -By clicking on the trash can, the Working Set is deleted, and if active, the files and folders of -that Working Set will be removed from the File Tree. - -> If a folder or file is part of another active Working Set, then it will remain in the File Tree. - -By clicking on the pencil, you can add or remove folders and files from that Working Set. You can rename the Working Set as well. - -## Opening Non-Working Set Files - -You can open files that do not belong to a Working Set. If, for example, you use -[Quick Open](/docs/features/quick-open) to open a file that is not part of a Working Set, then that file and its parent folders -will be shown *grayed out* in the File Tree. - -![](/static/images/docs/feature-working-set-not-working-set-file.png) - -> If you close the non-Working Set file, it will be removed from the File Tree. diff --git a/docs/_docs/help/faq.md b/docs/_docs/help/faq.md deleted file mode 100644 index 0e325910b4..0000000000 --- a/docs/_docs/help/faq.md +++ /dev/null @@ -1,227 +0,0 @@ ---- -pageid: help-faq -title: FAQ -layout: docs -permalink: /docs/help/faq/ ---- - -Here is an ever-growing list of frequently asked questions around Nuclide. - -* TOC -{:toc} - -## How do I open Nuclide? - -After ensuring you have Nuclide [set up](/docs/editor/setup/), see the [Opening](/docs/editor/basics/#opening) section in Nuclide [Basics](/docs/editor/basics/) for instructions. - -## What version of Nuclide is installed? - -You can determine the installed version of Nuclide with the [Atom Package Manager](https://github.com/atom/apm) (APM) from the command-line. - -```bash -$ apm list --no-dev --installed -``` - -The output will contain installed Atom packages and their versions. - -```bash -/Users/foobar/.atom/packages (1) -└── nuclide@X.Y.Z -``` - -Your installed version is the number following either the `nuclide` package or the first package -starting with `nuclide-`. In the example above, the installed version is `X.Y.Z`. - -

- -## How do I migrate from a pre-unified package version of Nuclide? - -If you previously installed Nuclide via the `nuclide-installer` package or by installing `nuclide-` -packages individually, you should uninstall them first. - -The new `nuclide` package will automatically disable any deprecated `nuclide-*` packages and warn -you on start up that you should uninstall them to ensure everything works as expected. - -Features you may have been familiar with as separate packages before, such as Hyperclick, -Diagnostics, and File Tree, are now listed as features in Nuclide's Settings page and are togglable -as if they were Atom packages. If you want to use only one or a few of the features of Nuclide, you -can disable the rest of Nuclide without incurring any load time for the disabled features' code. All -features are enabled by default. - - - -### Migrating settings from previous packages - -If you changed settings in any of Nuclide's previous packages, the settings will be automatically -migrated to their new location in the `nuclide.` namespace when you first launch Atom after -installing the `nuclide` package. The settings will be configurable like before but under the -Atom Settings rather than under the package's name. - -## How do I return Nuclide to a known state? - -To reset Atom and Nuclide to factory settings, removing all your packages and settings, do the following: - -1. Quit Atom. -2. Reinstall Atom.app. -3. Reset Atom's settings (optional, but recommended). - - > This will delay any custom settings and packages. - - On your machine, run: - - rm -rf ~/.atom - -4. Reset Atom's cache (optional, but recommended). - On your machine, run: - - rm -rf ~/Library/Application\ Support/Atom - -5. Kill the Nuclide Server (if you have one). - If you are running the Nuclide Server on a remote machine, SSH into it and run: - - pkill -f nuclide - -6. Reinstall Nuclide. - -## How can I make Nuclide like my favorite editor? - -Because Nuclide is a package on top of Atom, it is infinitely configurable with a massive collection of open source packages. If you want Atom to behave more like your favorite editor, try one of these: - -* Vim - * [vim-mode-plus](https://atom.io/packages/vim-mode-plus) - * [ex-mode](https://atom.io/packages/ex-mode) -* Emacs - * [emacs-plus](https://atom.io/packages/emacs-plus) - -## Can I write a script to automate basic Atom/Nuclide functionality? - -Atom provides a customizable `init.coffee` script that has full access to the Atom APIs and is executed at startup. For more information, see [Hacking Atom - The Init File](http://flight-manual.atom.io/hacking-atom/sections/the-init-file/). - -You can access the `init.coffee` script by going to `Atom | Init Script...`. - -It's easy to create your own commands with keybindings (you can also configure keybindings in a separate file, see [Keymaps In-Depth](http://flight-manual.atom.io/behind-atom/sections/keymaps-in-depth/)). - ->You have to reload Atom to test your changes. - -## Can the Nuclide Server use ports other than 9090-9093? - -With Nuclide's default server configuration you may run into port number conflicts on your remote server. To specify a specific port for the server to use, you can provide the `--port` option along with the remote server command. - -## Can I print from Nuclide? - -Unfortunately, this is not currently available as an option in Atom and doesn't appear to be something they will be adding. For more information, see [https://discuss.atom.io/t/printing-support/760/45](https://discuss.atom.io/t/printing-support/760/45). - -## How can I make the File Tree always automatically scroll to the current active file? - -1. Open the **Settings** tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-file-tree`. -5. Select the **Reveal File on Switch** checkbox. - - - -## How can I jump to the last cursor position in a file? - -Assume you performed an action that caused the cursor to jump to a new position. How do you go back? - -Use the Nuclide Navigation Stack commands: - -- Forward navigation: `Ctrl-,` (`Ctrl-<` on Linux and Windows) -- Backward navigation: `Ctrl-.` (`Ctrl->` on Linux and Windows) - -## Is there a way to search only files in the Working Set? - -Unfortunately, no. The external search tools Nuclide uses are not aware of the Working Sets. Nuclide also provides the external search tools with the upper limit on result set size preventing purely client-side filtering. - -## How do I disable Most Recently Used tab switching? - -Atom 1.7.0 introduced Most Recently Used (MRU) tab switching. To revert to the old behavior: - -1. Go to `Atom | Keymap...`. This will open the `keympa.cson` file. -2. Add - - 'body': - 'ctrl-tab': 'pane:show-next-item' - 'ctrl-tab ^ctrl': 'unset!' - 'ctrl-shift-tab': 'pane:show-previous-item' - 'ctrl-shift-tab ^ctrl': 'unset!' - -## Can Nuclide save the tabs I have open for each branch/bookmark? - -Yes, Nuclide's Bookshelf feature can save the tabs you have open for each branch/bookmark. When you switch between bookmarks, it will prompt you about restoring the files you had open. - -To control Bookshelf behavior: - -1. Open the **Settings** tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-bookshelf`. -5. Select **Always Restore**, **Always Ignore**, or **Prompt to Restore**. - - - -## Tabs become too small to read the file names when I have many tabs open. - ->This is an issue in Atom. - -One work-around is to make the tabs display in multiple rows. - -1. Go to `Atom | Stylesheet...`. This will open the `styles.less` file. -2. Add - - // Make tabs multi-row - .tab-bar { - height: auto; - flex-wrap: wrap; - .tab, - .tab.active { - flex: 1 0 auto; - height: 30px; - line-height: 27px; - } - .tab .title, - tab.active .title { - padding-right: 5px; - position: relative; - top: 1px; - } - .tab .close-icon, - .tab.active .close-icon { - line-height: 29px; - } - } - -## How do I report bugs, request features, or ask general questions about how to use Nuclide? - -If you've encountered a *bug*, please see the [GitHub Issues page](https://github.com/facebook/nuclide/issues) to see if anyone else has encountered the same problem and to report it as an issue if it is new. - -If you have a *feature request* or *general question*, the [Nuclide Community](https://www.facebook.com/groups/nuclide/) Facebook group is a good place to post. - -## Why is Nuclide a single Atom package? - -The Atom ecosystem is centered around modular packages that can be installed and updated -independently, and Nuclide took that same approach from the start. We wrote scripts to let our code -live in a single repository but be released as many Atom packages. Nuclide releases were actually -simultaneous releases of 40+ Atom packages. While this fit well with the Atom model, it meant we -also had to distribute a "installer" package that oversaw the installation of top-level Atom -packages. - -In practice, the installer process was computationally expensive, difficult to -troubleshoot, and took roughly 40 minutes partially due to large amounts of network traffic. When -all Nuclide packages were installed, they filled over 3GB of disk space. Nuclide packages are -heavily interdependent, and because they were installed as top-level Atom packages they each had -their own 'node_modules' directory with largely duplicate dependencies. - -By unifying Nuclide into a single Atom package, we aimed to improve installation, updates, and -maintenance. The single 'nuclide' package does not require a special installer, only `apm install` -like other Atom packages. This simplifies installation for everyone and makes Nuclide updates fast. -Once installed, the 'nuclide' package takes under 110MB of disk space, a 95%+ reduction in disk use, -and subsequently, network use during installation. The dramatic drop in disk use was possible -because Nuclide's features now share a single 'node_modules' directory and use relative paths to -require one another, eliminating the duplicate dependencies present when Nuclide was 40+ top-level -Atom packages. - -We hope that simplifying the installation -process will make [Nuclide's source](https://github.com/facebook/nuclide) more familiar to other -Atom developers and make it easier for anyone to contribute. diff --git a/docs/_docs/help/troubleshooting.md b/docs/_docs/help/troubleshooting.md deleted file mode 100644 index ac90a38fb9..0000000000 --- a/docs/_docs/help/troubleshooting.md +++ /dev/null @@ -1,262 +0,0 @@ ---- -pageid: help-troubleshooting -title: Troubleshooting -layout: docs -permalink: /docs/help/troubleshooting/ ---- - -If you are having problems with Nuclide itself, check out some of these troubleshooting tips. More -are being added as we come across common issues found by users. If you have an issue that is not -listed here, please [file a GitHub issue](https://github.com/facebook/nuclide/issues), and -depending on how widespread the problem may be, we will add it here as well. - -* TOC -{:toc} - -## Help! I think Nuclide is broken. - -It is probably best to [return Nuclide to a known state](/docs/help/faq/#how-do-i-return-nuclide-to-a-known-state). This can solve a variety of bizarre problems. - -## Command-Line Issues - -If `atom` or `apm` don't work from the command line, try removing the `/usr/local/bin/atom` and `/usr/local/bin/npm` symlinks and restarting Atom. Or, select **Install Shell Commands** from the `Atom` menu. - -## Settings Issues - -### Keyboard Shorts aren't working - -* Is the keyboard shortcut registered? - 1. Open the **Settings** tab either by pressing `Cmd-,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. - 2. Select **Keybindings** from the list at the left to see what keybindings you have active. - -* Check your system keyboard shortcuts. - There may be another application that is intercepting the shortcut before it reaches Atom. - -## Nuclide Server Issues - -### Installation - -If you are having issues installing the [Nuclide Server](/docs/features/remote#nuclide-server), -check out the following tips: - -*Node Version* - -

- -Use the command-line to verify your Node version by running: - -```bash -node --version -``` - -*Permissions* - -If you get `EACCESS` errors when you run the `npm install` command, you likely do not have your NPM properly -configured for installing global packages without root permissions. To fix this problem, install in -a directory your user owns like this: - -```bash -npm config set prefix '~/.npm_packages' -``` - -and add - -```bash -PATH=$PATH:$HOME/.npm_packages/bin; export PATH -``` - -to the end of your `.profile`. Now you should be able to run: - -```bash -npm install -g nuclide -``` - -without errors. - -If you previously ran `npm install` as root, you may need to correct the permissions on your `.npm` -directory by running: - -```bash -sudo chown -R userid:userid .npm -``` - -where `userid` is your userid. If you still get errors you may need to clear your NPM cache with: - -```bash -npm cache clear -``` - -### Files Not Syncing - -Sometimes you'll have a setup that used to work, but starts to fail. Here some things you can try to make it work again: - -* If you have a version mismatch between your client and remote server Nuclide installations, you'll want to run `npm update -g nuclide` on the server and make sure you have the same version on the client as well. -* Other tools that watch files may cause problems as well. Try stopping that process and stopping the file watcher as well via `watchman shutdown-server`. Then try to reconnect to the server again from Atom. -* Use `killall node` on the server side, then try reconnecting. - -## Source Control Issues - -### Source Control features aren't working - -If any Source Control features such as File Tree highlighting are working in Nuclide, there are a few things to check. - -1. Is the directory you opened in Atom part of a source control repository? -2. If you are working on a remote directory, only [Mercurial](/docs/features/hg/) is supported. Git will not work. -3. As of Atom 1.14, symlinks to directories essentially don't work, even if it's a Mercurial repository. Use a direct link to the directory to access all the source control features. - -### Why is the output of `hg status` wrong? - -Files not showing up as expected in `hg status` are generally caused by one of a few things: - -1. The file is ignored. - - You can run `hg status -i` to list ignored files. - - hg status -i | grep - -2. Watchman Issues - - Sometimes Watchman, the filesystem monitoring tool, isn't telling Mercurial that a file has been added, removed, or changed. You can check if it's a Watchman issue by running a status command without the Watchman extension: - - hg status --config extensions.fsmonitor=\! - - If the file shows up when you do that, it's a Watchman issue. In that case, run: - - watchman-diag > out.txt - - Sometimes on Macs, the output file might contain: - - There are 139 items on the filesystem not reported by watchman: - ... - - If you see this and if any components of the listed file names either are or were at some point a symlink, then you have fallen afoul of an Apple bug where fsevents won't report changes associated with a dangling symlink. You might be able to recover with: - - watchman watch-del-all - hg --config fsmonitor.mode=off rebase -s '(::bookmark() and draft()) - master::' -d master - watchman watch-project . - -3. Dirstate Corruption - - This happens most often because someone pressed `Ctrl-C` during a Mercurial command that was writing to the dirstate file (an index of all the files in the working directory). This corruption can be subtle and you might not notice any issues with it for a while, until you notice files not showing up that really should. - - In this case, try running: - - hg debugrebuilddirstate --minimal - - Then, run `hg status` again. - -4. Unknown Bugs - - Mercurial is under heavy development and there may be bugs we don't know about yet that cause issues like this. If you've verified that the above things don't work to fix the issue, let us know by filing a [GitHub issue](https://github.com/facebook/nuclide/issues). - -## Environment Issues - -### Uninstalling Older Versions of Nuclide - -[Nuclide v0.0.35](https://github.com/facebook/nuclide/releases/tag/v0.0.35) and earlier were released -as many separate Atom packages. If you have any packages starting with `nuclide-`, you likely have -some part of <=v0.0.35 still installed. - -Run the uninstall command below, which contains the full list of Nuclide's packages when they were -last released on 25 November 2015. This is safe to run even if you only have a subset of the -packages installed; `apm` will ignore any packages that are not present. - -```bash -$ apm uninstall \ -hyperclick \ -nuclide-arcanist \ -nuclide-blame \ -nuclide-blame-provider-hg \ -nuclide-blame-ui \ -nuclide-buck-files \ -nuclide-busy-signal \ -nuclide-clang-atom \ -nuclide-clipboard-path \ -nuclide-code-format \ -nuclide-code-highlight \ -nuclide-debugger-atom \ -nuclide-debugger-hhvm \ -nuclide-debugger-lldb \ -nuclide-diagnostics-store \ -nuclide-diagnostics-ui \ -nuclide-file-tree \ -nuclide-file-watcher \ -nuclide-find-references \ -nuclide-flow \ -nuclide-format-js \ -nuclide-fuzzy-filename-provider \ -nuclide-hack \ -nuclide-hack-symbol-provider \ -nuclide-health \ -nuclide-hg-repository \ -nuclide-home \ -nuclide-installer \ -nuclide-language-hack \ -nuclide-move-pane \ -nuclide-objc \ -nuclide-ocaml \ -nuclide-open-filenames-provider \ -nuclide-quick-open \ -nuclide-react-native-inspector \ -nuclide-recent-files-provider \ -nuclide-recent-files-service \ -nuclide-remote-projects \ -nuclide-test-runner \ -nuclide-toolbar \ -nuclide-type-hint \ -nuclide-url-hyperclick -``` - -## Flow Issues - -### Features Not Working - -If the Flow features are not working in Nuclide: - -- Make sure `flow` is in your [`$PATH`](#flow-issues__flow-and-path) environment variable. -- Ensure that you have `/* @flow */` at the top of your `.js` file. -- Ensure you have an empty `.flowconfig` file in the root of of your project directory. - -### `flow` and `$PATH` - -If you installed `flow` in a place not in your `$PATH` environment variable (e.g., unzipped it in your home directory), then you either have to update your `$PATH` environment variable or explicitly specify it. - -1. Open the **Settings** tab either by pressing `Cmd-,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-flow`. -5. Set the location of your `flow` installation in the **Path to Flow Executable** text box. - - - -### Module Not Found - -If you are [running Nuclide from source](/docs/advanced-topics/building-from-source/), you may -occasionally run into a `Cannot find module` error. - -![](/static/images/help/troubleshooting-module-not-found.png) - -As Nuclide is continuously updated, new modules may be added as dependencies. When you rebase to -the latest code and run Nuclide, the new module will not have been installed, so it will not be -found. - -Running `npm update` will get you the latest modules so that you should be able to open Nuclide -successfully again. - -## Buck Issues - -### Nuclide says Diagnostics are disabled, but Buck builds my C++ project - -Stand-alone header files are not fully supported yet because Buck doesn't report flags for them. - ->The majority of features may still work even without complete flags. You can provide more default flags in the Settings, if necessary. - -
- -1. Open the **Settings** tab either by pressing `Cmd-,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-clang`. -5. Add default flags as necessary. - - diff --git a/docs/_docs/languages/cpp.md b/docs/_docs/languages/cpp.md deleted file mode 100644 index ac2f7ce3b3..0000000000 --- a/docs/_docs/languages/cpp.md +++ /dev/null @@ -1,219 +0,0 @@ ---- -pageid: language-cpp -title: C++ -layout: docs -permalink: /docs/languages/cpp/ ---- - -Nuclide provides support for C++ developers. - -
- -* TOC -{:toc} - -## Supported Compilers - -In order to get the full features for a C++ project beyond basic syntax highlighting -and a generic autocomplete, you must have the following prerequisites installed: - -1. A compatible build system. You must have one of the following: - * [Buck](http://buckbuild.com) - With no additional setup required! - * [CMake](https://cmake.org/) - You will also have to generate a compilation database with the - [`CMAKE_EXPORT_COMPILE_COMMANDS`](http://clang.llvm.org/docs/JSONCompilationDatabase.html) - option via command-line and place it/symlink it in your project root. - Note that Nuclide does *not* provide any additional CMake integration at the moment. - * You can also manually create a compliant [`compile_commands.json`](http://clang.llvm.org/docs/JSONCompilationDatabase.html) in your project root. -2. [Clang](http://clang.llvm.org/) version 3.6 or higher (we recommend 3.8+) - -### Installing CMake and Clang - -*CMake* - -You can install CMake using one of the [pre-compiled binaries](https://cmake.org/install/) for -Linux and macOS. - -*Clang* - -Clang is generally provided by default on all major Linux distributions. You can use your packaging -system to install it (e.g., `sudo apt-get install clang libclang`). - -Note that **version 3.6 or higher is required**. We recommend 3.8 or above for best results. - -> You can [build Clang from source](http://clang.llvm.org/get_started.html) on Linux as well. - -On macOS, install Clang by installing [Xcode](https://developer.apple.com/xcode/). - -*Verify Install* - -You can verify that Clang is installed by typing `clang++ --version` on the command line. - -> A similar install process occurs for GNU `g++`. It is provided with Xcode, and you can install -> it via a Linux package (e.g., `sudo apt-get install g++`). - -*Building* - -Once Clang is installed, you need to build your C++ project with the `cmake` command, passing in the -`CMAKE_EXPORT_COMPILE_COMMANDS` flag. This will create a `compile_commands.json` file which lives -in the root of your project and provides the necessary information for the -[Nuclide C++ features support](#features). - -> If you use [Buck](#supported-compilers__installing-buck), you will not need to build with this -> flag. - -You may also provide additional project-wide compilation flags and include paths (such as `-isystem` -includes), as well as compilation flags to ignore, in a `.nuclide_clang_config.json` -file at the root of your project. These flags will specifically be used for the -[Nuclide C++ features](#features) that require libclang, rather than in the build process itself, -and they will be appended to the end of the compilation line. This file should look as follows: -> `{ 'extra_compiler_flags': [..], 'ignored_compiler_flags': [..] }` - -### Installing Buck - -Buck is [available](https://buckbuild.com/setup/install.html) via Homebrew on macOS, or you can -build from source on Linux. - -*Building* - -Your C++ project must be set up for a Buck build by creating [rules and targets](https://buckbuild.com/about/overview.html). - -## Features - -C++'s Nuclide integration provides you with productivity features such as: - -- [Code Diagnostics](#features__code-diagnostics) -- [Autocomplete](#features__autocomplete) -- [Jump To Declaration](#features__jump-to-declaration) -- [Jump Between Header and Implementation](#features__jump-between-header-and-implementation) -- [Type Hinting](#features__type-hinting) -- [Code Formatting](#features__code-formatting) - -> Remember that these features are only fully-enabled when used with a -> [supported compiler](#supported-compilers). - -### Code Diagnostics - -If you write code that doesn't compile correctly, Nuclide will warn you through its -[Code Diagnostics](/docs/editor/basics/#code-diagnostics) pane, as well with inline -[gutter](/docs/editor/basics/#gutter) tooltips (represented by a sideways red triangle). - -![](/static/images/docs/language-cpp-code-diagnostics.png) - -For [gutter diagnostics](/docs/editor/basics/#gutter), you will sometimes see a **Fix** button. For -some common errors (e.g., a missing semicolon), clicking the **Fix** button will fix the -problem for you. - -In this example, clicking the **Fix** button will insert a semicolon for you. - -![](/static/images/docs/language-cpp-code-diagnostics-gutter-fix.png) - -### Autocomplete - -Nuclide uses metadata from your Clang or Buck build to understand the objects within your project. -This allows for a detailed Autocomplete feature, providing you hints on what is available for a -given object. - -![](/static/images/docs/language-cpp-autocomplete.png) - -### Jump to Declaration - -You can click on a function call for your project and be taken directly to the declaration for that -function. - -Using `Cmd-` or `Cmd-Option-Enter` (`Ctrl-` or `Ctrl-Alt-Enter` on -Linux), the function call will be underlined. - -![](/static/images/docs/language-cpp-jump-to-declaration-link.png) - -Then, you will be taken to the declaration for that function. - -![](/static/images/docs/language-cpp-jump-to-declaration-result.png) - -### Jump Between Header and Implementation - -Using `Cmd-Option-N` (`Ctrl-Alt-N` on Linux), you can jump between the header (`.h`) and -implementation files (`.cpp`). - -### Type Hinting - -If you hover over a variable, Nuclide will show you a datatip with its type. - -![](/static/images/docs/language-cpp-type-hint.png) - -You can pin type hints to the main [Editing Area](/docs/editor/basics/#editing-area) so they -are always shown. - -Click on the pin icon of the type hint to pin the hint and the `x` icon to remove the pinned hint. Pinned type hints can be moved around and placed anywhere in the editing window. - -![](/static/images/docs/language-cpp-type-hint-pinned.png) - -> Hovering over a pinned type hint will highlight the variable associated with it. This is useful -> if you have two pinned type hints for variables on the same line. - -### Code Formatting - -Nuclide will format code based on a set of default Clang standards. - -1. Place your cursor on a function or line of code you wish to format. -2. Press `Cmd-Shift-C` (`Ctrl-Shift-C` on Linux), or use the context-aware menu and choose -**Format Code** to take a piece of code that looks like this... - -![](/static/images/docs/language-cpp-code-formatting-before.png) - -...and format it like this: - -![](/static/images/docs/language-cpp-code-formatting-after.png) - -## Debugging - -Nuclide supports [LLDB](http://lldb.llvm.org/) as the backend for its native C++ debugging. - -> At a minimum, you must have a C++ compiler (e.g., `g++` or `clang++`) and the LLVM Debugger -> (`lldb`) installed to use this feature. For example, on macOS, if you install -> [Xcode](https://developer.apple.com/xcode/) with its command-line tools, these will be installed -> for you. - -> Your C++ code must be compiled with debug symbols. For `g++` or `clang++`, this is accomplished -> by using `-g`. e.g., `clang++ hello.cpp -g -o hello.cpp`. If you are using `cmake` or some other -> build management system, ensure that you are compiling in debug mode with symbols. - -There are three ways to invoke the LLDB debugger: - -- [Attaching to a running process](#attaching-to-a-running-process) -- [Launching a process](#launching-a-process) -- [Debugging a Buck target](#debugging-a-buck-target) - -### Attaching to a running process - -Nuclide can attach to a running C++ process (after -[adding a C++ project](/docs/quick-start/getting-started/#adding-a-project) to Nuclide). Once you -compile your code, run it. - -NOTE: C++ debugging in Nuclide is not currently supported on Windows. - -1. Open the Debugger Selection window by pressing `Cmd-Shift-A` (`Ctrl-Shift-A` on Linux) or by clicking on the **Toggle Debugger** button in the [Nuclide toolbar](/docs/features/toolbar/#buttons). -2. Choose the **Native** tab. -3. Find your process in the list, and click the **Attach** button. - - - -After you attach to the process, the Nuclide Debugger appears to the right of the [Editing Area](/docs/editor/basics/#editing-area). -You can then debug your code normally, [following the Debugger guide](/docs/features/debugger/#basics). - -### Launching a process - -Launching a process is similar to the Attach flow. - -1. Open the Debugger Launch dialog by pressing `Cmd-F8` (`Ctrl-F8` on Linux) or by clicking on the **Toggle Debugger** button in the [Nuclide toolbar](/docs/features/toolbar/#buttons). -2. Choose the **Native** tab. -3. Fill out the fields, and click the **Launch** button. - - - -### Debugging a Buck target - -See the [Buck guide](/docs/features/task-runner/#buck__debug) for instructions on how to debug C++ Buck targets. - -### LLDB Commands - -You can run LLDB commands directly in the Nuclide Debugger [Console](/docs/features/debugger#basics__evaluation). diff --git a/docs/_docs/languages/flow.md b/docs/_docs/languages/flow.md deleted file mode 100644 index 5ff8f7344a..0000000000 --- a/docs/_docs/languages/flow.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -pageid: language-flow -title: Flow -layout: docs -permalink: /docs/languages/flow/ ---- - -Nuclide has deep, built-in support for [Flow-enabled](http://flowtype.org) JavaScript. - ->Flow recently became supported on Windows. See the [Windows is Supported!](https://flowtype.org/blog/2016/08/01/Windows-Support.html) Flow blog post for more information. - -
- -* TOC -{:toc} - -## Installing Flow - -In order to fully use the integration of Flow, you must have Flow installed on your system: - -1. [Install Flow](http://flowtype.org/docs/getting-started.html#installing-flow). -2. If you are new to Flow, [five simple examples](http://flowtype.org/docs/five-simple-examples.html) can get you started writing Flow programs. The -key items of note are: - * The `flow` path is in your `$PATH` environment variable. If it is not in your `$PATH` environment variable for any reason, you can specify the - path to the `flow` binary in `Settings | Packages | Nuclide | Settings | nuclide-flow: Path to Flow Executable`. - * You have an empty `.flowconfig` file in the root of your project. - * You have `/* @flow */` at the top of your JavaScript (`.js`) file. - -## Features - -Flow's integration into Nuclide provides you with productivity features such as: - -* [Code Diagnostics](#features__code-diagnostics) (e.g., inline Flow errors) -* [Autocomplete](#features__autocomplete) -* [Jump to Definition](#features__jump-to-definition) -* [Inline (mouseover) type hinting](#features__type-hinting) -* [Inline type coverage](#features__type-coverage) - -> These features will not work properly unless you are working with Flow-enabled JavaScript since -> they require a `.flowconfig` file in your project root and the ability to run the Flow -> typechecker (e.g., `flow`) from the project root. - -### Code Diagnostics - -If you write code that doesn't pass the Flow typechecker, Nuclide will provide you error details in -both its [Code Diagnostics](/docs/editor/basics/#status-bar__code-diagnostics) pane and inline -within the [Editing Area](/docs/editor/basics/#editing-area). - -![](/static/images/docs/language-flow-code-diagnostics.png) - -Hover over the sideways red triangle in the [gutter](/docs/editor/basics/#gutter) to see the Flow -error inline. - -![](/static/images/docs/language-flow-code-diagnostics-gutter.png) - -### Autocomplete -​​ -Given that Nuclide has access to all of the type information within your project along with the -built-in types provided by Flow, autocomplete just works. - -![](/static/images/docs/language-flow-autocomplete.png) - -By default suggestions from Flow will be shown first in the list of autocomplete results. -However if you don't want this behavior (e.g. you want snippets to be on top), -you can configure priority in Nuclide's preferences. - -### Jump To Definition - -Nuclide provides a jump to definition/symbol feature for Flow programs. - -For example, if you want to go to the definition of `arr_length()`, hover over -`arr_length()`and either press `Cmd-` (`Ctrl-` on Linux) or -`Cmd-Option-Enter` (`Ctrl-Alt-Enter` on Linux). - -![](/static/images/docs/language-flow-jump-to-definition-link.png) - -![](/static/images/docs/language-flow-jump-to-definition-result.png) - -### Type Hinting - -If you hover over a variable in your Flow file, you can get the type of the variable directly -inline. - -![](/static/images/docs/language-flow-typehint.png) - -In fact, you can even pin that type hint so that it always displays. Just click on the pin icon -when hovering over a variable to pin it. - -​​![](/static/images/docs/language-flow-pinned-typehint.png) - -The highlighted variables show that their type variables have been pinned. If you hover over the -type hint, its associated variable will have motion in its highlight. - -Click the `x` icon of a pinned type hint to remove it. - -> Pinned type hints can be moved anywhere within the editor. - -### Type Coverage - -Nuclide can show you how much of your Flow file is covered by the type system with Type Coverage. - -![](/static/images/docs/language-flow-type-coverage.png) - -If the percentage is less than 100%, you can toggle the Type Coverage inline display to show you where the issues are. - -From the [Command Palette](/docs/editor/basics/#command-palette), choose `Nuclide Type Coverage: Toggle Inline Display`. You can also either press `Ctrl-Option-Shift-V` (`Ctrl-Alt-Shift-V` on Linux) or simply click on the percentage displayed in the [Status Bar](/docs/editor/basics/#status-bar). - -Hover over any sideways triangles that appear in the gutter to see the type check issue inline, or open the [Diagnostics Table](/docs/editor/basics/#status-bar__code-diagnostics) to see them all listed together. Clicking on any issue in the Diagnostics Table will highlight the associated line. - -![](/static/images/docs/language-flow-type-coverage-inline.png) diff --git a/docs/_docs/languages/hack.md b/docs/_docs/languages/hack.md deleted file mode 100644 index 97d2bb7c43..0000000000 --- a/docs/_docs/languages/hack.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -pageid: language-hack -title: Hack -layout: docs -permalink: /docs/languages/hack/ ---- - -Nuclide has been built from the start to provide a great IDE experience for -[Hack](http://hacklang.org) development. Hack is a programming language for -[HHVM](http://hhvm.com). - -> Currently, HHVM is [not supported on Windows](https://docs.hhvm.com/hhvm/installation/windows), so -> this integration has limited viability on that platform. However, -> [work is being done](https://github.com/facebook/hhvm/issues/5460) to port HHVM to Windows. - -
- -* TOC -{:toc} - -## Installing Hack - -In order to fully use the integration of Hack, you must have both Hack and HHVM installed on your -system: - -1. [Install HHVM](https://docs.hhvm.com/hhvm/installation/introduction). By default, Hack is -installed with HHVM. -2. If you are new to Hack, HHVM's [Getting Started](https://docs.hhvm.com/hack/getting-started/getting-started) provides [steps for writing your first Hack program](https://docs.hhvm.com/hack/getting-started/getting-started#your-first-hack-program). The -key items of note are: - * The typechecker `hh_client` is in your `$PATH` environment variable (the default install of - HHVM, should place it there). - * You have an `.hhconfig` file at the root of your project. - * You have ` If you are planning on developing with Hack [remotely](/docs/features/remote), ensure HHVM and -> Hack are installed on the *remote* machine. - -## Features - -Hack's integration into Nuclide provides you with productivity features such as: - -* [Code Diagnostics](#features__code-diagnostics) -* [Autocomplete](#features__autocomplete) -* [Jump to Definition](#features__jump-to-definition) -* [Inline (mouseover) type hinting](#features__type-hinting) -* [Code formatting](#features__code-formatting) -* [OmniSearch](/docs/features/quick-open), with a special [Hack symbol](/docs/features/quick-open#hack-symbols) search pane. - -### Code Diagnostics - -If your code doesn't correctly [typecheck](https://docs.hhvm.com/hack/typechecker/introduction), Nuclide has code diagnostics that will show you the error. You can see the error in two places, inline within the -[Editing Area](/docs/editor/basics/#editing-area) and in the -[Code Diagnostics](/docs/editor/basics/#status-bar__code-diagnostics) pane below. - -![](/static/images/docs/language-hack-code-diagnostics.png) - -Hover over the sideways red triangle in the [gutter](/docs/editor/basics/#gutter) to see the Hack -error inline. - -![](/static/images/docs/language-hack-code-diagnostics-gutter.png) - -### Autocomplete - -Given that Nuclide has access to all of the type information within your project and the built-in -types provided by Hack, autocomplete just works. - -![](/static/images/docs/language-hack-autocomplete.png) - -### Jump to Definition - -Nuclide provides a jump to definition/symbol feature for Hack programs. - -> In order for this to work, you must have an `.hhconfig` file in the root of your project and a -> running `hh_server` monitoring the root as well. - -For example, if you want to go to the definition of `getPages()`, hover over `getPages()` -and either press `Cmd-` or `Cmd-Option-Enter` (`Ctrl-Alt-Enter` on Linux). - -![](/static/images/docs/language-hack-jump-to-definition-link.png) - -![](/static/images/docs/language-hack-jump-to-definition-result.png) - -### Type Hinting - -If you hover over a variable in your Hack file, you can get the type of the variable directly -inline. - -![](/static/images/docs/language-hack-typehint.png) - -In fact, you can even pin that type hint so that it always displays. Just click on the pin icon -when hovering over a variable to pin it. - -![](/static/images/docs/language-hack-pinned-typehint.png) - -The highlighted variables show that their type variables have been pinned. If you hover over the -type hint, its associated variable will have motion in its highlight. - -Click the `x` icon of a pinned type hint to remove it. - -> Pinned type hints can be moved anywhere within the editor. - -### Type Coverage - -Nuclide can show you how much of your Hack file is covered by the type system with Type Coverage. - -![](/static/images/docs/language-hack-type-coverage.png) - -If the percentage is less than 100%, you can toggle the Type Coverage inline display to show you where the issues are. - -From the [Command Palette](/docs/editor/basics/#command-palette), choose `Nuclide Type Coverage: Toggle Inline Display`. You can also either press `Ctrl-Option-Shift-V` (`Ctrl-Alt-Shift-V` on Linux) or simply click on the percentage displayed in the [Status Bar](/docs/editor/basics/#status-bar). - -Hover over any sideways triangles that appear in the gutter to see the type check issue inline, or open the [Diagnostics Table](/docs/editor/basics/#status-bar__code-diagnostics) to see them all listed together. Clicking on any issue in the Diagnostics Table will highlight the associated line. - -![](/static/images/docs/language-hack-type-coverage-inline.png) - -### Code Formatting - -Nuclide can take your Hack code and format it according to a built-in set of coding standards -(e.g, two-space indents, bracket location, etc.). - -For example, here is a bit of code that looks relatively haphazard from a formatting perspective. - -![](/static/images/docs/language-hack-badly-formatted.png) - -Place your cursor inside the function and press `Cmd-Shift-C` (`Ctrl-Shift-C` on Linux) to apply the coding standards to the function. - -![](/static/images/docs/language-hack-well-formatted.png) - -## Debugging - -Nuclide supports debugging PHP and Hack applications running on [HHVM](https://docs.hhvm.com/hhvm/installation/introduction). **HHVM version 3.25.0 or greater is required,** as older versions do not support the Visual Studio Code Debug Adapter Protocol, which is the debugging protocol Nuclide now uses. - -> Note: debugging PHP servers other than HHVM is no longer supported in Nuclide. In previous versions, Nuclide supported debugging via the XDebug protocol, but this is also no longer supported. Debugging older HHVM versions (< 3.25.0) with Nuclide is not possible. - -### Configuring HHVM for debugging - -To enable debugging Hack/PHP applications **in webserver mode**, you'll need to add -the following to your server's config.ini: - -``` -hhvm.debugger.vs_debug_enable=1 -``` - -By default, HHVM will listen for incoming debugger connections on port 8999. You can specify a different port by adding an additional line to your config.ini: -``` -hhvm.debugger.vs_debug_listen_port= -``` - -More information about configuring HHVM can be found here: [HHVM Configuration](https://docs.hhvm.com/hhvm/configuration/introduction) - -If you want to debug a Hack/PHP script running in **script mode**, you simply add a couple extra command line parameters when invoking HHVM: - -``` -hhvm --mode vsdebug --vsDebugPort -``` - -The above command will startup HHVM with the debugger listening on the specified port, and will wait forever for the debugger to connect before starting the script. You can add an additional optional parameter, `--vsDebugNoWait true` to cause HHVM to begin execution of the script immediately, while still allowing the debugger to connect and break in later. This mode is especially useful for long-running scripts that you may want to break into to debug things like infinite loops, hangs, etc. - - -In order for Nuclide to be able to connect to your HHVM instance, you'll need to either have Nuclide server on the same host as HHVM and use a remote project, or forward the HHVM debugger port to your local machine via SSH tunneling or some other means. - -We *strongly* advise against exposing the HHVM debugger port to the internet on production machines, for obvious security reasons. - - -### Configuring Nuclide to debug HHVM - -There are two configuration options in Nuclide settings that you'll want to configure for HHVM if you want to launch scripts in debug mode. You don't need to configure these if you only want to attach to a webserver. - -![](/static/images/docs/debugger-hhvm-settings.png) - -The first is the full path to your HHVM runtime binary, and the second is any arguments Nuclide should pass when starting HHVM, such as the path to your config.ini. These arguments will be passed verbatim on the command line when invoking HHVM. - -Additionally, you may specify an optional attach port to use when attaching to webserver mode, if you've configured your server to listen on a port other than 8999. - - -### Debugging: HHVM Toolbar - -The [Task Runner toolbar](/docs/features/task-runner) is one way to debug Hack or PHP projects. To open the Task Runner toolbar, click on the **Toggle Task Runner Toolbar** button in the [Nuclide toolbar](/docs/features/toolbar/#buttons) or search for `Nuclide Task Runner: Toggle HHVM Toolbar` in the [Command Palette](/docs/editor/basics/#command-palette). - -See the [Task Runner HHVM guide](/docs/features/task-runner/#hhvm-debug-toolbar) for instructions on debugging Hack or PHP projects. - -### Debugging: Launch / Attach Dialogs - -The HHVM debugger can also be started via our advanced configuration dialogs. You'll find these under the Nuclide menu (Nuclide -> Debugger -> [Launch | Attach] Debugger), and select the "Hack / PHP" tab, which will be offered if your current working root is a remote project that supports HHVM. - -When launching, Nuclide will prompt for the path to your Hack/PHP script, and any arguments you'd like Nuclide to pass to it. - -When attaching, Nuclide will offer to connect to your webserver instance, or attach to an already-running script that was started with the `--mode vsdebug --vsDebugPort ` HHVM arguments. - -### Console - -When debugging a *script*, all output from HHVM's stdout and stderr is redirected to the Nuclide console. When debugging a *webserver*, stdout is redirected, but stderr is not due to the output traffic being too high. - -The console also provides a REPL that allows you to execute Hack/PHP code (see below). - -### Console Evaluation - -Basic [evaluation](/docs/features/debugger/#basics__evaluation) in the REPL works out of the box for built in Hack/PHP routines. - -Nuclide now executes console input **as Hack by default**, instead of PHP. For many commands, there is no difference, but the behavior between Hack and PHP differs in some contexts, so this is important to know. You can explicitly have the debugger run your code as Hack or PHP by beginning your input with ` Linux does not have Xcode. However, there are ways to compile Objective-C programs on Linux using -> `gobjc`, [`gnustep`](http://www.gnustep.org/), etc. - -However, to get the full [feature list](#buck-enabled-features) for Objective-C support, you must -compile your Objective-C program with [Buck](http://buckbuild.com). - -## Default Features - -Objective-C's integration into Nuclide provides you with productivity features out-of-the-box such -as: - -* [Automatic Square Bracket Completion](#default-features__automatic-square-bracket-completion) -* [Automatic Colon Indenting](#default-features__automatic-colon-indenting) - -### Automatic Square Bracket Completion - -If you forget to put a starting bracket at the front of your target or selector, one will be inserted -for you automatically if you add the ending bracket. This will work for any number of bracket -levels deep. - -For example, if you add an ending bracket here... - -![](/static/images/docs/language-objc-before-bracket-insert.png) - -... then the beginning bracket is inserted for you automatically. - -![](/static/images/docs/language-objc-after-bracket-insert.png) - -To enable this setting: - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-objc`, and select the **Enable Automatic Square Bracket Completion** checkbox. - -![](/static/images/docs/language-objc-auto-bracket-completion-setting.png) - -### Automatic Colon Indenting - -Nuclide will automatically indent the colons (`:`) associated with new method arguments to be -aligned with the arguments of that method. - -If you start a `:` at the beginning of the next line after the method declaration... - -![](/static/images/docs/language-objc-before-colon-indent.png) - -... it will be aligned automatically. - -![](/static/images/docs/language-objc-after-colon-indent.png) - -## Buck-enabled Features - -The following features require that your Objective-C project is compiled with [Buck](http://buckbuild.com). - -> You can also generate a `compile_commands.json` file with the -> [`json-compilation-databse` reporter](https://github.com/facebook/xctool#included-reporters) -> of [`xctool`](https://github.com/facebook/xctool) to get these features. - -
- -* [Code Diagnostics](#buck-enabled-features__code-diagnostics) -* [Inline Type Hints](#buck-enabled-features__type-hints) -* [Autocomplete](#buck-enabled-features__autocomplete) -* [Jump to Definition](#buck-enabled-features__jump-to-definition) - -> The [Buck toolbar](/docs/features/buck) allows you to build and run your Buck-enabled programs. - -### Code Diagnostics - -If you write code that will cause `clang` errors or warnings, Nuclide's Code Diagnostics will show -you the error. You can see the error in two places: inline within the -[Editing Area](/docs/editor/basics/#editing-area), and in the [Code Diagnostics](/docs/editor/basics/#status-bar__code-diagnostics) pane below. - -![](/static/images/docs/language-objc-code-diagnostics.png) - -Hover over the sideways red triangle in the [gutter](/docs/editor/basics/#gutter) to see the `clang` error inline. - -![](/static/images/docs/language-objc-lint-gutter.png) - -### Type Hints - -Hovering over an Objective-C object will provide you the type of that object inline. - -![](/static/images/docs/language-objc-typehint.png) - -In fact, you can even pin that type hint so that it always displays. Just click on the pin icon when hovering over a variable to pin it. - -![](/static/images/docs/language-objc-pinned-typehint.png) - -Click the `x` icon of a pinned type hint to remove it. - -> Pinned type hints can be moved anywhere within the editor. - -### Autocomplete - -Buck enhances the understanding of the types of objects in your project so that autocomplete can be -enabled. - -![](/static/images/docs/language-objc-autocomplete.png) - -> Without Buck, you will still get the default autocomplete feature, but without project and object -> specific information. - -### Jump To Definition - -Nuclide provides a jump to definition/symbol feature for Objective-C programs. - -For example, if you want to go to the definition of `initWithHelloString:`, hover over -`initWithHelloString:` and either press `Cmd-` (`Ctrl-` on Linux) or -`Cmd-Option-Enter` (`Ctrl-Alt-Enter` on Linux). - -![](/static/images/docs/language-objc-jump-to-definition-link.png) - -![](/static/images/docs/language-objc-jump-to-definition-result.png) - -### Jump Between Header and Implementation - -Using `Cmd-Option-N` (`Ctrl-Alt-N` on Linux), you can jump between the header (i.e., `.h`) and -the implementation (i.e., `.cpp` or `.m`) files. - -## Debugging - -Nuclide has support for [iOS](/docs/platforms/ios) debugging and [Buck](http://buckbuild.com) -for native Objective-C applications (i.e., `.m` files). - -> Debugging Swift applications is currently not supported. - -See the [Buck guide](/docs/features/buck) for how to build, run and debug iOS apps. - -> Optimally, it would be nice to run the application directly from Xcode and attach to the -> simulator process associated with that Xcode project. However, due to `lldb` process conflict -> issues, this is currently not possible. - -### LLDB Commands - -Native iOS debugging uses [LLDB](http://lldb.llvm.org/) as its debugging backend. You can run LLDB -commands directly in the Nuclide Debugger's [Console](/docs/features/debugger#basics__evaluation). diff --git a/docs/_docs/languages/other.md b/docs/_docs/languages/other.md deleted file mode 100644 index 78dab89637..0000000000 --- a/docs/_docs/languages/other.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -pageid: language-other -title: PHP, JS, OCaml -layout: docs -permalink: /docs/languages/other/ ---- - -Nuclide provides support for other languages as well. Some of these are not as full-featured as -similar languages (e.g., Hack vs PHP); others are experimental. - -* TOC -{:toc} - -## PHP - -Nuclide's PHP support is similar to its support for [Hack](/docs/languages/hack), except you will -not get as full-featured diagnostics, type hinting, etc. since there is no -[typechecker](https://docs.hhvm.com/hack/typechecker/introduction) to assist Nuclide with your project's metadata. - -## JavaScript - -Nuclide's JavaScript support is similar to its support for [Flow](/docs/languages/flow), except -you will not get as full-featured diagnostics, type hinting, etc. since there is no -[typechecker](http://flowtype.org/) to assist Nuclide with your project's metadata. - -JavaScript is a primary language for [React Native](https://facebook.github.io/react-native/), and -Nuclide is a great IDE for [developing React Native applications](/docs/platforms/react-native). - -## OCaml - -This **experimental** feature provides rudimentary support for OCaml via -[ocamlmerlin](https://github.com/the-lambda-church/merlin). Merlin can be installed from source -or by installing the `merlin` OPAM package. - -OCaml's integration into Nuclide provides you with productivity features such as: - -* Autocomplete -* Jump to Definition - -It requires that `ocamlmerlin` be installed on your system and properly configured for your -project. `ocamlmerlin` should be in your `$PATH` environment variable. If it is not, you may specify the path to -`ocamlmerlin` in the settings for the 'nuclide' package. - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-ocaml`, and enter the custom path in the **Path to Merlin Executable** text box. diff --git a/docs/_docs/languages/python.md b/docs/_docs/languages/python.md deleted file mode 100644 index 73517a4f3d..0000000000 --- a/docs/_docs/languages/python.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -pageid: language-python -title: Python -layout: docs -permalink: /docs/languages/python/ ---- - -Nuclide has well-rounded support for Python 2 and 3. - -* TOC -{:toc} - -## Using Python Features with Buck Projects - -If your code uses Buck to manage Python dependencies, you will need to build -your project's `python_binary` target in order for autocomplete and -jump to definition to find results from dependencies. - -## Features - -Python's integration into Nuclide provides you with productivity features such as: - -- [Autocomplete](#features__autocomplete) -- [Jump To Definition](#features__jump-to-definition) -- [Code Formatting](#features__code-formatting) -- [Code Diagnostics](#features__code-diagnostics) -- [Outline View](#features__outline-view) - -### Autocomplete - -Nuclide integrates [Jedi](http://jedi.jedidjah.ch/) to provide fast, -detailed, and context-aware autocompletion. - -![](/static/images/docs/language-python-autocomplete.png) - -By default, Nuclide will provide tab-able snippets for function and method -arguments. To turn this behavior on or off: - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-python`, and select or deselect the **Autocomplete arguments** checkbox. - -### Jump to Definition - -Nuclide allows you to directly jump to definition for local or imported symbols -alike. - -For example, to go to the definition of `get_all_patches()`, you can -hover over `get_all_patches()`and either press `Cmd-` -(`Ctrl-` on Linux) or `Cmd-Option-Enter` (`Ctrl-Alt-Enter` on Linux). - -![](/static/images/docs/language-python-jump-to-definition-link.png) - -![](/static/images/docs/language-python-jump-to-definition-result.png) - -Jump to definition also works for [Buck](http://buckbuild.com) config files. -Since `BUCK` files are written in Python, you can use `Cmd-` -(`Ctrl- Nuclide's built-in Swift support is not endorsed by Apple. The Swift - logo is a registered trademark of Apple Inc. - -
- -* TOC -{:toc} - -## Configuring Nuclide for Swift Package Development - -Nuclide will attempt to find a Swift executable automatically: - -- On macOS, it will use the latest version of Swift installed at `/Library/Developer/Toolchains/swift-latest.xctoolchain`. -- On Linux, it will find a Swift executable based on your `$PATH`. - -You may use a specific version of Swift by setting the **Swift Toolchain Path** in the Nuclide settings: - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-swift`, and enter the Toolchain path in the **Swift Toolchain Path** text box. - -![](/static/images/docs/language-swift-toolchain-path-setting.png) - -Nuclide uses [SourceKitten](https://github.com/jpsim/SourceKitten) to provide features such as [Autocomplete]((#features__autocomplete)). - -On macOS, Nuclide expects to find a SourceKitten executable at `/usr/local/bin/sourcekitten`. Installing SourceKitten via [Homebrew](http://brew.sh/), by running `brew install sourcekitten` at the command line, places it in this location. - -> Unfortunately, SourceKitten is not yet available on Linux. As a result, - features such as [Autocomplete](#features__autocomplete) are only available on macOS. - -You may configure Nuclide to use a SourceKitten executable at a different location by setting the **Path to SourceKitten Executable** in the Nuclide -settings. - -1. Open the [Nuclide Settings](/docs/editor/basics/#preferences-pane) tab either by pressing `Cmd+,` (`Ctrl-,` on Linux) or by going to `Package | Settings View | Open`. -2. Select **Packages** from the list at the left, and search for `nuclide`. -3. Click on the **Settings** button for the `nuclide` package. -4. Scroll down until you find `nuclide-swift`, and enter the custom SourceKitten path in the **Path to SourceKitten Executable** text box. - -## Features - -Swift integration in Nuclide provides you with productivity features such as: - -- [Building and Testing Swift packages](#features__building-and-testing-swift-packages) -- [Autocomplete](#features__autocomplete) - -### Building and Testing Swift packages - -The [Task Runner toolbar](/docs/features/task-runner) is used to build and test Swift packages. To open the Task Runner toolbar, click on the **Toggle Task Runner Toolbar** button in the [Nuclide toolbar](/docs/features/toolbar/#buttons) or search for `Nuclide Task Runner: Toggle Swift Toolbar` in the [Command Palette](/docs/editor/basics/#command-palette). - -See the [Task Runner Swift guide](/docs/features/task-runner/#swift) for how to build and test Swift packages. - -### Autocomplete - -Once you have [built your Swift package](#features__building-a-swift-package) via the [Task Runner's](/docs/features/task-runner) [Swift toolbar](/docs/features/task-runner/#swift), Nuclide will be able to provide autocompletion suggestions for Swift source code. - -![](/static/images/docs/language-swift-autocompletion.png) diff --git a/docs/_docs/platforms/android.md b/docs/_docs/platforms/android.md deleted file mode 100644 index 3f4fb406bf..0000000000 --- a/docs/_docs/platforms/android.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -pageid: platform-android -title: Android -layout: docs -permalink: /docs/platforms/android/ ---- - -Nuclide's support for Android is currently much more basic and limited than that for -[iOS](/docs/platforms/ios). If you are a [React Native](/docs/platforms/react-native) developer for Android, there is more -full-featured support for the [Flow](/docs/languages/flow) or [JavaScript](/docs/languages/other/#javascript) side of your application. For debugging, there is -currently built-in support for [ADB logs](#emulator-logs). - -> This section discusses primarily native Android development since there is a whole separate -> section dedicated to [React Native](/docs/platforms/react-native). - -
- -* TOC -{:toc} - -## Features - -When you open an Android Java file (i.e., `.java`), you only get the basic syntax highlighting and -quick-completion capabilities given to you by Atom. - -## Running Applications - -Currently, the easiest way to build and run a native Android application is from an IDE such as -Android Studio. You can also use the command-line tools such as `adb`, `am`, etc. - -## Debugging - -Debugging Android applications is currently not supported except through the logs provided -by Nuclide's [Android Debug Bridge (ADB) Logcat support](#emulator-logs). - -## Emulator Logs - -When running your Android project in the Android emulator, you can open and view the emulator logs -directly within Nuclide. From the [Command Palette](/docs/editor/basics/#command-palette), search -for `Nuclide Adb Logcat: Start`. - -![](/static/images/docs/platform-android-toggle-simulator.png) - -![](/static/images/docs/platform-android-simulator-output.png) - -> Currently, the logs are very verbose as they do not delineate between actual underlying emulator -> information with the actual running application. diff --git a/docs/_docs/platforms/ios.md b/docs/_docs/platforms/ios.md deleted file mode 100644 index c28cd3084d..0000000000 --- a/docs/_docs/platforms/ios.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -pageid: platform-ios -title: iOS -layout: docs -permalink: /docs/platforms/ios/ ---- - -Nuclide supports both native iOS development in [Objective-C](/docs/languages/objective-c) and -cross-platform development in [React Native](/docs/platforms/react-native). - -> This section discusses primarily native iOS development since there is a whole separate section -> dedicated to [React Native](/docs/platforms/react-native). - -
- -* TOC -{:toc} - -## Features - -When you open an [Objective-C](/docs/languages/objective-c/) file (e.g., `.h`, `.m`, `.mm`), you -automatically get support for default [features](/docs/languages/objective-c/#default-features) such -as [Automatic Square Bracket Completion](/docs/languages/objective-c/#default-features__automatic-square-bracket-completion). - -However, if you compile your project with [Buck](http://buckbuild.com), you get richer -[features](/docs/languages/objective-c/#buck-enabled-features) such as -[Autocomplete](/docs/languages/objective-c/#buck-enabled-features__autocomplete) and -[Jump to Definition](/docs/languages/objective-c/#buck-enabled-features__jump-to-definition). - -![](/static/images/docs/platform-ios-native-autocomplete.png) - -## Running Applications - -Currently, the easiest way to build and run a native iOS application is from Xcode itself. -You can also use the command-line tools such as `xcodebuild`, etc. - -### Buck Integration - -Nuclide supports the [Buck](https://buckbuild.com/) build system. See the -[Buck guide](/docs/features/buck) for how to build, run, and debug iOS apps. - -## Debugging - -Debugging native [Objective-C](/docs/languages/objective-c/) iOS applications is -[supported using Buck](/docs/features/buck/#debug). - -## Simulator Logs - -When running your iOS project in the iOS simulator, you can open and view the simulator logs -directly within Nuclide. From the [Command Palette](/docs/editor/basics/#command-palette), search -for `Nuclide iOS Simulator Logs: Start`. - -![](/static/images/docs/platform-ios-toggle-simulator.png) - -![](/static/images/docs/platform-ios-simulator-output.png) - -> Currently, the logs are very verbose as they do not delineate between actual underlying simulator -> information with the actual running application. diff --git a/docs/_docs/platforms/react-native.md b/docs/_docs/platforms/react-native.md deleted file mode 100644 index eb76225c96..0000000000 --- a/docs/_docs/platforms/react-native.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -pageid: platform-react-native -title: React Native -layout: docs -permalink: /docs/platforms/react-native/ ---- - -Nuclide has built-in support for the [React Native](https://facebook.github.io/react-native/) -framework. React Native provides a set of components and extensions that allows you to easily write -native iOS and Android applications using the [Flow](/docs/languages/flow) and -[JavaScript](/docs/languages/other#javascript) programming languages and the -[React](http://facebook.github.io/react/) UI library. - -* TOC -{:toc} - -## Features - -If your React Native apps are primarily written in [Flow](/docs/languages/flow), you get all of its -[features](/docs/languages/flow/#features) within Nuclide, including -[Autocomplete](/docs/languages/flow/#autocomplete), -[Code Diagnostics](/docs/languages/flow/#features__code-diagnostics), etc. - -![](/static/images/docs/platform-react-native-feature-autocomplete.png) - -> [JavaScript](/docs/languages/other/#javascript) works well with Nuclide as well. - -> You can also write [native iOS (Objective-C)](/docs/platforms/ios) code with React Native, and get -> features such as [Automatic Square Bracket Completion](/docs/languages/objective-c/#default-features__automatic-square-bracket-completion) from Nuclide when doing so. Native Android code written in conjunction with React Native has [minimal support](/docs/platforms/android). - -## Running applications - -All React Native features are currently available from the [Command Palette](/docs/editor/basics/#command-palette). - -You run Metro from Nuclide and your application from the command line. - -### Metro - -From the [Command Palette](/docs/editor/basics/#command-palette), choose `Nuclide Metro: Start` to start Metro. The output in the `Console` panel indicates if Metro started or if it encountered any errors. - -![](/static/images/docs/platform-react-native-start-packager.png) - -The server runs on the default `port 8081`. You can stop and restart the server at anytime. - -### Command Line - -Ensure that you are in the root directory of the React Native project, then run the application from the command-line: - -```bash -$ react-native run-ios -$ react-native run-android -``` - -This should bring up the Simulator with your running application inside. - -## Support - -Nuclide has support for [React Native](https://facebook.github.io/react-native/) for [iOS](/docs/platforms/ios). - -From Nuclide, you can start a React Native development server, inspect React Native elements. - -> In order to use React Native within Nuclide, you must -> [install](https://facebook.github.io/react-native/docs/getting-started.html) it. - -### Loading a React Native Project - -You open a React Native project the -[usual way](/docs/quick-start/getting-started/#adding-a-project). Nuclide will automatically -establish that you have a React Native project by seeing the `node_modules/react-native` directory -from the root of your project. - -### Metro - -[Launch Metro from within Nuclide](#running-applications__metro). - -### Run the React Native Application - -[Start your React Native application from the command-line](#running-applications__command-line). - -### Element Inspector - -Nuclide provides an Element Inspector, where you can view and toggle properties of your application. - -From the [Command Palette](/docs/editor/basics/#command-palette), choose `Nuclide React Inspector: Show` to open the **React Inspector** tab in the -main [Editing Area](/docs/editor/basics/#editing-area). - -![](/static/images/docs/platform-react-native-element-inspector.png) - -To see the actual elements highlighted in the Nuclide Element Inspector also highlighted in the -Simulator, you must enable the Simulator Inspector as well. Press `Cmd-D` (`Ctrl-D` on Linux) within -the Simulator and choose **Show Inspector**. - -![](/static/images/docs/platform-react-native-show-inspector.png) - -## Simulator Logs - -Nuclide supports the [iOS Simulator logs](/docs/platforms/ios#simulator-logs) and -[Android Emulator logs](/docs/platforms/android#emulator-logs) directly within Nuclide. - -## Debugging - -Nuclide's new React Native debugger support is ported from -[vscode-react-native](https://github.com/Microsoft/vscode-react-native) at -version 0.5.7 ([fork source](https://github.com/pelmers/vscode-react-native/tree/nuclide)). -There are two ways to invoke the React Native debugger. Nuclide can either attach to -a running packager, or it can launch the debug target in a new packager for -debugging. Note that the debugger from Nuclide can only attach if the default -Chrome debugger is not already running. - -Both cases require a workspace path which should be set to the directory -containing the `package.json` file of the debug target. Launching the debugger -also requires specifying the platform to debug, either `ios` or `android` as -well as the target, either `simulator` or `device`. Note that debugging on an -iOS device requires some manual setup; see -[these instructions](https://github.com/Microsoft/vscode-react-native/blob/master/doc/debugging.md#debugging-on-ios-device). -In most cases the default port setting of 8081 will be correct. - -> Changing the port setting in the debugger may require external setup, see -> [the issue on GitHub](https://github.com/facebook/react-native/issues/9145) - -![](/static/images/docs/platform-react-native-debugger-ex.png) - -> A DeprecationWarning: 'root' is deprecated error may appear when the program -> first runs, which can be safely dismissed. diff --git a/docs/_docs/platforms/web.md b/docs/_docs/platforms/web.md deleted file mode 100644 index 353e4e5d2b..0000000000 --- a/docs/_docs/platforms/web.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -pageid: platform-web -title: Web Development -layout: docs -permalink: /docs/platforms/web/ ---- - -The development of modern websites makes use of both server-side and client-side web technologies. -Nuclide makes web developers more productive in this process. - -* TOC -{:toc} - -## Server-side Development - -[Hack](/docs/languages/hack) has first-class support in Nuclide. In conjunction with -[HHVM](http://docs.hhvm.com), Hack offers quick development and testing with the comfort of -[type safety](https://docs.hhvm.com/hack/typechecker/introduction). Nuclide enhances this by -utilizing Hack's information to deliver developer productivity features such as -[Autocomplete](/docs/languages/hack/#features__autocomplete) and -[inline error checking](/docs/languages/hack/#features__code-diagnostics). - -If you are a [PHP](http://php.net) developer, Nuclide has [support](/docs/languages/other/#php) for that as well. - -## Client-side Development - -[Flow](/docs/languages/flow) has first-class support in Nuclide. Flow gives you -[type safety](http://flowtype.org) as you develop, and Nuclide uses the information provided by -Flow to enhance developer productivity. This includes -[Jump to Definition](/docs/languages/flow/#jump-to-definition) and -[Type Hinting](/docs/languages/flow/#type-hinting). - -If you are a [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) developer, -Nuclide has [support](/docs/languages/other/#javascript) for that as well. - -## Scripting - -Nuclide supports many languages to help you write your scripts quicker and error-free. With -first-class support for [Hack](/docs/languages/hack) and [Flow](/docs/languages/flow), along -with support for [C++](/docs/languages/cpp), Nuclide make you more productive in your script -writing. diff --git a/docs/_docs/quick-start/getting-started.md b/docs/_docs/quick-start/getting-started.md deleted file mode 100644 index ccf8ef4cdb..0000000000 --- a/docs/_docs/quick-start/getting-started.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -pageid: quick-start-getting-started -title: Getting Started -layout: docs -permalink: /docs/quick-start/getting-started/ ---- - -This getting started guide walks you through the core features of Nuclide and aims to get you productive quickly. - -If you are new to Atom, you can find more information about its features in the [Atom Flight Manual](http://flight-manual.atom.io/). Then, to find out more about using Nuclide, see [Basics](/docs/editor/basics) or any of the other guides available in the Nuclide documentation. -
- -* TOC -{:toc} - -## Installation - -The [installation guides](/docs/editor/setup/) provide detailed information to install -Nuclide on your platform, but if you have already met the platform dependent prerequisites -([macOS](/docs/editor/setup/#macos__prerequisites) | [Linux](/docs/editor/setup/#linux__prerequisites)), -you can install Nuclide easily from within Atom itself. - -> Nuclide can be installed on [Windows](#windows), but it is [not fully supported](https://github.com/facebook/nuclide/issues/321). - -
- -1. Open Atom. -2. Choose `Atom | Preferences` (`Edit | Preferences` on Linux and `File | Settings` on Windows) to bring up the **Settings** tab. -3. In the **Settings** tab, select **Install** from the list at the left. -4. In the search box, type "Nuclide" and press the `Enter` key. -5. Click the **Install** button for the `nuclide` package. - -![](/static/images/docs/editor-setup-atom-install-nuclide.png) - -> Installing Nuclide within the Atom Packages UI is the recommended method, however you can install Nuclide from the command-line, if you wish, using: -> -```bash -$ apm install nuclide -``` -> - -
- -### Packages - -If you want features such as [Quick Open](#quick-open), [Remote Development](/docs/features/remote), and [Mercurial support](/docs/features/hg) to work correctly, you also need to install [Watchman](https://facebook.github.io/watchman/) and ensure it is in your `$PATH` environment variable. There are other [recommended package installations](/docs/editor/setup/#post-installation) as well. - -## Launch - -After installation, launch Nuclide by [opening Atom](/docs/editor/basics/#opening). Once Atom -is open, you should see the Nuclide Home page. - -![](/static/images/docs/quick-start-getting-started-home.png) - -- The left side-pane is the Nuclide [Project Explorer](/docs/editor/basics/#project-explorer). -- The main pane contains introductory information about Nuclide and the Quick Launch Menu. This is also where you will edit your files (just like in normal Atom). -- The bottom status bar shows you error and health statistics. - -## Adding a Project - -The first common step after launching Nuclide is to open a project you would like to work on. -This could be a [Hack](/docs/languages/hack/), [Flow](/docs/languages/flow/), or any other project that has a root directory. - -To add a project, click the **Add Project Folder** button in the left side-pane, use the `Cmd-Shift-O` keyboard shortcut (`Ctrl-Shift-O` on Linux), or choose -`File | Add Project Folder` from the Atom menu bar. - -![](/static/images/docs/quick-start-getting-started-add-project.png) - -After adding a project you will see the root of your project at the top of the [Project Explorer's](/docs/editor/basics/#project-explorer) File Tree with all -files and folders as a tree hierarchy underneath it. - -![](/static/images/docs/quick-start-getting-started-file-tree-view.png) - -## Quick Launch Menu - -On the Nuclide Home page you will find the Quick Launch Menu that gives quick access to many of -the popular features of Nuclide. Click the **Try It** button of any feature to use it. - -![](/static/images/docs/quick-start-getting-started-quick-launch-menu.png) - -## Quick Open - -The [Quick Open](/docs/features/quick-open) feature gives you access to Nuclide's file -search mechanism, including [OmniSearch](/docs/features/quick-open/#omnisearch), which quickly displays recently opened files, quick searches for files based on partial names, and depending on the project, can search within files for symbols, etc. Click **Try It** or use the `Cmd-T` keyboard shortcut (`Ctrl-T` on Linux) to access the feature. - -![](/static/images/docs/quick-start-getting-started-quick-open.png) - -You can also search by filenames in your project, filenames of currently open files, and see which files have been -recently opened. - -## Remote Connection - -Nuclide provides the ability to do [remote development](/docs/features/remote/) out of the box. This -allows you to have Nuclide installed on a local machine, your project on a remote machine, and have -your editing experience be seamless between the two. - -Nuclide provides a *server* that bridges your local client with the remote development machine. In -order for remote development to work correctly, you must meet the -[prerequisites](/docs/features/remote/#nuclide-server__prerequisites) on the remote machine before -installing the Nuclide server. - -Once the prerequisites are met, you can -[install the server](/docs/features/remote/#nuclide-server__setup) on the remote machine. - -In order to connect to your remote project, click on the **Try It** button next to -**Remote Connection** in the Quick Launch Menu. You can also select `Nuclide | Remote Projects | Connect to Remote Project...`, -use the `Ctrl-Shift-Cmd-C` keyboard shortcut, or click **Add Remote Project Folder** -in the [Project Explorer](/docs/editor/basics/#project-explorer) (however, please note that if you have other projects open that button will not be there). - -![](/static/images/docs/quick-start-getting-started-remote-connection-dialog.png) - -Enter all the necessary credentials, including the username for logging into the remote server, the -server's address, and the actual root directory of the remote project you want to open. Then, if you installed the Nuclide Server as instructed, the **Remote Server Command** is -`nuclide-start-server`. - -Any changes you make in the local Nuclide editor will be communicated back to the remote server and -properly synchronized. diff --git a/docs/_includes/blog_pagination.html b/docs/_includes/blog_pagination.html deleted file mode 100644 index e26da279bc..0000000000 --- a/docs/_includes/blog_pagination.html +++ /dev/null @@ -1,28 +0,0 @@ - -{% if paginator.total_pages > 1 %} -
- -
-{% endif %} diff --git a/docs/_includes/content/gridblocks.html b/docs/_includes/content/gridblocks.html deleted file mode 100644 index d58078dde2..0000000000 --- a/docs/_includes/content/gridblocks.html +++ /dev/null @@ -1,6 +0,0 @@ -
-{% for item in {{include.data_source}} %} - {% include content/items/gridblock.html item=item gridtype=include.grid_type %} - {% cycle '', '
' %} -{% endfor %} -
diff --git a/docs/_includes/content/items/gridblock.html b/docs/_includes/content/items/gridblock.html deleted file mode 100644 index d79b5f868f..0000000000 --- a/docs/_includes/content/items/gridblock.html +++ /dev/null @@ -1,7 +0,0 @@ -
- {% if item.image %} - {{ item.title }} - {% endif %} -

{{ item.title }}

- {{ item.text | markdownify }} -
diff --git a/docs/_includes/doc.html b/docs/_includes/doc.html deleted file mode 100644 index ec63dd5cb8..0000000000 --- a/docs/_includes/doc.html +++ /dev/null @@ -1,23 +0,0 @@ -
-
-

{% if include.truncate %}{{ page.title }}{% else %}{{ page.title }}{% endif %}

-
- -
- {% if include.truncate %} - {% if page.content contains '' %} - {{ page.content | split:'' | first }} - - {% else %} - {{ page.content }} - {% endif %} - {% else %} - {{ content }} - {% endif %} -
- {% include doc_paging.html %} -
diff --git a/docs/_includes/doc_paging.html b/docs/_includes/doc_paging.html deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html deleted file mode 100644 index 3943a3d516..0000000000 --- a/docs/_includes/footer.html +++ /dev/null @@ -1,24 +0,0 @@ -
- -
- - - -{% comment %} -For Algolia search -{% endcomment %} - - - diff --git a/docs/_includes/head.html b/docs/_includes/head.html deleted file mode 100644 index 82ec24b92d..0000000000 --- a/docs/_includes/head.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - {% seo %} - - {% comment %} - For Algolia search - {% endcomment %} - - - {% comment %}Local "Gotham Rounded A" stylesheet{% endcomment %} - - - - - {% comment %} - The file below is the redirect destination of 'http://fb.me/react-with-addons-0.13.1.min.js'. Use - the final destination to eliminate a redirect for clients. - {% endcomment %} - - - {% comment %} - jQuery and ajax to automatically insert Atom and Node version dependencies into the documentation. - {% endcomment %} - - {% comment %} - For our RSS feed.xml - https://help.github.com/articles/atom-rss-feeds-for-github-pages/ - {% endcomment %} - {% feed_meta %} - diff --git a/docs/_includes/hero.html b/docs/_includes/hero.html deleted file mode 100644 index c7423f75ef..0000000000 --- a/docs/_includes/hero.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
-
-

An image management library

- -
-
diff --git a/docs/_includes/homeContent.html b/docs/_includes/homeContent.html deleted file mode 100644 index 44fbd4dfb4..0000000000 --- a/docs/_includes/homeContent.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
-
-

{{ site.tagline }}

-
-

{% if page.excerpt %}{{ page.excerpt | strip_html }}{% else %}{{ site.description }}{% endif %}

-
-
- Get Started or read more about using Nuclide for React Native, iOS, or Web development. -
-
- -
-
diff --git a/docs/_includes/nav.html b/docs/_includes/nav.html deleted file mode 100644 index dee708140b..0000000000 --- a/docs/_includes/nav.html +++ /dev/null @@ -1,108 +0,0 @@ -
-
- - -

{{ site.title }}

-
- - -
- - -
diff --git a/docs/_includes/nav_blog.html b/docs/_includes/nav_blog.html deleted file mode 100644 index ebbb173898..0000000000 --- a/docs/_includes/nav_blog.html +++ /dev/null @@ -1,85 +0,0 @@ - - - diff --git a/docs/_includes/nav_docs.html b/docs/_includes/nav_docs.html deleted file mode 100644 index 2fd641921f..0000000000 --- a/docs/_includes/nav_docs.html +++ /dev/null @@ -1,98 +0,0 @@ - - - diff --git a/docs/_includes/plugins/all_share.html b/docs/_includes/plugins/all_share.html deleted file mode 100644 index a62015b685..0000000000 --- a/docs/_includes/plugins/all_share.html +++ /dev/null @@ -1,3 +0,0 @@ -
- {% include plugins/like_button.html %} -
diff --git a/docs/_includes/plugins/button.html b/docs/_includes/plugins/button.html deleted file mode 100644 index 04c61c64cd..0000000000 --- a/docs/_includes/plugins/button.html +++ /dev/null @@ -1 +0,0 @@ -{{ include.button_text }} diff --git a/docs/_includes/plugins/group_join.html b/docs/_includes/plugins/group_join.html deleted file mode 100644 index b8fbbbc27c..0000000000 --- a/docs/_includes/plugins/group_join.html +++ /dev/null @@ -1 +0,0 @@ -{{ include.button_text }} diff --git a/docs/_includes/plugins/like_button.html b/docs/_includes/plugins/like_button.html deleted file mode 100644 index d403ec7d47..0000000000 --- a/docs/_includes/plugins/like_button.html +++ /dev/null @@ -1,18 +0,0 @@ -
- diff --git a/docs/_includes/plugins/post_social_plugins.html b/docs/_includes/plugins/post_social_plugins.html deleted file mode 100644 index cb4d6e2ece..0000000000 --- a/docs/_includes/plugins/post_social_plugins.html +++ /dev/null @@ -1,34 +0,0 @@ -
- -
-
- - - diff --git a/docs/_includes/plugins/slideshow.html b/docs/_includes/plugins/slideshow.html deleted file mode 100644 index 5d2a7d993f..0000000000 --- a/docs/_includes/plugins/slideshow.html +++ /dev/null @@ -1,87 +0,0 @@ -
- - diff --git a/docs/_includes/post.html b/docs/_includes/post.html deleted file mode 100644 index 26a37c58ef..0000000000 --- a/docs/_includes/post.html +++ /dev/null @@ -1,22 +0,0 @@ -
- {% assign author = site.data.authors[include.post.author] %} -
- {% if author.fbid %} -
- {{ author.fullname }} -
- {% endif %} - {% if author.full_name %} - - {% endif %} -

{% if include.truncate %}{{ include.post.title }}{% else %}{{ include.post.title }}{% endif %}

- -
- -
- {{ include.post.content | markdownify }} - {% unless include.truncate %} - {% include plugins/all_share.html %} - {% endunless %} -
-
diff --git a/docs/_includes/social_plugins.html b/docs/_includes/social_plugins.html deleted file mode 100644 index db4f1aecdd..0000000000 --- a/docs/_includes/social_plugins.html +++ /dev/null @@ -1,24 +0,0 @@ - -
- -
- - - diff --git a/docs/_includes/ui/button.html b/docs/_includes/ui/button.html deleted file mode 100644 index e663e85eff..0000000000 --- a/docs/_includes/ui/button.html +++ /dev/null @@ -1 +0,0 @@ -{{ include.button_text }} diff --git a/docs/_layouts/blog.html b/docs/_layouts/blog.html deleted file mode 100644 index 419180fddc..0000000000 --- a/docs/_layouts/blog.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -category: blog -layout: default ---- - -
-
-
- {% include nav_blog.html %} -
- {{ content }} -
-
-
-
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html deleted file mode 100644 index ad2681b6b2..0000000000 --- a/docs/_layouts/default.html +++ /dev/null @@ -1,10 +0,0 @@ - - - {% include head.html %} - - {% include nav.html alwayson=true %} - {{ content }} - {% include footer.html %} - - - diff --git a/docs/_layouts/doc_page.html b/docs/_layouts/doc_page.html deleted file mode 100644 index f9fe5c8d5b..0000000000 --- a/docs/_layouts/doc_page.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: default ---- - -
-
- {% include nav_docs.html %} - {{ content }} -
-
diff --git a/docs/_layouts/docs.html b/docs/_layouts/docs.html deleted file mode 100644 index 1b9aa9e8e7..0000000000 --- a/docs/_layouts/docs.html +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: doc_page ---- - -{% include doc.html %} diff --git a/docs/_layouts/home.html b/docs/_layouts/home.html deleted file mode 100644 index e3595df98b..0000000000 --- a/docs/_layouts/home.html +++ /dev/null @@ -1,14 +0,0 @@ - - - {% include head.html %} - - {% include nav.html alwayson=true %} - {% include homeContent.html %} -
-
- {{ content }} -
-
- {% include footer.html %} - - diff --git a/docs/_layouts/page.html b/docs/_layouts/page.html deleted file mode 100644 index af1b08ff4d..0000000000 --- a/docs/_layouts/page.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: default ---- -
-
- {% include nav_blog.html %} - {{ content }} -
-
diff --git a/docs/_layouts/plain.html b/docs/_layouts/plain.html deleted file mode 100644 index 71fbd8306f..0000000000 --- a/docs/_layouts/plain.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: default ---- - -
-
- {{ content }} -
-
diff --git a/docs/_layouts/post.html b/docs/_layouts/post.html deleted file mode 100644 index d361eb981f..0000000000 --- a/docs/_layouts/post.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -collection: blog -layout: page ---- - -{% include post.html post=page %} diff --git a/docs/_layouts/redirect.html b/docs/_layouts/redirect.html deleted file mode 100644 index c24f817484..0000000000 --- a/docs/_layouts/redirect.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/_layouts/top-level.html b/docs/_layouts/top-level.html deleted file mode 100644 index 71fbd8306f..0000000000 --- a/docs/_layouts/top-level.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: default ---- - -
-
- {{ content }} -
-
diff --git a/docs/_posts/2016-01-13-Nuclide-v0.111.0-The-Unified-Package.md b/docs/_posts/2016-01-13-Nuclide-v0.111.0-The-Unified-Package.md deleted file mode 100644 index 8534f4083b..0000000000 --- a/docs/_posts/2016-01-13-Nuclide-v0.111.0-The-Unified-Package.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -layout: post -title: "Nuclide v0.111.0: The Unified Package" -author: zertosh ---- - -This is a significant release for Nuclide that is mainly aimed at improving and simplifying Nuclide as an open source project. The most apparent and important change is moving Nuclide from many Atom -packages—44 of them to be exact—to just one: `nuclide`. We will discuss below why we are excited -about moving to a single package and how it improves Nuclide for everyone, but first we will cover -how to get going with the new release. - -## Installing Nuclide v0.111.0 - -Nuclide v0.111.0 is a single Atom package. To install it, you can either search for the -['nuclide' Atom package](https://atom.io/packages/nuclide) in *Atom > Packages > Install* or install -it from the command line with `apm`. While this release focuses on moving to a single package, it -does include fixes and improvements that you can find in the -[CHANGELOG.md](https://github.com/facebook/nuclide/blob/v0.111.0/CHANGELOG.md). - -```bash -$ apm install nuclide -``` - -#### Installing Nuclide Server v0.111.0 - -Nuclide's server has moved into the ['nuclide' NPM package](https://www.npmjs.com/package/nuclide). -The server is required only if you intend to edit remote files from within Atom+Nuclide, and it -should be installed on the host where the remote files live. We recommend installing the server as -a global module using NPM's `-g` flag so its binaries are available in '/usr/local/bin'. - -```bash -$ npm install -g nuclide -``` - -### New Version Scheme - -The last version of the Nuclide packages that were published was v0.0.35. Internally, however, the -server was last released as v0.108.0. This release adopts our internal version scheme so the -versions stay in sync with open source releases. - -### Migrating from Previous Versions - -If you previously installed Nuclide via the `nuclide-installer` package or by installing `nuclide-` -packages individually, you should uninstall them first. Follow the -[v0.0.35 uninstall instructions](/docs/editor/uninstall/#v0-0-35-and-prior) to ensure previous -versions of Nuclide are removed. - -The new 'nuclide' package will automatically disable any deprecated 'nuclide-*' packages and warn -you on start up that you should uninstall them to ensure everything works as expected. - -## Configuring Single-package Nuclide - -Because Nuclide is now a single Atom Package, its settings are unified under the 'nuclide' package -in *Atom > Packages > nuclide > Settings*. - -![](/static/images/blog/nuclide-atom-settings.png) - -Features you may have been familiar with as separate packages before, such as Hyperclick, -Diagnostics, and File Tree, are now listed as features in Nuclide's Settings page and are togglable -as if they were Atom packages. If you want to use only one or a few of the features of Nuclide, you -can disable the rest of Nuclide without incurring any load time for the disabled features' code. All -features are enabled by default. - -![](/static/images/blog/nuclide-feature-settings.png) - -### Migrating Settings from Previous Packages - -If you changed settings in any of Nuclide's previous packages, the settings will be automatically -migrated to their new location in the `nuclide.` namespace when you first launch Atom after -installing the 'nuclide' package. The settings will be configurable like before but under the -*Atom > Packages > nuclide > Settings* rather than under the package's name. - -## Why a Single Atom Package? - -The Atom ecosystem is centered around modular packages that can be installed and updated -independently, and Nuclide took that same approach from the start. We wrote scripts to let our code -live in a single repository but be released as many Atom packages. Nuclide releases were actually -simultaneous releases of 40+ Atom packages. While this fit well with the Atom model, it meant we -also had to distribute a "installer" package that oversaw the installation of top-level Atom -packages. - -In practice, the installer process was computationally expensive, difficult to -troubleshoot, and took roughly 40 minutes partially due to large amounts of network traffic. When -all Nuclide packages were installed, they filled over 3GB of disk space. Nuclide packages are -heavily interdependent, and because they were installed as top-level Atom packages they each had -their own 'node_modules' directory with largely duplicate dependencies. - -By unifying Nuclide into a single Atom package, we aimed to improve installation, updates, and -maintenance. The single 'nuclide' package does not require a special installer, only `apm install` -like other Atom packages. This simplifies installation for everyone and makes Nuclide updates fast. -Once installed, the 'nuclide' package takes under 110MB of disk space, a 95%+ reduction in disk use, -and subsequently, network use during installation. The dramatic drop in disk use was possible -because Nuclide's features now share a single 'node_modules' directory and use relative paths to -require one another, eliminating the duplicate dependencies present when Nuclide was 40+ top-level -Atom packages. - -## What's Next? - -We are excited to greatly improve the experience of Nuclide for users outside Facebook. This release -should solve many of the most common installation and upgrade issues that have been reported, and it -paves the way for more frequent and more stable releases. We hope that simplifying the installation -process will make [Nuclide's source](https://github.com/facebook/nuclide) more familiar to other -Atom developers and make it easier for anyone to contribute. - -If you run into issues with the upgrade process, or if you run into any issue at all, open a -[Nuclide GitHub issue](https://github.com/facebook/nuclide/issues) so we can help out. diff --git a/docs/_posts/2017-02-27-Command-Click-You-Have-One-Job.md b/docs/_posts/2017-02-27-Command-Click-You-Have-One-Job.md deleted file mode 100644 index 4929c3a1a3..0000000000 --- a/docs/_posts/2017-02-27-Command-Click-You-Have-One-Job.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -layout: post -title: "Command + Click: You Have One Job" -author: matthewwithanm ---- - -One of the cool things about Nuclide is that, even though it’s an IDE with a ton -of awesome IDE features, it still belongs to the TextMate/Sublime/Atom lineage -of modern text editors. Unfortunately, sometimes these two things come into -conflict. Such is the case with command click. - -See, in the Atom family of editors, command + click (control + click on Windows -and Linux) means multiple cursors. But if you’re coming from an IDE, you’re -probably used to using command + click to jump to a definition (“Hyperclick”). - -Since Nuclide is both of these things, we’ve always tried to do both: if you -clicked on something that we could get a definition for, we’d take you to it; -otherwise, we’d let Atom do its default behavior (add another cursor). This way -we only interfered with expected Atom behavior when we knew we were supposed to. -Perfect! Right? - -An internal poll - -It turns out that, in trying to accommodate everybody, we hadn’t made command + -click predictable to anybody. It’s true: when you command click on something, -you may want to go to its definition. Or you may want to add another cursor. But -nobody wants to sometimes go to its definition and sometimes add a cursor. Sorry -about that. - -So as of [v0.207][1] (rolled out last week!), command clicking will always jump -to definition. - -# Upgrade Path - -We know that these kind of breaking changes are disruptive, so the first time -you command + click, we’ll show you a one-time notification explaining the -situation: - - - -Don’t despair, multicursor fans! command + option + click still works! (In -Sublime too.) Or if you really insist on using command + click for multiple -cursors, you can change the Hyperclick trigger to something else in the Nuclide -package’s settings. - -[1]: https://github.com/facebook/nuclide/releases/tag/v0.207.0 diff --git a/docs/_posts/2017-08-31-Code-Search.md b/docs/_posts/2017-08-31-Code-Search.md deleted file mode 100644 index 734e03b21d..0000000000 --- a/docs/_posts/2017-08-31-Code-Search.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: post -title: "Code Search" -author: a20012251 ---- - -One of the missing features in the [Quick Open](/docs/features/quick-open) pane is searching for -code in your current projects. Internally at Facebook, we have a plugin that provides this -functionality but we never offered a similar tool for the open source world. And we've just published this missing feature!! - -Now you can use Quick Open (*command + T* on Mac and *control + T* on Windows and Linux) and type any -code you want to look for. You can also explore the *Code Search* tab. - -Quick Open - -Code Search supports [ripgrep](https://github.com/BurntSushi/ripgrep) (rg), -[silversearcher](https://github.com/ggreer/the_silver_searcher) (ag) and -[ack](https://beyondgrep.com/). We recommend ripgrep and ag because they are blazing fast. Sadly, -only ripgrep works properly on Windows. You can configure which tool to use in the Nuclide package -settings under the *nuclide-code-search* tab. - -If you don't specifically select a tool, Nuclide will try to use any available one. On Windows, it -will only try rg. - -Settings diff --git a/docs/_posts/2017-09-12-Introducing-Atom-IDE-UI.md b/docs/_posts/2017-09-12-Introducing-Atom-IDE-UI.md deleted file mode 100644 index 80fb29d285..0000000000 --- a/docs/_posts/2017-09-12-Introducing-Atom-IDE-UI.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -layout: post -title: "Introducing Atom IDE UI" -author: hansonw ---- - -Since the beginning, Nuclide has strived to provide a feature-rich IDE -experience on top of Atom, with functionality like -[code diagnostics](https://nuclide.io/docs/languages/flow/#code-diagnostics), -[jump to definition](https://nuclide.io/docs/languages/flow/#jump-to-definition), -and much more. However, over time we've heard feedback that the -"one-size-fits-all" philosophy can be overwhelming for many Atom users. - -That's why we're proud to announce the new -[Atom IDE UI](https://atom.io/packages/atom-ide-ui) package, which is part of -our collaboration with GitHub in the broader -[Atom IDE](https://atom.io/ide) initative. Read -more about that on [the Atom blog](http://blog.atom.io/2017/09/12/announcing-atom-ide.html). - -![Screenshot](/static/images/blog/2017-09-12/atom-ide-ui.png) - -Atom IDE UI is fast and lightweight by design. It extracts only the subset of the -core UI features from Nuclide necessary to support Atom's -[atom-languageclient](https://github.com/atom/atom-languageclient) -library in displaying features supported by the [language server protocol]( -http://langserver.org/). Like Nuclide, it's a [unified package]( -https://nuclide.io/blog/2016/01/13/Nuclide-v0.111.0-The-Unified-Package/) which -contains the following features: - -- [Diagnostics](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/diagnostics.md) -- [Definitions](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/definitions.md) -- [Find References](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/find-references.md) -- [Outline View](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/outline-view.md) -- [Datatips](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/datatips.md) -- [Code Formatting](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/code-format.md) -- [Code Actions](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/code-actions.md) -- [Code Highlight](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/code-highlight.md) -- [Busy Signal](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/busy-signal.md) - -Atom IDE UI is designed to work out-of-the-box with packages using -[atom-languageclient](https://github.com/atom/atom-languageclient), such as -[ide-typescript](https://atom.io/packages/ide-typescript) and our own -[ide-flowtype](https://atom.io/packages/ide-flowtype). - -As always, these features can be also be used directly via Atom services. -Documentation for these APIs is available inside the -[atom-ide-ui repository](https://github.com/facebook-atom/atom-ide-ui/tree/master/docs). - -## Getting started - -Using Atom IDE UI is as simple as: - -1. Install the [`atom-ide-ui` Atom package](https://atom.io/packages/atom-ide-ui) -2. Install an "ide-" package for your favourite language: - * [TypeScript](https://www.typescriptlang.org/): [`ide-typescript`](https://atom.io/packages/ide-typescript) - * [Flow](https://flow.org): [`ide-flowtype`](https://atom.io/packages/ide-flowtype) - * Java: [`ide-java`](https://atom.io/packages/ide-java) - * C#: [`ide-csharp`](https://atom.io/packages/ide-csharp) - * [Full list at the atom-languageclient wiki](https://github.com/atom/atom-languageclient/wiki/List-of-Atom-packages-using-Atom-LanguageClient) - -Note that if you're already a Nuclide user, all of Atom IDE UI's features will -still be bundled inside of Nuclide, so there's no need to install another -package. - -## Roadmap - -The list of features in Atom IDE UI doesn't yet encompass all the features -available in the language service protocol, and over time we'll be working to -fill in the gaps. In particular, we're looking to add: - -- [code lenses](https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textDocument_codeLens) -- [rename support](https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textDocument_rename) -- [function signature help](https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textDocument_signatureHelp) - -Our hope is that other Nuclide features will eventually also become part of the -Atom IDE effort, including key components like the [Nuclide debugger]( -https://nuclide.io/docs/features/debugger/). Note that we're still committed to -supporting the open-source Nuclide package for the foreseeable future. - -Contributions and bug reports are welcome over at -[facebook-atom/atom-ide-ui](https://github.com/facebook-atom/atom-ide-ui)! - -The Atom IDE UI code is released under the BSD-3-Clause license. diff --git a/docs/_sass/_base.scss b/docs/_sass/_base.scss deleted file mode 100644 index 51eea88ff6..0000000000 --- a/docs/_sass/_base.scss +++ /dev/null @@ -1,974 +0,0 @@ -body { - background: $footer-bg; - color: $text; - font: 300 #{$base-font-size}/#{$base-line-height} $base-font-family; - text-align: center; - text-rendering: optimizeLegibility; -} - -img { - max-width: 100%; -} - -article { - p { - img { - max-width: 100%; - display:block; - margin-left: auto; - margin-right: auto; - } - } -} - -a { - border-bottom: 1px dotted $primary-bg; - color: $text; - text-decoration: none; - -webkit-transition: background 0.3s, color 0.3s; - transition: background 0.3s, color 0.3s; -} - -blockquote { - padding: 15px 30px 15px 15px; - margin: 20px 0 0 10px; - background-color: rgba(204, 122, 111, 0.1); - border-left: 10px solid rgba(191, 87, 73, 0.2); -} - -#fb_oss a { - border: 0; -} - -h1, h2, h3, h4 { - font-family: $header-font-family; -} - -.headerBarContainer { - background: $primary-bg; - color: $header-text; - height: $header-height; - opacity: 0.0; - padding: $header-ptop 0 $header-pbot; - position: relative; - -webkit-transition: opacity 0.2s ease-in-out; - transition: opacity 0.2s ease-in-out; - width: 100%; - z-index: 9999; - - &.visible { - opacity: 1.0; - } - - a { - border: 0; - color: $header-text; - } - - header { - height: $header-height; - margin: 0 auto; - max-width: $content-width; - padding: 0 20px; - position: relative; - text-align: left; - - img { - height: 30px; - margin-right: 10px; - } - - h2 { - display: inline; - font-family: $header-font-family; - font-size: 16px; - letter-spacing: -0.02em; - line-height: 18px; - position: relative; - top: -9px; - } - } - - .navigationWrapper { - display: inline-block; - font-family: $header-font-family; - - &.navigationFull { - display: none; - } - - &.navigationSlider { - position:absolute; - right: 12px; - z-index:99; - - .navSlideout { - cursor: pointer; - font-size: 24px; - padding-top: 5px; - -webkit-transition: -webkit-transform 0.3s; - transition: transform 0.3s; - } - - .slidingNav { - background: #222; - box-sizing: border-box; - height: 100vh; - opacity: 0; - overflow: hidden; - padding: 0; - position: absolute; - right: -12px; - top: $header-height + $header-pbot; - -webkit-transition: opacity 0.5s, width 0.5s; - transition: opacity 0.5s, width 0.5s; - width: 0; - - &.slidingNavActive { - opacity: 1; - width: 75vw; - } - - ul { - list-style: none; - padding-left: 0; - - li { - padding: 0; - a { - border-bottom: 1px solid #111; - display:block; - padding: 4vw 12px; - -webkit-transition: background-color 0.3s; - transition: background-color 0.3s; - - &:focus, - &:hover { - background: $primary-bg; - } - } - } - } - } - } - } -} - -.homeContainer { - background: $primary-bg; - color: $header-text; - - a { - color: $header-text; - } - - .homeWrapper { - padding-bottom: 2em; - padding-top: 2em; - text-align: left; - - .wrapper { - margin: 0px auto; - max-width: $content-width; - padding: 0 20px; - } - - .projectLogo { - pointer-events: none; - img { - height: 100px; - margin-bottom: 0px; - pointer-events: auto; - } - } - - h1#project_title { - font-family: $header-font-family; - font-size: 300%; - letter-spacing: -0.08em; - line-height: 1em; - margin-bottom: 80px; - } - - h2#project_tagline { - font-family: $header-font-family; - font-size: 200%; - letter-spacing: -0.04em; - line-height: 1em; - } - } -} - -.wrapper { - margin: 0px auto; - max-width: $content-width; - padding: 0 20px; -} - -.footerContainer { - background: $footer-bg; - - .footerWrapper { - padding-top: 4vh; - padding-bottom: 4vh; - } -} - - -.projectLogo { - display: none; - - img { - height: 100px; - margin-bottom: 0px; - } -} - -section#intro { - margin: 40px 0; -} - -.fbossFontLight { - font-family: $base-font-family; - font-weight: 300; - font-style: normal; -} - -.fb-like { - display: block; - margin-bottom: 50px; - width: 100%; -} - -a.blockButton { - background: $primary-bg; - border-radius: 4px; - border: 2px solid transparent; - clear: both; - color: $header-text; - display: inline-block; - font-family: $header-font-family; - font-size: 120%; - padding: 10px 20px; - position: relative; - -webkit-transition: background-color 0.2s, color 0.2s, border 0.2s; - transition: background-color 0.2s, color 0.2s, border 0.2s; - - .mainContainer .mainWrapper &:hover, - .mainContainer .mainWrapper &:focus { - background: $secondary-bg; - border: 2px solid $primary-bg; - color: $primary-bg; - } - - .homeContainer &{ - background: $light-color; - color: $light-text-color; - - &:hover, - &:focus { - background: $primary-bg; - border: 2px solid $light-color; - color: $light-text-color; - } - } -} - -.promoSection { - font-size: 125%; - line-height: 1.6em; - margin: 0; - position: relative; - z-index: 99; - - a { - border-bottom: 3px solid $light-color; - color: lighten($light-color, 20%); - } -} - -.center { - display: block; - text-align: center; -} - -.mainContainer { - background: $secondary-bg; - overflow: auto; - padding: 0 4vw; - - .mainWrapper { - padding-bottom: 4vh; - padding-top: 4vh; - text-align: left; - - .blogWrapper .blogPostWrapper { - .post { - margin-bottom: 50px; - } - } - - .blockButton { - margin: 4vh 0; - - &.marginsmall { - margin: 1vh 0; - } - } - - .allShareBlock { - margin: -12px; - padding: 1vh 0; - - .pluginBlock { - margin: 12px; - padding: 0; - } - } - - a { - &:hover, - &:focus { - background: $primary-bg; - color: $header-text; - } - } - - em { - font-style: italic; - } - - strong, b { - font-weight: bold; - } - - h1 { - font-size: 300%; - line-height: 1em; - padding: 1.4em 0 1em; - text-align: center; - } - - h2 { - font-size: 250%; - line-height: 1em; - padding: 1.4em 0 1em; - text-align: left; - } - - h3 { - font-size: 150%; - line-height: 1em; - padding: 1em 0 0.8em; - } - - p { - padding: 0.8em 0; - } - - ol { - list-style: decimal; - } - - ul { - list-style: disc; - } - - ol, ul { - padding-left: 24px; - li { - padding-bottom: 4px; - padding-left: 6px; - } - } - - strong { - font-weight: bold; - } - - nav.toc { - position: relative; - section { - background: $primary-bg; - color: $header-text; - margin-bottom: 2vh; - padding: 12px 24px; - - .navGroup { - h3 { - display: none; - } - - &:not(.navGroupActive) { - display: none; - } - } - } - - .toggleNav { - position: relative; - } - - .navToggle { - background: $primary-bg; - color: $header-text; - font-size: 12px; - height: 24px; - position: absolute; - right: 0; - text-align: center; - top: 0; - width: 24px; - - i { - cursor: pointer; - } - } - - .toggleNavActive { - section { - .navGroup { - display: block; - - h3 { - display: block; - } - - ul li { - display: block; - } - } - - ul li { - display: block; - padding-bottom: 4px; - } - } - } - - h3 { - font-size: 125%; - padding-right: 24px; - padding-top: 0.4em; - } - - ul { - padding-left: 0; - padding-right: 24px; - - li { - list-style-type: none; - padding-bottom: 0; - padding-left: 0; - - &:not(.navListItemActive) { - display: none; - } - - a { - border-bottom: none; - border-left: 4px solid transparent; - color: $header-text; - display: inline-block; - margin-bottom: 0.6vh; - padding: 1vh 0 0.4vh 8px; - -webkit-transition: border-color 0.3s; - transition: border-color 0.3s; - - &:hover, - &:focus { - border-left: 4px solid $nav-text; - } - - &.navItemActive { - border-left: 4px solid $header-text; - } - } - } - } - } - - .post { - background: #fff; - padding: 6vw 6vw 8vh; - position: relative; - - a { - color: $link-color; - - &:hover, - &:focus { - color: #fff; - } - } - - h2 { - border-bottom: 4px solid $primary-bg; - font-size: 130%; - } - - h3 { - border-bottom: 1px solid $primary-bg; - font-size: 110%; - } - - .authorPhoto { - border-radius: 50%; - height: 50px; - left: 50%; - margin-left: -25px; - overflow: hidden; - position: absolute; - top: -25px; - width: 50px; - } - - .post-header { - padding: 0 0 1em; - text-align: center; - - h1 { - font-size: 150%; - line-height: 1em; - padding: 0.4em 0 0; - - a { - border: none; - } - } - - .post-authorName { - color: $primary-bg; - font-family: $header-font-family; - margin-top: -2vw; - text-align: center; - } - - .post-meta { - color: $primary-bg; - font-family: $header-font-family; - text-align: center; - } - } - - .postSocialPlugins { - padding-top: 1em; - } - - .docPagination { - background: $primary-bg; - bottom: 0px; - left: 0px; - position: absolute; - right: 0px; - - .pager { - display: inline-block; - width: 50%; - } - - .pagingNext { - float: right; - text-align: right; - } - - a { - border: none; - color: $header-text; - display: block; - padding: 4px 12px; - - &:hover { - background-color: $secondary-bg; - color: $text; - } - - .pagerLabel { - display: inline; - } - - .pagerTitle { - display: none; - } - } - } - } - - .posts { - .post { - margin-bottom: 6vh; - } - } - } -} - -.gridBlock { - margin: 20px 0; - padding: 2vh 0; - - .twoByGridBlock { - padding: 0; - - img { - margin-top: 6vh; - max-width: 100%; - } - - &.featureBlock h3 { - font-size: 150%; - margin: 20px 0; - padding-bottom: 0; - } - } - - .gridClear { - clear: both; - } - - .leftBlock { - padding: 40px 0; - text-align: left; - } -} - -#integrations_title { - font-size: 250%; - margin: 80px 0; -} - -.ytVideo { - height: 0; - overflow: hidden; - padding-bottom: 53.4%; /* 16:9 */ - padding-top: 25px; - position: relative; -} - -.ytVideo iframe, -.ytVideo object, -.ytVideo embed { - height: 100%; - left: 0; - position: absolute; - top: 0; - width: 100%; -} - -@media only screen and (min-width: 480px) { - h1#project_title { - font-size: 500%; - } - - h2#project_tagline { - font-size: 250%; - } - - .projectLogo { - img { - margin-bottom: 10px; - height: 200px; - } - } - - .headerBarContainer { - .navigationWrapper { - &.navigationSlider { - - .slidingNav { - right: -22px; - - &.slidingNavActive { - width: 50vw; - } - - ul { - li { - a { - padding: 1vw 12px; - } - } - } - } - } - } - } - - .gridBlock { - margin: -20px; - overflow: auto; - padding: 1vh 0; - - .twoByGridBlock { - box-sizing: border-box; - float: left; - padding: 20px; - text-align: center; - width: 50%; - } - - .centerInGrid { - margin-left: 25%; - } - - .leftBlock { - padding: 40px 20px; - } - } - - .mainContainer { - .mainWrapper { - nav.toc { - h3 { - padding-top: 0.4em; - } - - ul li a { - margin-bottom: 0; - padding-bottom: 0.2vh; - padding-top: 0; - display: block; - } - - .navToggle { - top: 12px; - } - } - - .post { - padding: 4vw 4vw 4em; - - h2 { - font-size: 180%; - } - - h3 { - font-size: 120%; - } - - .post-header { - padding: 1em 0; - } - - .docPagination { - a { - .pagerLabel { - display: none; - } - .pagerTitle { - display: inline; - } - } - } - } - } - } -} - -@media only screen and (min-width: 900px) { - .homeContainer { - .homeWrapper { - padding-bottom: 4em; - position: relative; - - #inner { - box-sizing: border-box; - max-width: 600px; - padding-right: 40px; - } - - .projectLogo { - align-items: center; - bottom: 0; - display: flex; - justify-content: flex-end; - left: 0; - padding: 2em 20px 4em; - position: absolute; - right: 20px; - top: 0; - - img { - height: 100%; - } - } - } - } - - .headerBarContainer { - .navigationWrapper { - nav { - padding: 0 1em; - position: relative; - top: -9px; - - ul { - margin: 0 -0.4em; - li { - display: inline-block; - - a { - padding: 14px 0.4em; - border: 0; - color: $nav-text; - display: inline-block; - - &:hover { - color: $header-text; - } - } - - &.navItemActive { - a { - color: $header-text; - } - } - } - } - } - - &.navigationFull { - display: inline-block; - } - - &.navigationSlider { - display: none; - } - } - } -} - -@media only screen and (min-width: 1024px) { - .mainContainer { - .mainWrapper { - .blogWrapper { - display: flex; - nav.toc { - width: 400px; - } - } - nav.toc { - box-sizing: border-box; - display: inline-block; - border-right: 12px solid $secondary-bg; - width: 285px; - vertical-align: top; - - .navToggle { - display: none; - } - - .toggleNav { - section { - .navGroup { - display: block; - - h3 { - display: block; - } - - ul li { - display: block; - } - } - - ul li { - display: block; - padding-bottom: 4px; - } - } - } - ul li a { - font-size: 14px; - padding-bottom: 0.1vh; - } - } - - .post { - box-sizing: border-box; - display: inline-block; - padding: 2vw 24px 4em; - width: 590px; - - .post-header { - h1 { - font-size: 250%; - } - } - } - - .posts { - display: inline-block; - width: 590px; - - .post { - margin-bottom: 4vh; - width: 100%; - } - } - } - } -} - -@media only screen and (min-width: 1040px) { - .mainContainer { - .mainWrapper { - nav.toc { - width: 300px; - } - } - } -} - -@media only screen and (min-width: 1200px) { - .homeContainer { - .homeWrapper { - #inner { - max-width: 750px; - } - } - } - - .headerBarContainer { - header { - max-width: 1100px; - } - } - - .wrapper { - max-width: 1100px; - } - - .mainContainer .mainWrapper { - .post, .posts { - width: 760px; - } - } -} - -@media only screen and (min-width: 1500px) { - .homeContainer { - .homeWrapper { - #inner { - max-width: 1100px; - padding-bottom: 40px; - padding-top: 40px; - } - } - } - - .headerBarContainer { - header { - max-width: 1400px; - } - } - - .wrapper { - max-width: 1400px; - } - - .mainContainer .mainWrapper { - .post, .posts { - width: 1035px; - } - } -} diff --git a/docs/_sass/_reset.scss b/docs/_sass/_reset.scss deleted file mode 100644 index 45bd74b6a4..0000000000 --- a/docs/_sass/_reset.scss +++ /dev/null @@ -1,43 +0,0 @@ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} -body { - line-height: 1; -} -ol, ul { - list-style: none; -} -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} diff --git a/docs/_sass/_search.scss b/docs/_sass/_search.scss deleted file mode 100644 index 9cbeff3692..0000000000 --- a/docs/_sass/_search.scss +++ /dev/null @@ -1,116 +0,0 @@ -/** Algolia Doc Search **/ - -::-webkit-input-placeholder { /* Safari, Chrome */ - color: $nav-text; -} -:-moz-placeholder { /* Mozilla Firefox <= 18 */ - color: $nav-text; - opacity: 1; -} -::-moz-placeholder { /* Mozilla Firefox 19+ */ - color: $nav-text; - opacity: 1; -} -:-ms-input-placeholder { /* Internet Explorer */ - color: $nav-text; -} -:placeholder-shown { /* Standard (https://drafts.csswg.org/selectors-4/#placeholder) */ - color: $nav-text; -} - -[type="search"] { - -moz-appearance: textfield; - -webkit-appearance: textfield; - appearance: textfield; -} - -div.algolia-search-wrapper { - display: inline-block; - vertical-align: top; - margin-left: 15px; -} - -@media screen and (max-width: 960px) { - div.algolia-search-wrapper { - display: none; - } -} - -input#algolia-doc-search { - font-family: $header-font-family; - - background: transparent url('/static/search.png') no-repeat left center; - background-size: 16px 16px; - - padding-left: 20px; - margin-left: 10px; - font-size: 16px; - line-height: 20px; - background-color: $nav-bg; - border: none; - color: white; - outline: none; - width: 160px; - - transition: border-color .2s ease, width .2s ease; - -webkit-transition: border-color .2s ease, width .2s ease; - -moz-transition: border-color .2s ease, width .2s ease; - -o-transition: border-color .2s ease, width .2s ease; -} - -input#algolia-doc-search:focus { - border-color: #05A5D1; - width: 240px; -} - -@media screen and (max-width: 1085px) { - input#algolia-doc-search:focus { - width: 178px; - } -} - -.algolia-autocomplete { - vertical-align: top; - font-family: $header-font-family; -} - -/* Bottom border of each suggestion */ -.algolia-docsearch-suggestion { - border-bottom-color: #2F0A57; -} -/* Main category headers */ -.algolia-docsearch-suggestion--category-header { - background-color: #2F0A57; -} -/* Highlighted search terms */ -.algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight { - color: #C897FF; -} -.algolia-docsearch-suggestion--title .algolia-docsearch-suggestion--highlight, -.algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--highlight { - color: #4A078E; -} -.algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight { - background-color: #C897FF; -} -/* Currently selected suggestion */ -.aa-cursor .algolia-docsearch-suggestion--content { - color: #151515; -} -.aa-cursor .algolia-docsearch-suggestion { - background: #F3E8FF; -} - -/* For bigger screens, when displaying results in two columns */ -@media (min-width: 768px) { - /* Bottom border of each suggestion */ - .algolia-docsearch-suggestion { - border-bottom-color: #2F0A57; - } - /* Left column, with secondary category header */ - .algolia-docsearch-suggestion--subcategory-column { - border-right-color: #2F0A57; - background-color: #E4E4E4; - color: #151515; - } -} diff --git a/docs/_sass/_slideshow.scss b/docs/_sass/_slideshow.scss deleted file mode 100644 index cd98a6cdba..0000000000 --- a/docs/_sass/_slideshow.scss +++ /dev/null @@ -1,48 +0,0 @@ -.slideshow { - position: relative; - - .slide { - display: none; - - img { - display: block; - margin: 0 auto; - } - - &.slideActive { - display: block; - } - - a { - border: none; - display: block; - } - } - - .pagination { - display: block; - margin: -10px; - padding: 1em 0; - text-align: center; - width: 100%; - - .pager { - background: transparent; - border: 2px solid rgba(255, 255, 255, 0.5); - border-radius: 50%; - cursor: pointer; - display: inline-block; - height: 12px; - margin: 10px; - transition: background-color 0.3s, border-color 0.3s; - width: 12px; - - &.pagerActive { - background: rgba(255, 255, 255, 0.5); - border-width: 4px; - height: 8px; - width: 8px; - } - } - } -} diff --git a/docs/_sass/_syntax-highlighting.scss b/docs/_sass/_syntax-highlighting.scss deleted file mode 100644 index b84b8bd638..0000000000 --- a/docs/_sass/_syntax-highlighting.scss +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Syntax highlighting styles - */ -.highlighter-rouge { - .c { color: #998; font-style: italic } // Comment - .err { color: #a61717; background-color: #e3d2d2 } // Error - .k { font-weight: bold } // Keyword - .o { font-weight: bold } // Operator - .cm { color: #998; font-style: italic } // Comment.Multiline - .cp { color: #999; font-weight: bold } // Comment.Preproc - .c1 { color: #998; font-style: italic } // Comment.Single - .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special - .gd { color: #000; background-color: #fdd } // Generic.Deleted - .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific - .ge { font-style: italic } // Generic.Emph - .gr { color: #a00 } // Generic.Error - .gh { color: #999 } // Generic.Heading - .gi { color: #000; background-color: #dfd } // Generic.Inserted - .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific - .go { color: #888 } // Generic.Output - .gp { color: #555 } // Generic.Prompt - .gs { font-weight: bold } // Generic.Strong - .gu { color: #aaa } // Generic.Subheading - .gt { color: #a00 } // Generic.Traceback - .kc { font-weight: bold } // Keyword.Constant - .kd { font-weight: bold } // Keyword.Declaration - .kp { font-weight: bold } // Keyword.Pseudo - .kr { font-weight: bold } // Keyword.Reserved - .kt { color: #458; font-weight: bold } // Keyword.Type - .m { color: #099 } // Literal.Number - .s { color: #d14 } // Literal.String - .na { color: #008080 } // Name.Attribute - .nb { color: #0086B3 } // Name.Builtin - .nc { color: #458; font-weight: bold } // Name.Class - .no { color: #008080 } // Name.Constant - .ni { color: #800080 } // Name.Entity - .ne { color: #900; font-weight: bold } // Name.Exception - .nf { color: #900; font-weight: bold } // Name.Function - .nn { color: #555 } // Name.Namespace - .nt { color: #000080 } // Name.Tag - .nv { color: #008080 } // Name.Variable - .ow { font-weight: bold } // Operator.Word - .w { color: #bbb } // Text.Whitespace - .mf { color: #099 } // Literal.Number.Float - .mh { color: #099 } // Literal.Number.Hex - .mi { color: #099 } // Literal.Number.Integer - .mo { color: #099 } // Literal.Number.Oct - .sb { color: #d14 } // Literal.String.Backtick - .sc { color: #d14 } // Literal.String.Char - .sd { color: #d14 } // Literal.String.Doc - .s2 { color: #d14 } // Literal.String.Double - .se { color: #d14 } // Literal.String.Escape - .sh { color: #d14 } // Literal.String.Heredoc - .si { color: #d14 } // Literal.String.Interpol - .sx { color: #d14 } // Literal.String.Other - .sr { color: #009926 } // Literal.String.Regex - .s1 { color: #d14 } // Literal.String.Single - .ss { color: #990073 } // Literal.String.Symbol - .bp { color: #999 } // Name.Builtin.Pseudo - .vc { color: #008080 } // Name.Variable.Class - .vg { color: #008080 } // Name.Variable.Global - .vi { color: #008080 } // Name.Variable.Instance - .il { color: #099 } // Literal.Number.Integer.Long -} - -.highlighter-rouge pre code { - background: #f0f0f0; - color: #000; - display: block; - font-family: monospace; - font-size: 12px; - margin: 1em 0; - overflow-x: auto; - padding: 12px; - text-align: left; -} - -code { - color: $primary-bg; - font-family: monospace; -} diff --git a/docs/_sass/_tables.scss b/docs/_sass/_tables.scss deleted file mode 100644 index f5b97395f5..0000000000 --- a/docs/_sass/_tables.scss +++ /dev/null @@ -1,46 +0,0 @@ -table { - background: $lightergrey; - border: 1px solid $lightgrey; - border-collapse: collapse; - display:table; - - thead { - border-bottom: 1px solid $lightgrey; - display: table-header-group; - } - tbody { - display: table-row-group; - } - tr { - display: table-row; - &:nth-of-type(odd) { - background: $greyish; - } - - th, td { - border-right: 1px dotted $lightgrey; - display: table-cell; - font-size: 14px; - line-height: 1.3em; - padding: 10px; - text-align: left; - - &:last-of-type { - border-right: 0; - } - - code { - color: $green; - display: inline-block; - font-size: 12px; - } - } - - th { - color: #000000; - font-weight: bold; - font-family: $header-font-family; - text-transform: uppercase; - } - } -} diff --git a/docs/_top-level/support.md b/docs/_top-level/support.md deleted file mode 100644 index a481475d9e..0000000000 --- a/docs/_top-level/support.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -layout: top-level -id: support -category: support ---- - -## Need help? - -Do not hesitate to ask questions using the following channels, or to -[submit a pull request](https://github.com/facebook/nuclide/pulls)! - -### GitHub issues - -The [GitHub issues](https://github.com/facebook/nuclide/issues) page is a good place to ask -questions, find answers, and report issues. - -### Facebook Group - - - -### FAQ - -Check out a list of [commonly asked questions](/docs/help/faq) about Nuclide. - -### Troubleshooting - -Have installation or other issues, check out our -[troubleshooting section](/docs/help/troubleshooting). - -### Uninstalling Nuclide - -To remove Nuclide and its dependencies, follow the [uninstall instructions](/docs/editor/uninstall). diff --git a/docs/blog/all.html b/docs/blog/all.html deleted file mode 100644 index 884823f024..0000000000 --- a/docs/blog/all.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: blog -title: All Posts … -layout: blog ---- - -
-
-

All Posts

-
-
    - {% for post in site.posts %} -
  • - {{ post.title }} - on {{ post.date | date: '%d %B %Y' }} -
  • - {% endfor %} -
-
diff --git a/docs/blog/index.md b/docs/blog/index.md deleted file mode 100644 index 84953e4f94..0000000000 --- a/docs/blog/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: blog -title: Blog -layout: blog ---- - -{% assign posts = site.posts limit 10 %} -{% for post in posts %} - {% include post.html post=post truncate=true %} -{% endfor %} diff --git a/docs/css/main.scss b/docs/css/main.scss deleted file mode 100644 index 4867e89ba2..0000000000 --- a/docs/css/main.scss +++ /dev/null @@ -1,84 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- -@charset "utf-8"; - - - -// Our variables -$base-font-family: "Segoe UI", Helvetica, sans-serif; -$header-font-family: "Gotham Rounded A", "Gotham Rounded B", 'Helvetica Neue', Arial, sans-serif; -$base-font-size: 16px; -$small-font-size: $base-font-size * 0.875; -$base-line-height: 1.4em; - -$spacing-unit: 12px; - -$text: {{ site.color.bodytext }}; -$header-text: {{ site.color.headertext }}; -$primary-bg: {{ site.color.primary }}; -$secondary-bg: {{ site.color.secondary }}; -$light-color: {{ site.color.light }}; -$light-text-color: {{ site.color.lighttext }}; -$nav-bg: {{ site.color.primary }}; -$nav-text: {{ site.color.navtext }}; -$footer-bg: #1F242A; -$link-color: {{ site.color.link }}; - -$header-height: 34px; -$header-ptop: 10px; -$header-pbot: 8px; - -// Width of the content area -$content-width: 900px; - -// Table setting variables -$lightergrey: #F8F8F8; -$greyish: #E8E8E8; -$lightgrey: #B0B0B0; -$green: #2db04b; - -// Using media queries with like this: -// @include media-query($on-palm) { -// .wrapper { -// padding-right: $spacing-unit / 2; -// padding-left: $spacing-unit / 2; -// } -// } -@mixin media-query($device) { - @media screen and (max-width: $device) { - @content; - } -} - - - -// Import partials from `sass_dir` (defaults to `_sass`) -@import - "reset", - "base", - "search", - "slideshow", - "syntax-highlighting", - "tables" -; - -// Anchor links -// http://ben.balter.com/2014/03/13/pages-anchor-links/ -.header-link { - position: absolute; - margin-left: 0.2em; - opacity: 0; - - -webkit-transition: opacity 0.2s ease-in-out 0.1s; - -moz-transition: opacity 0.2s ease-in-out 0.1s; - -ms-transition: opacity 0.2s ease-in-out 0.1s; -} - -h2:hover .header-link, -h3:hover .header-link, -h4:hover .header-link, -h5:hover .header-link, -h6:hover .header-link { - opacity: 1; -} diff --git a/docs/doc-type-examples/2016-04-07-blog-post-example.md b/docs/doc-type-examples/2016-04-07-blog-post-example.md deleted file mode 100644 index ef954d63a7..0000000000 --- a/docs/doc-type-examples/2016-04-07-blog-post-example.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Blog Post Example -layout: post -author: exampleauthor -category: blog ---- - -Any local blog posts would go in the `_posts` directory. - -This is an example blog post introduction, try to keep it short and about a paragraph long, to encourage people to click through to read the entire post. - - - -Everything below the `` tag will only show on the actual blog post page, not on the `/blog/` index. - -Author is defined in `_data/authors.yml` - - -## No posts? - -If you have no blog for your site, you can remove the entire `_posts` folder. Otherwise add markdown files in here. See CONTRIBUTING.md for details. diff --git a/docs/doc-type-examples/docs-hello-world.md b/docs/doc-type-examples/docs-hello-world.md deleted file mode 100644 index c7094ba5af..0000000000 --- a/docs/doc-type-examples/docs-hello-world.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -docid: hello-world -title: Hello, World! -layout: docs -permalink: /docs/hello-world.html ---- - -Any local docs would go in the `_docs` directory. - -## No documentation? - -If you have no documentation for your site, you can remove the entire `_docs` folder. Otherwise add markdown files in here. See CONTRIBUTING.md for details. diff --git a/docs/doc-type-examples/top-level-example.md b/docs/doc-type-examples/top-level-example.md deleted file mode 100644 index 67b1fa7110..0000000000 --- a/docs/doc-type-examples/top-level-example.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: top-level -title: Support Example -id: top-level-example -category: top-level ---- - -This is a static page disconnected from the blog or docs collections that can be added at a top-level (i.e., the same level as `index.md`). diff --git a/docs/docs/index.md b/docs/docs/index.md deleted file mode 100644 index d70536aafe..0000000000 --- a/docs/docs/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: docs -title: Docs -layout: redirect -destination: quick-start/getting-started/ ---- diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index f1711ad340..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: home -id: home ---- - -{% include content/gridblocks.html data_source=site.data.features grid_type="twoByGridBlock" %} - -
- This project is unrelated to the CSS framework project named Nuclide. -
diff --git a/docs/js/docsearch.js b/docs/js/docsearch.js deleted file mode 100644 index 35cb7f1bb1..0000000000 --- a/docs/js/docsearch.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @noflow - * @format - */ -'use strict'; - -/* eslint nuclide-internal/no-commonjs: 0 */ - -/* eslint-disable no-var */ -/* eslint-disable no-undef */ - -// For Algolia search -(function() { - // Algolia - docsearch({ - apiKey: '421f79d033cee73a376aba52e4f572eb', - indexName: 'nuclide', - inputSelector: '#algolia-doc-search', - }); -})(); diff --git a/docs/js/get-required-versions.js b/docs/js/get-required-versions.js deleted file mode 100644 index 72bed66668..0000000000 --- a/docs/js/get-required-versions.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @noflow - * @format - */ -'use strict'; - -/* eslint nuclide-internal/no-commonjs: 0 */ -/* eslint-disable prefer-arrow-callback */ -/* eslint-disable no-var */ -/* eslint-disable no-undef */ - -(function() { - if (typeof fetch !== 'function') { - // Your browser is too old... - return; - } - - // Not supported on all browsers, but is on modern browsers that - // will be used by 99% of the people accessing the site. - var nodeEls = document.getElementsByClassName('node'); - var atomEls = document.getElementsByClassName('atom'); - var nuclideEls = document.getElementsByClassName('nuclide'); - - if (!(nodeEls.length > 0 || atomEls.length > 0 || nuclideEls.length > 0)) { - // Nothing to do in this page... - return; - } - - fetch( - 'https://raw.githubusercontent.com/facebook/nuclide/master/package.json', - {mode: 'cors'}, - ) - .then(function(response) { - return response.json(); - }) - .then(function(data) { - // Get the first part that looks like a version... - var versionLikeRe = /\b\d+\.\d+\.\d+\b/; - - var nodeVersion = data.engines.node.match(versionLikeRe)[0]; - var atomVersion = data.engines.atom.match(versionLikeRe)[0]; - var nuclideVersion = data.version; - - for (var i = 0; i < nodeEls.length; i++) { - nodeEls.item(i).innerHTML = - 'A Node version that is greater or equal to ' + - nodeVersion + - ' is required.'; - } - for (var j = 0; j < atomEls.length; j++) { - atomEls.item(j).innerHTML = - 'Nuclide requires an Atom version that is greater or equal to ' + - atomVersion + - '.'; - } - for (var k = 0; k < nuclideEls.length; k++) { - nuclideEls.item(k).innerHTML = - 'The current version of Nuclide is ' + nuclideVersion + '.'; - } - }); -})(); diff --git a/docs/js/jekyll-link-anchors.js b/docs/js/jekyll-link-anchors.js deleted file mode 100644 index c9405616cf..0000000000 --- a/docs/js/jekyll-link-anchors.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @noflow - * @format - */ -'use strict'; - -/* eslint nuclide-internal/no-commonjs: 0 */ - -/* eslint-disable no-var */ -/* eslint-disable prefer-arrow-callback */ - -// Taken and modified from https://gist.github.com/SimplGy/a229d25cdb19d7f21231 -(function() { - // Create intra-page links - // Requires that your headings already have an `id` attribute set (because that's what jekyll - // does). For every heading in your page, this adds a little anchor link `#` that you can click - // to get a permalink to the heading. Ignores `h1`, because you should only have one per page. - - // This also allows us to have uniquely named links even with headings of the same name. - // e.g., - // h2: Mac (#mac) - // h3: prerequisites (#mac__prerequisites) - // h2: Linux (#linux) - // h3: prerequisites (#linux__prerequisites) - - // We don't want anchors for any random h2 or h3; only ones with an - // id attribute which aren't in h2's and h3's in the sidebar ToC and - // header bar. - var possibleNodeNames = ['h2', 'h3', 'h4', 'h5']; // Really try to only have up to h3, please - var tags = document.querySelectorAll('h2[id], h3[id], h4[id], h5[id]'); - var headingNodes = Array.prototype.slice.call(tags); - - headingNodes.forEach(function(node) { - var nameIdx = possibleNodeNames.indexOf(node.localName); // h2 = 0, h3 = 1, etc. - var link; - var id; - var psib; - var suffix; - - // Remove automatic id suffix added by kramdown if heading with same name exists. - // e.g., - // h2: Mac - // h3: prerequisites (id = prerequisites) - // h2: Linux - // h3: prerequisites (id = prerequisites-1) - - // Only match at end of string since that is where auto suffix wil be added. - suffix = node.getAttribute('id').match(/-[0-9]+$/); - // If the -1, etc. suffix exists, make sure someone didn't purposely put the suffix there - // by checking against the actual text associated with the node - if ( - suffix != null && - node.getAttribute('id').substring(0, suffix.index) === - node.textContent.toLowerCase() - ) { - node.setAttribute('id', node.textContent.toLowerCase()); - } - - link = document.createElement('a'); - link.className = 'header-link'; - link.textContent = '#'; - id = ''; - - // Avoid duplicate anchor links - // If we are at an h3, go through the previous element siblings of this node, and find its - // h2 parent and append it to the href text. - psib = node.previousElementSibling; - var idx; - while (psib) { - // Find the parent, if it exists. - idx = possibleNodeNames.indexOf(psib.localName); - if (idx !== -1 && idx === nameIdx - 1) { - // if we are at h3, we want h2. That's why the - 1 - id += psib.getAttribute('id') + '__'; - break; - } - psib = psib.previousElementSibling; - } - link.id = id + node.getAttribute('id'); - link.href = '#' + link.id; - node.appendChild(link); - }); -})(); diff --git a/docs/static/favicon.png b/docs/static/favicon.png deleted file mode 100644 index 9e0eaf4a11..0000000000 Binary files a/docs/static/favicon.png and /dev/null differ diff --git a/docs/static/fonts/332720/11F30310EFD3175B0.css b/docs/static/fonts/332720/11F30310EFD3175B0.css deleted file mode 100644 index 06c864d7a7..0000000000 --- a/docs/static/fonts/332720/11F30310EFD3175B0.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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))); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/143BB439096CFDFC4.css b/docs/static/fonts/332720/143BB439096CFDFC4.css deleted file mode 100644 index 93e7cb801c..0000000000 --- a/docs/static/fonts/332720/143BB439096CFDFC4.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,MgA/Al0APwA9ACoCOgBdA1MAZQIzAD8BXQA/AToAPwI8AD8CSQA/AmgAFgNvABIBaAA/AmgAPwI1AD8DQgA/AjcAdgJAAD8CPABdAjcAYgIsAE4CHgBPAUEAPwI9AHgCXQA/AAAALAEAAD8BCgA/PwEAAQAAAAIAAAAEAAEAGgABAAEAAgAAAAAAGAAAAA4AAAABAAALHz8/P35/Pz9/fz8/Pz8/Pz8LHz8/P38/Pz8/Pz8/Pz8/Pz8LHj8/Pz8GfR8/Pz8/Cx8/Pz8/CD8/Pz8/PwY/CD8/Pz8/Px8/Pz9/fz8/Pwg/fT8/Pz9YRjQnAQEEABM/FT8/FBY/Dh8/Pz8/Pz8/Pz8/Pz8/Pz8/FT9YPwc/Yj8/bj8/P3V7Pz8Gbj8/Pz8/Pz8/eT8/Pz8/FWhzPwohFT8/CiAVPz8/CH54P30/Pz90Pz8/P3w/fD97PxU/PwU/CD8/Pz8/Pz8/Pz8/Px4/Pz8/Pz8/PxU/Fz8HfT8fPz8/Pz8/Pz8ePz8/Pz8/Pz8VPxs/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/Px8/Pz8/FXBoBj8/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwU/Pwg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8ePz8/Pz8/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Bz8/FVt3Pwc/cj8/ej8IPz8/Pz8/Hj8/Pz8HPz8/Pz8/eR4/Pz8/Pz8/PwY/Pz8/FXw/ZT8IPz8/Pz8/P3I/ej93P3Z/f3o/BT8/CD8/Pz8/Pz8/Pz9pPz8/Pz8/Pz9jP1Y/YT9sbnlWdT95P24/HmBhYUhNP2o/CD8/Pz8/Pz9wP3c/P3N7fXg/ch9vP3U/Pz8/Pwg/Pz8/fD8VSj8iPwc/fj8/Px8/Pz8/CD8/Pz8/PwU/Pwg/Pz8/Pz8ePz8/Pwd3Pz8/PxUqPwg/P3Q/bD98P30/Pz8/eT9vP28/Pz8/Pz8VFz9iBj8IPz8/Pz8/Pz8/Pz8/Pz8/P3s/Pz8/Pz8/Pz8/Pz8/BT8/Bj8/Pwg/Pz8/Pz8/Pz8/Pz8/Pz9zPz8/Pz8/Pz8/Pz8/Pz8FPz8/PxU/Px56fz97ej9/Pwg/Pz8/Pz91P30/dD8VPz8tPwg/Pz8/Pz8/Pz8/Pz8/P3Q/Pz8FPz8/Pz9yPz8/Pz8/dz8/Pz8/P3o/Pz8/Pz8IPz8/Pz8/Hz8/Pz8/Pz8/FVk/Bz8/eT8IPz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwU/Pz8/FT97Bz9yPz95Pwg/Pz8/Pz8ePz8/Pz8/Pz8/Pz8/Bz8IPz8/Pz8/Bj8/Pz8VPwc/cj8/Pz8ffj8/Pwg/Pz8/Pz8FPz8GPz8/Pz8/cj8/Pz8/FTsrHz8/Pz8/Pz8/Pz8/Pz8/Pz8VPxI/Hz8/P3p5f359CD8/Pz8/PwU/PwY/Pz8Ifz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwY/CD8/Pz8/PxVRPyY/Bj8/Pz8VQT9VPwojFT8GP2I/P1g/Pwg/Pz8/Pz8GPz8/CD8/Pz8/PwY/Pz8IPz8/Pz8/Bj8/Pz8/FT85PwojBD8KIhU/PwojBD8KIhVBPwoiFT9QCiEVPz8KIBU/Pw4ePz8/Pz99P3gHcB54fX14eD99Pwc/FQI/Px8/Pz8/Bj8ePz8/fQV3P3sePz8/Pz8/Pz8VPz8hPz8OHj8/Pz8HPwg/Pz8/Pz8FPD8/Pz8fPz8/f38/P38GEz8efz8/Pwc/CD8/Pz8/PwU8Pz8/H38/Pz8/Pz8/BiE/Fj9aDgg/Pz8/fT8FXz87Pwg/Pz8/Pz9+Pz9/P30/fT8/Pz8FQz8oP0U/KD8IPz8/Pz9+Bj8IP30/Pz8/BUU/KD9FPyk/CD8/Pz8/fT99Pz8/Pz8/Pz8/PwVfPzs/CD8/Pz8/PwY/CD8/Pz98PwU1PyU/NT8mPwg/Pz8/Pz8GPxU/Pz8/Pw4ePz8/Pz8/P3wHQQg/Pz8/HhU/Mz8OPwc/Px58Pz99fT8/Pwc/Px4/P1AkJz8+IQc/Px58Pz99fT8/PxV9Pz8/Pw4IP3A/ZD8/Pz8/Pz9+Pz8/P34/Pz8/Pz8/Vj9TP04eRmVVUAc/CE8/dT93P3M/cj8wPwc/HzlQRigIP1Q/Tj9aPz8/Pz8/Pz8/Pz8/Pz8/Pz8/cT97Pz8/Hj8/Pz8HPwg/Pz9GP0I/OT81Pz8HPx8/Pz8/FT8/PyEOHn0/P319Pz8/BxA/CChfVTI/Qz98Pz8/Pz8/Pz8/Pz8APz84Pz8HUD8ePz8/Pz8/P3wVP18/Dh4NPyg0DD8HPx4PPyk/Cj8NPz8MPwc/Hw8/Lwo/FT8/His/Dj8CPyM/Bz8eIz8QPwM/LD8rPw4/Aj8jPwc/HyM/ED8DPyw/FX8/Pz8OHgM/Px0/Bz8eGj8uICEyJRY/Bz8fFz8zPz8VWj8/Px4/Pz8/Pz8/fAcuCD8/Pz8eDz8oET86Pwc/Hzo/JhE/Dz8IPyU/ST9hBz8/Hnw/P319Pz8/FVk/Pw4IPz8/Pz8/BT8/Pz8/Pz8IPz8/Pz8/fz9/fz9+Pz8/Pz8/BT8/fD8/P3k/CD8/Pz8/Pz9+Pz8/Pz8/Pz8/PwU/Pz8/Pz8/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwU/Pz8/Pz8/CD8/Pz8/Px4/Pz9+FT8LPw4ffX9/fQY/CD8/Pz8/PwU/P2w/Pz8efT8/fX0/Pz8HKD8fPz8/PwY/CD8/Pz8/PwU/P3U/Pz8ePz8/Pz8/P30VP08/Dh59f399fT9/PwckPx4/Pz8/P38/fRU/Az8/Dh59f399fT9/Pwc/P1Q/Px59f399fT9/PwckPx4/Pz8/P38/fQc/P1Q/Px4/Pz8/P38/fRU/MT8OHj9/P30HHD8ffX9/fQZYPx9+Pz8/Pz8/PwY+Pz8/ET8ffj8/Pz8/Pz8GET8/P0M/H34/Pz8/Pz8/Bl0/FhY/Dh8tLDUpPE8/Pz8/PwQ/P1Q9FT8/Vh8/P1k/Uj8/Pz8/Wz9VPz8/Pz9NP1M/Zz8/Pz8/CD9nP1I/Pz8/Pz8fP0M/ISM/IQ0/BD8IPzo/Xj90BVA/CHw/Pz8/fj97Pz8/PwVWPz8IPz8/Pz8/Hz8/alJFTUElP0s/ST9AP3o/ez9LP0E/cz90P0g/Pz8/Pwg/KXVEYUE/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8VNj8/Pw0/Dh4LPzE/Mwc/Hig8Pwg/Bz8/Pwc/Hz8/PAM/FT8/Pwg/aT9gPwg/Pz8/Pz99P38/P30/Pz8/Pz8/VT9WP08/IT8rPyhmPz8/Pz8CPx4hPy0/DD8HPx8VPyEnJj8IP0A/Tj9hP1U/aSA/Pwc/H3A/Mj8OPzc/FX8/Pw4eFT9GPjwHPx40TD8GPwY/Pz8HPx8/Pz4VPwQ/Px4oUTg1Bz8ePFI/Pz8/Pz8HPx8/PzgoBBs/Hic/OgU/CD8HPwg5P01IbjNvP1c/OD8HPx4BP0EHPw0/DT8HPwE/Bz8IPz8/Pz8zP0g/Pwc/Hwg/BT8nPxU/Pz8OHgU/OUEoBz8eK0M/Az8HPz8/Bz8fPz82BT8VPz8IP28/YT9RP0U/JT8/Bz8fZz88PwM/Qj8IP0E/Uj9TCD8/Pz8/Pz8/Pz8/Pz8/Pz8/P2I/dT8/PyI/KT9qPz9HY01KPwY/HhM/Bj8RPwc/Hxg/Px4/FX8/Pw4IP14/VD8/Pz8/Pz9/P38/P30/Pz8/P8ZQP0c/RR4DP0A+Jgc/HyhIPwU/CD8/Pz8/Pz8/Pz8/Pz9+P3w/BT8/egh4Pz9/P30GPz8ffT8/Pz8/Pz8FPz8/Pz8IdV57Xj9KHhs/IhE/Bz8fFT8/IT8Vfz8/Pw4IPwE/Wz9HPz8/Pz8/P30/f38/fT8/Pz8/P1Q/SD8zHi1MPC8HPx8pVT8SPwY/Hj8/P34IPz8/Pz8/BT8/ej8/Hz8/P319Pz99BiI/Hn4/Pz8IPz8/Pz8/BT8/fD8IPxk/Bz8UPz8HPx8OPz8NPxV/Pz8/Dgg/Pz8/Pz8FeT8/PwgiCD9PZEE/CDA/UD8/Pz8/Pz8/Pz8/Pz8/Pz9+Pz8/Pz8/PzVQV0s/Cj8eCz8yAT8HPwg/Pz8EPw8/BVY/aj8/Cz8ffT8/Pz8/Pz8GSD8ePz8/fRU/P34OBT8GPwg/Pz8/Pz8/Pz8/fz9/Pz8/Pz8FXg4/CD8/Pz8/PwY/Hns/Pz8HKD8ePz8/Pz9/P30VP0c/Pz8OHiU/Kz8xNj8HPx43Pyw/JT8lPyo/Nz8HPx82Py0/LyU/FT8/HkY/Oz8DP1U/Bz8eVT89PwU/Rj9GPzs/Az9VPwc/H1U/PT8FP0Y/FX8/Pz8OCD8/P2s/FT8HPz8IPz8/Pz8VPz8GPwhGP2E/bhY/Bz8/CD8nUUo/PxU/P2c/Hn4/P35+Pz8/Bz8IP0M/Vz9VPz8/Pz8/Pz8/Pz8/Pz8/Pz8/ZD93Pz8/Bz8/CD8sP0s/Pz8/Pz8RPwc/Hj8/Pz8/Pz9+BzwIP2s/UT8/Pz8/Pz9+P39/P34/Pz8/Pz8/Uz9OPz0HPz8Iaio/VD8nPyY/PjM/Dj8HZRV2Pz8/Pw4eeH19eHg/fT8HPx4/Pz8/P30/eAdwFQI/Px99Pz99Bn8efT8/PwV3Pz8ePz8/Pz8/Pz8VVz8DPz8OPz8OBT8/Pxo/Rz8VT28FDD9APz8/PxUMP3g/BQw/QD8/Pz8VSD9cPwUaP0c/Pz8/FVk/Bj8/fD8/PwRcPyQKDUkJDgk/CEQIAAg/B00HPwY/BikGPwU/BT8FSgU/BBUEPwMZAz8CJQI/AX8BLAF7AEAAPQABAAIbAD8BYABbAFgAVgBUAFMAUABFADkALwAqACkAJgAhABoAGQAXABYAFAATABIAEQAFAAIAAQAAAQEAAHRub0Ztb2MueWhwYXJnb3B5dC53d3cvLzpwdHRoIC5vQyAmIHJlbGZlb0ggNzAwMiAsNjAwMiApQyggdGhnaXJ5cG9DZ3Vsc29jaExICAEBAwARWD8SCA4AAB0/DyM/BT8/Mz9cPz8DDFkEFj8DHT8CHT8BHD8AED8oAQEBAHRub0YFAQEBAAQEAAEAAAAAAAAAAAAAAAAAAAAAAAAAADIAPz8AAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PDw0NAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhYWFhMTExMTAAAAAAAAAAAAAAAAAAAAAAAAEA0AAAAAAAAAABgAABcAFgAVFAAAEwAAAAAAAAAAAAASAAAAAAAAAAAAAAARAAAAAAAAAAAAEAAAAAAPDgAADQAAAAAMAAAAAAAACwoACQgABwYFBAAAAAAAAAAAAAAAAwAAAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAABgEAAA0AEgAWABYAFgAWABMAEwATABMAEwATAA8ADwAPAA8ADQANAA0ADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAABqAGIAAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAggPz8/Pz8UPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PwAAAz8AAAAAPz8AAHg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PxI/Px4/Hj8eGQI/AX4BfAF6AXUBcwFxAW8BbQFrAWEBXwFbAVkBVwFVAVEBTwFNAUcBRQFDATABLgEsASoBJgEaARgBFgEUAREBDwE/AD8APwA/AD8AegB3AHUAcgBvAGQAWABOAEgARQBAADgANQAwACQAIAAAAD8/Ej8/Hj8ePx4ZAj8BfgF8AXoBdQFzAXEBbwFtAWsBYQFfAVsBWQFXAVUBUQFPAU0BRwFFAUMBMAEuASwBKgEmARoBGAEWARQBEgEPAT8APwA/AD8APwB6AHcAdQBzAG8AZABYAE4ASQBFAEAAOQA2ADMAJAAhADgABQBAAHgAAAAYAgQAHAAAAAEAAwA0AgAAAAABABwAAAADAAAAAwAAAABlAHIAYQB3AHQAZgBvAHMALQB0AG4AbwBmAGIAZQB3AC8AbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaABtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQALgB3AHcAdwA5ADEAMgAwADQAMQAtADMAMgA0ADIALQAzADIANgAwADUAMQAwADIALQA0ADcANAA4ADgALQA3ADQAMgAxADcAMQAgAG0AbwBjAC4AeQBoAHAAYQByAGcAbwBwAHkAdAAuAHcAdwB3ACAAdABhACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAHQAYwBhAHQAbgBvAGMAIAByAG8AIAAsAGUAcgBhAHcAdABmAG8AcwAtAHQAbgBvAGYAYgBlAHcALwBtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQALgB3AHcAdwAvAC8AOgBwAHQAdABoACAAdABpAHMAaQB2ACAAZQBzAGEAZQBsAHAAIAAsAG4AbwBpAHQAYQBtAHIAbwBmAG4AaQAgAGUAcgBvAG0AIAByAG8ARgAgAC4AZQBzAG8AcAByAHUAcAAgAHkAbgBhACAAcgBvAGYAIABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaAB0ACAAZQBzAHUAIAB0AG8AbgAgAHkAYQBtACAAdQBvAHkAIAAsAHMAdABzAGkAeABlACAAdABuAGUAbQBlAGUAcgBnAGEAIABoAGMAdQBzACAAbwBuACAAZgBJACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGQAbgBhACAAdQBvAHkAIABuAGUAZQB3AHQAZQBiACAAcwB0AHMAaQB4AGUAIAB0AGEAaAB0ACAAdABuAGUAbQBlAGUAcgBnAGEAIABlAGMAaQB2AHIAZQBTACAAZgBvACAAcwBtAHIAZQBUACAAZQBoAHQAIABvAHQAIAB0AGMAZQBqAGIAdQBzACAAcwBpACAAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAdAAgAGUAcwB1ACAAbwB0ACAAdABoAGcAaQByACAAcgB1AG8AWQAgAC4AbgBvAGkAdABhAGMAbwBsACAAeQBuAGEAIABtAG8AcgBmACAAdABpACAAdABzAG8AaAAgAHIAbwAgACwAcgBlAHQAdQBwAG0AbwBjACAAeQBuAGEAIABuAG8AcAB1ACAAdABpACAAbABsAGEAdABzAG4AaQAgAHIAbwAgACwAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAdAAgAGQAYQBvAGwAbgB3AG8AZAAgAHIAbwAgACwAZQB0AHUAYgBpAHIAdABzAGkAZAAgACwAeQBmAGkAZABvAG0AIAAsAHkAcABvAGMAIAB0AG8AbgAgAHkAYQBtACAAdQBvAFkAIAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIACAAZgBvACAAeQB0AHIAZQBwAG8AcgBwACAAZQBoAHQAIABzAGkAIABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaABUAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgALgBzAG4AbwBpAHQAYwBpAGQAcwBpAHIAdQBqACAAbgBpAGEAdAByAGUAYwAgAG4AaQAgAGQAZQByAGUAdABzAGkAZwBlAHIAIABlAGIAIAB5AGEAbQAgAGgAYwBpAGgAdwAgACwALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGYAbwAgAGsAcgBhAG0AZQBkAGEAcgB0ACAAYQAgAHMAaQAgAGQAZQBkAG4AdQBvAFIAIABtAGEAaAB0AG8ARwB0AG4AbwBGADEAMAAyAC4AMQAgAG4AbwBpAHMAcgBlAFYAOQAxADIAMAA0ADEALQAzADIANAAyAC0AMwAyADYAMAA1ADEAMAAyAC0ANAA3ADQAOAA4AC0ANwA0ADIAMQA3ADEAcgBhAGwAdQBnAGUAUgBtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQAIAB8ACAAbwBDACYASAAgACkAQwAoACAAdABoAGcAaQByAHkAcABvAEMAbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaAAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIAA3ADAAMAAyACAALAA2ADAAMAAyACAAKQBDACgAIAB0AGgAZwBpAHIAeQBwAG8AQwBlcmF3dGZvcy10bm9mYmV3L21vYy55aHBhcmdvcHl0Lnd3dy8vOnB0dGhtb2MueWhwYXJnb3B5dC53d3c5MTIwNDEtMzI0Mi0zMjYwNTEwMi00NzQ4OC03NDIxNzEgbW9jLnlocGFyZ29weXQud3d3IHRhIC5vQyAmIHJlbGZlb0ggdGNhdG5vYyBybyAsZXJhd3Rmb3MtdG5vZmJldy9tb2MueWhwYXJnb3B5dC53d3cvLzpwdHRoIHRpc2l2IGVzYWVscCAsbm9pdGFtcm9mbmkgZXJvbSByb0YgLmVzb3BydXAgeW5hIHJvZiBlcmF3dGZvcyBzaWh0IGVzdSB0b24geWFtIHVveSAsc3RzaXhlIHRuZW1lZXJnYSBoY3VzIG9uIGZJIC5vQyAmIHJlbGZlb0ggZG5hIHVveSBuZWV3dGViIHN0c2l4ZSB0YWh0IHRuZW1lZXJnYSBlY2l2cmVTIGZvIHNtcmVUIGVodCBvdCB0Y2VqYnVzIHNpIGVyYXd0Zm9zIHNpaHQgZXN1IG90IHRoZ2lyIHJ1b1kgLm5vaXRhY29sIHluYSBtb3JmIHRpIHRzb2ggcm8gLHJldHVwbW9jIHluYSBub3B1IHRpIGxsYXRzbmkgcm8gLGVyYXd0Zm9zIHNpaHQgZGFvbG53b2Qgcm8gLGV0dWJpcnRzaWQgLHlmaWRvbSAseXBvYyB0b24geWFtIHVvWSAub0MgJiByZWxmZW9IIGZvIHl0cmVwb3JwIGVodCBzaSBlcmF3dGZvcyBzaWhULm9DICYgcmVsZmVvSC5zbm9pdGNpZHNpcnVqIG5pYXRyZWMgbmkgZGVyZXRzaWdlciBlYiB5YW0gaGNpaHcgLC5vQyAmIHJlbGZlb0ggZm8ga3JhbWVkYXJ0IGEgc2kgZGVkbnVvUiBtYWh0b0d0bm9GMTAyLjEgbm9pc3JlVjkxMjA0MS0zMjQyLTMyNjA1MTAyLTQ3NDg4LTc0MjE3MXJhbHVnZVJtb2MueWhwYXJnb3B5dCB8IG9DJkggKUMoIHRoZ2lyeXBvQ21vYy55aHBhcmdvcHl0Lnd3dy8vOnB0dGggLm9DICYgcmVsZmVvSCA3MDAyICw2MDAyIClDKCB0aGdpcnlwb0M/A0YAEgAJBAEAAwA/A0YAEQAJBAEAAwA/A0YAEAAJBAEAAwA/CVQADgAJBAEAAwBrBSIEDQAJBAEAAwA/CSQADAAJBAEAAwA/CSQACwAJBAEAAwBrBSIECgAJBAEAAwBRBRoACQAJBAEAAwBRBRoACAAJBAEAAwA/BD8ABwAJBAEAAwA/BAgABgAJBAEAAwBtBBoABQAJBAEAAwA/A0YABAAJBAEAAwArBEIAAwAJBAEAAwAdBA4AAgAJBAEAAwA/A0YAAQAJBAEAAwBXAz8AAAAJBAEAAwBAACMAEgAAAAAAAQBAACMAEQAAAAAAAQBAACMAEAAAAAAAAQAtAyoADgAAAAAAAQAKARECDQAAAAAAAQAbAxIADAAAAAAAAQAbAxIACwAAAAAAAQAKARECCgAAAAAAAQA/AA0ACQAAAAAAAQA/AA0ACAAAAAAAAQA/AGEABwAAAAAAAQA/AAQABgAAAAAAAQA/AA0ABQAAAAAAAQBAACMABAAAAAAAAQBqACEAAwAAAAAAAQBjAAcAAgAAAAAAAQBAACMAAQAAAAAAAQAAAEAAAAAAAAAAAQA/ASQAAAABACAAIAA/Aj8BAAAAAAsAAAA/AD8DPwA4PyADEj8kAAAAb0MmSAAAAAAAAAAASgAAUH8AAD8AAAAAAAAAAAAAAAA/ADIAPwEAAD8CPwI/AAAAPwI/AgQABQAsAU0CAgAAABsAAFAAABsAAAAAAAAAAAAAAAAAAAABAD8DAAAAAD8DAAAQPz8DAAABAAAAAAAAAAIACAAAACADPwM4PwAAHwIsPwAAAAAfAiw/AAAAAD8DCwA/PA9fPz8/LkEAAQAAAAEAIAAAAHgQAAAyAD8/dHNvcD8LAAA/AQAABDM1KGVtYW4GAAAAGAEAAABQGwBweGFtbAAAADAfAAA/Bj89eHRtaCQAAAA/AAAAAANhB2FlaGg2AAAAPwAAAD9HFgNkYWVoCAAAACgfAAALAAAAcHNhZzoDAAA8DQAAAj8/cGFtY2AAAAAgAQAASyU/VTIvU08gAAAACB8AAAQASABGRURHbw4AAD8QAABjPz9PIEZGQzAAAwA/AAsAT1RUTw==))); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/opentype;base64,T1RUTwALAIAAAwAwQ0ZGIE+2i2MAABCYAAAOb0dERUYASAAEAAAfCAAAACBPUy8yVcclSwAAASAAAABgY21hcO62ywIAAA08AAADOmdhc3AAAAALAAAfKAAAAAhoZWFkAxZHvAAAALwAAAA2aGhlYQdhAwAAAAD0AAAAJGhtdHg9xwbVAAAfMAAAAGxtYXhwABtQAAAAARgAAAAGbmFtZSg1MwQAAAGAAAALu3Bvc3T/uAAyAAAQeAAAACAAAQAAAAEAQS6s5cVfDzz1AAsD6AAAAADQLAIfAAAAANAsAh8AAP84A58DIAAAAAgAAgAAAAAAAAABAAADwP8QAAAD1AAAAAADnwABAAAAAAAAAAAAAAAAAAAAGwAAUAAAGwAAAAICTQEsAAUABAK8AooAAACMArwCigAAAd0AMgD6AAAAAAAAAAAAAAAAoAAAf1AAAEoAAAAAAAAAAEgmQ28AAAAk4BIDIP84AMgDwADwAAAACwAAAAAB/gK8ACAAIAABAAAAJAG2AAEAAAAAAAAAQAAAAAEAAAAAAAEAIwBAAAEAAAAAAAIABwBjAAEAAAAAAAMAIQBqAAEAAAAAAAQAIwBAAAEAAAAAAAUADQCLAAEAAAAAAAYABACYAAEAAAAAAAcAYQCcAAEAAAAAAAgADQD9AAEAAAAAAAkADQD9AAEAAAAAAAoCEQEKAAEAAAAAAAsAEgMbAAEAAAAAAAwAEgMbAAEAAAAAAA0CEQEKAAEAAAAAAA4AKgMtAAEAAAAAABAAIwBAAAEAAAAAABEAIwBAAAEAAAAAABIAIwBAAAMAAQQJAAAAgANXAAMAAQQJAAEARgPXAAMAAQQJAAIADgQdAAMAAQQJAAMAQgQrAAMAAQQJAAQARgPXAAMAAQQJAAUAGgRtAAMAAQQJAAYACASHAAMAAQQJAAcAwgSPAAMAAQQJAAgAGgVRAAMAAQQJAAkAGgVRAAMAAQQJAAoEIgVrAAMAAQQJAAsAJAmNAAMAAQQJAAwAJAmNAAMAAQQJAA0EIgVrAAMAAQQJAA4AVAmxAAMAAQQJABAARgPXAAMAAQQJABEARgPXAAMAAQQJABIARgPXQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEhvZWZsZXIgJiBDby4gaHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbUNvcHlyaWdodCAoQykgSCZDbyB8IHR5cG9ncmFwaHkuY29tUmVndWxhcjE3MTI0Ny04ODQ3NC0yMDE1MDYyMy0yNDIzLTE0MDIxOVZlcnNpb24gMS4yMDFGb250R290aGFtIFJvdW5kZWQgaXMgYSB0cmFkZW1hcmsgb2YgSG9lZmxlciAmIENvLiwgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgaW4gY2VydGFpbiBqdXJpc2RpY3Rpb25zLkhvZWZsZXIgJiBDby5UaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wZXJ0eSBvZiBIb2VmbGVyICYgQ28uIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgb3IgZG93bmxvYWQgdGhpcyBzb2Z0d2FyZSwgb3IgaW5zdGFsbCBpdCB1cG9uIGFueSBjb21wdXRlciwgb3IgaG9zdCBpdCBmcm9tIGFueSBsb2NhdGlvbi4gWW91ciByaWdodCB0byB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBzdWJqZWN0IHRvIHRoZSBUZXJtcyBvZiBTZXJ2aWNlIGFncmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAyADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAUgBvAHUAbgBkAGUAZAAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4ALAAgAHcAaABpAGMAaAAgAG0AYQB5ACAAYgBlACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAGMAZQByAHQAYQBpAG4AIABqAHUAcgBpAHMAZABpAGMAdABpAG8AbgBzAC4ASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgBUAGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAdABoAGUAIABwAHIAbwBwAGUAcgB0AHkAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAsACAAbQBvAGQAaQBmAHkALAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAG8AcgAgAGQAbwB3AG4AbABvAGEAZAAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGkAbgBzAHQAYQBsAGwAIABpAHQAIAB1AHAAbwBuACAAYQBuAHkAIABjAG8AbQBwAHUAdABlAHIALAAgAG8AcgAgAGgAbwBzAHQAIABpAHQAIABmAHIAbwBtACAAYQBuAHkAIABsAG8AYwBhAHQAaQBvAG4ALgAgAFkAbwB1AHIAIAByAGkAZwBoAHQAIAB0AG8AIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABUAGUAcgBtAHMAIABvAGYAIABTAGUAcgB2AGkAYwBlACAAYQBnAHIA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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/16C102A36B2DBC6E6.css b/docs/static/fonts/332720/16C102A36B2DBC6E6.css deleted file mode 100644 index 96c8c1f725..0000000000 --- a/docs/static/fonts/332720/16C102A36B2DBC6E6.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,T1RUTwANAIAAAwBQQ0ZGILkPphQAABIUAAAk2kdERUYAkAAEAAA28AAAACBHUE9TuESiiwAANxAAABwCR1NVQunFLUgAAFMUAAAAgE9TLzJVxiUrAAABQAAAAGBjbWFw0U4uVAAADVwAAASYZ2FzcAAAAAsAAFOUAAAACGhlYWQDcke+AAAA3AAAADZoaGVhB74DqgAAARQAAAAkaG10eNbiGPsAAFOcAAABjG1heHAAY1AAAAABOAAAAAZuYW1lKDUzBAAAAaAAAAu7cG9zdP+4ADIAABH0AAAAIAABAAAAAQBBj0s7+V8PPPUACwPoAAAAANAsAh8AAAAA0CwCH//o/zgEEwMiAAAACAACAAAAAAAAAAEAAAPA/xAAAARO/+j/6AQTAAEAAAAAAAAAAAAAAAAAAABjAABQAABjAAAAAgIsASwABQAEArwCigAAAIwCvAKKAAAB3QAyAPoAAAAAAAAAAAAAAACgAAB/UAAASgAAAAAAAAAASCZDbwAAACPgEgMg/zgAyAPAAPAAAAALAAAAAAH+ArwAIAAgAAIAAAAkAbYAAQAAAAAAAABAAAAAAQAAAAAAAQAjAEAAAQAAAAAAAgAHAGMAAQAAAAAAAwAhAGoAAQAAAAAABAAjAEAAAQAAAAAABQANAIsAAQAAAAAABgAEAJgAAQAAAAAABwBhAJwAAQAAAAAACAANAP0AAQAAAAAACQANAP0AAQAAAAAACgIRAQoAAQAAAAAACwASAxsAAQAAAAAADAASAxsAAQAAAAAADQIRAQoAAQAAAAAADgAqAy0AAQAAAAAAEAAjAEAAAQAAAAAAEQAjAEAAAQAAAAAAEgAjAEAAAwABBAkAAACAA1cAAwABBAkAAQBGA9cAAwABBAkAAgAOBB0AAwABBAkAAwBCBCsAAwABBAkABABGA9cAAwABBAkABQAaBG0AAwABBAkABgAIBIcAAwABBAkABwDCBI8AAwABBAkACAAaBVEAAwABBAkACQAaBVEAAwABBAkACgQiBWsAAwABBAkACwAkCY0AAwABBAkADAAkCY0AAwABBAkADQQiBWsAAwABBAkADgBUCbEAAwABBAkAEABGA9cAAwABBAkAEQBGA9cAAwABBAkAEgBGA9dDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgSG9lZmxlciAmIENvLiBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tQ29weXJpZ2h0IChDKSBIJkNvIHwgdHlwb2dyYXBoeS5jb21SZWd1bGFyMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5VmVyc2lvbiAxLjIwMUZvbnRHb3RoYW0gUm91bmRlZCBpcyBhIHRyYWRlbWFyayBvZiBIb2VmbGVyICYgQ28uLCB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBpbiBjZXJ0YWluIGp1cmlzZGljdGlvbnMuSG9lZmxlciAmIENvLlRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3BlcnR5IG9mIEhvZWZsZXIgJiBDby4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBvciBkb3dubG9hZCB0aGlzIHNvZnR3YXJlLCBvciBpbnN0YWxsIGl0IHVwb24gYW55IGNvbXB1dGVyLCBvciBob3N0IGl0IGZyb20gYW55IGxvY2F0aW9uLiBZb3VyIHJpZ2h0IHRvIHVzZSB0aGlzIHNvZnR3YXJlIGlzIHN1YmplY3QgdG8gdGhlIFRlcm1zIG9mIFNlcnZpY2UgYWdyZWVtZW50IHRoYXQgZXhpc3RzIGJldHdlZW4geW91IGFuZCBIb2VmbGVyICYgQ28uIElmIG5vIHN1Y2ggYWdyZWVtZW50IGV4aXN0cywgeW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb20vd2ViZm9udC1zb2Z0d2FyZSwgb3IgY29udGFjdCBIb2VmbGVyICYgQ28uIGF0IHd3dy50eXBvZ3JhcGh5LmNvbSAxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTl3d3cudHlwb2dyYXBoeS5jb21odHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUAQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAwADYALAAgADIAMAAwADcAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAASAAmAEMAbwAgAHwAIAB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AUgBlAGcAdQBsAGEAcgAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQBWAGUAcgBzAGkAbwBuACAAMQAuADIAMAAxAEYAbwBuAHQARwBvAHQAaABhAG0AIABSAG8AdQBuAGQAZQBkACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAsACAAdwBoAGkAYwBoACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgBIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABjAG8AcAB5ACwAIABtAG8AZABpAGYAeQAsACAAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAbwByACAAZABvAHcAbgBsAG8AYQBkACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAsACAAbwByACAAaQBuAHMAdABhAGwAbAAgAGkAdAAgAHUAcABvAG4AIABhAG4AeQAgAGMAbwBtAHAAdQB0AGUAcgAsACAAbwByACAAaABvAHMAdAAgAGkAdAAgAGYAcgBvAG0AIABhAG4AeQAgAGwAbwBjAGEAdABpAG8AbgAuACAAWQBvAHUAcgAgAHIAaQBnAGgAdAAgAHQAbwAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAFQAZQByAG0AcwAgAG8AZgAgAFMAZQByAHYAaQBjAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHQAaABhAHQAIABlAHgAaQBzAHQAcwAgAGIAZQB0AHcAZQBlAG4AIAB5AG8AdQAgAGEAbgBkACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAEkAZgAgAG4AbwAgAHMAdQBjAGgAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGUAeABpAHMAdABzACwAIAB5AG8AdQAgAG0AYQB5ACAAbgBvAHQAIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAGEAbgB5ACAAcAB1AHIAcABvAHMAZQAuACAARgBvAHIAIABtAG8AcgBlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABwAGwAZQBhAHMAZQAgAHYAaQBzAGkAdAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0ALwB3AGUAYgBmAG8AbgB0AC0AcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABjAG8AbgB0AGEAYwB0ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGEAdAAgAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtACAAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUAAAAAAwAAAAMAAAAcAAEAAAAAA5IAAwABAAAAHAAEA3YAAACsAIAABgAsACAAIwAvADQANwA/AEQARwBNAF0AXwBjAHEAdAB2AHkAfQCjAKUAqwCuALAAtwC7AMUAxwDWAN0A5QDvAPYA+AD9AQcBDgEQARMBFQEXARkBGwEjAScBKwEtAS8BMQE3AUIBRAFGAUgBUQFUAVYBWAFaAV4BYAFlAWoBbAFuAXABcgF0AXkBewF9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/+cAAAAAAAAAAAAAAAD/8QAA/5z/9v+cAAAAAP/2AAD/8QAAAAAAAAAAAAAAAAAAAAAAFAAA//YAAAAAAAAAAAAAAAD/9gAA//H/8QAAAAAAAAAAAAAAAP/sAAD/7P/x//b/4gAAAAoAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAAAA//sAAAAAAAD/5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAD/9v/2//H/4v/iAAD/2AAA//b/9gAAAAAAAAAAAAD/4gAAAAD/5wAA/87/7P/n/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAP/s/8T/zgAA/84AAAAAAAAAAP/YAAAAAP+c/+z/jf+cAAD/fgAAAAD/9v+wAAD/iAAAAAD/9gAAAAD/+wAA/9j/7P/7AAAAAAAAAAAAAAAAAAD/xAAA/9j/2P+mAAAAAAAA/+wAAAAA/8T/zgAA/8QAAAAAAAD/2AAA/+L/+//JAAD/2P/d/87/xP/YAAAAAAAAAAD/2P/s/+wAAAAA/9gAAP/YAAAAAAAAAAAAAAAAAAAAAAAA/+L/7AAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAP/7AAAAAAAAAAD/ugAAAAAAAAAAAAAAAP/7AAD/9v/x//YAAAAAAAAAAAAAAAD/+wAA/5wAAP+cAAAADwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAA8AAAAFAAAACgAAAAoAAAAAAAAAAAAAAAAAAP/JAAAAAP/dAAD/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAP/2AAD/7P/xAAD/5wAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAACv/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/9v/xAAD/4v/n/+f/4v/2AAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAD/+wAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAA//sAAAAA//H/9v/x//H/+wAAAAD/pv/J/5L/8QAAAAAAAAAAAAAAAP/s/3n/ugAA/+wAAAAAAAD/ef/O/5z/g/+c/6b/zv+D/6b/uv/Y/9j/nAAAAAAAAAAAAAAAAAAA/40AAP+m/84AAP+c/5z/nP+c/5z/kgAAAAD/5wAA/+wAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAAAAAAAP/7AAAAAAAAAAD/nP/YAAD/5wAAAAAAAP/2AAD/7P/2/7oAAAAA//YAAAAAAAD/uv/s/4j/v/+I/9j/5/+//8T/2P/sAAD/2AAAAAAAAAAAAAAAAAAA/8QAAAAA/+wAAP/YAAD/3QAA/9j/yQAAAAD/pv/d/5f/7AAAAAD/9v/2//H/7P/2/7r/0wAA//YAAAAAAAD/v//x/5z/xP+c/93/4v/E/87/3f/x//H/3QAAAAAAAAAAAAAAAAAA/8QAAP+c/+cAAP/d/93/3f/Y/93/yQAAAAAAAP/OAAD/4gAA//YAAP/xAAD/7AAA//YAAAAA//YAAAAAAAD/0wAAAAD/2AAA/87/7P/Y/87/7P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAD/2AAA/9gAAAAAAAD/kv/E/37/3QAAAAD/7P/s/+wAAP/2/5z/ugAA//YAAAAAAAD/kv/Y/37/l/9+/7D/2P+X/5z/tf/s/+z/tQAAAAAAAAAAAAAAAAAA/5wAAP+S/+IAAP+1/8T/yf+6/8T/sAAAAAAAAP/YAAD/9gAAAAAAAAAAAAAAAP/2AAD/8QAAAAAAAAAAAAD/5wAAAAD/7AAA/+L/9v/s/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3QAAAAAAAAAAAAAAAAAA//sAAAAA/+z/7AAA/+wAAAAAAAAAAAAAAAD/9v+mAAAAAP/OAAD/ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/nAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/uv/x/+wAAAAA//YAAP/2AAAAAAAAAAD/+wAAAAAAAAAA/+L/3QAA//YAAAAAAAAAAAAAAAAAAAAA/+f/7P/i/+f/8QAAAAAAAP/YAAAAAP+m//EAAP+cAAD/kgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAD/xAAA/8QAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/9gAA//b/9gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/7AAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/9gAAAAAAAP/2//YACgAAAAAAAAAA//H/8QAAAAoADwAAAAAAAAAAAAAAAAAA//v/+//2//sAAAAAAAAAAAAAAAAAAP/OAAD/7P/xAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAA8AAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/9MAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/2/+wAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAA/+L/2AAAAAAAAAAAAAAAAAAAAAAAAAAA/+f/5//i/+f/8QAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAAAAAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/8QAAP/sAAD/2AAAAAAAAP+mAAD/2P/d/87/sP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAD/2AAAAAD/9gAA//H/9v/i//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAeAAAAHgAeABT/9gAA/9P/9v/TAAAAAP/2//EAAAAAAAAAAAAAAB4AIwAAAB4AIwA3AAAAAP/TAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+6AAD/2P/d/+z/tQAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//H/9v/x//EAAAAAAAD/7AAAAAD/9v+mAAD/xP/O/87/nP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//YAAAAA/+L/7P/T/+L/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAD/2AAAAAD/5wAAAAD/5wAA/+wAAP/n/+z/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2/+z/7AAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/x/+wAAAAA/+wAAP/sAAAAAAAAAAD/9gAAAAAAAAAA/+L/zgAA/+wAAAAAAAAAAAAAAAAAAAAA/+L/5//d/+L/7AAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAD/4gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/E//EAAP/OAAD/ugAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAD/3QAA/90AAAAAAAD/pgAA/7AAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAA//YAAAAAAA8AAAAAAAAAAAAAAAD/9gAAAAD/nAAA/5wAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/0wAAAAD/2AAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAUAAD/4gAAAAD/5wAA/6b/5/+mAAAAAP/n//YAAAAAAAAAAAAAAAAAAAAAABQAIwAAAAAAAP+1AAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tf/2//EAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAA/+z/3QAA//YAAAAA//YAAAAA//YAAAAA/+z/8f/n//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5wAAP+c/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/iP/YAAD/4gAAAAAAAAAAAAAAAP/s/78AAAAAAAAAAAAAAAD/sAAAAAD/ugAAAAD/5/+6AAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAA/6sAAAAA/+wAAP/OAAD/zgAA/87/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/8QAAAAAAAP/x//YAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAAAAAAAAAD/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/8QAA//H/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAD/zv/2/+z/5wAA/7r/7P+6//YAAP/s/+z/9gAAAAAAAAAAAAD/9gAAAAAAAAAA//EAAP/EAAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/3QAAAAD/4gAA/+IAAP/i/9P/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAD/zv/2/+z/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAD/9gAAAAAAAAAA/+wAAP+6AAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0wAAAAD/8QAAAAD/8QAAAAAAAP/x//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABQBbABgAAAAsAAAAGQAAACAAIwAiADMAAAAyAB8AHwAAAAAAAAAAAAEAAgADAAQABgAHAAgACQAKAAAACwAMAA0ADgAPABAAEQASABMAFAAVABYAHQAbAAAAAAAXABoAHgAhACQAJQAoAAAAAAApAAAAKAAoACsAGgAAADQANgA4ADkAHAAAAAAAAAAAAAAAAAAAACYAAAAAAAAAAAAnAC0AIwAjAC4ALwAgAC4ALwAgAAAAIgAmACcAAQAFAF0ADQAAAAAAIQAOAAAAFQAYABcAKQAAACgAFAAUAAAAAAAAACIAAQAAAAIAAAAAAAIAAwAAAAAAAAACAAAAAgAAAAQABQAGAAcACAAJAAoACwAAABAAEgAAAAwADwATABMAGQAaAA8AHQAeAA8ADwAfAB8AEwAfABYAKgAtAC8AMAAAAAAAEQAAAAAAAAAAAAAAGwAmAAAAAAAAABwAIwAYABgAJAAlABUAJAAlABUAAAAXABsAHAAAACYAAgAOAAUABQAAAAcABwABAAkACQACAAsADgADABAAEgAHABcAHwAKACEALgATADEANwAhADoAOgAoADwAPwApAEEARQAtAE0ATQAyAFIAWwAzAF0AXwA9AAEACAABAAAAAQABAAEAAAABAAAACgAwAD4AAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAEAAAAAP//AAEAAAABc3MwMQAIAAAAAQAAAAIABgAOAAYAAAABABAAAQAAAAEAKAABAAgAAQAOAAEAAQBiAAEABAABAGIAAQAAAAEAAAABAAEABv+fAAEAAQBiAAEAAf//AAoB9AAAASwAAAGaAEUCvAAtAzgANwK4ADEA5gBFAa4ARwGuADwBrgBMAmwAQADmADYBmABCAOYAUgH0//oCmAAvAksAQADwAFcA8AA7AmwAPAJsAE8CbABZAhYAJQMWADgC0gBoAuIASQMOAGgCkABoAxAASQIlACoCywBoAmsAaANkAGgDUgBJApwAaANSAEkC0wBoAoAAQQKIADIC+ABdAu4AOAROADwC0gBJAswANgKwAEcBrgBiAfQACQGuADcCWP/oAj4AMwKUAF0COwA6AkgAOgFqAC0ClAA8AmUAXQD5AF4A+f/7AjAAXQD5AGQDtwBdAmUAXQKAADoClABdApQAPAGQACoCRgA1AjoAQwJMADQB4AA3AR4AeQHgADUCRQA+AoQAQgKuADUDPgA1AYYAOgIDADcBoAAiAcIASgDmAFIBhgAvAgMAQwIWADQCEABCA4IAQgDmAE0A5gA7AOYANgGaAE0BmgA7AZoANgHWAG8CqABSATcANwE3AEMC0AA3ArIAFgK2ADI=); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/opentype;base64,T1RUTwALAIAAAwAwQ0ZGIE+2i2MAABCYAAAOb0dERUYASAAEAAAfCAAAACBPUy8yVcclSwAAASAAAABgY21hcO62ywIAAA08AAADOmdhc3AAAAALAAAfKAAAAAhoZWFkAxZHvAAAALwAAAA2aGhlYQdhAwAAAAD0AAAAJGhtdHg9xwbVAAAfMAAAAGxtYXhwABtQAAAAARgAAAAGbmFtZSg1MwQAAAGAAAALu3Bvc3T/uAAyAAAQeAAAACAAAQAAAAEAQS6s5cVfDzz1AAsD6AAAAADQLAIfAAAAANAsAh8AAP84A58DIAAAAAgAAgAAAAAAAAABAAADwP8QAAAD1AAAAAADnwABAAAAAAAAAAAAAAAAAAAAGwAAUAAAGwAAAAICTQEsAAUABAK8AooAAACMArwCigAAAd0AMgD6AAAAAAAAAAAAAAAAoAAAf1AAAEoAAAAAAAAAAEgmQ28AAAAk4BIDIP84AMgDwADwAAAACwAAAAAB/gK8ACAAIAABAAAAJAG2AAEAAAAAAAAAQAAAAAEAAAAAAAEAIwBAAAEAAAAAAAIABwBjAAEAAAAAAAMAIQBqAAEAAAAAAAQAIwBAAAEAAAAAAAUADQCLAAEAAAAAAAYABACYAAEAAAAAAAcAYQCcAAEAAAAAAAgADQD9AAEAAAAAAAkADQD9AAEAAAAAAAoCEQEKAAEAAAAAAAsAEgMbAAEAAAAAAAwAEgMbAAEAAAAAAA0CEQEKAAEAAAAAAA4AKgMtAAEAAAAAABAAIwBAAAEAAAAAABEAIwBAAAEAAAAAABIAIwBAAAMAAQQJAAAAgANXAAMAAQQJAAEARgPXAAMAAQQJAAIADgQdAAMAAQQJAAMAQgQrAAMAAQQJAAQARgPXAAMAAQQJAAUAGgRtAAMAAQQJAAYACASHAAMAAQQJAAcAwgSPAAMAAQQJAAgAGgVRAAMAAQQJAAkAGgVRAAMAAQQJAAoEIgVrAAMAAQQJAAsAJAmNAAMAAQQJAAwAJAmNAAMAAQQJAA0EIgVrAAMAAQQJAA4AVAmxAAMAAQQJABAARgPXAAMAAQQJABEARgPXAAMAAQQJABIARgPXQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEhvZWZsZXIgJiBDby4gaHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbUNvcHlyaWdodCAoQykgSCZDbyB8IHR5cG9ncmFwaHkuY29tUmVndWxhcjE3MTI0Ny04ODQ3NC0yMDE1MDYyMy0yNDIzLTE0MDIxOVZlcnNpb24gMS4yMDFGb250R290aGFtIFJvdW5kZWQgaXMgYSB0cmFkZW1hcmsgb2YgSG9lZmxlciAmIENvLiwgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgaW4gY2VydGFpbiBqdXJpc2RpY3Rpb25zLkhvZWZsZXIgJiBDby5UaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wZXJ0eSBvZiBIb2VmbGVyICYgQ28uIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgb3IgZG93bmxvYWQgdGhpcyBzb2Z0d2FyZSwgb3IgaW5zdGFsbCBpdCB1cG9uIGFueSBjb21wdXRlciwgb3IgaG9zdCBpdCBmcm9tIGFueSBsb2NhdGlvbi4gWW91ciByaWdodCB0byB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBzdWJqZWN0IHRvIHRoZSBUZXJtcyBvZiBTZXJ2aWNlIGFncmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAyADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAUgBvAHUAbgBkAGUAZAAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4ALAAgAHcAaABpAGMAaAAgAG0AYQB5ACAAYgBlACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAGMAZQByAHQAYQBpAG4AIABqAHUAcgBpAHMAZABpAGMAdABpAG8AbgBzAC4ASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgBUAGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAdABoAGUAIABwAHIAbwBwAGUAcgB0AHkAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAsACAAbQBvAGQAaQBmAHkALAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAG8AcgAgAGQAbwB3AG4AbABvAGEAZAAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGkAbgBzAHQAYQBsAGwAIABpAHQAIAB1AHAAbwBuACAAYQBuAHkAIABjAG8AbQBwAHUAdABlAHIALAAgAG8AcgAgAGgAbwBzAHQAIABpAHQAIABmAHIAbwBtACAAYQBuAHkAIABsAG8AYwBhAHQAaQBvAG4ALgAgAFkAbwB1AHIAIAByAGkAZwBoAHQAIAB0AG8AIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABUAGUAcgBtAHMAIABvAGYAIABTAGUAcgB2AGkAYwBlACAAYQBnAHIA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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/21FF71D0D2122923F.css b/docs/static/fonts/332720/21FF71D0D2122923F.css deleted file mode 100644 index 1251976746..0000000000 --- a/docs/static/fonts/332720/21FF71D0D2122923F.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/truetype;base64,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LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb20vd2ViZm9udC1zb2Z0d2FyZSwgb3IgY29udGFjdCBIb2VmbGVyICYgQ28uIGF0IHd3dy50eXBvZ3JhcGh5LmNvbSAxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTl3d3cudHlwb2dyYXBoeS5jb21odHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUAQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAwADYALAAgADIAMAAwADcAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAASAAmAEMAbwAgAHwAIAB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AUgBlAGcAdQBsAGEAcgAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQBWAGUAcgBzAGkAbwBuACAAMQAuADMAMAAxAEYAbwBuAHQARwBvAHQAaABhAG0AIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACwAIAB3AGgAaQBjAGgAIABtAGEAeQAgAGIAZQAgAHIAZQBnAGkAcwB0AGUAcgBlAGQAIABpAG4AIABjAGUAcgB0AGEAaQBuACAAagB1AHIAaQBzAGQAaQBjAHQAaQBvAG4AcwAuAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AVABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHQAaABlACAAcAByAG8AcABlAHIAdAB5ACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAFkAbwB1ACAAbQBhAHkAIABuAG8AdAAgAGMAbwBwAHkALAAgAG0AbwBkAGkAZgB5ACwAIABkAGkAcwB0AHIAaQBiAHUAdABlACwAIABvAHIAIABkAG8AdwBuAGwAbwBhAGQAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABpAG4AcwB0AGEAbABsACAAaQB0ACAAdQBwAG8AbgAgAGEAbgB5ACAAYwBvAG0AcAB1AHQAZQByACwAIABvAHIAIABoAG8AcwB0ACAAaQB0ACAAZgByAG8AbQAgAGEAbgB5ACAAbABvAGMAYQB0AGkAbwBuAC4AIABZAG8AdQByACAAcgBpAGcAaAB0ACAAdABvACAAdQBzAGUAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAVABlAHIAbQBzACAAbwBmACAAUwBlAHIAdgBpAGMAZQAgAGEAZwByAGUAZQBtAGUAbgB0ACAAdABoAGEAdAAgAGUAeABpAHMAdABzACAAYgBlAHQAdwBlAGUAbgAgAHkAbwB1ACAAYQBuAGQAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAASQBmACAAbgBvACAAcwB1AGMAaAAgAGEAZwByAGUAZQBtAGUAbgB0ACAAZQB4AGkAcwB0AHMALAAgAHkAbwB1ACAAbQBhAHkAIABuAG8AdAAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGYAbwByACAAYQBuAHkAIABwAHUAcgBwAG8AcwBlAC4AIABGAG8AcgAgAG0AbwByAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ALAAgAHAAbABlAGEAcwBlACAAdgBpAHMAaQB0ACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGMAbwBuAHQAYQBjAHQAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAYQB0ACAAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AIAAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQB3AHcA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AAAAAAAAAAAAAAAAAAD/9gAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/9gAA//YAAAAAAAD/sP/sAAAAAAAAAAAAAAAAAAAAAP/2/+cAAAAAAAAAAAAAAAD/8QAA/5z/9v+cAAAAAP/2AAD/8QAAAAAAAAAAAAAAAAAAAAAAFAAA//YAAAAAAAAAAAAAAAD/9gAA//H/8QAAAAAAAAAAAAAAAP/sAAD/7P/x//b/4gAAAAoAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAAAA//sAAAAAAAD/5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAD/9v/2//H/4v/iAAD/2AAA//b/9gAAAAAAAAAAAAD/4gAAAAD/5wAA/87/7P/n/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAP/s/8T/zgAA/84AAAAAAAAAAP/YAAAAAP+c/+z/jf+cAAD/fgAAAAD/9v+wAAD/iAAAAAD/9gAAAAD/+wAA/9j/7P/7AAAAAAAAAAAAAAAAAAD/xAAA/9j/2P+mAAAAAAAA/+wAAAAA/8T/zgAA/8QAAAAAAAD/2AAA/+L/+//JAAD/2P/d/87/xP/YAAAAAAAAAAD/2P/s/+wAAAAA/9gAAP/YAAAAAAAAAAAAAAAAAAAAAAAA/+L/7AAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAP/7AAAAAAAAAAD/ugAAAAAAAAAAAAAAAP/7AAD/9v/x//YAAAAAAAAAAAAAAAD/+wAA/5wAAP+cAAAADwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAA8AAAAFAAAACgAAAAoAAAAAAAAAAAAAAAAAAP/JAAAAAP/dAAD/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAP/2AAD/7P/xAAD/5wAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAACv/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/9v/xAAD/4v/n/+f/4v/2AAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAD/+wAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAA//sAAAAA//H/9v/x//H/+wAAAAD/pv/J/5L/8QAAAAAAAAAAAAAAAP/s/3n/ugAA/+wAAAAAAAD/ef/O/5z/g/+c/6b/zv+D/6b/uv/Y/9j/nAAAAAAAAAAAAAAAAAAA/40AAP+m/84AAP+c/5z/nP+c/5z/kgAAAAD/5wAA/+wAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAAAAAAAP/7AAAAAAAAAAD/nP/YAAD/5wAAAAAAAP/2AAD/7P/2/7oAAAAA//YAAAAAAAD/uv/s/4j/v/+I/9j/5/+//8T/2P/sAAD/2AAAAAAAAAAAAAAAAAAA/8QAAAAA/+wAAP/YAAD/3QAA/9j/yQAAAAD/pv/d/5f/7AAAAAD/9v/2//H/7P/2/7r/0wAA//YAAAAAAAD/v//x/5z/xP+c/93/4v/E/87/3f/x//H/3QAAAAAAAAAAAAAAAAAA/8QAAP+c/+cAAP/d/93/3f/Y/93/yQAAAAAAAP/OAAD/4gAA//YAAP/xAAD/7AAA//YAAAAA//YAAAAAAAD/0wAAAAD/2AAA/87/7P/Y/87/7P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAD/2AAA/9gAAAAAAAD/kv/E/37/3QAAAAD/7P/s/+wAAP/2/5z/ugAA//YAAAAAAAD/kv/Y/37/l/9+/7D/2P+X/5z/tf/s/+z/tQAAAAAAAAAAAAAAAAAA/5wAAP+S/+IAAP+1/8T/yf+6/8T/sAAAAAAAAP/YAAD/9gAAAAAAAAAAAAAAAP/2AAD/8QAAAAAAAAAAAAD/5wAAAAD/7AAA/+L/9v/s/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3QAAAAAAAAAAAAAAAAAA//sAAAAA/+z/7AAA/+wAAAAAAAAAAAAAAAD/9v+mAAAAAP/OAAD/ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/nAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/uv/x/+wAAAAA//YAAP/2AAAAAAAAAAD/+wAAAAAAAAAA/+L/3QAA//YAAAAAAAAAAAAAAAAAAAAA/+f/7P/i/+f/8QAAAAAAAP/YAAAAAP+m//EAAP+cAAD/kgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAD/xAAA/8QAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/9gAA//b/9gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/7AAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/9gAAAAAAAP/2//YACgAAAAAAAAAA//H/8QAAAAoADwAAAAAAAAAAAAAAAAAA//v/+//2//sAAAAAAAAAAAAAAAAAAP/OAAD/7P/xAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAA8AAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/9MAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/2/+wAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAA/+L/2AAAAAAAAAAAAAAAAAAAAAAAAAAA/+f/5//i/+f/8QAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAAAAAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/8QAAP/sAAD/2AAAAAAAAP+mAAD/2P/d/87/sP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAD/2AAAAAD/9gAA//H/9v/i//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAeAAAAHgAeABT/9gAA/9P/9v/TAAAAAP/2//EAAAAAAAAAAAAAAB4AIwAAAB4AIwA3AAAAAP/TAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+6AAD/2P/d/+z/tQAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//H/9v/x//EAAAAAAAD/7AAAAAD/9v+mAAD/xP/O/87/nP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//YAAAAA/+L/7P/T/+L/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAD/2AAAAAD/5wAAAAD/5wAA/+wAAP/n/+z/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2/+z/7AAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/x/+wAAAAA/+wAAP/sAAAAAAAAAAD/9gAAAAAAAAAA/+L/zgAA/+wAAAAAAAAAAAAAAAAAAAAA/+L/5//d/+L/7AAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAD/4gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/E//EAAP/OAAD/ugAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAD/3QAA/90AAAAAAAD/pgAA/7AAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAA//YAAAAAAA8AAAAAAAAAAAAAAAD/9gAAAAD/nAAA/5wAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/0wAAAAD/2AAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAUAAD/4gAAAAD/5wAA/6b/5/+mAAAAAP/n//YAAAAAAAAAAAAAAAAAAAAAABQAIwAAAAAAAP+1AAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tf/2//EAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAA/+z/3QAA//YAAAAA//YAAAAA//YAAAAA/+z/8f/n//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5wAAP+c/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/iP/YAAD/4gAAAAAAAAAAAAAAAP/s/78AAAAAAAAAAAAAAAD/sAAAAAD/ugAAAAD/5/+6AAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAA/6sAAAAA/+wAAP/OAAD/zgAA/87/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/8QAAAAAAAP/x//YAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAAAAAAAAAD/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/8QAA//H/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAD/zv/2/+z/5wAA/7r/7P+6//YAAP/s/+z/9gAAAAAAAAAAAAD/9gAAAAAAAAAA//EAAP/EAAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/3QAAAAD/4gAA/+IAAP/i/9P/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAD/zv/2/+z/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAD/9gAAAAAAAAAA/+wAAP+6AAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0wAAAAD/8QAAAAD/8QAAAAAAAP/x//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACQBvABgAAAAsAAAAGQAAACAAIwAiADMAOwAAAAAAAAAAAAAAAAAyAAAAKgAfAB8AAAAAAAAAAAAAAAEAAgADAAQABQAGAAcAAAAAAAgACQAKAAAAAAALAAwADQAOAA8AEAARABIAEwAUABUAFgAdABsAAAAAABcAGgAeAAAAIQAkACUAKAAAAAAAKQAAACgAKAArABoAAAAwADEANAA1ADYANwA4ADkAOgAcAAAAAAAAAAAAAAAAAAAAAAAmAAAAAAAAAAAAJwAtACMAIwAuAC8AIAAuAC8AIAAAACIAJgAnAAEACQBxAA0AAAAAACEADgAAABUAGAAXACkAMgAgAAAAKwAAAAAAAAAoAAAAAAAUABQAAAAAAAAAIgAAAAEAAAACAAAAAAAAAAIAAAAAAAMAAAAAAAAAAAACAAAAAgAAAAQABQAGAAcACAAJAAoACwAAABAAEgAAAAwADwATABYAEwAZABoADwAdAB4ADwAPAB8AHwATAB8AFgAfACcAKgAsAC0ALgAvADAAMQAAAAAAEQAAAAAAAAAAAAAAAAAbACYAAAAAAAAAHAAjABgAGAAkACUAFQAkACUAFQAAABcAGwAcAAAAJgACABEACQAJAAAACwALAAEADQANAAIADwATAAMAGgAaAAgAHAAeAAkAJAAqAAwALQAvABMAMgA/ABYAQgBEACQARgBJACcATABMACsATgBRACwAUwBcADAAZQBlADoAagBzADsAdQB3AEUAAQAIAAEAAAABAAEAAwAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAA//8AAQAAAAQAAAAA//8AAQAAAAFzczAxAAgAAAABAAAAAgAGAA4ABgAAAAEAEAABAAAAAQAoAAEACAABAA4AAQABAHoAAQAEAAEAegABAAAAAQAAAAEAAQAG/4kAAQABAHo=); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/2C6F673F0C1CF0A97.css b/docs/static/fonts/332720/2C6F673F0C1CF0A97.css deleted file mode 100644 index 1eb5423b53..0000000000 --- a/docs/static/fonts/332720/2C6F673F0C1CF0A97.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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))); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/3919129618BB6AFD8.css b/docs/static/fonts/332720/3919129618BB6AFD8.css deleted file mode 100644 index ceb4caa3b8..0000000000 --- a/docs/static/fonts/332720/3919129618BB6AFD8.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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)); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/47EF802870551C878.css b/docs/static/fonts/332720/47EF802870551C878.css deleted file mode 100644 index e012278e87..0000000000 --- a/docs/static/fonts/332720/47EF802870551C878.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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)); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/52BE923A462D3F7AA.css b/docs/static/fonts/332720/52BE923A462D3F7AA.css deleted file mode 100644 index 93e7cb801c..0000000000 --- a/docs/static/fonts/332720/52BE923A462D3F7AA.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,MgA/Al0APwA9ACoCOgBdA1MAZQIzAD8BXQA/AToAPwI8AD8CSQA/AmgAFgNvABIBaAA/AmgAPwI1AD8DQgA/AjcAdgJAAD8CPABdAjcAYgIsAE4CHgBPAUEAPwI9AHgCXQA/AAAALAEAAD8BCgA/PwEAAQAAAAIAAAAEAAEAGgABAAEAAgAAAAAAGAAAAA4AAAABAAALHz8/P35/Pz9/fz8/Pz8/Pz8LHz8/P38/Pz8/Pz8/Pz8/Pz8LHj8/Pz8GfR8/Pz8/Cx8/Pz8/CD8/Pz8/PwY/CD8/Pz8/Px8/Pz9/fz8/Pwg/fT8/Pz9YRjQnAQEEABM/FT8/FBY/Dh8/Pz8/Pz8/Pz8/Pz8/Pz8/FT9YPwc/Yj8/bj8/P3V7Pz8Gbj8/Pz8/Pz8/eT8/Pz8/FWhzPwohFT8/CiAVPz8/CH54P30/Pz90Pz8/P3w/fD97PxU/PwU/CD8/Pz8/Pz8/Pz8/Px4/Pz8/Pz8/PxU/Fz8HfT8fPz8/Pz8/Pz8ePz8/Pz8/Pz8VPxs/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/Px8/Pz8/FXBoBj8/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwU/Pwg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8ePz8/Pz8/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Bz8/FVt3Pwc/cj8/ej8IPz8/Pz8/Hj8/Pz8HPz8/Pz8/eR4/Pz8/Pz8/PwY/Pz8/FXw/ZT8IPz8/Pz8/P3I/ej93P3Z/f3o/BT8/CD8/Pz8/Pz8/Pz9pPz8/Pz8/Pz9jP1Y/YT9sbnlWdT95P24/HmBhYUhNP2o/CD8/Pz8/Pz9wP3c/P3N7fXg/ch9vP3U/Pz8/Pwg/Pz8/fD8VSj8iPwc/fj8/Px8/Pz8/CD8/Pz8/PwU/Pwg/Pz8/Pz8ePz8/Pwd3Pz8/PxUqPwg/P3Q/bD98P30/Pz8/eT9vP28/Pz8/Pz8VFz9iBj8IPz8/Pz8/Pz8/Pz8/Pz8/P3s/Pz8/Pz8/Pz8/Pz8/BT8/Bj8/Pwg/Pz8/Pz8/Pz8/Pz8/Pz9zPz8/Pz8/Pz8/Pz8/Pz8FPz8/PxU/Px56fz97ej9/Pwg/Pz8/Pz91P30/dD8VPz8tPwg/Pz8/Pz8/Pz8/Pz8/P3Q/Pz8FPz8/Pz9yPz8/Pz8/dz8/Pz8/P3o/Pz8/Pz8IPz8/Pz8/Hz8/Pz8/Pz8/FVk/Bz8/eT8IPz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwU/Pz8/FT97Bz9yPz95Pwg/Pz8/Pz8ePz8/Pz8/Pz8/Pz8/Bz8IPz8/Pz8/Bj8/Pz8VPwc/cj8/Pz8ffj8/Pwg/Pz8/Pz8FPz8GPz8/Pz8/cj8/Pz8/FTsrHz8/Pz8/Pz8/Pz8/Pz8/Pz8VPxI/Hz8/P3p5f359CD8/Pz8/PwU/PwY/Pz8Ifz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwY/CD8/Pz8/PxVRPyY/Bj8/Pz8VQT9VPwojFT8GP2I/P1g/Pwg/Pz8/Pz8GPz8/CD8/Pz8/PwY/Pz8IPz8/Pz8/Bj8/Pz8/FT85PwojBD8KIhU/PwojBD8KIhVBPwoiFT9QCiEVPz8KIBU/Pw4ePz8/Pz99P3gHcB54fX14eD99Pwc/FQI/Px8/Pz8/Bj8ePz8/fQV3P3sePz8/Pz8/Pz8VPz8hPz8OHj8/Pz8HPwg/Pz8/Pz8FPD8/Pz8fPz8/f38/P38GEz8efz8/Pwc/CD8/Pz8/PwU8Pz8/H38/Pz8/Pz8/BiE/Fj9aDgg/Pz8/fT8FXz87Pwg/Pz8/Pz9+Pz9/P30/fT8/Pz8FQz8oP0U/KD8IPz8/Pz9+Bj8IP30/Pz8/BUU/KD9FPyk/CD8/Pz8/fT99Pz8/Pz8/Pz8/PwVfPzs/CD8/Pz8/PwY/CD8/Pz98PwU1PyU/NT8mPwg/Pz8/Pz8GPxU/Pz8/Pw4ePz8/Pz8/P3wHQQg/Pz8/HhU/Mz8OPwc/Px58Pz99fT8/Pwc/Px4/P1AkJz8+IQc/Px58Pz99fT8/PxV9Pz8/Pw4IP3A/ZD8/Pz8/Pz9+Pz8/P34/Pz8/Pz8/Vj9TP04eRmVVUAc/CE8/dT93P3M/cj8wPwc/HzlQRigIP1Q/Tj9aPz8/Pz8/Pz8/Pz8/Pz8/Pz8/cT97Pz8/Hj8/Pz8HPwg/Pz9GP0I/OT81Pz8HPx8/Pz8/FT8/PyEOHn0/P319Pz8/BxA/CChfVTI/Qz98Pz8/Pz8/Pz8/Pz8APz84Pz8HUD8ePz8/Pz8/P3wVP18/Dh4NPyg0DD8HPx4PPyk/Cj8NPz8MPwc/Hw8/Lwo/FT8/His/Dj8CPyM/Bz8eIz8QPwM/LD8rPw4/Aj8jPwc/HyM/ED8DPyw/FX8/Pz8OHgM/Px0/Bz8eGj8uICEyJRY/Bz8fFz8zPz8VWj8/Px4/Pz8/Pz8/fAcuCD8/Pz8eDz8oET86Pwc/Hzo/JhE/Dz8IPyU/ST9hBz8/Hnw/P319Pz8/FVk/Pw4IPz8/Pz8/BT8/Pz8/Pz8IPz8/Pz8/fz9/fz9+Pz8/Pz8/BT8/fD8/P3k/CD8/Pz8/Pz9+Pz8/Pz8/Pz8/PwU/Pz8/Pz8/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwU/Pz8/Pz8/CD8/Pz8/Px4/Pz9+FT8LPw4ffX9/fQY/CD8/Pz8/PwU/P2w/Pz8efT8/fX0/Pz8HKD8fPz8/PwY/CD8/Pz8/PwU/P3U/Pz8ePz8/Pz8/P30VP08/Dh59f399fT9/PwckPx4/Pz8/P38/fRU/Az8/Dh59f399fT9/Pwc/P1Q/Px59f399fT9/PwckPx4/Pz8/P38/fQc/P1Q/Px4/Pz8/P38/fRU/MT8OHj9/P30HHD8ffX9/fQZYPx9+Pz8/Pz8/PwY+Pz8/ET8ffj8/Pz8/Pz8GET8/P0M/H34/Pz8/Pz8/Bl0/FhY/Dh8tLDUpPE8/Pz8/PwQ/P1Q9FT8/Vh8/P1k/Uj8/Pz8/Wz9VPz8/Pz9NP1M/Zz8/Pz8/CD9nP1I/Pz8/Pz8fP0M/ISM/IQ0/BD8IPzo/Xj90BVA/CHw/Pz8/fj97Pz8/PwVWPz8IPz8/Pz8/Hz8/alJFTUElP0s/ST9AP3o/ez9LP0E/cz90P0g/Pz8/Pwg/KXVEYUE/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8VNj8/Pw0/Dh4LPzE/Mwc/Hig8Pwg/Bz8/Pwc/Hz8/PAM/FT8/Pwg/aT9gPwg/Pz8/Pz99P38/P30/Pz8/Pz8/VT9WP08/IT8rPyhmPz8/Pz8CPx4hPy0/DD8HPx8VPyEnJj8IP0A/Tj9hP1U/aSA/Pwc/H3A/Mj8OPzc/FX8/Pw4eFT9GPjwHPx40TD8GPwY/Pz8HPx8/Pz4VPwQ/Px4oUTg1Bz8ePFI/Pz8/Pz8HPx8/PzgoBBs/Hic/OgU/CD8HPwg5P01IbjNvP1c/OD8HPx4BP0EHPw0/DT8HPwE/Bz8IPz8/Pz8zP0g/Pwc/Hwg/BT8nPxU/Pz8OHgU/OUEoBz8eK0M/Az8HPz8/Bz8fPz82BT8VPz8IP28/YT9RP0U/JT8/Bz8fZz88PwM/Qj8IP0E/Uj9TCD8/Pz8/Pz8/Pz8/Pz8/Pz8/P2I/dT8/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GAEWARQBEgEPAT8APwA/AD8APwB6AHcAdQBzAG8AZABYAE4ASQBFAEAAOQA2ADMAJAAhADgABQBAAHgAAAAYAgQAHAAAAAEAAwA0AgAAAAABABwAAAADAAAAAwAAAABlAHIAYQB3AHQAZgBvAHMALQB0AG4AbwBmAGIAZQB3AC8AbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaABtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQALgB3AHcAdwA5ADEAMgAwADQAMQAtADMAMgA0ADIALQAzADIANgAwADUAMQAwADIALQA0ADcANAA4ADgALQA3ADQAMgAxADcAMQAgAG0AbwBjAC4AeQBoAHAAYQByAGcAbwBwAHkAdAAuAHcAdwB3ACAAdABhACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAHQAYwBhAHQAbgBvAGMAIAByAG8AIAAsAGUAcgBhAHcAdABmAG8AcwAtAHQAbgBvAGYAYgBlAHcALwBtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQALgB3AHcAdwAvAC8AOgBwAHQAdABoACAAdABpAHMAaQB2ACAAZQBzAGEAZQBsAHAAIAAsAG4AbwBpAHQAYQBtAHIAbwBmAG4AaQAgAGUAcgBvAG0AIAByAG8ARgAgAC4AZQBzAG8AcAByAHUAcAAgAHkAbgBhACAAcgBvAGYAIABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaAB0ACAAZQBzAHUAIAB0AG8AbgAgAHkAYQBtACAAdQBvAHkAIAAsAHMAdABzAGkAeABlACAAdABuAGUAbQBlAGUAcgBnAGEAIABoAGMAdQBzACAAbwBuACAAZgBJACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGQAbgBhACAAdQBvAHkAIABuAGUAZQB3AHQAZQBiACAAcwB0AHMAaQB4AGUAIAB0AGEAaAB0ACAAdABuAGUAbQBlAGUAcgBnAGEAIABlAGMAaQB2AHIAZQBTACAAZgBvACAAcwBtAHIAZQBUACAAZQBoAHQAIABvAHQAIAB0AGMAZQBqAGIAdQBzACAAcwBpACAAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAdAAgAGUAcwB1ACAAbwB0ACAAdABoAGcAaQByACAAcgB1AG8AWQAgAC4AbgBvAGkAdABhAGMAbwBsACAAeQBuAGEAIABtAG8AcgBmACAAdABpACAAdABzAG8AaAAgAHIAbwAgACwAcgBlAHQAdQBwAG0AbwBjACAAeQBuAGEAIABuAG8AcAB1ACAAdABpACAAbABsAGEAdABzAG4AaQAgAHIAbwAgACwAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAdAAgAGQAYQBvAGwAbgB3AG8AZAAgAHIAbwAgACwAZQB0AHUAYgBpAHIAdABzAGkAZAAgACwAeQBmAGkAZABvAG0AIAAsAHkAcABvAGMAIAB0AG8AbgAgAHkAYQBtACAAdQBvAFkAIAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIACAAZgBvACAAeQB0AHIAZQBwAG8AcgBwACAAZQBoAHQAIABzAGkAIABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaABUAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgALgBzAG4AbwBpAHQAYwBpAGQAcwBpAHIAdQBqACAAbgBpAGEAdAByAGUAYwAgAG4AaQAgAGQAZQByAGUAdABzAGkAZwBlAHIAIABlAGIAIAB5AGEAbQAgAGgAYwBpAGgAdwAgACwALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGYAbwAgAGsAcgBhAG0AZQBkAGEAcgB0ACAAYQAgAHMAaQAgAGQAZQBkAG4AdQBvAFIAIABtAGEAaAB0AG8ARwB0AG4AbwBGADEAMAAyAC4AMQAgAG4AbwBpAHMAcgBlAFYAOQAxADIAMAA0ADEALQAzADIANAAyAC0AMwAyADYAMAA1ADEAMAAyAC0ANAA3ADQAOAA4AC0ANwA0ADIAMQA3ADEAcgBhAGwAdQBnAGUAUgBtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQAIAB8ACAAbwBDACYASAAgACkAQwAoACAAdABoAGcAaQByAHkAcABvAEMAbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaAAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIAA3ADAAMAAyACAALAA2ADAAMAAyACAAKQBDACgAIAB0AGgAZwBpAHIAeQBwAG8AQwBlcmF3dGZvcy10bm9mYmV3L21vYy55aHBhcmdvcHl0Lnd3dy8vOnB0dGhtb2MueWhwYXJnb3B5dC53d3c5MTIwNDEtMzI0Mi0zMjYwNTEwMi00NzQ4OC03NDIxNzEgbW9jLnlocGFyZ29weXQud3d3IHRhIC5vQyAmIHJlbGZlb0ggdGNhdG5vYyBybyAsZXJhd3Rmb3MtdG5vZmJldy9tb2MueWhwYXJnb3B5dC53d3cvLzpwdHRoIHRpc2l2IGVzYWVscCAsbm9pdGFtcm9mbmkgZXJvbSByb0YgLmVzb3BydXAgeW5hIHJvZiBlcmF3dGZvcyBzaWh0IGVzdSB0b24geWFtIHVveSAsc3RzaXhlIHRuZW1lZXJnYSBoY3VzIG9uIGZJIC5vQyAmIHJlbGZlb0ggZG5hIHVveSBuZWV3dGViIHN0c2l4ZSB0YWh0IHRuZW1lZXJnYSBlY2l2cmVTIGZvIHNtcmVUIGVodCBvdCB0Y2VqYnVzIHNpIGVyYXd0Zm9zIHNpaHQgZXN1IG90IHRoZ2lyIHJ1b1kgLm5vaXRhY29sIHluYSBtb3JmIHRpIHRzb2ggcm8gLHJldHVwbW9jIHluYSBub3B1IHRpIGxsYXRzbmkgcm8gLGVyYXd0Zm9zIHNpaHQgZGFvbG53b2Qgcm8gLGV0dWJpcnRzaWQgLHlmaWRvbSAseXBvYyB0b24geWFtIHVvWSAub0MgJiByZWxmZW9IIGZvIHl0cmVwb3JwIGVodCBzaSBlcmF3dGZvcyBzaWhULm9DICYgcmVsZmVvSC5zbm9pdGNpZHNpcnVqIG5pYXRyZWMgbmkgZGVyZXRzaWdlciBlYiB5YW0gaGNpaHcgLC5vQyAmIHJlbGZlb0ggZm8ga3JhbWVkYXJ0IGEgc2kgZGVkbnVvUiBtYWh0b0d0bm9GMTAyLjEgbm9pc3JlVjkxMjA0MS0zMjQyLTMyNjA1MTAyLTQ3NDg4LTc0MjE3MXJhbHVnZVJtb2MueWhwYXJnb3B5dCB8IG9DJkggKUMoIHRoZ2lyeXBvQ21vYy55aHBhcmdvcHl0Lnd3dy8vOnB0dGggLm9DICYgcmVsZmVvSCA3MDAyICw2MDAyIClDKCB0aGdpcnlwb0M/A0YAEgAJBAEAAwA/A0YAEQAJBAEAAwA/A0YAEAAJBAEAAwA/CVQADgAJBAEAAwBrBSIEDQAJBAEAAwA/CSQADAAJBAEAAwA/CSQACwAJBAEAAwBrBSIECgAJBAEAAwBRBRoACQAJBAEAAwBRBRoACAAJBAEAAwA/BD8ABwAJBAEAAwA/BAgABgAJBAEAAwBtBBoABQAJBAEAAwA/A0YABAAJBAEAAwArBEIAAwAJBAEAAwAdBA4AAgAJBAEAAwA/A0YAAQAJBAEAAwBXAz8AAAAJBAEAAwBAACMAEgAAAAAAAQBAACMAEQAAAAAAAQBAACMAEAAAAAAAAQAtAyoADgAAAAAAAQAKARECDQAAAAAAAQAbAxIADAAAAAAAAQAbAxIACwAAAAAAAQAKARECCgAAAAAAAQA/AA0ACQAAAAAAAQA/AA0ACAAAAAAAAQA/AGEABwAAAAAAAQA/AAQABgAAAAAAAQA/AA0ABQAAAAAAAQBAACMABAAAAAAAAQBqACEAAwAAAAAAAQBjAAcAAgAAAAAAAQBAACMAAQAAAAAAAQAAAEAAAAAAAAAAAQA/ASQAAAABACAAIAA/Aj8BAAAAAAsAAAA/AD8DPwA4PyADEj8kAAAAb0MmSAAAAAAAAAAASgAAUH8AAD8AAAAAAAAAAAAAAAA/ADIAPwEAAD8CPwI/AAAAPwI/AgQABQAsAU0CAgAAABsAAFAAABsAAAAAAAAAAAAAAAAAAAABAD8DAAAAAD8DAAAQPz8DAAABAAAAAAAAAAIACAAAACADPwM4PwAAHwIsPwAAAAAfAiw/AAAAAD8DCwA/PA9fPz8/LkEAAQAAAAEAIAAAAHgQAAAyAD8/dHNvcD8LAAA/AQAABDM1KGVtYW4GAAAAGAEAAABQGwBweGFtbAAAADAfAAA/Bj89eHRtaCQAAAA/AAAAAANhB2FlaGg2AAAAPwAAAD9HFgNkYWVoCAAAACgfAAALAAAAcHNhZzoDAAA8DQAAAj8/cGFtY2AAAAAgAQAASyU/VTIvU08gAAAACB8AAAQASABGRURHbw4AAD8QAABjPz9PIEZGQzAAAwA/AAsAT1RUTw==))); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/opentype;base64,T1RUTwALAIAAAwAwQ0ZGIE+2i2MAABCYAAAOb0dERUYASAAEAAAfCAAAACBPUy8yVcclSwAAASAAAABgY21hcO62ywIAAA08AAADOmdhc3AAAAALAAAfKAAAAAhoZWFkAxZHvAAAALwAAAA2aGhlYQdhAwAAAAD0AAAAJGhtdHg9xwbVAAAfMAAAAGxtYXhwABtQAAAAARgAAAAGbmFtZSg1MwQAAAGAAAALu3Bvc3T/uAAyAAAQeAAAACAAAQAAAAEAQS6s5cVfDzz1AAsD6AAAAADQLAIfAAAAANAsAh8AAP84A58DIAAAAAgAAgAAAAAAAAABAAADwP8QAAAD1AAAAAADnwABAAAAAAAAAAAAAAAAAAAAGwAAUAAAGwAAAAICTQEsAAUABAK8AooAAACMArwCigAAAd0AMgD6AAAAAAAAAAAAAAAAoAAAf1AAAEoAAAAAAAAAAEgmQ28AAAAk4BIDIP84AMgDwADwAAAACwAAAAAB/gK8ACAAIAABAAAAJAG2AAEAAAAAAAAAQAAAAAEAAAAAAAEAIwBAAAEAAAAAAAIABwBjAAEAAAAAAAMAIQBqAAEAAAAAAAQAIwBAAAEAAAAAAAUADQCLAAEAAAAAAAYABACYAAEAAAAAAAcAYQCcAAEAAAAAAAgADQD9AAEAAAAAAAkADQD9AAEAAAAAAAoCEQEKAAEAAAAAAAsAEgMbAAEAAAAAAAwAEgMbAAEAAAAAAA0CEQEKAAEAAAAAAA4AKgMtAAEAAAAAABAAIwBAAAEAAAAAABEAIwBAAAEAAAAAABIAIwBAAAMAAQQJAAAAgANXAAMAAQQJAAEARgPXAAMAAQQJAAIADgQdAAMAAQQJAAMAQgQrAAMAAQQJAAQARgPXAAMAAQQJAAUAGgRtAAMAAQQJAAYACASHAAMAAQQJAAcAwgSPAAMAAQQJAAgAGgVRAAMAAQQJAAkAGgVRAAMAAQQJAAoEIgVrAAMAAQQJAAsAJAmNAAMAAQQJAAwAJAmNAAMAAQQJAA0EIgVrAAMAAQQJAA4AVAmxAAMAAQQJABAARgPXAAMAAQQJABEARgPXAAMAAQQJABIARgPXQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEhvZWZsZXIgJiBDby4gaHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbUNvcHlyaWdodCAoQykgSCZDbyB8IHR5cG9ncmFwaHkuY29tUmVndWxhcjE3MTI0Ny04ODQ3NC0yMDE1MDYyMy0yNDIzLTE0MDIxOVZlcnNpb24gMS4yMDFGb250R290aGFtIFJvdW5kZWQgaXMgYSB0cmFkZW1hcmsgb2YgSG9lZmxlciAmIENvLiwgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgaW4gY2VydGFpbiBqdXJpc2RpY3Rpb25zLkhvZWZsZXIgJiBDby5UaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wZXJ0eSBvZiBIb2VmbGVyICYgQ28uIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgb3IgZG93bmxvYWQgdGhpcyBzb2Z0d2FyZSwgb3IgaW5zdGFsbCBpdCB1cG9uIGFueSBjb21wdXRlciwgb3IgaG9zdCBpdCBmcm9tIGFueSBsb2NhdGlvbi4gWW91ciByaWdodCB0byB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBzdWJqZWN0IHRvIHRoZSBUZXJtcyBvZiBTZXJ2aWNlIGFncmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAyADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAUgBvAHUAbgBkAGUAZAAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4ALAAgAHcAaABpAGMAaAAgAG0AYQB5ACAAYgBlACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAGMAZQByAHQAYQBpAG4AIABqAHUAcgBpAHMAZABpAGMAdABpAG8AbgBzAC4ASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgBUAGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAdABoAGUAIABwAHIAbwBwAGUAcgB0AHkAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAsACAAbQBvAGQAaQBmAHkALAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAG8AcgAgAGQAbwB3AG4AbABvAGEAZAAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGkAbgBzAHQAYQBsAGwAIABpAHQAIAB1AHAAbwBuACAAYQBuAHkAIABjAG8AbQBwAHUAdABlAHIALAAgAG8AcgAgAGgAbwBzAHQAIABpAHQAIABmAHIAbwBtACAAYQBuAHkAIABsAG8AYwBhAHQAaQBvAG4ALgAgAFkAbwB1AHIAIAByAGkAZwBoAHQAIAB0AG8AIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABUAGUAcgBtAHMAIABvAGYAIABTAGUAcgB2AGkAYwBlACAAYQBnAHIA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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/52C563F8BC21B4B43.css b/docs/static/fonts/332720/52C563F8BC21B4B43.css deleted file mode 100644 index 33716adc57..0000000000 --- a/docs/static/fonts/332720/52C563F8BC21B4B43.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face { font-family:"Gotham Rounded A"; src: url('http://nuclide.io/static/fonts/332720/78E7259F6E64A8FDC.eot'); src: url('http://nuclide.io/static/fonts/332720/78E7259F6E64A8FDC.eot?#hfj') format('embedded-opentype'); font-style:normal; font-weight:300; } @font-face { font-family:"Gotham Rounded 3r"; src: url('http://nuclide.io/static/fonts/332720/78E7259F6E64A8FDC.eot'); src: url('http://nuclide.io/static/fonts/332720/78E7259F6E64A8FDC.eot?#hfj') format('embedded-opentype'); font-style:normal; font-weight:300; } \ No newline at end of file diff --git a/docs/static/fonts/332720/537C133D913A8D41D.css b/docs/static/fonts/332720/537C133D913A8D41D.css deleted file mode 100644 index 28e5ff0939..0000000000 --- a/docs/static/fonts/332720/537C133D913A8D41D.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/truetype;base64,egABAAEAPz8GAAEAAQAAAAEAAAABAHoAAQAEAAEAegABAAEADgABAAgAAQAoAAEAAAABABAAAQAAAAYADgAGAAIAAAABAAAACAAxMHNzAQAAAAEAPz8AAAAABAAAAAEAPz8AAAAABAAaAG50YWwOAFRMRkQCAD4AMAAKAAAAAQAAAAMAAQABAAAAAQAIAAEARQB3AHUAOwBzAGoAOgBlAGUAMABcAFMALABRAE4AKwBMAEwAJwBJAEYAJABEAEIAFgA/ADIAEwAvAC0ADAAqACQACQAeABwACAAaABoAAwATAA8AAgANAA0AAQALAAsAAAAJAAkAEQACACYAAAAcABsAFwAAABUAJQAkABUAJQAkABgAGAAjABwAAAAAAAAAJgAbAAAAAAAAAAAAAAAAABEAAAAAADEAMAAvAC4ALQAsACoAJwAfABYAHwATAB8AHwAPAA8AHgAdAA8AGgAZABMAFgATAA8ADAAAABIAEAAAAAsACgAJAAgABwAGAAUABAAAAAIAAAACAAAAAAAAAAAAAwAAAAAAAgAAAAAAAAACAAAAAQAAACIAAAAAAAAAFAAUAAAAAAAoAAAAAAAAACsAAAAgADIAKQAXABgAFQAAAA4AIQAAAAAADQBxAAkAAQAnACYAIgAAACAALwAuACAALwAuACMAIwAtACcAAAAAAAAAAAAmAAAAAAAAAAAAAAAAAAAAAAAcADoAOQA4ADcANgA1ADQAMQAwAAAAGgArACgAKAAAACkAAAAAACgAJQAkACEAAAAeABoAFwAAAAAAGwAdABYAFQAUABMAEgARABAADwAOAA0ADAALAAAAAAAKAAkACAAAAAAABwAGAAUABAADAAIAAQAAAAAAAAAAAAAAHwAfACoAAAAyAAAAAAAAAAAAAAAAADsAMwAiACMAIAAAABkAAAAsAAAAGABvAAkAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/AAAAAAAAPz8AAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/Pz8/PwAAAAAAAD8/AAA/PwAAAAAAAAAAPz8AAAAAAAAAAAAAPz8/PwAAPz8/Pz8/AAA/Pz8/Pz8AAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/PwAAPz8AAD8/AAAAAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8/Pz8AAAAAAAA/PwAAPz8AAAAAAAAAAD8/AAAAAAAAAAAAAD8/PwAAPz8/Pz8/AAA/Pz8/Pz8AAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8AAD8/Pz8/PwAAPz8AAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/PwAAPz8AAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAD8/AAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAA/PwAAPz8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/PwAAAAA/PwAAAAA/PwAAAAA/PwAAPz8/AAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/Pz8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAPz8AAAAAAAAjABQAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAD8/Pz8AAD8/AAAAAD8/AAAUAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAD8/AAAAAAAAAAAAAAAADwAAAAAAPz8AAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAPz8AAD8/AAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAD8/AAA/PwAAPz8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAPz8/Pz8/AAAAAAAAAAAAAAAAAAAAAD8/AAA/Pz8AAAAAAAAAAD8/AAAAAAAAAAA/PwAAPz8AAAAAPz8/Pz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/Pz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8AAD8/AAA/PwAAAAA/PwAAAAA/PwAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8/Pz8AAD8/Pz8AAAAAPz8AAAAAAAA/Pz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAA/PwAAAAA3ACMAHgAAACMAHgAAAAAAAAAAAAAAPz8/PwAAAAA/Pz8/PwAAPz8UAB4AHgAAAB4AAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/PwAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8/Pz8AAD8/AAAAAAAAPz8AAD8/AAA/PwAAPz8/PwAAAAA/PwAAPz8AAAAAPz8AAAAAAAAAAD8/AAAAAAAAAAAAAD8/AAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAH4/AAA/Pz8/PwAAAAA/PwAAAAAAAD8/Pz8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/AAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAA/Pz8/AAAAAD8/AAA/PwAAAAA/PwAAAAAAAAAAPz8AAA8AAAAAAAAAPz8AAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAfj8AAD8/Pz8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/PwAAPz8AAAAAAAAAAAAAAAAAAD8/Pz8/Pz8/AAAAAAAAAAAAAAAAAAAPAAoAAAA/Pz8AAAAAAAAAAAoAPz8/PwAAAAAAAD8/AAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/Pz8AAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAPz8AAD8/AAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAPz8/PwAAAAA/PwAAAAAAAD8/Pz8/PwAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAAAAAAAAAA/PwAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/Pz8/AAAAAAAAAAAAAAAAPz8AAD8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8/AAA/PwAAAAA/PwAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAA/Pz8/Pz8/Pz8AAD8/Pz8AAD8/AAAAAAAAAAAAAAAAAAA/Pz8/Pz8/Pz8/Pz9+Pz8/fj8/Pz8AAAAAAAA/PwAAPz8/Pz8/AAA/Pz8/AAAAAD8/fj8/Pz8AAAAAAAA/PwAAPz8AAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8/PwAAPz8AAAAAPz8AAAAAAAA/PwAAAAA/PwAAPz8AAD8/AAA/PwAAPz8AAD8/AAAAAAAAPz8/Pz8/PwAAPz8/PwAAPz8AAAAAAAAAAAAAAAAAAD8/Pz8/Pz8/Pz8/Pz8/PwAAAAAAAD8/AAA/Pz8/Pz8/Pz8/PwAAAAA/Pz8/Pz8/AAAAAD8/PwAAPz8AAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAPz8AAD8/Pz8/Pz8/Pz8/Pz8/PwAAAAAAAD8/AAAAAD8/Pz8AAD8/AAAAAAAAPz8AAD8/Pz8AAAAAAAAAAD8/AAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAA/PwAAPz8AAAAAPz8/Pz8/Pz8/Pz8/AAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz95PwAAAAAAAD8/AAA/P3k/PwAAAAAAAAAAAAAAAD8/Pz8/Pz8AAAAAPz8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAD8/Pz8/AAA/Pz8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwoAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAA/Pz8AAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAKAAAACgAAAAUAAAAPAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADwAAAD8/AAA/PwAAPz8AAAAAAAAAAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAA/PwAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAD8/PwAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/Pz8/AAAAAAAAAAA/Pz8/Pz8AAD8/Pz8AAD8/AAAAAAAAPz8AAD8/PwAAAAA/PwAAAAAAAD8/Pz8AAD8/AAAAAAAAAAAAAAAAAAA/Pz8AAD8/AAAAAD8/AAAAAD8/AAA/Pz8/AAAAAH4/AAA/Pz8/Pz8AAAAAPz8AAAAAAAAAAD8/AAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/PwAAPz8AAAAAPz8AAAAAAAAAAAAAPz8/PwAAPz8AAD8/Pz8/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAACgAAAD8/Pz8AAD8/AAAAAAAAAAAAAAAAPz8/AAA/PwAAAAAAAAAAAAAAAD8/AAAUAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8/Pz8/AAA/PwAAAAAAAAAAAAAAAD8/Pz8AAAAAAAAAAAAAAAAAAAAAPz8/PwAAAAAAAD8/AAA/Pz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAA/Pz8AAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8/PwAAAAAAAAAAPz8/Pz8/PwAAPz8/Pz8AAD8/AAAAAAAAPz8/Pz8/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/Pz8AAAAAAAAA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AHkAdAAuAHcAdwB3AC8ALwA6AHAAdAB0AGgAIAB0AGkAcwBpAHYAIABlAHMAYQBlAGwAcAAgACwAbgBvAGkAdABhAG0AcgBvAGYAbgBpACAAZQByAG8AbQAgAHIAbwBGACAALgBlAHMAbwBwAHIAdQBwACAAeQBuAGEAIAByAG8AZgAgAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAHQAIABlAHMAdQAgAHQAbwBuACAAeQBhAG0AIAB1AG8AeQAgACwAcwB0AHMAaQB4AGUAIAB0AG4AZQBtAGUAZQByAGcAYQAgAGgAYwB1AHMAIABvAG4AIABmAEkAIAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIACAAZABuAGEAIAB1AG8AeQAgAG4AZQBlAHcAdABlAGIAIABzAHQAcwBpAHgAZQAgAHQAYQBoAHQAIAB0AG4AZQBtAGUAZQByAGcAYQAgAGUAYwBpAHYAcgBlAFMAIABmAG8AIABzAG0AcgBlAFQAIABlAGgAdAAgAG8AdAAgAHQAYwBlAGoAYgB1AHMAIABzAGkAIABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaAB0ACAAZQBzAHUAIABvAHQAIAB0AGgAZwBpAHIAIAByAHUAbwBZACAALgBuAG8AaQB0AGEAYwBvAGwAIAB5AG4AYQAgAG0AbwByAGYAIAB0AGkAIAB0AHMAbwBoACAAcgBvACAALAByAGUAdAB1AHAAbQBvAGMAIAB5AG4AYQAgAG4AbwBwAHUAIAB0AGkAIABsAGwAYQB0AHMAbgBpACAAcgBvACAALABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaAB0ACAAZABhAG8AbABuAHcAbwBkACAAcgBvACAALABlAHQAdQBiAGkAcgB0AHMAaQBkACAALAB5AGYAaQBkAG8AbQAgACwAeQBwAG8AYwAgAHQAbwBuACAAeQBhAG0AIAB1AG8AWQAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIABmAG8AIAB5AHQAcgBlAHAAbwByAHAAIABlAGgAdAAgAHMAaQAgAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAFQALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAuAHMAbgBvAGkAdABjAGkAZABzAGkAcgB1AGoAIABuAGkAYQB0AHIAZQBjACAAbgBpACAAZABlAHIAZQB0AHMAaQBnAGUAcgAgAGUAYgAgAHkAYQBtACAAaABjAGkAaAB3ACAALAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIACAAZgBvACAAawByAGEAbQBlAGQAYQByAHQAIABhACAAcwBpACAAbQBhAGgAdABvAEcAdABuAG8ARgAxADAAMwAuADEAIABuAG8AaQBzAHIAZQBWADkAMQAyADAANAAxAC0AMwAyADQAMgAtADMAMgA2ADAANQAxADAAMgAtADQANwA0ADgAOAAtADcANAAyADEANwAxAHIAYQBsAHUAZwBlAFIAbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0ACAAfAAgAG8AQwAmAEgAIAApAEMAKAAgAHQAaABnAGkAcgB5AHAAbwBDAG0AbwBjAC4AeQBoAHAAYQByAGcAbwBwAHkAdAAuAHcAdwB3AC8ALwA6AHAAdAB0AGgAIAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIACAANwAwADAAMgAgACwANgAwADAAMgAgACkAQwAoACAAdABoAGcAaQByAHkAcABvAEMAZXJhd3Rmb3MtdG5vZmJldy9tb2MueWhwYXJnb3B5dC53d3cvLzpwdHRobW9jLnlocGFyZ29weXQud3d3OTEyMDQxLTMyNDItMzI2MDUxMDItNDc0ODgtNzQyMTcxIG1vYy55aHBhcmdvcHl0Lnd3dyB0YSAub0MgJiByZWxmZW9IIHRjYXRub2Mgcm8gLGVyYXd0Zm9zLXRub2ZiZXcvbW9jLnlocGFyZ29weXQud3d3Ly86cHR0aCB0aXNpdiBlc2FlbHAgLG5vaXRhbXJvZm5pIGVyb20gcm9GIC5lc29wcnVwIHluYSByb2YgZXJhd3Rmb3Mgc2lodCBlc3UgdG9uIHlhbSB1b3kgLHN0c2l4ZSB0bmVtZWVyZ2EgaGN1cyBvbiBmSSAub0MgJiByZWxmZW9IIGRuYSB1b3kgbmVld3RlYiBzdHNpeGUgdGFodCB0bmVtZWVyZ2EgZWNpdnJlUyBmbyBzbXJlVCBlaHQgb3QgdGNlamJ1cyBzaSBlcmF3dGZvcyBzaWh0IGVzdSBvdCB0aGdpciBydW9ZIC5ub2l0YWNvbCB5bmEgbW9yZiB0aSB0c29oIHJvICxy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)); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/695AC8DE58C109BF3.css b/docs/static/fonts/332720/695AC8DE58C109BF3.css deleted file mode 100644 index 206532f78a..0000000000 --- a/docs/static/fonts/332720/695AC8DE58C109BF3.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/740083249BEF005F6.css b/docs/static/fonts/332720/740083249BEF005F6.css deleted file mode 100644 index 4aeacc5add..0000000000 --- a/docs/static/fonts/332720/740083249BEF005F6.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,T1RUTwANAIAAAwBQQ0ZGIKWnUnEAABFoAAAs60dERUYApgAEAAA+VAAAACBHUE9T5Gif/gAAPnQAAB1aR1NVQunbLV4AAFvQAAAAgE9TLzJVxSTvAAABQAAAAGBjbWFwaLtaTgAADVwAAAPsZ2FzcAAAAAsAAFxQAAAACGhlYWQDcke8AAAA3AAAADZoaGVhB74DwAAAARQAAAAkaG10eAmBHxsAAFxYAAAB5G1heHAAeVAAAAABOAAAAAZuYW1lKDUzBAAAAaAAAAu7cG9zdP+4ADIAABFIAAAAIAABAAAAAQBByTlTkF8PPPUACwPoAAAAANAsAh4AAAAA0CwCHv/o/zgEEwMiAAAACAACAAAAAAAAAAEAAAPA/xAAAARO/+j/6AQTAAEAAAAAAAAAAAAAAAAAAAB5AABQAAB5AAAAAgHwASwABQAEArwCigAAAIwCvAKKAAAB3QAyAPoAAAAAAAAAAAAAAACgAAB/UAAASgAAAAAAAAAASCZDbwAAACLgEgMg/zgAyAPAAPAAAAALAAAAAAH+ArwAIAAgAAIAAAAkAbYAAQAAAAAAAABAAAAAAQAAAAAAAQAjAEAAAQAAAAAAAgAHAGMAAQAAAAAAAwAhAGoAAQAAAAAABAAjAEAAAQAAAAAABQANAIsAAQAAAAAABgAEAJgAAQAAAAAABwBhAJwAAQAAAAAACAANAP0AAQAAAAAACQANAP0AAQAAAAAACgIRAQoAAQAAAAAACwASAxsAAQAAAAAADAASAxsAAQAAAAAADQIRAQoAAQAAAAAADgAqAy0AAQAAAAAAEAAjAEAAAQAAAAAAEQAjAEAAAQAAAAAAEgAjAEAAAwABBAkAAACAA1cAAwABBAkAAQBGA9cAAwABBAkAAgAOBB0AAwABBAkAAwBCBCsAAwABBAkABABGA9cAAwABBAkABQAaBG0AAwABBAkABgAIBIcAAwABBAkABwDCBI8AAwABBAkACAAaBVEAAwABBAkACQAaBVEAAwABBAkACgQiBWsAAwABBAkACwAkCY0AAwABBAkADAAkCY0AAwABBAkADQQiBWsAAwABBAkADgBUCbEAAwABBAkAEABGA9cAAwABBAkAEQBGA9cAAwABBAkAEgBGA9dDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgSG9lZmxlciAmIENvLiBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tQ29weXJpZ2h0IChDKSBIJkNvIHwgdHlwb2dyYXBoeS5jb21SZWd1bGFyMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5VmVyc2lvbiAxLjIwMUZvbnRHb3RoYW0gUm91bmRlZCBpcyBhIHRyYWRlbWFyayBvZiBIb2VmbGVyICYgQ28uLCB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBpbiBjZXJ0YWluIGp1cmlzZGljdGlvbnMuSG9lZmxlciAmIENvLlRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3BlcnR5IG9mIEhvZWZsZXIgJiBDby4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBvciBkb3dubG9hZCB0aGlzIHNvZnR3YXJlLCBvciBpbnN0YWxsIGl0IHVwb24gYW55IGNvbXB1dGVyLCBvciBob3N0IGl0IGZyb20gYW55IGxvY2F0aW9uLiBZb3VyIHJpZ2h0IHRvIHVzZSB0aGlzIHNvZnR3YXJlIGlzIHN1YmplY3QgdG8gdGhlIFRlcm1zIG9mIFNlcnZpY2UgYWdyZWVtZW50IHRoYXQgZXhpc3RzIGJldHdlZW4geW91IGFuZCBIb2VmbGVyICYgQ28uIElmIG5vIHN1Y2ggYWdyZWVtZW50IGV4aXN0cywgeW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb20vd2ViZm9udC1zb2Z0d2FyZSwgb3IgY29udGFjdCBIb2VmbGVyICYgQ28uIGF0IHd3dy50eXBvZ3JhcGh5LmNvbSAxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTl3d3cudHlwb2dyYXBoeS5jb21odHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUAQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAwADYALAAgADIAMAAwADcAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAASAAmAEMAbwAgAHwAIAB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AUgBlAGcAdQBsAGEAcgAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQBWAGUAcgBzAGkAbwBuACAAMQAuADIAMAAxAEYAbwBuAHQARwBvAHQAaABhAG0AIABSAG8AdQBuAGQAZQBkACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAsACAAdwBoAGkAYwBoACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgBIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABjAG8AcAB5ACwAIABtAG8AZABpAGYAeQAsACAAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAbwByACAAZABvAHcAbgBsAG8AYQBkACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAsACAAbwByACAAaQBuAHMAdABhAGwAbAAgAGkAdAAgAHUAcABvAG4AIABhAG4AeQAgAGMAbwBtAHAAdQB0AGUAcgAsACAAbwByACAAaABvAHMAdAAgAGkAdAAgAGYAcgBvAG0AIABhAG4AeQAgAGwAbwBjAGEAdABpAG8AbgAuACAAWQBvAHUAcgAgAHIAaQBnAGgAdAAgAHQAbwAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAFQAZQByAG0AcwAgAG8AZgAgAFMAZQByAHYAaQBjAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHQAaABhAHQAIABlAHgAaQBzAHQAcwAgAGIAZQB0AHcAZQBlAG4AIAB5AG8AdQAgAGEAbgBkACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAEkAZgAgAG4AbwAgAHMAdQBjAGgAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGUAeABpAHMAdABzACwAIAB5AG8AdQAgAG0AYQB5ACAAbgBvAHQAIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAGEAbgB5ACAAcAB1AHIAcABvAHMAZQAuACAARgBvAHIAIABtAG8AcgBlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABwAGwAZQBhAHMAZQAgAHYAaQBzAGkAdAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0ALwB3AGUAYgBmAG8AbgB0AC0AcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABjAG8AbgB0AGEAYwB0ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGEAdAAgAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtACAAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUAAAAAAwAAAAMAAAAcAAEAAAAAAuYAAwABAAAAHAAEAsoAAABYAEAABQAYAF0AXwB9AKMApQCrAK4AsAC3ALsAxQDPANYA3QDlAO8A9gD9AQcBGwEjAScBMQE3AUgBUQFbAWUBfgH7Af8CGR6FHvMgFCAaIB4gIiAmIDogrCEi4BL//wAAACAAXwBhAKEApQCpAK4AsAC3ALoAvwDHANEA2ADgAOcA8QD4AP8BCgEeASYBKgE2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AAD/9gAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/9v/2AAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/2AAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/2//b/9gAAAAAAAP/TAAD/2P/2/8kAAP/T/93/yf+//9MAAAAAAAAAAP/Y/+z/7AAAAAD/2AAA/9gAAAAAAAAAAAAAAAAAAAAAAAD/4v/sAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/2AAD/9gAAAAAAAP+w/+wAAAAAAAAAAAAAAAAAAAAA//b/5wAAAAAAAAAAAAAAAP/xAAD/nP/2/5wAAAAA//YAAP/xAAAAAAAAAAAAAAAAAAAAAAAUAAD/9gAAAAAAAAAAAAAAAP/2AAD/8f/xAAAAAAAAAAAAAAAA/+wAAP/s//H/9v/iAAAACgAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAD/+wAAAAD/+wAAAAAAAP/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/84AAP/2//b/8f/i/+IAAP/YAAD/9v/2AAAAAAAAAAAAAP/iAAAAAP/nAAD/zv/s/+f/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5wAA/+z/xP/OAAD/zgAAAAAAAAAA/9gAAAAA/5z/7P+N/5wAAP9+AAAAAP/2/7AAAP+IAAAAAP/2AAAAAP/7AAD/2P/s//sAAAAAAAAAAAAAAAAAAP/EAAD/2P/Y/6YAAAAAAAD/7AAAAAD/xP/OAAD/xAAAAAAAAP/YAAD/4v/7/8kAAP/Y/93/zv/E/9gAAAAAAAAAAP/Y/+z/7AAAAAD/2AAA/9gAAAAAAAAAAAAAAAAAAAAAAAD/4v/sAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAA//sAAAAAAAAAAP+6AAAAAAAAAAAAAAAA//sAAP/2//H/9gAAAAAAAAAAAAAAAP/7AAD/nAAA/5wAAAAPAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAADwAAAAUAAAAKAAAACgAAAAAAAAAAAAAAAAAA/8kAAAAA/90AAP+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+wAA//YAAP/s//EAAP/nAAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/7AAAAAAAK//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAP/2//EAAP/i/+f/5//i//YAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/+wAAAAD/8f/2//H/8f/7AAAAAP+m/8n/kv/xAAAAAAAAAAAAAAAA/+z/ef+6AAD/7AAAAAAAAP95/87/nP+D/5z/pv/O/4P/pv+6/9j/2P+cAAAAAAAAAAAAAAAAAAD/jQAA/6b/zgAA/5z/nP+c/5z/nP+SAAAAAP/nAAD/7AAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAA//sAAAAAAAAAAP+c/9gAAP/nAAAAAAAA//YAAP/s//b/ugAAAAD/9gAAAAAAAP+6/+z/iP+//4j/2P/n/7//xP/Y/+wAAP/YAAAAAAAAAAAAAAAAAAD/xAAAAAD/7AAA/9gAAP/dAAD/2P/JAAAAAP+m/93/l//sAAAAAP/2//b/8f/s//b/uv/TAAD/9gAAAAAAAP+///H/nP/E/5z/3f/i/8T/zv/d//H/8f/dAAAAAAAAAAAAAAAAAAD/xAAA/5z/5wAA/93/3f/d/9j/3f/JAAAAAAAA/84AAP/iAAD/9gAA//EAAP/sAAD/9gAAAAD/9gAAAAAAAP/TAAAAAP/YAAD/zv/s/9j/zv/s//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA/+wAAP/YAAD/2AAAAAAAAP+S/8T/fv/dAAAAAP/s/+z/7AAA//b/nP+6AAD/9gAAAAAAAP+S/9j/fv+X/37/sP/Y/5f/nP+1/+z/7P+1AAAAAAAAAAAAAAAAAAD/nAAA/5L/4gAA/7X/xP/J/7r/xP+wAAAAAAAA/9gAAP/2AAAAAAAAAAAAAAAA//YAAP/xAAAAAAAAAAAAAP/nAAAAAP/sAAD/4v/2/+z/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/xAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAAAAAAAAAAAAD/+wAAAAD/7P/sAAD/7AAAAAAAAAAAAAAAAP/2/6YAAAAA/84AAP+6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+cAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/sAAAAAP/xAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP+6//H/7AAAAAD/9gAA//YAAAAAAAAAAP/7AAAAAAAAAAD/4v/dAAD/9gAAAAAAAAAAAAAAAAAAAAD/5//s/+L/5//xAAAAAAAA/9gAAAAA/6b/8QAA/5wAAP+SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAP/EAAD/xAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAP/xAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/2AAD/9v/2AAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/sAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAP/sAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP/xAAAAAP/2AAAAAAAA//b/9gAKAAAAAAAAAAD/8f/xAAAACgAPAAAAAAAAAAAAAAAAAAD/+//7//b/+wAAAAAAAAAAAAAAAAAA/84AAP/s//EAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAA/5z/8f+I/5wAAP9+AAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/2AAAAAP/x//YAAAAAAAAADwAA/84AAAAAAAAAAP/YAAAAAP/sAAD/5wAAAAD/q/+6AAD/0wAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP+w//b/7AAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAD/4v/YAAAAAAAAAAAAAAAAAAAAAAAAAAD/5//n/+L/5//xAAAAAAAA/9gAAAAA/5z/8f+I/5wAAP9+AAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/2AAAAAP/x//YAAAAAAAAAAAAA/84AAAAAAAAAAP/YAAAAAP/sAAD/5wAAAAD/q/+6AAD/xAAA/+wAAP/YAAAAAAAA/6YAAP/Y/93/zv+w/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAP/YAAAAAP/2AAD/8f/2/+L/8f/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAB4AAAAeAB4AFP/2AAD/0//2/9MAAAAA//b/8QAAAAAAAAAAAAAAHgAjAAAAHgAjADcAAAAA/9MAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7oAAP/Y/93/7P+1AAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/7AAAAAAAA//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8f/2//H/8QAAAAAAAP/sAAAAAP/2/6YAAP/E/87/zv+c//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/9gAAAAD/4v/s/9P/4v/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/xAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAP/YAAAAAP/nAAAAAP/nAAD/7AAA/+f/7P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//b/7P/sAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP+w//H/7AAAAAD/7AAA/+wAAAAAAAAAAP/2AAAAAAAAAAD/4v/OAAD/7AAAAAAAAAAAAAAAAAAAAAD/4v/n/93/4v/sAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAP/iAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAA/8T/8QAA/84AAP+6AAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAP/dAAD/3QAAAAAAAP+mAAD/sAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/xAAAAAP/xAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAA/90AAAAAAAD/9gAAAAAADwAAAAAAAAAAAAAAAP/2AAAAAP+c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AAsAAgANABEAAwAYABgACAAaABwACQAiACgADAArAC0AEwAwAD0AFgBAAEIAJABEAEcAJwBKAEoAKwBMAE8ALABRAFoAMABjAGMAOgBoAHEAOwBzAHUARQABAAgAAQAAAAEAAQABAAAAAQAAAAoAMAA+AAJERkxUAA5sYXRuABoABAAAAAD//wABAAAABAAAAAD//wABAAAAAXNzMDEACAAAAAEAAAACAAYADgAGAAAAAQAQAAEAAAABACgAAQAIAAEADgABAAEAeAABAAQAAQB4AAEAAAABAAAAAQABAAb/iQABAAEAeAABAAH//wAKAfQAAAEsAAAA/ABdAZoARQK8AC0CeAA9AzgANwK4ADEA5gBFAa4ARwGuADwBrgBMAmwAQADmADYBmABCAOYAUgH0//oCxgBBAU8AHgJOACwCYgA3ApgALwJdADwCggBAAksAQAJ2ADcCggBCAPAAVwDwADsCbAA8AmwATwJsAFkCFgAlA9QANQMWADgC0gBoAuIASQMOAGgCngBoApAAaAMQAEkC+ABoARIAbwIlACoCywBoAmsAaANkAGgDFgBoA1IASQKcAGgDUgBJAtMAaAKAAEECiAAyAvgAXQLuADgETgA8AtIASQLMADYCsABHAa4AYgH0AAkBrgA3Alj/6AI+ADMClABdAjsAOgKUADwCSAA6AWoALQKUADwCZQBdAPkAXgD5//sCMABdAPkAZAO3AF0CZQBdAoAAOgKUAF0ClAA8AZAAXQHxADMBkAAqAmUAUwJGADUDXQA6AjoAQwJMADQCKgA9AeAANwEeAHkB4AA1APwAXQJFAD4ChABCAq4ANQM+ADUBhgA6AgMANwGgACIBwgBKAOYAUgGGAC8CAwBDAhYANAIQAEIDggBCAOYATQDmADsA5gA2AZoATQGaADsBmgA2AdYAbwKoAFIBNwA3ATcAQwLQADcCsgAWArYAMg==); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/78E7259F6E64A8FDC.eot b/docs/static/fonts/332720/78E7259F6E64A8FDC.eot deleted file mode 100644 index ba441e1d8c..0000000000 Binary files a/docs/static/fonts/332720/78E7259F6E64A8FDC.eot and /dev/null differ diff --git a/docs/static/fonts/332720/7A39E6B5C7FDD35E3.css b/docs/static/fonts/332720/7A39E6B5C7FDD35E3.css deleted file mode 100644 index e23ea0ab49..0000000000 --- a/docs/static/fonts/332720/7A39E6B5C7FDD35E3.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face { font-family:"Gotham Rounded A"; src: url('http://nuclide.io/static/fonts/332720/B3C56516C7577235B.eot'); src: url('http://nuclide.io/static/fonts/332720/B3C56516C7577235B.eot?#hfj') format('embedded-opentype'); font-style:normal; font-weight:300; } @font-face { font-family:"Gotham Rounded 3r"; src: url('http://nuclide.io/static/fonts/332720/B3C56516C7577235B.eot'); src: url('http://nuclide.io/static/fonts/332720/B3C56516C7577235B.eot?#hfj') format('embedded-opentype'); font-style:normal; font-weight:300; } \ No newline at end of file diff --git a/docs/static/fonts/332720/7C6BEE7159DD678EF.css b/docs/static/fonts/332720/7C6BEE7159DD678EF.css deleted file mode 100644 index f2de0ea247..0000000000 --- a/docs/static/fonts/332720/7C6BEE7159DD678EF.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/888DDF1B4B9C1A5D5.css b/docs/static/fonts/332720/888DDF1B4B9C1A5D5.css deleted file mode 100644 index 93e7cb801c..0000000000 --- a/docs/static/fonts/332720/888DDF1B4B9C1A5D5.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,MgA/Al0APwA9ACoCOgBdA1MAZQIzAD8BXQA/AToAPwI8AD8CSQA/AmgAFgNvABIBaAA/AmgAPwI1AD8DQgA/AjcAdgJAAD8CPABdAjcAYgIsAE4CHgBPAUEAPwI9AHgCXQA/AAAALAEAAD8BCgA/PwEAAQAAAAIAAAAEAAEAGgABAAEAAgAAAAAAGAAAAA4AAAABAAALHz8/P35/Pz9/fz8/Pz8/Pz8LHz8/P38/Pz8/Pz8/Pz8/Pz8LHj8/Pz8GfR8/Pz8/Cx8/Pz8/CD8/Pz8/PwY/CD8/Pz8/Px8/Pz9/fz8/Pwg/fT8/Pz9YRjQnAQEEABM/FT8/FBY/Dh8/Pz8/Pz8/Pz8/Pz8/Pz8/FT9YPwc/Yj8/bj8/P3V7Pz8Gbj8/Pz8/Pz8/eT8/Pz8/FWhzPwohFT8/CiAVPz8/CH54P30/Pz90Pz8/P3w/fD97PxU/PwU/CD8/Pz8/Pz8/Pz8/Px4/Pz8/Pz8/PxU/Fz8HfT8fPz8/Pz8/Pz8ePz8/Pz8/Pz8VPxs/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/Px8/Pz8/FXBoBj8/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwU/Pwg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8ePz8/Pz8/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Bz8/FVt3Pwc/cj8/ej8IPz8/Pz8/Hj8/Pz8HPz8/Pz8/eR4/Pz8/Pz8/PwY/Pz8/FXw/ZT8IPz8/Pz8/P3I/ej93P3Z/f3o/BT8/CD8/Pz8/Pz8/Pz9pPz8/Pz8/Pz9jP1Y/YT9sbnlWdT95P24/HmBhYUhNP2o/CD8/Pz8/Pz9wP3c/P3N7fXg/ch9vP3U/Pz8/Pwg/Pz8/fD8VSj8iPwc/fj8/Px8/Pz8/CD8/Pz8/PwU/Pwg/Pz8/Pz8ePz8/Pwd3Pz8/PxUqPwg/P3Q/bD98P30/Pz8/eT9vP28/Pz8/Pz8VFz9iBj8IPz8/Pz8/Pz8/Pz8/Pz8/P3s/Pz8/Pz8/Pz8/Pz8/BT8/Bj8/Pwg/Pz8/Pz8/Pz8/Pz8/Pz9zPz8/Pz8/Pz8/Pz8/Pz8FPz8/PxU/Px56fz97ej9/Pwg/Pz8/Pz91P30/dD8VPz8tPwg/Pz8/Pz8/Pz8/Pz8/P3Q/Pz8FPz8/Pz9yPz8/Pz8/dz8/Pz8/P3o/Pz8/Pz8IPz8/Pz8/Hz8/Pz8/Pz8/FVk/Bz8/eT8IPz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwU/Pz8/FT97Bz9yPz95Pwg/Pz8/Pz8ePz8/Pz8/Pz8/Pz8/Bz8IPz8/Pz8/Bj8/Pz8VPwc/cj8/Pz8ffj8/Pwg/Pz8/Pz8FPz8GPz8/Pz8/cj8/Pz8/FTsrHz8/Pz8/Pz8/Pz8/Pz8/Pz8VPxI/Hz8/P3p5f359CD8/Pz8/PwU/PwY/Pz8Ifz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwY/CD8/Pz8/PxVRPyY/Bj8/Pz8VQT9VPwojFT8GP2I/P1g/Pwg/Pz8/Pz8GPz8/CD8/Pz8/PwY/Pz8IPz8/Pz8/Bj8/Pz8/FT85PwojBD8KIhU/PwojBD8KIhVBPwoiFT9QCiEVPz8KIBU/Pw4ePz8/Pz99P3gHcB54fX14eD99Pwc/FQI/Px8/Pz8/Bj8ePz8/fQV3P3sePz8/Pz8/Pz8VPz8hPz8OHj8/Pz8HPwg/Pz8/Pz8FPD8/Pz8fPz8/f38/P38GEz8efz8/Pwc/CD8/Pz8/PwU8Pz8/H38/Pz8/Pz8/BiE/Fj9aDgg/Pz8/fT8FXz87Pwg/Pz8/Pz9+Pz9/P30/fT8/Pz8FQz8oP0U/KD8IPz8/Pz9+Bj8IP30/Pz8/BUU/KD9FPyk/CD8/Pz8/fT99Pz8/Pz8/Pz8/PwVfPzs/CD8/Pz8/PwY/CD8/Pz98PwU1PyU/NT8mPwg/Pz8/Pz8GPxU/Pz8/Pw4ePz8/Pz8/P3wHQQg/Pz8/HhU/Mz8OPwc/Px58Pz99fT8/Pwc/Px4/P1AkJz8+IQc/Px58Pz99fT8/PxV9Pz8/Pw4IP3A/ZD8/Pz8/Pz9+Pz8/P34/Pz8/Pz8/Vj9TP04eRmVVUAc/CE8/dT93P3M/cj8wPwc/HzlQRigIP1Q/Tj9aPz8/Pz8/Pz8/Pz8/Pz8/Pz8/cT97Pz8/Hj8/Pz8HPwg/Pz9GP0I/OT81Pz8HPx8/Pz8/FT8/PyEOHn0/P319Pz8/BxA/CChfVTI/Qz98Pz8/Pz8/Pz8/Pz8APz84Pz8HUD8ePz8/Pz8/P3wVP18/Dh4NPyg0DD8HPx4PPyk/Cj8NPz8MPwc/Hw8/Lwo/FT8/His/Dj8CPyM/Bz8eIz8QPwM/LD8rPw4/Aj8jPwc/HyM/ED8DPyw/FX8/Pz8OHgM/Px0/Bz8eGj8uICEyJRY/Bz8fFz8zPz8VWj8/Px4/Pz8/Pz8/fAcuCD8/Pz8eDz8oET86Pwc/Hzo/JhE/Dz8IPyU/ST9hBz8/Hnw/P319Pz8/FVk/Pw4IPz8/Pz8/BT8/Pz8/Pz8IPz8/Pz8/fz9/fz9+Pz8/Pz8/BT8/fD8/P3k/CD8/Pz8/Pz9+Pz8/Pz8/Pz8/PwU/Pz8/Pz8/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwU/Pz8/Pz8/CD8/Pz8/Px4/Pz9+FT8LPw4ffX9/fQY/CD8/Pz8/PwU/P2w/Pz8efT8/fX0/Pz8HKD8fPz8/PwY/CD8/Pz8/PwU/P3U/Pz8ePz8/Pz8/P30VP08/Dh59f399fT9/PwckPx4/Pz8/P38/fRU/Az8/Dh59f399fT9/Pwc/P1Q/Px59f399fT9/PwckPx4/Pz8/P38/fQc/P1Q/Px4/Pz8/P38/fRU/MT8OHj9/P30HHD8ffX9/fQZYPx9+Pz8/Pz8/PwY+Pz8/ET8ffj8/Pz8/Pz8GET8/P0M/H34/Pz8/Pz8/Bl0/FhY/Dh8tLDUpPE8/Pz8/PwQ/P1Q9FT8/Vh8/P1k/Uj8/Pz8/Wz9VPz8/Pz9NP1M/Zz8/Pz8/CD9nP1I/Pz8/Pz8fP0M/ISM/IQ0/BD8IPzo/Xj90BVA/CHw/Pz8/fj97Pz8/PwVWPz8IPz8/Pz8/Hz8/alJFTUElP0s/ST9AP3o/ez9LP0E/cz90P0g/Pz8/Pwg/KXVEYUE/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8VNj8/Pw0/Dh4LPzE/Mwc/Hig8Pwg/Bz8/Pwc/Hz8/PAM/FT8/Pwg/aT9gPwg/Pz8/Pz99P38/P30/Pz8/Pz8/VT9WP08/IT8rPyhmPz8/Pz8CPx4hPy0/DD8HPx8VPyEnJj8IP0A/Tj9hP1U/aSA/Pwc/H3A/Mj8OPzc/FX8/Pw4eFT9GPjwHPx40TD8GPwY/Pz8HPx8/Pz4VPwQ/Px4oUTg1Bz8ePFI/Pz8/Pz8HPx8/PzgoBBs/Hic/OgU/CD8HPwg5P01IbjNvP1c/OD8HPx4BP0EHPw0/DT8HPwE/Bz8IPz8/Pz8zP0g/Pwc/Hwg/BT8nPxU/Pz8OHgU/OUEoBz8eK0M/Az8HPz8/Bz8fPz82BT8VPz8IP28/YT9RP0U/JT8/Bz8fZz88PwM/Qj8IP0E/Uj9TCD8/Pz8/Pz8/Pz8/Pz8/Pz8/P2I/dT8/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GAEWARQBEgEPAT8APwA/AD8APwB6AHcAdQBzAG8AZABYAE4ASQBFAEAAOQA2ADMAJAAhADgABQBAAHgAAAAYAgQAHAAAAAEAAwA0AgAAAAABABwAAAADAAAAAwAAAABlAHIAYQB3AHQAZgBvAHMALQB0AG4AbwBmAGIAZQB3AC8AbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaABtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQALgB3AHcAdwA5ADEAMgAwADQAMQAtADMAMgA0ADIALQAzADIANgAwADUAMQAwADIALQA0ADcANAA4ADgALQA3ADQAMgAxADcAMQAgAG0AbwBjAC4AeQBoAHAAYQByAGcAbwBwAHkAdAAuAHcAdwB3ACAAdABhACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAHQAYwBhAHQAbgBvAGMAIAByAG8AIAAsAGUAcgBhAHcAdABmAG8AcwAtAHQAbgBvAGYAYgBlAHcALwBtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQALgB3AHcAdwAvAC8AOgBwAHQAdABoACAAdABpAHMAaQB2ACAAZQBzAGEAZQBsAHAAIAAsAG4AbwBpAHQAYQBtAHIAbwBmAG4AaQAgAGUAcgBvAG0AIAByAG8ARgAgAC4AZQBzAG8AcAByAHUAcAAgAHkAbgBhACAAcgBvAGYAIABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaAB0ACAAZQBzAHUAIAB0AG8AbgAgAHkAYQBtACAAdQBvAHkAIAAsAHMAdABzAGkAeABlACAAdABuAGUAbQBlAGUAcgBnAGEAIABoAGMAdQBzACAAbwBuACAAZgBJACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGQAbgBhACAAdQBvAHkAIABuAGUAZQB3AHQAZQBiACAAcwB0AHMAaQB4AGUAIAB0AGEAaAB0ACAAdABuAGUAbQBlAGUAcgBnAGEAIABlAGMAaQB2AHIAZQBTACAAZgBvACAAcwBtAHIAZQBUACAAZQBoAHQAIABvAHQAIAB0AGMAZQBqAGIAdQBzACAAcwBpACAAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAdAAgAGUAcwB1ACAAbwB0ACAAdABoAGcAaQByACAAcgB1AG8AWQAgAC4AbgBvAGkAdABhAGMAbwBsACAAeQBuAGEAIABtAG8AcgBmACAAdABpACAAdABzAG8AaAAgAHIAbwAgACwAcgBlAHQAdQBwAG0AbwBjACAAeQBuAGEAIABuAG8AcAB1ACAAdABpACAAbABsAGEAdABzAG4AaQAgAHIAbwAgACwAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAdAAgAGQAYQBvAGwAbgB3AG8AZAAgAHIAbwAgACwAZQB0AHUAYgBpAHIAdABzAGkAZAAgACwAeQBmAGkAZABvAG0AIAAsAHkAcABvAGMAIAB0AG8AbgAgAHkAYQBtACAAdQBvAFkAIAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIACAAZgBvACAAeQB0AHIAZQBwAG8AcgBwACAAZQBoAHQAIABzAGkAIABlAHIAYQB3AHQAZgBvAHMAIABzAGkAaABUAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgALgBzAG4AbwBpAHQAYwBpAGQAcwBpAHIAdQBqACAAbgBpAGEAdAByAGUAYwAgAG4AaQAgAGQAZQByAGUAdABzAGkAZwBlAHIAIABlAGIAIAB5AGEAbQAgAGgAYwBpAGgAdwAgACwALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGYAbwAgAGsAcgBhAG0AZQBkAGEAcgB0ACAAYQAgAHMAaQAgAGQAZQBkAG4AdQBvAFIAIABtAGEAaAB0AG8ARwB0AG4AbwBGADEAMAAyAC4AMQAgAG4AbwBpAHMAcgBlAFYAOQAxADIAMAA0ADEALQAzADIANAAyAC0AMwAyADYAMAA1ADEAMAAyAC0ANAA3ADQAOAA4AC0ANwA0ADIAMQA3ADEAcgBhAGwAdQBnAGUAUgBtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQAIAB8ACAAbwBDACYASAAgACkAQwAoACAAdABoAGcAaQByAHkAcABvAEMAbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaAAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIAA3ADAAMAAyACAALAA2ADAAMAAyACAAKQBDACgAIAB0AGgAZwBpAHIAeQBwAG8AQwBlcmF3dGZvcy10bm9mYmV3L21vYy55aHBhcmdvcHl0Lnd3dy8vOnB0dGhtb2MueWhwYXJnb3B5dC53d3c5MTIwNDEtMzI0Mi0zMjYwNTEwMi00NzQ4OC03NDIxNzEgbW9jLnlocGFyZ29weXQud3d3IHRhIC5vQyAmIHJlbGZlb0ggdGNhdG5vYyBybyAsZXJhd3Rmb3MtdG5vZmJldy9tb2MueWhwYXJnb3B5dC53d3cvLzpwdHRoIHRpc2l2IGVzYWVscCAsbm9pdGFtcm9mbmkgZXJvbSByb0YgLmVzb3BydXAgeW5hIHJvZiBlcmF3dGZvcyBzaWh0IGVzdSB0b24geWFtIHVveSAsc3RzaXhlIHRuZW1lZXJnYSBoY3VzIG9uIGZJIC5vQyAmIHJlbGZlb0ggZG5hIHVveSBuZWV3dGViIHN0c2l4ZSB0YWh0IHRuZW1lZXJnYSBlY2l2cmVTIGZvIHNtcmVUIGVodCBvdCB0Y2VqYnVzIHNpIGVyYXd0Zm9zIHNpaHQgZXN1IG90IHRoZ2lyIHJ1b1kgLm5vaXRhY29sIHluYSBtb3JmIHRpIHRzb2ggcm8gLHJldHVwbW9jIHluYSBub3B1IHRpIGxsYXRzbmkgcm8gLGVyYXd0Zm9zIHNpaHQgZGFvbG53b2Qgcm8gLGV0dWJpcnRzaWQgLHlmaWRvbSAseXBvYyB0b24geWFtIHVvWSAub0MgJiByZWxmZW9IIGZvIHl0cmVwb3JwIGVodCBzaSBlcmF3dGZvcyBzaWhULm9DICYgcmVsZmVvSC5zbm9pdGNpZHNpcnVqIG5pYXRyZWMgbmkgZGVyZXRzaWdlciBlYiB5YW0gaGNpaHcgLC5vQyAmIHJlbGZlb0ggZm8ga3JhbWVkYXJ0IGEgc2kgZGVkbnVvUiBtYWh0b0d0bm9GMTAyLjEgbm9pc3JlVjkxMjA0MS0zMjQyLTMyNjA1MTAyLTQ3NDg4LTc0MjE3MXJhbHVnZVJtb2MueWhwYXJnb3B5dCB8IG9DJkggKUMoIHRoZ2lyeXBvQ21vYy55aHBhcmdvcHl0Lnd3dy8vOnB0dGggLm9DICYgcmVsZmVvSCA3MDAyICw2MDAyIClDKCB0aGdpcnlwb0M/A0YAEgAJBAEAAwA/A0YAEQAJBAEAAwA/A0YAEAAJBAEAAwA/CVQADgAJBAEAAwBrBSIEDQAJBAEAAwA/CSQADAAJBAEAAwA/CSQACwAJBAEAAwBrBSIECgAJBAEAAwBRBRoACQAJBAEAAwBRBRoACAAJBAEAAwA/BD8ABwAJBAEAAwA/BAgABgAJBAEAAwBtBBoABQAJBAEAAwA/A0YABAAJBAEAAwArBEIAAwAJBAEAAwAdBA4AAgAJBAEAAwA/A0YAAQAJBAEAAwBXAz8AAAAJBAEAAwBAACMAEgAAAAAAAQBAACMAEQAAAAAAAQBAACMAEAAAAAAAAQAtAyoADgAAAAAAAQAKARECDQAAAAAAAQAbAxIADAAAAAAAAQAbAxIACwAAAAAAAQAKARECCgAAAAAAAQA/AA0ACQAAAAAAAQA/AA0ACAAAAAAAAQA/AGEABwAAAAAAAQA/AAQABgAAAAAAAQA/AA0ABQAAAAAAAQBAACMABAAAAAAAAQBqACEAAwAAAAAAAQBjAAcAAgAAAAAAAQBAACMAAQAAAAAAAQAAAEAAAAAAAAAAAQA/ASQAAAABACAAIAA/Aj8BAAAAAAsAAAA/AD8DPwA4PyADEj8kAAAAb0MmSAAAAAAAAAAASgAAUH8AAD8AAAAAAAAAAAAAAAA/ADIAPwEAAD8CPwI/AAAAPwI/AgQABQAsAU0CAgAAABsAAFAAABsAAAAAAAAAAAAAAAAAAAABAD8DAAAAAD8DAAAQPz8DAAABAAAAAAAAAAIACAAAACADPwM4PwAAHwIsPwAAAAAfAiw/AAAAAD8DCwA/PA9fPz8/LkEAAQAAAAEAIAAAAHgQAAAyAD8/dHNvcD8LAAA/AQAABDM1KGVtYW4GAAAAGAEAAABQGwBweGFtbAAAADAfAAA/Bj89eHRtaCQAAAA/AAAAAANhB2FlaGg2AAAAPwAAAD9HFgNkYWVoCAAAACgfAAALAAAAcHNhZzoDAAA8DQAAAj8/cGFtY2AAAAAgAQAASyU/VTIvU08gAAAACB8AAAQASABGRURHbw4AAD8QAABjPz9PIEZGQzAAAwA/AAsAT1RUTw==))); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/opentype;base64,T1RUTwALAIAAAwAwQ0ZGIE+2i2MAABCYAAAOb0dERUYASAAEAAAfCAAAACBPUy8yVcclSwAAASAAAABgY21hcO62ywIAAA08AAADOmdhc3AAAAALAAAfKAAAAAhoZWFkAxZHvAAAALwAAAA2aGhlYQdhAwAAAAD0AAAAJGhtdHg9xwbVAAAfMAAAAGxtYXhwABtQAAAAARgAAAAGbmFtZSg1MwQAAAGAAAALu3Bvc3T/uAAyAAAQeAAAACAAAQAAAAEAQS6s5cVfDzz1AAsD6AAAAADQLAIfAAAAANAsAh8AAP84A58DIAAAAAgAAgAAAAAAAAABAAADwP8QAAAD1AAAAAADnwABAAAAAAAAAAAAAAAAAAAAGwAAUAAAGwAAAAICTQEsAAUABAK8AooAAACMArwCigAAAd0AMgD6AAAAAAAAAAAAAAAAoAAAf1AAAEoAAAAAAAAAAEgmQ28AAAAk4BIDIP84AMgDwADwAAAACwAAAAAB/gK8ACAAIAABAAAAJAG2AAEAAAAAAAAAQAAAAAEAAAAAAAEAIwBAAAEAAAAAAAIABwBjAAEAAAAAAAMAIQBqAAEAAAAAAAQAIwBAAAEAAAAAAAUADQCLAAEAAAAAAAYABACYAAEAAAAAAAcAYQCcAAEAAAAAAAgADQD9AAEAAAAAAAkADQD9AAEAAAAAAAoCEQEKAAEAAAAAAAsAEgMbAAEAAAAAAAwAEgMbAAEAAAAAAA0CEQEKAAEAAAAAAA4AKgMtAAEAAAAAABAAIwBAAAEAAAAAABEAIwBAAAEAAAAAABIAIwBAAAMAAQQJAAAAgANXAAMAAQQJAAEARgPXAAMAAQQJAAIADgQdAAMAAQQJAAMAQgQrAAMAAQQJAAQARgPXAAMAAQQJAAUAGgRtAAMAAQQJAAYACASHAAMAAQQJAAcAwgSPAAMAAQQJAAgAGgVRAAMAAQQJAAkAGgVRAAMAAQQJAAoEIgVrAAMAAQQJAAsAJAmNAAMAAQQJAAwAJAmNAAMAAQQJAA0EIgVrAAMAAQQJAA4AVAmxAAMAAQQJABAARgPXAAMAAQQJABEARgPXAAMAAQQJABIARgPXQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEhvZWZsZXIgJiBDby4gaHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbUNvcHlyaWdodCAoQykgSCZDbyB8IHR5cG9ncmFwaHkuY29tUmVndWxhcjE3MTI0Ny04ODQ3NC0yMDE1MDYyMy0yNDIzLTE0MDIxOVZlcnNpb24gMS4yMDFGb250R290aGFtIFJvdW5kZWQgaXMgYSB0cmFkZW1hcmsgb2YgSG9lZmxlciAmIENvLiwgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgaW4gY2VydGFpbiBqdXJpc2RpY3Rpb25zLkhvZWZsZXIgJiBDby5UaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wZXJ0eSBvZiBIb2VmbGVyICYgQ28uIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgb3IgZG93bmxvYWQgdGhpcyBzb2Z0d2FyZSwgb3IgaW5zdGFsbCBpdCB1cG9uIGFueSBjb21wdXRlciwgb3IgaG9zdCBpdCBmcm9tIGFueSBsb2NhdGlvbi4gWW91ciByaWdodCB0byB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBzdWJqZWN0IHRvIHRoZSBUZXJtcyBvZiBTZXJ2aWNlIGFncmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAyADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAUgBvAHUAbgBkAGUAZAAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4ALAAgAHcAaABpAGMAaAAgAG0AYQB5ACAAYgBlACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAGMAZQByAHQAYQBpAG4AIABqAHUAcgBpAHMAZABpAGMAdABpAG8AbgBzAC4ASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgBUAGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAdABoAGUAIABwAHIAbwBwAGUAcgB0AHkAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAsACAAbQBvAGQAaQBmAHkALAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAG8AcgAgAGQAbwB3AG4AbABvAGEAZAAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGkAbgBzAHQAYQBsAGwAIABpAHQAIAB1AHAAbwBuACAAYQBuAHkAIABjAG8AbQBwAHUAdABlAHIALAAgAG8AcgAgAGgAbwBzAHQAIABpAHQAIABmAHIAbwBtACAAYQBuAHkAIABsAG8AYwBhAHQAaQBvAG4ALgAgAFkAbwB1AHIAIAByAGkAZwBoAHQAIAB0AG8AIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABUAGUAcgBtAHMAIABvAGYAIABTAGUAcgB2AGkAYwBlACAAYQBnAHIA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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/8E2ED03EAA5ED8BE2.css b/docs/static/fonts/332720/8E2ED03EAA5ED8BE2.css deleted file mode 100644 index 4aeacc5add..0000000000 --- a/docs/static/fonts/332720/8E2ED03EAA5ED8BE2.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,T1RUTwANAIAAAwBQQ0ZGIKWnUnEAABFoAAAs60dERUYApgAEAAA+VAAAACBHUE9T5Gif/gAAPnQAAB1aR1NVQunbLV4AAFvQAAAAgE9TLzJVxSTvAAABQAAAAGBjbWFwaLtaTgAADVwAAAPsZ2FzcAAAAAsAAFxQAAAACGhlYWQDcke8AAAA3AAAADZoaGVhB74DwAAAARQAAAAkaG10eAmBHxsAAFxYAAAB5G1heHAAeVAAAAABOAAAAAZuYW1lKDUzBAAAAaAAAAu7cG9zdP+4ADIAABFIAAAAIAABAAAAAQBByTlTkF8PPPUACwPoAAAAANAsAh4AAAAA0CwCHv/o/zgEEwMiAAAACAACAAAAAAAAAAEAAAPA/xAAAARO/+j/6AQTAAEAAAAAAAAAAAAAAAAAAAB5AABQAAB5AAAAAgHwASwABQAEArwCigAAAIwCvAKKAAAB3QAyAPoAAAAAAAAAAAAAAACgAAB/UAAASgAAAAAAAAAASCZDbwAAACLgEgMg/zgAyAPAAPAAAAALAAAAAAH+ArwAIAAgAAIAAAAkAbYAAQAAAAAAAABAAAAAAQAAAAAAAQAjAEAAAQAAAAAAAgAHAGMAAQAAAAAAAwAhAGoAAQAAAAAABAAjAEAAAQAAAAAABQANAIsAAQAAAAAABgAEAJgAAQAAAAAABwBhAJwAAQAAAAAACAANAP0AAQAAAAAACQANAP0AAQAAAAAACgIRAQoAAQAAAAAACwASAxsAAQAAAAAADAASAxsAAQAAAAAADQIRAQoAAQAAAAAADgAqAy0AAQAAAAAAEAAjAEAAAQAAAAAAEQAjAEAAAQAAAAAAEgAjAEAAAwABBAkAAACAA1cAAwABBAkAAQBGA9cAAwABBAkAAgAOBB0AAwABBAkAAwBCBCsAAwABBAkABABGA9cAAwABBAkABQAaBG0AAwABBAkABgAIBIcAAwABBAkABwDCBI8AAwABBAkACAAaBVEAAwABBAkACQAaBVEAAwABBAkACgQiBWsAAwABBAkACwAkCY0AAwABBAkADAAkCY0AAwABBAkADQQiBWsAAwABBAkADgBUCbEAAwABBAkAEABGA9cAAwABBAkAEQBGA9cAAwABBAkAEgBGA9dDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgSG9lZmxlciAmIENvLiBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tQ29weXJpZ2h0IChDKSBIJkNvIHwgdHlwb2dyYXBoeS5jb21SZWd1bGFyMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5VmVyc2lvbiAxLjIwMUZvbnRHb3RoYW0gUm91bmRlZCBpcyBhIHRyYWRlbWFyayBvZiBIb2VmbGVyICYgQ28uLCB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBpbiBjZXJ0YWluIGp1cmlzZGljdGlvbnMuSG9lZmxlciAmIENvLlRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3BlcnR5IG9mIEhvZWZsZXIgJiBDby4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBvciBkb3dubG9hZCB0aGlzIHNvZnR3YXJlLCBvciBpbnN0YWxsIGl0IHVwb24gYW55IGNvbXB1dGVyLCBvciBob3N0IGl0IGZyb20gYW55IGxvY2F0aW9uLiBZb3VyIHJpZ2h0IHRvIHVzZSB0aGlzIHNvZnR3YXJlIGlzIHN1YmplY3QgdG8gdGhlIFRlcm1zIG9mIFNlcnZpY2UgYWdyZWVtZW50IHRoYXQgZXhpc3RzIGJldHdlZW4geW91IGFuZCBIb2VmbGVyICYgQ28uIElmIG5vIHN1Y2ggYWdyZWVtZW50IGV4aXN0cywgeW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb20vd2ViZm9udC1zb2Z0d2FyZSwgb3IgY29udGFjdCBIb2VmbGVyICYgQ28uIGF0IHd3dy50eXBvZ3JhcGh5LmNvbSAxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTl3d3cudHlwb2dyYXBoeS5jb21odHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUAQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAwADYALAAgADIAMAAwADcAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAASAAmAEMAbwAgAHwAIAB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AUgBlAGcAdQBsAGEAcgAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQBWAGUAcgBzAGkAbwBuACAAMQAuADIAMAAxAEYAbwBuAHQARwBvAHQAaABhAG0AIABSAG8AdQBuAGQAZQBkACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAsACAAdwBoAGkAYwBoACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgBIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABjAG8AcAB5ACwAIABtAG8AZABpAGYAeQAsACAAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAbwByACAAZABvAHcAbgBsAG8AYQBkACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAsACAAbwByACAAaQBuAHMAdABhAGwAbAAgAGkAdAAgAHUAcABvAG4AIABhAG4AeQAgAGMAbwBtAHAAdQB0AGUAcgAsACAAbwByACAAaABvAHMAdAAgAGkAdAAgAGYAcgBvAG0AIABhAG4AeQAgAGwAbwBjAGEAdABpAG8AbgAuACAAWQBvAHUAcgAgAHIAaQBnAGgAdAAgAHQAbwAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAFQAZQByAG0AcwAgAG8AZgAgAFMAZQByAHYAaQBjAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHQAaABhAHQAIABlAHgAaQBzAHQAcwAgAGIAZQB0AHcAZQBlAG4AIAB5AG8AdQAgAGEAbgBkACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAEkAZgAgAG4AbwAgAHMAdQBjAGgAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGUAeABpAHMAdABzACwAIAB5AG8AdQAgAG0AYQB5ACAAbgBvAHQAIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAGEAbgB5ACAAcAB1AHIAcABvAHMAZQAuACAARgBvAHIAIABtAG8AcgBlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABwAGwAZQBhAHMAZQAgAHYAaQBzAGkAdAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0ALwB3AGUAYgBmAG8AbgB0AC0AcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABjAG8AbgB0AGEAYwB0ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGEAdAAgAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtACAAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUAAAAAAwAAAAMAAAAcAAEAAAAAAuYAAwABAAAAHAAEAsoAAABYAEAABQAYAF0AXwB9AKMApQCrAK4AsAC3ALsAxQDPANYA3QDlAO8A9gD9AQcBGwEjAScBMQE3AUgBUQFbAWUBfgH7Af8CGR6FHvMgFCAaIB4gIiAmIDogrCEi4BL//wAAACAAXwBhAKEApQCpAK4AsAC3ALoAvwDHANEA2ADgAOcA8QD4AP8BCgEeASYBKgE2ATkBTAFUAV4BagH6Af4CGB6AHvIgEyAYIBwgIiAmIDkgrCEi4BL////h/+D/3/+8/7v/uP+2/7X/r/+tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4FfgVOBT4FDgTeA738rfVSBmAAEAAAAAAAAAAAAAAAAAAAAAAAAAAABEAFAAYABqAHQAfgCOAJgAogCyANQA3gDgAO4A8AEOARgBJgE0AVwBXgFgAWIBbAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkAIgAiACIAIgAiACIAJAAmACYAJgAmACoAKgAqACoALwAwADAAMAAwADAAMAA2ADYANgA2ADoAQABAAEAAQABAAEAAQgBEAEQARABEAEgASABIAEgATQBOAE4ATgBOAE4ATgBUAFQAVABUAFgAWAAiAEAAIgBAACIAQAAkAEIAJABCACQAQgAlAEMAJQBDACYARAAmAEQAJgBEACYARAAmAEQAKABGACgARgAoAEYAKQBHACoASAAqAEgAKgBIACoASAAsAEoALQBLAC0ASwAtAEsALQBLAC0ASwAvAE0ALwBNAC8ATQAwAE4AMABOADAATgAzAFEAMwBRADMAUQA0AFIANABSADQAUgA1AFMANQBTADYAVAA2AFQANgBUADYAVAA2AFQAOABWADoAWAA6ADsAWQA7AFkAOwBZACIAQAAwAE4ANABSADgAVgA4AFYAOABWADoAWAAAAQYAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4APwBAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXAAAIiIkJi8wNkBAQEBAQEJERERESEhISE1OTk5OTlRUVFQAZV5fAHIAAGRhdwAAAAAwAAAAAGAAAAAAAABiZwAATmldAAAAAABjaHMAIiIwAABqa29wbG0AAFg6AHZ0dQAAAGZucQAiJiImJioqKiowMAAwNjY2SAAAAAAAAAAAAAAAAwAAAAAAAP+1ADIAAAAAAAAAAAAAAAAAAAAAAAAAAAEABAQAAQEBBUZvbnQAAQEBKPgQAPgdAfgeAvgeA/gWBFkMA3P7XPqn+bYF9ygPkx0AACo1EveDEQAEAQEFDExQRXVyb2hjb3NsdWdDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgSG9lZmxlciAmIENvLiBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tRm9udAAAAQEBAAEGAGgAAAk1AEAAAEIcAGACAGQAAKoAAIsAAGoAAKUAAKEAAHIAAI8AAHgAAHsAAG8AAIkAAEEAAAgAAHUAAGkAAHcAAHYAAHQAAHkAAGsBAYcAAJkAAYgAAHkCAAEAPgBBAGgAeQEiAdMCJQLcAuMDNAOFBBIETwRVBHQEegSxBQQFQAWqBiMGbwbqB2gHpgglCKMIsQjACQ8JHAlsCdQKjArqC1ILwQwIDEkMfQz4DTMNTw2WDfAOFA5xDrgPEA9UD+sQUhDTEP8RQRGREg4SgxLOExYTRRN+E68TzRRNFJAU+BU9FZ4V+BaBFsQW5hclF34XmRgCGEQYkxjXGRwZVRnQGicaaxq6GzwbsRwfHGcczBzpHU0ddB4cHpofIR/SIG4gwCFCIXohgSHZIisikyKxItAi2CLfIuUi9CMCIw8jLiNAI0kjUiQKJI8oUPsI+1wE+Ij6fPyIBtJZFff6i/tH/BoF+1z8SBWL+YT3QPwMBfd4+AwVi/2E+0D4DAVvTxX3R/wa+/qLBQ770A78APcD91cVg5KEk5OSkpMem/h3BZmAln0efwZ9gIB9H4n9AhUgCg77YveO+GEVIQr7ZvtrFSEKDt/3IqQViX2SfJyLmIuVlI2YCKj3Pfdji2/7NgWJfZJ8nIuYi5WUjZgIqPc99wmLBZiWlpiYgJV+H/sBi7T3gPcAiwWYlpaYmICVfh8ni6b3MgWNmYSaeot+i4GCiX4Ib/s5+2OLpvcyBY2ZhJp6i36LgYKJfghv+zn7CosFfoCAfn6WgZgf9wKLYvuA+wGLBX6AgH5+loGYH/AGw7oVtPeA92OLYvuABQ6b9735dhVlB/sOiDM+iyaLJ8lU9ypqCPuxBz2TTqpTv4iOhY+Ci36Lf3+LfouCj4WShc5R0mvihAg8B36WgJiYlpaYHtkH9xGP5NaL9YvtS8T7LKsI96wHwIW7d7xkkoWQipGLmYuXlouZi5WGkYKSVbNXo0ORCLMHmICWfn6AgH4e92f8wRWLP0pRJ4kI96gH9xZurmGLRgj8BvfqFYvTy8XsjQj7pQf7FaprtYvPCA73ZPdk9/IVIgpN++EVf5WClx6Ti5GPkJII+Hv5KwWOj4yPi5CLl4GUf4uDi4WHhoQI/Hv9KwWIh4qHi4YI+GhyFSIK/Cj4JRUjCvgq+/oVIwoO2/kJghWalpaaH4uWh5CDkwj7AfcEBa66qsOoyo2PjJGLjouZgJZ9i32LhIGJhnJRb1dsXwj7TPdRBfawzMSL4giNB99FzzAlQkYxHokHi1GkYMBQ+wZhSEaLLQiJB/sG5zv3Dx7pi9i3zdgI8/sABZKEkYaWiwj77Pg2FU3NeK2LtwiNB8q9vdLKu1tNHokHi0lYWidrCHf8ChUrR83gH40Hi8+8zPcDsQj3Y/tqBVFHSGE9iwgO0fhhFSEKDvtO9/P7HxWWk5OWH4uTh5GEj/sr6zb3FYv3OIv3OOD3Ffcr65KPj5GLk4uWg5OAi4aLhomJigj7PSgo+yWL+0eL+0fu+yX3PSiNipCJkIsIDvtO2vsfFZCLkI2NjPc97u73JYv3R4v3Ryj3Jfs97omMho2Gi4CLg4OLgIuDj4WShwj3Kyvg+xWL+ziL+zg2+xX7KyuEh4eFi4OLgJODlosIDvtO91f4PBWKf5SBl4uXi5SVipcIg/cB5k0FkYePiZGLlouUlYuWi5aEkISOCCS88rwFko6SkIuWi5aClYCLhYuHiYWHCDBNk/cBBYyXgpV/i3+LgoGMfwiT+wEwyQWFj4iNhIuAioKCi4CLgpGFk4cI8lokWgWEiISEi4KLgJSBlouRi4+NkY8I5skFDo/3sfcaFX2WgJmZlpaZHvdW91kHmJaWmJiAln4f+1n3VgaZgJZ9fYCAfR77VvtZB36AgH5+loCYH/dZBg7BMRUkCg77ZOn3oRX3cAaamJiamn6YfB/7cAZ8fn58fJh+mh8O3cMVIAoO+wiF+wMVf5SClx6Vi5KRj5MI+Fj6CgWNj4yQi4+Ll4KUf4uBi4SFh4MI/Fj+CgWJh4qGi4cIDun39n8V90b3Bfc991UfjQf3VfsD9zv7RvtG+wX7PftVHokH+1X3A/s790YejboV+yUv9y33Nh+NB/c35fcq9yX3Jef7LPs3HokH+zYx+yv7JR4O+633R6EVfZd/mZmWl5ke+SgHmIKXex6JBoCLgYiAhwj7Dl4FgIeDhYt/i3+VgZeLj4uPjJCNCPcGsgUOcbejFX2WgZke+EgGmZaWmZmAln0f/AuL92r3VgX3D/cEv8uL6wiNB/cBMt77Cx77CotLV1A1iIeKhouHi36WgZiLlIuRj5CSwdbEteCL34vVUIswCItBZE/7CCII+5H7eQWDhIeFi4IIDoX3y38V9w323fcOH40Hi/cU+wfJ+xmTCPd8950FkJGPk4uSCJiBlH4e/CIGfYCAfX2WgZkf9+6L+3r7nQWFhIiFi4UIfpaBmB6kBvcS51UpH4kHLzxMLR4zi0iwVM2HkIOQgot9i39/i32LhI+EjofDR99b9wGLCA67+FGgFX2WgJmZlpaZHvcq6geXlpWXl4CWfx8s+GQGnH+Xeh5/i4SGhYMI/Bb8cQWFg4mEi4UIe5aAmx74Bwb74rgV9+L4Mov8MgUOgPfCfxX3IfLr9xUfjQf3ESLh+xseSotee151CJz3mvfaiwWZlpaZmYCWfR/77wZ9i3+CingIevu0BYp8j36VhJOGlIeXi5yLurLmiwj3BdpIKB+JByY+QPsDHkWLR65Qw4aQgo+Di32LgH+Lf4uCjoWTg8RU4F7kiwgOpffffxX3Hvbt9xgfjQf3EfsG4vsTHvsGi0pNY0eG92rn9yn3IovIi7x1vWKQh5CJkYuZi5eXi5mLlIeRhJEIU7dSpEGLCPtC+wP7PPtnH4kHi/slqkXFUbVhy2/TiwiPuhX7BTbX7x+NB+Hb4vcH9wPaQyseiQcoQTn7BR4Obvc9nxV9l4GZHpeLlJSPlAj3yvkXBY6RjpOLkQiZgJR9Hvw6Bn2AgH19loCZH/gVi/vB/PsFiYeJhIuHCA6Z98+BFfcn9wXc9wgfjQeL3UjJM6jQp8m/i94IjQf3AfsH1fsN+w37B0H7AR6JB4s4yVfQbzNuSE2LOQiJB/sI9wU69yce+BsEKDjF4R+NB9rbxPHx21I8HokHNThRKB777AT7FT7Q2h+NB+LnyvcG9wbnTDQeiQc8Pkb7FR4Opfe5fxX3N/cO9zL3cB+NB4v3IGnaVcFhtU6oQIsI+yYnIfsVH4kH+wzwLfchHvcCi8/Ks9OT+2Yo+yv7IYtPi1ajVbmFkISNhYt9i4B/i32Lgo+FkoUIwGDLad2LCJz30xX7AzzT7R+NB+zS5PcH9wjePCgeiQczPzH7Cx4O/Azi+HUVIAr8PQQgCg78DOL4dRUgCm/8zxUkCg6P+JHzFZiUlpgfi5aEkoKQCPwb9174G/dcBZSQkpKLlouYgpZ+i4aLhYmHiQj8NPtsBX6EhoKLgAiJB4uAkIKYhAj4NPtsBY+JkYmQiwgOj/T4SxUlCvt1BCUKDo/3A/jsFX6CgH4fi4CShJSGCPgb+178G/tcBYKGhISLgIt+lICYi5CLkY2PjQj4NPdsBZiSkJSLlgiNB4uWhpR+kgj8NPdsBYeNhY2GiwgOOfeK90cVk4uSkYyXCJP3AwX3CJnrzYv3EAiNB/Y24/sYHiaLR15WTIeGiYWLhYt+lYKYi5OLko+QkbzDxa7Xiwjxy0Y5H4kHiyo+VPsEhHyKgoCMfgiW+xUFjH+ShZOLCGv7DxUgCg74APiH+zYV8IvfptW3jo2Pj4uSi5KFkoSLiIuGiomKQWFEdSmLCPuF+z/3SPd093P3QfdL93v3evdA+0n7S/slQU1FUmqqxB+Ll46kka4IrfdWBY6bgZp7i36LgoKIfAiAUAV0t164OosI+wT7DSH7IyHbQ+wf2ou+tbS+nFK8Z9GLCODs0/c/92f7U/dN+4n7iftV+1v7g/uD91L7WfeUH1b3rhU9VL3g9wTl4ObXw088KTUsLR8O90LDnRV/loGYHpeLk5KQlwjd90n4MYvd+0gFkICUgpeLmYuWlouYi5CKkIiRCPu++RoFhJqBlXmLCIkGeYuBgYR8CPu//RwFiIWKhYuHCPct93UV9034KfdM/CkFDvXzpRV9l3+ZHveqBvcr79X3CR+NB4vsQbs3ocSiybuL6giNB4u3e7BuqGSyS6I8iwj7mwZ9f399H7/7vRX3p/eAB/cEylc+H4kHLkBYIh77e/vdFfet94EH9x7WWTUfiQczP1T7DB4O9w74OX8V9wmL2LbSzY+Pj5GLk4uYf5d+i4OLhYeHh0lMSGksiwj7O/sV9x73RR+NB/dE9xP3Hfc8Hu2LzmXFVo+HkoiSi5mLmJeLmYuUhpKGkEfFQrP7CIsI+177KPs4+1ofiQf7Xfco+zP3XB4O9zrzpRV9l3+ZHvdjBvdw9yz3LfdZH40H91n7LPcr+3Ae+2MGfX9/fR+//QYV+PD3SQf3V/cP+xz7Oh+JB/s7+w/7GftXHg7B9xYW+F0GmJaWmJiAln4f/EP3rfgRBpiWlpiYgJZ+H/wR96f4PgaYlpaYmICWfh/8WAZ9f399H/0cB32Xf5keDrPzoRV9l3+ZmZeXmR73u/gMB5iWlpiYgJZ+H/wM97P4OQaYlpaYmICWfh/8UwZ9f399Hw73PPg9fxXzi+Kyzb6WlJKWi5UI93kHmX+XfR77hgZ+gIB+fpaAmB/3bvtdBlhgOGYyiwj7T/sF9xv3SR+NB/c99wv3JPc+HuyLxm7BYZGGkYmPi5mLl5eLmYuUh5KFkEq8Rqgiiwj7Zfsd+0H7UR+JB/tZ9xf7N/dxHg73JPOhFX2Xf5mZl5eZHvfG+FT7xgd9l3+ZmZeXmR75JAeZf5d9fX9/fR77wvxU98IHmX+XfX1/f30eDvvq9wOhFX2Xf5mZl5eZHvkkB5l/l319f399Hg5I942BFcOLvZ6wsLKypMmL3Aj4VgeZf5d9fX9/fR78Wgf7DklKNR4/i12sYsqIkISSgIt9i39/i32Lho2FjYi1SMtb7IsIDu7zoRV9l3+ZmZeXmR6L9zD3QvdE96/78AWPhpKGlIuZi5iYi5mLk4iQhpEI+7H38fef96EFkJCOkYuSi5h+mH6Lg4uFh4eHCPxO/FyL+EoFmX+XfX1/f30eDo7zpRV9l3+ZHvg1BpiWlpiYgJZ+H/wb+QoGmX+XfX1/f30eDveQ86AVfZaAmZmWlpkei/jf95X8CgWRgpKHlIuUi5KPkZQI95X4Cov83gV9l3+ZmZeXmR75IweZf5d9HoYGgIuChYWCCPul/Cb7pfgmBYSUg5GAiwiGBn1/f30fDvdC86AVfZaAmZmWlpkei/jv+HX89gWTgZOElYsIjwaXlJWXH/koB5mAln19gIB9Hov84vxs+OsFhJSDkYCLCIMGfX9/fR8O9374PH8V92j3Ifc/91MfjQf3U/sf9z37aPto+yH7P/tTHokH+1P3H/s992gejboV+0H7Evci90EfjQf3QfcQ9yD3QfdB9xL7IvtBHokH+0H7EPsg+0EeDr/zoRV9l3+ZmZeXmR73g/dRB/cm9xPX9ycfjQf3GyHa+y4e+3gGfX9/fR+//AEV9+v3Wgf3EuFR+wMfiQcjM0f7Fh4O9374PH8V5IvYqca9CNpDBZKFkYeUi5qLl5eLmouVh5GDkgg7zgXFza3ji+gIjQf3U/sf9z37aPto+yH7P/tTHokH+1P3H/s992ge0vdpFfcJJwVZYUtzQ4sI+0H7Evci90EfjQf3QfcQ9yD3QfdB9xL7IvtBHokHizlvQFtUCPsH9AWEkYWPgot8i39/i3yLgY+Fk4QIDvbzoRV9l3+ZmZeXmR73oPd5B/dr+6wFkYOShZWLmYuYmIuZi5GIkYaRCPtb95YF9wqb4s6L9wkIjQeLvXe6aqxhtUamNYsI+6AGfX9/fR+/++UV98/3gwf3E9VQLR+JByY0UPsJHg6j9+mBFfcb7Nn3BR+NB4vxR8X7Nqz7Oq1luIvVCI0H1M/G8h7Si8h4yFyQh5GJkYuZi5eXi5mLlYWSho9Lu0qjLYsI+xYsOyMfiQeLIc9S9zxp9zNrsmCLQQiJBztDUCIeK4tFp0XKh46FjoSLfYt/f4t9i4KQhJCH2krdavSLCA6r976hFX2Xf5mZl5eZHvkK93QHmJaWmJiAln4f/IgGfoCAfn6WgJgf93QGDvck+BCAFfc+9wn2910f+BEHmX+XfX1/f30e/BcH+z0wNfsi+ygy6vc5HvgSB5l/l319f399HvwXB/tY9wsh9zweDvca+AqEFY0Gm4uUlJGZCPey+SIFjY+LjYuPi5eAl32Lf4uCgoaACPug/Qj7n/kHBYaXgpR+i3yLgH6Lf4uGi4mNhwj3sf0gBZF9lIKbiwgO+Hr3vZoVkH2TgpmLCI0GmYuUlY+YCPda+OD3WvzgBY9+lIGZiwiNBpmLk5WQmAj3fvkdBY2QjZCLj4uYfph+i3+Lg4OGfgj7avzy+1v48wWHloOUfosIiQZ9i4SCh4AI+1v88/tp+O8Fh5eBl32LfYt+fot9i4eMh42GCA711J8VfpWAmB6Wi5KSkpQI94P3y/eG+84FkYORhpWLmIuXl4uXi5KIkYWSCPuL99L3g/fFBY+QjpGLkYuYgZZ+i4CLhISEggj7efu8+3z3vwWFk4WQgYt+i39/i3+LhI+FkIQI94L7w/uO+9QFh4aIhYuFCA7v9+ChFX2Xf5mZl5eZHov3lPej+BEFj5GPkouSi5h+l36LgIuFhIWDCPuT/AH7kvgBBYWUhJGAi32Lfn+LfYuGjYWOhgj3pfwVBQ7T6xb4jQaYlpaYmICVfh/8X4v4Z/j0BZGTjpCLlAiMB5Z/ln4e/HwGfoCAfn6WgZgf+E6L/Gf89AWFg4iGi4IIigeAl4CYHg77Tu0jFX2Xf5ke93wGlZSUlZWClIEf+2j5hvdoBpWUlJWVgpSBH/t8Bn1/f30fDvsI+I77AxWLj4qQiY8I/Fj6CgWHk4SRgYt/i4KCi3+Lh4yGjYcI+Fj+CgWPg5KFlYuXi5SUi5cIDvtO9+D5NhWZf5d9Hvt8BoGCgoGBlIKVH/do/Yb7aAaBgoKBgZSClR/3fAaZl5eZHw57ifs0FfjwBpeVlZeXgZV/H/zwBn+BgX9/lYGXHw5h94x/FeyLyruuvAhLB3yVgZmZlZWaHve9B4vKebpprWawVJ5Gi0qLWHxXdIaJgoOLf4t/loCXi46Lj4yPjQi1n7qZw4sI9MpWJB91B1qYWpREiwj7GDBPIR+JByHxVeoejrkVPUW21R+NB9LHu/cAHtSLxH+2gAhRBy4ySyMeDrfooBV9loCZmZWWmR7kB7VLzVHxiwj3D/cR8Pc6H40H9zr7Ee77Dx4mi0pQX0gI980HmoCVfX2BgXwe95L9NhUmCg5e99J/FeKLxq++v4+PjZGLkIuXf5d/i4SLhoeHh2JiVmtJiwj7CS7t9w8fjQf3DuXs9wge0Iu7arRkj4eSiZGLmYuWlouZi5KIkoePXbZRsTOLCPsm+wb7EPsjH4kH+yP3BfsO9yceDrf4y/lZFZqAlX19gYF8HvvJB2HLScUliwj7D/sRJvs6H4kH+zr3ESj3Dx7wi8zGt84ILgd8loGZmZWVmh77kvhaFScKDmv3AverFZT3Bdng8Iv3CYvGLJIkCKX7ZBWRkY2Ri5CLmICVfouEi4aIh4diY1htQosnizDVgvcTCPgkBpeXlpf3JjD3Cvsj+x4j+wr7KB+JB/sz9wgg9xoe54vErL29CA77kvcPoBV9loCZmZWWmR74UPczB5eWlZeYgZV+H/szvAbirLXRHp6LnIibiJqImJWLmYuWg5WAjXqPeI5yi16LZ31xcW5ue12LUQhZVAd/gIF/fpWBmB/CBg6399H7NhXWi82jt7e0tKPFi9UI+C4HmYCWfX2BgH0eOgdhx0bBJYsI+w/7Diz7Jx+JB/sm9w4t9w8e8IvPwrfKCEEH+xc4SPsJHkSLSKFRtoeNh42Fi36Lf3+LgIuCj4OShs1d13PciwiE94sVIi/b9wcfjQf3C+XV9vX0P/sKHokH+wgiPSEeDojooBV8loGZmZWVmh73pgf12Nfv8sZGIh77rgd8loGZmZWVmh73twf3DkDj+xUeLotSXGlPCPe6B5mAln19gYB9Hg78A+n5MBUoCpH9LBV8loGZmZWVmh74aAeagJV9fYGAfR4O/APp+TAVKApV/eQVzbax2x/4qgeagJV9fYGAfR78rQdbcnRnHoWLg4yDi3+LgYGLf4t/lIOXiZKKk4uUiwgOU+igFXyWgZmZlZWaHovy9xD3EfdY+4YFkoOQiJSLmYuVlIuZi5KJkIaRCPtc94v3T/dSBZGRjY+LkouYgZV+i4SLhomGhgj7zfvYi/iiBZmAln19gYB9Hg78A++gFXyWgZmZlZWaHvlEB5mAln19gYB9Hg734+igFXyWgZmZlZWaHvelB/LT2+bmxUohHvuxB3yWgZmZlZWaHveoB/cG1s3h6cRL+wIe+64HfJaBmZmVlZoe97QH9xRA4PsNHiuLVFZqUm/GVL4yizCLXVlqVgjRB5qAlX19gYB9Hg6I6KAVfJaBmZmVlZoe96YH9djX7/LGRiIe+64HfJaBmZmVlZoe97cH9w5A4/sVHi6LUlxpTwjVB5qAlX19gYB9Hg6j99N/Ffcs9wP3EPcjH40H9yP7AvcO+yv7LPsD+xD7Ix6JB/sj9wL7DvcrHo25FfsKL+33Dx+NB/cM4u73DfcK5yn7Dx6JB/sMNCj7DR4Ot+j7HxV8loGZmZWVmh73jQe1S81R8YsI9w/3EfD3Oh+NB/c6+xHu+w8eJotKUF9ICOgHmoCVfX2BgXwe95L8WhUmCg63+Mv4fRWZgJZ9fYGAfR4yB2HLScUliwj7D/sRJvs6H4kH+zr3ESj3Dx7wi8zGt84I+5EHfJaBmZmVlZoe+5L4+hUnCg77bOigFXyWgZmZlZaZHvdQB4v3OOzc9wCVm4yVl4uZi5qAl3yLQ4syVV8oCPcQB5qAlX19gYB9Hg77C/eWgRXt2cXmH40Hi+U1qTmiQqBGoIvECI0Hvrmx0R68i7x7t3GOiZCJkYuYi5aWi5iLloSShY9ap06dVIsIKEZQOR+JB4sw53Lec9J3y3WLTwiJB1BVZUYeTotTn1axh46FjYWLfouAgIt+i4OQg4+Iv2TYcNCLCA77bPebghWoi6KRn5KVj5GSi5WLl4CVgIuEi3uBaIsIUGCl1B/33fc0B5eWlZeXgJZ/H/s09yIGmYCWfX2BgH0e+yJUB3+AgX9/loCXH8L74gYqy2DaHg6I+Jz4fRWagJV9fYGBfB77pgchPj8nJFDQ9B73rgeagJV9fYGBfB77twf7DtYz9xUe6IvEuq3HCEEHfJaBmZmVlpkeDmn31JkV92L4YgWNkIyOi5CLmYCWfYt+i4SDh4EI+1H8TftO+EsFhpaFlHyLfIuAgIt9i4aNho2GCPdh/GAFkX6Tg5mLCI0GmYuTk5GYCA73ifeUhBWNBpiLlJOQmgj3Jvg19yX8NQWQfJSDmIsIjQaXi5WTkJkI9zv4XwWNkI2Ri5GLl4CWfYt9i4SCiIEI+yn8Rfso+EUFh5aEk32LCIkGfouEg4eACPso/EX7KPhDBYeXg5R9i32Lf4CLfouGjYWNhgj3O/xfBZB9lYOXiwgOXc6eFX+VgJcelIuRkJGSCPdC92/3Q/txBZCFkYeUi5iLlpWLmIuSiJCHkAj7SPd190H3agWPkI2Qi5GLl4GWf4uCi4WGhYQI+zr7ZPs792YFhpGFj4KLfouAgYt+i4SOho+GCPdA+2r7Sft1BYeGiYaLhQgOb/cv+zcV1Iu/sbj2CPdj+IIFjZCMjouQi5mAln2LfouEg4eBCPtG/E77YPhMBYaWhZR8i3yLgICLfYuGjYaNhgj3ePxriIQFaj9pZlOLbIt5j3uRhY2GjYaLfouBgYt+i4CRhJOIpoGlha2LCA5N3xb4IQaXlZWXl4GVfx/78ov3+Pg8BZGSjpGLkwiMB5WAlX8e/BMGf4GBf3+VgZcf9+SL+/j8PAWFhIiFi4MIigeBloGXHg77HPgq+x8VlomVkYuXi5OFkYWN+yWxe7GL7gjWB4vkZqxIocqetK+L5AjWB4vum7H3JbGRjZGRi5OLl4GRgIn7PWlrS4skCDwHPXRaJHuDg4CAk4Ob8qJaPR48B4skq0v3PWkIDvve9w37AhV/lYGXl5WVlx76DgeXgZV/f4GBfx4O+xzV+V0VgI2BhYt/i4ORhZGJ9yVlm2WLKAhAB4sysGrOdUx4YmeLMghAB4soe2X7JWWFiYWFi4OLf5WFlo33Pa2ry4vyCNoH2aK88puTk5aWg5N7JHS82R7aB4vya8v7Pa0IDvwA9yH4jRWThJKDg4SEgx57/HcFfZaAmR6XBpmWlpkfjfkCFSkKDmj3b6AVh3mXfpuLmIuUlY2VCJvbBZiJmIuYi+OLx7C8v4+PjpCLkouXgZZ/i4OLhYeGhl9fV25Liwh/i3+Mf40I3/hEBbaArXGpbpCGkIiUi5mLlZaLmYuTiJGFkWmrY6lUmAiYywWPnX+Ye4t+i4KBiYEIfkd8iwX7JvsG+xD7Ix+JB4v7BtIn8mcI+w33kBWNB/cO5ez3CB6Uizn8PwU9q1Tbi+kIDqfNmBWEkYWSHvh2BpiWlZiYgJZ+H/v295b3qgaYlpaYmICWfh/7qvcLBovLnL6srKensJq7i9qLt2mzXZCGkYeUi5mLlpWLmYuSiJKHkAhfv1G0KYtOi1d2ZmZhYXRLi0AI+wpJB36AgH5+loCYH837mAY9eQWDiYeGi4QIDtH4BPegFfdWBpeWlZeXgJZ/H/tFi/eG9/AFj5GOkouRi5iBln6LgYuDhoWCCPuH+//7hff9BYSVhZGAi32Lf4CLfYuGjYSPhQj3hfvw+0SLBX+AgH9/loGXH/dWKftWBn+AgX5/loGXH/dWIwZ9loCZmZaWmR7z91YHl5aVl5iAlX8f+1YGDvdq+DJ/Ffdf9zT3OfdZH40H91n7Mvc3+1/7X/s0+zn7WR6JB/tZ9zL7N/dfHqcE+1H7Ivcp90sfjQf3S/cj9yv3UvdR9yL7KftLHokH+0v7I/sr+1IekPcqFceLsKGwq4+OjpGLkYuWgpSAi4WLhoiIiWxvbXteiwg+Tc/cH40H3MbO2h61i6t4pnSQh5CIkYuXi5WUi5eLkoeSho9rp2WhUIsIJDs0JR+JByTaNvIeDvt290L4LxW1i62doagIcAeBk4OVlZSTlR73NAeLroGmeZ11oW2VZYtni3CDbH2EiIaFi4OLgZODlYuOi4+Mj40In5SmlKeLCL6rcVgfhgd0kXOQZ4sIQlhpUB+JB0/DbcAeja8VZWqfrx+NB6yqo74esIukh6KECHAHXV5sWB4p+y4V93AGlpSUlpaClIAf+3AGgIKCgICUgpYfDib4PbYVl4uUlIyXi5KJj4eRCPsS90P3EvdBBY+QjZGLkYuXgZR/i4OLhYeGhAj7HftHBYSCiIWLhIuEjoWSggj3HftHBZCEkIeUiwj7YBYqCg77XPdk9/wV7Njb6h+MB+o/2ikqPjssHooHLNc87R6eBDNJ0eAfjAfgztLi481FNh6KBzZIRDQeSt4Vg5GFk5ORkZMewLMHvFAFj4aPiJGLk4uQkYuSi4+KjoeQCGW4BaSTnJ6Lpgiubp5nHksGg4WFgx+nQRXKugejmoF2eH1+ch8O+zr3dfgwFdrTz9kfjQfZQ888PENHPR6JBz3TR9oetwRRYLzAH40HwLa8xcW2WlYeiQdWYFpRHg7d98sVIAoO+3b3VvgvFd/Iz9ofjQfZT844N05HPB6JBz3HSN4e+xP7ChX3lAaWlJSWloKUgB/7lAaAgoKAgJSClh/3FfcxFVFfu8cfjQfFtLvGxbdbTx6JB1FiW1AeDib3uvhnFX+Bgn8fi4WNhY+GCPcS+0P7EvtBBYeGiYWLhYt/lYKXi5OLkY+Qkgj3HfdHBZKUjpGLkouSiJGElAj7HfdHBYaShY+Diwj7YBYrCg4597T4nRWDi4SFin8Ig/sDBfsIfStJi/sQCIkHIOAz9xge8IvPuMDKj5CNkYuRi5iBlH6Lg4uEh4aFWlNRaD+LCCVL0N0fjQeL7NjC9wSSmoyUloqYCID3FQWKl4SRg4sIq/cPFSkKDjPn96MV9+wGmZeXmZl/l30f++wGfX9/fX2Xf5kfDveu5/ejFfleBpmXl5mZf5d9H/1eBn1/f319l3+ZHw73P/lEFSwKDsb4oRUtCg7BMRUkCg77Yvfz+UQVLAr7SBYsCg77Ysb4oRUtCvdIFi0KDvtiwTEVJAr3SBYtCg77Jvd/93gVz8PCzx+NB89PwktKUFRHHokHR8NUzx4Oy/iqwxUuCvt2Fi4K+3YWLgoO+8X3cbYVKgoO+8Xl+GcVKwoO8/km9xwVmIGUfh6Ci4WHhoReSVJcOYv7BYs24Gz3Egj3ngaYlpaYmICWfh/7pwaJnYqfi5+LoY2hjqAI96UGmJaWmJiAln4f+5wGq/cK3d/wi+WLvmS/Ro+Fk4aUi5iLlpaLmIuRiJGIj1fTR8D7AosI+xaLJSJn+yMIQQZ+gIB+fpaAmB/LBoh1inWLdIt4jHiNeQhMBn6AgH5+loCYH9IGrPst9iP3Hov0i8/Gv9aOj42Qi5AIDtX3E/gpFYGShJWVk5KVHveZ4weUk5OUlIOTgh/7ZwaCg4OCgpODlB/jBvdi+5kVgZOElJWTkpUei/d29PsxBY+FkIeTi5KLkI+PkQj09zGL+3YFgZKElZWTkpUe96oHlIOTgh6HBoSLhoiHhQj7C/tJ+wv3SQWHkYeOg4sIhgaBhISBHw7Z96WdFS8KkpwVMApQthUxCppBFTEKhgQyCvfkkBUxCoYEMgr8OdYVqZKBm48GkIuLioyECJKihAaKhIuKhosIh52XBpKLjYmNgAiTn1iEkmKEBtGDFTIK+FX7QRX85vm0+OYG+yb9URWai5OUjJkIgwaKgoaEg4sIgYWSmpuRkZMfk4uOh49/CJOhgwaKhQWHj4aOhIsIfX5/eXqWgJ0f+xLcFYWJkJOSjZGRkI2Gg4OJhoYfKzsVopKGpJlyhoSikoW/BoGJBYmMh4yIiwiBgoV+H4qEhJJyhQfnhBWlkoObBo2Qjo+NiwiKB4eOiY6Pjo6PkIiOhh6Gi4eIiIMIlXmEkXKFB3vNFZGLj5MFjoaPiJKLCJePl5SXhZOCH4WLhoiJhQimeYSRB7tZFYeIiIeGj4eSH5SLkJGPlQiYqpCLi5J6i4uEkIuDd4KfkYuLknKLi4SQiwWLi5d0j4GKhoiIh4uOjoqShIsI+y339RWLdJp9onWWnJKbi5wIon+aenuAf3oewvv2FZKLjI8FjomOiJKLlIuQkYuSi5tzhYuTi42NjY6Lj4uOiI6HCJKYhQaJhgWJjoeNhouCi4aFi4WLe6OQi4OLiYmJiIuGi4iOh5EIhAZi9xcVmouXjpaUb65vqXmcgICGfYt8i2yhdKmLCJgqFYKEhJJ3B4OPhpMek4uPj42UCIaNBYqGiYmJiwiIio2OH5+Ykn6WB/ci90oVlHybgZ2LCKehoqqqdaBvH3KLeH17c4mmd5ZwipGVjpaLmAiuarJNSGFhYB6LbpV5oHVWeW5si2GLVrxjx4u1i62Zp6qsaaGAqYu2i66vjcUIhI0FgXp/f3aLd4t6l3Komp+bmJqUCPtl+3wVoZKHmgaRjo+Pj42Ihx55h4ShkoWeB5OIkYIehIuHh4iECJV6hJFyhQf3d1sVhJEHioiIh4mJh4+Ij4aQko6PjouRCJGGkYKBhISEHouGjYiPh4SJhYaLg4uDkYWXi5GLkI2Pj4+GjoqQi5OLjpCNkgiGjAWKh4qKiYuJi4mNiY6Oj46PjpEIkJIGaHAVhYePkR+Lj42OjY2Qho+GkIWIiYiKiYsI+xuvFZWOjY6NjIqLHouKiomHjomOH4Z9B/cXjxWOjY2Oj42IiB6Lh4mIiImHj4mOi44I+wX3vxWbe5d8mHyerJCjdKKCgX2AeH4IwfvYFS8KkpwVMAr7c2gVqJKDnaF5g4SokoO0k5JuBoSTe3Wbk5JuhJNigwf4WJEVh4iIh4eOiI+Pjo6Pj4iOhx8O93oU+PwVkxMAEwIAAQAYAD8AVwBvAKIAuwDYAPUBCgEhAWgBsAHjAhYCLQJTAmACcgKEcAd4mX2enpmZnh6mB559mXh4fX14HguJfJKHlIuUi4+Qj5gIxPddBY2UjpSLkQiXhJCCHngGe4uCg4h5CAvoyeDpH40H507gLy5NNi0eiQcuyDfnHgtTXMTaH40H1LXIxsO6UT0eiQdAYVBQHguBk4aSHpSLpJmdnZ2dlKmLwwikB559mXh4fX14HnYHi3eXgJqHjmh9dWd3hoiIhouGCAv4LgaZl5aZmX+XfR/8LgZ9f399fZeAmR8LISXj9xcfjQf3FvHk9fboNfsaHokH+x0yOvsDHgv18TP7Fx+JB/sWJTIhIC7h9xoejQf3HeTc9wMeC3qYfpycmZicHpwHnH2Yenp+fnoeC6YHnn2ZeHh9fXgecAd4mX2enpmZnh4Ll5WUlx+LkYmRh5AI+xL3Q/cS90EFj5CNkYuRi5eBlH+Lg4uFh4aECPsd+0cFhIKIhYuEi4SOhZKCCPcd+0cFkISRh5OLCAt/i4KCin+KhI6Hj4UI9xL7Q/sS+0EFh4aJhYuFi3+VgpeLk4uRj5CSCPcd90cFkpSOkYuSi5KIkYSUCPsd90cFhpKGj4KLCAuVg5CEHoKLcn15eXl5gm2LUwhyB3mafJ2dmpqdHqAHi59/lnyPiK6Zoa+fkI6OkIuQCAuBk4aSHpSLpJmdnZ2dlKmLwwikB518mnl5fHx5HnYHi3eXgJqHjmh9dWd3hoiIhouGCAtwB3iYfZ6emJmeHqYHnn6ZeHh+fXgeC4yYhZR9iwiAgoJ/f5ODmB+Wi5CRjZMIhAaKhoiJhosIhIiOlB8LkI2Hgx99BpSOjo8eC4aIj5eWjo+QkI6HgH+Ih4YfC5eUlJeXgpN/f4KDf36Ug5cfCwAAAQAAAA4AAAAYAAAAAAACAAEAAQB4AAEABAAAAAIAAAABAAAACgA0AE4AAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABAAQAAAAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAQAAAAEAAAACAAYAEAACAAAAAgASAsoAAQAAAAEc7gABAnYABAAAAB8ASABOAFQAXgBkAJ4AtAC+ANAA4gD4AQ4BOAFCAVgBagGAAYYBoAGuAdAB6gH8AgoCEAIuAkQCVgJcAmICcAABABj/9gABADf/xAACACv/8QBJAB4AAQAr/7AADgAQ/1YAEf/dABIACgAT/+wAFP/2ABX/oQAW/+wAF//dABj/9gAZ//EAGv/sACv/fgBV/84AV//OAAUAEP/dABL/+wAT//YAFP/2ABj/4gACABX/4gAY//EABAAQ//YAFv/7ABj/5wAa//sABAAQ/+wAEv/sABj/2AAa//YABQAQ/+wAE//2ABT/+wAY/+IAGv/7AAUAEP/2ABL/7AAU//YAGP/nABr/9gAKABD/dAAR/+wAEgAKABP/8QAU/+wAFf+rABb/5wAX/+wAGf/2ABr/8QACABj/9gAa//sABQAQ/+cAE//2ABT/9gAW//sAGP/nAAQAIP/7ADf/7AA5/+wAVf/2AAUAB//iABD/ugAgAAoAK/+SAFX/8QABACv/7AAGAAf/7AAQ/8QAK/+cADf/9gA5/+IAVQAKAAMACv/2ACD/7AA3/9gACAAH/8kAEP+IACv/iAA3//YAOf/sAEn/7ABV/9gAV//OAAYAB//2ACD/8QAr//YAN//sAEn/9gBV/84ABAAr//YASQAeAFX/7ABX//YAAwA3/4gASQAeAFX/ugABAD3/zgAHABD/ugAg//YAPf/OAD7/7ABV//EAV//2AFz/9gAFACD/8QA9/84APv/2AFX/9gBc//YABAAr//YASQAjAFX/9gBX//YAAQAV//EAAQAV/+wAAwA3/8QAOf/2AFX/0wABABIAFAABAB8ABQAHAAkACwAQABEAEwAUABUAFgAXABgAGQAaACMAJwArADEAMgA3ADkAPAA9AFAAVQBXAFoAXwBgAGkAdgACGcQABAAAF/gY3AA8ADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAP/x/6b/5/+c/6YAAP+SAAAAAAAA/5wAAP+IAAAAAP/nAAAAAP/nAAD/2P/s/+f/7AAAAAAAAAAAAAAAAP/EAAD/sP+w/5wAAAAAAAD/4gAA//b/xP/TAAD/2AAAAAAAAAAAAAAAAAAA/+wAAAAA//EAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAD/9gAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/9v/2AAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/2AAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/2//b/9gAAAAAAAP/TAAD/2P/2/8kAAP/T/93/yf+//9MAAAAAAAAAAP/Y/+z/7AAAAAD/2AAA/9gAAAAAAAAAAAAAAAAAAAAAAAD/4v/sAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9v/2AAD/9gAAAAAAAP+w/+wAAAAAAAAAAAAAAAAAAAAA//b/5wAAAAAAAAAAAAAAAP/xAAD/nP/2/5wAAAAA//YAAP/xAAAAAAAAAAAAAAAAAAAAAAAUAAD/9gAAAAAAAAAAAAAAAP/2AAD/8f/xAAAAAAAAAAAAAAAA/+wAAP/s//H/9v/iAAAACgAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAD/+wAAAAD/+wAAAAAAAP/nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/84AAP/2//b/8f/i/+IAAP/YAAD/9v/2AAAAAAAAAAAAAP/iAAAAAP/nAAD/zv/s/+f/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/5wAA/+z/xP/OAAD/zgAAAAAAAAAA/9gAAAAA/5z/7P+N/5wAAP9+AAAAAP/2/7AAAP+IAAAAAP/2AAAAAP/7AAD/2P/s//sAAAAAAAAAAAAAAAAAAP/EAAD/2P/Y/6YAAAAAAAD/7AAAAAD/xP/OAAD/xAAAAAAAAP/YAAD/4v/7/8kAAP/Y/93/zv/E/9gAAAAAAAAAAP/Y/+z/7AAAAAD/2AAA/9gAAAAAAAAAAAAAAAAAAAAAAAD/4v/sAAAAAAAAAAAAAAAA/9gAAAAAAAAAAAAA//sAAAAAAAAAAP+6AAAAAAAAAAAAAAAA//sAAP/2//H/9gAAAAAAAAAAAAAAAP/7AAD/nAAA/5wAAAAPAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAADwAAAAUAAAAKAAAACgAAAAAAAAAAAAAAAAAA/8kAAAAA/90AAP+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+wAA//YAAP/s//EAAP/nAAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/7AAAAAAAK//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAP/2//EAAP/i/+f/5//i//YAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAD/+wAAAAD/8f/2//H/8f/7AAAAAP+m/8n/kv/xAAAAAAAAAAAAAAAA/+z/ef+6AAD/7AAAAAAAAP95/87/nP+D/5z/pv/O/4P/pv+6/9j/2P+cAAAAAAAAAAAAAAAAAAD/jQAA/6b/zgAA/5z/nP+c/5z/nP+SAAAAAP/nAAD/7AAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAA//sAAAAAAAAAAP+c/9gAAP/nAAAAAAAA//YAAP/s//b/ugAAAAD/9gAAAAAAAP+6/+z/iP+//4j/2P/n/7//xP/Y/+wAAP/YAAAAAAAAAAAAAAAAAAD/xAAAAAD/7AAA/9gAAP/dAAD/2P/JAAAAAP+m/93/l//sAAAAAP/2//b/8f/s//b/uv/TAAD/9gAAAAAAAP+///H/nP/E/5z/3f/i/8T/zv/d//H/8f/dAAAAAAAAAAAAAAAAAAD/xAAA/5z/5wAA/93/3f/d/9j/3f/JAAAAAAAA/84AAP/iAAD/9gAA//EAAP/sAAD/9gAAAAD/9gAAAAAAAP/TAAAAAP/YAAD/zv/s/9j/zv/s//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAA/+wAAP/YAAD/2AAAAAAAAP+S/8T/fv/dAAAAAP/s/+z/7AAA//b/nP+6AAD/9gAAAAAAAP+S/9j/fv+X/37/sP/Y/5f/nP+1/+z/7P+1AAAAAAAAAAAAAAAAAAD/nAAA/5L/4gAA/7X/xP/J/7r/xP+wAAAAAAAA/9gAAP/2AAAAAAAAAAAAAAAA//YAAP/xAAAAAAAAAAAAAP/nAAAAAP/sAAD/4v/2/+z/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/xAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAAAAAAAAAAAAD/+wAAAAD/7P/sAAD/7AAAAAAAAAAAAAAAAP/2/6YAAAAA/84AAP+6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+cAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/sAAAAAP/xAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP+6//H/7AAAAAD/9gAA//YAAAAAAAAAAP/7AAAAAAAAAAD/4v/dAAD/9gAAAAAAAAAAAAAAAAAAAAD/5//s/+L/5//xAAAAAAAA/9gAAAAA/6b/8QAA/5wAAP+SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAP/EAAD/xAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAP/xAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/2AAD/9v/2AAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/sAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAP/sAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP/xAAAAAP/2AAAAAAAA//b/9gAKAAAAAAAAAAD/8f/xAAAACgAPAAAAAAAAAAAAAAAAAAD/+//7//b/+wAAAAAAAAAAAAAAAAAA/84AAP/s//EAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAA/5z/8f+I/5wAAP9+AAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/2AAAAAP/x//YAAAAAAAAADwAA/84AAAAAAAAAAP/YAAAAAP/sAAD/5wAAAAD/q/+6AAD/0wAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP+w//b/7AAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAD/4v/YAAAAAAAAAAAAAAAAAAAAAAAAAAD/5//n/+L/5//xAAAAAAAA/9gAAAAA/5z/8f+I/5wAAP9+AAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/2AAAAAP/x//YAAAAAAAAAAAAA/84AAAAAAAAAAP/YAAAAAP/sAAD/5wAAAAD/q/+6AAD/xAAA/+wAAP/YAAAAAAAA/6YAAP/Y/93/zv+w/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAP/YAAAAAP/2AAD/8f/2/+L/8f/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAB4AAAAeAB4AFP/2AAD/0//2/9MAAAAA//b/8QAAAAAAAAAAAAAAHgAjAAAAHgAjADcAAAAA/9MAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/7oAAP/Y/93/7P+1AAAAAAAAAAAAAAAAAAAAAP/2AAAAAP/7AAAAAAAA//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8f/2//H/8QAAAAAAAP/sAAAAAP/2/6YAAP/E/87/zv+c//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/9gAAAAD/4v/s/9P/4v/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP+1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAD/7P/xAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAP/YAAAAAP/nAAAAAP/nAAD/7AAA/+f/7P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//b/7P/sAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP+w//H/7AAAAAD/7AAA/+wAAAAAAAAAAP/2AAAAAAAAAAD/4v/OAAD/7AAAAAAAAAAAAAAAAAAAAAD/4v/n/93/4v/sAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAP/iAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAA/8T/8QAA/84AAP+6AAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAP/dAAD/3QAAAAAAAP+mAAD/sAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/xAAAAAP/xAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAA/90AAAAAAAD/9gAAAAAADwAAAAAAAAAAAAAAAP/2AAAAAP+c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AAsAAgANABEAAwAYABgACAAaABwACQAiACgADAArAC0AEwAwAD0AFgBAAEIAJABEAEcAJwBKAEoAKwBMAE8ALABRAFoAMABjAGMAOgBoAHEAOwBzAHUARQABAAgAAQAAAAEAAQABAAAAAQAAAAoAMAA+AAJERkxUAA5sYXRuABoABAAAAAD//wABAAAABAAAAAD//wABAAAAAXNzMDEACAAAAAEAAAACAAYADgAGAAAAAQAQAAEAAAABACgAAQAIAAEADgABAAEAeAABAAQAAQB4AAEAAAABAAAAAQABAAb/iQABAAEAeAABAAH//wAKAfQAAAEsAAAA/ABdAZoARQK8AC0CeAA9AzgANwK4ADEA5gBFAa4ARwGuADwBrgBMAmwAQADmADYBmABCAOYAUgH0//oCxgBBAU8AHgJOACwCYgA3ApgALwJdADwCggBAAksAQAJ2ADcCggBCAPAAVwDwADsCbAA8AmwATwJsAFkCFgAlA9QANQMWADgC0gBoAuIASQMOAGgCngBoApAAaAMQAEkC+ABoARIAbwIlACoCywBoAmsAaANkAGgDFgBoA1IASQKcAGgDUgBJAtMAaAKAAEECiAAyAvgAXQLuADgETgA8AtIASQLMADYCsABHAa4AYgH0AAkBrgA3Alj/6AI+ADMClABdAjsAOgKUADwCSAA6AWoALQKUADwCZQBdAPkAXgD5//sCMABdAPkAZAO3AF0CZQBdAoAAOgKUAF0ClAA8AZAAXQHxADMBkAAqAmUAUwJGADUDXQA6AjoAQwJMADQCKgA9AeAANwEeAHkB4AA1APwAXQJFAD4ChABCAq4ANQM+ADUBhgA6AgMANwGgACIBwgBKAOYAUgGGAC8CAwBDAhYANAIQAEIDggBCAOYATQDmADsA5gA2AZoATQGaADsBmgA2AdYAbwKoAFIBNwA3ATcAQwLQADcCsgAWArYAMg==); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/9C4B82DF21AA64A37.css b/docs/static/fonts/332720/9C4B82DF21AA64A37.css deleted file mode 100644 index 96c8c1f725..0000000000 --- a/docs/static/fonts/332720/9C4B82DF21AA64A37.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,T1RUTwANAIAAAwBQQ0ZGILkPphQAABIUAAAk2kdERUYAkAAEAAA28AAAACBHUE9TuESiiwAANxAAABwCR1NVQunFLUgAAFMUAAAAgE9TLzJVxiUrAAABQAAAAGBjbWFw0U4uVAAADVwAAASYZ2FzcAAAAAsAAFOUAAAACGhlYWQDcke+AAAA3AAAADZoaGVhB74DqgAAARQAAAAkaG10eNbiGPsAAFOcAAABjG1heHAAY1AAAAABOAAAAAZuYW1lKDUzBAAAAaAAAAu7cG9zdP+4ADIAABH0AAAAIAABAAAAAQBBj0s7+V8PPPUACwPoAAAAANAsAh8AAAAA0CwCH//o/zgEEwMiAAAACAACAAAAAAAAAAEAAAPA/xAAAARO/+j/6AQTAAEAAAAAAAAAAAAAAAAAAABjAABQAABjAAAAAgIsASwABQAEArwCigAAAIwCvAKKAAAB3QAyAPoAAAAAAAAAAAAAAACgAAB/UAAASgAAAAAAAAAASCZDbwAAACPgEgMg/zgAyAPAAPAAAAALAAAAAAH+ArwAIAAgAAIAAAAkAbYAAQAAAAAAAABAAAAAAQAAAAAAAQAjAEAAAQAAAAAAAgAHAGMAAQAAAAAAAwAhAGoAAQAAAAAABAAjAEAAAQAAAAAABQANAIsAAQAAAAAABgAEAJgAAQAAAAAABwBhAJwAAQAAAAAACAANAP0AAQAAAAAACQANAP0AAQAAAAAACgIRAQoAAQAAAAAACwASAxsAAQAAAAAADAASAxsAAQAAAAAADQIRAQoAAQAAAAAADgAqAy0AAQAAAAAAEAAjAEAAAQAAAAAAEQAjAEAAAQAAAAAAEgAjAEAAAwABBAkAAACAA1cAAwABBAkAAQBGA9cAAwABBAkAAgAOBB0AAwABBAkAAwBCBCsAAwABBAkABABGA9cAAwABBAkABQAaBG0AAwABBAkABgAIBIcAAwABBAkABwDCBI8AAwABBAkACAAaBVEAAwABBAkACQAaBVEAAwABBAkACgQiBWsAAwABBAkACwAkCY0AAwABBAkADAAkCY0AAwABBAkADQQiBWsAAwABBAkADgBUCbEAAwABBAkAEABGA9cAAwABBAkAEQBGA9cAAwABBAkAEgBGA9dDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgSG9lZmxlciAmIENvLiBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tQ29weXJpZ2h0IChDKSBIJkNvIHwgdHlwb2dyYXBoeS5jb21SZWd1bGFyMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5VmVyc2lvbiAxLjIwMUZvbnRHb3RoYW0gUm91bmRlZCBpcyBhIHRyYWRlbWFyayBvZiBIb2VmbGVyICYgQ28uLCB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBpbiBjZXJ0YWluIGp1cmlzZGljdGlvbnMuSG9lZmxlciAmIENvLlRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3BlcnR5IG9mIEhvZWZsZXIgJiBDby4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBvciBkb3dubG9hZCB0aGlzIHNvZnR3YXJlLCBvciBpbnN0YWxsIGl0IHVwb24gYW55IGNvbXB1dGVyLCBvciBob3N0IGl0IGZyb20gYW55IGxvY2F0aW9uLiBZb3VyIHJpZ2h0IHRvIHVzZSB0aGlzIHNvZnR3YXJlIGlzIHN1YmplY3QgdG8gdGhlIFRlcm1zIG9mIFNlcnZpY2UgYWdyZWVtZW50IHRoYXQgZXhpc3RzIGJldHdlZW4geW91IGFuZCBIb2VmbGVyICYgQ28uIElmIG5vIHN1Y2ggYWdyZWVtZW50IGV4aXN0cywgeW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb20vd2ViZm9udC1zb2Z0d2FyZSwgb3IgY29udGFjdCBIb2VmbGVyICYgQ28uIGF0IHd3dy50eXBvZ3JhcGh5LmNvbSAxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTl3d3cudHlwb2dyYXBoeS5jb21odHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUAQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAwADYALAAgADIAMAAwADcAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAASAAmAEMAbwAgAHwAIAB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AUgBlAGcAdQBsAGEAcgAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQBWAGUAcgBzAGkAbwBuACAAMQAuADIAMAAxAEYAbwBuAHQARwBvAHQAaABhAG0AIABSAG8AdQBuAGQAZQBkACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAsACAAdwBoAGkAYwBoACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgBIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABjAG8AcAB5ACwAIABtAG8AZABpAGYAeQAsACAAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAbwByACAAZABvAHcAbgBsAG8AYQBkACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAsACAAbwByACAAaQBuAHMAdABhAGwAbAAgAGkAdAAgAHUAcABvAG4AIABhAG4AeQAgAGMAbwBtAHAAdQB0AGUAcgAsACAAbwByACAAaABvAHMAdAAgAGkAdAAgAGYAcgBvAG0AIABhAG4AeQAgAGwAbwBjAGEAdABpAG8AbgAuACAAWQBvAHUAcgAgAHIAaQBnAGgAdAAgAHQAbwAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAFQAZQByAG0AcwAgAG8AZgAgAFMAZQByAHYAaQBjAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHQAaABhAHQAIABlAHgAaQBzAHQAcwAgAGIAZQB0AHcAZQBlAG4AIAB5AG8AdQAgAGEAbgBkACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAEkAZgAgAG4AbwAgAHMAdQBjAGgAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGUAeABpAHMAdABzACwAIAB5AG8AdQAgAG0AYQB5ACAAbgBvAHQAIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAGEAbgB5ACAAcAB1AHIAcABvAHMAZQAuACAARgBvAHIAIABtAG8AcgBlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABwAGwAZQBhAHMAZQAgAHYAaQBzAGkAdAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0ALwB3AGUAYgBmAG8AbgB0AC0AcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABjAG8AbgB0AGEAYwB0ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGEAdAAgAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtACAAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUAAAAAAwAAAAMAAAAcAAEAAAAAA5IAAwABAAAAHAAEA3YAAACsAIAABgAsACAAIwAvADQANwA/AEQARwBNAF0AXwBjAHEAdAB2AHkAfQCjAKUAqwCuALAAtwC7AMUAxwDWAN0A5QDvAPYA+AD9AQcBDgEQARMBFQEXARkBGwEjAScBKwEtAS8BMQE3AUIBRAFGAUgBUQFUAVYBWAFaAV4BYAFlAWoBbAFuAXABcgF0AXkBewF9AfsB/wIYHoAegh6EHvMgFCAaIB4gIiAmIDogrCEi4BL//wAAACAAIgAlADQANwA6AEEARgBKAE8AXwBhAGUAdAB2AHgAewCiAKUAqQCuALAAtwC6AL8AxwDSANgA4ADnAPEA+AD9AP8BCgEQARMBFQEXARkBGwEeAScBKwEtAS8BMQE2ATkBRAFGAUgBTAFUAVYBWAFaAV4BYAFiAWoBbAFuAXABcgF0AXYBewF9AfoB/gIYHoAegh6EHvIgEyAYIBwgIiAmIDkgrCEi4BL////h/+D/3//b/9n/1//W/9X/0//S/9H/0P/P/83/zP/L/8r/pv+l/6L/oP+f/5n/lwAA/1IAAAAAAAAAAAAA/0b/RwAAAAD/Cv8h/x//Hf8b/xkAAP8Q/w3/C/8J/wcAAAAA/vn+9/71AAD+0P7O/sz+y/7H/sUAAP69/rv+uf63/rX+tQAA/rH+rwAAAAD+DeGp4afhpQAA4EHgPuA94DrgN+Al37TfPyBQAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAIYAjgCYAKIAsgAAAAAAuADIAAAAAAAAAAAAAAAAAMQAAAAAAAAAAAAAAMQAxgAAAAAAAADSAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAygAAAAAAzADOAAAAAAAAAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAFwAXABcAFwAXABcAIQAhACEAIQAhACEAJwAnACcAJwArADEAMQAxADEAMQAxADMANAA0ADQANAA4ADgAOAA4AD0APgA+AD4APgA+AEQAFwAxABcAMQAXADEAGQAzABkAMwAZADMAGgAcADYAHAA2ABwANgAeADoAHwA7AB8AOwAfADsAHwA7AB8AOwAhAD4AIQA+ACEAPgAmAEEAJgBBACsARAArACwAFwAxACEAPgArAEQAAAEGAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgMABAUGBwgJCgsMDQ4AAAAADwAAEAAAERITFBUWABcYGRoAGxwAAB0eHyAAISIjJCUmJygpKissLS4vADAAMTIzADQ1Njc4OTo7PD0+P0AAAEEAQgBDRABFRkcAABcXGQAAIScxMTExMTEzNDQ0NDg4ODg9Pj4+Pj4AAAAAAE9ISQBcAABOS2EAAAAAIQAAAABKAAAAAAAATFEAAD5TAAAAAAAATVJdABcXIQAAVFVZWlZXAABEKwBgXl8AAABQWFsAFwAXAAAAAAAAISEAIScnJzgAAAAAAAAAAAAAAAMAAAAAAAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQVGb250AAEBASj4EAD4HQH4HgL4HgP4FgRZDANz+1z6p/m2BfcoD5MdAAAiXBL3rREABAEBBQxMUEV1cm9oY29zbHVnQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEhvZWZsZXIgJiBDby4gaHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbUZvbnQAAAEBAQABAAADAQAGAQBoAAAJBwAVAAAYAAAbBQAiAwAnAQArAwAwDgBAAABCAgBGDABVAABXAABZAQBcAgBhAQBkAACqAACLAABqAAClAAChAAByAACPAAB4AAB7AABvAACJAABBAAAIAAB1AABpAAB3AAB2AAB0AAB5AABrAQGHAACZAAGIAABjAgABAD4AQQBSAPsBTQIEAgsCXAKtAzoDdwN9A5wDogPZBCUEYwRxBIAEzwTcBSwFlAXyBloGyQcQB0QHvwgGCGAIhAjhCTkJfQoUCnsK/AsoC2oLugw3DKwM9w0/DW4Npw3YDfYOdg65DyEPgg/cEGUQqBDKEQkRYhF9EeYSKBJ3ErsTGhNxE8AUNRSjFQgVJRWJFjEWrxc2F+cYgxjVGVcZjxmWGe4aQBq8Gtoa+RsBGwgbDhsdGysbOBtXG2kbcht7HDMcuCB5+wj7XAT4iPp8/IgG0lkV9/qL+0f8GgX7XPxIFYv5hPdA/AwF93j4DBWL/YT7QPgMBW9PFfdH/Br7+osFDvvQDvti9474YRUgCvtm+2sVIAoO3/cipBWJfZJ8nIuYi5WUjZgIqPc992OLb/s2BYl9knyci5iLlZSNmAio9z33CYsFmJaWmJiAlX4f+wGLtPeA9wCLBZiWlpiYgJV+HyeLpvcyBY2ZhJp6i36LgYKJfghv+zn7Y4um9zIFjZmEmnqLfouBgol+CG/7OfsKiwV+gIB+fpaBmB/3Aoti+4D7AYsFfoCAfn6WgZgf8AbDuhW094D3Y4ti+4AFDvdk92T38hUhCk374RV/lYKXHpOLkY+Qkgj4e/krBY6PjI+LkIuXgZR/i4OLhYeGhAj8e/0rBYiHioeLhgj4aHIVIQr8KPglFSIK+Cr7+hUiCg7b+QmCFZqWlpofi5aHkIOTCPsB9wQFrrqqw6jKjY+MkYuOi5mAln2LfYuEgYmGclFvV2xfCPtM91EF9rDMxIviCI0H30XPMCVCRjEeiQeLUaRgwFD7BmFIRostCIkH+wbnO/cPHumL2LfN2Ajz+wAFkoSRhpaLCPvs+DYVTc14rYu3CI0Hyr290sq7W00eiQeLSVhaJ2sId/wKFStHzeAfjQeLz7zM9wOxCPdj+2oFUUdIYT2LCA7R+GEVIAoO+0738/sfFZaTk5Yfi5OHkYSP+yvrNvcVi/c4i/c44PcV9yvrko+PkYuTi5aDk4CLhouGiYmKCPs9KCj7JYv7R4v7R+77Jfc9KI2KkImQiwgO+07a+x8VkIuQjY2M9z3u7vcli/dHi/dHKPcl+z3uiYyGjYaLgIuDg4uAi4OPhZKHCPcrK+D7FYv7OIv7ODb7FfsrK4SHh4WLg4uAk4OWiwgO+073V/g8FYp/lIGXi5eLlJWKlwiD9wHmTQWRh4+JkYuWi5SVi5aLloSQhI4IJLzyvAWSjpKQi5aLloKVgIuFi4eJhYcIME2T9wEFjJeClX+Lf4uCgYx/CJP7ATDJBYWPiI2Ei4CKgoKLgIuCkYWThwjyWiRaBYSIhISLgouAlIGWi5GLj42RjwjmyQUOj/ex9xoVfZaAmZmWlpke91b3WQeYlpaYmICWfh/7WfdWBpmAln19gIB9HvtW+1kHfoCAfn6WgJgf91kGDsExFSMKDvtk6fehFfdwBpqYmJqafph8H/twBnx+fnx8mH6aHw7dwxUkCg77CIX7AxV/lIKXHpWLkpGPkwj4WPoKBY2PjJCLj4uXgpR/i4GLhIWHgwj8WP4KBYmHioaLhwgOu/hRoBV9loCZmZaWmR73KuoHl5aVl5eAln8fLPhkBpx/l3oef4uEhoWDCPwW/HEFhYOJhIuFCHuWgJse+AcG++K4Fffi+DKL/DIFDm73PZ8VfZeBmR6Xi5SUj5QI98r5FwWOkY6Ti5EImYCUfR78OgZ9gIB9fZaAmR/4FYv7wfz7BYmHiYSLhwgO/Azi+HUVJAr8PQQkCg78DOL4dRUkCm/8zxUjCg6P+JHzFZiUlpgfi5aEkoKQCPwb9174G/dcBZSQkpKLlouYgpZ+i4aLhYmHiQj8NPtsBX6EhoKLgAiJB4uAkIKYhAj4NPtsBY+JkYmQiwgOj/T4SxUlCvt1BCUKDo/3A/jsFX6CgH4fi4CShJSGCPgb+178G/tcBYKGhISLgIt+lICYi5CLkY2PjQj4NPdsBZiSkJSLlgiNB4uWhpR+kgj8NPdsBYeNhY2GiwgOOfeK90cVk4uSkYyXCJP3AwX3CJnrzYv3EAiNB/Y24/sYHiaLR15WTIeGiYWLhYt+lYKYi5OLko+QkbzDxa7Xiwjxy0Y5H4kHiyo+VPsEhHyKgoCMfgiW+xUFjH+ShZOLCGv7DxUkCg73QsOdFX+WgZgel4uTkpCXCN33Sfgxi937SAWQgJSCl4uZi5aWi5iLkIqQiJEI+775GgWEmoGVeYsIiQZ5i4GBhHwI+7/9HAWIhYqFi4cI9y33dRX3Tfgp90z8KQUO9fOlFX2Xf5ke96oG9yvv1fcJH40Hi+xBuzehxKLJu4vqCI0Hi7d7sG6oZLJLojyLCPubBn1/f30fv/u9Ffen94AH9wTKVz4fiQcuQFgiHvt7+90V9633gQf3HtZZNR+JBzM/VPsMHg73Dvg5fxX3CYvYttLNj4+PkYuTi5h/l36Lg4uFh4eHSUxIaSyLCPs7+xX3HvdFH40H90T3E/cd9zwe7YvOZcVWj4eSiJKLmYuYl4uZi5SGkoaQR8VCs/sIiwj7Xvso+zj7Wh+JB/td9yj7M/dcHg73OvOlFX2Xf5ke92MG93D3LPct91kfjQf3Wfss9yv7cB77YwZ9f399H7/9BhX48PdJB/dX9w/7HPs6H4kH+zv7D/sZ+1ceDrPzoRV9l3+ZmZeXmR73u/gMB5iWlpiYgJZ+H/wM97P4OQaYlpaYmICWfh/8UwZ9f399Hw73PPg9fxXzi+Kyzb6WlJKWi5UI93kHmX+XfR77hgZ+gIB+fpaAmB/3bvtdBlhgOGYyiwj7T/sF9xv3SR+NB/c99wv3JPc+HuyLxm7BYZGGkYmPi5mLl5eLmYuUh5KFkEq8Rqgiiwj7Zfsd+0H7UR+JB/tZ9xf7N/dxHg5I942BFcOLvZ6wsLKypMmL3Aj4VgeZf5d9fX9/fR78Wgf7DklKNR4/i12sYsqIkISSgIt9i39/i32Lho2FjYi1SMtb7IsIDu7zoRV9l3+ZmZeXmR6L9zD3QvdE96/78AWPhpKGlIuZi5iYi5mLk4iQhpEI+7H38fef96EFkJCOkYuSi5h+mH6Lg4uFh4eHCPxO/FyL+EoFmX+XfX1/f30eDo7zpRV9l3+ZHvg1BpiWlpiYgJZ+H/wb+QoGmX+XfX1/f30eDveQ86AVfZaAmZmWlpkei/jf95X8CgWRgpKHlIuUi5KPkZQI95X4Cov83gV9l3+ZmZeXmR75IweZf5d9HoYGgIuChYWCCPul/Cb7pfgmBYSUg5GAiwiGBn1/f30fDvd++Dx/Ffdo9yH3P/dTH40H91P7H/c9+2j7aPsh+z/7Ux6JB/tT9x/7PfdoHo26FftB+xL3IvdBH40H90H3EPcg90H3QfcS+yL7QR6JB/tB+xD7IPtBHg6/86EVfZd/mZmXl5ke94P3UQf3JvcT1/cnH40H9xsh2vsuHvt4Bn1/f30fv/wBFffr91oH9xLhUfsDH4kHIzNH+xYeDvd++Dx/FeSL2KnGvQjaQwWShZGHlIuai5eXi5qLlYeRg5IIO84Fxc2t44voCI0H91P7H/c9+2j7aPsh+z/7Ux6JB/tT9x/7PfdoHtL3aRX3CScFWWFLc0OLCPtB+xL3IvdBH40H90H3EPcg90H3QfcS+yL7QR6JB4s5b0BbVAj7B/QFhJGFj4KLfIt/f4t8i4GPhZOECA7286EVfZd/mZmXl5ke96D3eQf3a/usBZGDkoWVi5mLmJiLmYuRiJGGkQj7W/eWBfcKm+LOi/cJCI0Hi713umqsYbVGpjWLCPugBn1/f30fv/vlFffP94MH9xPVUC0fiQcmNFD7CR4Oo/fpgRX3G+zZ9wUfjQeL8UfF+zas+zqtZbiL1QiNB9TPxvIe0ovIeMhckIeRiZGLmYuXl4uZi5WFkoaPS7tKoy2LCPsWLDsjH4kHiyHPUvc8afcza7Jgi0EIiQc7Q1AiHiuLRadFyoeOhY6Ei32Lf3+LfYuCkISQh9pK3Wr0iwgOq/e+oRV9l3+ZmZeXmR75Cvd0B5iWlpiYgJZ+H/yIBn6AgH5+loCYH/d0Bg73JPgQgBX3PvcJ9vddH/gRB5l/l319f399HvwXB/s9MDX7IvsoMur3OR74EgeZf5d9fX9/fR78Fwf7WPcLIfc8Hg73GvgKhBWNBpuLlJSRmQj3svkiBY2Pi42Lj4uXgJd9i3+LgoKGgAj7oP0I+5/5BwWGl4KUfot8i4B+i3+LhouJjYcI97H9IAWRfZSCm4sIDvh6972aFZB9k4KZiwiNBpmLlJWPmAj3Wvjg91r84AWPfpSBmYsIjQaZi5OVkJgI9375HQWNkI2Qi4+LmH6Yfot/i4ODhn4I+2r88vtb+PMFh5aDlH6LCIkGfYuEgoeACPtb/PP7afjvBYeXgZd9i32Lfn6LfYuHjIeNhggO9dSfFX6VgJgelouSkpKUCPeD98v3hvvOBZGDkYaVi5iLl5eLl4uSiJGFkgj7i/fS94P3xQWPkI6Ri5GLmIGWfouAi4SEhIII+3n7vPt8978FhZOFkIGLfot/f4t/i4SPhZCECPeC+8P7jvvUBYeGiIWLhQgO7/fgoRV9l3+ZmZeXmR6L95T3o/gRBY+Rj5KLkouYfpd+i4CLhYSFgwj7k/wB+5L4AQWFlISRgIt9i35/i32Lho2FjoYI96X8FQUO0+sW+I0GmJaWmJiAlX4f/F+L+Gf49AWRk46Qi5QIjAeWf5Z+Hvx8Bn6AgH5+loGYH/hOi/xn/PQFhYOIhouCCIoHgJeAmB4O+07tIxV9l3+ZHvd8BpWUlJWVgpSBH/to+Yb3aAaVlJSVlYKUgR/7fAZ9f399Hw77CPiO+wMVi4+KkImPCPxY+goFh5OEkYGLf4uCgot/i4eMho2HCPhY/goFj4OShZWLl4uUlIuXCA77Tvfg+TYVmX+XfR77fAaBgoKBgZSClR/3aP2G+2gGgYKCgYGUgpUf93wGmZeXmR8Oe4n7NBX48AaXlZWXl4GVfx/88AZ/gYF/f5WBlx8OYfeMfxXsi8q7rrwISwd8lYGZmZWVmh73vQeLynm6aa1msFSeRotKi1h8V3SGiYKDi3+Lf5aAl4uOi4+Mj40ItZ+6mcOLCPTKViQfdQdamFqURIsI+xgwTyEfiQch8VXqHo65FT1FttUfjQfSx7v3AB7Ui8R/toAIUQcuMksjHg636KAVfZaAmZmVlpke5Ae1S81R8YsI9w/3EfD3Oh+NB/c6+xHu+w8eJotKUF9ICPfNB5qAlX19gYF8HveS/TYVJgoOXvfSfxXii8avvr+Pj42Ri5CLl3+Xf4uEi4aHh4diYlZrSYsI+wku7fcPH40H9w7l7PcIHtCLu2q0ZI+HkomRi5mLlpaLmYuSiJKHj122UbEziwj7JvsG+xD7Ix+JB/sj9wX7DvcnHg5r9wL3qxWU9wXZ4PCL9wmLxiySJAil+2QVkZGNkYuQi5iAlX6LhIuGiIeHYmNYbUKLJ4sw1YL3Ewj4JAaXl5aX9yYw9wr7I/seI/sK+ygfiQf7M/cIIPcaHueLxKy9vQgO+5L3D6AVfZaAmZmVlpke+FD3MweXlpWXmIGVfh/7M7wG4qy10R6ei5yIm4iaiJiVi5mLloOVgI16j3iOcotei2d9cXFubntdi1EIWVQHf4CBf36VgZgfwgYOt/fR+zYV1ovNo7e3tLSjxYvVCPguB5mAln19gYB9HjoHYcdGwSWLCPsP+w4s+ycfiQf7JvcOLfcPHvCLz8K3yghBB/sXOEj7CR5Ei0ihUbaHjYeNhYt+i39/i4CLgo+DkobNXddz3IsIhPeLFSIv2/cHH40H9wvl1fb19D/7Ch6JB/sIIj0hHg6I6KAVfJaBmZmVlZoe96YH9djX7/LGRiIe+64HfJaBmZmVlZoe97cH9w5A4/sVHi6LUlxpTwj3ugeZgJZ9fYGAfR4O/APp+TAVJwqR/SwVfJaBmZmVlZoe+GgHmoCVfX2BgH0eDvwD6fkwFScKVf3kFc22sdsf+KoHmoCVfX2BgH0e/K0HW3J0Zx6Fi4OMg4t/i4GBi3+Lf5SDl4mSipOLlIsIDlPooBV8loGZmZWVmh6L8vcQ9xH3WPuGBZKDkIiUi5mLlZSLmYuSiZCGkQj7XPeL90/3UgWRkY2Pi5KLmIGVfouEi4aJhoYI+8372Iv4ogWZgJZ9fYGAfR4O/APvoBV8loGZmZWVmh75RAeZgJZ9fYGAfR4O9+PooBV8loGZmZWVmh73pQfy09vm5sVKIR77sQd8loGZmZWVmh73qAf3BtbN4enES/sCHvuuB3yWgZmZlZWaHve0B/cUQOD7DR4ri1RWalJvxlS+Moswi11ZalYI0QeagJV9fYGAfR4OiOigFXyWgZmZlZWaHvemB/XY1+/yxkYiHvuuB3yWgZmZlZWaHve3B/cOQOP7FR4ui1JcaU8I1QeagJV9fYGAfR4Oo/fTfxX3LPcD9xD3Ix+NB/cj+wL3Dvsr+yz7A/sQ+yMeiQf7I/cC+w73Kx6NuRX7Ci/t9w8fjQf3DOLu9w33Cucp+w8eiQf7DDQo+w0eDrfo+x8VfJaBmZmVlZoe940HtUvNUfGLCPcP9xHw9zofjQf3OvsR7vsPHiaLSlBfSAjoB5qAlX19gYF8HveS/FoVJgoOt/jL+H0VmYCWfX2BgH0eMgdhy0nFJYsI+w/7ESb7Oh+JB/s69xEo9w8e8IvMxrfOCPuRB3yWgZmZlZWaHvuS+PoV9fEz+xcfiQf7FiUyISAu4fcaHo0H9x3k3PcDHg77bPebghWoi6KRn5KVj5GSi5WLl4CVgIuEi3uBaIsIUGCl1B/33fc0B5eWlZeXgJZ/H/s09yIGmYCWfX2BgH0e+yJUB3+AgX9/loCXH8L74gYqy2DaHg5p99SZFfdi+GIFjZCMjouQi5mAln2LfouEg4eBCPtR/E37TvhLBYaWhZR8i3yLgICLfYuGjYaNhgj3YfxgBZF+k4OZiwiNBpmLk5ORmAgOXc6eFX+VgJcelIuRkJGSCPdC92/3Q/txBZCFkYeUi5iLlpWLmIuSiJCHkAj7SPd190H3agWPkI2Qi5GLl4GWf4uCi4WGhYQI+zr7ZPs792YFhpGFj4KLfouAgYt+i4SOho+GCPdA+2r7Sft1BYeGiYaLhQgOb/cv+zcV1Iu/sbj2CPdj+IIFjZCMjouQi5mAln2LfouEg4eBCPtG/E77YPhMBYaWhZR8i3yLgICLfYuGjYaNhgj3ePxriIQFaj9pZlOLbIt5j3uRhY2GjYaLfouBgYt+i4CRhJOIpoGlha2LCA77HPgq+x8VlomVkYuXi5OFkYWN+yWxe7GL7gjWB4vkZqxIocqetK+L5AjWB4vum7H3JbGRjZGRi5OLl4GRgIn7PWlrS4skCDwHPXRaJHuDg4CAk4Ob8qJaPR48B4skq0v3PWkIDvve9w37AhV/lYGXl5WVlx76DgeXgZV/f4GBfx4O+xzV+V0VgI2BhYt/i4ORhZGJ9yVlm2WLKAhAB4sysGrOdUx4YmeLMghAB4soe2X7JWWFiYWFi4OLf5WFlo33Pa2ry4vyCNoH2aK88puTk5aWg5N7JHS82R7aB4vya8v7Pa0IDmj3b6AVh3mXfpuLmIuUlY2VCJvbBZiJmIuYi+OLx7C8v4+PjpCLkouXgZZ/i4OLhYeGhl9fV25Liwh/i3+Mf40I3/hEBbaArXGpbpCGkIiUi5mLlZaLmYuTiJGFkWmrY6lUmAiYywWPnX+Ye4t+i4KBiYEIfkd8iwX7JvsG+xD7Ix+JB4v7BtIn8mcI+w33kBWNB/cO5ez3CB6Uizn8PwU9q1Tbi+kIDqfNmBWEkYWSHvh2BpiWlZiYgJZ+H/v295b3qgaYlpaYmICWfh/7qvcLBovLnL6srKensJq7i9qLt2mzXZCGkYeUi5mLlpWLmYuSiJKHkAhfv1G0KYtOi1d2ZmZhYXRLi0AI+wpJB36AgH5+loCYH837mAY9eQWDiYeGi4QIDtH4BPegFfdWBpeWlZeXgJZ/H/tFi/eG9/AFj5GOkouRi5iBln6LgYuDhoWCCPuH+//7hff9BYSVhZGAi32Lf4CLfYuGjYSPhQj3hfvw+0SLBX+AgH9/loGXH/dWKftWBn+AgX5/loGXH/dWIwZ9loCZmZaWmR7z91YHl5aVl5iAlX8f+1YGDvdq+DJ/Ffdf9zT3OfdZH40H91n7Mvc3+1/7X/s0+zn7WR6JB/tZ9zL7N/dfHqcE+1H7Ivcp90sfjQf3S/cj9yv3UvdR9yL7KftLHokH+0v7I/sr+1IekPcqFceLsKGwq4+OjpGLkYuWgpSAi4WLhoiIiWxvbXteiwg+Tc/cH40H3MbO2h61i6t4pnSQh5CIkYuXi5WUi5eLkoeSho9rp2WhUIsIJDs0JR+JByTaNvIeDvt290L4LxW1i62doagIcAeBk4OVlZSTlR73NAeLroGmeZ11oW2VZYtni3CDbH2EiIaFi4OLgZODlYuOi4+Mj40In5SmlKeLCL6rcVgfhgd0kXOQZ4sIQlhpUB+JB0/DbcAeja8VZWqfrx+NB6yqo74esIukh6KECHAHXV5sWB4p+y4V93AGlpSUlpaClIAf+3AGgIKCgICUgpYfDib4PbYVl4uUlIyXi5KJj4eRCPsS90P3EvdBBY+QjZGLkYuXgZR/i4OLhYeGhAj7HftHBYSCiIWLhIuEjoWSggj3HftHBZCEkIeUiwj7YBYoCg77XPdk9/wV7Njb6h+MB+o/2ikqPjssHooHLNc87R6eBDNJ0eAfjAfgztLi481FNh6KBzZIRDQeSt4Vg5GFk5ORkZMewLMHvFAFj4aPiJGLk4uQkYuSi4+KjoeQCGW4BaSTnJ6Lpgiubp5nHksGg4WFgx+nQRXKugejmoF2eH1+ch8O+zr3dfgwFdrTz9kfjQfZQ888PENHPR6JBz3TR9oetwRRYLzAH40HwLa8xcW2WlYeiQdWYFpRHg7d98sVJAoO+3b3VvgvFd/Iz9ofjQfZT844N05HPB6JBz3HSN4e+xP7ChX3lAaWlJSWloKUgB/7lAaAgoKAgJSClh/3FfcxFVFfu8cfjQfFtLvGxbdbTx6JB1FiW1AeDib3uvhnFX+Bgn8fi4WNhY+GCPcS+0P7EvtBBYeGiYWLhYt/lYKXi5OLkY+Qkgj3HfdHBZKUjpGLkouSiJGElAj7HfdHBYaShY+Diwj7YBYpCg4597T4nRWDi4SFin8Ig/sDBfsIfStJi/sQCIkHIOAz9xge8IvPuMDKj5CNkYuRi5iBlH6Lg4uEh4aFWlNRaD+LCCVL0N0fjQeL7NjC9wSSmoyUloqYCID3FQWKl4SRg4sIq/cPFaYHnn2ZeHh9fXgecAd4mX2enpmZnh4OM+f3oxX37AaZl5eZmX+XfR/77AZ9f399fZd/mR8O967n96MV+V4GmZeXmZl/l30f/V4GfX9/fX2Xf5kfDvc/+UQVKgoOxvihFSsKDsExFSMKDvti9/P5RBUqCvtIFioKDvtixvihFSsK90gWKwoO+2LBMRUjCvdIFisKDvsm93/3eBXPw8LPH40Hz0/CS0pQVEceiQdHw1TPHg7L+KrDFSwK+3YWLAr7dhYsCg77xfdxthUoCg77xeX4ZxUpCg7z+Sb3HBWYgZR+HoKLhYeGhF5JUlw5i/sFizbgbPcSCPeeBpiWlpiYgJZ+H/unBomdip+Ln4uhjaGOoAj3pQaYlpaYmICWfh/7nAar9wrd3/CL5Yu+ZL9Gj4WThpSLmIuWlouYi5GIkYiPV9NHwPsCiwj7FoslImf7IwhBBn6AgH5+loCYH8sGiHWKdYt0i3iMeI15CEwGfoCAfn6WgJgf0gas+y32I/cei/SLz8a/1o6PjZCLkAgO1fcT+CkVgZKElZWTkpUe95njB5STk5SUg5OCH/tnBoKDg4KCk4OUH+MG92L7mRWBk4SUlZOSlR6L93b0+zEFj4WQh5OLkouQj4+RCPT3MYv7dgWBkoSVlZOSlR73qgeUg5OCHocGhIuGiIeFCPsL+0n7C/dJBYeRh46DiwiGBoGEhIEfDtn3pZ0VLQqSnBUuClC2FS8KmkEVLwqGBDAK9+SQFS8KhgQwCvw51hWpkoGbjwaQi4uKjIQIkqKEBoqEi4qGiwiHnZcGkouNiY2ACJOfWISSYoQG0YMVMAr4VftBFfzm+bT45gb7Jv1RFZqLk5SMmQiDBoqChoSDiwiBhZKam5GRkx+Ti46Hj38Ik6GDBoqFBYePho6Eiwh9fn95epaAnR/7EtwVhYmQk5KNkZGQjYaDg4mGhh8rOxWikoakmXKGhKKShb8GgYkFiYyHjIiLCIGChX4fioSEknKFB+eEFaWSg5sGjZCOj42LCIoHh46Jjo+Ojo+QiI6GHoaLh4iIgwiVeYSRcoUHe80VkYuPkwWOho+IkosIl4+XlJeFk4IfhYuGiImFCKZ5hJEHu1kVh4iIh4aPh5IflIuQkY+VCJiqkIuLknqLi4SQi4N3gp+Ri4uScouLhJCLBYuLl3SPgYqGiIiHi46OipKEiwj7Lff1FYt0mn2idZackpuLnAiif5p6e4B/eh7C+/YVkouMjwWOiY6IkouUi5CRi5KLm3OFi5OLjY2NjouPi46IjocIkpiFBomGBYmOh42Gi4KLhoWLhYt7o5CLg4uJiYmIi4aLiI6HkQiEBmL3FxWai5eOlpRvrm+peZyAgIZ9i3yLbKF0qYsImCoVgoSEkncHg4+Gkx6Ti4+PjZQIho0FioaJiYmLCIiKjY4fn5iSfpYH9yL3ShWUfJuBnYsIp6Giqqp1oG8fcot4fXtziaZ3lnCKkZWOlouYCK5qsk1IYWFgHotulXmgdVZ5bmyLYYtWvGPHi7WLrZmnqqxpoYCpi7aLrq+NxQiEjQWBen9/dot3i3qXcqian5uYmpQI+2X7fBWhkoeaBpGOj4+PjYiHHnmHhKGShZ4Hk4iRgh6Ei4eHiIQIlXqEkXKFB/d3WxWEkQeKiIiHiYmHj4iPhpCSjo+Oi5EIkYaRgoGEhIQei4aNiI+HhImFhouDi4ORhZeLkYuQjY+Pj4aOipCLk4uOkI2SCIaMBYqHioqJi4mLiY2Jjo6Pjo+OkQiQkgZocBWFh4+RH4uPjY6NjZCGj4aQhYiJiIqJiwj7G68VlY6Njo2Miosei4qKiYeOiY4fhn0H9xePFY6NjY6PjYiIHouHiYiIiYePiY6Ljgj7Bfe/FZt7l3yYfJ6skKN0ooKBfYB4fgjB+9gVLQqSnBUuCvtzaBWokoOdoXmDhKiSg7STkm4GhJN7dZuTkm6Ek2KDB/hYkRWHiIiHh46Ij4+Ojo+PiI6HHw73ehT4/BWTEwARAgABACgAQABYAIsAogC7ANgA7QE0AXwBrwHiAfkCHwIsAj4CUIl8koeUi5SLj5CPmAjE910FjZSOlIuRCJeEkIIeeAZ7i4KDiHkIC+jJ4OkfjQfnTuAvLk02LR6JBy7IN+ceC1NcxNofjQfUtcjGw7pRPR6JB0BhUFAeC4GThpIelIukmZ2dnZ2UqYvDCKQHnn2ZeHh9fXgedgeLd5eAmoeOaH11Z3eGiIiGi4YIC3AHeJl9np6ZmZ4epgeefZl4eH19eB4L+C4GmZeWmZl/l30f/C4GfX9/fX2XgJkfCyEl4/cXH40H9xbx5PX26DX7Gh6JB/sdMjr7Ax4Leph+nJyZmJwenAecfZh6en5+eh4Ll5WUlx+LkYmRh5AI+xL3Q/cS90EFj5CNkYuRi5eBlH+Lg4uFh4aECPsd+0cFhIKIhYuEi4SOhZKCCPcd+0cFkISRh5OLCAt/i4KCin+KhI6Hj4UI9xL7Q/sS+0EFh4aJhYuFi3+VgpeLk4uRj5CSCPcd90cFkpSOkYuSi5KIkYSUCPsd90cFhpKGj4KLCAuVg5CEHoKLcn15eXl5gm2LUwhyB3mafJ2dmpqdHqAHi59/lnyPiK6Zoa+fkI6OkIuQCAuBk4aSHpSLpJmdnZ2dlKmLwwikB518mnl5fHx5HnYHi3eXgJqHjmh9dWd3hoiIhouGCAtwB3iYfZ6emJmeHqYHnn6ZeHh+fXgeC4yYhZR9iwiAgoJ/f5ODmB+Wi5CRjZMIhAaKhoiJhosIhIiOlB8LkI2Hgx99BpSOjo8eC4aIj5eWjo+QkI6HgH+Ih4YfC5eUlJeXgpN/f4KDf36Ug5cfCwAAAAEAAAAOAAAAGAAAAAAAAgABAAEAYgABAAQAAAACAAAAAQAAAAoANABOAAJERkxUAA5sYXRuABwABAAAAAD//wACAAAAAQAEAAAAAP//AAIAAAABAAJjcHNwAA5rZXJuABQAAAABAAEAAAABAAAAAgAGABAAAgAAAAIAEgHUAAEAAAABG5YAAQGSAAQAAAAWADYAPABGAEwAZgBwAHoAjACiAKgAwgDQAPIBDAEeASwBMgFQAWYBeAF+AYQAAQAo/8QAAgAd//EAOQAeAAEAHf+wAAYADv9WAA//oQAQ//YAHf9+AEL/zgBD/84AAgAO/+wAEP/YAAIADv90AA//qwAEABb/+wAo/+wAKv/sAEL/9gAFAAX/4gAO/7oAFgAKAB3/kgBC//EAAQAd/+wABgAF/+wADv/EAB3/nAAo//YAKv/iAEIACgADAAj/9gAW/+wAKP/YAAgABf/JAA7/iAAd/4gAKP/2ACr/7AA5/+wAQv/YAEP/zgAGAAX/9gAW//EAHf/2ACj/7AA5//YAQv/OAAQAHf/2ADkAHgBC/+wAQ//2AAMAKP+IADkAHgBC/7oAAQAu/84ABwAO/7oAFv/2AC7/zgAv/+wAQv/xAEP/9gBH//YABQAW//EALv/OAC//9gBC//YAR//2AAQAHf/2ADkAIwBC//YAQ//2AAEAD//xAAEAD//sAAMAKP/EACr/9gBC/9MAAQAWAAUABwAJAA4ADwAQABgAGwAdACIAIwAoACoALQAuAEAAQgBDAEUASQBKAFMAAhl0AAQAABf4GLQAPAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAD/8f+m/+f/nP+mAAD/kgAAAAAAAP+cAAD/iAAAAAD/5wAAAAD/5wAA/9j/7P/n/+wAAAAAAAAAAAAAAAD/xAAA/7D/sP+cAAAAAAAA/+IAAP/2/8T/0wAA/9gAAAAAAAAAAAAAAAAAAP/sAAAAAP/xAAD/4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAP/sAAAAAAAAAAAAAAAA//b/9gAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/9gAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/9v/2//YAAAAAAAD/0wAA/9j/9v/JAAD/0//d/8n/v//TAAAAAAAAAAD/2P/s/+wAAAAA/9gAAP/YAAAAAAAAAAAAAAAAAAAAAAAA/+L/7AAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//b/9gAA//YAAAAAAAD/sP/sAAAAAAAAAAAAAAAAAAAAAP/2/+cAAAAAAAAAAAAAAAD/8QAA/5z/9v+cAAAAAP/2AAD/8QAAAAAAAAAAAAAAAAAAAAAAFAAA//YAAAAAAAAAAAAAAAD/9gAA//H/8QAAAAAAAAAAAAAAAP/sAAD/7P/x//b/4gAAAAoAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAAAA//sAAAAAAAD/5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAD/9v/2//H/4v/iAAD/2AAA//b/9gAAAAAAAAAAAAD/4gAAAAD/5wAA/87/7P/n/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAP/s/8T/zgAA/84AAAAAAAAAAP/YAAAAAP+c/+z/jf+cAAD/fgAAAAD/9v+wAAD/iAAAAAD/9gAAAAD/+wAA/9j/7P/7AAAAAAAAAAAAAAAAAAD/xAAA/9j/2P+mAAAAAAAA/+wAAAAA/8T/zgAA/8QAAAAAAAD/2AAA/+L/+//JAAD/2P/d/87/xP/YAAAAAAAAAAD/2P/s/+wAAAAA/9gAAP/YAAAAAAAAAAAAAAAAAAAAAAAA/+L/7AAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAP/7AAAAAAAAAAD/ugAAAAAAAAAAAAAAAP/7AAD/9v/x//YAAAAAAAAAAAAAAAD/+wAA/5wAAP+cAAAADwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAA8AAAAFAAAACgAAAAoAAAAAAAAAAAAAAAAAAP/JAAAAAP/dAAD/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAP/2AAD/7P/xAAD/5wAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAACv/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/9v/xAAD/4v/n/+f/4v/2AAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAD/+wAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAA//sAAAAA//H/9v/x//H/+wAAAAD/pv/J/5L/8QAAAAAAAAAAAAAAAP/s/3n/ugAA/+wAAAAAAAD/ef/O/5z/g/+c/6b/zv+D/6b/uv/Y/9j/nAAAAAAAAAAAAAAAAAAA/40AAP+m/84AAP+c/5z/nP+c/5z/kgAAAAD/5wAA/+wAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAAAAAAAP/7AAAAAAAAAAD/nP/YAAD/5wAAAAAAAP/2AAD/7P/2/7oAAAAA//YAAAAAAAD/uv/s/4j/v/+I/9j/5/+//8T/2P/sAAD/2AAAAAAAAAAAAAAAAAAA/8QAAAAA/+wAAP/YAAD/3QAA/9j/yQAAAAD/pv/d/5f/7AAAAAD/9v/2//H/7P/2/7r/0wAA//YAAAAAAAD/v//x/5z/xP+c/93/4v/E/87/3f/x//H/3QAAAAAAAAAAAAAAAAAA/8QAAP+c/+cAAP/d/93/3f/Y/93/yQAAAAAAAP/OAAD/4gAA//YAAP/xAAD/7AAA//YAAAAA//YAAAAAAAD/0wAAAAD/2AAA/87/7P/Y/87/7P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAD/2AAA/9gAAAAAAAD/kv/E/37/3QAAAAD/7P/s/+wAAP/2/5z/ugAA//YAAAAAAAD/kv/Y/37/l/9+/7D/2P+X/5z/tf/s/+z/tQAAAAAAAAAAAAAAAAAA/5wAAP+S/+IAAP+1/8T/yf+6/8T/sAAAAAAAAP/YAAD/9gAAAAAAAAAAAAAAAP/2AAD/8QAAAAAAAAAAAAD/5wAAAAD/7AAA/+L/9v/s/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3QAAAAAAAAAAAAAAAAAA//sAAAAA/+z/7AAA/+wAAAAAAAAAAAAAAAD/9v+mAAAAAP/OAAD/ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/nAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/uv/x/+wAAAAA//YAAP/2AAAAAAAAAAD/+wAAAAAAAAAA/+L/3QAA//YAAAAAAAAAAAAAAAAAAAAA/+f/7P/i/+f/8QAAAAAAAP/YAAAAAP+m//EAAP+cAAD/kgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAD/xAAA/8QAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/9gAA//b/9gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/7AAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/9gAAAAAAAP/2//YACgAAAAAAAAAA//H/8QAAAAoADwAAAAAAAAAAAAAAAAAA//v/+//2//sAAAAAAAAAAAAAAAAAAP/OAAD/7P/xAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAA8AAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/9MAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/2/+wAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAA/+L/2AAAAAAAAAAAAAAAAAAAAAAAAAAA/+f/5//i/+f/8QAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAAAAAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/8QAAP/sAAD/2AAAAAAAAP+mAAD/2P/d/87/sP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAD/2AAAAAD/9gAA//H/9v/i//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAeAAAAHgAeABT/9gAA/9P/9v/TAAAAAP/2//EAAAAAAAAAAAAAAB4AIwAAAB4AIwA3AAAAAP/TAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+6AAD/2P/d/+z/tQAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//H/9v/x//EAAAAAAAD/7AAAAAD/9v+mAAD/xP/O/87/nP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//YAAAAA/+L/7P/T/+L/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAD/2AAAAAD/5wAAAAD/5wAA/+wAAP/n/+z/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2/+z/7AAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/x/+wAAAAA/+wAAP/sAAAAAAAAAAD/9gAAAAAAAAAA/+L/zgAA/+wAAAAAAAAAAAAAAAAAAAAA/+L/5//d/+L/7AAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAD/4gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/E//EAAP/OAAD/ugAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAD/3QAA/90AAAAAAAD/pgAA/7AAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAA//YAAAAAAA8AAAAAAAAAAAAAAAD/9gAAAAD/nAAA/5wAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/0wAAAAD/2AAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAUAAD/4gAAAAD/5wAA/6b/5/+mAAAAAP/n//YAAAAAAAAAAAAAAAAAAAAAABQAIwAAAAAAAP+1AAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tf/2//EAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAA/+z/3QAA//YAAAAA//YAAAAA//YAAAAA/+z/8f/n//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5wAAP+c/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/iP/YAAD/4gAAAAAAAAAAAAAAAP/s/78AAAAAAAAAAAAAAAD/sAAAAAD/ugAAAAD/5/+6AAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAA/6sAAAAA/+wAAP/OAAD/zgAA/87/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/8QAAAAAAAP/x//YAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAAAAAAAAAD/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/8QAA//H/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAD/zv/2/+z/5wAA/7r/7P+6//YAAP/s/+z/9gAAAAAAAAAAAAD/9gAAAAAAAAAA//EAAP/EAAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/3QAAAAD/4gAA/+IAAP/i/9P/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAD/zv/2/+z/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAD/9gAAAAAAAAAA/+wAAP+6AAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0wAAAAD/8QAAAAD/8QAAAAAAAP/x//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABQBbABgAAAAsAAAAGQAAACAAIwAiADMAAAAyAB8AHwAAAAAAAAAAAAEAAgADAAQABgAHAAgACQAKAAAACwAMAA0ADgAPABAAEQASABMAFAAVABYAHQAbAAAAAAAXABoAHgAhACQAJQAoAAAAAAApAAAAKAAoACsAGgAAADQANgA4ADkAHAAAAAAAAAAAAAAAAAAAACYAAAAAAAAAAAAnAC0AIwAjAC4ALwAgAC4ALwAgAAAAIgAmACcAAQAFAF0ADQAAAAAAIQAOAAAAFQAYABcAKQAAACgAFAAUAAAAAAAAACIAAQAAAAIAAAAAAAIAAwAAAAAAAAACAAAAAgAAAAQABQAGAAcACAAJAAoACwAAABAAEgAAAAwADwATABMAGQAaAA8AHQAeAA8ADwAfAB8AEwAfABYAKgAtAC8AMAAAAAAAEQAAAAAAAAAAAAAAGwAmAAAAAAAAABwAIwAYABgAJAAlABUAJAAlABUAAAAXABsAHAAAACYAAgAOAAUABQAAAAcABwABAAkACQACAAsADgADABAAEgAHABcAHwAKACEALgATADEANwAhADoAOgAoADwAPwApAEEARQAtAE0ATQAyAFIAWwAzAF0AXwA9AAEACAABAAAAAQABAAEAAAABAAAACgAwAD4AAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAEAAAAAP//AAEAAAABc3MwMQAIAAAAAQAAAAIABgAOAAYAAAABABAAAQAAAAEAKAABAAgAAQAOAAEAAQBiAAEABAABAGIAAQAAAAEAAAABAAEABv+fAAEAAQBiAAEAAf//AAoB9AAAASwAAAGaAEUCvAAtAzgANwK4ADEA5gBFAa4ARwGuADwBrgBMAmwAQADmADYBmABCAOYAUgH0//oCmAAvAksAQADwAFcA8AA7AmwAPAJsAE8CbABZAhYAJQMWADgC0gBoAuIASQMOAGgCkABoAxAASQIlACoCywBoAmsAaANkAGgDUgBJApwAaANSAEkC0wBoAoAAQQKIADIC+ABdAu4AOAROADwC0gBJAswANgKwAEcBrgBiAfQACQGuADcCWP/oAj4AMwKUAF0COwA6AkgAOgFqAC0ClAA8AmUAXQD5AF4A+f/7AjAAXQD5AGQDtwBdAmUAXQKAADoClABdApQAPAGQACoCRgA1AjoAQwJMADQB4AA3AR4AeQHgADUCRQA+AoQAQgKuADUDPgA1AYYAOgIDADcBoAAiAcIASgDmAFIBhgAvAgMAQwIWADQCEABCA4IAQgDmAE0A5gA7AOYANgGaAE0BmgA7AZoANgHWAG8CqABSATcANwE3AEMC0AA3ArIAFgK2ADI=); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/opentype;base64,T1RUTwALAIAAAwAwQ0ZGIE+2i2MAABCYAAAOb0dERUYASAAEAAAfCAAAACBPUy8yVcclSwAAASAAAABgY21hcO62ywIAAA08AAADOmdhc3AAAAALAAAfKAAAAAhoZWFkAxZHvAAAALwAAAA2aGhlYQdhAwAAAAD0AAAAJGhtdHg9xwbVAAAfMAAAAGxtYXhwABtQAAAAARgAAAAGbmFtZSg1MwQAAAGAAAALu3Bvc3T/uAAyAAAQeAAAACAAAQAAAAEAQS6s5cVfDzz1AAsD6AAAAADQLAIfAAAAANAsAh8AAP84A58DIAAAAAgAAgAAAAAAAAABAAADwP8QAAAD1AAAAAADnwABAAAAAAAAAAAAAAAAAAAAGwAAUAAAGwAAAAICTQEsAAUABAK8AooAAACMArwCigAAAd0AMgD6AAAAAAAAAAAAAAAAoAAAf1AAAEoAAAAAAAAAAEgmQ28AAAAk4BIDIP84AMgDwADwAAAACwAAAAAB/gK8ACAAIAABAAAAJAG2AAEAAAAAAAAAQAAAAAEAAAAAAAEAIwBAAAEAAAAAAAIABwBjAAEAAAAAAAMAIQBqAAEAAAAAAAQAIwBAAAEAAAAAAAUADQCLAAEAAAAAAAYABACYAAEAAAAAAAcAYQCcAAEAAAAAAAgADQD9AAEAAAAAAAkADQD9AAEAAAAAAAoCEQEKAAEAAAAAAAsAEgMbAAEAAAAAAAwAEgMbAAEAAAAAAA0CEQEKAAEAAAAAAA4AKgMtAAEAAAAAABAAIwBAAAEAAAAAABEAIwBAAAEAAAAAABIAIwBAAAMAAQQJAAAAgANXAAMAAQQJAAEARgPXAAMAAQQJAAIADgQdAAMAAQQJAAMAQgQrAAMAAQQJAAQARgPXAAMAAQQJAAUAGgRtAAMAAQQJAAYACASHAAMAAQQJAAcAwgSPAAMAAQQJAAgAGgVRAAMAAQQJAAkAGgVRAAMAAQQJAAoEIgVrAAMAAQQJAAsAJAmNAAMAAQQJAAwAJAmNAAMAAQQJAA0EIgVrAAMAAQQJAA4AVAmxAAMAAQQJABAARgPXAAMAAQQJABEARgPXAAMAAQQJABIARgPXQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEhvZWZsZXIgJiBDby4gaHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbUNvcHlyaWdodCAoQykgSCZDbyB8IHR5cG9ncmFwaHkuY29tUmVndWxhcjE3MTI0Ny04ODQ3NC0yMDE1MDYyMy0yNDIzLTE0MDIxOVZlcnNpb24gMS4yMDFGb250R290aGFtIFJvdW5kZWQgaXMgYSB0cmFkZW1hcmsgb2YgSG9lZmxlciAmIENvLiwgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgaW4gY2VydGFpbiBqdXJpc2RpY3Rpb25zLkhvZWZsZXIgJiBDby5UaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wZXJ0eSBvZiBIb2VmbGVyICYgQ28uIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgb3IgZG93bmxvYWQgdGhpcyBzb2Z0d2FyZSwgb3IgaW5zdGFsbCBpdCB1cG9uIGFueSBjb21wdXRlciwgb3IgaG9zdCBpdCBmcm9tIGFueSBsb2NhdGlvbi4gWW91ciByaWdodCB0byB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBzdWJqZWN0IHRvIHRoZSBUZXJtcyBvZiBTZXJ2aWNlIGFncmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAyADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAUgBvAHUAbgBkAGUAZAAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4ALAAgAHcAaABpAGMAaAAgAG0AYQB5ACAAYgBlACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAGMAZQByAHQAYQBpAG4AIABqAHUAcgBpAHMAZABpAGMAdABpAG8AbgBzAC4ASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgBUAGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAdABoAGUAIABwAHIAbwBwAGUAcgB0AHkAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAsACAAbQBvAGQAaQBmAHkALAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAG8AcgAgAGQAbwB3AG4AbABvAGEAZAAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGkAbgBzAHQAYQBsAGwAIABpAHQAIAB1AHAAbwBuACAAYQBuAHkAIABjAG8AbQBwAHUAdABlAHIALAAgAG8AcgAgAGgAbwBzAHQAIABpAHQAIABmAHIAbwBtACAAYQBuAHkAIABsAG8AYwBhAHQAaQBvAG4ALgAgAFkAbwB1AHIAIAByAGkAZwBoAHQAIAB0AG8AIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABUAGUAcgBtAHMAIABvAGYAIABTAGUAcgB2AGkAYwBlACAAYQBnAHIA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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/A59BE2741B1B5D65A.css b/docs/static/fonts/332720/A59BE2741B1B5D65A.css deleted file mode 100644 index 9d5f7c8977..0000000000 --- a/docs/static/fonts/332720/A59BE2741B1B5D65A.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - - \ No newline at end of file diff --git a/docs/static/fonts/332720/B5A3A718F52798BF7.css b/docs/static/fonts/332720/B5A3A718F52798BF7.css deleted file mode 100644 index 9148477f21..0000000000 --- a/docs/static/fonts/332720/B5A3A718F52798BF7.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/B65C7771D2CCC2100.css b/docs/static/fonts/332720/B65C7771D2CCC2100.css deleted file mode 100644 index a727dfcc29..0000000000 --- a/docs/static/fonts/332720/B65C7771D2CCC2100.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8AAD8/AAA/PwAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAPz8AAD8/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/Pz8AAAAAPz8AAAAAPz8AAAAAPz8AAD8/PwAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAIwAUAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAA/Pz8/AAA/PwAAAAA/PwAAFAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAA8AAAAAAD8/AAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAD8/AAA/PwAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAA/PwAAPz8AAD8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/Pz8/PwAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAAAAAAAAAA/PwAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/AAA/PwAAPz8AAAAAPz8AAAAAPz8AAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8AAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8/AAA/Pz8/AAAAAD8/AAAAAAAAPz8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAPz8AAAAANwAjAB4AAAAjAB4AAAAAAAAAAAAAAD8/Pz8AAAAAPz8/Pz8AAD8/FAAeAB4AAAAeAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8AAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8/AAA/PwAAAAAAAD8/AAA/PwAAPz8AAD8/Pz8AAAAAPz8AAD8/AAAAAD8/AAAAAAAAAAA/PwAAAAAAAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAB+PwAAPz8/Pz8AAAAAPz8AAAAAAAA/Pz8/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAD8/PwAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/Pz8/Pz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAPz8/PwAAAAA/PwAAPz8AAAAAPz8AAAAAAAAAAD8/AAAPAAAAAAAAAD8/AAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAH4/AAA/Pz8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/Pz8AAD8/AAAAAAAAAAAAAAAAAAA/Pz8/Pz8/PwAAAAAAAAAAAAAAAAAADwAKAAAAPz8/AAAAAAAAAAAKAD8/Pz8AAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAD8/AAA/PwAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAD8/Pz8AAAAAPz8AAAAAAAA/Pz8/Pz8AAAAAAAAAAAAAAAAAAAAAPz8AAD8/PwAAAAAAAAAAPz8AAAAAAAAAAD8/AAA/PwAAAAA/Pz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8/PwAAAAAAAAAAAAAAAD8/AAA/Pz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/PwAAPz8AAAAAPz8AAAAAAAAAAAAAPz8AAD8/AAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAPz8/Pz8/Pz8/AAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAPz8/Pz8/Pz8/Pz8/fj8/P34/Pz8/AAAAAAAAPz8AAD8/Pz8/PwAAPz8/PwAAAAA/P34/Pz8/AAAAAAAAPz8AAD8/AAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8AAD8/AAAAAD8/AAAAAAAAPz8AAAAAPz8AAD8/AAA/PwAAPz8AAD8/AAA/PwAAAAAAAD8/Pz8/Pz8AAD8/Pz8AAD8/AAAAAAAAAAAAAAAAAAA/Pz8/Pz8/Pz8/Pz8/Pz8AAAAAAAA/PwAAPz8/Pz8/Pz8/Pz8AAAAAPz8/Pz8/PwAAAAA/Pz8AAD8/AAA/PwAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAA/Pz8/Pz8/Pz8/Pz8/Pz8AAAAAAAA/PwAAAAA/Pz8/AAA/PwAAAAAAAD8/AAA/Pz8/AAAAAAAAAAA/PwAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/Pz8/Pz8/PwAAPz8/PwAAPz8AAAAAAAAAAAAAAAAAAD8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/eT8AAAAAAAA/PwAAPz95Pz8AAAAAAAAAAAAAAAA/Pz8/Pz8/AAAAAD8/Pz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAA/Pz8/PwAAPz8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8KAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAACgAAAAoAAAAFAAAADwAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA8AAAA/PwAAPz8AAD8/AAAAAAAAAAAAAAAAPz8/PwAAPz8AAAAAAAAAAAAAAAA/PwAAAAAAAAAAPz8AAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAA/Pz8AAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8/PwAAAAAAAAAAPz8/Pz8/AAA/Pz8/AAA/PwAAAAAAAD8/AAA/Pz8AAAAAPz8AAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAPz8/AAA/PwAAAAA/PwAAAAA/PwAAPz8/PwAAAAB+PwAAPz8/Pz8/AAAAAD8/AAAAAAAAAAA/PwAAPz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/Pz8AAD8/AAAAAD8/AAAAAAAAAAAAAD8/Pz8AAD8/AAA/Pz8/Pz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAoAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAD8/PwAAPz8AAAAAAAAAAAAAAAA/PwAAFAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/PwAAPz8AAAAAAAAAAAAAAAA/Pz8/AAAAAAAAAAAAAAAAAAAAAD8/Pz8AAAAAAAA/PwAAPz8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAPz8/AAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8AAAAAAAAAAD8/Pz8/Pz8AAD8/Pz8/AAA/PwAAAAAAAD8/Pz8/Pz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/Pz8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAA/Pz8/PwAAPz8AAAAAAAA/Pz8/Pz8AAD8/AAAAAAAAAAAAAAAAPz8/Pz8AAD8/AAAAAD8/AAAAAD8/AAA/PwAAAAAAAD8/AAA/Pz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwA8AD8YPxcAAAQAPxkCAHYAaQBgAF8AWgBXAFUAUAA9ADwAOQA3ADIAMQArACcAIwAaABkAGAAXABYAFQAUABMAEQAQAAsACQAHAAUAHwABABQAEgABAD8/VQA/PzkAPz83AAMA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HmBhYUhNP2o/CD8/Pz8/Pz9wP3c/P3N7fXg/ch9vP3U/Pz8/Pwg/Pz8/fD8VSj8iPwc/fj8/Px8/Pz8/CD8/Pz8/PwU/Pwg/Pz8/Pz8ePz8/Pwd3Pz8/PxUqPwg/P3Q/bD98P30/Pz8/eT9vP28/Pz8/Pz8VFz9iBj8IPz8/Pz8/Pz8/Pz8/Pz8/P3s/Pz8/Pz8/Pz8/Pz8/BT8/Bj8/Pwg/Pz8/Pz8/Pz8/Pz8/Pz9zPz8/Pz8/Pz8/Pz8/Pz8FPz8/PxU/Px56fz97ej9/Pwg/Pz8/Pz91P30/dD8VPz8tPwg/Pz8/Pz8/Pz8/Pz8/P3Q/Pz8FPz8/Pz9yPz8/Pz8/dz8/Pz8/P3o/Pz8/Pz8IPz8/Pz8/Hz8/Pz8/Pz8/FVk/Bz8/eT8IPz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwU/Pz8/FT97Bz9yPz95Pwg/Pz8/Pz8ePz8/Pz8/Pz8/Pz8/Bz8IPz8/Pz8/Bj8/Pz8VPwc/cj8/Pz8ffj8/Pwg/Pz8/Pz8FPz8GPz8/Pz8/cj8/Pz8/FTsrHz8/Pz8/Pz8/Pz8/Pz8/Pz8VPxI/Hz8/P3p5f359CD8/Pz8/PwU/PwY/Pz8Ifz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwY/CD8/Pz8/PxVRPyY/Bj8/Pz8VQT9VPwoyFT8GP2I/P1g/Pwg/Pz8/Pz8GPz8/CD8/Pz8/PwY/Pz8IPz8/Pz8/Bj8/Pz8/FT85PwoyBD8KMRU/PwoyBD8KMRVBPwoxFT9QCjAVPz8KLxU/Pz8OHz8/Pz8GPwg/Pz8/Pz8FST8LP0k/Cz8IPz8/Pz8/Bj8ePz8/Pwc/Px4/Pz8/Pz8/PwV2Pz8xPwg/Pz8/Pz8/Pz8/Pz8FMT92Pz8ePz8/Pz8/Pz8VPz9iPwY/Hz8/Pz8/Pz8/Bmc/Hz8/Pz8/Pz8/Bz8/Px4/Pz8/Pz8/PxUpPxM/Dgg/Pz8/Pz8/Pz8/Hj8jPy0/PwY/Hz8/P35+Pz9+BkwIeT94P3g/dD91P3U/Bj8fPz8/fn4/P34GQQgjP2ciJT8WPwg/Aj8/Rz9XPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Rj9kPz8/Pwo/PwY/Px9+Pz8/Pz8/PwY/Pwg/Pz8/Pz8/Pz8/Pz8GPz8ffj8/Pz8/Pz8GPz8IEj9sPzY/BT8/OVxSSV4/Pz8/Pz8efj8/PxUcPyY/DgorFWc/Pz8OCioVP3E/Pw4KLhZ2PwouFnY/Ci4VPz8/Dh4/VD9HBz8eR1RQSks/Tz8HPx8/Pz8/FXg/fz8mPw4KLRZIPwokFTE/Yj8OCi0WSD8KLRU/P2I/DgosFkg/CiwVRD8/Yj8OCiQVMT8OCi0VPz8OCiwVRD8/Pw4fP38/fX1/f30GXj8ffT9/Pz8/Pz8GXj8VPz8/Dh8/fz99fX9/fQY/Px99P38/Pz8/PwY/PxU/Mw4KKRUPPz8IPz8/Pz8/BRU/Pwg/Pz8/Pz8/BD8/Pz8HPx8/P0slCD8/aFFTWj8/Pz8/Pz9+Pz8/Pz8/Pz8/Pz8/Px4YPzM/IAc/CBA/P0krfQg/BQM/Pwh/Pz8/Pz8VPz8/PzkOCisWYD8IPz8/Pz8/BUc/HT8IPz8/Pz8/Pz8/Pz8/BUc/HT8IPz8/Pz8/Pz8/P38/Pz8/Pz8/BUE/Ej9DPxI/CD8/Pz8/Px9/Pz9/FWc/Pz8mDh5QW2JRBz8eT1s/Pz8/Bz8fPz9fURUxPxU/Hz8/Pz8/Pz8/Bj8/Hz8/Pz8/Pz8/Bj8/FQo/Ez8eP0g/PQc/HjxHTjc4P08/Bz8fPz8/PxUvP1Y/dj8OCiAVPz8OHlFaYFYHPx5WWj8/Pz8/Bz8fPz9gUQQ/Hj9HPz0HPx49R0M8PD9DPwc/Hz8/Pz8VMD91Pzo/Dh9yfn14dj8/Pwc/FUE/Hz8/Pz8GSx5nP24/CD8/Pz8/PwU/ZQg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8FUD8HPz8ePz8/Pz8/Pz8VP0oeNERINgc/HjZFPz8/Pz8/Bz8fPz9JMwQ/Hj88PywHPx4sOz4qKT8/Pwc/Hz8/Pz8VPz9kP1w/DgoqFmA/CD8/Pz8/PwVHPx0/CD8/Pz8/Pz8/Pz8/PwVHPx0/CD8/Pz8/Pz9/Pz8/Pz8/Pz8/PwVBPxI/Qz8SPwg/Pz8/Pz8/Pz8/Pz8VPz0/Jg4fPz8/Pz8/Pz8GcD8fPz8/Pz8/Pz8GcD8VLj8pHlhsXl0HcAg/Pz8/Pz8ePz8/Pwc/Hz8/amUVPz8eP20/Twc/H1BpWEIIP2c/cz90Bz8fWHE/Pwg/Pz8/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/fWw/cD9nP2U/bT91P3k/Pz8/BzQ/Hj8/Pz8/Pz8/B3AIPz8/Pz8/FS8/Qj92Pw4ePzY/JAc/HyU0OyQIP1A/ZT9rPz8/Pz8/Pz8/Pz8/Pz8/Pz8/dD94Pz8/Hj8/Pz8HPx8/P00+CD9ee21vbD8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/FSo/Px5SPys/Iz9LPwc/Hks/KT8iP1E/Uj8rPyM/Sz8HPx9LPyk/Ij9RPwQ/Hl8/Nz8yP1k/Bz8eWT85PzQ/Xz9fPzc/Mj9ZPwc/H1k/OT80P18/FX8yP2o/DgZWPx9/Pz8/Pz8/PwdWPx4/Pz8/Pz8/fQYjVj8fPz8/f34/P38GVj8pVj8fPz8/f38/P38FP0Q/Pz8/CD8/Pz8/P30/P38/fT8/Pz8/PwU/Pz8/Pz8/Pwg/Pz8/Pz8/fj8/Pz8/Pz8/Pz8FPz8/Pz9FPx9/Pz8/Pz8/PwZWPxU/PwQ/Dgg/Pz8/Pz8FeT0GPz8fPz8/fn4/P34HSQo/CEA/S3RhYWZmdlc/Tj8pP1E/Xwg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9dP2k/Pz8/Pz8/Pz8/Pz8/Bgs/Pz8ffj8/Pz8/Pz8GPz8/Pz8/H34/Pz8/Pz8/BnY/Hj8/Pz8VPz8OCD8/VD89BT8/OT8/Hgg/Pw4/Bz8VPz8NPwhnPyc/Bj8/Bz8fIz8QPwY/Jj8FP3xHfgg/Pz8/P34/ez9/Pz8FPz8IP1Q/Yz9pPz8/Pz8/Pz8/Pz8/Pz8/Pz8/bj9xPz8/BUQ/CD9/P38/fwg/S25XX18/Pz8/Pz8/fz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8/CD8/Pz8/Pz8/fj95PxU/bz9oDgopFQI/Px8/Pz8/Bj8ePz8/fQV3P3sePz8/Pz8/Pz8VPz8hPwA/Dgg/PT9rPz8HPx4/P3Qkez8/Pz8/Pz8HPwg/Pz8/PT8/Pz8/fz8/Pz8/Pz9lJT9leyg/B0AIMj9nYnhMdT9qPzI/B0AIKD9lP2UlPz8/Pz8/P38/Pz8/PxVdPxw/Dh5/Pz9/fz8/PwcOPx4/Pz8/Pz8/fxUCPw0/Pw4IaT0/Sz8kPwc8Hj1aPz8/Pz8/Pz97JFp0PQc8CCQ/S2tpPT8/Pz8/Pz8/Pz8/Pz8/JT8/Pwc/CD8/Pz8/P0g/Zj8/Bz8IPz8/ez8lPz8/Pz8/Pz8/Pz8/PxUfPyo/HD8OHj8/Pz8HPwg/Pz8/Pz8FPD8/Pz8fPz8/f38/P38GEz8efz8/Pwc/CD8/Pz8/PwU8Pz8/H38/Pz8/Pz8/BiE/Fj9NDgg/Pz8/Pz8/Pz8/Pz9+Pz8/P34/Pz8/Pz8/ez95P2w/U2ZpP2oFPz9rP3g/CD8/Pz8/P30/Pz8/fD98Pz8/PwVMP2A/Tj9GPwg/Pz8/P34/fT8/Pz8/Pz8/Pz8FPz9jPwg/Pz8/PxU3Py8/bw4IPz8/Pz8/BXU/ST9qP0A/CD8/Pz8/P34/Pz8/fj8/Pz8/PwVmPzs/ZD86Pwg/Pz8/Pz8/fz8/Pz8/Pz8/Pz8Faj9BP3U/SD8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BXE/Qz9vP0I/CD8/Pz8/Px4/Pz9/FT9dDgg/Pz8/fT8FXz87Pwg/Pz8/Pz9+Pz9/P30/fT8/Pz8FQz8oP0U/KD8IPz8/Pz9+Bj8IP30/Pz8/BUU/KD9FPyk/CD8/Pz8/fT99Pz8/Pz8/Pz8/PwVfPzs/CD8/Pz8/PwY/CD8/Pz98PwU1PyU/NT8mPwg/Pz8/Pz8GPxU/Pz8/Pw4IPz8/Pz8/Bj8IPz8/P34/BWA/YT8IPz8/Pz8/fT8/Pz98P3w/Pz8/BUs/Tj9NP1E/CD8/Pz8/fj99Pz8/Pz8/Pz8/PwViP2I/FT8/aQ4ePz8/Pz8/P3wHQQg/Pz8/HhU/Mz8OPwc/Px58Pz99fT8/Pwc/Px4/P1AkJz8+IQc/Px58Pz99fT8/PxV9Pz8/Pw4eP2A/KgY/Px8/Pz9/fz8/fwdUIj8efT8/fX0/Pz8GIj80Px9/Pz8/Pz8/Pwc0Pz8fPz9gUAg/aD97Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8VPz8/bD8OCD9wP2Q/Pz8/Pz8/fj8/Pz9+Pz8/Pz8/P1Y/Uz9OHkZlVVAHPwhPP3U/dz9zP3I/MD8HPx85UEYoCD9UP04/Wj8/Pz8/Pz8/Pz8/Pz8/Pz8/P3E/ez8/Px4/Pz8/Bz8IPz8/Rj9CPzk/NT8/Bz8fPz8/PxU/Pz8LPw4efT8/fX0/Pz8HED8IKF9VMj9DP3w/Pz8/Pz8/Pz8/PwA/Pzg/PwdQPx4/Pz8/Pz8/fBU/bD8OCicVPz8/Px4/Pz8/Pz8/fAc/Pwg/Pz8/Hg8/KBE/Oj8HPx86PyYRPw8/CD8lP0k/YQcyHn0/P319Pz8/FX0/Pz8OCiYVWj8/Px58Pz99fT8/Pwc/CEhfUEo/Jh4PPxE/Oj8HPx86PxE/Dz8IP1E/Sz8HPz8ePz8/Pz8/P3wVHz8/Dh4NPyg0DD8HPx4PPyk/Cj8NPz8MPwc/Hw8/Lwo/FT8/His/Dj8CPyM/Bz8eIz8QPwM/LD8rPw4/Aj8jPwc/HyM/ED8DPyw/FX8/Pz8OHn0/P319Pz8/Bz8IT2lcUj8uHhU/QA4/Bz8/Hj8/Pz8/Pz98Bz8/HiJGPz8/Pz8/Bz8/Hj8/Pz8/Pz98FT8/Dh59Pz99fT8/Pwc/CFZqWV0/MD8yP1Q/b1JqVlQ/Kx4NP0AUPwc/Px4/Pz8/Pz8/fAc/Px4CP0s/Pz8/PwY/Bz8/Hj8/Pz8/Pz98Bz8/HiFKPz8/Pz8/Bz8/Hj8/Pz8/Pz98FT8/Pw4efT8/fX0/Pz8HRD8ePz8/Pz8/P3wVPwM/Dh59Pz99fT8/PwU/Pz8/Pwg/Pz8/Pz8/fj8/Pz8/Pz8/Pz8FUj9PPz8/XD8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8/WD8RPxA/Px4/Pz8/Pz8/fBU/Uw4IPz8/Pz8/Pz8/P38/fz8/Pz9/Pz8/Pz8/Hmd0clsHPz8efT8/fX0/Pz8HPz8fPz8/FT8/VQooFTA/Az8OHn0/P319Pz8/B2g/Hj8/Pz8/Pz98FSw/PwooFTA/Az8OHn0/P319Pz8/Bz8/CE9pXFI/Lh4VP0AOPwc/Px4/Pz8/Pz8/fAc/Px4iRj8/Pz8/Pwc/Px4/Pz8/Pz8/fBU/Pw4eIT0iCD8HPx4KPz8/Pz8/Cz8HPx8HPy8iFT8/Pwg/cz9dPz8/Pz8/Pz8/f38/fj8/Pz8/Pz9RP0g/RB4JP0g4Fz8HQQg/tz8/Hg8/LQ4/Jj8HPx8nPywOPw8/CD8lP0Y/YQc6Hn0/P319Pz8/By4/CD8/Pz8/Pz8/PxU2Pz8/DgY/Hz8/P35/Pz9/B1RZCFE/XXtubnFxfWc/Xj9yP3g/ej8/Pz8/Pz8/Pz8/Pz8/Pz8/Px4/PwY/Mz8ffj8/Pz8/Pz8HMz9QPx4/Pz8/Pz8/fRU/Dz8/Pw4IPz8/Px4aPyAIPzM/Bz8fKD8KPyMePyM/Cj8wJj8/Pz8/BiQ/CBM/PzA/Jz9CbVhjYj8/Pz8/Pz9+Pz8/Pz8/Pz8/PxVkPz8IJD8sPz8JPz8/BT8/FT8/Aj9rDgonFVo/Pz8ePz8/Pz8/P3wHLgg/Pz8/Hg8/KBE/Oj8HPx86PyYRPw8/CD8lP0k/YQc/Px58Pz99fT8/PxVZPz8/Dh4nPw4/BT8jPwc/HyM/ED8GPyY/CD8zP1E/XT8/Pz8/Pz8/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YUE/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8VNj8/PwA/DgogFQ8/awg/Pz8/fz8FFT8/CH4/Pz8/fD8EP1Q+Kj8HPx85Rj8/CD8/Pz8/Pz8/Pz8/Pz8/fj8/Pz8/Pz9MVl5HPyYeGD82Pwc/CBA/Pz8/CD8FAz8/CD8/Pz8/PxVHPz8/OQ4IPz8/Pz8/BWw/ND8IP34/Pz8/Bz8IPz8/Pz8/BWw/ND8IPz8/Pz8/Pz8/P34/Pz8/Pz8/BVw/Gz9ePxs/CD8/Pz8/Px9+Pz9+FT8/Az8/DgolBHU/CiUVSz8/Dgg/Pz8/Pz8FbD80Pwg/Pz8/Pz8HPwg/Pz8/P34FbD80Pwg/Pz8/Pz8/fj8/Pz8/Pz8/Pz8FXD8bP14/Gz8IPz8/Pz8/Hz8/Pz8VPz8/Pw4KJBU/P28KIBV1Pww/DgogBD0/CiAVdT8MPw4eCz8xPzMHPx4oPD8IPwc/Pz8HPx8/PzwDPxU/Pz8IP2k/YD8IPz8/Pz8/fT9/Pz99Pz8/Pz8/P1U/Vj9PPyE/Kz8oZj8/Pz8/Aj8eIT8tPww/Bz8fFT8hJyY/CD9AP04/YT9VP2kgPz8HPx9wPzI/Dj83PxV/Pz8/Dh4VP0Y+PAc/HjRMPwY/Bj8/Pwc/Hz8/PhU/BD8/HihRODUHPx48Uj8/Pz8/Pwc/Hz8/OCgEGz8eJz86BT8IPwc/CDk/TUhuM28/Vz84Pwc/HgE/QQc/DT8NPwc/AT8HPwg/Pz8/PzM/SD8/Bz8fCD8FPyc/FT8/Pw4IPz8/Pz8/BT8/Pz8/FT8fPz8/fX0/P30GOj8efT8/Pwg/Pz8/Pz8FFz8/CD8/Pz8/Px4/Pz99FT89P24OHgU/OUEoBz8eK0M/Az8HPz8/Bz8fPz82BT8VPz8IP28/YT9RP0U/JT8/Bz8fZz88PwM/Qj8IP0E/Uj9TCD8/Pz8/Pz8/Pz8/Pz8/Pz8/P2I/dT8/PyI/KT9qPz9HY01KPwY/HhM/Bj8RPwc/Hxg/Px4/FX8/Pz8OCD9eP1Q/Pz8/Pz8/fz9/Pz99Pz8/Pz/GUD9HP0UeAz9APiYHPx8oSD8FPwg/Pz8/Pz8/Pz8/Pz8/fj98PwU/P3oIeD8/fz99Bj8/H30/Pz8/Pz8/BT8/Pz8/CHVee14/Sh4bPyIRPwc/HxU/PyE/FX8/Pz8OBTI/PzI/PxU/PwYHPx4/Pz97CD8/Pz8/PwVxPxY/CD8/Pz8/fx56P38/BmQ/LB9/Pz8/Pz8/Pwc/Kj8ePz8/Pz8/P30VP1E/Pw4IPwE/Wz9HPz8/Pz8/P30/f38/fT8/Pz8/P1Q/SD8zHi1MPC8HPx8pVT8SPwY/Hj8/P34IPz8/Pz8/BT8/ej8/Hz8/P319Pz99BiI/Hn4/Pz8IPz8/Pz8/BT8/fD8IPxk/Bz8UPz8HPx8OPz8NPxV/Pz8/Dgg/Pz8/Pz8FeT8/PwgiCD9PZEE/CDA/UD8/Pz8/Pz8/Pz8/Pz8/Pz9+Pz8/Pz8/PzVQV0s/Cj8eCz8yAT8HPwg/Pz8EPw8/BVY/aj8/Cz8ffT8/Pz8/Pz8GSD8ePz8/fRU/P3EOBT8GPwg/Pz8/Pz8/Pz8/fz9/Pz8/Pz8FXg4/CD8/Pz8/PwY/Hns/Pz8HKD8ePz8/Pz9/P30VP0c/Pz8OHiU/Kz8xNj8HPx43Pyw/JT8lPyo/Nz8HPx82Py0/LyU/FT8/HkY/Oz8DP1U/Bz8eVT89PwU/Rj9GPzs/Az9VPwc/H1U/PT8FP0Y/FX8/Dgg/Pz8/Pz8FCj9YPwg/Pz8/Pz8/fz8/Pz8/Pz8/Pz8FCj9YPwg/Pz8/Pz8ePz8/fxUDPz8IPw4KIBU/Pw4fP34/fHx+fnwGcD8ffD9+Pz8/Pz8GcD8VP2Q/DgokFTE/DgZZPx8/Pz9+fj8/fgdZP1Y/Hn0/P319Pz8/BlY/WT8ffj8/Pz8/Pz8HWT9WPx4/Pz8/Pz8/fRUaPz8/Pw4FPz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BVokWj8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8wAT8/CH8/Pz8/fz9/Pz8/PwUBPz9NMAg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8FPz8kCD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwVNPwE/Pwg/Pz8/Pz8/Pz8/fz8VPD9XP04/Dgg/Pz8/Pz8/Pz8/Pz8rKz8VPzY4Pz84Pz8VPysrPwg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz0/JT8oRz8/Rz8/JT8/PT8/Pz8/Pz8VHz9OPw4IPz8/Pz8/KD0/JT9HPz9HPz8lPygoPT8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8rPxU/OD8/OD8/FT82Pys/Pz8/Pz8/Hz8/Pz8VHz8/Tj8OCiEVYT8OCD89YUhHUQVqP2M/CD8DPz8/Bz8fPz9HKxUKP3cIaydaWEk/Bz8eTVs/Pz8/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AG4AIAB5AGEAbQAgAHUAbwB5ACAALABzAHQAcwBpAHgAZQAgAHQAbgBlAG0AZQBlAHIAZwBhACAAaABjAHUAcwAgAG8AbgAgAGYASQAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIABkAG4AYQAgAHUAbwB5ACAAbgBlAGUAdwB0AGUAYgAgAHMAdABzAGkAeABlACAAdABhAGgAdAAgAHQAbgBlAG0AZQBlAHIAZwBhACAAZQBjAGkAdgByAGUAUwAgAGYAbwAgAHMAbQByAGUAVAAgAGUAaAB0ACAAbwB0ACAAdABjAGUAagBiAHUAcwAgAHMAaQAgAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAHQAIABlAHMAdQAgAG8AdAAgAHQAaABnAGkAcgAgAHIAdQBvAFkAIAAuAG4AbwBpAHQAYQBjAG8AbAAgAHkAbgBhACAAbQBvAHIAZgAgAHQAaQAgAHQAcwBvAGgAIAByAG8AIAAsAHIAZQB0AHUAcABtAG8AYwAgAHkAbgBhACAAbgBvAHAAdQAgAHQAaQAgAGwAbABhAHQAcwBuAGkAIAByAG8AIAAsAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAHQAIABkAGEAbwBsAG4AdwBvAGQAIAByAG8AIAAsAGUAdAB1AGIAaQByAHQAcwBpAGQAIAAsAHkAZgBpAGQAbwBtACAALAB5AHAAbwBjACAAdABvAG4AIAB5AGEAbQAgAHUAbwBZACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGYAbwAgAHkAdAByAGUAcABvAHIAcAAgAGUAaAB0ACAAcwBpACAAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAVAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIAC4AcwBuAG8AaQB0AGMAaQBkAHMAaQByAHUAagAgAG4AaQBhAHQAcgBlAGMAIABuAGkAIABkAGUAcgBlAHQAcwBpAGcAZQByACAAZQBiACAAeQBhAG0AIABoAGMAaQBoAHcAIAAsAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIABmAG8AIABrAHIAYQBtAGUAZABhAHIAdAAgAGEAIABzAGkAIABkAGUAZABuAHUAbwBSACAAbQBhAGgAdABvAEcAdABuAG8ARgAxADAAMgAu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)); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/BC699FA675F9356E3.css b/docs/static/fonts/332720/BC699FA675F9356E3.css deleted file mode 100644 index fc6add2211..0000000000 --- a/docs/static/fonts/332720/BC699FA675F9356E3.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/C32E9F0C757C29D4A.css b/docs/static/fonts/332720/C32E9F0C757C29D4A.css deleted file mode 100644 index 96c8c1f725..0000000000 --- a/docs/static/fonts/332720/C32E9F0C757C29D4A.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,T1RUTwANAIAAAwBQQ0ZGILkPphQAABIUAAAk2kdERUYAkAAEAAA28AAAACBHUE9TuESiiwAANxAAABwCR1NVQunFLUgAAFMUAAAAgE9TLzJVxiUrAAABQAAAAGBjbWFw0U4uVAAADVwAAASYZ2FzcAAAAAsAAFOUAAAACGhlYWQDcke+AAAA3AAAADZoaGVhB74DqgAAARQAAAAkaG10eNbiGPsAAFOcAAABjG1heHAAY1AAAAABOAAAAAZuYW1lKDUzBAAAAaAAAAu7cG9zdP+4ADIAABH0AAAAIAABAAAAAQBBj0s7+V8PPPUACwPoAAAAANAsAh8AAAAA0CwCH//o/zgEEwMiAAAACAACAAAAAAAAAAEAAAPA/xAAAARO/+j/6AQTAAEAAAAAAAAAAAAAAAAAAABjAABQAABjAAAAAgIsASwABQAEArwCigAAAIwCvAKKAAAB3QAyAPoAAAAAAAAAAAAAAACgAAB/UAAASgAAAAAAAAAASCZDbwAAACPgEgMg/zgAyAPAAPAAAAALAAAAAAH+ArwAIAAgAAIAAAAkAbYAAQAAAAAAAABAAAAAAQAAAAAAAQAjAEAAAQAAAAAAAgAHAGMAAQAAAAAAAwAhAGoAAQAAAAAABAAjAEAAAQAAAAAABQANAIsAAQAAAAAABgAEAJgAAQAAAAAABwBhAJwAAQAAAAAACAANAP0AAQAAAAAACQANAP0AAQAAAAAACgIRAQoAAQAAAAAACwASAxsAAQAAAAAADAASAxsAAQAAAAAADQIRAQoAAQAAAAAADgAqAy0AAQAAAAAAEAAjAEAAAQAAAAAAEQAjAEAAAQAAAAAAEgAjAEAAAwABBAkAAACAA1cAAwABBAkAAQBGA9cAAwABBAkAAgAOBB0AAwABBAkAAwBCBCsAAwABBAkABABGA9cAAwABBAkABQAaBG0AAwABBAkABgAIBIcAAwABBAkABwDCBI8AAwABBAkACAAaBVEAAwABBAkACQAaBVEAAwABBAkACgQiBWsAAwABBAkACwAkCY0AAwABBAkADAAkCY0AAwABBAkADQQiBWsAAwABBAkADgBUCbEAAwABBAkAEABGA9cAAwABBAkAEQBGA9cAAwABBAkAEgBGA9dDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgSG9lZmxlciAmIENvLiBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tQ29weXJpZ2h0IChDKSBIJkNvIHwgdHlwb2dyYXBoeS5jb21SZWd1bGFyMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5VmVyc2lvbiAxLjIwMUZvbnRHb3RoYW0gUm91bmRlZCBpcyBhIHRyYWRlbWFyayBvZiBIb2VmbGVyICYgQ28uLCB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBpbiBjZXJ0YWluIGp1cmlzZGljdGlvbnMuSG9lZmxlciAmIENvLlRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3BlcnR5IG9mIEhvZWZsZXIgJiBDby4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBvciBkb3dubG9hZCB0aGlzIHNvZnR3YXJlLCBvciBpbnN0YWxsIGl0IHVwb24gYW55IGNvbXB1dGVyLCBvciBob3N0IGl0IGZyb20gYW55IGxvY2F0aW9uLiBZb3VyIHJpZ2h0IHRvIHVzZSB0aGlzIHNvZnR3YXJlIGlzIHN1YmplY3QgdG8gdGhlIFRlcm1zIG9mIFNlcnZpY2UgYWdyZWVtZW50IHRoYXQgZXhpc3RzIGJldHdlZW4geW91IGFuZCBIb2VmbGVyICYgQ28uIElmIG5vIHN1Y2ggYWdyZWVtZW50IGV4aXN0cywgeW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb20vd2ViZm9udC1zb2Z0d2FyZSwgb3IgY29udGFjdCBIb2VmbGVyICYgQ28uIGF0IHd3dy50eXBvZ3JhcGh5LmNvbSAxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTl3d3cudHlwb2dyYXBoeS5jb21odHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUAQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAwADYALAAgADIAMAAwADcAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAASAAmAEMAbwAgAHwAIAB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AUgBlAGcAdQBsAGEAcgAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQBWAGUAcgBzAGkAbwBuACAAMQAuADIAMAAxAEYAbwBuAHQARwBvAHQAaABhAG0AIABSAG8AdQBuAGQAZQBkACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAsACAAdwBoAGkAYwBoACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgBIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABjAG8AcAB5ACwAIABtAG8AZABpAGYAeQAsACAAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAbwByACAAZABvAHcAbgBsAG8AYQBkACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAsACAAbwByACAAaQBuAHMAdABhAGwAbAAgAGkAdAAgAHUAcABvAG4AIABhAG4AeQAgAGMAbwBtAHAAdQB0AGUAcgAsACAAbwByACAAaABvAHMAdAAgAGkAdAAgAGYAcgBvAG0AIABhAG4AeQAgAGwAbwBjAGEAdABpAG8AbgAuACAAWQBvAHUAcgAgAHIAaQBnAGgAdAAgAHQAbwAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAFQAZQByAG0AcwAgAG8AZgAgAFMAZQByAHYAaQBjAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHQAaABhAHQAIABlAHgAaQBzAHQAcwAgAGIAZQB0AHcAZQBlAG4AIAB5AG8AdQAgAGEAbgBkACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAEkAZgAgAG4AbwAgAHMAdQBjAGgAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGUAeABpAHMAdABzACwAIAB5AG8AdQAgAG0AYQB5ACAAbgBvAHQAIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAGEAbgB5ACAAcAB1AHIAcABvAHMAZQAuACAARgBvAHIAIABtAG8AcgBlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABwAGwAZQBhAHMAZQAgAHYAaQBzAGkAdAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0ALwB3AGUAYgBmAG8AbgB0AC0AcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABjAG8AbgB0AGEAYwB0ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGEAdAAgAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtACAAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUAAAAAAwAAAAMAAAAcAAEAAAAAA5IAAwABAAAAHAAEA3YAAACsAIAABgAsACAAIwAvADQANwA/AEQARwBNAF0AXwBjAHEAdAB2AHkAfQCjAKUAqwCuALAAtwC7AMUAxwDWAN0A5QDvAPYA+AD9AQcBDgEQARMBFQEXARkBGwEjAScBKwEtAS8BMQE3AUIBRAFGAUgBUQFUAVYBWAFaAV4BYAFlAWoBbAFuAXABcgF0AXkBewF9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/+cAAAAAAAAAAAAAAAD/8QAA/5z/9v+cAAAAAP/2AAD/8QAAAAAAAAAAAAAAAAAAAAAAFAAA//YAAAAAAAAAAAAAAAD/9gAA//H/8QAAAAAAAAAAAAAAAP/sAAD/7P/x//b/4gAAAAoAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAAAA//sAAAAAAAD/5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/OAAD/9v/2//H/4v/iAAD/2AAA//b/9gAAAAAAAAAAAAD/4gAAAAD/5wAA/87/7P/n/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAP/s/8T/zgAA/84AAAAAAAAAAP/YAAAAAP+c/+z/jf+cAAD/fgAAAAD/9v+wAAD/iAAAAAD/9gAAAAD/+wAA/9j/7P/7AAAAAAAAAAAAAAAAAAD/xAAA/9j/2P+mAAAAAAAA/+wAAAAA/8T/zgAA/8QAAAAAAAD/2AAA/+L/+//JAAD/2P/d/87/xP/YAAAAAAAAAAD/2P/s/+wAAAAA/9gAAP/YAAAAAAAAAAAAAAAAAAAAAAAA/+L/7AAAAAAAAAAAAAAAAP/YAAAAAAAAAAAAAP/7AAAAAAAAAAD/ugAAAAAAAAAAAAAAAP/7AAD/9v/x//YAAAAAAAAAAAAAAAD/+wAA/5wAAP+cAAAADwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAA8AAAAFAAAACgAAAAoAAAAAAAAAAAAAAAAAAP/JAAAAAP/dAAD/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sAAP/2AAD/7P/xAAD/5wAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAACv/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/9v/xAAD/4v/n/+f/4v/2AAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAD/+wAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAA//sAAAAA//H/9v/x//H/+wAAAAD/pv/J/5L/8QAAAAAAAAAAAAAAAP/s/3n/ugAA/+wAAAAAAAD/ef/O/5z/g/+c/6b/zv+D/6b/uv/Y/9j/nAAAAAAAAAAAAAAAAAAA/40AAP+m/84AAP+c/5z/nP+c/5z/kgAAAAD/5wAA/+wAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAAAAAAAP/7AAAAAAAAAAD/nP/YAAD/5wAAAAAAAP/2AAD/7P/2/7oAAAAA//YAAAAAAAD/uv/s/4j/v/+I/9j/5/+//8T/2P/sAAD/2AAAAAAAAAAAAAAAAAAA/8QAAAAA/+wAAP/YAAD/3QAA/9j/yQAAAAD/pv/d/5f/7AAAAAD/9v/2//H/7P/2/7r/0wAA//YAAAAAAAD/v//x/5z/xP+c/93/4v/E/87/3f/x//H/3QAAAAAAAAAAAAAAAAAA/8QAAP+c/+cAAP/d/93/3f/Y/93/yQAAAAAAAP/OAAD/4gAA//YAAP/xAAD/7AAA//YAAAAA//YAAAAAAAD/0wAAAAD/2AAA/87/7P/Y/87/7P/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAD/2AAA/9gAAAAAAAD/kv/E/37/3QAAAAD/7P/s/+wAAP/2/5z/ugAA//YAAAAAAAD/kv/Y/37/l/9+/7D/2P+X/5z/tf/s/+z/tQAAAAAAAAAAAAAAAAAA/5wAAP+S/+IAAP+1/8T/yf+6/8T/sAAAAAAAAP/YAAD/9gAAAAAAAAAAAAAAAP/2AAD/8QAAAAAAAAAAAAD/5wAAAAD/7AAA/+L/9v/s/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3QAAAAAAAAAAAAAAAAAA//sAAAAA/+z/7AAA/+wAAAAAAAAAAAAAAAD/9v+mAAAAAP/OAAD/ugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/nAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/uv/x/+wAAAAA//YAAP/2AAAAAAAAAAD/+wAAAAAAAAAA/+L/3QAA//YAAAAAAAAAAAAAAAAAAAAA/+f/7P/i/+f/8QAAAAAAAP/YAAAAAP+m//EAAP+cAAD/kgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAD/xAAA/8QAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/9gAA//b/9gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/7AAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/7AAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/9gAAAAAAAP/2//YACgAAAAAAAAAA//H/8QAAAAoADwAAAAAAAAAAAAAAAAAA//v/+//2//sAAAAAAAAAAAAAAAAAAP/OAAD/7P/xAAD/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAA8AAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/9MAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/2/+wAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAA/+L/2AAAAAAAAAAAAAAAAAAAAAAAAAAA/+f/5//i/+f/8QAAAAAAAP/YAAAAAP+c//H/iP+cAAD/fgAAAAAAAAAAAAAAAAAAAAD/7AAAAAD/9gAAAAD/8f/2AAAAAAAAAAAAAP/OAAAAAAAAAAD/2AAAAAD/7AAA/+cAAAAA/6v/ugAA/8QAAP/sAAD/2AAAAAAAAP+mAAD/2P/d/87/sP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAAAAAAAAAAAAD/2AAAAAD/9gAA//H/9v/i//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAeAAAAHgAeABT/9gAA/9P/9v/TAAAAAP/2//EAAAAAAAAAAAAAAB4AIwAAAB4AIwA3AAAAAP/TAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+6AAD/2P/d/+z/tQAAAAAAAAAAAAAAAAAAAAD/9gAAAAD/+wAAAAAAAP/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//H/9v/x//EAAAAAAAD/7AAAAAD/9v+mAAD/xP/O/87/nP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//YAAAAA/+L/7P/T/+L/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/tQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/8QAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAD/2AAAAAD/5wAAAAD/5wAA/+wAAP/n/+z/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2/+z/7AAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/sP/x/+wAAAAA/+wAAP/sAAAAAAAAAAD/9gAAAAAAAAAA/+L/zgAA/+wAAAAAAAAAAAAAAAAAAAAA/+L/5//d/+L/7AAAAAAAAP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4gAAAAD/4gAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAP/E//EAAP/OAAD/ugAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAD/3QAA/90AAAAAAAD/pgAA/7AAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAD/8QAAAAD/8QAAAAAAAP/xAAAAAAAAAAAAAAAAAAAAAP/dAAAAAAAA//YAAAAAAA8AAAAAAAAAAAAAAAD/9gAAAAD/nAAA/5wAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/0wAAAAD/2AAAAAAAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAUAAD/4gAAAAD/5wAA/6b/5/+mAAAAAP/n//YAAAAAAAAAAAAAAAAAAAAAABQAIwAAAAAAAP+1AAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/tf/2//EAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAA/+z/3QAA//YAAAAA//YAAAAA//YAAAAA/+z/8f/n//H/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5wAAP+c/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/iP/YAAD/4gAAAAAAAAAAAAAAAP/s/78AAAAAAAAAAAAAAAD/sAAAAAD/ugAAAAD/5/+6AAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAA/6sAAAAA/+wAAP/OAAD/zgAA/87/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/8QAAAAD/8QAAAAAAAP/x//YAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAAAAAAAAAD/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/8QAA//H/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAD/zv/2/+z/5wAA/7r/7P+6//YAAP/s/+z/9gAAAAAAAAAAAAD/9gAAAAAAAAAA//EAAP/EAAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAAAAAAAAAAAAD/3QAAAAD/4gAA/+IAAP/i/9P/8QAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAD/9gAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+cAAAAAAAD/zv/2/+z/4gAA/6v/5/+r//EAAP/n/+L/8QAAAAAAAAAAAAD/9gAAAAAAAAAA/+wAAP+6AAAAAAAA//H/9v/2//b/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/0wAAAAD/8QAAAAD/8QAAAAAAAP/x//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABQBbABgAAAAsAAAAGQAAACAAIwAiADMAAAAyAB8AHwAAAAAAAAAAAAEAAgADAAQABgAHAAgACQAKAAAACwAMAA0ADgAPABAAEQASABMAFAAVABYAHQAbAAAAAAAXABoAHgAhACQAJQAoAAAAAAApAAAAKAAoACsAGgAAADQANgA4ADkAHAAAAAAAAAAAAAAAAAAAACYAAAAAAAAAAAAnAC0AIwAjAC4ALwAgAC4ALwAgAAAAIgAmACcAAQAFAF0ADQAAAAAAIQAOAAAAFQAYABcAKQAAACgAFAAUAAAAAAAAACIAAQAAAAIAAAAAAAIAAwAAAAAAAAACAAAAAgAAAAQABQAGAAcACAAJAAoACwAAABAAEgAAAAwADwATABMAGQAaAA8AHQAeAA8ADwAfAB8AEwAfABYAKgAtAC8AMAAAAAAAEQAAAAAAAAAAAAAAGwAmAAAAAAAAABwAIwAYABgAJAAlABUAJAAlABUAAAAXABsAHAAAACYAAgAOAAUABQAAAAcABwABAAkACQACAAsADgADABAAEgAHABcAHwAKACEALgATADEANwAhADoAOgAoADwAPwApAEEARQAtAE0ATQAyAFIAWwAzAF0AXwA9AAEACAABAAAAAQABAAEAAAABAAAACgAwAD4AAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAEAAAAAP//AAEAAAABc3MwMQAIAAAAAQAAAAIABgAOAAYAAAABABAAAQAAAAEAKAABAAgAAQAOAAEAAQBiAAEABAABAGIAAQAAAAEAAAABAAEABv+fAAEAAQBiAAEAAf//AAoB9AAAASwAAAGaAEUCvAAtAzgANwK4ADEA5gBFAa4ARwGuADwBrgBMAmwAQADmADYBmABCAOYAUgH0//oCmAAvAksAQADwAFcA8AA7AmwAPAJsAE8CbABZAhYAJQMWADgC0gBoAuIASQMOAGgCkABoAxAASQIlACoCywBoAmsAaANkAGgDUgBJApwAaANSAEkC0wBoAoAAQQKIADIC+ABdAu4AOAROADwC0gBJAswANgKwAEcBrgBiAfQACQGuADcCWP/oAj4AMwKUAF0COwA6AkgAOgFqAC0ClAA8AmUAXQD5AF4A+f/7AjAAXQD5AGQDtwBdAmUAXQKAADoClABdApQAPAGQACoCRgA1AjoAQwJMADQB4AA3AR4AeQHgADUCRQA+AoQAQgKuADUDPgA1AYYAOgIDADcBoAAiAcIASgDmAFIBhgAvAgMAQwIWADQCEABCA4IAQgDmAE0A5gA7AOYANgGaAE0BmgA7AZoANgHWAG8CqABSATcANwE3AEMC0AA3ArIAFgK2ADI=); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/opentype;base64,T1RUTwALAIAAAwAwQ0ZGIE+2i2MAABCYAAAOb0dERUYASAAEAAAfCAAAACBPUy8yVcclSwAAASAAAABgY21hcO62ywIAAA08AAADOmdhc3AAAAALAAAfKAAAAAhoZWFkAxZHvAAAALwAAAA2aGhlYQdhAwAAAAD0AAAAJGhtdHg9xwbVAAAfMAAAAGxtYXhwABtQAAAAARgAAAAGbmFtZSg1MwQAAAGAAAALu3Bvc3T/uAAyAAAQeAAAACAAAQAAAAEAQS6s5cVfDzz1AAsD6AAAAADQLAIfAAAAANAsAh8AAP84A58DIAAAAAgAAgAAAAAAAAABAAADwP8QAAAD1AAAAAADnwABAAAAAAAAAAAAAAAAAAAAGwAAUAAAGwAAAAICTQEsAAUABAK8AooAAACMArwCigAAAd0AMgD6AAAAAAAAAAAAAAAAoAAAf1AAAEoAAAAAAAAAAEgmQ28AAAAk4BIDIP84AMgDwADwAAAACwAAAAAB/gK8ACAAIAABAAAAJAG2AAEAAAAAAAAAQAAAAAEAAAAAAAEAIwBAAAEAAAAAAAIABwBjAAEAAAAAAAMAIQBqAAEAAAAAAAQAIwBAAAEAAAAAAAUADQCLAAEAAAAAAAYABACYAAEAAAAAAAcAYQCcAAEAAAAAAAgADQD9AAEAAAAAAAkADQD9AAEAAAAAAAoCEQEKAAEAAAAAAAsAEgMbAAEAAAAAAAwAEgMbAAEAAAAAAA0CEQEKAAEAAAAAAA4AKgMtAAEAAAAAABAAIwBAAAEAAAAAABEAIwBAAAEAAAAAABIAIwBAAAMAAQQJAAAAgANXAAMAAQQJAAEARgPXAAMAAQQJAAIADgQdAAMAAQQJAAMAQgQrAAMAAQQJAAQARgPXAAMAAQQJAAUAGgRtAAMAAQQJAAYACASHAAMAAQQJAAcAwgSPAAMAAQQJAAgAGgVRAAMAAQQJAAkAGgVRAAMAAQQJAAoEIgVrAAMAAQQJAAsAJAmNAAMAAQQJAAwAJAmNAAMAAQQJAA0EIgVrAAMAAQQJAA4AVAmxAAMAAQQJABAARgPXAAMAAQQJABEARgPXAAMAAQQJABIARgPXQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEhvZWZsZXIgJiBDby4gaHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbUNvcHlyaWdodCAoQykgSCZDbyB8IHR5cG9ncmFwaHkuY29tUmVndWxhcjE3MTI0Ny04ODQ3NC0yMDE1MDYyMy0yNDIzLTE0MDIxOVZlcnNpb24gMS4yMDFGb250R290aGFtIFJvdW5kZWQgaXMgYSB0cmFkZW1hcmsgb2YgSG9lZmxlciAmIENvLiwgd2hpY2ggbWF5IGJlIHJlZ2lzdGVyZWQgaW4gY2VydGFpbiBqdXJpc2RpY3Rpb25zLkhvZWZsZXIgJiBDby5UaGlzIHNvZnR3YXJlIGlzIHRoZSBwcm9wZXJ0eSBvZiBIb2VmbGVyICYgQ28uIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgb3IgZG93bmxvYWQgdGhpcyBzb2Z0d2FyZSwgb3IgaW5zdGFsbCBpdCB1cG9uIGFueSBjb21wdXRlciwgb3IgaG9zdCBpdCBmcm9tIGFueSBsb2NhdGlvbi4gWW91ciByaWdodCB0byB1c2UgdGhpcyBzb2Z0d2FyZSBpcyBzdWJqZWN0IHRvIHRoZSBUZXJtcyBvZiBTZXJ2aWNlIGFncmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAyADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAUgBvAHUAbgBkAGUAZAAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4ALAAgAHcAaABpAGMAaAAgAG0AYQB5ACAAYgBlACAAcgBlAGcAaQBzAHQAZQByAGUAZAAgAGkAbgAgAGMAZQByAHQAYQBpAG4AIABqAHUAcgBpAHMAZABpAGMAdABpAG8AbgBzAC4ASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgBUAGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAdABoAGUAIABwAHIAbwBwAGUAcgB0AHkAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAsACAAbQBvAGQAaQBmAHkALAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAG8AcgAgAGQAbwB3AG4AbABvAGEAZAAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGkAbgBzAHQAYQBsAGwAIABpAHQAIAB1AHAAbwBuACAAYQBuAHkAIABjAG8AbQBwAHUAdABlAHIALAAgAG8AcgAgAGgAbwBzAHQAIABpAHQAIABmAHIAbwBtACAAYQBuAHkAIABsAG8AYwBhAHQAaQBvAG4ALgAgAFkAbwB1AHIAIAByAGkAZwBoAHQAIAB0AG8AIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABUAGUAcgBtAHMAIABvAGYAIABTAGUAcgB2AGkAYwBlACAAYQBnAHIA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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/CB3CA0F49552DA871.css b/docs/static/fonts/332720/CB3CA0F49552DA871.css deleted file mode 100644 index e78c24bb17..0000000000 --- a/docs/static/fonts/332720/CB3CA0F49552DA871.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/truetype;base64,AAACAAAABAABABwAAQABAAIAAAAAABgAAAAOAAAAAQAKAD8/AQABAGd1bHNvY2gHAgE/AF0AWgBYAFYAVQBSAEcAOwAxACwAKwAoACMAHAAbABkAGAAWABUAFAATAAcABAADAAIAAQAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAyAD8/AAAAAAAAAgAAZQByAGEAdwB0AGYAbwBzAC0AdABuAG8AZgBiAGUAdwAvAG0AbwBjAC4AeQBoAHAAYQByAGcAbwBwAHkAdAAuAHcAdwB3AC8ALwA6AHAAdAB0AGgAbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcAOQAxADIAMAA0ADEALQAzADIANAAyAC0AMwAyADYAMAA1ADEAMAAyAC0ANAA3ADQAOAA4AC0ANwA0ADIAMQA3ADEAIABtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQALgB3AHcAdwAgAHQAYQAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIAB0AGMAYQB0AG4AbwBjACAAcgBvACAALABlAHIAYQB3AHQAZgBvAHMALQB0AG4AbwBmAGIAZQB3AC8AbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaAAgAHQAaQBzAGkAdgAgAGUAcwBhAGUAbABwACAALABuAG8AaQB0AGEAbQByAG8AZgBuAGkAIABlAHIAbwBtACAAcgBvAEYAIAAuAGUAcwBvAHAAcgB1AHAAIAB5AG4AYQAgAHIAbwBmACAAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAdAAgAGUAcwB1ACAAdABvAG4AIAB5AGEAbQAgAHUAbwB5ACAALABzAHQAcwBpAHgAZQAgAHQAbgBlAG0AZQBlAHIAZwBhACAAaABjAHUAcwAgAG8AbgAgAGYASQAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIABkAG4AYQAgAHUAbwB5ACAAbgBlAGUAdwB0AGUAYgAgAHMAdABzAGkAeABlACAAdABhAGgAdAAgAHQAbgBlAG0AZQBlAHIAZwBhACAAZQBjAGkAdgByAGUAUwAgAGYAbwAgAHMAbQByAGUAVAAgAGUAaAB0ACAAbwB0ACAAdABjAGUAagBiAHUAcwAgAHMAaQAgAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAHQAIABlAHMAdQAgAG8AdAAgAHQAaABnAGkAcgAgAHIAdQBvAFkAIAAuAG4AbwBpAHQAYQBjAG8AbAAgAHkAbgBhACAAbQBvAHIAZgAgAHQAaQAgAHQAcwBvAGgAIAByAG8AIAAsAHIAZQB0AHUAcABtAG8AYwAgAHkAbgBhACAAbgBvAHAAdQAgAHQAaQAgAGwAbABhAHQAcwBuAGkAIAByAG8AIAAsAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAHQAIABkAGEAbwBsAG4AdwBvAGQAIAByAG8AIAAsAGUAdAB1AGIAaQByAHQAcwBpAGQAIAAsAHkAZgBpAGQAbwBtACAALAB5AHAAbwBjACAAdABvAG4AIAB5AGEAbQAgAHUAbwBZACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGYAbwAgAHkAdAByAGUAcABvAHIAcAAgAGUAaAB0ACAAcwBpACAAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAVAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIAC4AcwBuAG8AaQB0AGMAaQBkAHMAaQByAHUAagAgAG4AaQBhAHQAcgBlAGMAIABuAGkAIABkAGUAcgBlAHQAcwBpAGcAZQByACAAZQBiACAAeQBhAG0AIABoAGMAaQBoAHcAIAAsAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIABmAG8AIABrAHIAYQBtAGUAZABhAHIAdAAgAGEAIABzAGkAIABtAGEAaAB0AG8ARwB0AG4AbwBGADEAMAAzAC4AMQAgAG4AbwBpAHMAcgBlAFYAOQAxADIAMAA0ADEALQAzADIANAAyAC0AMwAyADYAMAA1ADEAMAAyAC0ANAA3ADQAOAA4AC0ANwA0ADIAMQA3ADEAcgBhAGwAdQBnAGUAUgBtAG8AYwAuAHkAaABwAGEAcgBnAG8AcAB5AHQAIAB8ACAAbwBDACYASAAgACkAQwAoACAAdABoAGcAaQByAHkAcABvAEMAbQBvAGMALgB5AGgAcABhAHIAZwBvAHAAeQB0AC4AdwB3AHcALwAvADoAcAB0AHQAaAAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIAA3ADAAMAAyACAALAA2ADAAMAAyACAAKQBDACgAIAB0AGgAZwBpAHIAeQBwAG8AQwBlcmF3dGZvcy10bm9mYmV3L21vYy55aHBhcmdvcHl0Lnd3dy8vOnB0dGhtb2MueWhwYXJnb3B5dC53d3c5MTIwNDEtMzI0Mi0zMjYwNTEwMi00NzQ4OC03NDIxNzEgbW9jLnlocGFyZ29weXQud3d3IHRhIC5vQyAmIHJlbGZlb0ggdGNhdG5vYyBybyAsZXJhd3Rmb3MtdG5vZmJldy9tb2MueWhwYXJnb3B5dC53d3cvLzpwdHRoIHRpc2l2IGVzYWVscCAsbm9pdGFtcm9mbmkgZXJvbSByb0YgLmVzb3BydXAgeW5hIHJvZiBlcmF3dGZvcyBzaWh0IGVzdSB0b24geWFtIHVveSAsc3RzaXhlIHRuZW1lZXJnYSBoY3VzIG9uIGZJIC5vQyAmIHJlbGZlb0ggZG5hIHVveSBuZWV3dGViIHN0c2l4ZSB0YWh0IHRuZW1lZXJnYSBlY2l2cmVTIGZvIHNtcmVUIGVodCBvdCB0Y2VqYnVzIHNpIGVyYXd0Zm9zIHNpaHQgZXN1IG90IHRoZ2lyIHJ1b1kgLm5vaXRhY29sIHluYSBtb3JmIHRpIHRzb2ggcm8gLHJldHVwbW9jIHluYSBub3B1IHRpIGxsYXRzbmkgcm8gLGVyYXd0Zm9zIHNpaHQgZGFvbG53b2Qgcm8gLGV0dWJpcnRzaWQgLHlmaWRvbSAseXBvYyB0b24geWFtIHVvWSAub0MgJiByZWxmZW9IIGZvIHl0cmVwb3JwIGVodCBzaSBlcmF3dGZvcyBzaWhULm9DICYgcmVsZmVvSC5zbm9pdGNpZHNpcnVqIG5pYXRyZWMgbmkgZGVyZXRzaWdlciBlYiB5YW0gaGNpaHcgLC5vQyAmIHJlbGZlb0ggZm8ga3JhbWVkYXJ0IGEgc2kgbWFodG9HdG5vRjEwMy4xIG5vaXNyZVY5MTIwNDEtMzI0Mi0zMjYwNTEwMi00NzQ4OC03NDIxNzFyYWx1Z2VSbW9jLnlocGFyZ29weXQgfCBvQyZIIClDKCB0aGdpcnlwb0Ntb2MueWhwYXJnb3B5dC53d3cvLzpwdHRoIC5vQyAmIHJlbGZlb0ggNzAwMiAsNjAwMiApQyggdGhnaXJ5cG9DPwNGABIACQQBAAMAPwNGABEA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))); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/truetype;base64,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cmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAzADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAsACAAdwBoAGkAYwBoACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgBIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABjAG8AcAB5ACwAIABtAG8AZABpAGYAeQAsACAAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAbwByACAAZABvAHcAbgBsAG8AYQBkACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAsACAAbwByACAAaQBuAHMAdABhAGwAbAAgAGkAdAAgAHUAcABvAG4AIABhAG4AeQAgAGMAbwBtAHAAdQB0AGUAcgAsACAAbwByACAAaABvAHMAdAAgAGkAdAAgAGYAcgBvAG0AIABhAG4AeQAgAGwAbwBjAGEAdABpAG8AbgAuACAAWQBvAHUAcgAgAHIAaQBnAGgAdAAgAHQAbwAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAFQAZQByAG0AcwAgAG8AZgAgAFMAZQByAHYAaQBjAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHQAaABhAHQAIABlAHgAaQBzAHQAcwAgAGIAZQB0AHcAZQBlAG4AIAB5AG8AdQAgAGEAbgBkACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAEkAZgAgAG4AbwAgAHMAdQBjAGgAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGUAeABpAHMAdABzACwAIAB5AG8AdQAgAG0AYQB5ACAAbgBvAHQAIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAGEAbgB5ACAAcAB1AHIAcABvAHMAZQAuACAARgBvAHIAIABtAG8AcgBlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABwAGwAZQBhAHMAZQAgAHYAaQBzAGkAdAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0ALwB3AGUAYgBmAG8AbgB0AC0AcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABjAG8AbgB0AGEAYwB0ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGEAdAAgAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtACAAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUAAAIAAAAAAAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAEAAgADAAQABwATABQAFQAWABgAGQAbABwAIwAoACsALAAxADsARwBSAFUAVgBYAFoAXQCjAQIHaGNvc2x1ZwABAAH//wAKAAEAAAAOAAAAGAAAAAAAAgABAAEAHAABAAQAAAACAAA=); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/DBA0DCC14F9DF8F4E.css b/docs/static/fonts/332720/DBA0DCC14F9DF8F4E.css deleted file mode 100644 index 9d5f7c8977..0000000000 --- a/docs/static/fonts/332720/DBA0DCC14F9DF8F4E.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - - \ No newline at end of file diff --git a/docs/static/fonts/332720/E62638AD5B5A9C61A.css b/docs/static/fonts/332720/E62638AD5B5A9C61A.css deleted file mode 100644 index a727dfcc29..0000000000 --- a/docs/static/fonts/332720/E62638AD5B5A9C61A.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/opentype;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8AAD8/AAA/PwAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAPz8AAD8/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/Pz8AAAAAPz8AAAAAPz8AAAAAPz8AAD8/PwAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAIwAUAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAA/Pz8/AAA/PwAAAAA/PwAAFAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAA8AAAAAAD8/AAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAD8/AAA/PwAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAA/PwAAPz8AAD8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/Pz8/PwAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAAAAAAAAAA/PwAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/AAA/PwAAPz8AAAAAPz8AAAAAPz8AAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8AAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8/AAA/Pz8/AAAAAD8/AAAAAAAAPz8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAPz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAPz8AAAAANwAjAB4AAAAjAB4AAAAAAAAAAAAAAD8/Pz8AAAAAPz8/Pz8AAD8/FAAeAB4AAAAeAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/Pz8AAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8/AAA/PwAAAAAAAD8/AAA/PwAAPz8AAD8/Pz8AAAAAPz8AAD8/AAAAAD8/AAAAAAAAAAA/PwAAAAAAAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAB+PwAAPz8/Pz8AAAAAPz8AAAAAAAA/Pz8/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAD8/PwAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/Pz8/Pz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAPz8/PwAAAAA/PwAAPz8AAAAAPz8AAAAAAAAAAD8/AAAPAAAAAAAAAD8/AAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAH4/AAA/Pz8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/Pz8AAD8/AAAAAAAAAAAAAAAAAAA/Pz8/Pz8/PwAAAAAAAAAAAAAAAAAADwAKAAAAPz8/AAAAAAAAAAAKAD8/Pz8AAAAAAAA/PwAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAD8/AAA/PwAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAD8/Pz8AAAAAPz8AAAAAAAA/Pz8/Pz8AAAAAAAAAAAAAAAAAAAAAPz8AAD8/PwAAAAAAAAAAPz8AAAAAAAAAAD8/AAA/PwAAAAA/Pz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8/PwAAAAAAAAAAAAAAAD8/AAA/Pz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/PwAAPz8AAAAAPz8AAAAAAAAAAAAAPz8AAD8/AAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAPz8/Pz8/Pz8/AAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAPz8/Pz8/Pz8/Pz8/fj8/P34/Pz8/AAAAAAAAPz8AAD8/Pz8/PwAAPz8/PwAAAAA/P34/Pz8/AAAAAAAAPz8AAD8/AAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8/Pz8AAD8/AAAAAD8/AAAAAAAAPz8AAAAAPz8AAD8/AAA/PwAAPz8AAD8/AAA/PwAAAAAAAD8/Pz8/Pz8AAD8/Pz8AAD8/AAAAAAAAAAAAAAAAAAA/Pz8/Pz8/Pz8/Pz8/Pz8AAAAAAAA/PwAAPz8/Pz8/Pz8/Pz8AAAAAPz8/Pz8/PwAAAAA/Pz8AAD8/AAA/PwAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAA/Pz8/Pz8/Pz8/Pz8/Pz8AAAAAAAA/PwAAAAA/Pz8/AAA/PwAAAAAAAD8/AAA/Pz8/AAAAAAAAAAA/PwAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/Pz8/Pz8/PwAAPz8/PwAAPz8AAAAAAAAAAAAAAAAAAD8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/eT8AAAAAAAA/PwAAPz95Pz8AAAAAAAAAAAAAAAA/Pz8/Pz8/AAAAAD8/Pz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAA/Pz8/PwAAPz8/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8KAAAAAAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/PwAAPz8/AAA/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAACgAAAAoAAAAFAAAADwAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAACgAAAA8AAAA/PwAAPz8AAD8/AAAAAAAAAAAAAAAAPz8/PwAAPz8AAAAAAAAAAAAAAAA/PwAAAAAAAAAAPz8AAAAAAAAAAAAAPz8AAAAAAAAAAAAAAAA/Pz8AAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8/PwAAAAAAAAAAPz8/Pz8/AAA/Pz8/AAA/PwAAAAAAAD8/AAA/Pz8AAAAAPz8AAAAAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAAAAPz8/AAA/PwAAAAA/PwAAAAA/PwAAPz8/PwAAAAB+PwAAPz8/Pz8/AAAAAD8/AAAAAAAAAAA/PwAAPz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/Pz8AAD8/AAAAAD8/AAAAAAAAAAAAAD8/Pz8AAD8/AAA/Pz8/Pz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAD8/AAAAAD8/AAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAAAAAAAoAAAA/Pz8/AAA/PwAAAAAAAAAAAAAAAD8/PwAAPz8AAAAAAAAAAAAAAAA/PwAAFAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8/PwAAPz8AAAAAAAAAAAAAAAA/Pz8/AAAAAAAAAAAAAAAAAAAAAD8/Pz8AAAAAAAA/PwAAPz8/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/AAAAAAAAAAAAAD8/AAAAAAAAAAAAAAAAPz8/AAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAAAAD8/Pz8AAAAAAAAAAD8/Pz8/Pz8AAD8/Pz8/AAA/PwAAAAAAAD8/Pz8/Pz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8AAD8/AAA/PwAAAAA/PwAAAAAAAAAAAAAAAAAAAAA/Pz8/AAAAAAAAAAAAAAAAPz8AAAAAAAAAAD8/AAA/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/PwAAPz8AAAAAPz8AAAAAAAAAAAAAAAAAAD8/AAA/Pz8/PwAAPz8AAAAAAAA/Pz8/Pz8AAD8/AAAAAAAAAAAAAAAAPz8/Pz8AAD8/AAAAAD8/AAAAAD8/AAA/PwAAAAAAAD8/AAA/Pz8/PwAAPz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwA8AD8YPxcAAAQAPxkCAHYAaQBgAF8AWgBXAFUAUAA9ADwAOQA3ADIAMQArACcAIwAaABkAGAAXABYAFQAUABMAEQAQAAsACQAHAAUAHwABABQAEgABAD8/VQA/PzkAPz83AAMA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HmBhYUhNP2o/CD8/Pz8/Pz9wP3c/P3N7fXg/ch9vP3U/Pz8/Pwg/Pz8/fD8VSj8iPwc/fj8/Px8/Pz8/CD8/Pz8/PwU/Pwg/Pz8/Pz8ePz8/Pwd3Pz8/PxUqPwg/P3Q/bD98P30/Pz8/eT9vP28/Pz8/Pz8VFz9iBj8IPz8/Pz8/Pz8/Pz8/Pz8/P3s/Pz8/Pz8/Pz8/Pz8/BT8/Bj8/Pwg/Pz8/Pz8/Pz8/Pz8/Pz9zPz8/Pz8/Pz8/Pz8/Pz8FPz8/PxU/Px56fz97ej9/Pwg/Pz8/Pz91P30/dD8VPz8tPwg/Pz8/Pz8/Pz8/Pz8/P3Q/Pz8FPz8/Pz9yPz8/Pz8/dz8/Pz8/P3o/Pz8/Pz8IPz8/Pz8/Hz8/Pz8/Pz8/FVk/Bz8/eT8IPz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwU/Pz8/FT97Bz9yPz95Pwg/Pz8/Pz8ePz8/Pz8/Pz8/Pz8/Bz8IPz8/Pz8/Bj8/Pz8VPwc/cj8/Pz8ffj8/Pwg/Pz8/Pz8FPz8GPz8/Pz8/cj8/Pz8/FTsrHz8/Pz8/Pz8/Pz8/Pz8/Pz8VPxI/Hz8/P3p5f359CD8/Pz8/PwU/PwY/Pz8Ifz8/Pz8/Hz8/Pz8/Pz8/CD8/Pz8/PwY/CD8/Pz8/PxVRPyY/Bj8/Pz8VQT9VPwoyFT8GP2I/P1g/Pwg/Pz8/Pz8GPz8/CD8/Pz8/PwY/Pz8IPz8/Pz8/Bj8/Pz8/FT85PwoyBD8KMRU/PwoyBD8KMRVBPwoxFT9QCjAVPz8KLxU/Pz8OHz8/Pz8GPwg/Pz8/Pz8FST8LP0k/Cz8IPz8/Pz8/Bj8ePz8/Pwc/Px4/Pz8/Pz8/PwV2Pz8xPwg/Pz8/Pz8/Pz8/Pz8FMT92Pz8ePz8/Pz8/Pz8VPz9iPwY/Hz8/Pz8/Pz8/Bmc/Hz8/Pz8/Pz8/Bz8/Px4/Pz8/Pz8/PxUpPxM/Dgg/Pz8/Pz8/Pz8/Hj8jPy0/PwY/Hz8/P35+Pz9+BkwIeT94P3g/dD91P3U/Bj8fPz8/fn4/P34GQQgjP2ciJT8WPwg/Aj8/Rz9XPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Rj9kPz8/Pwo/PwY/Px9+Pz8/Pz8/PwY/Pwg/Pz8/Pz8/Pz8/Pz8GPz8ffj8/Pz8/Pz8GPz8IEj9sPzY/BT8/OVxSSV4/Pz8/Pz8efj8/PxUcPyY/DgorFWc/Pz8OCioVP3E/Pw4KLhZ2PwouFnY/Ci4VPz8/Dh4/VD9HBz8eR1RQSks/Tz8HPx8/Pz8/FXg/fz8mPw4KLRZIPwokFTE/Yj8OCi0WSD8KLRU/P2I/DgosFkg/CiwVRD8/Yj8OCiQVMT8OCi0VPz8OCiwVRD8/Pw4fP38/fX1/f30GXj8ffT9/Pz8/Pz8GXj8VPz8/Dh8/fz99fX9/fQY/Px99P38/Pz8/PwY/PxU/Mw4KKRUPPz8IPz8/Pz8/BRU/Pwg/Pz8/Pz8/BD8/Pz8HPx8/P0slCD8/aFFTWj8/Pz8/Pz9+Pz8/Pz8/Pz8/Pz8/Px4YPzM/IAc/CBA/P0krfQg/BQM/Pwh/Pz8/Pz8VPz8/PzkOCisWYD8IPz8/Pz8/BUc/HT8IPz8/Pz8/Pz8/Pz8/BUc/HT8IPz8/Pz8/Pz8/P38/Pz8/Pz8/BUE/Ej9DPxI/CD8/Pz8/Px9/Pz9/FWc/Pz8mDh5QW2JRBz8eT1s/Pz8/Bz8fPz9fURUxPxU/Hz8/Pz8/Pz8/Bj8/Hz8/Pz8/Pz8/Bj8/FQo/Ez8eP0g/PQc/HjxHTjc4P08/Bz8fPz8/PxUvP1Y/dj8OCiAVPz8OHlFaYFYHPx5WWj8/Pz8/Bz8fPz9gUQQ/Hj9HPz0HPx49R0M8PD9DPwc/Hz8/Pz8VMD91Pzo/Dh9yfn14dj8/Pwc/FUE/Hz8/Pz8GSx5nP24/CD8/Pz8/PwU/ZQg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8FUD8HPz8ePz8/Pz8/Pz8VP0oeNERINgc/HjZFPz8/Pz8/Bz8fPz9JMwQ/Hj88PywHPx4sOz4qKT8/Pwc/Hz8/Pz8VPz9kP1w/DgoqFmA/CD8/Pz8/PwVHPx0/CD8/Pz8/Pz8/Pz8/PwVHPx0/CD8/Pz8/Pz9/Pz8/Pz8/Pz8/PwVBPxI/Qz8SPwg/Pz8/Pz8/Pz8/Pz8VPz0/Jg4fPz8/Pz8/Pz8GcD8fPz8/Pz8/Pz8GcD8VLj8pHlhsXl0HcAg/Pz8/Pz8ePz8/Pwc/Hz8/amUVPz8eP20/Twc/H1BpWEIIP2c/cz90Bz8fWHE/Pwg/Pz8/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/fWw/cD9nP2U/bT91P3k/Pz8/BzQ/Hj8/Pz8/Pz8/B3AIPz8/Pz8/FS8/Qj92Pw4ePzY/JAc/HyU0OyQIP1A/ZT9rPz8/Pz8/Pz8/Pz8/Pz8/Pz8/dD94Pz8/Hj8/Pz8HPx8/P00+CD9ee21vbD8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/FSo/Px5SPys/Iz9LPwc/Hks/KT8iP1E/Uj8rPyM/Sz8HPx9LPyk/Ij9RPwQ/Hl8/Nz8yP1k/Bz8eWT85PzQ/Xz9fPzc/Mj9ZPwc/H1k/OT80P18/FX8yP2o/DgZWPx9/Pz8/Pz8/PwdWPx4/Pz8/Pz8/fQYjVj8fPz8/f34/P38GVj8pVj8fPz8/f38/P38FP0Q/Pz8/CD8/Pz8/P30/P38/fT8/Pz8/PwU/Pz8/Pz8/Pwg/Pz8/Pz8/fj8/Pz8/Pz8/Pz8FPz8/Pz9FPx9/Pz8/Pz8/PwZWPxU/PwQ/Dgg/Pz8/Pz8FeT0GPz8fPz8/fn4/P34HSQo/CEA/S3RhYWZmdlc/Tj8pP1E/Xwg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9dP2k/Pz8/Pz8/Pz8/Pz8/Bgs/Pz8ffj8/Pz8/Pz8GPz8/Pz8/H34/Pz8/Pz8/BnY/Hj8/Pz8VPz8OCD8/VD89BT8/OT8/Hgg/Pw4/Bz8VPz8NPwhnPyc/Bj8/Bz8fIz8QPwY/Jj8FP3xHfgg/Pz8/P34/ez9/Pz8FPz8IP1Q/Yz9pPz8/Pz8/Pz8/Pz8/Pz8/Pz8/bj9xPz8/BUQ/CD9/P38/fwg/S25XX18/Pz8/Pz8/fz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8/CD8/Pz8/Pz8/fj95PxU/bz9oDgopFQI/Px8/Pz8/Bj8ePz8/fQV3P3sePz8/Pz8/Pz8VPz8hPwA/Dgg/PT9rPz8HPx4/P3Qkez8/Pz8/Pz8HPwg/Pz8/PT8/Pz8/fz8/Pz8/Pz9lJT9leyg/B0AIMj9nYnhMdT9qPzI/B0AIKD9lP2UlPz8/Pz8/P38/Pz8/PxVdPxw/Dh5/Pz9/fz8/PwcOPx4/Pz8/Pz8/fxUCPw0/Pw4IaT0/Sz8kPwc8Hj1aPz8/Pz8/Pz97JFp0PQc8CCQ/S2tpPT8/Pz8/Pz8/Pz8/Pz8/JT8/Pwc/CD8/Pz8/P0g/Zj8/Bz8IPz8/ez8lPz8/Pz8/Pz8/Pz8/PxUfPyo/HD8OHj8/Pz8HPwg/Pz8/Pz8FPD8/Pz8fPz8/f38/P38GEz8efz8/Pwc/CD8/Pz8/PwU8Pz8/H38/Pz8/Pz8/BiE/Fj9NDgg/Pz8/Pz8/Pz8/Pz9+Pz8/P34/Pz8/Pz8/ez95P2w/U2ZpP2oFPz9rP3g/CD8/Pz8/P30/Pz8/fD98Pz8/PwVMP2A/Tj9GPwg/Pz8/P34/fT8/Pz8/Pz8/Pz8FPz9jPwg/Pz8/PxU3Py8/bw4IPz8/Pz8/BXU/ST9qP0A/CD8/Pz8/P34/Pz8/fj8/Pz8/PwVmPzs/ZD86Pwg/Pz8/Pz8/fz8/Pz8/Pz8/Pz8Faj9BP3U/SD8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BXE/Qz9vP0I/CD8/Pz8/Px4/Pz9/FT9dDgg/Pz8/fT8FXz87Pwg/Pz8/Pz9+Pz9/P30/fT8/Pz8FQz8oP0U/KD8IPz8/Pz9+Bj8IP30/Pz8/BUU/KD9FPyk/CD8/Pz8/fT99Pz8/Pz8/Pz8/PwVfPzs/CD8/Pz8/PwY/CD8/Pz98PwU1PyU/NT8mPwg/Pz8/Pz8GPxU/Pz8/Pw4IPz8/Pz8/Bj8IPz8/P34/BWA/YT8IPz8/Pz8/fT8/Pz98P3w/Pz8/BUs/Tj9NP1E/CD8/Pz8/fj99Pz8/Pz8/Pz8/PwViP2I/FT8/aQ4ePz8/Pz8/P3wHQQg/Pz8/HhU/Mz8OPwc/Px58Pz99fT8/Pwc/Px4/P1AkJz8+IQc/Px58Pz99fT8/PxV9Pz8/Pw4eP2A/KgY/Px8/Pz9/fz8/fwdUIj8efT8/fX0/Pz8GIj80Px9/Pz8/Pz8/Pwc0Pz8fPz9gUAg/aD97Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8VPz8/bD8OCD9wP2Q/Pz8/Pz8/fj8/Pz9+Pz8/Pz8/P1Y/Uz9OHkZlVVAHPwhPP3U/dz9zP3I/MD8HPx85UEYoCD9UP04/Wj8/Pz8/Pz8/Pz8/Pz8/Pz8/P3E/ez8/Px4/Pz8/Bz8IPz8/Rj9CPzk/NT8/Bz8fPz8/PxU/Pz8LPw4efT8/fX0/Pz8HED8IKF9VMj9DP3w/Pz8/Pz8/Pz8/PwA/Pzg/PwdQPx4/Pz8/Pz8/fBU/bD8OCicVPz8/Px4/Pz8/Pz8/fAc/Pwg/Pz8/Hg8/KBE/Oj8HPx86PyYRPw8/CD8lP0k/YQcyHn0/P319Pz8/FX0/Pz8OCiYVWj8/Px58Pz99fT8/Pwc/CEhfUEo/Jh4PPxE/Oj8HPx86PxE/Dz8IP1E/Sz8HPz8ePz8/Pz8/P3wVHz8/Dh4NPyg0DD8HPx4PPyk/Cj8NPz8MPwc/Hw8/Lwo/FT8/His/Dj8CPyM/Bz8eIz8QPwM/LD8rPw4/Aj8jPwc/HyM/ED8DPyw/FX8/Pz8OHn0/P319Pz8/Bz8IT2lcUj8uHhU/QA4/Bz8/Hj8/Pz8/Pz98Bz8/HiJGPz8/Pz8/Bz8/Hj8/Pz8/Pz98FT8/Dh59Pz99fT8/Pwc/CFZqWV0/MD8yP1Q/b1JqVlQ/Kx4NP0AUPwc/Px4/Pz8/Pz8/fAc/Px4CP0s/Pz8/PwY/Bz8/Hj8/Pz8/Pz98Bz8/HiFKPz8/Pz8/Bz8/Hj8/Pz8/Pz98FT8/Pw4efT8/fX0/Pz8HRD8ePz8/Pz8/P3wVPwM/Dh59Pz99fT8/PwU/Pz8/Pwg/Pz8/Pz8/fj8/Pz8/Pz8/Pz8FUj9PPz8/XD8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8/WD8RPxA/Px4/Pz8/Pz8/fBU/Uw4IPz8/Pz8/Pz8/P38/fz8/Pz9/Pz8/Pz8/Hmd0clsHPz8efT8/fX0/Pz8HPz8fPz8/FT8/VQooFTA/Az8OHn0/P319Pz8/B2g/Hj8/Pz8/Pz98FSw/PwooFTA/Az8OHn0/P319Pz8/Bz8/CE9pXFI/Lh4VP0AOPwc/Px4/Pz8/Pz8/fAc/Px4iRj8/Pz8/Pwc/Px4/Pz8/Pz8/fBU/Pw4eIT0iCD8HPx4KPz8/Pz8/Cz8HPx8HPy8iFT8/Pwg/cz9dPz8/Pz8/Pz8/f38/fj8/Pz8/Pz9RP0g/RB4JP0g4Fz8HQQg/tz8/Hg8/LQ4/Jj8HPx8nPywOPw8/CD8lP0Y/YQc6Hn0/P319Pz8/By4/CD8/Pz8/Pz8/PxU2Pz8/DgY/Hz8/P35/Pz9/B1RZCFE/XXtubnFxfWc/Xj9yP3g/ej8/Pz8/Pz8/Pz8/Pz8/Pz8/Px4/PwY/Mz8ffj8/Pz8/Pz8HMz9QPx4/Pz8/Pz8/fRU/Dz8/Pw4IPz8/Px4aPyAIPzM/Bz8fKD8KPyMePyM/Cj8wJj8/Pz8/BiQ/CBM/PzA/Jz9CbVhjYj8/Pz8/Pz9+Pz8/Pz8/Pz8/PxVkPz8IJD8sPz8JPz8/BT8/FT8/Aj9rDgonFVo/Pz8ePz8/Pz8/P3wHLgg/Pz8/Hg8/KBE/Oj8HPx86PyYRPw8/CD8lP0k/YQc/Px58Pz99fT8/PxVZPz8/Dh4nPw4/BT8jPwc/HyM/ED8GPyY/CD8zP1E/XT8/Pz8/Pz8/Pz8/Pz8/Pz8/P2Q/aj8/Hgg/Pw4/Bz8fDz8uCT8IP0lrVmJiPz8/Pz8/P38/fz8/Pz8/Pz8/Pz8/PxV/Pz9eDgomFTY/Pz8efD8/fX0/Pz8HPz8ISF9QSj8mHg8/ET86Pwc/Hzo/ET8PPwg/UT9LPwc/Hj8/Pz8/Pz99FT8/Dh4jSzIuB1EIPz9/Pz8eAD8/Pwc/Hz8/RT0VPz8eP1U/IQc/HyFPMBg/CD9EP1o/Wgd1HyRWPz8Iyz8/Pz8IPz8/Pz8/Pz8/P38/fz8/Pz8/dFd8WD9KP0Y/VD9mP2k/eT8/Bz8/Hj8/Pz8/Pz98B0sIPz8/PxV/Pz9hDh8/Pz9/fz8/fwY/Px9/Pz8/Pz8/PwY/PxU0Pz97Dh8/Pz8/Bnw/Hz8/Pz8/Pz8/Bmg/Pz9oPx8/Pz8/Pz8/PwZ8Px59P38/FTY/P04/Dgg/Pz8/Pz8/Pz8/Pz8FCj9YPwg/Pz8/Pz9/Pz8/P38/Pz8/Pz8FCj9YPwg/Pz8/Pz8VAz8/Pwg/Dh99f399Bnw/Hz8/Pz8/Pz8/Bmg/Pz9oPx8/Pz8/Pz8/PwZ8Px4/fz99FSM/Tj8OHj8/Pz8HPwg/Pz8/Pz8FPz9nPz9OPx8/Pz9+fj8/fgZ8Px5+P38/Bz8IPz8/Pz8/BT8/Zz8/Xz8ffj8/Pz8/Pz8GPz8WPz8OBRU/Pz8IPz8/Pz8/fT9/fj99Pz8/Pz8/BQE/Pz8BPz8/CD8/Pz8/Pz9+P34/Pz8/Pz8/PwURPz8/Pz8/Hj8/Pz8/fz99FT8/Dgg/Pz8/Pz8FPz8/Pz8/Pwg/Pz8/Pz9/P39/P34/Pz8/Pz8FPz98Pz8/eT8IPz8/Pz8/P34/Pz8/Pz8/Pz8/BT8/Pz8/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8/Pz8/Pz8IPz8/Pz8/Hj8/P34VPz8OCD8/Pz8/P30/fn4/fT99Pz8/PwU/P2k/P1s/CD8/Pz8/fQY/CD9+Pz8/PwU/P1s/P2o/CH4/Pz8/fz9+P34/Pz8/Pz8/PwUdP34/CD8/Pz8/PwY/CD8/Pz9+PwU/P1o/P1o/CD8/Pz8/PwY/CD8/Pz99PxU/Pz96Pw4IPz8/P30/BSA/Pz8IPz8/Pz8/fz9+Pz98P34/Pz8/BQc/Pz8IPz8/CD8/Pz8/fz99Pz8/Pz8/Pz8/PwUiPz8/CD8/Pz8/PwY/FT8KPxo/Dh48PyELP1g/Bxc/Hn1/f319P38/BxI/Hjk/Mig/Ij81MD0/Bxc/Hn1/f319P38/BxE/H10/Pwk/Pj8VPxA/JD8OBnQ/Hz8/P35+Pz9+Bj8/H34/Pz8/Pz8/B3Q/Cj8ePz8/Pz9/P30VPz8/Pw4IP2o/Sj8/Pz8/Pz99P39/P30/Pz8/Pz9FP0U/Kx4iUEM7Bz8IQT9gP2szP2k8P1I/IT8HPx8jOywWPwg/LT9KP0s/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9cP3g/Px4/Pz8/Bz8IPz8/ZT86Pz82P0c/Pwc/HwU/Pxs/FT8/Pw4eCT9QNCYHPx8tUD8TPwc/Pz8VPz8/H31/f30GPz8IPzU/Rj9hP2o/dz8/Bz8ICT8/Pz8KPwU/P1s/CD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwU/P2s/B3k/Pz8ePz8/Pz9/P30VPz8OCD8/Pz8/P3w/f38/fD8/Pz8/PwU/Bz8IVFtAbzk/Bz8eQT8iPxI/QT9BPyA/ED9BPwc/H0E/Ij8SP0E/CD9Dc0thWQUnCT8VaT8eaD89Px8/Uz8HPx5TPz8/IT9oP2g/PT8fP1M/Bz8IPz8/PwU/Owg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8FQz8IPz8/FX88P34/Dh4WP0czIwc/HwM/UT8SPwdaPz8VAT8/H31/f30GeD8eLj8hGz8HPx8nPxM/Jj8HUT8/Px4/Pz8/P38/fRU/Pw4eQT8gPxA/QT8HPx5BPyI/Ej9BP0E/ID8QP0E/Bz8fQT8iPxI/QT8VPz8eaD89Px8/Uz8HPx5TPz8/IT9oP2g/PT8fP1M/Bz8fUz8/PyE/aD8Vfzw/fj8OH31/f30GPwg/Pz8/Pz8FPz9sPz8/Hn0/P319Pz8/Byg/Hz8/Pz8GPwg/Pz8/Pz8FPz91Pz8/Hj8/Pz8/Pz99FT9CPw4ffX9/fQY/CD8/Pz8/PwUmPz8/Jj8/Pwg/Pz8/Pz8GPx59P38/ByM/Hj8/Pz8/fz99BT8/Pwo/Pz8IPz8/Pz8/Pz8/Pz8/BQo/Pz8/Px4/Pz8/Pz8/fRU/Pz8OHn1/f319P38/Bgo/Gz8ffj8/Pz8/Pz8GNT8eP38/fRU/Pw4efX9/fX0/fz8FSj8/XD9OPwg/Pz8/Pz8/fj9+Pz8/Pz8/Pz8FPz8/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8/Pz9EP0I/MD8/Hj8/Pz8/fz99FT8/Dgg/Wz9IPz8/Pz8/P30/f38/fT8/Pz8/P2I/XT8/HjVKSQ4/B1o/Hn1/f319P38/B1Y/CD8/Pz8/Pz8/P8sVPz8/SA4efX9/fX0/fz8HJD8ePz8/Pz9/P30VPwM/Pw4efX9/fX0/fz8HPz9UPz8efX9/fX0/fz8HJD8ePz8/Pz9/P30HPz9UPz8ePz8/Pz9/P30VPyQ/Dh5xPzc/Fz9ZPwc/H1E/QT8dP2U/CD8iP0Y/Sj8/Pz8/Pz8/Pz8/Pz8/Pz8/P2E/bj8/Hj4/JD8LPz0/Bz8fST8bPwU/Tz8IPzJmOGBYBl0/bj8fPz8/fn4/P34GPz8efT9/Pwd5Pwg/Pz8/Pz8/Pz8Vfz0/PD8OH31/f30GUz8ffj8/Pz8/Pz8GOT8/Pww/H34/Pz8/Pz8/Bww/Pz8ePz8/Pz9/P30VPz8OHj9/P30HHD8ffX9/fQZYPx9+Pz8/Pz8/PwY+Pz8/ET8ffj8/Pz8/Pz8GET8/P0M/H34/Pz8/Pz8/Bl0/FhY/Pw4eVz8ZPw8/Oz8HPx86Pxw/Dz9XPwdJPz8VBj8/H31/f30GYz8ecD8rPyw/WT8HPx9ZPy0/LD9wPwZjPx4/fz99FT86Pw4eXD8zPyg/XT8HPx9aPzg/KD9ePwg/CD8/Qj9HPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Vj9lPz8ePD8dPxM/RD8HPx9FPx4/FT87Pwg/LGlITEk/Pz8/Pz8/fj9/Pz8/Pz8/Pz8/Pz8JPxV/OT8OPw4eDD9UPzMHPx81WT8ePwc/Pz8/FT8/ez8eIlhALgc/Hz5XPwQ/Bz8/Pz8VPz8/H31/f30GPz8IPzw/Sz9kP24/ez8/Bz8IPz8/Pz83P0E/Pwc/Hwk/Pys/Bj8/Hj9/P30VPz8OBSk/TD8pP00/FXU/LT8IPz8/Pz8/BRw/Pz8IfD8/Pz95Bj8IP3k/Pz8/BRo/Pz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BUg/PzE/ST8IPz8/Pz8/Hj8/P38V3UI/Dh8tLDUpPE8/Pz8/PwQ/P1Q9FT8/Vh8/P1k/Uj8/Pz8/Wz9VPz8/Pz9NP1M/Zz8/Pz8/CD9nP1I/Pz8/Pz8fP0M/ISM/IQ0/BD8IPzo/Xj90BVA/CHw/Pz8/fj97Pz8/PwVWPz8IPz8/Pz8/Hz8/alJFTUElP0s/ST9AP3o/ez9LP0E/cz90P0g/Pz8/Pwg/KXVEYUE/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8VNj8/PwA/DgogFQ8/awg/Pz8/fz8FFT8/CH4/Pz8/fD8EP1Q+Kj8HPx85Rj8/CD8/Pz8/Pz8/Pz8/Pz8/fj8/Pz8/Pz9MVl5HPyYeGD82Pwc/CBA/Pz8/CD8FAz8/CD8/Pz8/PxVHPz8/OQ4IPz8/Pz8/BWw/ND8IP34/Pz8/Bz8IPz8/Pz8/BWw/ND8IPz8/Pz8/Pz8/P34/Pz8/Pz8/BVw/Gz9ePxs/CD8/Pz8/Px9+Pz9+FT8/Az8/DgolBHU/CiUVSz8/Dgg/Pz8/Pz8FbD80Pwg/Pz8/Pz8HPwg/Pz8/P34FbD80Pwg/Pz8/Pz8/fj8/Pz8/Pz8/Pz8FXD8bP14/Gz8IPz8/Pz8/Hz8/Pz8VPz8/Pw4KJBU/P28KIBV1Pww/DgogBD0/CiAVdT8MPw4eCz8xPzMHPx4oPD8IPwc/Pz8HPx8/PzwDPxU/Pz8IP2k/YD8IPz8/Pz8/fT9/Pz99Pz8/Pz8/P1U/Vj9PPyE/Kz8oZj8/Pz8/Aj8eIT8tPww/Bz8fFT8hJyY/CD9AP04/YT9VP2kgPz8HPx9wPzI/Dj83PxV/Pz8/Dh4VP0Y+PAc/HjRMPwY/Bj8/Pwc/Hz8/PhU/BD8/HihRODUHPx48Uj8/Pz8/Pwc/Hz8/OCgEGz8eJz86BT8IPwc/CDk/TUhuM28/Vz84Pwc/HgE/QQc/DT8NPwc/AT8HPwg/Pz8/PzM/SD8/Bz8fCD8FPyc/FT8/Pw4IPz8/Pz8/BT8/Pz8/FT8fPz8/fX0/P30GOj8efT8/Pwg/Pz8/Pz8FFz8/CD8/Pz8/Px4/Pz99FT89P24OHgU/OUEoBz8eK0M/Az8HPz8/Bz8fPz82BT8VPz8IP28/YT9RP0U/JT8/Bz8fZz88PwM/Qj8IP0E/Uj9TCD8/Pz8/Pz8/Pz8/Pz8/Pz8/P2I/dT8/PyI/KT9qPz9HY01KPwY/HhM/Bj8RPwc/Hxg/Px4/FX8/Pz8OCD9eP1Q/Pz8/Pz8/fz9/Pz99Pz8/Pz/GUD9HP0UeAz9APiYHPx8oSD8FPwg/Pz8/Pz8/Pz8/Pz8/fj98PwU/P3oIeD8/fz99Bj8/H30/Pz8/Pz8/BT8/Pz8/CHVee14/Sh4bPyIRPwc/HxU/PyE/FX8/Pz8OBTI/PzI/PxU/PwYHPx4/Pz97CD8/Pz8/PwVxPxY/CD8/Pz8/fx56P38/BmQ/LB9/Pz8/Pz8/Pwc/Kj8ePz8/Pz8/P30VP1E/Pw4IPwE/Wz9HPz8/Pz8/P30/f38/fT8/Pz8/P1Q/SD8zHi1MPC8HPx8pVT8SPwY/Hj8/P34IPz8/Pz8/BT8/ej8/Hz8/P319Pz99BiI/Hn4/Pz8IPz8/Pz8/BT8/fD8IPxk/Bz8UPz8HPx8OPz8NPxV/Pz8/Dgg/Pz8/Pz8FeT8/PwgiCD9PZEE/CDA/UD8/Pz8/Pz8/Pz8/Pz8/Pz9+Pz8/Pz8/PzVQV0s/Cj8eCz8yAT8HPwg/Pz8EPw8/BVY/aj8/Cz8ffT8/Pz8/Pz8GSD8ePz8/fRU/P3EOBT8GPwg/Pz8/Pz8/Pz8/fz9/Pz8/Pz8FXg4/CD8/Pz8/PwY/Hns/Pz8HKD8ePz8/Pz9/P30VP0c/Pz8OHiU/Kz8xNj8HPx43Pyw/JT8lPyo/Nz8HPx82Py0/LyU/FT8/HkY/Oz8DP1U/Bz8eVT89PwU/Rj9GPzs/Az9VPwc/H1U/PT8FP0Y/FX8/Dgg/Pz8/Pz8FCj9YPwg/Pz8/Pz8/fz8/Pz8/Pz8/Pz8FCj9YPwg/Pz8/Pz8ePz8/fxUDPz8IPw4KIBU/Pw4fP34/fHx+fnwGcD8ffD9+Pz8/Pz8GcD8VP2Q/DgokFTE/DgZZPx8/Pz9+fj8/fgdZP1Y/Hn0/P319Pz8/BlY/WT8ffj8/Pz8/Pz8HWT9WPx4/Pz8/Pz8/fRUaPz8/Pw4FPz8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BVokWj8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8/BT8wAT8/CH8/Pz8/fz9/Pz8/PwUBPz9NMAg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8FPz8kCD8/Pz8/Pz8/Pz8/Pz8/Pz8/PwVNPwE/Pwg/Pz8/Pz8/Pz8/fz8VPD9XP04/Dgg/Pz8/Pz8/Pz8/Pz8rKz8VPzY4Pz84Pz8VPysrPwg/Pz8/Pz8/Pz8/Pz8/Pz8/Pz0/JT8oRz8/Rz8/JT8/PT8/Pz8/Pz8VHz9OPw4IPz8/Pz8/KD0/JT9HPz9HPz8lPygoPT8IPz8/Pz8/Pz8/Pz8/Pz8/Pz8rPxU/OD8/OD8/FT82Pys/Pz8/Pz8/Hz8/Pz8VHz8/Tj8OCiEVYT8OCD89YUhHUQVqP2M/CD8DPz8/Bz8fPz9HKxUKP3cIaydaWEk/Bz8eTVs/Pz8/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AG4AIAB5AGEAbQAgAHUAbwB5ACAALABzAHQAcwBpAHgAZQAgAHQAbgBlAG0AZQBlAHIAZwBhACAAaABjAHUAcwAgAG8AbgAgAGYASQAgAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIABkAG4AYQAgAHUAbwB5ACAAbgBlAGUAdwB0AGUAYgAgAHMAdABzAGkAeABlACAAdABhAGgAdAAgAHQAbgBlAG0AZQBlAHIAZwBhACAAZQBjAGkAdgByAGUAUwAgAGYAbwAgAHMAbQByAGUAVAAgAGUAaAB0ACAAbwB0ACAAdABjAGUAagBiAHUAcwAgAHMAaQAgAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAHQAIABlAHMAdQAgAG8AdAAgAHQAaABnAGkAcgAgAHIAdQBvAFkAIAAuAG4AbwBpAHQAYQBjAG8AbAAgAHkAbgBhACAAbQBvAHIAZgAgAHQAaQAgAHQAcwBvAGgAIAByAG8AIAAsAHIAZQB0AHUAcABtAG8AYwAgAHkAbgBhACAAbgBvAHAAdQAgAHQAaQAgAGwAbABhAHQAcwBuAGkAIAByAG8AIAAsAGUAcgBhAHcAdABmAG8AcwAgAHMAaQBoAHQAIABkAGEAbwBsAG4AdwBvAGQAIAByAG8AIAAsAGUAdAB1AGIAaQByAHQAcwBpAGQAIAAsAHkAZgBpAGQAbwBtACAALAB5AHAAbwBjACAAdABvAG4AIAB5AGEAbQAgAHUAbwBZACAALgBvAEMAIAAmACAAcgBlAGwAZgBlAG8ASAAgAGYAbwAgAHkAdAByAGUAcABvAHIAcAAgAGUAaAB0ACAAcwBpACAAZQByAGEAdwB0AGYAbwBzACAAcwBpAGgAVAAuAG8AQwAgACYAIAByAGUAbABmAGUAbwBIAC4AcwBuAG8AaQB0AGMAaQBkAHMAaQByAHUAagAgAG4AaQBhAHQAcgBlAGMAIABuAGkAIABkAGUAcgBlAHQAcwBpAGcAZQByACAAZQBiACAAeQBhAG0AIABoAGMAaQBoAHcAIAAsAC4AbwBDACAAJgAgAHIAZQBsAGYAZQBvAEgAIABmAG8AIABrAHIAYQBtAGUAZABhAHIAdAAgAGEAIABzAGkAIABkAGUAZABuAHUAbwBSACAAbQBhAGgAdABvAEcAdABuAG8ARgAxADAAMgAu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)); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/E83A474C5EE950C81.css b/docs/static/fonts/332720/E83A474C5EE950C81.css deleted file mode 100644 index 1eb5423b53..0000000000 --- a/docs/static/fonts/332720/E83A474C5EE950C81.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,S0EpP18/Wj89PDM/GT8/PzA/H3p5Jz8/VD8/Wm8/Cx1kP2w/Pz8PP3cOCD9DIz8/XQJyCj9ZPwUzQz9IPz98NEtxIz8/LUQ/Pz8/TyE/Pz8zPz8yYj8/Pxo/aj9OH1g/PT8fJUscPyE/azw/Zz8hP04/LkV+Rz95T1R4EFM/M3k/YD9Waxw/P0w/P2A/ATckem0/P0NNCz8/Ex5LOj8PA1JiPzl1Dj8ZPT8/Pz4/Zj8VPz8MPzA/GiE/Pz8/Ez8BFj8/NGohPz8UFz0/Kz9APz9BP30/Pw0/Pz8lPxM/Pz8EAz8/OB0/P0UqG1o9Iz8/GHw/dXZbSxk/PwZLWgFQGmg/KTRkFHk/Pz86Pz9gEz9tTg8/Lj9ZPz8Cfj8lAD8/aC1OPxI/Pz9zVT9wFUA/Lj8jPxE/cz9PPw8rU2I/DhM/VT0/TD8/acg/NT48aD9GP0c/Pz91Py0/SXU/aT9gP1RVP0EfQT9fGHQ5XAM/Pz9UP0Q/Kj9CMDkkaD8/Py4/bD8/Pz8/Jj9FPz8/P2ceYj8/Pz9sPxY/P1BJUWw/Rj8/aT8/PykIMT9FPz8/LxVzbT9VPzI/Pz8BGmQ/RVk/XnR7A3VvLz8/fT8/P2o/SRc/P20JA2kNPz8/cT8hWlg/HWsVHA4QP0A/ZD0/AE0JPxMwMD47FT8/EDA/cj9VPz94MgA/Al0APwA9ACoCOgBdA1MAZQIzAD8BXQA/AToAPwI8AD8CSQA/AmgAFgNvABIBaAA/AmgAPwI1AD8DQgA/AjcAdgJAAD8CPABdAjcAYgIsAE4CHgBPAUEAPwI9AHgCXQA/AAAALAEAAD8BCgA/PwEAAQAAAABNAGgFABg/AWYgKUIEYGJgEAYJYgM/YGBkYGM/eAAAADk/Hj8PPz8/OSUzP1IjBg4/TjlKPz9/PwUgP2hhIj8/Tj8/UDg/VFI/Hz81Pz8fPyNRPz9RP1A/Pz8lChk/ZS0/PyJFCg5rQj8/T3UYKC4pPz8/Cz9GPzc/Pz8mPw9NRGY/Bz8/XT8kPz8/D3N7dj8/Wj8+Pz8qPz9tJT9hSj9kfT8/Pz9vRD8/CBwkW2k/PyF6bHY/Pz8/PyE/YRAwDD8/PxYtBFRoPwphUCk/fHgGPwE/PQIgPz8/bSFLPz8/PxY0SgNSPz10N1MHPzM0UFY/Wz8JRD9wUT9DPzE/Pz82Lj8/PxI1cT8/LCI/Pz8/P0M/Pz9FMT8/Pz9FP1phPx9JKD8XJj8JP2ozND8/PxJzQD8/MD8/KD8/TQZRET9HbxNlLVs/Pz8/MD9cP2lqP0M/Pwp3bD8/V3E/Nj9oCz8wW3A/P0g/Py8/Ye92Pz9nPz8/Pz9hbz8/OiwZYT81Pz9LdT9NYRQ/ZT8/P10/Gj8/aT8/ZD92Pz8/Bz8RPz9LeT8/bj87QEY/Pz8/C2c/HjwzOj8/Pz9FAEo/XGw/Pyk/aT9oPz9kPy1ENCIQP2UBP00/P3QAPz8Ibj92G3sNUmRjPz8TfCk/ZD8oVANOPz8WIT8/bz8NP0o/P1U/QzE/Py4VZWQ0NRE/Fz9uPzYCP2c/Pz8vSD9LJl0FPys/bz8/Ch4/Pz8tPwY/P2A/Pz8dPz8IPz8/PwRtOD8wCT9XHDMmPwFiPz90Pz8iWj8JPwE/YiNDPz9pDz9AUz9mPz8/PQIlPz8pUHY/Pz8KP0diP1J0PyAWPzVDWT8/JC9/P2VJOVY/QlRoPz8/VQ1ETD8NMD9GaWA/Oj9hPTh6P3hZRT8qNWw/P3Q/NT9RXWl1Pz9wPz8pZj9VRj9zP1k/Fz87Pz8/KSVXQmQ/P20/Pygkfz8nPz8TLT8/Z0A/Mho/Pz8/P1Y/RBk/GDY/Pz8nPz8VPwA/VRE/Lyg/dU4/PxM/Pz8/Pz8/Pz8/ST9wDEYST3s/KT9lPz8/PTE/FnA/P0g/PwMuLmQ/WRkuPwASPz8/Vj8/Dz8/Pz8+fAA/eD8nRV0/Hwwtfj8DPwg2Pww/KD8/P2E/P1woVz8/WHc/Pz8/Fj8/LD9JJT8uPz8zXj9HYTM/KEk5P3lfNxA8Pz9HPz8/BT8/UHQ/Pz82fRRaTT8/XT8/PwdOEz8/KW5hPz96PyU/CD8EPyw/VT9dVT8/Pz8/aj9RP1IhC0lkEz8xQAE/Iy1ZMz8/Pz8iP0YaJH0/P3ChIT8/P2A/dz8/ORM/Pzk/PxZSUjomPz8/XEQ/Pxs/dihtHD8sPz8fTz8/P3teRwI/EFgJPz9tPx8/P14/ED8TPz4/Tj8/ATU/Gz9LP2gnPz0PRmQ/Pz8QPz9GPxQzSXovNgsMPiNeXz8/GWlzDD8/Pzs/Pz8/JXsmP2s/Pz8/Px8xS2Q/TD8/Oj9ufgc/Pz8eJz8vPz9COBY/S2g/Pz8/Pz8/Xj8/YTM/Vz8/P3VfP18IPxM/fGE/Az8hPw0/V090Pz99Lj8/Oj9QPz9XCD9fPz8/TBk5T3QZPzIKPz94Pz8/bk8QPz9xPxVfP1M/HxIXAj1SPyMjP28pPxR9P1IIPz88Oj8tPz8/UU8/fj8kXCM/dj8GUiI/FD8/Pz8/P2J5NyBNXzc/P1g/bj8/Pz8/HT8/Pz8OPz8/IT8/Pz8/MHg/SR0MPzdzRlo4H3o/Pz9IP3A/AgdKHT8/bz8/ET8NFz8/Pw8/GD9yET8MRT0/ID8/P0lbFWIfAz8/Pz8/Iz9ZAhA/Mz9JCSMJPz8/JD8CIWI/WA4/D1kNNUlKTT95Kj8/Ej8UPz8/ZisodD8/Pw8/PD4/P3Q/CGQ/Pys5Pz9+XD9CKz8ceD8/P3Y/JzkOKT8tP2FfP20/Pz8RTHk/ETo/Pz8/Pz8/Pz8/Xj8/Cz8/PyI7P04/Pz8/Xz8cPz8/PwUtDgUsPz9+P08/Pz8/PwYMEC5iPzs/eD81P3dFPz8/Pz8lPyc/Gw8Hez8/PRxMVlY/P3s7Pz8/OD8LPz97Py8/PxI/Pz9ESD95PUdGJDk/FkFeOnhTPz8HP1cHPz8/bw0/Pz8/P0ojJS4MPz8/FD8/PwdNPwoHaD8iKz8/P09GDD8/ez8/cH4jP385P1U/P3kAPww/Pz9BP1U/Pwk/P0w/C3oKPz8/Wj8WPGoKIT8sCwQ/dDAfPx2ZXwkmRj8/Pz9Tdz8/Pz8/Jz8/Uz8nSz8/P1M/Pz8lO3k/Yz99Pz9vP3kqP2wNXD8/ElVfPz9FPyl0PzlJPzZTPz8IXEVLPxw/PyI9QD9KPz8/GT8/LW8/Pz8/Jz8/Hh9iPz9XPz9BED8/KzdDPw8/Pz8wPz8/dT9pPz8wPz8/JFw/Nz8nZUlfPz4/eH9OCj8/R30/cWt7P1E/P1dRdFEZMDk/mmE/cj8/Pz8/Pz9VP3Q/Pz8nPz8EPx52J10/Pz8/PxF5GEc/Pz8BYT87fRU/Pz8KTj8/dFx5Pzw/Tz8/Lz8/P4M/IBQ/Pz8/Pz8zPT8/Kj8VP1Q/P0c/QCo/PzA4LRJyPz9zUD9iJT8qeD8/BwM/Dh4FcRdVPz8/P3M/Pz8/NyOdZT9HPxlyP1lqGT8/Pz8/Zz8/Pz8/GzUSPz8/Pz8/TD9FID8/Iz9TP09mEAF8Pz8APxw/Pz9MPz8/bH0/Px4/JEdUcF8nPT8/GnxuPzY/X20sNnFWPz8/dDg/P1g/Pz8uGj9+Onw/BT8eZ1k/PxspPwA5Pz8gREpCWj8/f2oBOD9ofD8/Pz99Yj8/HHM/Pzw/Pz85FWRsPz8GPz8/Pz8/PxQ/PzZQP200PzZGPzs/bT8/I3wBP0c/Pz8/Pjo/P1k/CD9NZD8/Pz9EcD9LPz8/CF0/PwM4WT9kcH1vWEw/QUhZP2Z0Ggo/P0YmP0c/AyRQMhM/MF4/ET8/HxcEPFiLPwEDPz8/Pz8uWj8TPyZAPwM/Pz8vcwg/Sj8/MB0/TBA/BSQ/GylvPz8/PwhcYxdpP2w/PxM/Pz9zBD8hVj94LT9MPz8/Pz8/PyRdPww/HT8/Pz9PJD9jPz8/PzU/RGs/Pz8/Jz9iPyVMPw4/P09ceT8/XFQ/Zg1wFBI/Cj8/dz8/nic/eRE/Xj96PwA/Pxw/P1BlPz9sPHi7GD97Pj8EPz8VPyk/KGdnTD9ePzo/Pzw/P1g/Pz8/QycDPz9JSxk/cj8/P38/Xz8vPz8/eD8uBj8DP3k/eD8/P2Q/PzZQP1UZOT8/dz8/UxFOP2A/ET8/Pz8/Zz8/aj8/eRA/HT8LP6hGDTA/Fz8/PxA/fRs/P30XPwgfXz8UPz8/P25cP2BcPz8/Pwo/Pz8FChAuQT8JPy5sLT8/LT9bbT9ZID8/Ij9fIz85H1gWPwQ/Pz9hPyA/GT8nfAJBPz8/Pz8jPGQ/AVo/P2FvP2ZAPxEuTj8fIz8/Gz94P3Y/PBgeDz8DPzoxPwxFXhw/fz8zbgo/Pz9gWT8/bFA/TD8/Pz9WWF4/FgguPxc/Pz8/Nj0ha3MaBT9jPz8/PzIWYCw/UyZmZD9xPzs/KmQ/UwtzM3MTcxhmRj8GP3o/UD8/Ux8/Pz9bPz8/Oj9dPz8aKw0/Pz9LS1xuMj8/NTZWS2MNPyU/Pz8/ZD8/G2pLez8/PyY/Pz8yUV1eUlQ/WD8/Pz8/dW4/PlY/PxQVFD8eLx4/Hxhjbz8MRz8fbz87fz8gIj94Pzs/W3s/W3s/YT86P3I/Pz9rDTU/FBQUP1xTAW5zPz9zPz0/ez8/Pz9+Wj8/fj93Pz9qP1c/IT8APz8IP3lUPz8VWlM/Pzc/Pz8/Pz0/PzE/bHkNJDQlKQUqKH4/PzwkURA/PDBQQUM/JAwEPz8/PyI/P2Y8Pz8UfAtWTT94AD8BPywAAD8YPxlbPz8AZmBjP3gAAD8/RT9LPz8ueSU/FF57ClE/Ljc/bT9vP0A/Cz8/Pz8/bz94Pzc/Pz9vP3g/PzscPz8/PzM7Pz9rP39hP20pEz9jPyc/PwiVJT8/Pz8/P3RmP0I/P2Y/Pj99ZjU/PxF8Pz9KZT9WZD9eZBZJZT9VZD9dZDZUST9MSz9LZHZfZD9vPz9QPz9EPz9PP38/P3s/Pz8jXHQnUnQ/RnUXRXVGPz9tPz9/X3Q/ZH99Pw1/CD8NNz9LPyQ/P0M/Pz9cPz8HGj88fgh+DRwUUT89Pz9hPzIOAT8xP1s/Pz8/Pz8/Pz9WP3wtPz82ej9ZKwVnLGU/Pww/H0M/dD8UP34uP9gIYwg/CEE/Vz94PwE/Pz8NQTxjPzwzP0h1BGswET88P00/OGZoCUc/Bz8vcz8/L3M/Hz9zP3E/P047Pz9zPy1Faz8SPz9FQwYhP0VBEj8iIn4hEXA/Hz8/JEE/P0ZDKz8haD8LPz9EFD9JPz8/XCA/P0ccPnE/P2c/FFE/Sz8/P3gAJmo/P28/Pz8/P28fPw8/P0Q/Pz8/P3c/P30NCT8/Pz8/PT8/Pz8/P3s/ST9cPz8/aXVUPD8/P2M/P0s/Pz8/PT8/Pz8/bk5/eWNdPz97ED8/Pz9zPxk/P34/Pz9PJQY/Pz8/cUA/Oz8/Nz8/Pz9PFS5ueT8cKxQKeS5HJT9uP1NKP3I/Pz8SIz9OP3g/Pz8SPz9bPz8/Pw0/Vz8/Pyg/Wj8/bj87VVVwWj8hO1NWez8TVT8/Pz8yP3koPz88E1c/Dz9KPz87Dz8/Pz8/KGo/DD8/eT8/ED8/P3kePyM/Zj9oST9NP1J3GVcrPz8/Pz8/Yj8/Iz8/cz8/Pz81C1Y/UHM/MT8/PwFRPz9PPz8/Qz8/Xz9iOQw/Pz9yPz8/Oj8KZEM/Mz92Bi4/Tj8pPz9HP1s/GmIFP1lPF1o/P3M/FT8nPyI/EUZ7Bj8APwQ/Qj8/elg/Yz8/PwE/DD8/QFY/Kz8/PUAFHgZHMT8/XT8EXD8AaHE/HQ4/AT8/Mz8NPz9oSj9CPz9lPxY/Fz8/cE8/Sz8/Pz9mPzk/fwY/Pz9kRT8/Pz8ZPzg/Pz8XSndfF30/Pz8/I0UKP3QAfDs/Pz8/fT8jPz96CSw/PzQlDD8/Iz8/Pz8/Pz8DPz81Fz8SIiE/P2dIPyM/P29uP0c/P1JlP0Q/Tz9tY2UvYT8/SBE/Kz8XXD9eQz9DBGg/Pz0/Sz9lVT9XPz8nGD8/Xz97P2ZQYD9MP1Q/P0A/IG9QPyxGQyo/SjY5CVA/LmVLPz8WPyk/Pz9cPz8UDD8/LUI/LVs/PyN+Z2k/P0Q/Pz8ZHT8/Lj8JP1I/aVk/NmU/HD8rEiJkP2FZJW8BGj8ZaD80Pz8/P21VPz9JPwI1P2Q/P0U/Jj9FbTI/XiY/PzpRPz8/Pz8cP0o/UEE/Pz9dP1EFPyURSTQ/Pz9YPz9MPz8/UT8/YmcqRT8kP0xbY1FoPyFzSj8jI1hSED8/FSI/Pz8VMj8/Pz8/Yz8/Pz8/Eik/Pz8/ME8/Pz9xP34/Pz97Pz8wcHA/P0E/PwQcE0g/P05TFit4Pz92Tz8XTj8/HmRsej8/Pz9NPz8/Pz8cV2IyPz9WPw9+Pz9vXj8SPR4eK2M/PzM/SD9xPxo/Pz8/bT8uPy1WPz8/Pyc/YD8/Pz8/fD8/NRs/Pz8/P3U/Pz8/Gj8/P29aLT8/Vj8/P3lfWm8/ej9bd0I/en8/Pz9xP35vPwY/P0n4PzU/DTV7Pz9mPz93OWo/Pz98eD8/dj98emxuP1w/Gj8/Pz8/Pz81Pz8/Wz8/Py0/WT9VPz86Mz83Hj8aPz8KPz99Bj9bP18+Pw1OP2g9ERA7Nz8/Z2cfaQg/Aj8/TFU/Pyk/Pw8/eic/Hj8/Px4/Pwg/Llg/Ij9EP0VxPz9jP3M/A1FTPz8oPz9KP0YGP2BRTH0/OD8/clkdEEY/b01UP3gAfw8/PwAIP0AKDD0/Pz8cP258Px8MAz8JPwU/WT9APz8gfD81D3xgPxgYAz8YGAsCQGI/MRgyPxk/Az8/Pz8/P2FgZWBhP2U/YmBjP3gAABsAAFAAAAAAAGkDP1gAGkA/DD8MPwIAYV5IAF8/PmBgZGBjP3gAAD8JPzMACiQJPz8/IAVmfD8FPz8IP0w6Cz8RQBc/bgZXPz88aD8/Wz9wZGBgYGRgYz94MgA/PyAAAAATAAAAPwcAAHRzb3AEMzUoPwsAAD8EAAA/AQAAZW1hbgBQGwAGAAAABgAAAFwBAABweGFtPwY/PWwAAABsAAAASBQAAHh0bWgAA2EHJAAAAB0AAAA8AQAAYWVoaD9HFgM2AAAAMgAAAAgBAABkYWVoCwAAAAgAAAAIAAAAQBQAAHBzYWcCPz86AwAAPwEAADwGAABwYW1jSyU/VWAAAABPAAAAZAEAADIvU08EAEgAIAAAAB0AAAAgFAAARkVER2M/P09vDgAANQwAAD8HAAAgRkZDAAAAAAAAAAA/BgAAJgIAAD8UAAAAAAEAPx8AAAAACwA/FgAAT1RUT0ZGT3c=))); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/EA2EC948C7D7C063B.css b/docs/static/fonts/332720/EA2EC948C7D7C063B.css deleted file mode 100644 index 85e2bd607b..0000000000 --- a/docs/static/fonts/332720/EA2EC948C7D7C063B.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:font/truetype;base64,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FA4RJhkLF/7IFgwJFA4HDBEMDCMHEhIHBykHBxAQBwcpBgcHBwcAAAAAACQBtgABAAAAAAAAAEAAAAABAAAAAAABACMAQAABAAAAAAACAAcAYwABAAAAAAADACEAagABAAAAAAAEACMAQAABAAAAAAAFAA0AiwABAAAAAAAGAAQAmAABAAAAAAAHAFkAnAABAAAAAAAIAA0A9QABAAAAAAAJAA0A9QABAAAAAAAKAhEBAgABAAAAAAALABIDEwABAAAAAAAMABIDEwABAAAAAAANAhEBAgABAAAAAAAOACoDJQABAAAAAAAQACMAQAABAAAAAAARACMAQAABAAAAAAASACMAQAADAAEECQAAAIADTwADAAEECQABAEYDzwADAAEECQACAA4EFQADAAEECQADAEIEIwADAAEECQAEAEYDzwADAAEECQAFABoEZQADAAEECQAGAAgEfwADAAEECQAHALIEhwADAAEECQAIABoFOQADAAEECQAJABoFOQADAAEECQAKBCIFUwADAAEECQALACQJdQADAAEECQAMACQJdQADAAEECQANBCIFUwADAAEECQAOAFQJmQADAAEECQAQAEYDzwADAAEECQARAEYDzwADAAEECQASAEYDz0NvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBIb2VmbGVyICYgQ28uIGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb21Db3B5cmlnaHQgKEMpIEgmQ28gfCB0eXBvZ3JhcGh5LmNvbVJlZ3VsYXIxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTlWZXJzaW9uIDEuMzAxRm9udEdvdGhhbSBpcyBhIHRyYWRlbWFyayBvZiBIb2VmbGVyICYgQ28uLCB3aGljaCBtYXkgYmUgcmVnaXN0ZXJlZCBpbiBjZXJ0YWluIGp1cmlzZGljdGlvbnMuSG9lZmxlciAmIENvLlRoaXMgc29mdHdhcmUgaXMgdGhlIHByb3BlcnR5IG9mIEhvZWZsZXIgJiBDby4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBvciBkb3dubG9hZCB0aGlzIHNvZnR3YXJlLCBvciBpbnN0YWxsIGl0IHVwb24gYW55IGNvbXB1dGVyLCBvciBob3N0IGl0IGZyb20gYW55IGxvY2F0aW9uLiBZb3VyIHJpZ2h0IHRvIHVzZSB0aGlzIHNvZnR3YXJlIGlzIHN1YmplY3QgdG8gdGhlIFRlcm1zIG9mIFNlcnZpY2UgYWdyZWVtZW50IHRoYXQgZXhpc3RzIGJldHdlZW4geW91IGFuZCBIb2VmbGVyICYgQ28uIElmIG5vIHN1Y2ggYWdyZWVtZW50IGV4aXN0cywgeW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpc2l0IGh0dHA6Ly93d3cudHlwb2dyYXBoeS5jb20vd2ViZm9udC1zb2Z0d2FyZSwgb3IgY29udGFjdCBIb2VmbGVyICYgQ28uIGF0IHd3dy50eXBvZ3JhcGh5LmNvbSAxNzEyNDctODg0NzQtMjAxNTA2MjMtMjQyMy0xNDAyMTl3d3cudHlwb2dyYXBoeS5jb21odHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUAQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAwADYALAAgADIAMAAwADcAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAASAAmAEMAbwAgAHwAIAB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AUgBlAGcAdQBsAGEAcgAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQBWAGUAcgBzAGkAbwBuACAAMQAuADMAMAAxAEYAbwBuAHQARwBvAHQAaABhAG0AIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACwAIAB3AGgAaQBjAGgAIABtAGEAeQAgAGIAZQAgAHIAZQBnAGkAcwB0AGUAcgBlAGQAIABpAG4AIABjAGUAcgB0AGEAaQBuACAAagB1AHIAaQBzAGQAaQBjAHQAaQBvAG4AcwAuAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AVABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHQAaABlACAAcAByAG8AcABlAHIAdAB5ACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAFkAbwB1ACAAbQBhAHkAIABuAG8AdAAgAGMAbwBwAHkALAAgAG0AbwBkAGkAZgB5ACwAIABkAGkAcwB0AHIAaQBiAHUAdABlACwAIABvAHIAIABkAG8AdwBuAGwAbwBhAGQAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABpAG4AcwB0AGEAbABsACAAaQB0ACAAdQBwAG8AbgAgAGEAbgB5ACAAYwBvAG0AcAB1AHQAZQByACwAIABvAHIAIABoAG8AcwB0ACAAaQB0ACAAZgByAG8AbQAgAGEAbgB5ACAAbABvAGMAYQB0AGkAbwBuAC4AIABZAG8AdQByACAAcgBpAGcAaAB0ACAAdABvACAAdQBzAGUAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAVABlAHIAbQBzACAAbwBmACAAUwBlAHIAdgBpAGMAZQAgAGEAZwByAGUAZQBtAGUAbgB0ACAAdABoAGEAdAAgAGUAeABpAHMAdABzACAAYgBlAHQAdwBlAGUAbgAgAHkAbwB1ACAAYQBuAGQAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAASQBmACAAbgBvACAAcwB1AGMAaAAgAGEAZwByAGUAZQBtAGUAbgB0ACAAZQB4AGkAcwB0AHMALAAgAHkAbwB1ACAAbQBhAHkAIABuAG8AdAAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGYAbwByACAAYQBuAHkAIABwAHUAcgBwAG8AcwBlAC4AIABGAG8AcgAgAG0AbwByAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ALAAgAHAAbABlAGEAcwBlACAAdgBpAHMAaQB0ACAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUALAAgAG8AcgAgAGMAbwBuAHQAYQBjAHQAIABIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuACAAYQB0ACAAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AIAAxADcAMQAyADQANwAtADgAOAA0ADcANAAtADIAMAAxADUAMAA2ADIAMwAtADIANAAyADMALQAxADQAMAAyADEAOQB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQBoAHQAdABwADoALwAvAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAC8AdwBlAGIAZgBvAG4AdAAtAHMAbwBmAHQAdwBhAHIAZQAAAgAAAAAAAP+1ADIAAAAAAAAAAAAAAAAAAAAAAAAAAABlAAAAAQACAAMABQAGAAgACQAKAAsADAANAA4ADwAQABEAEgAXABoAHQAeAB8AIAAhACIAJAAlACYAJwApACoALQAuAC8AMAAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABCAEQARQBGAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVwBZAFsAXABeAF8AYACEAIUAlgCLAJ0AqQCKAIMAwwCeAKoAogCyALMAtgC3AMQAtAC1AMUAhwCrAL4AvwECAIwBAwRFdXJvB2hjb3NsdWcAAAAAAQAB//8ACgABAAAADgAAABgAAAAAAAIAAQABAGQAAQAEAAAAAgAAAAEAAAAKADQATgACREZMVAAObGF0bgAcAAQAAAAA//8AAgAAAAEABAAAAAD//wACAAAAAQACY3BzcAAOa2VybgAUAAAAAQABAAAAAQAAAAIABgAQAAIAAAACABIB1AABAAAAARuWAAEBkgAEAAAAFgA2ADwARgBMAGYAcAB6AIwAogCoAMIA0ADyAQwBHgEsATIBUAFmAXgBfgGEAAEAKv/EAAIAH//xADsAHgABAB//sAAGABD/VgAR/6EAEv/2AB//fgBE/84ARf/OAAIAEP/sABL/2AACABD/dAAR/6sABAAY//sAKv/sACz/7ABE//YABQAH/+IAEP+6ABgACgAf/5IARP/xAAEAH//sAAYAB//sABD/xAAf/5wAKv/2ACz/4gBEAAoAAwAK//YAGP/sACr/2AAIAAf/yQAQ/4gAH/+IACr/9gAs/+wAO//sAET/2ABF/84ABgAH//YAGP/xAB//9gAq/+wAO//2AET/zgAEAB//9gA7AB4ARP/sAEX/9gADACr/iAA7AB4ARP+6AAEAMP/OAAcAEP+6ABj/9gAw/84AMf/sAET/8QBF//YASf/2AAUAGP/xADD/zgAx//YARP/2AEn/9gAEAB//9gA7ACMARP/2AEX/9gABABH/8QABABH/7AADACr/xAAs//YARP/TAAEAFgAHAAkACwAQABEAEgAaAB0AHwAkACUAKgAsAC8AMABCAEQARQBHAEsATABVAAIZdAAEAAAX+Bi0ADwAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAA//H/pv/n/5z/pgAA/5IAAAAAAAD/nAAA/4gAAAAA/+cAAAAA/+cAAP/Y/+z/5//sAAAAAAAAAAAAAAAA/8QAAP+w/7D/nAAAAAAAAP/iAAD/9v/E/9MAAP/YAAAAAAAAAAAAAAAAAAD/7AAAAAD/8QAA/+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAP/2AAAAAAAAAAD/7AAAAAAAAAAAAAAAAP/2//YAAAAAAAAAAAAAAAAAAAAA//YAAAAA//YAAP/2AAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2//b/9v/2AAAAAAAA/9MAAP/Y//b/yQAA/9P/3f/J/7//0wAAAAAAAAAA/9j/7P/sAAAAAP/YAAD/2AAAAAAAAAAAAAAAAAAAAAAAAP/i/+wAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2//YAAP/2AAAAAAAA/7D/7AAAAAAAAAAAAAAAAAAAAAD/9v/nAAAAAAAAAAAAAAAA//EAAP+c//b/nAAAAAD/9gAA//EAAAAAAAAAAAAAAAAAAAAAABQAAP/2AAAAAAAAAAAAAAAA//YAAP/x//EAAAAAAAAAAAAAAAD/7AAA/+z/8f/2/+IAAAAKAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAP/7AAAAAP/7AAAAAAAA/+cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zgAA//b/9v/x/+L/4gAA/9gAAP/2//YAAAAAAAAAAAAA/+IAAAAA/+cAAP/O/+z/5//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nAAD/7P/E/84AAP/OAAAAAAAAAAD/2AAAAAD/nP/s/43/nAAA/34AAAAA//b/sAAA/4gAAAAA//YAAAAA//sAAP/Y/+z/+wAAAAAAAAAAAAAAAAAA/8QAAP/Y/9j/pgAAAAAAAP/sAAAAAP/E/84AAP/EAAAAAAAA/9gAAP/i//v/yQAA/9j/3f/O/8T/2AAAAAAAAAAA/9j/7P/sAAAAAP/YAAD/2AAAAAAAAAAAAAAAAAAAAAAAAP/i/+wAAAAAAAAAAAAAAAD/2AAAAAAAAAAAAAD/+wAAAAAAAAAA/7oAAAAAAAAAAAAAAAD/+wAA//b/8f/2AAAAAAAAAAAAAAAA//sAAP+cAAD/nAAAAA8AAAAKAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAPAAAABQAAAAoAAAAKAAAAAAAAAAAAAAAAAAD/yQAAAAD/3QAA/78AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/7AAD/9gAA/+z/8QAA/+cAAAAAAAAAAAAAAAAAAAAA//YAAAAA//sAAAAAAAr/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAA//b/8QAA/+L/5//n/+L/9gAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAA//sAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAP/7AAAAAP/x//b/8f/x//sAAAAA/6b/yf+S//EAAAAAAAAAAAAAAAD/7P95/7oAAP/sAAAAAAAA/3n/zv+c/4P/nP+m/87/g/+m/7r/2P/Y/5wAAAAAAAAAAAAAAAAAAP+NAAD/pv/OAAD/nP+c/5z/nP+c/5IAAAAA/+cAAP/sAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAD/+wAAAAAAAAAA/5z/2AAA/+cAAAAAAAD/9gAA/+z/9v+6AAAAAP/2AAAAAAAA/7r/7P+I/7//iP/Y/+f/v//E/9j/7AAA/9gAAAAAAAAAAAAAAAAAAP/EAAAAAP/sAAD/2AAA/90AAP/Y/8kAAAAA/6b/3f+X/+wAAAAA//b/9v/x/+z/9v+6/9MAAP/2AAAAAAAA/7//8f+c/8T/nP/d/+L/xP/O/93/8f/x/90AAAAAAAAAAAAAAAAAAP/EAAD/nP/nAAD/3f/d/93/2P/d/8kAAAAAAAD/zgAA/+IAAP/2AAD/8QAA/+wAAP/2AAAAAP/2AAAAAAAA/9MAAAAA/9gAAP/O/+z/2P/O/+z/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/7AAA/9gAAP/YAAAAAAAA/5L/xP9+/90AAAAA/+z/7P/sAAD/9v+c/7oAAP/2AAAAAAAA/5L/2P9+/5f/fv+w/9j/l/+c/7X/7P/s/7UAAAAAAAAAAAAAAAAAAP+cAAD/kv/iAAD/tf/E/8n/uv/E/7AAAAAAAAD/2AAA//YAAAAAAAAAAAAAAAD/9gAA//EAAAAAAAAAAAAA/+cAAAAA/+wAAP/i//b/7P/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/s//EAAP/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAA/7UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/90AAAAAAAAAAAAAAAAAAP/7AAAAAP/s/+wAAP/sAAAAAAAAAAAAAAAA//b/pgAAAAD/zgAA/7oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/5wAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAA/+wAAAAA//EAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8QAA/7r/8f/sAAAAAP/2AAD/9gAAAAAAAAAA//sAAAAAAAAAAP/i/90AAP/2AAAAAAAAAAAAAAAAAAAAAP/n/+z/4v/n//EAAAAAAAD/2AAAAAD/pv/xAAD/nAAA/5IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/iAAAAAAAA/8QAAP/EAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//EAAAAA//EAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAA//YAAP/2//YAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAA/+wAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAAAAAAAAAA/+wAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAA//EAAAAA//YAAAAAAAD/9v/2AAoAAAAAAAAAAP/x//EAAAAKAA8AAAAAAAAAAAAAAAAAAP/7//v/9v/7AAAAAAAAAAAAAAAAAAD/zgAA/+z/8QAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/2AAAAAD/nP/x/4j/nAAA/34AAAAAAAAAAAAAAAAAAAAA/+wAAAAA//YAAAAA//H/9gAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+cAAD/nP/iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4j/2AAA/+IAAAAAAAAAAAAAAAD/7P+/AAAAAAAAAAAAAAAA/7AAAAAA/7oAAAAA/+f/ugAAAAAAAAAA/84AAAAAAAAAAAAAAAAAAP+rAAAAAP/sAAD/zgAA/84AAP/O/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9gAAAAA//EAAAAA//EAAAAAAAD/8f/2AAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/84AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nAAAAAAAAAAAAAAAA/+IAAP+r/+f/q//xAAD/5//i//EAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAA//EAAP/x//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAA/87/9v/s/+cAAP+6/+z/uv/2AAD/7P/s//YAAAAAAAAAAAAA//YAAAAAAAAAAP/xAAD/xAAAAAAAAP/x//b/9v/2//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAAAAAAAAAAAAAAA/90AAAAA/+IAAP/iAAD/4v/T//EAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAA//YAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nAAAAAAAA/87/9v/s/+IAAP+r/+f/q//xAAD/5//i//EAAAAAAAAAAAAA//YAAAAAAAAAAP/sAAD/ugAAAAAAAP/x//b/9v/2//sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9MAAAAA//EAAAAA//EAAAAAAAD/8f/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAD/7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAcAWwAYAAAALAAAABkAAAAgACMAIgAzAAAAMgAfAB8AAAAAAAAAAAABAAIAAwAEAAYABwAIAAkACgAAAAsADAANAA4ADwAQABEAEgATABQAFQAWAB0AGwAAAAAAFwAaAB4AIQAkACUAKAAAAAAAKQAAACgAKAArABoAAAA0ADYAOAA5ABwAAAAAAAAAAAAAAAAAAAAmAAAAAAAAAAAAJwAtACMAIwAuAC8AIAAuAC8AIAAAACIAJgAnAAEABwBdAA0AAAAAACEADgAAABUAGAAXACkAAAAoABQAFAAAAAAAAAAiAAEAAAACAAAAAAACAAMAAAAAAAAAAgAAAAIAAAAEAAUABgAHAAgACQAKAAsAAAAQABIAAAAMAA8AEwATABkAGgAPAB0AHgAPAA8AHwAfABMAHwAWACoALQAvADAAAAAAABEAAAAAAAAAAAAAABsAJgAAAAAAAAAcACMAGAAYACQAJQAVACQAJQAVAAAAFwAbABwAAAAmAAIADgAHAAcAAAAJAAkAAQALAAsAAgANABAAAwASABQABwAZACEACgAjADAAEwAzADkAIQA8ADwAKAA+AEEAKQBDAEcALQBPAE8AMgBUAF0AMwBfAGEAPQABAAgAAQAAAAEAAQADAAAAAQAAAAoAMAA+AAJERkxUAA5sYXRuABoABAAAAAD//wABAAAABAAAAAD//wABAAAAAXNzMDEACAAAAAEAAAACAAYADgAGAAAAAQAQAAEAAAABACgAAQAIAAEADgABAAEAZAABAAQAAQBkAAEAAAABAAAAAQABAAb/nwABAAEAZA==); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:font/truetype;base64,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cmVlbWVudCB0aGF0IGV4aXN0cyBiZXR3ZWVuIHlvdSBhbmQgSG9lZmxlciAmIENvLiBJZiBubyBzdWNoIGFncmVlbWVudCBleGlzdHMsIHlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCBodHRwOi8vd3d3LnR5cG9ncmFwaHkuY29tL3dlYmZvbnQtc29mdHdhcmUsIG9yIGNvbnRhY3QgSG9lZmxlciAmIENvLiBhdCB3d3cudHlwb2dyYXBoeS5jb20gMTcxMjQ3LTg4NDc0LTIwMTUwNjIzLTI0MjMtMTQwMjE5d3d3LnR5cG9ncmFwaHkuY29taHR0cDovL3d3dy50eXBvZ3JhcGh5LmNvbS93ZWJmb250LXNvZnR3YXJlAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMAA2ACwAIAAyADAAMAA3ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgAEgAJgBDAG8AIAB8ACAAdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtAFIAZQBnAHUAbABhAHIAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAVgBlAHIAcwBpAG8AbgAgADEALgAzADAAMQBGAG8AbgB0AEcAbwB0AGgAYQBtACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAsACAAdwBoAGkAYwBoACAAbQBhAHkAIABiAGUAIAByAGUAZwBpAHMAdABlAHIAZQBkACAAaQBuACAAYwBlAHIAdABhAGkAbgAgAGoAdQByAGkAcwBkAGkAYwB0AGkAbwBuAHMALgBIAG8AZQBmAGwAZQByACAAJgAgAEMAbwAuAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAEgAbwBlAGYAbABlAHIAIAAmACAAQwBvAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABjAG8AcAB5ACwAIABtAG8AZABpAGYAeQAsACAAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAbwByACAAZABvAHcAbgBsAG8AYQBkACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAsACAAbwByACAAaQBuAHMAdABhAGwAbAAgAGkAdAAgAHUAcABvAG4AIABhAG4AeQAgAGMAbwBtAHAAdQB0AGUAcgAsACAAbwByACAAaABvAHMAdAAgAGkAdAAgAGYAcgBvAG0AIABhAG4AeQAgAGwAbwBjAGEAdABpAG8AbgAuACAAWQBvAHUAcgAgAHIAaQBnAGgAdAAgAHQAbwAgAHUAcwBlACAAdABoAGkAcwAgAHMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAFQAZQByAG0AcwAgAG8AZgAgAFMAZQByAHYAaQBjAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHQAaABhAHQAIABlAHgAaQBzAHQAcwAgAGIAZQB0AHcAZQBlAG4AIAB5AG8AdQAgAGEAbgBkACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAEkAZgAgAG4AbwAgAHMAdQBjAGgAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGUAeABpAHMAdABzACwAIAB5AG8AdQAgAG0AYQB5ACAAbgBvAHQAIAB1AHMAZQAgAHQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABmAG8AcgAgAGEAbgB5ACAAcAB1AHIAcABvAHMAZQAuACAARgBvAHIAIABtAG8AcgBlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABwAGwAZQBhAHMAZQAgAHYAaQBzAGkAdAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0ALwB3AGUAYgBmAG8AbgB0AC0AcwBvAGYAdAB3AGEAcgBlACwAIABvAHIAIABjAG8AbgB0AGEAYwB0ACAASABvAGUAZgBsAGUAcgAgACYAIABDAG8ALgAgAGEAdAAgAHcAdwB3AC4AdAB5AHAAbwBnAHIAYQBwAGgAeQAuAGMAbwBtACAAMQA3ADEAMgA0ADcALQA4ADgANAA3ADQALQAyADAAMQA1ADAANgAyADMALQAyADQAMgAzAC0AMQA0ADAAMgAxADkAdwB3AHcALgB0AHkAcABvAGcAcgBhAHAAaAB5AC4AYwBvAG0AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAHQAeQBwAG8AZwByAGEAcABoAHkALgBjAG8AbQAvAHcAZQBiAGYAbwBuAHQALQBzAG8AZgB0AHcAYQByAGUAAAIAAAAAAAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAEAAgADAAQABwATABQAFQAWABgAGQAbABwAIwAoACsALAAxADsARwBSAFUAVgBYAFoAXQCjAQIHaGNvc2x1ZwABAAH//wAKAAEAAAAOAAAAGAAAAAAAAgABAAEAHAABAAQAAAACAAA=); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/F0E469574253DABD5.css b/docs/static/fonts/332720/F0E469574253DABD5.css deleted file mode 100644 index fc6add2211..0000000000 --- a/docs/static/fonts/332720/F0E469574253DABD5.css +++ /dev/null @@ -1,19 +0,0 @@ - -/* - Copyright (C) 2011-2015 Hoefler & Co. - This software is the property of Hoefler & Co. (H&Co). - Your right to access and use this software is subject to the - applicable License Agreement, or Terms of Service, that exists - between you and H&Co. If no such agreement exists, you may not - access or use this software for any purpose. - This software may only be hosted at the locations specified in - the applicable License Agreement or Terms of Service, and only - for the purposes expressly set forth therein. You may not copy, - modify, convert, create derivative works from or distribute this - software in any way, or make it accessible to any third party, - without first obtaining the written permission of H&Co. - For more information, please visit us at http://typography.com. - 171247-88474-20150623 -*/ - -@font-face{ font-family: "Gotham Rounded A"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } @font-face{ font-family: "Gotham Rounded B"; src: url(data:application/x-font-woff;base64,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); font-weight:300; font-style:normal; } \ No newline at end of file diff --git a/docs/static/fonts/332720/FA4DC96C390FF844F.eot b/docs/static/fonts/332720/FA4DC96C390FF844F.eot deleted file mode 100644 index 0a1e78dcad..0000000000 Binary files a/docs/static/fonts/332720/FA4DC96C390FF844F.eot and /dev/null differ diff --git a/docs/static/images/Mercurial_features_screenshot.png b/docs/static/images/Mercurial_features_screenshot.png deleted file mode 100644 index 77370d6df9..0000000000 Binary files a/docs/static/images/Mercurial_features_screenshot.png and /dev/null differ diff --git a/docs/static/images/blog/2017-02-27/notification.png b/docs/static/images/blog/2017-02-27/notification.png deleted file mode 100644 index 8c2438f24b..0000000000 Binary files a/docs/static/images/blog/2017-02-27/notification.png and /dev/null differ diff --git a/docs/static/images/blog/2017-02-27/poll.png b/docs/static/images/blog/2017-02-27/poll.png deleted file mode 100644 index 3a3b865e8a..0000000000 Binary files a/docs/static/images/blog/2017-02-27/poll.png and /dev/null differ diff --git a/docs/static/images/blog/2017-08-31/quick-open.png b/docs/static/images/blog/2017-08-31/quick-open.png deleted file mode 100644 index 5f77990556..0000000000 Binary files a/docs/static/images/blog/2017-08-31/quick-open.png and /dev/null differ diff --git a/docs/static/images/blog/2017-08-31/settings.png b/docs/static/images/blog/2017-08-31/settings.png deleted file mode 100644 index a1d90c43e5..0000000000 Binary files a/docs/static/images/blog/2017-08-31/settings.png and /dev/null differ diff --git a/docs/static/images/blog/2017-09-12/atom-ide-ui.png b/docs/static/images/blog/2017-09-12/atom-ide-ui.png deleted file mode 100644 index ee4c74239f..0000000000 Binary files a/docs/static/images/blog/2017-09-12/atom-ide-ui.png and /dev/null differ diff --git a/docs/static/images/blog/nuclide-atom-settings.png b/docs/static/images/blog/nuclide-atom-settings.png deleted file mode 100644 index 0e6e57dea9..0000000000 Binary files a/docs/static/images/blog/nuclide-atom-settings.png and /dev/null differ diff --git a/docs/static/images/blog/nuclide-feature-settings.png b/docs/static/images/blog/nuclide-feature-settings.png deleted file mode 100644 index 2ec10785c8..0000000000 Binary files a/docs/static/images/blog/nuclide-feature-settings.png and /dev/null differ diff --git a/docs/static/images/docs/debugger-hhvm-settings.PNG b/docs/static/images/docs/debugger-hhvm-settings.PNG deleted file mode 100644 index 3a8d68fb03..0000000000 Binary files a/docs/static/images/docs/debugger-hhvm-settings.PNG and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-adding-projects.png b/docs/static/images/docs/editor-basics-adding-projects.png deleted file mode 100644 index af90987b96..0000000000 Binary files a/docs/static/images/docs/editor-basics-adding-projects.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-command-palette-intro.png b/docs/static/images/docs/editor-basics-command-palette-intro.png deleted file mode 100644 index 4952eac8b4..0000000000 Binary files a/docs/static/images/docs/editor-basics-command-palette-intro.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-command-palette-search.png b/docs/static/images/docs/editor-basics-command-palette-search.png deleted file mode 100644 index 7d584fd811..0000000000 Binary files a/docs/static/images/docs/editor-basics-command-palette-search.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-distraction-free.png b/docs/static/images/docs/editor-basics-distraction-free.png deleted file mode 100644 index daba559d09..0000000000 Binary files a/docs/static/images/docs/editor-basics-distraction-free.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-distraction.png b/docs/static/images/docs/editor-basics-distraction.png deleted file mode 100644 index 8e788441da..0000000000 Binary files a/docs/static/images/docs/editor-basics-distraction.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-editing-area-symbols.png b/docs/static/images/docs/editor-basics-editing-area-symbols.png deleted file mode 100644 index abe4126038..0000000000 Binary files a/docs/static/images/docs/editor-basics-editing-area-symbols.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-editing-context-aware.png b/docs/static/images/docs/editor-basics-editing-context-aware.png deleted file mode 100644 index 9687ffaf8b..0000000000 Binary files a/docs/static/images/docs/editor-basics-editing-context-aware.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-editing-omnisearch.png b/docs/static/images/docs/editor-basics-editing-omnisearch.png deleted file mode 100644 index e7eb5e70ad..0000000000 Binary files a/docs/static/images/docs/editor-basics-editing-omnisearch.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-editing-panes.png b/docs/static/images/docs/editor-basics-editing-panes.png deleted file mode 100644 index f1b8d5de38..0000000000 Binary files a/docs/static/images/docs/editor-basics-editing-panes.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-explorer-changed-files.png b/docs/static/images/docs/editor-basics-explorer-changed-files.png deleted file mode 100644 index 2bd783f3a5..0000000000 Binary files a/docs/static/images/docs/editor-basics-explorer-changed-files.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-explorer-context-aware.png b/docs/static/images/docs/editor-basics-explorer-context-aware.png deleted file mode 100644 index 6318df42cd..0000000000 Binary files a/docs/static/images/docs/editor-basics-explorer-context-aware.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-file-tree.png b/docs/static/images/docs/editor-basics-file-tree.png deleted file mode 100644 index 9116f66734..0000000000 Binary files a/docs/static/images/docs/editor-basics-file-tree.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-gutter-code-diagnostics.png b/docs/static/images/docs/editor-basics-gutter-code-diagnostics.png deleted file mode 100644 index d8e5e29659..0000000000 Binary files a/docs/static/images/docs/editor-basics-gutter-code-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-gutter-intro.png b/docs/static/images/docs/editor-basics-gutter-intro.png deleted file mode 100644 index c27ed858f1..0000000000 Binary files a/docs/static/images/docs/editor-basics-gutter-intro.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-homepage.png b/docs/static/images/docs/editor-basics-homepage.png deleted file mode 100644 index 20d6c18d2b..0000000000 Binary files a/docs/static/images/docs/editor-basics-homepage.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-intro.png b/docs/static/images/docs/editor-basics-intro.png deleted file mode 100644 index 6df564c953..0000000000 Binary files a/docs/static/images/docs/editor-basics-intro.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-nuclide-package.png b/docs/static/images/docs/editor-basics-nuclide-package.png deleted file mode 100644 index 6af69e0731..0000000000 Binary files a/docs/static/images/docs/editor-basics-nuclide-package.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-nuclide-preferences.png b/docs/static/images/docs/editor-basics-nuclide-preferences.png deleted file mode 100644 index 6e5db93619..0000000000 Binary files a/docs/static/images/docs/editor-basics-nuclide-preferences.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-open-files.png b/docs/static/images/docs/editor-basics-open-files.png deleted file mode 100644 index 27f68cea00..0000000000 Binary files a/docs/static/images/docs/editor-basics-open-files.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-status-bar-connection.png b/docs/static/images/docs/editor-basics-status-bar-connection.png deleted file mode 100644 index 7c8f28c770..0000000000 Binary files a/docs/static/images/docs/editor-basics-status-bar-connection.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-status-bar-diagnostics.png b/docs/static/images/docs/editor-basics-status-bar-diagnostics.png deleted file mode 100644 index 2f379c44b1..0000000000 Binary files a/docs/static/images/docs/editor-basics-status-bar-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-status-bar-intro.png b/docs/static/images/docs/editor-basics-status-bar-intro.png deleted file mode 100644 index 1f36158c53..0000000000 Binary files a/docs/static/images/docs/editor-basics-status-bar-intro.png and /dev/null differ diff --git a/docs/static/images/docs/editor-basics-uncommitted.png b/docs/static/images/docs/editor-basics-uncommitted.png deleted file mode 100644 index 2f3c7a518e..0000000000 Binary files a/docs/static/images/docs/editor-basics-uncommitted.png and /dev/null differ diff --git a/docs/static/images/docs/editor-keyboard-shortcuts-hyperclick.png b/docs/static/images/docs/editor-keyboard-shortcuts-hyperclick.png deleted file mode 100644 index b72e071d00..0000000000 Binary files a/docs/static/images/docs/editor-keyboard-shortcuts-hyperclick.png and /dev/null differ diff --git a/docs/static/images/docs/editor-setup-atom-install-nuclide.png b/docs/static/images/docs/editor-setup-atom-install-nuclide.png deleted file mode 100644 index 58d6d7b189..0000000000 Binary files a/docs/static/images/docs/editor-setup-atom-install-nuclide.png and /dev/null differ diff --git a/docs/static/images/docs/editor-setup-atom-install-windows.png b/docs/static/images/docs/editor-setup-atom-install-windows.png deleted file mode 100644 index 921dac3ec0..0000000000 Binary files a/docs/static/images/docs/editor-setup-atom-install-windows.png and /dev/null differ diff --git a/docs/static/images/docs/editor-setup-recommended-packages.png b/docs/static/images/docs/editor-setup-recommended-packages.png deleted file mode 100644 index 0692f4d8ec..0000000000 Binary files a/docs/static/images/docs/editor-setup-recommended-packages.png and /dev/null differ diff --git a/docs/static/images/docs/editor-uninstall-reenable-atom-tree-view.png b/docs/static/images/docs/editor-uninstall-reenable-atom-tree-view.png deleted file mode 100644 index 4f2679ea21..0000000000 Binary files a/docs/static/images/docs/editor-uninstall-reenable-atom-tree-view.png and /dev/null differ diff --git a/docs/static/images/docs/feature-buck-command-palette.png b/docs/static/images/docs/feature-buck-command-palette.png deleted file mode 100644 index 4bd7df76f6..0000000000 Binary files a/docs/static/images/docs/feature-buck-command-palette.png and /dev/null differ diff --git a/docs/static/images/docs/feature-buck-nuclide-menu.png b/docs/static/images/docs/feature-buck-nuclide-menu.png deleted file mode 100644 index 7d9261f3c6..0000000000 Binary files a/docs/static/images/docs/feature-buck-nuclide-menu.png and /dev/null differ diff --git a/docs/static/images/docs/feature-buck-task-runner.png b/docs/static/images/docs/feature-buck-task-runner.png deleted file mode 100644 index 0ba34a0b09..0000000000 Binary files a/docs/static/images/docs/feature-buck-task-runner.png and /dev/null differ diff --git a/docs/static/images/docs/feature-context-view-highlight.png b/docs/static/images/docs/feature-context-view-highlight.png deleted file mode 100644 index 2e44f19f37..0000000000 Binary files a/docs/static/images/docs/feature-context-view-highlight.png and /dev/null differ diff --git a/docs/static/images/docs/feature-context-view.png b/docs/static/images/docs/feature-context-view.png deleted file mode 100644 index df8dfe7656..0000000000 Binary files a/docs/static/images/docs/feature-context-view.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-breakpoint-menu.png b/docs/static/images/docs/feature-debugger-basics-breakpoint-menu.png deleted file mode 100644 index 738d14871b..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-breakpoint-menu.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-breakpoints-gutter.png b/docs/static/images/docs/feature-debugger-basics-breakpoints-gutter.png deleted file mode 100644 index 278fc5bc88..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-breakpoints-gutter.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-breakpoints-main-debugging-tab.png b/docs/static/images/docs/feature-debugger-basics-breakpoints-main-debugging-tab.png deleted file mode 100644 index 7802572ca1..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-breakpoints-main-debugging-tab.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-debugger-breakpoint-menu.png b/docs/static/images/docs/feature-debugger-basics-debugger-breakpoint-menu.png deleted file mode 100644 index 738d14871b..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-debugger-breakpoint-menu.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-debugger-example.png b/docs/static/images/docs/feature-debugger-basics-debugger-example.png deleted file mode 100644 index 16141c8e0c..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-debugger-example.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-debugger-watch-menu.png b/docs/static/images/docs/feature-debugger-basics-debugger-watch-menu.png deleted file mode 100644 index d20f8cbd06..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-debugger-watch-menu.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-stepping-example-start-other-module.png b/docs/static/images/docs/feature-debugger-basics-stepping-example-start-other-module.png deleted file mode 100644 index a911da3d11..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-stepping-example-start-other-module.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-stepping-icons.png b/docs/static/images/docs/feature-debugger-basics-stepping-icons.png deleted file mode 100644 index 4faba70c19..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-stepping-icons.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-target-after-attach.png b/docs/static/images/docs/feature-debugger-basics-target-after-attach.png deleted file mode 100644 index 668258d723..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-target-after-attach.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-basics-target-process.png b/docs/static/images/docs/feature-debugger-basics-target-process.png deleted file mode 100644 index 53aa35e975..0000000000 Binary files a/docs/static/images/docs/feature-debugger-basics-target-process.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-evaluation-ex.png b/docs/static/images/docs/feature-debugger-evaluation-ex.png deleted file mode 100644 index 8b9ddddfaf..0000000000 Binary files a/docs/static/images/docs/feature-debugger-evaluation-ex.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-languages-cpp-attach.png b/docs/static/images/docs/feature-debugger-languages-cpp-attach.png deleted file mode 100644 index b0fff34e7a..0000000000 Binary files a/docs/static/images/docs/feature-debugger-languages-cpp-attach.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-languages-cpp-launch.png b/docs/static/images/docs/feature-debugger-languages-cpp-launch.png deleted file mode 100644 index 4940463a38..0000000000 Binary files a/docs/static/images/docs/feature-debugger-languages-cpp-launch.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-languages-hack-php-filtering.png b/docs/static/images/docs/feature-debugger-languages-hack-php-filtering.png deleted file mode 100644 index 1e98701486..0000000000 Binary files a/docs/static/images/docs/feature-debugger-languages-hack-php-filtering.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-languages-react-native-application-debug-options.png b/docs/static/images/docs/feature-debugger-languages-react-native-application-debug-options.png deleted file mode 100644 index 305a289b5f..0000000000 Binary files a/docs/static/images/docs/feature-debugger-languages-react-native-application-debug-options.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-languages-react-native-application-show-inspector.png b/docs/static/images/docs/feature-debugger-languages-react-native-application-show-inspector.png deleted file mode 100644 index d323ee9d19..0000000000 Binary files a/docs/static/images/docs/feature-debugger-languages-react-native-application-show-inspector.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-languages-react-native-debugging.png b/docs/static/images/docs/feature-debugger-languages-react-native-debugging.png deleted file mode 100644 index 07ab48ed89..0000000000 Binary files a/docs/static/images/docs/feature-debugger-languages-react-native-debugging.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-languages-react-native-server.png b/docs/static/images/docs/feature-debugger-languages-react-native-server.png deleted file mode 100644 index 44022660bf..0000000000 Binary files a/docs/static/images/docs/feature-debugger-languages-react-native-server.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-selection-attach-server.png b/docs/static/images/docs/feature-debugger-selection-attach-server.png deleted file mode 100644 index 57d74eba01..0000000000 Binary files a/docs/static/images/docs/feature-debugger-selection-attach-server.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-stepping-controls.png b/docs/static/images/docs/feature-debugger-stepping-controls.png deleted file mode 100644 index 0574671771..0000000000 Binary files a/docs/static/images/docs/feature-debugger-stepping-controls.png and /dev/null differ diff --git a/docs/static/images/docs/feature-debugger-target-attach.png b/docs/static/images/docs/feature-debugger-target-attach.png deleted file mode 100644 index 37c8f28881..0000000000 Binary files a/docs/static/images/docs/feature-debugger-target-attach.png and /dev/null differ diff --git a/docs/static/images/docs/feature-format-js-after.png b/docs/static/images/docs/feature-format-js-after.png deleted file mode 100644 index 2a75555410..0000000000 Binary files a/docs/static/images/docs/feature-format-js-after.png and /dev/null differ diff --git a/docs/static/images/docs/feature-format-js-before.png b/docs/static/images/docs/feature-format-js-before.png deleted file mode 100644 index 2dcc8a66a5..0000000000 Binary files a/docs/static/images/docs/feature-format-js-before.png and /dev/null differ diff --git a/docs/static/images/docs/feature-format-js-keybindings.png b/docs/static/images/docs/feature-format-js-keybindings.png deleted file mode 100644 index c0be428aba..0000000000 Binary files a/docs/static/images/docs/feature-format-js-keybindings.png and /dev/null differ diff --git a/docs/static/images/docs/feature-format-js-settings.png b/docs/static/images/docs/feature-format-js-settings.png deleted file mode 100644 index df3e1dd080..0000000000 Binary files a/docs/static/images/docs/feature-format-js-settings.png and /dev/null differ diff --git a/docs/static/images/docs/feature-health-overview.png b/docs/static/images/docs/feature-health-overview.png deleted file mode 100644 index 5a91fbf4ae..0000000000 Binary files a/docs/static/images/docs/feature-health-overview.png and /dev/null differ diff --git a/docs/static/images/docs/feature-hg-blame-access.png b/docs/static/images/docs/feature-hg-blame-access.png deleted file mode 100644 index 7561ac24a8..0000000000 Binary files a/docs/static/images/docs/feature-hg-blame-access.png and /dev/null differ diff --git a/docs/static/images/docs/feature-hg-blame-gutter.png b/docs/static/images/docs/feature-hg-blame-gutter.png deleted file mode 100644 index b9b65c263f..0000000000 Binary files a/docs/static/images/docs/feature-hg-blame-gutter.png and /dev/null differ diff --git a/docs/static/images/docs/feature-hg-bookmark.png b/docs/static/images/docs/feature-hg-bookmark.png deleted file mode 100644 index 3fa97f87d7..0000000000 Binary files a/docs/static/images/docs/feature-hg-bookmark.png and /dev/null differ diff --git a/docs/static/images/docs/feature-hg-file-tree-highlight.png b/docs/static/images/docs/feature-hg-file-tree-highlight.png deleted file mode 100644 index c4889ddcf1..0000000000 Binary files a/docs/static/images/docs/feature-hg-file-tree-highlight.png and /dev/null differ diff --git a/docs/static/images/docs/feature-hg-line-mod-gutter-setting.png b/docs/static/images/docs/feature-hg-line-mod-gutter-setting.png deleted file mode 100644 index 923ba42925..0000000000 Binary files a/docs/static/images/docs/feature-hg-line-mod-gutter-setting.png and /dev/null differ diff --git a/docs/static/images/docs/feature-hg-line-modifications.png b/docs/static/images/docs/feature-hg-line-modifications.png deleted file mode 100644 index 69b25c0b06..0000000000 Binary files a/docs/static/images/docs/feature-hg-line-modifications.png and /dev/null differ diff --git a/docs/static/images/docs/feature-hg-number-of-line-changes.png b/docs/static/images/docs/feature-hg-number-of-line-changes.png deleted file mode 100644 index e116ec2477..0000000000 Binary files a/docs/static/images/docs/feature-hg-number-of-line-changes.png and /dev/null differ diff --git a/docs/static/images/docs/feature-outline-view-click.png b/docs/static/images/docs/feature-outline-view-click.png deleted file mode 100644 index f87f1008b2..0000000000 Binary files a/docs/static/images/docs/feature-outline-view-click.png and /dev/null differ diff --git a/docs/static/images/docs/feature-outline-view.png b/docs/static/images/docs/feature-outline-view.png deleted file mode 100644 index e4009bd0b6..0000000000 Binary files a/docs/static/images/docs/feature-outline-view.png and /dev/null differ diff --git a/docs/static/images/docs/feature-quick-open-filenames.png b/docs/static/images/docs/feature-quick-open-filenames.png deleted file mode 100644 index 46e0ed0553..0000000000 Binary files a/docs/static/images/docs/feature-quick-open-filenames.png and /dev/null differ diff --git a/docs/static/images/docs/feature-quick-open-omnisearch.png b/docs/static/images/docs/feature-quick-open-omnisearch.png deleted file mode 100644 index c72658003c..0000000000 Binary files a/docs/static/images/docs/feature-quick-open-omnisearch.png and /dev/null differ diff --git a/docs/static/images/docs/feature-quick-open-open-files.png b/docs/static/images/docs/feature-quick-open-open-files.png deleted file mode 100644 index 45fba3ced2..0000000000 Binary files a/docs/static/images/docs/feature-quick-open-open-files.png and /dev/null differ diff --git a/docs/static/images/docs/feature-quick-open-toggle-hack-symbols.png b/docs/static/images/docs/feature-quick-open-toggle-hack-symbols.png deleted file mode 100644 index a2dec16ea3..0000000000 Binary files a/docs/static/images/docs/feature-quick-open-toggle-hack-symbols.png and /dev/null differ diff --git a/docs/static/images/docs/feature-quick-open-toggle-recent-files.png b/docs/static/images/docs/feature-quick-open-toggle-recent-files.png deleted file mode 100644 index d662d9aa62..0000000000 Binary files a/docs/static/images/docs/feature-quick-open-toggle-recent-files.png and /dev/null differ diff --git a/docs/static/images/docs/feature-quick-open-toggle-window.png b/docs/static/images/docs/feature-quick-open-toggle-window.png deleted file mode 100644 index 7a4c2f79cf..0000000000 Binary files a/docs/static/images/docs/feature-quick-open-toggle-window.png and /dev/null differ diff --git a/docs/static/images/docs/feature-remote-add-profile.png b/docs/static/images/docs/feature-remote-add-profile.png deleted file mode 100644 index 25b137026c..0000000000 Binary files a/docs/static/images/docs/feature-remote-add-profile.png and /dev/null differ diff --git a/docs/static/images/docs/feature-remote-add-remote-project-file-tree.png b/docs/static/images/docs/feature-remote-add-remote-project-file-tree.png deleted file mode 100644 index ada48c6376..0000000000 Binary files a/docs/static/images/docs/feature-remote-add-remote-project-file-tree.png and /dev/null differ diff --git a/docs/static/images/docs/feature-remote-connect-dialog-box.png b/docs/static/images/docs/feature-remote-connect-dialog-box.png deleted file mode 100644 index a40b9895fe..0000000000 Binary files a/docs/static/images/docs/feature-remote-connect-dialog-box.png and /dev/null differ diff --git a/docs/static/images/docs/feature-remote-connect-menu.png b/docs/static/images/docs/feature-remote-connect-menu.png deleted file mode 100644 index 024d9c9488..0000000000 Binary files a/docs/static/images/docs/feature-remote-connect-menu.png and /dev/null differ diff --git a/docs/static/images/docs/feature-remote-file-tree.png b/docs/static/images/docs/feature-remote-file-tree.png deleted file mode 100644 index e7b20ed475..0000000000 Binary files a/docs/static/images/docs/feature-remote-file-tree.png and /dev/null differ diff --git a/docs/static/images/docs/feature-remote-profiles.png b/docs/static/images/docs/feature-remote-profiles.png deleted file mode 100644 index ede1904050..0000000000 Binary files a/docs/static/images/docs/feature-remote-profiles.png and /dev/null differ diff --git a/docs/static/images/docs/feature-remote-projects-menu.png b/docs/static/images/docs/feature-remote-projects-menu.png deleted file mode 100644 index b4de9825ce..0000000000 Binary files a/docs/static/images/docs/feature-remote-projects-menu.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runer-buck-build-console.png b/docs/static/images/docs/feature-task-runer-buck-build-console.png deleted file mode 100644 index 7277c0ba82..0000000000 Binary files a/docs/static/images/docs/feature-task-runer-buck-build-console.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-buck-build-diagnostics.png b/docs/static/images/docs/feature-task-runner-buck-build-diagnostics.png deleted file mode 100644 index 71aa6bf5e8..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-buck-build-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-buck-build-settings.png b/docs/static/images/docs/feature-task-runner-buck-build-settings.png deleted file mode 100644 index baf21fbaca..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-buck-build-settings.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-buck-build.png b/docs/static/images/docs/feature-task-runner-buck-build.png deleted file mode 100644 index 24b61f1943..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-buck-build.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-buck-debug.png b/docs/static/images/docs/feature-task-runner-buck-debug.png deleted file mode 100644 index 15f6420db6..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-buck-debug.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-buck-run.png b/docs/static/images/docs/feature-task-runner-buck-run.png deleted file mode 100644 index 0d108505f8..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-buck-run.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-buck-test.png b/docs/static/images/docs/feature-task-runner-buck-test.png deleted file mode 100644 index f04b27559d..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-buck-test.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-hack-selection.png b/docs/static/images/docs/feature-task-runner-hack-selection.png deleted file mode 100644 index d6e247d4d9..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-hack-selection.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-hack-toolbar.png b/docs/static/images/docs/feature-task-runner-hack-toolbar.png deleted file mode 100644 index 85cb83f952..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-hack-toolbar.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-hhvm-debug.png b/docs/static/images/docs/feature-task-runner-hhvm-debug.png deleted file mode 100644 index ccdba4ab53..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-hhvm-debug.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-swift-build-output.png b/docs/static/images/docs/feature-task-runner-swift-build-output.png deleted file mode 100644 index 84ab8c66a2..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-swift-build-output.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-swift-build-settings.png b/docs/static/images/docs/feature-task-runner-swift-build-settings.png deleted file mode 100644 index 01618796c0..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-swift-build-settings.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-swift-build-toolbar.png b/docs/static/images/docs/feature-task-runner-swift-build-toolbar.png deleted file mode 100644 index 2ad53c6eed..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-swift-build-toolbar.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-swift-test-output.png b/docs/static/images/docs/feature-task-runner-swift-test-output.png deleted file mode 100644 index 8d7b3c34ff..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-swift-test-output.png and /dev/null differ diff --git a/docs/static/images/docs/feature-task-runner-swift-test-toolbar.png b/docs/static/images/docs/feature-task-runner-swift-test-toolbar.png deleted file mode 100644 index 1cfebdf666..0000000000 Binary files a/docs/static/images/docs/feature-task-runner-swift-test-toolbar.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-console.png b/docs/static/images/docs/feature-toolbar-button-console.png deleted file mode 100644 index deafc72c26..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-console.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-context-view.png b/docs/static/images/docs/feature-toolbar-button-context-view.png deleted file mode 100644 index 36cdd45934..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-context-view.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-debugger.png b/docs/static/images/docs/feature-toolbar-button-debugger.png deleted file mode 100644 index a1f7d710e4..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-debugger.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-diagnostics.png b/docs/static/images/docs/feature-toolbar-button-diagnostics.png deleted file mode 100644 index 419cf63b6e..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-distraction-free-mode.png b/docs/static/images/docs/feature-toolbar-button-distraction-free-mode.png deleted file mode 100644 index 2b08f0cebc..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-distraction-free-mode.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-hhvm-toolbar.png b/docs/static/images/docs/feature-toolbar-button-hhvm-toolbar.png deleted file mode 100644 index 24a9324375..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-hhvm-toolbar.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-nuclide-health.png b/docs/static/images/docs/feature-toolbar-button-nuclide-health.png deleted file mode 100644 index 85ea2e5819..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-nuclide-health.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-nuclide-settings.png b/docs/static/images/docs/feature-toolbar-button-nuclide-settings.png deleted file mode 100644 index c64f9dac36..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-nuclide-settings.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-outline-view.png b/docs/static/images/docs/feature-toolbar-button-outline-view.png deleted file mode 100644 index 10faa8c320..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-outline-view.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-settings-view.png b/docs/static/images/docs/feature-toolbar-button-settings-view.png deleted file mode 100644 index 1f3ccada37..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-settings-view.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-task-runner.png b/docs/static/images/docs/feature-toolbar-button-task-runner.png deleted file mode 100644 index 2e4d95200b..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-task-runner.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-button-test-runner.png b/docs/static/images/docs/feature-toolbar-button-test-runner.png deleted file mode 100644 index d52b9a86d2..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-button-test-runner.png and /dev/null differ diff --git a/docs/static/images/docs/feature-toolbar-find-package.png b/docs/static/images/docs/feature-toolbar-find-package.png deleted file mode 100644 index 0ce0623173..0000000000 Binary files a/docs/static/images/docs/feature-toolbar-find-package.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-add.png b/docs/static/images/docs/feature-working-set-add.png deleted file mode 100644 index 82d04502ec..0000000000 Binary files a/docs/static/images/docs/feature-working-set-add.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-all-working-sets.png b/docs/static/images/docs/feature-working-set-all-working-sets.png deleted file mode 100644 index 0af43b0ff0..0000000000 Binary files a/docs/static/images/docs/feature-working-set-all-working-sets.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-begin.png b/docs/static/images/docs/feature-working-set-begin.png deleted file mode 100644 index 38152ef773..0000000000 Binary files a/docs/static/images/docs/feature-working-set-begin.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-created.png b/docs/static/images/docs/feature-working-set-created.png deleted file mode 100644 index 1719eb5ea1..0000000000 Binary files a/docs/static/images/docs/feature-working-set-created.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-deactivate.png b/docs/static/images/docs/feature-working-set-deactivate.png deleted file mode 100644 index a91cce7e23..0000000000 Binary files a/docs/static/images/docs/feature-working-set-deactivate.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-edit.png b/docs/static/images/docs/feature-working-set-edit.png deleted file mode 100644 index 1c55661aed..0000000000 Binary files a/docs/static/images/docs/feature-working-set-edit.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-not-working-set-file.png b/docs/static/images/docs/feature-working-set-not-working-set-file.png deleted file mode 100644 index b581c25490..0000000000 Binary files a/docs/static/images/docs/feature-working-set-not-working-set-file.png and /dev/null differ diff --git a/docs/static/images/docs/feature-working-set-select-active.png b/docs/static/images/docs/feature-working-set-select-active.png deleted file mode 100644 index c0c1256d4f..0000000000 Binary files a/docs/static/images/docs/feature-working-set-select-active.png and /dev/null differ diff --git a/docs/static/images/docs/help-faqs-bookshelf.png b/docs/static/images/docs/help-faqs-bookshelf.png deleted file mode 100644 index a1de969168..0000000000 Binary files a/docs/static/images/docs/help-faqs-bookshelf.png and /dev/null differ diff --git a/docs/static/images/docs/help-faqs-reveal-file-on-switch.png b/docs/static/images/docs/help-faqs-reveal-file-on-switch.png deleted file mode 100644 index 6ef6d1a615..0000000000 Binary files a/docs/static/images/docs/help-faqs-reveal-file-on-switch.png and /dev/null differ diff --git a/docs/static/images/docs/help-troubleshooting-diagnostic-flags.png b/docs/static/images/docs/help-troubleshooting-diagnostic-flags.png deleted file mode 100644 index 0aa27f1e4c..0000000000 Binary files a/docs/static/images/docs/help-troubleshooting-diagnostic-flags.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-autocomplete.png b/docs/static/images/docs/language-cpp-autocomplete.png deleted file mode 100644 index ca9950b4a5..0000000000 Binary files a/docs/static/images/docs/language-cpp-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-code-diagnostics-gutter-fix.png b/docs/static/images/docs/language-cpp-code-diagnostics-gutter-fix.png deleted file mode 100644 index af50a4cbcc..0000000000 Binary files a/docs/static/images/docs/language-cpp-code-diagnostics-gutter-fix.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-code-diagnostics.png b/docs/static/images/docs/language-cpp-code-diagnostics.png deleted file mode 100644 index c4f81c0c2b..0000000000 Binary files a/docs/static/images/docs/language-cpp-code-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-code-formatting-after.png b/docs/static/images/docs/language-cpp-code-formatting-after.png deleted file mode 100644 index d9bc89e575..0000000000 Binary files a/docs/static/images/docs/language-cpp-code-formatting-after.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-code-formatting-before.png b/docs/static/images/docs/language-cpp-code-formatting-before.png deleted file mode 100644 index d24e716af3..0000000000 Binary files a/docs/static/images/docs/language-cpp-code-formatting-before.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-jump-to-declaration-link.png b/docs/static/images/docs/language-cpp-jump-to-declaration-link.png deleted file mode 100644 index 83436731c0..0000000000 Binary files a/docs/static/images/docs/language-cpp-jump-to-declaration-link.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-jump-to-declaration-result.png b/docs/static/images/docs/language-cpp-jump-to-declaration-result.png deleted file mode 100644 index 27cf36651f..0000000000 Binary files a/docs/static/images/docs/language-cpp-jump-to-declaration-result.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-type-hint-pinned.png b/docs/static/images/docs/language-cpp-type-hint-pinned.png deleted file mode 100644 index ec6310dca6..0000000000 Binary files a/docs/static/images/docs/language-cpp-type-hint-pinned.png and /dev/null differ diff --git a/docs/static/images/docs/language-cpp-type-hint.png b/docs/static/images/docs/language-cpp-type-hint.png deleted file mode 100644 index d101490c5d..0000000000 Binary files a/docs/static/images/docs/language-cpp-type-hint.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-autocomplete.png b/docs/static/images/docs/language-flow-autocomplete.png deleted file mode 100644 index ac643177b1..0000000000 Binary files a/docs/static/images/docs/language-flow-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-code-diagnostics-gutter.png b/docs/static/images/docs/language-flow-code-diagnostics-gutter.png deleted file mode 100644 index 695dd6ac5c..0000000000 Binary files a/docs/static/images/docs/language-flow-code-diagnostics-gutter.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-code-diagnostics.png b/docs/static/images/docs/language-flow-code-diagnostics.png deleted file mode 100644 index 9b4456ef4e..0000000000 Binary files a/docs/static/images/docs/language-flow-code-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-jump-to-definition-link.png b/docs/static/images/docs/language-flow-jump-to-definition-link.png deleted file mode 100644 index b2bd77532d..0000000000 Binary files a/docs/static/images/docs/language-flow-jump-to-definition-link.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-jump-to-definition-result.png b/docs/static/images/docs/language-flow-jump-to-definition-result.png deleted file mode 100644 index 7d1858173e..0000000000 Binary files a/docs/static/images/docs/language-flow-jump-to-definition-result.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-pinned-typehint.png b/docs/static/images/docs/language-flow-pinned-typehint.png deleted file mode 100644 index 2b67519c46..0000000000 Binary files a/docs/static/images/docs/language-flow-pinned-typehint.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-type-coverage-inline.png b/docs/static/images/docs/language-flow-type-coverage-inline.png deleted file mode 100644 index cdb4dd3ab4..0000000000 Binary files a/docs/static/images/docs/language-flow-type-coverage-inline.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-type-coverage.png b/docs/static/images/docs/language-flow-type-coverage.png deleted file mode 100644 index 37585732fa..0000000000 Binary files a/docs/static/images/docs/language-flow-type-coverage.png and /dev/null differ diff --git a/docs/static/images/docs/language-flow-typehint.png b/docs/static/images/docs/language-flow-typehint.png deleted file mode 100644 index 82cc91d778..0000000000 Binary files a/docs/static/images/docs/language-flow-typehint.png and /dev/null differ diff --git a/docs/static/images/docs/language-graphql-autocomplete.png b/docs/static/images/docs/language-graphql-autocomplete.png deleted file mode 100644 index 8369784803..0000000000 Binary files a/docs/static/images/docs/language-graphql-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/language-graphql-context-view.png b/docs/static/images/docs/language-graphql-context-view.png deleted file mode 100644 index bd33e5fc64..0000000000 Binary files a/docs/static/images/docs/language-graphql-context-view.png and /dev/null differ diff --git a/docs/static/images/docs/language-graphql-definitionjump.png b/docs/static/images/docs/language-graphql-definitionjump.png deleted file mode 100644 index a077cea57b..0000000000 Binary files a/docs/static/images/docs/language-graphql-definitionjump.png and /dev/null differ diff --git a/docs/static/images/docs/language-graphql-diagnostics-pane.png b/docs/static/images/docs/language-graphql-diagnostics-pane.png deleted file mode 100644 index 43c1cc21fc..0000000000 Binary files a/docs/static/images/docs/language-graphql-diagnostics-pane.png and /dev/null differ diff --git a/docs/static/images/docs/language-graphql-gotodefinition.png b/docs/static/images/docs/language-graphql-gotodefinition.png deleted file mode 100644 index 4d6cc56021..0000000000 Binary files a/docs/static/images/docs/language-graphql-gotodefinition.png and /dev/null differ diff --git a/docs/static/images/docs/language-graphql-inline-error.png b/docs/static/images/docs/language-graphql-inline-error.png deleted file mode 100644 index 78a26d799c..0000000000 Binary files a/docs/static/images/docs/language-graphql-inline-error.png and /dev/null differ diff --git a/docs/static/images/docs/language-graphql-outline-view.png b/docs/static/images/docs/language-graphql-outline-view.png deleted file mode 100644 index ddb93fe2f2..0000000000 Binary files a/docs/static/images/docs/language-graphql-outline-view.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-autocomplete.png b/docs/static/images/docs/language-hack-autocomplete.png deleted file mode 100644 index 1c8341b3aa..0000000000 Binary files a/docs/static/images/docs/language-hack-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-badly-formatted.png b/docs/static/images/docs/language-hack-badly-formatted.png deleted file mode 100644 index c7d3f9229d..0000000000 Binary files a/docs/static/images/docs/language-hack-badly-formatted.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-code-diagnostics-gutter.png b/docs/static/images/docs/language-hack-code-diagnostics-gutter.png deleted file mode 100644 index f1af2d1970..0000000000 Binary files a/docs/static/images/docs/language-hack-code-diagnostics-gutter.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-code-diagnostics.png b/docs/static/images/docs/language-hack-code-diagnostics.png deleted file mode 100644 index 7042893b14..0000000000 Binary files a/docs/static/images/docs/language-hack-code-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-jump-to-definition-link.png b/docs/static/images/docs/language-hack-jump-to-definition-link.png deleted file mode 100644 index 7b6f9a3440..0000000000 Binary files a/docs/static/images/docs/language-hack-jump-to-definition-link.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-jump-to-definition-result.png b/docs/static/images/docs/language-hack-jump-to-definition-result.png deleted file mode 100644 index be64f9c25c..0000000000 Binary files a/docs/static/images/docs/language-hack-jump-to-definition-result.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-pinned-typehint.png b/docs/static/images/docs/language-hack-pinned-typehint.png deleted file mode 100644 index 17161f9784..0000000000 Binary files a/docs/static/images/docs/language-hack-pinned-typehint.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-type-coverage-inline.png b/docs/static/images/docs/language-hack-type-coverage-inline.png deleted file mode 100644 index dab2585e72..0000000000 Binary files a/docs/static/images/docs/language-hack-type-coverage-inline.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-type-coverage.png b/docs/static/images/docs/language-hack-type-coverage.png deleted file mode 100644 index c664e62874..0000000000 Binary files a/docs/static/images/docs/language-hack-type-coverage.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-typehint.png b/docs/static/images/docs/language-hack-typehint.png deleted file mode 100644 index 0184cd8c3e..0000000000 Binary files a/docs/static/images/docs/language-hack-typehint.png and /dev/null differ diff --git a/docs/static/images/docs/language-hack-well-formatted.png b/docs/static/images/docs/language-hack-well-formatted.png deleted file mode 100644 index e6360af631..0000000000 Binary files a/docs/static/images/docs/language-hack-well-formatted.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-after-bracket-insert.png b/docs/static/images/docs/language-objc-after-bracket-insert.png deleted file mode 100644 index af847c75e7..0000000000 Binary files a/docs/static/images/docs/language-objc-after-bracket-insert.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-after-colon-indent.png b/docs/static/images/docs/language-objc-after-colon-indent.png deleted file mode 100644 index f8a23978df..0000000000 Binary files a/docs/static/images/docs/language-objc-after-colon-indent.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-auto-bracket-completion-setting.png b/docs/static/images/docs/language-objc-auto-bracket-completion-setting.png deleted file mode 100644 index 73e1be7311..0000000000 Binary files a/docs/static/images/docs/language-objc-auto-bracket-completion-setting.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-autocomplete.png b/docs/static/images/docs/language-objc-autocomplete.png deleted file mode 100644 index 7b4dbe2b1f..0000000000 Binary files a/docs/static/images/docs/language-objc-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-before-bracket-insert.png b/docs/static/images/docs/language-objc-before-bracket-insert.png deleted file mode 100644 index 53665b786e..0000000000 Binary files a/docs/static/images/docs/language-objc-before-bracket-insert.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-before-colon-indent.png b/docs/static/images/docs/language-objc-before-colon-indent.png deleted file mode 100644 index 8826969217..0000000000 Binary files a/docs/static/images/docs/language-objc-before-colon-indent.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-code-diagnostics.png b/docs/static/images/docs/language-objc-code-diagnostics.png deleted file mode 100644 index cf44c30670..0000000000 Binary files a/docs/static/images/docs/language-objc-code-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-jump-to-definition-link.png b/docs/static/images/docs/language-objc-jump-to-definition-link.png deleted file mode 100644 index b846a213ca..0000000000 Binary files a/docs/static/images/docs/language-objc-jump-to-definition-link.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-jump-to-definition-result.png b/docs/static/images/docs/language-objc-jump-to-definition-result.png deleted file mode 100644 index 3d7d1d04e6..0000000000 Binary files a/docs/static/images/docs/language-objc-jump-to-definition-result.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-lint-gutter.png b/docs/static/images/docs/language-objc-lint-gutter.png deleted file mode 100644 index c3f8a06fb9..0000000000 Binary files a/docs/static/images/docs/language-objc-lint-gutter.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-pinned-typehint.png b/docs/static/images/docs/language-objc-pinned-typehint.png deleted file mode 100644 index 45f16c7492..0000000000 Binary files a/docs/static/images/docs/language-objc-pinned-typehint.png and /dev/null differ diff --git a/docs/static/images/docs/language-objc-typehint.png b/docs/static/images/docs/language-objc-typehint.png deleted file mode 100644 index 3c6e349fe4..0000000000 Binary files a/docs/static/images/docs/language-objc-typehint.png and /dev/null differ diff --git a/docs/static/images/docs/language-python-autocomplete.png b/docs/static/images/docs/language-python-autocomplete.png deleted file mode 100644 index 3964af52bb..0000000000 Binary files a/docs/static/images/docs/language-python-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/language-python-code-diagnostics.png b/docs/static/images/docs/language-python-code-diagnostics.png deleted file mode 100644 index 6258a11cb5..0000000000 Binary files a/docs/static/images/docs/language-python-code-diagnostics.png and /dev/null differ diff --git a/docs/static/images/docs/language-python-code-format-after.png b/docs/static/images/docs/language-python-code-format-after.png deleted file mode 100644 index c72bf88e1f..0000000000 Binary files a/docs/static/images/docs/language-python-code-format-after.png and /dev/null differ diff --git a/docs/static/images/docs/language-python-code-format-before.png b/docs/static/images/docs/language-python-code-format-before.png deleted file mode 100644 index 3655f81b1b..0000000000 Binary files a/docs/static/images/docs/language-python-code-format-before.png and /dev/null differ diff --git a/docs/static/images/docs/language-python-jump-to-definition-link.png b/docs/static/images/docs/language-python-jump-to-definition-link.png deleted file mode 100644 index f05c4b4ad1..0000000000 Binary files a/docs/static/images/docs/language-python-jump-to-definition-link.png and /dev/null differ diff --git a/docs/static/images/docs/language-python-jump-to-definition-result.png b/docs/static/images/docs/language-python-jump-to-definition-result.png deleted file mode 100644 index ab265880fe..0000000000 Binary files a/docs/static/images/docs/language-python-jump-to-definition-result.png and /dev/null differ diff --git a/docs/static/images/docs/language-python-outline-view.png b/docs/static/images/docs/language-python-outline-view.png deleted file mode 100644 index 1e9f64bd49..0000000000 Binary files a/docs/static/images/docs/language-python-outline-view.png and /dev/null differ diff --git a/docs/static/images/docs/language-swift-autocompletion.png b/docs/static/images/docs/language-swift-autocompletion.png deleted file mode 100644 index a5a6d5b21c..0000000000 Binary files a/docs/static/images/docs/language-swift-autocompletion.png and /dev/null differ diff --git a/docs/static/images/docs/language-swift-toolchain-path-setting.png b/docs/static/images/docs/language-swift-toolchain-path-setting.png deleted file mode 100644 index 498f468518..0000000000 Binary files a/docs/static/images/docs/language-swift-toolchain-path-setting.png and /dev/null differ diff --git a/docs/static/images/docs/platform-android-simulator-output.png b/docs/static/images/docs/platform-android-simulator-output.png deleted file mode 100644 index 0cae1613dc..0000000000 Binary files a/docs/static/images/docs/platform-android-simulator-output.png and /dev/null differ diff --git a/docs/static/images/docs/platform-android-toggle-simulator.png b/docs/static/images/docs/platform-android-toggle-simulator.png deleted file mode 100644 index efc6ae71a1..0000000000 Binary files a/docs/static/images/docs/platform-android-toggle-simulator.png and /dev/null differ diff --git a/docs/static/images/docs/platform-ios-buck-build.png b/docs/static/images/docs/platform-ios-buck-build.png deleted file mode 100644 index 2c7742ecd0..0000000000 Binary files a/docs/static/images/docs/platform-ios-buck-build.png and /dev/null differ diff --git a/docs/static/images/docs/platform-ios-native-autocomplete.png b/docs/static/images/docs/platform-ios-native-autocomplete.png deleted file mode 100644 index a4ae52d973..0000000000 Binary files a/docs/static/images/docs/platform-ios-native-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/platform-ios-simulator-output.png b/docs/static/images/docs/platform-ios-simulator-output.png deleted file mode 100644 index a37a26f3c9..0000000000 Binary files a/docs/static/images/docs/platform-ios-simulator-output.png and /dev/null differ diff --git a/docs/static/images/docs/platform-ios-toggle-simulator.png b/docs/static/images/docs/platform-ios-toggle-simulator.png deleted file mode 100644 index 254d19b2b3..0000000000 Binary files a/docs/static/images/docs/platform-ios-toggle-simulator.png and /dev/null differ diff --git a/docs/static/images/docs/platform-react-native-debugger-ex.png b/docs/static/images/docs/platform-react-native-debugger-ex.png deleted file mode 100644 index fcc1a82d7c..0000000000 Binary files a/docs/static/images/docs/platform-react-native-debugger-ex.png and /dev/null differ diff --git a/docs/static/images/docs/platform-react-native-element-inspector.png b/docs/static/images/docs/platform-react-native-element-inspector.png deleted file mode 100644 index 89b3db5652..0000000000 Binary files a/docs/static/images/docs/platform-react-native-element-inspector.png and /dev/null differ diff --git a/docs/static/images/docs/platform-react-native-feature-autocomplete.png b/docs/static/images/docs/platform-react-native-feature-autocomplete.png deleted file mode 100644 index 2db25bb7ff..0000000000 Binary files a/docs/static/images/docs/platform-react-native-feature-autocomplete.png and /dev/null differ diff --git a/docs/static/images/docs/platform-react-native-show-inspector.png b/docs/static/images/docs/platform-react-native-show-inspector.png deleted file mode 100644 index 25801a05c6..0000000000 Binary files a/docs/static/images/docs/platform-react-native-show-inspector.png and /dev/null differ diff --git a/docs/static/images/docs/platform-react-native-start-packager.png b/docs/static/images/docs/platform-react-native-start-packager.png deleted file mode 100644 index 09d9ee5058..0000000000 Binary files a/docs/static/images/docs/platform-react-native-start-packager.png and /dev/null differ diff --git a/docs/static/images/docs/promo-debugger.png b/docs/static/images/docs/promo-debugger.png deleted file mode 100644 index b071518e1d..0000000000 Binary files a/docs/static/images/docs/promo-debugger.png and /dev/null differ diff --git a/docs/static/images/docs/promo-flow.png b/docs/static/images/docs/promo-flow.png deleted file mode 100644 index edf4035a8a..0000000000 Binary files a/docs/static/images/docs/promo-flow.png and /dev/null differ diff --git a/docs/static/images/docs/promo-hack.png b/docs/static/images/docs/promo-hack.png deleted file mode 100644 index 3eb4d3cf5f..0000000000 Binary files a/docs/static/images/docs/promo-hack.png and /dev/null differ diff --git a/docs/static/images/docs/promo-mercurial.png b/docs/static/images/docs/promo-mercurial.png deleted file mode 100644 index 1bef66ebd8..0000000000 Binary files a/docs/static/images/docs/promo-mercurial.png and /dev/null differ diff --git a/docs/static/images/docs/promo-remote-development.png b/docs/static/images/docs/promo-remote-development.png deleted file mode 100644 index a1004843e9..0000000000 Binary files a/docs/static/images/docs/promo-remote-development.png and /dev/null differ diff --git a/docs/static/images/docs/promo-task-runner.png b/docs/static/images/docs/promo-task-runner.png deleted file mode 100644 index 179dd9868e..0000000000 Binary files a/docs/static/images/docs/promo-task-runner.png and /dev/null differ diff --git a/docs/static/images/docs/promo-working-sets.png b/docs/static/images/docs/promo-working-sets.png deleted file mode 100644 index e4b92fed15..0000000000 Binary files a/docs/static/images/docs/promo-working-sets.png and /dev/null differ diff --git a/docs/static/images/docs/quick-start-getting-started-add-project.png b/docs/static/images/docs/quick-start-getting-started-add-project.png deleted file mode 100644 index 73a43ed6f2..0000000000 Binary files a/docs/static/images/docs/quick-start-getting-started-add-project.png and /dev/null differ diff --git a/docs/static/images/docs/quick-start-getting-started-file-tree-view.png b/docs/static/images/docs/quick-start-getting-started-file-tree-view.png deleted file mode 100644 index 350a97774d..0000000000 Binary files a/docs/static/images/docs/quick-start-getting-started-file-tree-view.png and /dev/null differ diff --git a/docs/static/images/docs/quick-start-getting-started-home.png b/docs/static/images/docs/quick-start-getting-started-home.png deleted file mode 100644 index e81c05ee4d..0000000000 Binary files a/docs/static/images/docs/quick-start-getting-started-home.png and /dev/null differ diff --git a/docs/static/images/docs/quick-start-getting-started-quick-launch-menu.png b/docs/static/images/docs/quick-start-getting-started-quick-launch-menu.png deleted file mode 100644 index f3d59ef911..0000000000 Binary files a/docs/static/images/docs/quick-start-getting-started-quick-launch-menu.png and /dev/null differ diff --git a/docs/static/images/docs/quick-start-getting-started-quick-open.png b/docs/static/images/docs/quick-start-getting-started-quick-open.png deleted file mode 100644 index da11b2650f..0000000000 Binary files a/docs/static/images/docs/quick-start-getting-started-quick-open.png and /dev/null differ diff --git a/docs/static/images/docs/quick-start-getting-started-remote-connection-dialog.png b/docs/static/images/docs/quick-start-getting-started-remote-connection-dialog.png deleted file mode 100644 index acc22a73a4..0000000000 Binary files a/docs/static/images/docs/quick-start-getting-started-remote-connection-dialog.png and /dev/null differ diff --git a/docs/static/images/help/troubleshooting-flow-executable-setting.png b/docs/static/images/help/troubleshooting-flow-executable-setting.png deleted file mode 100644 index 5eee008387..0000000000 Binary files a/docs/static/images/help/troubleshooting-flow-executable-setting.png and /dev/null differ diff --git a/docs/static/images/help/troubleshooting-module-not-found.png b/docs/static/images/help/troubleshooting-module-not-found.png deleted file mode 100644 index 43fd988ff9..0000000000 Binary files a/docs/static/images/help/troubleshooting-module-not-found.png and /dev/null differ diff --git a/docs/static/logo.png b/docs/static/logo.png deleted file mode 100644 index bc43aaf81c..0000000000 Binary files a/docs/static/logo.png and /dev/null differ diff --git a/docs/static/logo_nav.png b/docs/static/logo_nav.png deleted file mode 100644 index 0ac0eed7cb..0000000000 Binary files a/docs/static/logo_nav.png and /dev/null differ diff --git a/docs/static/og_image.png b/docs/static/og_image.png deleted file mode 100644 index 79c013f322..0000000000 Binary files a/docs/static/og_image.png and /dev/null differ diff --git a/docs/static/oss_logo.png b/docs/static/oss_logo.png deleted file mode 100644 index 8183e289b1..0000000000 Binary files a/docs/static/oss_logo.png and /dev/null differ diff --git a/docs/static/search.png b/docs/static/search.png deleted file mode 100644 index 222fb660da..0000000000 Binary files a/docs/static/search.png and /dev/null differ diff --git a/flow-libs/_NO_GLOBALS.flow.js b/flow-libs/_NO_GLOBALS.flow.js deleted file mode 100644 index 6a76f3b922..0000000000 --- a/flow-libs/_NO_GLOBALS.flow.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -/* eslint-disable no-undef */ - -// This is a hack. The react-redux libdefs are leaking a global Store and Dispatch. Until we fix it -// upstream (https://github.com/flow-typed/flow-typed/pull/2606), we'll shadow their types to make -// sure we don't use them when we forget to import ours with the same name. -declare type _DO_NOT_USE_ME_YOU_FORGOT_AN_IMPORT = empty; -declare type Store = _DO_NOT_USE_ME_YOU_FORGOT_AN_IMPORT; -declare type Dispatch = _DO_NOT_USE_ME_YOU_FORGOT_AN_IMPORT; diff --git a/flow-libs/adm-zip.js.flow b/flow-libs/adm-zip.js.flow deleted file mode 100644 index bb785b19bd..0000000000 --- a/flow-libs/adm-zip.js.flow +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -declare module 'adm-zip' { - declare class ZipEntry { - entryName: string, - +rawEntryName: string, - extra: Buffer, - comment: string, - +name: string, - isDirectory: boolean, - getCompressedData(): Buffer, - getCompressedDataAsync(callback: (data: Buffer) => mixed): void, - setData(value: Buffer | string): void, - getData(password?: string): Buffer, - getDataAsync(callback: (data: Buffer) => mixed, password?: string): void, - attr: number, - header: Buffer, - packHeader(): Buffer, - toString(): string, - } - - declare class ZipFile { - /** - * Returns an array of ZipEntry objects existent in the current opened archive - * @return Array - */ - +entries: Array, - - /** - * Archive comment - * @return {String} - */ - comment: string, - - /** - * Returns a reference to the entry with the given name or null if entry is inexistent - * - * @param entryName - * @return ZipEntry - */ - getEntry(entryName: string): ZipEntry, - - /** - * Adds the given entry to the entry list - * - * @param entry - */ - setEntry(entry: ZipEntry): void, - - /** - * Removes the entry with the given name from the entry list. - * - * If the entry is a directory, then all nested files and directories will be removed - * @param entryName - */ - deleteEntry(entryName: string): void, - - /** - * Iterates and returns all nested files and directories of the given entry - * - * @param entry - * @return Array - */ - getEntryChildren(entry: ZipEntry): Array, - - /** - * Returns the zip file - * - * @return Buffer - */ - compressToBuffer(): Buffer, - - toAsyncBuffer(onSuccess: (out: Buffer)=>mixed, onFail: Function, onItemStart: (name: string)=>mixed, onItemEnd: (name: string)=>mixed): void, - } - - declare class AdmZip { - constructor(): void, - constructor(file: string): void, - constructor(zipData: Buffer): void, - /** - * Extracts the given entry from the archive and returns the content as a Buffer object - * @param entry ZipEntry object or String with the full path of the entry - * - * @return Buffer or Null in case of error - */ - readFile(entry: ZipEntry | string): Buffer, - - /** - * Asynchronous readFile - * @param entry ZipEntry object or String with the full path of the entry - * @param callback - * - * @return Buffer or Null in case of error - */ - readFileAsync(entry: ZipEntry | string, callback: (data: ?Buffer, error: string)=>void): ?Buffer, - - /** - * Extracts the given entry from the archive and returns the content as plain text in the given encoding - * @param entry ZipEntry object or String with the full path of the entry - * @param encoding Optional. If no encoding is specified utf8 is used - * - * @return String - */ - readAsText(entry: ZipEntry | string, encoding?: string): string, - - /** - * Asynchronous readAsText - * @param entry ZipEntry object or String with the full path of the entry - * @param callback - * @param encoding Optional. If no encoding is specified utf8 is used - * - * @return String - */ - readAsTextAsync(entry: ZipEntry | string, callback: (text: string) => mixed, encoding?: string): string, - - /** - * Remove the entry from the file or the entry and all it's nested directories and files if the given entry is a directory - * - * @param entry - */ - deleteFile(entry: ZipEntry | string): void, - - /** - * Adds a comment to the zip. The zip must be rewritten after adding the comment. - * - * @param comment - */ - addZipComment(comment: Buffer): void, - - /** - * Returns the zip comment - * - * @return String - */ - getZipComment(): string, - - /** - * Adds a comment to a specified zipEntry. The zip must be rewritten after adding the comment - * The comment cannot exceed 65535 characters in length - * - * @param entry - * @param comment - */ - addZipEntryComment(entry: ZipEntry, comment: string): void, - - /** - * Returns the comment of the specified entry - * - * @param entry - * @return String - */ - getZipEntryComment(entry: ZipEntry): string, - - /** - * Updates the content of an existing entry inside the archive. The zip must be rewritten after updating the content - * - * @param entry - * @param content - */ - updateFile(entry: ZipEntry, content: Buffer): void, - - /** - * Adds a file from the disk to the archive - * - * @param localPath - */ - addLocalFile(localPath: string, zipPath?: string, zipName?: string): void, - - /** - * Adds a local directory and all its nested files and directories to the archive - * - * @param localPath - * @param zipPath optional path inside zip - * @param filter optional RegExp or Function if files match will - * be included. - */ - addLocalFolder(localPath: string, zipPath?: string, filter?: RegExp | ((string)=>boolean)): void, - - /** - * Allows you to create a entry (file or directory) in the zip file. - * If you want to create a directory the entryName must end in / and a null buffer should be provided. - * Comment and attributes are optional - * - * @param entryName - * @param content - * @param comment - * @param attr - */ - addFile(entryName: string, content: Buffer | null, comment?: string, attr?: number): void, - - /** - * Returns an array of ZipEntry objects representing the files and folders inside the archive - * - * @return Array - */ - getEntries(): Array, - - /** - * Returns a ZipEntry object representing the file or folder specified by ``name``. - * - * @param name - * @return ZipEntry - */ - getEntry(name: string): ZipEntry, - - /** - * Extracts the given entry to the given targetPath - * If the entry is a directory inside the archive, the entire directory and it's subdirectories will be extracted - * - * @param entry ZipEntry object or String with the full path of the entry - * @param targetPath Target folder where to write the file - * @param maintainEntryPath If maintainEntryPath is true and the entry is inside a folder, the entry folder - * will be created in targetPath as well. Default is TRUE - * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true. - * Default is FALSE - * - * @return Boolean - */ - extractEntryTo(entry: ZipEntry | string, targetPath: string, maintainEntryPath?: boolean, overwrite?: boolean): boolean, - - /** - * Extracts the entire archive to the given location - * - * @param targetPath Target location - * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true. - * Default is FALSE - */ - extractAllTo(targetPath: string, overwrite?: boolean): void, - - /** - * Asynchronous extractAllTo - * - * @param targetPath Target location - * @param overwrite If the file already exists at the target path, the file will be overwriten if this is true. - * Default is FALSE - * @param callback - */ - extractAllToAsync(targetPath: string, overwrite?: boolean, callback: (err: ?Error) => mixed): void, - - /** - * Writes the newly created zip file to disk at the specified location or if a zip was opened and no ``targetFileName`` is provided, it will overwrite the opened zip - * - * @param targetFileName - * @param callback - */ - writeZip(targetFileName: string, callback: (err: ?Error) => mixed): void, - - /** - * Returns the content of the entire zip file as a Buffer object - * - * @return Buffer - */ - toBuffer(onSuccess: (out: Buffer)=>mixed, onFail: Function, onItemStart: (name: string)=>mixed, onItemEnd: (name: string)=>mixed): Buffer, - } - - declare export default (data?: Buffer | string) => AdmZip; -} diff --git a/flow-libs/archiver.js.flow b/flow-libs/archiver.js.flow deleted file mode 100644 index 3126d3243c..0000000000 --- a/flow-libs/archiver.js.flow +++ /dev/null @@ -1,110 +0,0 @@ -/** - * From https://github.com/flow-typed/flow-typed/blob/master/definitions/npm/archiver_v2.x.x/flow_v0.54.x-/archiver_v2.x.x.js - * - */ -declare module "archiver" { - import type { Stats } from "fs"; - - declare export type Format = "zip" | "tar"; - - declare export type EntryData = { - name?: string, - prefix?: string, - stats?: Stats, - date?: Date | string, - mode?: number - }; - - declare export type EntryDataFunction = (entry: EntryData) => false | EntryData; - - declare export type CoreOptions = {| - statConcurrency?: number - |}; - - declare export type TransformOptions = {| - allowHalfOpen?: boolean, - readableObjectMode?: boolean, - writeableObjectMode?: boolean, - decodeStrings?: boolean, - encoding?: string, - highWaterMark?: number, - objectmode?: boolean - |}; - - declare export type ZipOptions = {| - comment?: string, - forceLocalTime?: boolean, - forceZip64?: boolean, - store?: boolean, - zlib?: zlib$options - |}; - - declare export type TarOptions = {| - gzip?: boolean, - gzipOptions?: zlib$options - |}; - - declare export type GlobOptions = {| - cwd?: string, - root?: string, - dot?: boolean, - nomount?: boolean, - mark?: boolean, - nosort?: boolean, - stat?: boolean, - silent?: boolean, - strict?: boolean, - cache?: boolean, - statCache?: { [string]: Stats }, - symlinks?: { [string]: boolean }, - sync?: boolean, - nounique?: boolean, - nonull?: boolean, - debug?: boolean, - nobrace?: boolean, - noglobstar?: boolean, - noext?: boolean, - nocase?: boolean, - matchBase?: boolean, - nodir?: boolean, - ignore?: string | Array, - follow?: boolean, - realpath?: boolean, - nonegate?: boolean, - nocomment?: boolean, - absolute?: boolean - |}; - - declare export type ArchiverOptions = {| - ...CoreOptions, - ...TransformOptions, - ...ZipOptions, - ...TarOptions - |}; - - declare export class Archiver extends stream$Transform { - abort(): this; - append(source: stream$Readable | Buffer | string, name?: EntryData): this; - directory( - dirpath: string, - destpath: false | string, - data?: EntryData | EntryDataFunction - ): this; - file(filename: string, data: EntryData): this; - glob(pattern: string, options?: GlobOptions, data?: EntryData): this; - finalize(): Promise; - setFormat(format: string): this; - setModule(module: Function): this; - pointer(): number; - use(plugin: Function): this; - symlink(filepath: string, target: string): this; - } - - declare type Vending = { - (format: Format, options?: ArchiverOptions): Archiver, - create(format: string, options?: ArchiverOptions): Archiver, - registerFormat(format: string, module: Function): void - }; - - declare export default Vending; -} diff --git a/flow-libs/atom-jasmine.js.flow b/flow-libs/atom-jasmine.js.flow deleted file mode 100644 index b4cd47bae6..0000000000 --- a/flow-libs/atom-jasmine.js.flow +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -// Type declarations for Atom's extensions to Jasmine v1.3 -// https://github.com/atom/atom/blob/master/spec/spec-helper.coffee - -/** Note that waitsForPromise has an optional first argument. */ -declare function waitsForPromise( - optionsOrFunc: {timeout?: number, shouldReject?: boolean, label?: string} | () => Promise, - func?: () => Promise -): void; - -/** - * deltaInMilliseconds defaults to 1. - */ -declare function advanceClock(deltaInMilliseconds?: number): void; diff --git a/flow-libs/atom.js.flow b/flow-libs/atom.js.flow deleted file mode 100644 index 47ead0886b..0000000000 --- a/flow-libs/atom.js.flow +++ /dev/null @@ -1,2236 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -/** - * Private Classes - */ - -// Octicons v4.4.0. List extracted from the atom-styleguide package. -type atom$Octicon = 'alert' | 'alignment-align' | 'alignment-aligned-to' | 'alignment-unalign' | - 'arrow-down' | 'arrow-left' | 'arrow-right' | 'arrow-small-down' | 'arrow-small-left' | - 'arrow-small-right' | 'arrow-small-up' | 'arrow-up' | 'beaker' | 'beer' | 'bell' | 'bold' | - 'book' | 'bookmark' | 'briefcase' | 'broadcast' | 'browser' | 'bug' | 'calendar' | 'check' | - 'checklist' | 'chevron-down' | 'chevron-left' | 'chevron-right' | 'chevron-up' | 'circle-slash' | - 'circuit-board' | 'clippy' | 'clock' | 'cloud-download' | 'cloud-upload' | 'code' | 'color-mode' | - 'comment' | 'comment-add' | 'comment-discussion' | 'credit-card' | 'dash' | 'dashboard' | - 'database' | 'desktop-download' | 'device-camera' | 'device-camera-video' | 'device-desktop' | - 'device-mobile' | 'diff' | 'diff-added' | 'diff-ignored' | 'diff-modified' | 'diff-removed' | - 'diff-renamed' | 'ellipses' | 'ellipsis' | 'eye' | 'eye-unwatch' | 'eye-watch' | 'file' | - 'file-add' | 'file-binary' | 'file-code' | 'file-directory' | 'file-directory-create' | - 'file-media' | 'file-pdf' | 'file-submodule' | 'file-symlink-directory' | 'file-symlink-file' | - 'file-text' | 'file-zip' | 'flame' | 'fold' | 'gear' | 'gift' | 'gist' | 'gist-fork' | - 'gist-new' | 'gist-private' | 'gist-secret' | 'git-branch' | 'git-branch-create' | - 'git-branch-delete' | 'git-commit' | 'git-compare' | 'git-fork-private' | 'git-merge' | - 'git-pull-request' | 'git-pull-request-abandoned' | 'globe' | 'grabber' | 'graph' | 'heart' | - 'history' | 'home' | 'horizontal-rule' | 'hourglass' | 'hubot' | 'inbox' | 'info' | - 'issue-closed' | 'issue-opened' | 'issue-reopened' | 'italic' | 'jersey' | 'jump-down' | - 'jump-left' | 'jump-right' | 'jump-up' | 'key' | 'keyboard' | 'law' | 'light-bulb' | 'link' | - 'link-external' | 'list-ordered' | 'list-unordered' | 'location' | 'lock' | 'log-in' | 'log-out' | - 'logo-gist' | 'logo-github' | 'mail' | 'mail-read' | 'mail-reply' | 'mark-github' | 'markdown' | - 'megaphone' | 'mention' | 'microscope' | 'milestone' | 'mirror' | 'mirror-private' | - 'mirror-public' | 'mortar-board' | 'move-down' | 'move-left' | 'move-right' | 'move-up' | 'mute' | - 'no-newline' | 'octoface' | 'organization' | 'package' | 'paintcan' | 'pencil' | 'person' | - 'person-add' | 'person-follow' | 'pin' | 'playback-fast-forward' | 'playback-pause' | - 'playback-play' | 'playback-rewind' | 'plug' | 'plus-small' | 'plus' | 'podium' | - 'primitive-dot' | 'primitive-square' | 'pulse' | 'puzzle' | 'question' | 'quote' | 'radio-tower' | - 'remove-close' | 'reply' | 'repo' | 'repo-clone' | 'repo-create' | 'repo-delete' | - 'repo-force-push' | 'repo-forked' | 'repo-pull' | 'repo-push' | 'repo-sync' | 'rocket' | 'rss' | - 'ruby' | 'screen-full' | 'screen-normal' | 'search' | 'search-save' | 'server' | 'settings' | - 'shield' | 'sign-in' | 'sign-out' | 'smiley' | 'split' | 'squirrel' | 'star' | 'star-add' | - 'star-delete' | 'steps' | 'stop' | 'sync' | 'tag' | 'tag-add' | 'tag-remove' | 'tasklist' | - 'telescope' | 'terminal' | 'text-size' | 'three-bars' | 'thumbsdown' | 'thumbsup' | 'tools' | - 'trashcan' | 'triangle-down' | 'triangle-left' | 'triangle-right' | 'triangle-up' | 'type-array'| - 'type-boolean'| 'type-class'| 'type-constant'| 'type-constructor'| 'type-enum'| 'type-field'| - 'type-file'| 'type-function'| 'type-interface'| 'type-method'| 'type-module'| 'type-namespace'| - 'type-number'| 'type-package'| 'type-property'| 'type-string'| 'type-variable' | 'unfold' | - 'unmute' | 'unverified' | 'verified' | 'versions' | 'watch' | 'x' | 'zap'; - -type atom$PaneLocation = 'left' | 'right' | 'bottom' | 'center'; - -declare type atom$Color = { - // Returns a String in the form '#abcdef'. - toHexString(): string; - // Returns a String in the form 'rgba(25, 50, 75, .9)'. - toRGBAString(): string; -} - -declare class atom$Model { - destroy(): void, - isDestroyed(): boolean, -} - -declare class atom$Package { - path: string, - activateTime: number, - mainModule: any, - mainModulePath: string, - metadata: Object, - name: string, - loadTime: number, - getType(): 'atom' | 'textmate' | 'theme', - hasActivationCommands(): boolean, - hasActivationHooks(): boolean, - getActivationHooks(): Array, - onDidDeactivate(cb: () => mixed): IDisposable, - activateNow(): void, - // Undocumented - bundledPackage: boolean, - getCanDeferMainModuleRequireStorageKey(): string, - initializeIfNeeded(): void, -} - -/** - * Essential Classes - */ - -declare type atom$CustomEvent = CustomEvent & { - originalEvent?: Event; -} - -type atom$CommandCallback = (event: atom$CustomEvent) => mixed; - -type atom$CommandDescriptor = { - name: string, - displayName: string, - description?: string, - hiddenInCommandPalette?: boolean, - tags?: Array, -}; - -type atom$CommandListener = atom$CommandCallback | { - displayName?: string, - description?: string, - didDispatch: atom$CommandCallback, -}; - -declare class atom$CommandRegistry { - // Methods - add( - target: string | HTMLElement, - commandNameOrCommands: string | {[commandName: string]: atom$CommandListener}, - listener?: atom$CommandListener, - throwOnInvalidSelector?: boolean, - ): IDisposable, - dispatch(target: HTMLElement, commandName: string, detail?: Object): void, - onDidDispatch(callback: (event: atom$CustomEvent) => mixed): IDisposable, - onWillDispatch(callback: (event: atom$CustomEvent) => mixed): IDisposable, - findCommands(opts: {target: Node}): Array, -} - -declare class atom$CompositeDisposable { - constructor(...disposables: Array): void, - dispose(): void, - - add(...disposables: Array): void, - remove(disposable: IDisposable): void, - clear(): void, -} - -type atom$ConfigParams = { - saveCallback?: Object => void, - mainSource?: string, - projectHomeSchema?: atom$ConfigSchema, -}; - -type atom$ConfigType = - 'boolean' | 'string' | 'integer' | 'number' | - 'array' | 'object' | 'color' | 'any'; - -type atom$ConfigSchema = { - default?: mixed, - description?: string, - enum?: Array, - maximum?: number, - minimum?: number, - properties?: Object, - title?: string, - type: Array | atom$ConfigType, -}; - -declare class atom$Config { - defaultSettings: Object, - settings: Object, - - // Config Subscription - observe( - keyPath: string, - optionsOrCallback?: - | {scope?: atom$ScopeDescriptorLike} - | (value: mixed) => void, - callback?: (value: mixed) => mixed, - ): IDisposable, - - onDidChange( - keyPathOrCallback: - | string - | (event: {oldValue: mixed, newValue: mixed}) => mixed, - optionsOrCallback?: - | {scope?: atom$ScopeDescriptorLike} - | (event: {oldValue: mixed, newValue: mixed}) => mixed, - callback?: (event: {oldValue: mixed, newValue: mixed}) => mixed - ): IDisposable, - - // Managing Settings - get( - keyPath?: string, - options?: { - excludeSources?: Array, - sources?: Array, - scope?: atom$ScopeDescriptorLike, - } - ): mixed, - - set( - keyPath: string, - value: ?mixed, - options?: { - scopeSelector?: string, - source?: string, - }, - ): boolean, - - unset( - keyPath: string, - options?: { - scopeSelector?: string, - source?: string, - } - ): void, - - getUserConfigPath(): string, - - // Undocumented Methods - constructor(params?: atom$ConfigParams): atom$Config, - getRawValue(keyPath: ?string, options: {excludeSources?: string, sources?: string}): mixed, - getSchema(keyPath: string): atom$ConfigSchema, - save(): void, - setRawValue(keyPath: string, value: mixed): void, - setSchema( - keyPath: string, - schema: atom$ConfigSchema, - ): void, - removeAtKeyPath(keyPath: ?string, value: ?mixed): mixed, - - // Used by nuclide-config to set the initial settings from disk - resetUserSettings(newSettings: Object, options?: {source?: string}): void, -} - -declare class atom$Cursor { - // Cursor Marker - marker: atom$Marker; - editor: atom$TextEditor; - - // Event Subscription - onDidChangePosition( - callback: (event: { - oldBufferPosition: atom$Point, - oldScreenPosition: atom$Point, - newBufferPosition: atom$Point, - newScreenPosition: atom$Point, - textChanged: boolean, - Cursor: atom$Cursor, - }) => mixed, - ): IDisposable, - - // Managing Cursor Position - getBufferRow(): number, - getBufferColumn(): number, - getBufferPosition(): atom$Point, - - // Cursor Position Details - // Moving the Cursor - moveUp(rowCount: number, {moveToEndOfSelection?: boolean}): void, - moveDown(rowCount: number, {moveToEndOfSelection?: boolean}): void, - - // Local Positions and Ranges - getCurrentWordBufferRange(options?: {wordRegex: RegExp}): atom$Range, - getCurrentWordPrefix(): string, - - // Visibility - // Comparing to another cursor - // Utilities - wordRegExp(options?: {includeNonWordCharacters: boolean}): RegExp, -} - -declare class atom$Decoration { - destroy(): void, - onDidChangeProperties( - callback: (event: {oldProperties: Object, newProperties: Object}) => mixed - ): IDisposable, - onDidDestroy(callback: () => mixed): IDisposable, - getMarker(): atom$Marker, - getProperties(): Object, - setProperties(properties: mixed): void, -} - -declare class atom$DisplayMarkerLayer { - destroy(): void, - clear(): void, - isDestroyed(): boolean, - markBufferPosition(position: atom$PointLike, options?: MarkerOptions): atom$Marker, - markBufferRange(range: atom$Range | atom$RangeLike, options?: MarkerOptions): atom$Marker, - findMarkers(options: MarkerOptions): Array, - getMarkers(): Array, - onDidUpdate(callback: () => mixed): IDisposable -} - -declare class atom$LayerDecoration { - destroy(): void, - isDestroyed(): boolean, - getProperties(): Object, - setProperties(properties: mixed): void, - setPropertiesForMarker(marker: atom$Marker, properties: mixed): void, -} - -declare class atom$Disposable { - constructor(disposalAction?: (...args: Array) => any): void, - disposed: boolean, - dispose(): void, -} - -declare class atom$Emitter { - dispose(): void, - on(name: string, callback: (v: any) => mixed): IDisposable, - once(name: string, callback: (v: any) => mixed): IDisposable, - preempt(name: string, callback: (v: any) => void): IDisposable, - // This is a flow hack to prevent emitting more than one value. - // `EventEmitter` allows emitting any number of values - making this a land - // mine, since we tend to think of `emit` as interchangeable. - // This hack only works if the extra value is not `undefined`, so this isn't - // full-proof, but it works for most cases. - emit(name: string, value: any, ...no_extra_args_allowed: Array): void, -} - -declare class atom$Gutter { - name: string, - destroy(): void, - decorateMarker( - marker: atom$Marker, - options?: {type?: string, 'class'?: string, item?: Object | HTMLElement}, - ): atom$Decoration, - show(): void, - hide(): void, - onDidDestroy(callback: () => void): IDisposable, -} - -declare type atom$MarkerChangeEvent = { - oldHeadScreenPosition: atom$Point, - newHeadScreenPosition: atom$Point, - oldTailScreenPosition: atom$Point, - newTailScreenPosition: atom$Point, - - oldHeadBufferPosition: atom$Point, - newHeadBufferPosition: atom$Point, - oldTailBufferPosition: atom$Point, - newTailBufferPosition: atom$Point, - - isValid: boolean, - textChanged: boolean, -} - -declare class atom$Marker { - destroy(): void, - getBufferRange(): atom$Range, - getStartBufferPosition(): atom$Point, - onDidChange(callback: (event: atom$MarkerChangeEvent) => mixed): IDisposable, - isValid(): boolean, - isDestroyed(): boolean, - onDidDestroy(callback: () => mixed): IDisposable, - getScreenRange(): atom$Range, - setBufferRange( - range: atom$RangeLike, - properties?: {reversed: boolean}, - ): void, - id: number, -} - -declare class atom$ServiceHub { - provide(keyPath: string, version: string, service: T): IDisposable, - consume( - keyPath: string, - versionRange: string, - callback: (provider: T) => mixed - ): IDisposable, -} - -type atom$PackageMetadata = { - name: string, - version: string, -}; - -declare class atom$PackageManager { - +initialPackagesActivated: boolean, - - // Event Subscription - onDidLoadInitialPackages(callback: () => void): IDisposable, - onDidActivateInitialPackages(callback: () => void): IDisposable, - onDidActivatePackage(callback: (pkg: atom$Package) => mixed): IDisposable, - onDidDeactivatePackage(callback: (pkg: atom$Package) => mixed): IDisposable, - onDidLoadPackage(callback: (pkg: atom$Package) => mixed): IDisposable, - onDidUnloadPackage(callback: (pkg: atom$Package) => mixed): IDisposable, - onDidTriggerActivationHook(activationHook: string, callback: () => mixed): IDisposable, - - // Package system data - getApmPath(): string, - getPackageDirPaths(): Array, - - // General package data - resolvePackagePath(name: string): ?string, - isBundledPackage(name: string): boolean, - - // Enabling and disabling packages - enablePackage(name: string): ?atom$Package, - disablePackage(name: string): ?atom$Package, - isPackageDisabled(name: string): boolean, - - // Accessing active packages - getActivePackage(name: string): ?atom$Package, - getActivePackages(): Array, - isPackageActive(name: string): boolean, - hasActivatedInitialPackages(): boolean, - - // Activating and deactivating packages - activatePackage(name: string): Promise, - - // Accessing loaded packages - getLoadedPackage(name: string): ?atom$Package, - getLoadedPackages(): Array, - isPackageLoaded(name: string): boolean, - - // Accessing available packages - getAvailablePackageNames(): Array, - getAvailablePackageMetadata(): Array, - - // (Undocumented.) - activate(): Promise, - deactivatePackages(): Promise, - deactivatePackage(name: string, suppressSerialization?: boolean): Promise, - emitter: atom$Emitter, - loadPackage(name: string): void, - loadPackages(): void, - serializePackage(pkg: atom$Package): void, - serviceHub: atom$ServiceHub, - packageDirPaths: Array, - triggerActivationHook(hook: string): void, - triggerDeferredActivationHooks(): void, - unloadPackage(name: string): void, - unloadPackages(): void, -} - -declare class atom$StyleManager { - // Event Subscription - - // Reading Style Elements - getStyleElements(): Array, - - // Paths - getUserStyleSheetPath(): string, - - // (Undocumented.) - addStyleSheet( - source: string, - params: { - sourcePath?: string, - context?: boolean, - priority?: number, - skipDeprecatedSelectorsTransformation?: boolean - } - ): IDisposable, -} - -type atom$PaneSplitParams = { - copyActiveItem?: boolean, - items?: Array, -}; - -type atom$PaneSplitOrientation = 'horizontal' | 'vertical'; -type atom$PaneSplitSide = 'before' | 'after'; - -// Undocumented class -declare class atom$applicationDelegate { - focusWindow(): Promise, - open(params: { - pathsToOpen: Array, - newWindow?: boolean, - devMode?: boolean, - safeMode?: boolean, - }): void, - - // Used by nuclide-config to replicate atom.config saveCallback - setUserSettings(config: atom$Config, configFilePath: string): Promise; -} - -type atom$PaneParams = { - activeItem?: Object, - applicationDelegate: atom$applicationDelegate, - focused?: boolean, - container: Object, - config: atom$Config, - notificationManager: atom$NotificationManager, - deserializerManager: atom$DeserializerManager, - items?: Array, - itemStackIndices?: Array, - flexScale?: number, -}; - -declare class atom$Pane { - // Items - addItem(item: Object, options?: {index?: number, pending?: boolean}): Object, - getItems(): Array, - getActiveItem(): ?Object, - itemAtIndex(index: number): ?Object, - getActiveItemIndex(): number, - activateItem(item: Object): ?Object, - activateItemAtIndex(index: number): void, - moveItemToPane(item: Object, pane: atom$Pane, index: number): void, - destroyItem(item: Object, force?: boolean): Promise, - itemForURI(uri: string): Object, - - // Event subscriptions. - onDidAddItem(cb: (event: {item: Object, index: number}) => void): IDisposable, - onDidRemoveItem(cb: (event: {item: Object, index: number}) => void): IDisposable, - onWillRemoveItem(cb: (event: {item: Object, index: number}) => void): IDisposable, - onDidDestroy(cb: () => mixed): IDisposable, - onDidChangeFlexScale(cb: (newFlexScale: number) => void): IDisposable, - onWillDestroy(cb: () => void): IDisposable, - observeActiveItem(cb: (item: ?Object) => void): IDisposable, - - // Lifecycle - isActive(): boolean, - activate(): void, - destroy(): void, - isDestroyed(): void, - - // Splitting - splitLeft(params?: atom$PaneSplitParams): atom$Pane, - splitRight(params?: atom$PaneSplitParams): atom$Pane, - splitUp(params?: atom$PaneSplitParams): atom$Pane, - splitDown(params?: atom$PaneSplitParams): atom$Pane, - split( - orientation: atom$PaneSplitOrientation, - side: atom$PaneSplitSide, - params?: atom$PaneSplitParams, - ): atom$Pane, - - // Undocumented Methods - constructor(params: atom$PaneParams): atom$Pane, - getPendingItem(): atom$PaneItem, - setPendingItem(item: atom$PaneItem): void, - clearPendingItem(): void, - getFlexScale(): number, - getElement(): HTMLElement, - getParent(): Object, - removeItem(item: Object, moved: ?boolean): void, - setActiveItem(item: Object): Object, - setFlexScale(flexScale: number): number, - getContainer(): atom$PaneContainer, - - element: HTMLElement, -} - -declare interface atom$PaneItem { - // These are all covariant, meaning that these props are read-only. Therefore we can assign an - // object with more strict requirements to an variable of this type. - +getTitle: () => string, - +getLongTitle?: () => string, - +getIconName?: () => string, - +getURI?: () => ?string, - +onDidChangeIcon?: (cb: (icon: string) => void) => IDisposable, - +onDidChangeTitle?: (cb: (title: string) => void) => IDisposable, - +onDidTerminatePendingState?: (() => mixed) => IDisposable; - +serialize?: () => Object, - +terminatePendingState?: () => void, -} - -// Undocumented class -declare class atom$PaneAxis { - getFlexScale(): number, - setFlexScale(flexScale: number): number, - getItems(): Array, -} - -// Undocumented class -// Note that this is not the same object returned by `atom.workspace.getPaneContainers()`. (Those -// are typed here as AbstractPaneContainers and, in the current implementation, wrap these.) -declare class atom$PaneContainer { - constructor({ - config: atom$Config, - applicationDelegate: atom$applicationDelegate, - notificationManager: atom$NotificationManager, - deserializerManager: atom$DeserializerManager, - }): atom$PaneContainer, - destroy(): void, - getActivePane(): atom$Pane, - getActivePaneItem(): ?Object, - getLocation(): atom$PaneLocation, - getPanes(): Array, - getPaneItems(): Array, - observePanes(cb: (pane: atom$Pane) => void): IDisposable, - onDidAddPane(cb: (event: {pane: atom$Pane}) => void): IDisposable, - onDidDestroyPane(cb: (event: {pane: atom$Pane}) => void): IDisposable, - onWillDestroyPane(cb: (event: {pane: atom$Pane}) => void): IDisposable, - onDidAddPaneItem(cb: (item: atom$PaneItem) => void): IDisposable, - onDidDestroyPaneItem(cb: (item: atom$Pane) => void): IDisposable, - paneForItem(item: Object): ?atom$Pane, - serialize(): Object, -} - -declare class atom$Panel { - // Construction and Destruction - destroy(): void, - - // Event Subscription - onDidChangeVisible(callback: (visible: boolean) => any): IDisposable, - onDidDestroy(callback: (panel: atom$Panel) => any): IDisposable, - - // Panel Details - getElement(): HTMLElement, - getItem(): any, - getPriority(): number, - isVisible(): boolean, - hide(): void, - show(): void, -} - -type atom$PointObject = {row: number, column: number}; - -type atom$PointLike = atom$Point -| [number, number] -| atom$PointObject; - -declare class atom$Point { - static fromObject(object: atom$PointLike, copy: ? boolean): atom$Point, - constructor(row: number, column: number): void, - row: number, - column: number, - copy(): atom$Point, - negate(): atom$Point, - - // Comparison - min(point1: atom$PointLike, point2: atom$PointLike): atom$Point, - compare(other: atom$PointLike): -1 | 0 | 1, - isEqual(otherRange: atom$PointLike): boolean, - isLessThan(other: atom$PointLike): boolean, - isLessThanOrEqual(other: atom$PointLike): boolean, - isGreaterThan(other: atom$PointLike): boolean, - isGreaterThanOrEqual(other: atom$PointLike): boolean, - - // Operations - translate(other: atom$PointLike): atom$Point, - - // Conversion - serialize(): [number, number], - toArray(): [number, number], -} - -type atom$RangeObject = { - start: atom$PointObject, - end: atom$PointObject, -}; - -type atom$RangeLike = atom$Range - | atom$RangeObject // TODO: Flow doesn't really handle the real signature below... - | [atom$PointLike, atom$PointLike] - | { - start: atom$PointLike, - end: atom$PointLike, - }; - -declare class atom$Range { - static fromObject( - object: atom$RangeLike, - copy?: boolean, - ): atom$Range, - constructor(pointA: atom$PointLike, pointB: atom$PointLike): void, - compare(other: atom$Range): number, - start: atom$Point, - end: atom$Point, - isEmpty(): boolean, - isEqual(otherRange: atom$RangeLike): boolean, - intersectsWith(otherRange: atom$RangeLike, exclusive?: boolean): boolean, - containsPoint(point: atom$PointLike, exclusive?: boolean): boolean, - containsRange(other: atom$Range, exclusive?: boolean): boolean, - union(other: atom$Range): atom$Range, - serialize(): Array>, - translate(startDelta: atom$PointLike, endDelta?: atom$PointLike): atom$Range, - getRowCount(): number, - getRows(): Array, -} - -type RawStatusBarTile = { - item: HTMLElement, - priority: number, -}; - -type atom$StatusBarTile = { - getPriority(): number, - getItem(): HTMLElement, - destroy(): void, -}; - -declare class atom$ScopeDescriptor { - constructor(object: {scopes: Array}): void, - getScopesArray(): Array, -} - -type atom$ScopeDescriptorLike = atom$ScopeDescriptor | Array; - -/** - * This API is defined at https://github.com/atom/status-bar. - */ -declare class atom$StatusBar { - addLeftTile(tile: RawStatusBarTile): atom$StatusBarTile, - addRightTile(tile: RawStatusBarTile): atom$StatusBarTile, - getLeftTiles(): Array, - getRightTiles(): Array, -} - -// https://github.com/atom/atom/blob/v1.9.0/src/text-editor-registry.coffee -declare class atom$TextEditorRegistry { - add(editor: atom$TextEditor): IDisposable, - remove(editor: atom$TextEditor): boolean, - observe(callback: (editor: atom$TextEditor) => void): IDisposable, - build: (params: atom$TextEditorParams) => atom$TextEditor, - - // Private - editors: Set, -} - -declare class atom$ThemeManager { - // Event Subscription - /** - * As recent as Atom 1.0.10, the implementation of this method was: - * - * ``` - * onDidChangeActiveThemes: (callback) -> - * @emitter.on 'did-change-active-themes', callback - * @emitter.on 'did-reload-all', callback # TODO: Remove once deprecated pre-1.0 APIs are gone - * ``` - * - * Due to the nature of CoffeeScript, onDidChangeActiveThemes returns a Disposable even though it - * is not documented as doing so. However, the Disposable that it does return removes the - * subscription on the 'did-reload-all' event (which is supposed to be deprecated) rather than the - * 'did-change-active-themes' one. - */ - onDidChangeActiveThemes(callback: () => mixed): IDisposable, - - // Accessing Loaded Themes - getLoadedThemeNames(): Array, - getLoadedThemes(): Array, // TODO: Define undocumented ThemePackage class. - - // Accessing Active Themes - getActiveThemeNames(): Array, - getActiveThemes(): Array, // TODO: Define undocumented ThemePackage class. - - // Managing Enabled Themes - getEnabledThemeNames(): Array, - - // Private - activateThemes(): Promise, - requireStylesheet(stylesheetPath: string): IDisposable, -} - -type atom$TooltipsPlacementOption = 'top' | 'bottom' | 'left' | 'right' | 'auto'; - -type atom$TooltipsAddOptions = { - title?: string, - item?: HTMLElement, - keyBindingCommand?: string, - keyBindingTarget?: HTMLElement, - animation?: boolean, - container?: string | false, - delay?: number | {show: number, hide: number}, - placement?: atom$TooltipsPlacementOption | () => atom$TooltipsPlacementOption, - trigger?: string, -}; - -type atom$Tooltip = { - show(): void; - hide(): void; - getTooltipElement(): HTMLElement, -}; - -declare class atom$TooltipManager { - tooltips: Map>; - add( - target: HTMLElement, - options: atom$TooltipsAddOptions, - ): IDisposable, - findTooltips(HTMLElement): Array, -} - -type InsertTextOptions = { - select: boolean, - autoIndent: boolean, - autoIndentNewline: boolean, - autoDecreaseIndent: boolean, - normalizeLineEndings: ?boolean, - undo: string, -}; - -type DecorateMarkerParams = { - type: 'line', - class: string, - onlyHead?: boolean, - onlyEmpty?: boolean, - onlyNonEmpty?: boolean, -} | { - type: 'gutter', - item?: HTMLElement, - class?: string, - onlyHead?: boolean, - onlyEmpty?: boolean, - onlyNonEmpty?: boolean, - gutterName?: string, -} | { - type: 'highlight', - class?: string, - gutterName?: string, -} | { - type: 'overlay', - item: Object, - position?: 'head' | 'tail', // Defaults to 'head' when unspecified. -} | { - type: 'block', - item: HTMLElement, - position?: 'before' | 'after', // Defaults to 'before' when unspecified. -} | { - type: 'line-number', - class?: string, -}; - -type ChangeCursorPositionEvent = { - oldBufferPosition: atom$Point, - oldScreenPosition: atom$Point, - newBufferPosition: atom$Point, - newScreenPosition: atom$Point, - textChanged: boolean, - cursor: atom$Cursor, -}; - -type MarkerOptions = { - reversed?: boolean, - tailed?: boolean, - invalidate?: 'never' | 'surround' | 'overlap' | 'inside' | 'touch', - exclusive?: boolean, -}; - -type atom$ChangeSelectionRangeEvent = {| - oldBufferRange: atom$Range, - oldScreenRange: atom$Range, - newBufferRange: atom$Range, - newScreenRange: atom$Range, - selection: atom$Selection, -|}; - -declare class atom$TextEditor extends atom$Model { - id: number, - verticalScrollMargin: number, - - // Event Subscription - onDidChange(callback: () => void): IDisposable, - onDidChangePath(callback: (newPath: string) => mixed): IDisposable, - onDidStopChanging(callback: () => mixed): IDisposable, - onDidChangeCursorPosition(callback: (event: ChangeCursorPositionEvent) => mixed): - IDisposable, - onDidAddCursor(callback: (cursor: atom$Cursor) => mixed): IDisposable; - onDidRemoveCursor(callback: (cursor: atom$Cursor) => mixed): IDisposable; - onDidDestroy(callback: () => mixed): IDisposable, - onDidSave(callback: (event: {path: string}) => mixed): IDisposable, - getBuffer(): atom$TextBuffer, - observeGrammar(callback: (grammar: atom$Grammar) => mixed): IDisposable, - onWillInsertText(callback: (event: {cancel: () => void, text: string}) => void): - IDisposable, - // Note that the range property of the event is undocumented. - onDidInsertText(callback: (event: {text: string, range: atom$Range}) => mixed): IDisposable, - onDidChangeSoftWrapped(callback: (softWrapped: boolean) => mixed): IDisposable, - onDidChangeSelectionRange(callback: (event: atom$ChangeSelectionRangeEvent) => mixed): IDisposable, - observeSelections(callback: (selection: atom$Selection) => mixed): IDisposable, - - // File Details - getTitle: () => string, - getLongTitle(): string, - /** - * If you open Atom via Spotlight such that it opens with a tab named - * "untitled" that does not correspond to a file on disk, this will return - * null. - */ - getPath(): ?string, - getURI: () => ?string, - insertNewline(): void, - isModified: () => boolean, - isEmpty(): boolean, - getEncoding(): buffer$Encoding, - setEncoding(encoding: string): void, - getTabLength() : number, - getSoftTabs(): boolean, - getIconName(): string, - onDidChangeIcon(cb: (icon: string) => void): IDisposable, - onDidChangeTitle(cb: (title: string) => void): IDisposable, - - // File Operations - save(): Promise, - // DO NOT USE: Doesn't work with remote text buffers! - // saveAs(filePath: string): void, - - // Reading Text - getText(): string, - getTextInBufferRange(range: atom$RangeLike): string, - getLineCount(): number, - getScreenLineCount(): number, - getLastScreenRow(): number, - - // Mutating Text - setText(text: string, options?: InsertTextOptions): void, - setTextInBufferRange( - range: atom$RangeLike, - text: string, - options?: { - normalizeLineEndings?: boolean, - undo?: string, - }, - ): atom$Range, - insertText(text: string): Array | false, - mutateSelectedText(fn: (selection: atom$Selection, index: number) => void): void, - delete: () => void, - backspace: () => void, - duplicateLines: () => void, - - // History - createCheckpoint(): atom$TextBufferCheckpoint, - revertToCheckpoint(checkpoint: atom$TextBufferCheckpoint): boolean, - terminatePendingState(): void, - transact(fn: () => mixed, _: void): void, - transact(groupingInterval: number, fn: () => mixed): void, - onDidTerminatePendingState(() => mixed): IDisposable; - - // TextEditor Coordinates - screenPositionForBufferPosition( - bufferPosition: atom$PointLike, - options?: { - wrapBeyondNewlines?: boolean, - wrapAtSoftNewlines?: boolean, - screenLine?: boolean, - }, - ): atom$Point, - bufferPositionForScreenPosition( - screenPosition: atom$PointLike, - options?: { - wrapBeyondNewlines?: boolean, - wrapAtSoftNewlines?: boolean, - screenLine?: boolean, - }, - ): atom$Point, - getEofBufferPosition(): atom$Point, - getVisibleRowRange(): [number, number], - bufferRowForScreenRow(screenRow: number): number, - screenRangeForBufferRange(bufferRange: atom$RangeLike): atom$Range, - - // Decorations - decorateMarker(marker: atom$Marker, decorationParams: DecorateMarkerParams): atom$Decoration, - decorateMarkerLayer( - markerLayer: atom$DisplayMarkerLayer, - decorationParams: DecorateMarkerParams, - ): atom$LayerDecoration, - decorationsForScreenRowRange( - startScreenRow: number, - endScreenRow: number, - ): {[markerId: string]: Array}, - getDecorations(options?: {class?: string, type?: string}): Array, - - // Markers - addMarkerLayer(): atom$DisplayMarkerLayer, - getDefaultMarkerLayer(): atom$DisplayMarkerLayer, - markBufferPosition(position: atom$PointLike, options?: MarkerOptions): atom$Marker, - markBufferRange(range: atom$RangeLike, options?: MarkerOptions): atom$Marker, - markScreenRange(range: atom$RangeLike, options?: MarkerOptions): atom$Marker, - markScreenPosition(position: atom$PointLike, options?: MarkerOptions): atom$Marker, - findMarkers(options: MarkerOptions): Array, - getMarkerCount(): number, - - // Cursors - getCursors(): Array, - setCursorBufferPosition( - position: atom$PointLike, - options?: { - autoscroll?: boolean, - wrapBeyondNewlines?: boolean, - wrapAtSoftNewlines?: boolean, - screenLine?: boolean, - }): void, - getCursorBufferPosition(): atom$Point, - getCursorBufferPositions(): Array, - getCursorScreenPosition(): atom$Point, - getCursorScreenPositions(): Array, - getLastCursor(): atom$Cursor, - addCursorAtBufferPosition(point: atom$PointLike): atom$Cursor, - moveToBeginningOfLine(): void, - moveToEndOfLine(): void, - moveToBottom(): void, - - // Folds - foldCurrentRow(): void, - unfoldCurrentRow(): void, - foldBufferRow(bufferRow: number): void, - unfoldBufferRow(bufferRow: number): void, - - // Selections - getSelectedText(): string, - selectAll(): void, - getSelectedBufferRange(): atom$Range, - getSelectedBufferRanges(): Array, - getSelections(): Array, - selectToBufferPosition(point: atom$Point): void, - setSelectedBufferRange( - bufferRange: atom$RangeLike, - options?: { - reversed?: boolean, - preserveFolds?: boolean, - }, - ): void, - setSelectedBufferRanges( - bufferRanges: Array, - options?: { - reversed?: boolean, - preserveFolds?: boolean, - }, - ): void, - selectWordsContainingCursors(): void, - - // Folds - unfoldAll(): void, - - // Searching and Replacing - scanInBufferRange( - regex: RegExp, - range: atom$Range, - iterator: (foundMatch: { - match: mixed, - matchText: string, - range: atom$Range, - stop: () => mixed, - replace: (replaceWith: string) => mixed, - }) => mixed - ): void, - - scan( - regex: RegExp, - iterator: (foundMatch: { - match: mixed, - matchText: string, - range: atom$Range, - stop: () => mixed, - replace: (replaceWith: string) => mixed, - }) => mixed - ): void, - - // Tab Behavior - // Soft Wrap Behavior - // Indentation - indentationForBufferRow(bufferRow: number): number, - setTabLength(tabLength: number): void, - setSoftTabs(softTabs: boolean): void, - - lineTextForBufferRow(bufferRow: number): string, - lineTextForScreenRow(screenRow: number): string, - - // Grammars - getGrammar(): atom$Grammar, - setGrammar(grammar: ?atom$Grammar): void, - - // Clipboard Operations - pasteText: (options?: Object) => void, - copySelectedText: () => void, - - // Managing Syntax Scopes - getRootScopeDescriptor(): atom$ScopeDescriptor, - scopeDescriptorForBufferPosition( - bufferPosition: atom$PointLike, - ): atom$ScopeDescriptor, - - // Gutter - addGutter(options: { - name: string, - priority?: number, - visible?: boolean, - }): atom$Gutter, - observeGutters(callback: (gutter: atom$Gutter) => void): IDisposable, - getGutters(): Array, - gutterWithName(name: string): ?atom$Gutter, - - // Scrolling the TextEditor - scrollToBufferPosition( - position: atom$Point | [?number, ?number], - options?: {center?: boolean} - ): void, - scrollToScreenPosition( - position: atom$Point | [?number, ?number], - options?: {center?: boolean} - ): void, - scrollToScreenRange(screenRange: atom$Range, options?: {clip?: boolean}): void, - scrollToCursorPosition( - options?: {center?: boolean} - ): void, - scrollToBottom(): void, - scrollToTop(): void, - - // TextEditor Rendering - getPlaceholderText(): string, - setPlaceholderText(placeholderText: string): void, - - // This is undocumented, but Nuclide uses it in the AtomTextEditor wrapper. - setLineNumberGutterVisible(lineNumberGutterVisible: boolean): void, - - // Editor Options - setSoftWrapped(softWrapped: boolean): void, - - isFoldedAtBufferRow(row: number): boolean, - getLastBufferRow(): number, - - // Undocumented Methods - getElement(): atom$TextEditorElement, - getDefaultCharWidth(): number, - getLineHeightInPixels(): number, - moveToTop(): void, - tokenForBufferPosition(position: atom$Point | [?number, ?number]): atom$Token, - onDidConflict(callback: () => void): IDisposable, - serialize(): Object, - foldBufferRowRange(startRow: number, endRow: number): void, - getNonWordCharacters(position?: atom$PointLike): string, - scheduleComponentUpdate(): void, -} - -/** - * This is not part of the official Atom 1.0 API. Nevertheless, we need to reach into this object - * via `atom$TextEditorElement` to do some things that we have no other way to do. - */ -declare class atom$TextEditorComponent { - domNode: HTMLElement, - scrollViewNode: HTMLElement, - presenter: atom$TextEditorPresenter, - refs: atom$TextEditorComponentRefs, - linesComponent: atom$LinesComponent, - // NOTE: This is typed as a property to allow overwriting. - startCursorBlinking: () => void, - stopCursorBlinking(): void, - pixelPositionForScreenPosition( - screenPosition: atom$Point, - clip?: boolean, - ): {top: number, left: number}, - screenPositionForMouseEvent(event: MouseEvent): atom$Point, - pixelPositionForMouseEvent( - event: MouseEvent, - linesClientRect?: {top: number, left: number, bottom: number, right: number}, - ): {top: number, left: number, bottom: number, right: number}, - invalidateBlockDecorationDimensions(decoration: atom$Decoration): void, - element: atom$TextEditorElement, - didFocus(): void, - setScrollTop(scrollTop: number): void, - getScrollTop(): number, - - setScrollLeft(scrollLeft: number): void, - getScrollLeft(): number, - updateSync(useScheduler?: boolean): void, -} - -/** - * This is not part of the official Atom 1.0 API. Nevertheless, we need to reach into this object - * via `atom$TextEditorComponent` to do some things that we have no other way to do. - */ -declare class atom$TextEditorPresenter { - startBlinkingCursors: () => void, - stopBlinkingCursors(visible: boolean): void, - updateLineNumberGutterState(): void, -} - -/** - * This is not part of the official Atom 1.0 API. Nevertheless, we need it to access - * the deepest dom element receiving DOM events. - */ -declare class atom$LinesComponent { - domNode: HTMLElement, - getDomNode(): HTMLElement, -} - -/** - * This is not part of the official Atom 1.0 API. Nevertheless, we need it to access - * the deepest dom element receiving DOM events. - */ -declare class atom$TextEditorComponentRefs { - lineTiles: HTMLElement, -} - -/** - * This is not part of the official Atom 1.0 API, but it really should be. This is the element that - * is returned when you run `atom.views.getView()`. - */ -declare class atom$TextEditorElement extends HTMLElement { - component: ?atom$TextEditorComponent, - getModel(): atom$TextEditor, - setModel(model: atom$TextEditor): void, - pixelPositionForBufferPosition( - bufferPosition: atom$PointLike, - ): {top: number, left: number}, - pixelPositionForScreenPosition(screenPosition: atom$Point): { - left: number, - top: number, - }, - - setScrollTop(scrollTop: number): void, - getScrollTop(): number, - - setScrollLeft(scrollLeft: number): void, - getScrollLeft(): number, - - getScrollHeight(): number, - getHeight(): number, - - onDidChangeScrollTop(callback: (scrollTop: number) => mixed): IDisposable, - onDidChangeScrollLeft(callback: (scrollLeft: number) => mixed): IDisposable, - - // Called when the editor is attached to the DOM. - onDidAttach(callback: () => mixed): IDisposable, - // Called when the editor is detached from the DOM. - onDidDetach(callback: () => mixed): IDisposable, - - measureDimensions(): void, - - // Undocumented Methods - - // Returns a promise that resolves after the next update. - getNextUpdatePromise(): Promise, - - // `undefined` means no explicit width. `null` sets a zero width (which is almost certainly a - // mistake) so we don't allow it. - setWidth(width: number | void): void, -} - -declare class atom$ViewProvider { - modelConstructor: Function, -} - -declare class atom$ViewRegistry { - // Methods - addViewProvider( - modelConstructor: any, - createView?: (...args: Array) => ?HTMLElement - ): IDisposable, - getView(textEditor: atom$TextEditor): atom$TextEditorElement, - getView(notification: atom$Notification): HTMLElement, - getView(gutter: atom$Gutter): HTMLElement, - getView(panel: atom$Panel): HTMLElement, - getView(workspace: atom$Workspace): HTMLElement, - getView(object: Object): HTMLElement, - providers: Array, -} - -type atom$WorkspaceAddPanelOptions = { - item: Object, - visible?: boolean, - priority?: number, - className?: string, -}; - -type atom$TextEditorParams = { - buffer?: atom$TextBuffer, - lineNumberGutterVisible?: boolean, -}; - -type DestroyPaneItemEvent = { - item: atom$PaneItem, - pane: atom$Pane, - index: number, -}; - -type AddPaneItemEvent = { - item: atom$PaneItem, - pane: atom$Pane, - index: number, -}; - -type OnDidOpenEvent = { - uri: string, - item: mixed, - pane: atom$Pane, - index: number, -}; - -type AddTextEditorEvent = { - textEditor: atom$TextEditor, - pane: atom$Pane, - index: number, -}; - -type atom$WorkspaceOpenOptions = { - activatePane?: ?boolean, - activateItem?: ?boolean, - initialLine?: ?number, - initialColumn?: ?number, - pending?: ?boolean, - split?: ?string, - searchAllPanes?: ?boolean, - location?: atom$PaneLocation, -} - -declare class atom$Workspace { - // Event Subscription - observePanes(cb: (pane: atom$Pane) => void): IDisposable, - observeTextEditors(callback: (editor: atom$TextEditor) => mixed): IDisposable, - observeActiveTextEditor(callback: (editor: ?atom$TextEditor) => mixed): IDisposable, - onDidAddTextEditor(callback: (event: AddTextEditorEvent) => mixed): IDisposable, - onDidChangeActivePaneItem(callback: (item: mixed) => mixed): IDisposable, - onDidDestroyPaneItem(callback: (event: DestroyPaneItemEvent) => mixed): IDisposable, - onDidAddPaneItem(callback: (event: AddPaneItemEvent) => mixed): IDisposable, - observeActivePaneItem(callback: (item: ?mixed) => mixed): IDisposable, - onDidStopChangingActivePaneItem(callback: (item: ?mixed) => mixed): IDisposable, - observePaneItems(callback: (item: mixed) => mixed): IDisposable, - onWillDestroyPaneItem( - callback: (event: {item: mixed, pane: mixed, index: number}) => mixed - ): IDisposable, - onDidOpen(callback: (event: OnDidOpenEvent) => mixed): IDisposable, - - getElement(): HTMLElement, - - // Opening - open( - uri?: string, - options?: atom$WorkspaceOpenOptions, - ): Promise, - openURIInPane( - uri?: string, - pane: atom$Pane, - options?: { - initialLine?: number, - initialColumn?: number, - activePane?: boolean, - searchAllPanes?: boolean, - } - ): Promise, - isTextEditor(item: ?mixed): boolean, - /* Optional method because this was added post-1.0. */ - buildTextEditor: ((params: ?atom$TextEditorParams) => atom$TextEditor), - /* Optional method because this was added in 1.9.0 */ - handleGrammarUsed?: (grammar: atom$Grammar) => void, - reopenItem(): Promise, - addOpener(callback: (uri: string) => any): IDisposable, - hide(uriOrItem: string | Object): void, - toggle(uriOrItem: string | Object): void, - - // Pane Containers - getPaneContainers(): Array, - paneContainerForItem(item: ?mixed): ?atom$AbstractPaneContainer, - - // Pane Items - getPaneItems(): Array, - getActivePaneItem(): ?Object, - getActivePaneContainer(): atom$PaneContainer, - getTextEditors(): Array, - getActiveTextEditor(): ?atom$TextEditor, - createItemForURI(uri: string, options: atom$WorkspaceOpenOptions): atom$PaneItem, - - // Panes - getPanes(): Array, - getActivePane(): atom$Pane, - activateNextPane(): boolean, - activatePreviousPane(): boolean, - paneForURI(uri: string): atom$Pane, - paneForItem(item: mixed): ?atom$Pane, - paneContainers: {[location: atom$PaneLocation]: atom$AbstractPaneContainer}, - - // Panels - panelContainers: {[location: string]: atom$PanelContainer}, - getBottomPanels(): Array, - addBottomPanel(options: atom$WorkspaceAddPanelOptions): atom$Panel, - getLeftPanels(): Array, - addLeftPanel(options: atom$WorkspaceAddPanelOptions): atom$Panel, - getRightPanels(): Array, - addRightPanel(options: atom$WorkspaceAddPanelOptions): atom$Panel, - getTopPanels(): Array, - addTopPanel(options: atom$WorkspaceAddPanelOptions): atom$Panel, - getModalPanels(): Array, - addModalPanel(options: atom$WorkspaceAddPanelOptions): atom$Panel, - getHeaderPanels(): Array, - addHeaderPanel(options: atom$WorkspaceAddPanelOptions): atom$Panel, - - getLeftDock(): atom$Dock, - getRightDock(): atom$Dock, - getBottomDock(): atom$Dock, - getCenter(): atom$WorkspaceCenter, - - // Searching and Replacing - scan( - regex: RegExp, - options: { - paths?: Array, - onPathsSearched?: (numSearched: number) => mixed, - leadingContextLineCount?: number, - trailingContextLineCount?: number, - }, - iterator: ( - ?{ - filePath: string, - matches: Array<{ - leadingContextLines: Array, - lineText: string, - lineTextOffset: number, - range: atom$RangeLike, - matchText: string, - trailingContextLines: Array, - }>, - }, - Error, - ) => mixed, - ): Promise, - - destroyActivePaneItemOrEmptyPane(): void, - destroyActivePaneItem(): void, -} - -declare class atom$AbstractPaneContainer { - activate(): void, - getLocation(): atom$PaneLocation, - getElement(): HTMLElement, - isVisible(): boolean, - show(): void, - hide(): void, - getActivePane(): atom$Pane, - getPanes(): Array, - onDidAddPaneItem((item: {item: Object}) => void): IDisposable, - observePanes(cb: (pane: atom$Pane) => void): IDisposable, - state: { - size: number, - } -} - -declare class atom$Dock extends atom$AbstractPaneContainer { - // This is a woefully incomplete list, items can be added as needed from - // https://github.com/atom/atom/blob/master/src/dock.js - toggle(): void, -} - -declare class atom$WorkspaceCenter extends atom$AbstractPaneContainer { - activate(): void; - - // Pane Items - getPaneItems(): Array, - getActivePaneItem(): ?atom$PaneItem, - getTextEditors(): Array, - getActiveTextEditor(): ?atom$TextEditor, - - observeActivePaneItem(callback: atom$PaneItem => mixed): IDisposable; - onDidChangeActivePaneItem(callback: (item: mixed) => mixed): IDisposable; - onDidAddTextEditor( - callback: (item: { - textEditor: atom$TextEditor, - pane: atom$Pane, - index: number, - }) => mixed, - ): IDisposable; - // This should be removed soon anyway, it's currently deprecated. - paneContainer: Object; -} - -/** - * Extended Classes - */ - -declare class atom$BufferedNodeProcess { } - -declare class atom$BufferedProcess { - // Event Subscription - onWillThrowError( - callback: (errorObject: {error: Object, handle: mixed}) => mixed - ): IDisposable, - // Helper Methods - kill(): void, -} - -declare class atom$Clipboard { - // Methods - write(text: string, metadata?: mixed): void, - read(): string, - readWithMetadata(): { - metadata: ?mixed, - text: string, - }, -} - -declare class atom$ContextMenuManager { - add(itemsBySelector: {[cssSelector: string]: Array}): IDisposable, - itemSets: Array, - - // Undocumented methods - showForEvent(event: Event): void, - templateForEvent(event: Event): Array, -} - -declare class atom$ContextMenuItemSet { - items: Array, - selector: string, -} - -type atom$ContextMenuItem = { - command?: string, - created?: (event: MouseEvent) => void, - enabled?: boolean, - label?: string, - shouldDisplay?: (event: MouseEvent) => boolean, - submenu?: Array, - type?: string, - visible?: boolean, -}; - -type atom$Deserializer = { - name: string, - deserialize: (state: Object) => mixed, -}; - -declare class atom$DeserializerManager { - add(...deserializers: Array): IDisposable, - deserialize(state: Object, params?: Object): mixed, -} - -// Apparently it can sometimes include a `code` property. -declare class atom$GetEntriesError extends Error { - code?: string, -} - -declare class atom$Directory { - constructor(dirname?: string): atom$Directory, - - symlink: boolean, - - // Construction - create(mode?: number): Promise, - - // Event Subscription - onDidChange(callback: () => mixed): IDisposable, - - // Directory Metadata - isFile(): boolean, - isDirectory(): boolean, - exists():Promise, - - // Managing Paths - getPath(): string, - getBaseName(): string, - relativize(fullPath: string): string, - - // Event Subscription - onDidRename(callback: () => void): IDisposable, - onDidDelete(callback: () => void): IDisposable, - - // Traversing - getParent(): atom$Directory, - getFile(filename: string): atom$File, - getSubdirectory(dirname: string): atom$Directory, - getEntries( - callback: ( - error: ?atom$GetEntriesError, - entries: ?Array, - ) => mixed): void, - contains(path: string): boolean, -} - -// These are the methods called on a file by atom-text-buffer -interface atom$Fileish { - existsSync(): boolean, - setEncoding(encoding: string): void, - getEncoding(): ?string, - - onDidRename(callback: () => void): IDisposable, - onDidDelete(callback: () => void): IDisposable, - onDidChange(callback: () => void): IDisposable, - onWillThrowWatchError(callback: () => mixed): IDisposable, - - getPath(): string, - getBaseName(): string, - - createReadStream(): stream$Readable, - createWriteStream(): stream$Writable, -} - -declare class atom$File /* implements atom$Fileish */ { - constructor(filePath?: string, symlink?: boolean): atom$File, - - symlink: boolean, - - // Construction - create(): Promise, - - // File Metadata - isFile(): boolean, - isDirectory(): boolean, - exists(): Promise, - existsSync(): boolean, - setEncoding(encoding: string): void, - getEncoding(): string, - - // Event Subscription - onDidRename(callback: () => void): IDisposable, - onDidDelete(callback: () => void): IDisposable, - onDidChange(callback: () => void): IDisposable, - onWillThrowWatchError(callback: () => mixed): IDisposable, - - // Managing Paths - getPath(): string, - getBaseName(): string, - - // Traversing - getParent(): atom$Directory, - - // Reading and Writing - read(flushCache?: boolean): Promise, - write(text: string): Promise, - writeSync(text: string): void, - createReadStream(): stream$Readable, - createWriteStream(): stream$Writable, -} - -declare class atom$GitRepository extends atom$Repository { - // Unofficial API. - statuses: {[filePath: string]: number}, - // Return the `git-utils` async repo. - getRepo(): atom$GitRepositoryInternal, -} - -declare class atom$Grammar { - name: string, - scopeName: string, - tokenizeLines(text: string): Array>, - tokenizeLine(line: string, ruleStack: mixed, firstLine: boolean): { - line: string, - tags: Array, - // Dynamic property: invoking it will incur additional overhead - tokens: Array, - ruleStack: mixed - }, -} - -type atom$GrammarToken = { - value: string, - scopes: Array, -}; - -declare class atom$GrammarRegistry { - // Event Subscription - onDidAddGrammar(callback: (grammar: atom$Grammar) => void): IDisposable, - - // Managing Grammars - grammarForScopeName(scopeName: string): ?atom$Grammar, - removeGrammarForScopeName(scopeName: string): ?atom$Grammar, - loadGrammarSync(grammarPath: string): atom$Grammar, - selectGrammar(filePath: string, fileContents: string): atom$Grammar, - autoAssignLanguageMode(buffer: atom$TextBuffer): void, - assignLanguageMode(buffer: atom$TextBuffer, languageId: string): void, - - // Extended - getGrammarScore(grammar: atom$Grammar, filePath: string, contents?: string): number, - forEachGrammar(callback: (grammar: atom$Grammar) => mixed): void, - - // Private API - clear(): IDisposable, -} - -declare class atom$HistoryManager { - removeProject(paths: Array): void, - getProjects(): Array, -} - -declare class atom$HistoryProject { - get paths(): Array; - get lastOpened(): Date; -} - -// https://github.com/atom/atom-keymap/blob/18f00ac307de5770bb8f98958bd9a13ecffa9e68/src/key-binding.coffee -declare class atom$KeyBinding { - cachedKeyups: ?Array, - command: string, - index: number, - keystrokeArray : Array, - keystrokeCount: number, - keystrokes: string, - priority: number, - selector: string, - source: string, - specificity: number, - - matches(keystroke: string): boolean, - compare(keybinding: atom$KeyBinding): number, - getKeyups(): ?Array, - matchesKeystrokes(userKeystrokes: Array): boolean | 'exact' | 'partial' | 'pendingKeyup', -} - -declare class atom$KeymapManager { - // Event Subscription - onDidMatchBinding(callback: (event: { - keystrokes: string, - binding: atom$KeyBinding, - keyboardEventTarget: HTMLElement, - }) => mixed): IDisposable, - - onDidPartiallyMatchBinding(callback: (event: { - keystrokes: string, - partiallyMatchedBindings: atom$KeyBinding, - keyboardEventTarget: HTMLElement, - }) => mixed): IDisposable, - - onDidFailToMatchBinding(callback: (event: { - keystrokes: string, - partiallyMatchedBindings: atom$KeyBinding, - keyboardEventTarget: HTMLElement, - }) => mixed): IDisposable, - - onDidFailToReadFile(callback: (error: { - message: string, - stack: string, - }) => mixed): IDisposable, - - // Adding and Removing Bindings - add(source: string, bindings: Object): IDisposable, - removeBindingsFromSource(source: string): void, - - // Accessing Bindings - getKeyBindings(): Array, - findKeyBindings(params: { - keystrokes?: string, - command?: string, - target?: HTMLElement, - }): Array, - - // Managing Keymap Files - loadKeymap(path: string, options?: {watch: boolean}): void, - watchKeymap(path: string): void, - - // Managing Keyboard Events - handleKeyboardEvent(event: Event): void, - keystrokeForKeyboardEvent(event: Event): string, - getPartialMatchTimeout(): number, - - static buildKeydownEvent( - key: string, - options: { - target: HTMLElement, - alt?: boolean, - cmd?: boolean, - ctrl?: boolean, - shift?: boolean, - }, - ): Event, -} - -declare class atom$MenuManager { - add(items: Array): IDisposable, - update(): void, - - // Private API - template: Array, -} - -type atom$ProjectSpecification = { - originPath: string, - paths?: Array, - config?: {[string]: mixed} -}; - -declare class atom$Project { - // Event Subscription - onDidChangePaths(callback: (projectPaths: Array) => mixed): IDisposable, - onDidAddBuffer(callback: (buffer: atom$TextBuffer) => mixed): IDisposable, - onDidReplace((settings: atom$ProjectSpecification) => mixed): IDisposable, - observeBuffers(callback: (buffer: atom$TextBuffer) => mixed): IDisposable, - replace?: (newSettings: atom$ProjectSpecification) => void, - // Accessing the git repository - getRepositories(): Array, - repositoryForDirectory(directory: atom$Directory): Promise, - - // Managing Paths - getPaths(): Array, - addPath(projectPath: string, options?: { - emitEvent?: boolean, - exact?: boolean, - mustExist?: boolean, - }): void, - setPaths(paths: Array): void, - removePath(projectPath: string): void, - getDirectories(): Array, - relativizePath(relativizePath?: string): Array, // [projectPath: ?string, relativePath: string] - relativize(filePath: string): string, - contains(path: string): boolean, - - // Private API - findBufferForPath(path: string): ?atom$TextBuffer, - addBuffer(buffer: atom$TextBuffer): void, - removeBuffer(buffer: atom$TextBuffer): void, - getBuffers(): Array, -} - -type TextBufferScanIterator = (arg: { - match: Array, - matchText: string, - range: atom$Range, - stop(): void, - replace(replacement: string): void, -}) => void; - -// This happens to be a number but it would be better if the type could be entirely opaque. All you -// need to know is that if something needs a checkpoint you should only pass it values received from -// TextBuffer::createCheckpoint -type atom$TextBufferCheckpoint = number; - -// TextBuffer did-change/will-change -type atom$TextEditEvent = { - oldRange: atom$Range, - newRange: atom$Range, - oldText: string, - newText: string, -}; - -type atom$AggregatedTextEditEvent = { - changes: Array, -}; - -declare class atom$LanguageMode { - getLanguageId(): string, -} - -declare class atom$TextBuffer { - constructor(text?: string): atom$TextBuffer, - constructor(params?: { - filePath?: string, - text?: string, - }): atom$TextBuffer, - - file: ?atom$File, - - // Mixin - static deserialize: (state: Object, params: Object) => mixed, - static load: (file: string | atom$Fileish, params: Object) => Promise, - - setFile(file: atom$Fileish): void, - - // Events - onWillChange(callback: () => mixed): IDisposable, - onDidChangeText(callback: (event: atom$AggregatedTextEditEvent) => mixed): IDisposable, - onDidStopChanging(callback: () => mixed): IDisposable, - onDidConflict(callback: () => mixed): IDisposable, - onDidChangeModified(callback: () => mixed): IDisposable, - onDidUpdateMarkers(callback: () => mixed): IDisposable, - onDidCreateMarker(callback: () => mixed): IDisposable, - onDidChangePath(callback: () => mixed): IDisposable, - onDidChangeEncoding(callback: () => mixed): IDisposable, - onWillSave(callback: () => mixed): IDisposable, - onDidSave(callback: (event: {path: string}) => mixed): IDisposable, - onDidDelete(callback: () => mixed): IDisposable, - onWillReload(callback: () => mixed): IDisposable, - onDidReload(callback: () => mixed): IDisposable, - onDidDestroy(callback: () => mixed): IDisposable, - onWillThrowWatchError(callback: () => mixed): IDisposable, - - // File Details - // DO NOT USE (T21363106): Doesn't work with remote text buffers! - // setPath(filePath: string): void, - getPath(): ?string, - setEncoding(encoding: string): void, - getEncoding(): string, - getUri(): string, - getId(): string, - getLanguageMode(): atom$LanguageMode, - - // Reading Text - isEmpty(): boolean, - getText(): string, - getTextInRange(range: atom$RangeLike): string, - getLineCount(): number, - getLines(): Array, - getLastLine(): string, - lineForRow(row: number): string, - lineEndingForRow(row: number): string, - lineLengthForRow(row: number): number, - isRowBlank(row: number): boolean, - previousNonBlankRow(startRow: number): ?number, - nextNonBlankRow(startRow: number): ?number, - - // Mutating Text - setText: (text: string) => atom$Range, - setTextInRange(range: atom$RangeLike, text: string, options?: Object): atom$Range, - setTextViaDiff(text: string): void, - insert( - position: atom$Point, - text: string, - options?: { - normalizeLineEndings?: boolean, - undo?: string, - }, - ): atom$Range, - append(text: string, options: ?{ - normalizeLineEndings?: boolean, - undo?: string, - }): atom$Range, - delete(range: atom$Range): atom$Range, - deleteRows(startRow: number, endRow: number): atom$Range, - - // History - undo(): void, - redo(): void, - transact(fn: () => mixed, _: void): void, - transact(groupingInterval: number, fn: () => mixed): void, - clearUndoStack(): void, - createCheckpoint(): atom$TextBufferCheckpoint, - revertToCheckpoint(checkpoint: atom$TextBufferCheckpoint): boolean, - groupChangesSinceCheckpoint(checkpoint: atom$TextBufferCheckpoint): boolean, - // TODO describe the return type more precisely. - getChangesSinceCheckpoint(checkpoint: atom$TextBufferCheckpoint): Array, - - // Search And Replace - scan(regex: RegExp, iterator: TextBufferScanIterator): void, - scanInRange(regex: RegExp, range: atom$Range, iterator: TextBufferScanIterator): void, - backwardsScanInRange(regex: RegExp, range: atom$Range, iterator: TextBufferScanIterator): void, - - // Buffer Range Details - getLastRow(): number, - getRange(): atom$Range, - rangeForRow(row: number, includeNewLine?: boolean): atom$Range, - getLength(): number, - - // Position/Index mapping - characterIndexForPosition(position: atom$PointLike): number, - positionForCharacterIndex(index: number): atom$Point, - - // Buffer Operations - reload(): void, - load(): Promise, - save(): Promise, - - isInConflict(): boolean, - isModified(): boolean, - - // Private APIs - cachedDiskContents: ?string, - emitter: atom$Emitter, - refcount: number, - loaded: boolean, - wasModifiedBeforeRemove: boolean, - finishLoading(): atom$TextBuffer, - updateCachedDiskContents(flushCache?: boolean, callback?: () => mixed): Promise, - emitModifiedStatusChanged(changed: boolean): void, - destroy(): void, - isDestroyed(): boolean, - applyChange: () => void, - shouldDestroyOnFileDelete?: () => boolean, -} - -declare class atom$Notification { - // Event Subscription - onDidDismiss(callback: () => mixed): IDisposable, - onDidDisplay(callback: () => mixed): IDisposable, - - // Methods - getType(): string, - getMessage(): string, - getOptions(): Object, - dismiss(): void, - isDismissed(): boolean, -} - -type atom$NotificationButton = { - text: string, - className?: string, - onDidClick?: () => mixed, -}; - -type atom$NotificationOptions = { - detail?: string, - dismissable?: boolean, - description?: string, - icon?: string, - stack?: string, - buttons?: Array, -}; - -declare class atom$NotificationManager { - // Events - onDidAddNotification(callback: (notification: atom$Notification) => void): IDisposable, - - // Adding Notifications - add(type: string, message: string, options?: atom$NotificationOptions): atom$Notification, - addSuccess(message: string, options?: atom$NotificationOptions): atom$Notification, - addInfo(message: string, options?: atom$NotificationOptions): atom$Notification, - addWarning(message: string, options?: atom$NotificationOptions): atom$Notification, - addError(message: string, options?: atom$NotificationOptions): atom$Notification, - addFatalError(message: string, options?: atom$NotificationOptions): atom$Notification, - addNotification(notification: atom$Notification): atom$Notification, - - // Getting Notifications - getNotifications(): Array, -} - -// The items in this declaration are available off of `require('atom')`. -// This list is not complete. -declare module 'atom' { - declare var BufferedNodeProcess: typeof atom$BufferedNodeProcess; - declare var BufferedProcess: typeof atom$BufferedProcess; - declare var CompositeDisposable: typeof atom$CompositeDisposable; - declare var Directory: typeof atom$Directory; - declare var Disposable: typeof atom$Disposable; - declare var Emitter: typeof atom$Emitter; - declare var File: typeof atom$File; - declare var GitRepository: typeof atom$GitRepository; - declare var Notification: typeof atom$Notification; - declare var Point: typeof atom$Point; - declare var Range: typeof atom$Range; - declare var TextBuffer: typeof atom$TextBuffer; - declare var TextEditor: typeof atom$TextEditor; -} - -// Make sure that common types can be referenced without the `atom$` prefix -// in type declarations. -declare var Cursor: typeof atom$Cursor; -declare var Panel: typeof atom$Panel; -declare var TextEditor: typeof atom$TextEditor; - -type atom$UnhandledErrorEvent = { - originalError: Object, - message: string, - url: string, - line: number, - column: number, -}; - -// The properties of this type match the properties of the `atom` global. -// This list is not complete. -type AtomGlobal = { - // Properties - appVersion: string, - atomScriptMode: ?boolean, // Added by nuclide-atom-script. - clipboard: atom$Clipboard, - commands: atom$CommandRegistry, - config: atom$Config, - contextMenu: atom$ContextMenuManager, - applicationDelegate: atom$applicationDelegate, - deserializers: atom$DeserializerManager, - grammars: atom$GrammarRegistry, - history: atom$HistoryManager, - keymaps: atom$KeymapManager, - menu: atom$MenuManager, - notifications: atom$NotificationManager, - packages: atom$PackageManager, - styles: atom$StyleManager, - themes: atom$ThemeManager, - textEditors: atom$TextEditorRegistry, - tooltips: atom$TooltipManager, - views: atom$ViewRegistry, - workspace: atom$Workspace, - project: atom$Project, - devMode: boolean, - - // Event Subscription - onWillThrowError(callback: (event: atom$UnhandledErrorEvent) => mixed): IDisposable, - onDidThrowError(callback: (event: atom$UnhandledErrorEvent) => mixed): IDisposable, - whenShellEnvironmentLoaded(callback: () => mixed): IDisposable, - - // Atom Details - inDevMode(): boolean, - inSafeMode(): boolean, - inSpecMode(): boolean, - getVersion(): string, - isReleasedVersion(): boolean, - getWindowLoadTime(): number, - - // This is an undocumented way to reach the Electron BrowserWindow. - // Use `electron.remote.getCurrentWindow` instead. - getCurrentWindow: void, - - // Messaging the User - +confirm: - & (( - { - message: string, - detail?: string, - buttons?: Array, - }, - (number) => void, - ) => void) - // The synchronous form. You really shouldn't use this. - & (({ - message: string, - detailedMessage?: string, - buttons?: Array | {[buttonName: string]: () => mixed}, - }) => ?number), - - open(params: { - pathsToOpen?: Array, - newWindow?: boolean, - devMode?: boolean, - safeMode?: boolean, - }): void, - reload(): void, - - // Undocumented Methods - getConfigDirPath(): string, - showSaveDialogSync(options: Object): string, - loadState(): Promise, - getLoadSettings(): Object, -}; - -declare var atom: AtomGlobal; - -type RepositoryDidChangeStatusCallback = (event: {path: string, pathStatus: number}) => mixed; -type RepositoryLineDiff = { - oldStart: number, - newStart: number, - oldLines: number, - newLines: number, -}; - -// Taken from the interface of [`GitRepository`][1], which is also implemented by -// `HgRepositoryClient`. -// -// [1]: https://github.com/atom/atom/blob/v1.7.3/src/git-repository.coffee -declare class atom$Repository { - constructor(path: string, options?: {refreshOnWindowFocus?: boolean}): void, - - // Event Subscription - onDidChangeStatus: (callback: RepositoryDidChangeStatusCallback) => IDisposable, - onDidChangeStatuses: (callback: () => mixed) => IDisposable, - - // Repository Details - getType: () => string, - getPath: () => string, - getWorkingDirectory: () => string, - isProjectAtRoot: () => boolean, - relativize: (aPath: string) => string, - getOriginURL: (aPath: ?string) => ?string, - - // Reading Status - isPathModified: (aPath: string) => boolean, - isPathNew: (aPath: string) => boolean, - isPathIgnored: (aPath: string) => boolean, - getDirectoryStatus: (aPath: string) => number, - getPathStatus: (aPath: string) => number, - getCachedPathStatus: (aPath: string) => ?number, - isStatusModified: (status: number) => boolean, - isStatusNew: (status: number) => boolean, - refreshStatus: () => Promise, - - // Retrieving Diffs - getDiffStats: (filePath: string) => {added: number, deleted: number}, - getLineDiffs: (aPath: string, text: string) => Array, - - // Checking Out - checkoutHead: (aPath: string) => boolean, - checkoutReference: (reference: string, create: boolean) => Promise, - - // Event Subscription - onDidDestroy(callback: () => mixed): IDisposable, - isDestroyed(): boolean, -} - -declare class atom$GitRepositoryInternal { - // Reading Status - isStatusModified: (status: number) => boolean, - isStatusNew: (status: number) => boolean, - isStatusIgnored: (status: number) => boolean, - isStatusStaged: (status: number) => boolean, - isStatusDeleted: (status: number) => boolean, -} - -// One of text or snippet is required. -// TODO(hansonw): use a union + intersection type -type atom$AutocompleteSuggestion = { - text?: string, - snippet?: string, - displayText?: string, - replacementPrefix?: string, - type?: ?string, - leftLabel?: ?string, - leftLabelHTML?: ?string, - rightLabel?: ?string, - rightLabelHTML?: ?string, - className?: ?string, - iconHTML?: ?string, - description?: ?string, - descriptionMarkdown?: ?string, - descriptionMoreURL?: ?string, -}; - -type atom$AutocompleteRequest = { - editor: TextEditor, - bufferPosition: atom$Point, - scopeDescriptor: atom$ScopeDescriptor, - prefix: string, - activatedManually?: boolean, -}; - -type atom$AutocompleteProvider = { - +selector: string, - +getSuggestions: ( - request: atom$AutocompleteRequest, - ) => Promise> | ?Array, - +getSuggestionDetailsOnSelect?: ( - suggestion: atom$AutocompleteSuggestion - ) => Promise, - +disableForSelector?: string, - +inclusionPriority?: number, - +excludeLowerPriority?: boolean, - +suggestionPriority?: number, - +filterSuggestions?: boolean, - +disposable?: () => void, - +onDidInsertSuggestion?: ( - insertedSuggestion: atom$SuggestionInsertedRequest, - ) => void, -}; - -type atom$SuggestionInsertedRequest = { - +editor: atom$TextEditor, - +triggerPosition: atom$Point, - +suggestion: atom$AutocompleteSuggestion, -}; - -// https://github.com/atom/autocomplete-plus/blob/master/README.md#the-watcheditor-api -type atom$AutocompleteWatchEditor = ( - editor: atom$TextEditor, - labels?: Array, -) => IDisposable; - -// Undocumented API. -declare class atom$Token { - value: string, - matchesScopeSelector(selector: string): boolean, -} - -declare class atom$Selection { - clear(): void, - getText(): string, - getBufferRange(): atom$Range, - insertText( - text: string, - options?: { - select?: boolean, - autoIndent?: boolean, - autoIndentNewLine?: boolean, - autoDecreaseIdent?: boolean, - normalizeLineEndings?: boolean, - undo?: boolean, - }, - ): string, -} - -declare class atom$PanelContainer { - dock: atom$Dock, - element: HTMLElement, - emitter: atom$Emitter, - location: atom$PaneLocation, - panels: Array, - subscriptions: atom$CompositeDisposable, - viewRegistry: atom$ViewRegistry, - - getPanels(): Array, -}; diff --git a/flow-libs/blessed.js.flow b/flow-libs/blessed.js.flow deleted file mode 100644 index 63a1bb2666..0000000000 --- a/flow-libs/blessed.js.flow +++ /dev/null @@ -1,197 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - - -declare module 'blessed' { - declare type ProgramOptions = { - log?: string, - dump?: boolean, - } - - declare class Program extends events$EventEmitter { - showCursor: () => void, - hideCursor: () => void, - move(x: number, y:number): void, - //$TODO there are a LOT of low level methods here - } - - declare type NodeOptions = { - screen?: Screen, - parent?: Node, - children?: Array, - } - - declare class Node extends events$EventEmitter { - type: string, - options: NodeOptions, - parent: ?Node, - children: Array, - prepend(node: Node): void, - append(node: Node): void, - remove(node: Node): void, - insert(node: Node, i: number): void, - insertBefore(node: Node, refNode: Node): void, - insertAfter(node: Node, refNode: Node): void, - detach(): void, - get(name: string, defaultValue: any): ?any, - set(name: string, value: any): void, - } - - declare type ScreenOptions = { - ...NodeOptions, - smartCSR?: boolean, - program?: Program, - } - - declare class Screen extends Node { - title: string, - render: () => void, - realloc: () => void, - key(name: string | Array, (ch: string, key: string) => void): events$EventEmitter, - } - - // The docs say that attributes must be a number, but the code actually - // can take a number, a color name, a web color (#rrggbb), or even a function - // that returns any of the above - declare type Attribute = number | string | (() => number | string) - - declare type Border = { - type: 'line' | 'bg', - ch?: string, - bg: Attribute, - fg: Attribute, - bold: Attribute, - underline: Attribute, - } - - declare type ElementOptions = { - ...NodeOptions, - fg?: Attribute, - bg?: Attribute, - bold?: Attribute, - underline?: Attribute, - style?: {[any]: string | number}, - border?: Border, - content?: string, - clickable?: boolean, - input?: boolean, - keyable?: boolean, - focused?: boolean, - hidden?: boolean, - label?: string, - hoverText?: string, - align?: 'left' | 'center' | 'right', - valign?: 'top' | 'middle' | 'bottom', - shrink?: boolean, - padding?: number | { - left: number, - right: number, - top: number, - bottom: number, - }, - width?: number | string, - height?: number | string, - left?: string | number, - right?: string | number, - top?: string | number, - bottom?: string | number, - scrollable?: boolean, - ch?: string, - draggable?: boolean, - shadow?: boolean, - tags?: boolean, - wrap?: boolean, - } - - declare class Element extends Node { - border: ?Border, - style: {[string]: number | string}, - content: string, - hidden: boolean, - visible: boolean, - detached: boolean, - fg: Attribute, - bg: Attribute, - bold: Attribute, - underline: Attribute, - width: number, - height: number, - left: number, - right: number, - top: number, - bottom: number, - aleft: number, - aright: number, - atop: number, - abottom: number, - draggable: boolean, - - render(): void, - hide(): void, - show(): void, - toggle(): void, - focus(): void, - key(name: string | Array, (ch: string, key: string) => void): events$EventEmitter, - onceKey(name: string | Array, (ch: string, key: string) => void): events$EventEmitter, - unkey(name: string | Array, (ch: string, key: string) => void): events$EventEmitter, - onScreenEvent(name: string, () => void): events$EventEmitter, - removeScreenEvent(name: string, () => void): events$EventEmitter, - free(): void, - destroy(): void, - setIndex(z: number): void, - setFront(): void, - setBack(): void, - setLabel(text: string /* todo also options object */): void, - removeLabel(): void, - setHover(text: string /* todo also options object */): void, - removeHover(): void, - enableMouse(): void, - enableKeys(): void, - enableInput(): void, - enableDrag(): void, - disableDrag(): void, - screenshot(xi: number, xl: number, yi: number, yl: number): string, - setContent(text: string): void, - getContent(): string, - setText(text: string): void, - getText(): string, - insertLine(i: number, lines: string | Array): void, - deleteLine(i: number): void, - getLine(i: number): ?string, - getBaseLine(i: number): ?string, - setLine(i: number, line: string): void, - setBaseLine(i: number, line: string): void, - clearLine(i: number): void, - clearBaseLine(i: number): void, - insertTop(lines: string | Array): void, - insertBottom(lines: string | Array): void, - unshiftLine(lines: string | Array): void, - shiftLine(i: number): ?string, - pushLine(lines: string | Array): void, - popLine(i: number): ?string, - getLines(): Array, - getScreenLines(): Array, - } - - declare class Box extends Element { - getScroll(): number, - scroll(lines: number): void; - } - - declare module.exports: { - Program: typeof Program, - Screen: typeof Screen, - Node: typeof Node, - Box: typeof Box, - program: (ProgramOptions) => Program, - screen: (ScreenOptions) => Screen, - box: (ElementOptions) => Box, - }; -} diff --git a/flow-libs/bom.js.flow b/flow-libs/bom.js.flow deleted file mode 100644 index 5213ea954d..0000000000 --- a/flow-libs/bom.js.flow +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -declare type PerformanceEntry$EntryType = - | 'frame' - | 'longtask' - | 'mark' - | 'measure' - | 'navigation' - | 'paint' - | 'resource'; - -declare type PerformanceObserverInit = {| - entryTypes: Array, -|}; - -declare type PerformanceEntryFilterOptions = {| - name?: string, - entryType?: PerformanceEntry$EntryType, - initiatorType?: string, -|}; - -declare type PerformanceObserverEntryList = {| - getEntries( - filterOptions?: PerformanceEntryFilterOptions, - ): Array, - getEntriesByName( - name: string, - type: PerformanceEntry$EntryType, - ): Array, - getEntriesByType(type: PerformanceEntry$EntryType): Array, -|}; - -declare type ResizeObserverEntry = {| - target: HTMLElement, - contentRect: DOMRectReadOnly, -|}; - -declare class PerformanceObserver { - constructor( - callback: (entries: PerformanceObserverEntryList) => void, - observer: this, - ): void, - observe(options: PerformanceObserverInit): void, - disconnect(): void, -} - -declare class ResizeObserver { - constructor(callback: (entries: Array) => void): void, - observe(target: HTMLElement): void, - unobserve(target: HTMLElement): void, - disconnect(): void, -} diff --git a/flow-libs/connect.js.flow b/flow-libs/connect.js.flow deleted file mode 100644 index 8fdd6ff0bd..0000000000 --- a/flow-libs/connect.js.flow +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -declare class connect$Error extends Error { - code?: number, -} - -type connect$ServerHandle = connect$HandleFunction | http$fixed$Server; -type connect$SimpleHandleFunction = - (req: http$fixed$IncomingMessage, res: http$fixed$ServerResponse) => mixed; -type connect$NextHandleFunction = - (req: http$fixed$IncomingMessage, res: http$fixed$ServerResponse, next: Function) => mixed; -type connect$ErrorHandleFunction = (err: ?connect$Error, req: http$fixed$IncomingMessage, - res: http$fixed$ServerResponse, next: Function) => mixed; -type connect$HandleFunction = - connect$SimpleHandleFunction | connect$NextHandleFunction | connect$ErrorHandleFunction; - -type connect$ServerStackItem = { - route: string, - handle: connect$ServerHandle, -}; - -declare class connect$Server { - (req: http$fixed$IncomingMessage, res: http$fixed$ServerResponse, next?: Function): void, - - route: string, - stack: Array, - - /** - * Utilize the given middleware `handle` to the given `route`, - * defaulting to _/_. This "route" is the mount-point for the - * middleware, when given a value other than _/_ the middleware - * is only effective when that segment is present in the request's - * pathname. - * - * For example if we were to mount a function at _/admin_, it would - * be invoked on _/admin_, and _/admin/settings_, however it would - * not be invoked for _/_, or _/posts_. - * - * @public - */ - use(fn: connect$HandleFunction): connect$Server, - use(route: string, fn: connect$HandleFunction): connect$Server, - - /** - * Handle server requests, punting them down - * the middleware stack. - * - * @private - */ - handle(req: http$fixed$IncomingMessage, res: http$fixed$ServerResponse, next: Function): void, - - /** - * Listen for connections. - * - * This method takes the same arguments - * as node's `http$fixed$Server#listen()`. - * - * HTTP and HTTPS: - * - * If you run your application both as HTTP - * and HTTPS you may wrap them individually, - * since your Connect "server" is really just - * a JavaScript `Function`. - * - * var connect = require('connect') - * , http = require('http') - * , https = require('https'); - * - * var app = connect(); - * - * http$fixed$createServer(app).listen(80); - * https.createServer(options, app).listen(443); - * - * @api public - */ - listen(port: number, hostname?: string, backlog?: number, callback?: Function): http$fixed$Server, - listen(port: number, hostname?: string, callback?: Function): http$fixed$Server, - listen(path: string, callback?: Function): http$fixed$Server, - listen(handle: any, listeningListener?: Function): http$fixed$Server, -} - -type connect$module = () => connect$Server; diff --git a/flow-libs/diffparser.js.flow b/flow-libs/diffparser.js.flow deleted file mode 100644 index f3c082080f..0000000000 --- a/flow-libs/diffparser.js.flow +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -type diffparser$FileName = string; - -type diffparser$FileDiff = { - annotation?: string, // Added for convenience; no annotations returned by diffparser.parse - from: diffparser$FileName, - to: diffparser$FileName, - chunks: Array, - deletions: number, - additions: number, - index?: Array, -}; - -type diffparser$Hunk = { - content: string, - changes: Array, - oldStart: number, - oldLines: number, - newStart: number, - newLines: number, -}; - -type diffparser$Change = { - type: diffparser$ChangeType, - content: string, - ln: number, - position: number, -}; - -type diffparser$ChangeType = 'del' | 'add' | 'normal'; - -declare module 'diffparser' { - declare export default function parse(diff: string): Array; -} diff --git a/flow-libs/electron-v2.0.9.js.flow b/flow-libs/electron-v2.0.9.js.flow deleted file mode 100644 index 48ebb80222..0000000000 --- a/flow-libs/electron-v2.0.9.js.flow +++ /dev/null @@ -1,3652 +0,0 @@ -/** - * Copyright 2018-present Facebook. - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * @format - * @flow - * - * This is an autogenerated libdef for: electron-v2.0.9 renderer process - */ - -declare module 'electron' { - declare module.exports: { - clipboard: { - readText: (type?: ?string) => string, - writeText: (text: string, type?: ?string) => void, - readHTML: (type?: ?string) => string, - writeHTML: (markup: string, type?: ?string) => void, - readImage: (type?: ?string) => NativeImage, - writeImage: (image: NativeImage, type?: ?string) => void, - readRTF: (type?: ?string) => string, - writeRTF: (text: string, type?: ?string) => void, - readBookmark: () => { - title: string, - url: string, - }, - writeBookmark: (title: string, url: string, type?: ?string) => void, - readFindText: () => string, - writeFindText: (text: string) => void, - clear: (type?: ?string) => void, - availableFormats: (type?: ?string) => Array, - has: (format: string, type?: ?string) => boolean, - read: (format: string) => string, - readBuffer: (format: string) => Buffer, - writeBuffer: (format: string, buffer: Buffer, type?: ?string) => void, - write: ( - data: { - text?: ?string, - html?: ?string, - image?: ?NativeImage, - rtf?: ?string, - bookmark?: ?string, - }, - type?: ?string, - ) => void, - }, - crashReporter: { - start: (options: { - companyName?: ?string, - submitURL: string, - productName?: ?string, - uploadToServer?: ?boolean, - ignoreSystemCrashHandler?: ?boolean, - extra?: ?{}, - crashesDirectory?: ?string, - }) => void, - getLastCrashReport: () => CrashReport, - getUploadedReports: () => Array, - getUploadToServer: () => boolean, - setUploadToServer: (uploadToServer: boolean) => void, - addExtraParameter: (key: string, value: string) => void, - removeExtraParameter: (key: string) => void, - getParameters: () => void, - }, - desktopCapturer: { - getSources: ( - options: { - types: Array, - thumbnailSize?: ?Size, - }, - callback: Function, - ) => void, - }, - ipcRenderer: { - on: (channel: string, listener: Function) => void, - once: (channel: string, listener: Function) => void, - removeListener: (channel: string, listener: Function) => void, - removeAllListeners: (channel: string) => void, - send: (channel: string, ...args: Array) => void, - sendSync: (channel: string, ...args: Array) => any, - sendTo: (windowId: number, channel: string, ...args: Array) => void, - sendToHost: (channel: string, ...args: Array) => void, - }, - nativeImage: { - createEmpty: () => NativeImage, - createFromPath: (path: string) => NativeImage, - createFromBuffer: ( - buffer: Buffer, - options?: ?{ - width?: ?number, - height?: ?number, - scaleFactor?: ?number, - }, - ) => NativeImage, - createFromDataURL: (dataURL: string) => NativeImage, - createFromNamedImage: ( - imageName: string, - hslShift: Array, - ) => NativeImage, - }, - process: { - crash: () => void, - getCPUUsage: () => CPUUsage, - getIOCounters: () => IOCounters, - getProcessMemoryInfo: () => { - workingSetSize: number, - peakWorkingSetSize: number, - privateBytes: number, - sharedBytes: number, - }, - getSystemMemoryInfo: () => { - total: number, - free: number, - swapTotal: number, - swapFree: number, - }, - hang: () => void, - setFdLimit: (maxDescriptors: number) => void, - on: (eventName: 'loaded', callback: () => void) => void, - once: (eventName: 'loaded', callback: () => void) => void, - defaultApp?: ?boolean, - mas?: ?boolean, - noAsar?: ?boolean, - noDeprecation?: ?boolean, - resourcesPath?: ?string, - throwDeprecation?: ?boolean, - traceDeprecation?: ?boolean, - traceProcessWarnings?: ?boolean, - type?: ?string, - windowsStore?: ?boolean, - versions: { - chrome?: ?string, - electron?: ?string, - }, - }, - remote: { - require: (module: string) => any, - getCurrentWindow: () => BrowserWindow, - getCurrentWebContents: () => WebContents, - getGlobal: (name: string) => any, - process?: ?any, - app: { - quit: () => void, - exit: (exitCode?: ?number) => void, - relaunch: ( - options?: ?{ - args?: ?Array, - execPath?: ?string, - }, - ) => void, - isReady: () => boolean, - focus: () => void, - hide: () => void, - show: () => void, - getAppPath: () => string, - getPath: (name: string) => string, - getFileIcon: ( - path: string, - options?: ?{ - size: 'small' | 'normal' | 'large', - }, - callback: Function, - ) => void, - setPath: (name: string, path: string) => void, - getVersion: () => string, - getName: () => string, - setName: (name: string) => void, - getLocale: () => string, - addRecentDocument: (path: string) => void, - clearRecentDocuments: () => void, - setAsDefaultProtocolClient: ( - protocol: string, - path?: ?string, - args?: ?Array, - ) => boolean, - removeAsDefaultProtocolClient: ( - protocol: string, - path?: ?string, - args?: ?Array, - ) => boolean, - isDefaultProtocolClient: ( - protocol: string, - path?: ?string, - args?: ?Array, - ) => boolean, - setUserTasks: (tasks: Array) => boolean, - getJumpListSettings: () => { - minItems: number, - removedItems: Array, - }, - setJumpList: (categories: Array) => void, - makeSingleInstance: (callback: Function) => boolean, - releaseSingleInstance: () => void, - setUserActivity: ( - type: string, - userInfo: {}, - webpageURL?: ?string, - ) => void, - getCurrentActivityType: () => string, - invalidateCurrentActivity: (type: string) => void, - updateCurrentActivity: (type: string, userInfo: {}) => void, - setAppUserModelId: (id: string) => void, - importCertificate: ( - options: { - certificate: string, - password: string, - }, - callback: Function, - ) => void, - disableHardwareAcceleration: () => void, - disableDomainBlockingFor3DAPIs: () => void, - getAppMetrics: () => Array, - getGPUFeatureStatus: () => GPUFeatureStatus, - setBadgeCount: (count: number) => boolean, - getBadgeCount: () => number, - isUnityRunning: () => boolean, - getLoginItemSettings: ( - options?: ?{ - path?: ?string, - args?: ?Array, - }, - ) => { - options?: ?{ - path?: ?string, - args?: ?Array, - }, - openAtLogin: boolean, - openAsHidden: boolean, - wasOpenedAtLogin: boolean, - wasOpenedAsHidden: boolean, - restoreState: boolean, - }, - setLoginItemSettings: (settings: { - openAtLogin?: ?boolean, - openAsHidden?: ?boolean, - path?: ?string, - args?: ?Array, - }) => void, - isAccessibilitySupportEnabled: () => boolean, - setAccessibilitySupportEnabled: (enabled: boolean) => void, - setAboutPanelOptions: (options: { - applicationName?: ?string, - applicationVersion?: ?string, - copyright?: ?string, - credits?: ?string, - version?: ?string, - }) => void, - startAccessingSecurityScopedResource: ( - bookmarkData: string, - ) => Function, - enableMixedSandbox: () => void, - isInApplicationsFolder: () => boolean, - moveToApplicationsFolder: () => boolean, - on: (( - eventName: 'will-finish-launching', - callback: () => void, - ) => void) & - ((eventName: 'ready', callback: (launchInfo: {}) => void) => void) & - ((eventName: 'window-all-closed', callback: () => void) => void) & - (( - eventName: 'before-quit', - callback: (event: Event) => void, - ) => void) & - ((eventName: 'will-quit', callback: (event: Event) => void) => void) & - (( - eventName: 'quit', - callback: (event: Event, exitCode: number) => void, - ) => void) & - (( - eventName: 'open-file', - callback: (event: Event, path: string) => void, - ) => void) & - (( - eventName: 'open-url', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'activate', - callback: (event: Event, hasVisibleWindows: boolean) => void, - ) => void) & - (( - eventName: 'continue-activity', - callback: (event: Event, type: string, userInfo: {}) => void, - ) => void) & - (( - eventName: 'will-continue-activity', - callback: (event: Event, type: string) => void, - ) => void) & - (( - eventName: 'continue-activity-error', - callback: (event: Event, type: string, error: string) => void, - ) => void) & - (( - eventName: 'activity-was-continued', - callback: (event: Event, type: string, userInfo: {}) => void, - ) => void) & - (( - eventName: 'update-activity-state', - callback: (event: Event, type: string, userInfo: {}) => void, - ) => void) & - (( - eventName: 'new-window-for-tab', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'browser-window-blur', - callback: (event: Event, window: BrowserWindow) => void, - ) => void) & - (( - eventName: 'browser-window-focus', - callback: (event: Event, window: BrowserWindow) => void, - ) => void) & - (( - eventName: 'browser-window-created', - callback: (event: Event, window: BrowserWindow) => void, - ) => void) & - (( - eventName: 'web-contents-created', - callback: (event: Event, webContents: WebContents) => void, - ) => void) & - (( - eventName: 'certificate-error', - callback: ( - event: Event, - webContents: WebContents, - url: string, - error: string, - certificate: Certificate, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'select-client-certificate', - callback: ( - event: Event, - webContents: WebContents, - url: URL, - certificateList: Array, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'login', - callback: ( - event: Event, - webContents: WebContents, - request: { - method: string, - url: URL, - referrer: URL, - }, - authInfo: { - isProxy: boolean, - scheme: string, - host: string, - port: number, - realm: string, - }, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'gpu-process-crashed', - callback: (event: Event, killed: boolean) => void, - ) => void) & - (( - eventName: 'accessibility-support-changed', - callback: ( - event: Event, - accessibilitySupportEnabled: boolean, - ) => void, - ) => void) & - (( - eventName: 'session-created', - callback: (event: Event, session: Session) => void, - ) => void), - once: (( - eventName: 'will-finish-launching', - callback: () => void, - ) => void) & - ((eventName: 'ready', callback: (launchInfo: {}) => void) => void) & - ((eventName: 'window-all-closed', callback: () => void) => void) & - (( - eventName: 'before-quit', - callback: (event: Event) => void, - ) => void) & - ((eventName: 'will-quit', callback: (event: Event) => void) => void) & - (( - eventName: 'quit', - callback: (event: Event, exitCode: number) => void, - ) => void) & - (( - eventName: 'open-file', - callback: (event: Event, path: string) => void, - ) => void) & - (( - eventName: 'open-url', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'activate', - callback: (event: Event, hasVisibleWindows: boolean) => void, - ) => void) & - (( - eventName: 'continue-activity', - callback: (event: Event, type: string, userInfo: {}) => void, - ) => void) & - (( - eventName: 'will-continue-activity', - callback: (event: Event, type: string) => void, - ) => void) & - (( - eventName: 'continue-activity-error', - callback: (event: Event, type: string, error: string) => void, - ) => void) & - (( - eventName: 'activity-was-continued', - callback: (event: Event, type: string, userInfo: {}) => void, - ) => void) & - (( - eventName: 'update-activity-state', - callback: (event: Event, type: string, userInfo: {}) => void, - ) => void) & - (( - eventName: 'new-window-for-tab', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'browser-window-blur', - callback: (event: Event, window: BrowserWindow) => void, - ) => void) & - (( - eventName: 'browser-window-focus', - callback: (event: Event, window: BrowserWindow) => void, - ) => void) & - (( - eventName: 'browser-window-created', - callback: (event: Event, window: BrowserWindow) => void, - ) => void) & - (( - eventName: 'web-contents-created', - callback: (event: Event, webContents: WebContents) => void, - ) => void) & - (( - eventName: 'certificate-error', - callback: ( - event: Event, - webContents: WebContents, - url: string, - error: string, - certificate: Certificate, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'select-client-certificate', - callback: ( - event: Event, - webContents: WebContents, - url: URL, - certificateList: Array, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'login', - callback: ( - event: Event, - webContents: WebContents, - request: { - method: string, - url: URL, - referrer: URL, - }, - authInfo: { - isProxy: boolean, - scheme: string, - host: string, - port: number, - realm: string, - }, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'gpu-process-crashed', - callback: (event: Event, killed: boolean) => void, - ) => void) & - (( - eventName: 'accessibility-support-changed', - callback: ( - event: Event, - accessibilitySupportEnabled: boolean, - ) => void, - ) => void) & - (( - eventName: 'session-created', - callback: (event: Event, session: Session) => void, - ) => void), - commandLine: { - appendSwitch?: ?Function, - appendArgument?: ?Function, - }, - dock: { - bounce?: ?Function, - cancelBounce?: ?Function, - downloadFinished?: ?Function, - setBadge?: ?Function, - getBadge?: ?Function, - hide?: ?Function, - show?: ?Function, - isVisible?: ?Function, - setMenu?: ?Function, - setIcon?: ?Function, - }, - }, - autoUpdater: { - setFeedURL: (options: { - url: string, - headers?: ?{}, - serverType?: ?string, - }) => void, - getFeedURL: () => string, - checkForUpdates: () => void, - quitAndInstall: () => void, - on: ((eventName: 'error', callback: (error: Error) => void) => void) & - ((eventName: 'checking-for-update', callback: () => void) => void) & - ((eventName: 'update-available', callback: () => void) => void) & - ((eventName: 'update-not-available', callback: () => void) => void) & - (( - eventName: 'update-downloaded', - callback: ( - event: Event, - releaseNotes: string, - releaseName: string, - releaseDate: Date, - updateURL: string, - ) => void, - ) => void), - once: ((eventName: 'error', callback: (error: Error) => void) => void) & - ((eventName: 'checking-for-update', callback: () => void) => void) & - ((eventName: 'update-available', callback: () => void) => void) & - ((eventName: 'update-not-available', callback: () => void) => void) & - (( - eventName: 'update-downloaded', - callback: ( - event: Event, - releaseNotes: string, - releaseName: string, - releaseDate: Date, - updateURL: string, - ) => void, - ) => void), - }, - clipboard: { - readText: (type?: ?string) => string, - writeText: (text: string, type?: ?string) => void, - readHTML: (type?: ?string) => string, - writeHTML: (markup: string, type?: ?string) => void, - readImage: (type?: ?string) => NativeImage, - writeImage: (image: NativeImage, type?: ?string) => void, - readRTF: (type?: ?string) => string, - writeRTF: (text: string, type?: ?string) => void, - readBookmark: () => { - title: string, - url: string, - }, - writeBookmark: (title: string, url: string, type?: ?string) => void, - readFindText: () => string, - writeFindText: (text: string) => void, - clear: (type?: ?string) => void, - availableFormats: (type?: ?string) => Array, - has: (format: string, type?: ?string) => boolean, - read: (format: string) => string, - readBuffer: (format: string) => Buffer, - writeBuffer: (format: string, buffer: Buffer, type?: ?string) => void, - write: ( - data: { - text?: ?string, - html?: ?string, - image?: ?NativeImage, - rtf?: ?string, - bookmark?: ?string, - }, - type?: ?string, - ) => void, - }, - contentTracing: { - getCategories: (callback: Function) => void, - startRecording: ( - options: { - categoryFilter: string, - traceOptions: string, - }, - callback: Function, - ) => void, - stopRecording: (resultFilePath: string, callback: Function) => void, - startMonitoring: ( - options: { - categoryFilter: string, - traceOptions: string, - }, - callback: Function, - ) => void, - stopMonitoring: (callback: Function) => void, - captureMonitoringSnapshot: ( - resultFilePath: string, - callback: Function, - ) => void, - getTraceBufferUsage: (callback: Function) => void, - }, - crashReporter: { - start: (options: { - companyName?: ?string, - submitURL: string, - productName?: ?string, - uploadToServer?: ?boolean, - ignoreSystemCrashHandler?: ?boolean, - extra?: ?{}, - crashesDirectory?: ?string, - }) => void, - getLastCrashReport: () => CrashReport, - getUploadedReports: () => Array, - getUploadToServer: () => boolean, - setUploadToServer: (uploadToServer: boolean) => void, - addExtraParameter: (key: string, value: string) => void, - removeExtraParameter: (key: string) => void, - getParameters: () => void, - }, - dialog: { - showOpenDialog: (( - browserWindow?: ?BrowserWindow, - options: { - title?: ?string, - defaultPath?: ?string, - buttonLabel?: ?string, - filters?: ?Array, - properties?: ?Array< - | 'openFile' - | 'openDirectory' - | 'multiSelections' - | 'showHiddenFiles' - | 'createDirectory' - | 'promptToCreate' - | 'noResolveAliases' - | 'treatPackageAsDirectory', - >, - message?: ?string, - securityScopedBookmarks?: ?boolean, - }, - callback?: ?Function, - ) => Array) & - (( - options: { - title?: ?string, - defaultPath?: ?string, - buttonLabel?: ?string, - filters?: ?Array, - properties?: ?Array< - | 'openFile' - | 'openDirectory' - | 'multiSelections' - | 'showHiddenFiles' - | 'createDirectory' - | 'promptToCreate' - | 'noResolveAliases' - | 'treatPackageAsDirectory', - >, - message?: ?string, - securityScopedBookmarks?: ?boolean, - }, - callback?: ?Function, - ) => Array), - showSaveDialog: (( - browserWindow?: ?BrowserWindow, - options: { - title?: ?string, - defaultPath?: ?string, - buttonLabel?: ?string, - filters?: ?Array, - message?: ?string, - nameFieldLabel?: ?string, - showsTagField?: ?boolean, - securityScopedBookmarks?: ?boolean, - }, - callback?: ?Function, - ) => string) & - (( - options: { - title?: ?string, - defaultPath?: ?string, - buttonLabel?: ?string, - filters?: ?Array, - message?: ?string, - nameFieldLabel?: ?string, - showsTagField?: ?boolean, - securityScopedBookmarks?: ?boolean, - }, - callback?: ?Function, - ) => string), - showMessageBox: (( - browserWindow?: ?BrowserWindow, - options: { - type?: ?string, - buttons?: ?Array, - defaultId?: ?number, - title?: ?string, - message: string, - detail?: ?string, - checkboxLabel?: ?string, - checkboxChecked?: ?boolean, - icon?: ?NativeImage, - cancelId?: ?number, - noLink?: ?boolean, - normalizeAccessKeys?: ?boolean, - }, - callback?: ?Function, - ) => number) & - (( - options: { - type?: ?string, - buttons?: ?Array, - defaultId?: ?number, - title?: ?string, - message: string, - detail?: ?string, - checkboxLabel?: ?string, - checkboxChecked?: ?boolean, - icon?: ?NativeImage, - cancelId?: ?number, - noLink?: ?boolean, - normalizeAccessKeys?: ?boolean, - }, - callback?: ?Function, - ) => number), - showErrorBox: (title: string, content: string) => void, - showCertificateTrustDialog: (( - browserWindow?: ?BrowserWindow, - options: { - certificate: Certificate, - message: string, - }, - callback: Function, - ) => void) & - (( - options: { - certificate: Certificate, - message: string, - }, - callback: Function, - ) => void), - }, - globalShortcut: { - register: (accelerator: Accelerator, callback: Function) => void, - isRegistered: (accelerator: Accelerator) => boolean, - unregister: (accelerator: Accelerator) => void, - unregisterAll: () => void, - }, - inAppPurchase: { - purchaseProduct: ( - productID: string, - quantity?: ?number, - callback?: ?Function, - ) => void, - canMakePayments: () => boolean, - getReceiptURL: () => string, - on: ( - eventName: 'transactions-updated', - callback: (event: Event, transactions: Array) => void, - ) => void, - once: ( - eventName: 'transactions-updated', - callback: (event: Event, transactions: Array) => void, - ) => void, - }, - ipcMain: { - on: (channel: string, listener: Function) => void, - once: (channel: string, listener: Function) => void, - removeListener: (channel: string, listener: Function) => void, - removeAllListeners: (channel: string) => void, - }, - nativeImage: { - createEmpty: () => NativeImage, - createFromPath: (path: string) => NativeImage, - createFromBuffer: ( - buffer: Buffer, - options?: ?{ - width?: ?number, - height?: ?number, - scaleFactor?: ?number, - }, - ) => NativeImage, - createFromDataURL: (dataURL: string) => NativeImage, - createFromNamedImage: ( - imageName: string, - hslShift: Array, - ) => NativeImage, - }, - net: { - request: (options: Object | string) => ClientRequest, - }, - powerMonitor: { - on: ((eventName: 'suspend', callback: () => void) => void) & - ((eventName: 'resume', callback: () => void) => void) & - ((eventName: 'on-ac', callback: () => void) => void) & - ((eventName: 'on-battery', callback: () => void) => void) & - ((eventName: 'shutdown', callback: () => void) => void), - once: ((eventName: 'suspend', callback: () => void) => void) & - ((eventName: 'resume', callback: () => void) => void) & - ((eventName: 'on-ac', callback: () => void) => void) & - ((eventName: 'on-battery', callback: () => void) => void) & - ((eventName: 'shutdown', callback: () => void) => void), - }, - powerSaveBlocker: { - start: ( - type: 'prevent-app-suspension' | 'prevent-display-sleep', - ) => number, - stop: (id: number) => void, - isStarted: (id: number) => boolean, - }, - process: { - crash: () => void, - getCPUUsage: () => CPUUsage, - getIOCounters: () => IOCounters, - getProcessMemoryInfo: () => { - workingSetSize: number, - peakWorkingSetSize: number, - privateBytes: number, - sharedBytes: number, - }, - getSystemMemoryInfo: () => { - total: number, - free: number, - swapTotal: number, - swapFree: number, - }, - hang: () => void, - setFdLimit: (maxDescriptors: number) => void, - on: (eventName: 'loaded', callback: () => void) => void, - once: (eventName: 'loaded', callback: () => void) => void, - defaultApp?: ?boolean, - mas?: ?boolean, - noAsar?: ?boolean, - noDeprecation?: ?boolean, - resourcesPath?: ?string, - throwDeprecation?: ?boolean, - traceDeprecation?: ?boolean, - traceProcessWarnings?: ?boolean, - type?: ?string, - windowsStore?: ?boolean, - versions: { - chrome?: ?string, - electron?: ?string, - }, - }, - protocol: { - registerStandardSchemes: ( - schemes: Array, - options?: ?{ - secure?: ?boolean, - }, - ) => void, - registerServiceWorkerSchemes: (schemes: Array) => void, - registerFileProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - registerBufferProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - registerStringProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - registerHttpProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - registerStreamProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - unregisterProtocol: (scheme: string, completion?: ?Function) => void, - isProtocolHandled: (scheme: string, callback: Function) => void, - interceptFileProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - interceptStringProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - interceptBufferProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - interceptHttpProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - interceptStreamProtocol: ( - scheme: string, - handler: Function, - completion?: ?Function, - ) => void, - uninterceptProtocol: (scheme: string, completion?: ?Function) => void, - }, - screen: { - getCursorScreenPoint: () => Point, - getMenuBarHeight: () => number, - getPrimaryDisplay: () => Display, - getAllDisplays: () => Array, - getDisplayNearestPoint: (point: Point) => Display, - getDisplayMatching: (rect: Rectangle) => Display, - on: (( - eventName: 'display-added', - callback: (event: Event, newDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-removed', - callback: (event: Event, oldDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-metrics-changed', - callback: ( - event: Event, - display: Display, - changedMetrics: Array, - ) => void, - ) => void), - once: (( - eventName: 'display-added', - callback: (event: Event, newDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-removed', - callback: (event: Event, oldDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-metrics-changed', - callback: ( - event: Event, - display: Display, - changedMetrics: Array, - ) => void, - ) => void), - }, - session: { - fromPartition: ( - partition: string, - options?: ?{ - cache: boolean, - }, - ) => Session, - defaultSession?: ?Session, - }, - shell: { - showItemInFolder: (fullPath: string) => boolean, - openItem: (fullPath: string) => boolean, - openExternal: ( - url: string, - options?: ?{ - activate: boolean, - }, - callback?: ?Function, - ) => boolean, - moveItemToTrash: (fullPath: string) => boolean, - beep: () => void, - writeShortcutLink: ( - shortcutPath: string, - operation?: ?'create' | 'update' | 'replace', - options: ShortcutDetails, - ) => boolean, - readShortcutLink: (shortcutPath: string) => ShortcutDetails, - }, - systemPreferences: { - isDarkMode: () => boolean, - isSwipeTrackingFromScrollEventsEnabled: () => boolean, - postNotification: (event: string, userInfo: {}) => void, - postLocalNotification: (event: string, userInfo: {}) => void, - subscribeNotification: (event: string, callback: Function) => void, - unsubscribeNotification: (id: number) => void, - subscribeLocalNotification: (event: string, callback: Function) => void, - unsubscribeLocalNotification: (id: number) => void, - registerDefaults: (defaults: {}) => void, - getUserDefault: ( - key: string, - type: - | 'string' - | 'boolean' - | 'integer' - | 'float' - | 'double' - | 'url' - | 'array' - | 'dictionary', - ) => any, - setUserDefault: (key: string, type: string, value: string) => void, - removeUserDefault: (key: string) => void, - isAeroGlassEnabled: () => boolean, - getAccentColor: () => string, - getColor: ( - color: - | '3d-dark-shadow' - | '3d-face' - | '3d-highlight' - | '3d-light' - | '3d-shadow' - | 'active-border' - | 'active-caption' - | 'active-caption-gradient' - | 'app-workspace' - | 'button-text' - | 'caption-text' - | 'desktop' - | 'disabled-text' - | 'highlight' - | 'highlight-text' - | 'hotlight' - | 'inactive-border' - | 'inactive-caption' - | 'inactive-caption-gradient' - | 'inactive-caption-text' - | 'info-background' - | 'info-text' - | 'menu' - | 'menu-highlight' - | 'menubar' - | 'menu-text' - | 'scrollbar' - | 'window' - | 'window-frame' - | 'window-text', - ) => string, - isInvertedColorScheme: () => boolean, - on: (( - eventName: 'accent-color-changed', - callback: (event: Event, newColor: string) => void, - ) => void) & - (( - eventName: 'color-changed', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'inverted-color-scheme-changed', - callback: (event: Event, invertedColorScheme: boolean) => void, - ) => void), - once: (( - eventName: 'accent-color-changed', - callback: (event: Event, newColor: string) => void, - ) => void) & - (( - eventName: 'color-changed', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'inverted-color-scheme-changed', - callback: (event: Event, invertedColorScheme: boolean) => void, - ) => void), - }, - webContents: { - getAllWebContents: () => Array, - getFocusedWebContents: () => WebContents, - fromId: (id: number) => WebContents, - }, - BrowserView: Class, - BrowserWindow: Class, - ClientRequest: Class, - Cookies: Class, - Debugger: Class, - DownloadItem: Class, - IncomingMessage: Class, - Menu: Class, - MenuItem: Class, - NativeImage: Class, - Notification: Class, - Session: Class, - TouchBar: Class, - Tray: Class, - WebContents: Class, - WebRequest: Class, - }, - screen: { - getCursorScreenPoint: () => Point, - getMenuBarHeight: () => number, - getPrimaryDisplay: () => Display, - getAllDisplays: () => Array, - getDisplayNearestPoint: (point: Point) => Display, - getDisplayMatching: (rect: Rectangle) => Display, - on: (( - eventName: 'display-added', - callback: (event: Event, newDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-removed', - callback: (event: Event, oldDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-metrics-changed', - callback: ( - event: Event, - display: Display, - changedMetrics: Array, - ) => void, - ) => void), - once: (( - eventName: 'display-added', - callback: (event: Event, newDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-removed', - callback: (event: Event, oldDisplay: Display) => void, - ) => void) & - (( - eventName: 'display-metrics-changed', - callback: ( - event: Event, - display: Display, - changedMetrics: Array, - ) => void, - ) => void), - }, - shell: { - showItemInFolder: (fullPath: string) => boolean, - openItem: (fullPath: string) => boolean, - openExternal: ( - url: string, - options?: ?{ - activate: boolean, - }, - callback?: ?Function, - ) => boolean, - moveItemToTrash: (fullPath: string) => boolean, - beep: () => void, - writeShortcutLink: ( - shortcutPath: string, - operation?: ?'create' | 'update' | 'replace', - options: ShortcutDetails, - ) => boolean, - readShortcutLink: (shortcutPath: string) => ShortcutDetails, - }, - webFrame: { - setZoomFactor: (factor: number) => void, - getZoomFactor: () => number, - setZoomLevel: (level: number) => void, - getZoomLevel: () => number, - setVisualZoomLevelLimits: ( - minimumLevel: number, - maximumLevel: number, - ) => void, - setLayoutZoomLevelLimits: ( - minimumLevel: number, - maximumLevel: number, - ) => void, - setSpellCheckProvider: ( - language: string, - autoCorrectWord: boolean, - provider: { - spellCheck: Function, - }, - ) => void, - registerURLSchemeAsSecure: (scheme: string) => void, - registerURLSchemeAsBypassingCSP: (scheme: string) => void, - registerURLSchemeAsPrivileged: ( - scheme: string, - options?: ?{ - secure?: ?boolean, - bypassCSP?: ?boolean, - allowServiceWorkers?: ?boolean, - supportFetchAPI?: ?boolean, - corsEnabled?: ?boolean, - }, - ) => void, - insertText: (text: string) => void, - executeJavaScript: ( - code: string, - userGesture?: ?boolean, - callback?: ?Function, - ) => Promise, - executeJavaScriptInIsolatedWorld: ( - worldId: number, - scripts: Array, - userGesture?: ?boolean, - callback?: ?Function, - ) => void, - setIsolatedWorldContentSecurityPolicy: ( - worldId: number, - csp: string, - ) => void, - setIsolatedWorldHumanReadableName: ( - worldId: number, - name: string, - ) => void, - setIsolatedWorldSecurityOrigin: ( - worldId: number, - securityOrigin: string, - ) => void, - getResourceUsage: () => { - images: MemoryUsageDetails, - scripts: MemoryUsageDetails, - cssStyleSheets: MemoryUsageDetails, - xslStyleSheets: MemoryUsageDetails, - fonts: MemoryUsageDetails, - other: MemoryUsageDetails, - }, - clearCache: () => void, - }, - BrowserWindowProxy: Class, - NativeImage: Class, - }; - declare type BluetoothDevice = { - deviceName: string, - deviceId: string, - }; - declare type Certificate = { - data: string, - issuer: CertificatePrincipal, - issuerName: string, - issuerCert: Certificate, - subject: CertificatePrincipal, - subjectName: string, - serialNumber: string, - validStart: number, - validExpiry: number, - fingerprint: string, - }; - declare type CertificatePrincipal = { - commonName: string, - organizations: Array, - organizationUnits: Array, - locality: string, - state: string, - country: string, - }; - declare type Cookie = { - name: string, - value: string, - domain?: ?string, - hostOnly?: ?boolean, - path?: ?string, - secure?: ?boolean, - httpOnly?: ?boolean, - session?: ?boolean, - expirationDate?: ?number, - }; - declare type CPUUsage = { - percentCPUUsage: number, - idleWakeupsPerSecond: number, - }; - declare type CrashReport = { - date: Date, - id: string, - }; - declare type DesktopCapturerSource = { - id: string, - name: string, - thumbnail: NativeImage, - }; - declare type Display = { - id: number, - rotation: number, - scaleFactor: number, - touchSupport: 'available' | 'unavailable' | 'unknown', - bounds: Rectangle, - size: Size, - workArea: Rectangle, - workAreaSize: Size, - }; - declare type FileFilter = { - name: string, - extensions: Array, - }; - declare type GPUFeatureStatus = { - '2d_canvas': string, - flash_3d: string, - flash_stage3d: string, - flash_stage3d_baseline: string, - gpu_compositing: string, - multiple_raster_threads: string, - native_gpu_memory_buffers: string, - rasterization: string, - video_decode: string, - video_encode: string, - vpx_decode: string, - webgl: string, - webgl2: string, - }; - declare type IOCounters = { - readOperationCount: number, - writeOperationCount: number, - otherOperationCount: number, - readTransferCount: number, - writeTransferCount: number, - otherTransferCount: number, - }; - declare type JumpListCategory = { - type?: ?'tasks' | 'frequent' | 'recent' | 'custom', - name?: ?string, - items?: ?Array, - }; - declare type JumpListItem = { - type?: ?'task' | 'separator' | 'file', - path?: ?string, - program?: ?string, - args?: ?string, - title?: ?string, - description?: ?string, - iconPath?: ?string, - iconIndex?: ?number, - }; - declare type MemoryInfo = { - pid: number, - workingSetSize: number, - peakWorkingSetSize: number, - privateBytes: number, - sharedBytes: number, - }; - declare type MemoryUsageDetails = { - count: number, - size: number, - liveSize: number, - }; - declare type MimeTypedBuffer = { - mimeType: string, - data: Buffer, - }; - declare type NotificationAction = { - type: 'button', - text?: ?string, - }; - declare type Point = { - x: number, - y: number, - }; - declare type PrinterInfo = { - name: string, - description: string, - status: number, - isDefault: boolean, - }; - declare type ProcessMetric = { - pid: number, - type: string, - memory: MemoryInfo, - cpu: CPUUsage, - }; - declare type Rectangle = { - x: number, - y: number, - width: number, - height: number, - }; - declare type RemoveClientCertificate = { - type: string, - origin: string, - }; - declare type RemovePassword = { - type: string, - origin?: ?string, - scheme?: ?'basic' | 'digest' | 'ntlm' | 'negotiate', - realm?: ?string, - username?: ?string, - password?: ?string, - }; - declare type ScrubberItem = { - label?: ?string, - icon?: ?NativeImage, - }; - declare type SegmentedControlSegment = { - label?: ?string, - icon?: ?NativeImage, - enabled?: ?boolean, - }; - declare type ShortcutDetails = { - target: string, - cwd?: ?string, - args?: ?string, - description?: ?string, - icon?: ?string, - iconIndex?: ?number, - appUserModelId?: ?string, - }; - declare type Size = { - width: number, - height: number, - }; - declare type StreamProtocolResponse = { - statusCode: number, - headers: {}, - data: ReadableStream, - }; - declare type Task = { - program: string, - arguments: string, - title: string, - description: string, - iconPath: string, - iconIndex: number, - }; - declare type ThumbarButton = { - icon: NativeImage, - click: Function, - tooltip?: ?string, - flags?: ?Array, - }; - declare type Transaction = { - transactionIdentifier: string, - transactionDate: string, - originalTransactionIdentifier: string, - transactionState: string, - errorCode: number, - errorMessage: string, - payment: { - productIdentifier: string, - quantity: number, - }, - }; - declare type UploadBlob = { - type: string, - blobUUID: string, - }; - declare type UploadData = { - bytes: Buffer, - file: string, - blobUUID: string, - }; - declare type UploadFile = { - type: string, - filePath: string, - offset: number, - length: number, - modificationTime: number, - }; - declare type UploadFileSystem = { - type: string, - filsSystemURL: string, - offset: number, - length: number, - modificationTime: number, - }; - declare type UploadRawData = { - type: string, - bytes: Buffer, - }; - declare type WebSource = { - code: string, - url?: ?string, - startLine?: ?number, - }; - declare class webviewTag extends HTMLElement { - loadURL: ( - url: URL, - options?: ?{ - httpReferrer?: ?string, - userAgent?: ?string, - extraHeaders?: ?string, - postData?: - | ?Array - | Array - | Array - | Array, - baseURLForDataURL?: ?string, - }, - ) => void; - getURL: () => string; - getTitle: () => string; - isLoading: () => boolean; - isWaitingForResponse: () => boolean; - stop: () => void; - reload: () => void; - reloadIgnoringCache: () => void; - canGoBack: () => boolean; - canGoForward: () => boolean; - canGoToOffset: (offset: number) => boolean; - clearHistory: () => void; - goBack: () => void; - goForward: () => void; - goToIndex: (index: number) => void; - goToOffset: (offset: number) => void; - isCrashed: () => boolean; - setUserAgent: (userAgent: string) => void; - getUserAgent: () => string; - insertCSS: (css: string) => void; - executeJavaScript: ( - code: string, - userGesture?: ?boolean, - callback?: ?Function, - ) => void; - openDevTools: () => void; - closeDevTools: () => void; - isDevToolsOpened: () => boolean; - isDevToolsFocused: () => boolean; - inspectElement: (x: number, y: number) => void; - inspectServiceWorker: () => void; - setAudioMuted: (muted: boolean) => void; - isAudioMuted: () => boolean; - undo: () => void; - redo: () => void; - cut: () => void; - copy: () => void; - paste: () => void; - pasteAndMatchStyle: () => void; - delete: () => void; - selectAll: () => void; - unselect: () => void; - replace: (text: string) => void; - replaceMisspelling: (text: string) => void; - insertText: (text: string) => void; - findInPage: ( - text: string, - options?: ?{ - forward?: ?boolean, - findNext?: ?boolean, - matchCase?: ?boolean, - wordStart?: ?boolean, - medialCapitalAsWordStart?: ?boolean, - }, - ) => number; - stopFindInPage: ( - action: 'clearSelection' | 'keepSelection' | 'activateSelection', - ) => void; - print: ( - options?: ?{ - silent?: ?boolean, - printBackground?: ?boolean, - deviceName?: ?string, - }, - ) => void; - printToPDF: ( - options: { - marginsType?: ?number, - pageSize?: ?string, - printBackground?: ?boolean, - printSelectionOnly?: ?boolean, - landscape?: ?boolean, - }, - callback: Function, - ) => void; - capturePage: ((rect?: ?Rectangle, callback: Function) => void) & - ((callback: Function) => void); - send: (channel: string, ...args: Array) => void; - sendInputEvent: (event: {}) => void; - setZoomFactor: (factor: number) => void; - setZoomLevel: (level: number) => void; - showDefinitionForSelection: () => void; - getWebContents: () => WebContents; - on: (( - eventName: 'load-commit', - callback: (url: string, isMainFrame: boolean) => void, - ) => void) & - ((eventName: 'did-finish-load', callback: () => void) => void) & - (( - eventName: 'did-fail-load', - callback: ( - errorCode: number, - errorDescription: string, - validatedURL: string, - isMainFrame: boolean, - ) => void, - ) => void) & - (( - eventName: 'did-frame-finish-load', - callback: (isMainFrame: boolean) => void, - ) => void) & - ((eventName: 'did-start-loading', callback: () => void) => void) & - ((eventName: 'did-stop-loading', callback: () => void) => void) & - (( - eventName: 'did-get-response-details', - callback: ( - status: boolean, - newURL: string, - originalURL: string, - httpResponseCode: number, - requestMethod: string, - referrer: string, - headers: {}, - resourceType: string, - ) => void, - ) => void) & - (( - eventName: 'did-get-redirect-request', - callback: ( - oldURL: string, - newURL: string, - isMainFrame: boolean, - ) => void, - ) => void) & - ((eventName: 'dom-ready', callback: () => void) => void) & - (( - eventName: 'page-title-updated', - callback: (title: string, explicitSet: boolean) => void, - ) => void) & - (( - eventName: 'page-favicon-updated', - callback: (favicons: Array) => void, - ) => void) & - ((eventName: 'enter-html-full-screen', callback: () => void) => void) & - ((eventName: 'leave-html-full-screen', callback: () => void) => void) & - (( - eventName: 'console-message', - callback: ( - level: number, - message: string, - line: number, - sourceId: string, - ) => void, - ) => void) & - (( - eventName: 'found-in-page', - callback: (result: { - requestId: number, - activeMatchOrdinal: number, - matches: number, - selectionArea: {}, - finalUpdate: boolean, - }) => void, - ) => void) & - (( - eventName: 'new-window', - callback: ( - url: string, - frameName: string, - disposition: - | 'default' - | 'foreground-tab' - | 'background-tab' - | 'new-window' - | 'save-to-disk' - | 'other', - options: {}, - ) => void, - ) => void) & - ((eventName: 'will-navigate', callback: (url: string) => void) => void) & - ((eventName: 'did-navigate', callback: (url: string) => void) => void) & - (( - eventName: 'did-navigate-in-page', - callback: (isMainFrame: boolean, url: string) => void, - ) => void) & - ((eventName: 'close', callback: () => void) => void) & - (( - eventName: 'ipc-message', - callback: (channel: string, args: Array) => void, - ) => void) & - ((eventName: 'crashed', callback: () => void) => void) & - ((eventName: 'gpu-crashed', callback: () => void) => void) & - (( - eventName: 'plugin-crashed', - callback: (name: string, version: string) => void, - ) => void) & - ((eventName: 'destroyed', callback: () => void) => void) & - ((eventName: 'media-started-playing', callback: () => void) => void) & - ((eventName: 'media-paused', callback: () => void) => void) & - (( - eventName: 'did-change-theme-color', - callback: (themeColor: string) => void, - ) => void) & - (( - eventName: 'update-target-url', - callback: (url: string) => void, - ) => void) & - ((eventName: 'devtools-opened', callback: () => void) => void) & - ((eventName: 'devtools-closed', callback: () => void) => void) & - ((eventName: 'devtools-focused', callback: () => void) => void); - once: (( - eventName: 'load-commit', - callback: (url: string, isMainFrame: boolean) => void, - ) => void) & - ((eventName: 'did-finish-load', callback: () => void) => void) & - (( - eventName: 'did-fail-load', - callback: ( - errorCode: number, - errorDescription: string, - validatedURL: string, - isMainFrame: boolean, - ) => void, - ) => void) & - (( - eventName: 'did-frame-finish-load', - callback: (isMainFrame: boolean) => void, - ) => void) & - ((eventName: 'did-start-loading', callback: () => void) => void) & - ((eventName: 'did-stop-loading', callback: () => void) => void) & - (( - eventName: 'did-get-response-details', - callback: ( - status: boolean, - newURL: string, - originalURL: string, - httpResponseCode: number, - requestMethod: string, - referrer: string, - headers: {}, - resourceType: string, - ) => void, - ) => void) & - (( - eventName: 'did-get-redirect-request', - callback: ( - oldURL: string, - newURL: string, - isMainFrame: boolean, - ) => void, - ) => void) & - ((eventName: 'dom-ready', callback: () => void) => void) & - (( - eventName: 'page-title-updated', - callback: (title: string, explicitSet: boolean) => void, - ) => void) & - (( - eventName: 'page-favicon-updated', - callback: (favicons: Array) => void, - ) => void) & - ((eventName: 'enter-html-full-screen', callback: () => void) => void) & - ((eventName: 'leave-html-full-screen', callback: () => void) => void) & - (( - eventName: 'console-message', - callback: ( - level: number, - message: string, - line: number, - sourceId: string, - ) => void, - ) => void) & - (( - eventName: 'found-in-page', - callback: (result: { - requestId: number, - activeMatchOrdinal: number, - matches: number, - selectionArea: {}, - finalUpdate: boolean, - }) => void, - ) => void) & - (( - eventName: 'new-window', - callback: ( - url: string, - frameName: string, - disposition: - | 'default' - | 'foreground-tab' - | 'background-tab' - | 'new-window' - | 'save-to-disk' - | 'other', - options: {}, - ) => void, - ) => void) & - ((eventName: 'will-navigate', callback: (url: string) => void) => void) & - ((eventName: 'did-navigate', callback: (url: string) => void) => void) & - (( - eventName: 'did-navigate-in-page', - callback: (isMainFrame: boolean, url: string) => void, - ) => void) & - ((eventName: 'close', callback: () => void) => void) & - (( - eventName: 'ipc-message', - callback: (channel: string, args: Array) => void, - ) => void) & - ((eventName: 'crashed', callback: () => void) => void) & - ((eventName: 'gpu-crashed', callback: () => void) => void) & - (( - eventName: 'plugin-crashed', - callback: (name: string, version: string) => void, - ) => void) & - ((eventName: 'destroyed', callback: () => void) => void) & - ((eventName: 'media-started-playing', callback: () => void) => void) & - ((eventName: 'media-paused', callback: () => void) => void) & - (( - eventName: 'did-change-theme-color', - callback: (themeColor: string) => void, - ) => void) & - (( - eventName: 'update-target-url', - callback: (url: string) => void, - ) => void) & - ((eventName: 'devtools-opened', callback: () => void) => void) & - ((eventName: 'devtools-closed', callback: () => void) => void) & - ((eventName: 'devtools-focused', callback: () => void) => void); - } - declare class BrowserView { - constructor( - options?: ?{ - webPreferences?: ?{}, - }, - ): BrowserView; - static getAllViews: () => Array; - static fromWebContents: (webContents: WebContents) => BrowserView | null; - static fromId: (id: number) => BrowserView; - destroy: () => void; - isDestroyed: () => boolean; - setAutoResize: (options: { - width: boolean, - height: boolean, - }) => void; - setBounds: (bounds: Rectangle) => void; - setBackgroundColor: (color: string) => void; - webContents: WebContents; - id: number; - } - declare class BrowserWindow { - constructor( - options?: ?{ - width?: ?number, - height?: ?number, - x?: ?number, - y?: ?number, - useContentSize?: ?boolean, - center?: ?boolean, - minWidth?: ?number, - minHeight?: ?number, - maxWidth?: ?number, - maxHeight?: ?number, - resizable?: ?boolean, - movable?: ?boolean, - minimizable?: ?boolean, - maximizable?: ?boolean, - closable?: ?boolean, - focusable?: ?boolean, - alwaysOnTop?: ?boolean, - fullscreen?: ?boolean, - fullscreenable?: ?boolean, - simpleFullscreen?: ?boolean, - skipTaskbar?: ?boolean, - kiosk?: ?boolean, - title?: ?string, - icon?: ?NativeImage | string, - show?: ?boolean, - frame?: ?boolean, - parent?: ?BrowserWindow, - modal?: ?boolean, - acceptFirstMouse?: ?boolean, - disableAutoHideCursor?: ?boolean, - autoHideMenuBar?: ?boolean, - enableLargerThanScreen?: ?boolean, - backgroundColor?: ?string, - hasShadow?: ?boolean, - opacity?: ?number, - darkTheme?: ?boolean, - transparent?: ?boolean, - type?: ?string, - titleBarStyle?: - | ?'default' - | 'hidden' - | 'hiddenInset' - | 'customButtonsOnHover', - fullscreenWindowTitle?: ?boolean, - thickFrame?: ?boolean, - vibrancy?: - | ?'appearance-based' - | 'light' - | 'dark' - | 'titlebar' - | 'selection' - | 'menu' - | 'popover' - | 'sidebar' - | 'medium-light' - | 'ultra-dark', - zoomToPageWidth?: ?boolean, - tabbingIdentifier?: ?string, - webPreferences?: ?{ - devTools?: ?boolean, - nodeIntegration?: ?boolean, - nodeIntegrationInWorker?: ?boolean, - preload?: ?string, - sandbox?: ?boolean, - session?: ?Session, - partition?: ?string, - affinity?: ?string, - zoomFactor?: ?number, - javascript?: ?boolean, - webSecurity?: ?boolean, - allowRunningInsecureContent?: ?boolean, - images?: ?boolean, - textAreasAreResizable?: ?boolean, - webgl?: ?boolean, - webaudio?: ?boolean, - plugins?: ?boolean, - experimentalFeatures?: ?boolean, - experimentalCanvasFeatures?: ?boolean, - scrollBounce?: ?boolean, - blinkFeatures?: ?string, - disableBlinkFeatures?: ?string, - defaultFontFamily?: ?{ - standard?: ?string, - serif?: ?string, - sansSerif?: ?string, - monospace?: ?string, - cursive?: ?string, - fantasy?: ?string, - }, - defaultFontSize?: ?number, - defaultMonospaceFontSize?: ?number, - minimumFontSize?: ?number, - defaultEncoding?: ?string, - backgroundThrottling?: ?boolean, - offscreen?: ?boolean, - contextIsolation?: ?boolean, - nativeWindowOpen?: ?boolean, - webviewTag?: ?boolean, - additionalArguments?: ?Array, - }, - }, - ): BrowserWindow; - static getAllWindows: () => Array; - static getFocusedWindow: () => BrowserWindow; - static fromWebContents: (webContents: WebContents) => BrowserWindow; - static fromBrowserView: (browserView: BrowserView) => BrowserWindow | null; - static fromId: (id: number) => BrowserWindow; - static addExtension: (path: string) => void; - static removeExtension: (name: string) => void; - static getExtensions: () => {}; - static addDevToolsExtension: (path: string) => void; - static removeDevToolsExtension: (name: string) => void; - static getDevToolsExtensions: () => {}; - destroy: () => void; - close: () => void; - focus: () => void; - blur: () => void; - isFocused: () => boolean; - isDestroyed: () => boolean; - show: () => void; - showInactive: () => void; - hide: () => void; - isVisible: () => boolean; - isModal: () => boolean; - maximize: () => void; - unmaximize: () => void; - isMaximized: () => boolean; - minimize: () => void; - restore: () => void; - isMinimized: () => boolean; - setFullScreen: (flag: boolean) => void; - isFullScreen: () => boolean; - setSimpleFullScreen: (flag: boolean) => void; - isSimpleFullScreen: () => boolean; - setAspectRatio: (aspectRatio: number, extraSize: Size) => void; - previewFile: (path: string, displayName?: ?string) => void; - closeFilePreview: () => void; - setBounds: (bounds: Rectangle, animate?: ?boolean) => void; - getBounds: () => Rectangle; - setContentBounds: (bounds: Rectangle, animate?: ?boolean) => void; - getContentBounds: () => Rectangle; - setEnabled: (enable: boolean) => void; - setSize: (width: number, height: number, animate?: ?boolean) => void; - getSize: () => Array; - setContentSize: (width: number, height: number, animate?: ?boolean) => void; - getContentSize: () => Array; - setMinimumSize: (width: number, height: number) => void; - getMinimumSize: () => Array; - setMaximumSize: (width: number, height: number) => void; - getMaximumSize: () => Array; - setResizable: (resizable: boolean) => void; - isResizable: () => boolean; - setMovable: (movable: boolean) => void; - isMovable: () => boolean; - setMinimizable: (minimizable: boolean) => void; - isMinimizable: () => boolean; - setMaximizable: (maximizable: boolean) => void; - isMaximizable: () => boolean; - setFullScreenable: (fullscreenable: boolean) => void; - isFullScreenable: () => boolean; - setClosable: (closable: boolean) => void; - isClosable: () => boolean; - setAlwaysOnTop: ( - flag: boolean, - level?: - | ?'normal' - | 'floating' - | 'torn-off-menu' - | 'modal-panel' - | 'main-menu' - | 'status' - | 'pop-up-menu' - | 'screen-saver', - relativeLevel?: ?number, - ) => void; - isAlwaysOnTop: () => boolean; - center: () => void; - setPosition: (x: number, y: number, animate?: ?boolean) => void; - getPosition: () => Array; - setTitle: (title: string) => void; - getTitle: () => string; - setSheetOffset: (offsetY: number, offsetX?: ?number) => void; - flashFrame: (flag: boolean) => void; - setSkipTaskbar: (skip: boolean) => void; - setKiosk: (flag: boolean) => void; - isKiosk: () => boolean; - getNativeWindowHandle: () => Buffer; - hookWindowMessage: (message: number, callback: Function) => void; - isWindowMessageHooked: (message: number) => boolean; - unhookWindowMessage: (message: number) => void; - unhookAllWindowMessages: () => void; - setRepresentedFilename: (filename: string) => void; - getRepresentedFilename: () => string; - setDocumentEdited: (edited: boolean) => void; - isDocumentEdited: () => boolean; - focusOnWebView: () => void; - blurWebView: () => void; - capturePage: ((rect?: ?Rectangle, callback: Function) => void) & - ((callback: Function) => void); - loadURL: ( - url: string, - options?: ?{ - httpReferrer?: ?string, - userAgent?: ?string, - extraHeaders?: ?string, - postData?: - | ?Array - | Array - | Array - | Array, - baseURLForDataURL?: ?string, - }, - ) => void; - loadFile: (filePath: string) => void; - reload: () => void; - setMenu: (menu: Menu | null) => void; - setProgressBar: ( - progress: number, - options?: ?{ - mode: 'none' | 'normal' | 'indeterminate' | 'error' | 'paused', - }, - ) => void; - setOverlayIcon: (overlay: NativeImage | null, description: string) => void; - setHasShadow: (hasShadow: boolean) => void; - hasShadow: () => boolean; - setOpacity: (opacity: number) => void; - getOpacity: () => number; - setThumbarButtons: (buttons: Array) => boolean; - setThumbnailClip: (region: Rectangle) => void; - setThumbnailToolTip: (toolTip: string) => void; - setAppDetails: (options: { - appId?: ?string, - appIconPath?: ?string, - appIconIndex?: ?number, - relaunchCommand?: ?string, - relaunchDisplayName?: ?string, - }) => void; - showDefinitionForSelection: () => void; - setIcon: (icon: NativeImage) => void; - setAutoHideMenuBar: (hide: boolean) => void; - isMenuBarAutoHide: () => boolean; - setMenuBarVisibility: (visible: boolean) => void; - isMenuBarVisible: () => boolean; - setVisibleOnAllWorkspaces: (visible: boolean) => void; - isVisibleOnAllWorkspaces: () => boolean; - setIgnoreMouseEvents: ( - ignore: boolean, - options?: ?{ - forward?: ?boolean, - }, - ) => void; - setContentProtection: (enable: boolean) => void; - setFocusable: (focusable: boolean) => void; - setParentWindow: (parent: BrowserWindow) => void; - getParentWindow: () => BrowserWindow; - getChildWindows: () => Array; - setAutoHideCursor: (autoHide: boolean) => void; - selectPreviousTab: () => void; - selectNextTab: () => void; - mergeAllWindows: () => void; - moveTabToNewWindow: () => void; - toggleTabBar: () => void; - addTabbedWindow: (browserWindow: BrowserWindow) => void; - setVibrancy: ( - type: - | 'appearance-based' - | 'light' - | 'dark' - | 'titlebar' - | 'selection' - | 'menu' - | 'popover' - | 'sidebar' - | 'medium-light' - | 'ultra-dark', - ) => void; - setTouchBar: (touchBar: TouchBar) => void; - setBrowserView: (browserView: BrowserView) => void; - getBrowserView: () => BrowserView | null; - webContents: WebContents; - id: number; - on: (( - eventName: 'page-title-updated', - callback: (event: Event, title: string) => void, - ) => void) & - ((eventName: 'close', callback: (event: Event) => void) => void) & - ((eventName: 'closed', callback: () => void) => void) & - ((eventName: 'session-end', callback: () => void) => void) & - ((eventName: 'unresponsive', callback: () => void) => void) & - ((eventName: 'responsive', callback: () => void) => void) & - ((eventName: 'blur', callback: () => void) => void) & - ((eventName: 'focus', callback: () => void) => void) & - ((eventName: 'show', callback: () => void) => void) & - ((eventName: 'hide', callback: () => void) => void) & - ((eventName: 'ready-to-show', callback: () => void) => void) & - ((eventName: 'maximize', callback: () => void) => void) & - ((eventName: 'unmaximize', callback: () => void) => void) & - ((eventName: 'minimize', callback: () => void) => void) & - ((eventName: 'restore', callback: () => void) => void) & - ((eventName: 'resize', callback: () => void) => void) & - ((eventName: 'move', callback: () => void) => void) & - ((eventName: 'moved', callback: () => void) => void) & - ((eventName: 'enter-full-screen', callback: () => void) => void) & - ((eventName: 'leave-full-screen', callback: () => void) => void) & - ((eventName: 'enter-html-full-screen', callback: () => void) => void) & - ((eventName: 'leave-html-full-screen', callback: () => void) => void) & - (( - eventName: 'app-command', - callback: (event: Event, command: string) => void, - ) => void) & - ((eventName: 'scroll-touch-begin', callback: () => void) => void) & - ((eventName: 'scroll-touch-end', callback: () => void) => void) & - ((eventName: 'scroll-touch-edge', callback: () => void) => void) & - (( - eventName: 'swipe', - callback: (event: Event, direction: string) => void, - ) => void) & - ((eventName: 'sheet-begin', callback: () => void) => void) & - ((eventName: 'sheet-end', callback: () => void) => void) & - ((eventName: 'new-window-for-tab', callback: () => void) => void); - once: (( - eventName: 'page-title-updated', - callback: (event: Event, title: string) => void, - ) => void) & - ((eventName: 'close', callback: (event: Event) => void) => void) & - ((eventName: 'closed', callback: () => void) => void) & - ((eventName: 'session-end', callback: () => void) => void) & - ((eventName: 'unresponsive', callback: () => void) => void) & - ((eventName: 'responsive', callback: () => void) => void) & - ((eventName: 'blur', callback: () => void) => void) & - ((eventName: 'focus', callback: () => void) => void) & - ((eventName: 'show', callback: () => void) => void) & - ((eventName: 'hide', callback: () => void) => void) & - ((eventName: 'ready-to-show', callback: () => void) => void) & - ((eventName: 'maximize', callback: () => void) => void) & - ((eventName: 'unmaximize', callback: () => void) => void) & - ((eventName: 'minimize', callback: () => void) => void) & - ((eventName: 'restore', callback: () => void) => void) & - ((eventName: 'resize', callback: () => void) => void) & - ((eventName: 'move', callback: () => void) => void) & - ((eventName: 'moved', callback: () => void) => void) & - ((eventName: 'enter-full-screen', callback: () => void) => void) & - ((eventName: 'leave-full-screen', callback: () => void) => void) & - ((eventName: 'enter-html-full-screen', callback: () => void) => void) & - ((eventName: 'leave-html-full-screen', callback: () => void) => void) & - (( - eventName: 'app-command', - callback: (event: Event, command: string) => void, - ) => void) & - ((eventName: 'scroll-touch-begin', callback: () => void) => void) & - ((eventName: 'scroll-touch-end', callback: () => void) => void) & - ((eventName: 'scroll-touch-edge', callback: () => void) => void) & - (( - eventName: 'swipe', - callback: (event: Event, direction: string) => void, - ) => void) & - ((eventName: 'sheet-begin', callback: () => void) => void) & - ((eventName: 'sheet-end', callback: () => void) => void) & - ((eventName: 'new-window-for-tab', callback: () => void) => void); - } - declare class BrowserWindowProxy { - blur: () => void; - close: () => void; - eval: (code: string) => void; - focus: () => void; - print: () => void; - postMessage: (message: string, targetOrigin: string) => void; - closed: boolean; - } - declare class ClientRequest { - constructor(options: Object | string): ClientRequest; - setHeader: (name: string, value: {}) => void; - getHeader: ( - name: string, - ) => { - name: string, - }; - removeHeader: (name: string) => void; - write: ( - chunk: string | Buffer, - encoding?: ?string, - callback?: ?Function, - ) => void; - end: (( - chunk?: ?string | Buffer, - encoding?: ?string, - callback?: ?Function, - ) => void) & - (((encoding?: ?string, callback?: ?Function) => void) & - ((callback?: ?Function) => void)); - abort: () => void; - followRedirect: () => void; - chunkedEncoding: boolean; - on: (( - eventName: 'response', - callback: (response: IncomingMessage) => void, - ) => void) & - (( - eventName: 'login', - callback: ( - authInfo: { - isProxy: boolean, - scheme: string, - host: string, - port: number, - realm: string, - }, - callback: Function, - ) => void, - ) => void) & - ((eventName: 'finish', callback: () => void) => void) & - ((eventName: 'abort', callback: () => void) => void) & - ((eventName: 'error', callback: (error: Error) => void) => void) & - ((eventName: 'close', callback: () => void) => void) & - (( - eventName: 'redirect', - callback: ( - statusCode: number, - method: string, - redirectUrl: string, - responseHeaders: {}, - ) => void, - ) => void); - once: (( - eventName: 'response', - callback: (response: IncomingMessage) => void, - ) => void) & - (( - eventName: 'login', - callback: ( - authInfo: { - isProxy: boolean, - scheme: string, - host: string, - port: number, - realm: string, - }, - callback: Function, - ) => void, - ) => void) & - ((eventName: 'finish', callback: () => void) => void) & - ((eventName: 'abort', callback: () => void) => void) & - ((eventName: 'error', callback: (error: Error) => void) => void) & - ((eventName: 'close', callback: () => void) => void) & - (( - eventName: 'redirect', - callback: ( - statusCode: number, - method: string, - redirectUrl: string, - responseHeaders: {}, - ) => void, - ) => void); - } - declare class Cookies { - get: ( - filter: { - url?: ?string, - name?: ?string, - domain?: ?string, - path?: ?string, - secure?: ?boolean, - session?: ?boolean, - }, - callback: Function, - ) => void; - set: ( - details: { - url: string, - name?: ?string, - value?: ?string, - domain?: ?string, - path?: ?string, - secure?: ?boolean, - httpOnly?: ?boolean, - expirationDate?: ?number, - }, - callback: Function, - ) => void; - remove: (url: string, name: string, callback: Function) => void; - flushStore: (callback: Function) => void; - on: ( - eventName: 'changed', - callback: ( - event: Event, - cookie: Cookie, - cause: - | 'explicit' - | 'overwrite' - | 'expired' - | 'evicted' - | 'expired-overwrite', - removed: boolean, - ) => void, - ) => void; - once: ( - eventName: 'changed', - callback: ( - event: Event, - cookie: Cookie, - cause: - | 'explicit' - | 'overwrite' - | 'expired' - | 'evicted' - | 'expired-overwrite', - removed: boolean, - ) => void, - ) => void; - } - declare class Debugger { - attach: (protocolVersion?: ?string) => void; - isAttached: () => boolean; - detach: () => void; - sendCommand: ( - method: string, - commandParams?: ?{}, - callback?: ?Function, - ) => void; - on: (( - eventName: 'detach', - callback: (event: Event, reason: string) => void, - ) => void) & - (( - eventName: 'message', - callback: (event: Event, method: string, params: {}) => void, - ) => void); - once: (( - eventName: 'detach', - callback: (event: Event, reason: string) => void, - ) => void) & - (( - eventName: 'message', - callback: (event: Event, method: string, params: {}) => void, - ) => void); - } - declare class DownloadItem { - setSavePath: (path: string) => void; - getSavePath: () => string; - pause: () => void; - isPaused: () => boolean; - resume: () => void; - canResume: () => boolean; - cancel: () => void; - getURL: () => string; - getMimeType: () => string; - hasUserGesture: () => boolean; - getFilename: () => string; - getTotalBytes: () => number; - getReceivedBytes: () => number; - getContentDisposition: () => string; - getState: () => 'progressing' | 'completed' | 'cancelled' | 'interrupted'; - getURLChain: () => Array; - getLastModifiedTime: () => string; - getETag: () => string; - getStartTime: () => number; - on: (( - eventName: 'updated', - callback: (event: Event, state: 'progressing' | 'interrupted') => void, - ) => void) & - (( - eventName: 'done', - callback: ( - event: Event, - state: 'completed' | 'cancelled' | 'interrupted', - ) => void, - ) => void); - once: (( - eventName: 'updated', - callback: (event: Event, state: 'progressing' | 'interrupted') => void, - ) => void) & - (( - eventName: 'done', - callback: ( - event: Event, - state: 'completed' | 'cancelled' | 'interrupted', - ) => void, - ) => void); - } - declare class IncomingMessage { - statusCode: number; - statusMessage: string; - headers: {}; - httpVersion: string; - httpVersionMajor: number; - httpVersionMinor: number; - on: ((eventName: 'data', callback: (chunk: Buffer) => void) => void) & - ((eventName: 'end', callback: () => void) => void) & - ((eventName: 'aborted', callback: () => void) => void) & - ((eventName: 'error', callback: () => void) => void); - once: ((eventName: 'data', callback: (chunk: Buffer) => void) => void) & - ((eventName: 'end', callback: () => void) => void) & - ((eventName: 'aborted', callback: () => void) => void) & - ((eventName: 'error', callback: () => void) => void); - } - declare class Menu { - constructor(): Menu; - static setApplicationMenu: (menu: Menu | null) => void; - static getApplicationMenu: () => Menu | null; - static sendActionToFirstResponder: (action: string) => void; - static buildFromTemplate: ( - template: Array, - ) => Menu; - popup: (options: { - window?: ?BrowserWindow, - x?: ?number, - y?: ?number, - positioningItem?: ?number, - callback?: ?Function, - }) => void; - closePopup: (browserWindow?: ?BrowserWindow) => void; - append: (menuItem: MenuItem) => void; - getMenuItemById: (id: string) => MenuItem; - insert: (pos: number, menuItem: MenuItem) => void; - items: Array; - on: (( - eventName: 'menu-will-show', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'menu-will-close', - callback: (event: Event) => void, - ) => void); - once: (( - eventName: 'menu-will-show', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'menu-will-close', - callback: (event: Event) => void, - ) => void); - } - declare class MenuItem { - constructor(options: { - click?: ?Function, - role?: ?string, - type?: ?'normal' | 'separator' | 'submenu' | 'checkbox' | 'radio', - label?: ?string, - sublabel?: ?string, - accelerator?: ?Accelerator, - icon?: ?NativeImage | string, - enabled?: ?boolean, - visible?: ?boolean, - checked?: ?boolean, - submenu?: ?Array | Menu, - id?: ?string, - position?: ?string, - }): MenuItem; - enabled: boolean; - visible: boolean; - checked: boolean; - label: string; - click: Function; - } - declare class NativeImage { - toPNG: ( - options?: ?{ - scaleFactor?: ?number, - }, - ) => Buffer; - toJPEG: (quality: number) => Buffer; - toBitmap: ( - options?: ?{ - scaleFactor?: ?number, - }, - ) => Buffer; - toDataURL: ( - options?: ?{ - scaleFactor?: ?number, - }, - ) => string; - getBitmap: ( - options?: ?{ - scaleFactor?: ?number, - }, - ) => Buffer; - getNativeHandle: () => Buffer; - isEmpty: () => boolean; - getSize: () => Size; - setTemplateImage: (option: boolean) => void; - isTemplateImage: () => boolean; - crop: (rect: Rectangle) => NativeImage; - resize: (options: { - width?: ?number, - height?: ?number, - quality?: ?string, - }) => NativeImage; - getAspectRatio: () => number; - addRepresentation: (options: { - scaleFactor: number, - width?: ?number, - height?: ?number, - buffer?: ?Buffer, - dataURL?: ?string, - }) => void; - } - declare class Notification { - constructor(options: { - title: string, - subtitle?: ?string, - body: string, - silent?: ?boolean, - icon?: ?string | NativeImage, - hasReply?: ?boolean, - replyPlaceholder?: ?string, - sound?: ?string, - actions?: ?Array, - closeButtonText?: ?string, - }): Notification; - static isSupported: () => boolean; - show: () => void; - close: () => void; - on: ((eventName: 'show', callback: (event: Event) => void) => void) & - ((eventName: 'click', callback: (event: Event) => void) => void) & - ((eventName: 'close', callback: (event: Event) => void) => void) & - (( - eventName: 'reply', - callback: (event: Event, reply: string) => void, - ) => void) & - (( - eventName: 'action', - callback: (event: Event, index: number) => void, - ) => void); - once: ((eventName: 'show', callback: (event: Event) => void) => void) & - ((eventName: 'click', callback: (event: Event) => void) => void) & - ((eventName: 'close', callback: (event: Event) => void) => void) & - (( - eventName: 'reply', - callback: (event: Event, reply: string) => void, - ) => void) & - (( - eventName: 'action', - callback: (event: Event, index: number) => void, - ) => void); - } - declare class Session { - getCacheSize: (callback: Function) => void; - clearCache: (callback: Function) => void; - clearStorageData: (( - options?: ?{ - origin?: ?string, - storages?: ?Array, - quotas?: ?Array, - }, - callback?: ?Function, - ) => void) & - ((callback?: ?Function) => void); - flushStorageData: () => void; - setProxy: ( - config: { - pacScript: string, - proxyRules: string, - proxyBypassRules: string, - }, - callback: Function, - ) => void; - resolveProxy: (url: URL, callback: Function) => void; - setDownloadPath: (path: string) => void; - enableNetworkEmulation: (options: { - offline?: ?boolean, - latency?: ?number, - downloadThroughput?: ?number, - uploadThroughput?: ?number, - }) => void; - disableNetworkEmulation: () => void; - setCertificateVerifyProc: (proc: Function) => void; - setPermissionRequestHandler: (handler: Function | null) => void; - clearHostResolverCache: (callback?: ?Function) => void; - allowNTLMCredentialsForDomains: (domains: string) => void; - setUserAgent: (userAgent: string, acceptLanguages?: ?string) => void; - getUserAgent: () => string; - getBlobData: (identifier: string, callback: Function) => void; - createInterruptedDownload: (options: { - path: string, - urlChain: Array, - mimeType?: ?string, - offset: number, - length: number, - lastModified: string, - eTag: string, - startTime?: ?number, - }) => void; - clearAuthCache: ( - options: RemovePassword | RemoveClientCertificate, - callback?: ?Function, - ) => void; - setPreloads: (preloads: Array) => void; - getPreloads: () => Array; - cookies: Cookies; - webRequest: WebRequest; - protocol: Protocol; - on: ( - eventName: 'will-download', - callback: ( - event: Event, - item: DownloadItem, - webContents: WebContents, - ) => void, - ) => void; - once: ( - eventName: 'will-download', - callback: ( - event: Event, - item: DownloadItem, - webContents: WebContents, - ) => void, - ) => void; - } - declare class TouchBar { - constructor(options: { - items: Array< - | TouchBarButton - | TouchBarColorPicker - | TouchBarGroup - | TouchBarLabel - | TouchBarPopover - | TouchBarScrubber - | TouchBarSegmentedControl - | TouchBarSlider - | TouchBarSpacer, - >, - escapeItem?: - | ?TouchBarButton - | TouchBarColorPicker - | TouchBarGroup - | TouchBarLabel - | TouchBarPopover - | TouchBarScrubber - | TouchBarSegmentedControl - | TouchBarSlider - | TouchBarSpacer - | null, - }): TouchBar; - static TouchBarButton: Class; - static TouchBarColorPicker: Class; - static TouchBarGroup: Class; - static TouchBarLabel: Class; - static TouchBarPopover: Class; - static TouchBarScrubber: Class; - static TouchBarSegmentedControl: Class; - static TouchBarSlider: Class; - static TouchBarSpacer: Class; - escapeItem: TouchBarItem; - } - declare class Tray { - constructor(image: NativeImage | string): Tray; - destroy: () => void; - setImage: (image: NativeImage | string) => void; - setPressedImage: (image: NativeImage | string) => void; - setToolTip: (toolTip: string) => void; - setTitle: (title: string) => void; - setHighlightMode: (mode: 'selection' | 'always' | 'never') => void; - displayBalloon: (options: { - icon?: ?NativeImage | string, - title: string, - content: string, - }) => void; - popUpContextMenu: ((menu?: ?Menu, position?: ?Point) => void) & - ((position?: ?Point) => void); - setContextMenu: (menu: Menu | null) => void; - getBounds: () => Rectangle; - isDestroyed: () => boolean; - on: (( - eventName: 'click', - callback: (event: Event, bounds: Rectangle, position: Point) => void, - ) => void) & - (( - eventName: 'right-click', - callback: (event: Event, bounds: Rectangle) => void, - ) => void) & - (( - eventName: 'double-click', - callback: (event: Event, bounds: Rectangle) => void, - ) => void) & - ((eventName: 'balloon-show', callback: () => void) => void) & - ((eventName: 'balloon-click', callback: () => void) => void) & - ((eventName: 'balloon-closed', callback: () => void) => void) & - ((eventName: 'drop', callback: () => void) => void) & - (( - eventName: 'drop-files', - callback: (event: Event, files: Array) => void, - ) => void) & - (( - eventName: 'drop-text', - callback: (event: Event, text: string) => void, - ) => void) & - ((eventName: 'drag-enter', callback: () => void) => void) & - ((eventName: 'drag-leave', callback: () => void) => void) & - ((eventName: 'drag-end', callback: () => void) => void) & - (( - eventName: 'mouse-enter', - callback: (event: Event, position: Point) => void, - ) => void) & - (( - eventName: 'mouse-leave', - callback: (event: Event, position: Point) => void, - ) => void) & - (( - eventName: 'mouse-move', - callback: (event: Event, position: Point) => void, - ) => void); - once: (( - eventName: 'click', - callback: (event: Event, bounds: Rectangle, position: Point) => void, - ) => void) & - (( - eventName: 'right-click', - callback: (event: Event, bounds: Rectangle) => void, - ) => void) & - (( - eventName: 'double-click', - callback: (event: Event, bounds: Rectangle) => void, - ) => void) & - ((eventName: 'balloon-show', callback: () => void) => void) & - ((eventName: 'balloon-click', callback: () => void) => void) & - ((eventName: 'balloon-closed', callback: () => void) => void) & - ((eventName: 'drop', callback: () => void) => void) & - (( - eventName: 'drop-files', - callback: (event: Event, files: Array) => void, - ) => void) & - (( - eventName: 'drop-text', - callback: (event: Event, text: string) => void, - ) => void) & - ((eventName: 'drag-enter', callback: () => void) => void) & - ((eventName: 'drag-leave', callback: () => void) => void) & - ((eventName: 'drag-end', callback: () => void) => void) & - (( - eventName: 'mouse-enter', - callback: (event: Event, position: Point) => void, - ) => void) & - (( - eventName: 'mouse-leave', - callback: (event: Event, position: Point) => void, - ) => void) & - (( - eventName: 'mouse-move', - callback: (event: Event, position: Point) => void, - ) => void); - } - declare class WebContents { - loadURL: ( - url: string, - options?: ?{ - httpReferrer?: ?string, - userAgent?: ?string, - extraHeaders?: ?string, - postData?: - | ?Array - | Array - | Array - | Array, - baseURLForDataURL?: ?string, - }, - ) => void; - loadFile: (filePath: string) => void; - downloadURL: (url: string) => void; - getURL: () => string; - getTitle: () => string; - isDestroyed: () => boolean; - focus: () => void; - isFocused: () => boolean; - isLoading: () => boolean; - isLoadingMainFrame: () => boolean; - isWaitingForResponse: () => boolean; - stop: () => void; - reload: () => void; - reloadIgnoringCache: () => void; - canGoBack: () => boolean; - canGoForward: () => boolean; - canGoToOffset: (offset: number) => boolean; - clearHistory: () => void; - goBack: () => void; - goForward: () => void; - goToIndex: (index: number) => void; - goToOffset: (offset: number) => void; - isCrashed: () => boolean; - setUserAgent: (userAgent: string) => void; - getUserAgent: () => string; - insertCSS: (css: string) => void; - executeJavaScript: ( - code: string, - userGesture?: ?boolean, - callback?: ?Function, - ) => Promise; - setIgnoreMenuShortcuts: (ignore: boolean) => void; - setAudioMuted: (muted: boolean) => void; - isAudioMuted: () => boolean; - setZoomFactor: (factor: number) => void; - getZoomFactor: (callback: Function) => void; - setZoomLevel: (level: number) => void; - getZoomLevel: (callback: Function) => void; - setVisualZoomLevelLimits: ( - minimumLevel: number, - maximumLevel: number, - ) => void; - setLayoutZoomLevelLimits: ( - minimumLevel: number, - maximumLevel: number, - ) => void; - undo: () => void; - redo: () => void; - cut: () => void; - copy: () => void; - copyImageAt: (x: number, y: number) => void; - paste: () => void; - pasteAndMatchStyle: () => void; - delete: () => void; - selectAll: () => void; - unselect: () => void; - replace: (text: string) => void; - replaceMisspelling: (text: string) => void; - insertText: (text: string) => void; - findInPage: ( - text: string, - options?: ?{ - forward?: ?boolean, - findNext?: ?boolean, - matchCase?: ?boolean, - wordStart?: ?boolean, - medialCapitalAsWordStart?: ?boolean, - }, - ) => number; - stopFindInPage: ( - action: 'clearSelection' | 'keepSelection' | 'activateSelection', - ) => void; - capturePage: ((rect?: ?Rectangle, callback: Function) => void) & - ((callback: Function) => void); - hasServiceWorker: (callback: Function) => void; - unregisterServiceWorker: (callback: Function) => void; - getPrinters: () => Array; - print: (( - options?: ?{ - silent?: ?boolean, - printBackground?: ?boolean, - deviceName?: ?string, - }, - callback?: ?Function, - ) => void) & - ((callback?: ?Function) => void); - printToPDF: ( - options: { - marginsType?: ?number, - pageSize?: ?string, - printBackground?: ?boolean, - printSelectionOnly?: ?boolean, - landscape?: ?boolean, - }, - callback: Function, - ) => void; - addWorkSpace: (path: string) => void; - removeWorkSpace: (path: string) => void; - setDevToolsWebContents: (devToolsWebContents: WebContents) => void; - openDevTools: ( - options?: ?{ - mode: 'right' | 'bottom' | 'undocked' | 'detach', - }, - ) => void; - closeDevTools: () => void; - isDevToolsOpened: () => boolean; - isDevToolsFocused: () => boolean; - toggleDevTools: () => void; - inspectElement: (x: number, y: number) => void; - inspectServiceWorker: () => void; - send: (channel: string, ...args: Array) => void; - enableDeviceEmulation: (parameters: { - screenPosition: 'desktop' | 'mobile', - screenSize: Size, - viewPosition: Point, - deviceScaleFactor: number, - viewSize: Size, - scale: number, - }) => void; - disableDeviceEmulation: () => void; - sendInputEvent: (event: { - type: - | 'mouseDown' - | 'mouseUp' - | 'mouseEnter' - | 'mouseLeave' - | 'contextMenu' - | 'mouseWheel' - | 'mouseMove' - | 'keyDown' - | 'keyUp' - | 'char', - modifiers: Array, - }) => void; - beginFrameSubscription: (( - onlyDirty?: ?boolean, - callback: Function, - ) => void) & - ((callback: Function) => void); - endFrameSubscription: () => void; - startDrag: (item: { - file: string, - icon: NativeImage, - }) => void; - savePage: ( - fullPath: string, - saveType: 'HTMLOnly' | 'HTMLComplete' | 'MHTML', - callback: Function, - ) => boolean; - showDefinitionForSelection: () => void; - setSize: (options: { - enableAutoSize?: ?boolean, - normal?: ?Size, - min?: ?Size, - max?: ?Size, - }) => void; - isOffscreen: () => boolean; - startPainting: () => void; - stopPainting: () => void; - isPainting: () => boolean; - setFrameRate: (fps: number) => void; - getFrameRate: () => number; - invalidate: () => void; - getWebRTCIPHandlingPolicy: () => string; - setWebRTCIPHandlingPolicy: ( - policy: - | 'default' - | 'default_public_interface_only' - | 'default_public_and_private_interfaces' - | 'disable_non_proxied_udp', - ) => void; - getOSProcessId: () => number; - id: number; - session: Session; - hostWebContents: WebContents; - devToolsWebContents: WebContents; - debugger: Debugger; - on: ((eventName: 'did-finish-load', callback: () => void) => void) & - (( - eventName: 'did-fail-load', - callback: ( - event: Event, - errorCode: number, - errorDescription: string, - validatedURL: string, - isMainFrame: boolean, - ) => void, - ) => void) & - (( - eventName: 'did-frame-finish-load', - callback: (event: Event, isMainFrame: boolean) => void, - ) => void) & - ((eventName: 'did-start-loading', callback: () => void) => void) & - ((eventName: 'did-stop-loading', callback: () => void) => void) & - (( - eventName: 'did-get-response-details', - callback: ( - event: Event, - status: boolean, - newURL: string, - originalURL: string, - httpResponseCode: number, - requestMethod: string, - referrer: string, - headers: {}, - resourceType: string, - ) => void, - ) => void) & - (( - eventName: 'did-get-redirect-request', - callback: ( - event: Event, - oldURL: string, - newURL: string, - isMainFrame: boolean, - httpResponseCode: number, - requestMethod: string, - referrer: string, - headers: {}, - ) => void, - ) => void) & - ((eventName: 'dom-ready', callback: (event: Event) => void) => void) & - (( - eventName: 'page-favicon-updated', - callback: (event: Event, favicons: Array) => void, - ) => void) & - (( - eventName: 'new-window', - callback: ( - event: Event, - url: string, - frameName: string, - disposition: - | 'default' - | 'foreground-tab' - | 'background-tab' - | 'new-window' - | 'save-to-disk' - | 'other', - options: {}, - additionalFeatures: Array, - ) => void, - ) => void) & - (( - eventName: 'will-navigate', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'did-navigate', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'did-navigate-in-page', - callback: (event: Event, url: string, isMainFrame: boolean) => void, - ) => void) & - (( - eventName: 'will-prevent-unload', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'crashed', - callback: (event: Event, killed: boolean) => void, - ) => void) & - (( - eventName: 'plugin-crashed', - callback: (event: Event, name: string, version: string) => void, - ) => void) & - ((eventName: 'destroyed', callback: () => void) => void) & - (( - eventName: 'before-input-event', - callback: ( - event: Event, - input: { - type: string, - key: string, - code: string, - isAutoRepeat: boolean, - shift: boolean, - control: boolean, - alt: boolean, - meta: boolean, - }, - ) => void, - ) => void) & - ((eventName: 'devtools-opened', callback: () => void) => void) & - ((eventName: 'devtools-closed', callback: () => void) => void) & - ((eventName: 'devtools-focused', callback: () => void) => void) & - (( - eventName: 'certificate-error', - callback: ( - event: Event, - url: string, - error: string, - certificate: Certificate, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'select-client-certificate', - callback: ( - event: Event, - url: URL, - certificateList: Array, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'login', - callback: ( - event: Event, - request: { - method: string, - url: URL, - referrer: URL, - }, - authInfo: { - isProxy: boolean, - scheme: string, - host: string, - port: number, - realm: string, - }, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'found-in-page', - callback: ( - event: Event, - result: { - requestId: number, - activeMatchOrdinal: number, - matches: number, - selectionArea: {}, - finalUpdate: boolean, - }, - ) => void, - ) => void) & - ((eventName: 'media-started-playing', callback: () => void) => void) & - ((eventName: 'media-paused', callback: () => void) => void) & - (( - eventName: 'did-change-theme-color', - callback: (event: Event, color: string | null) => void, - ) => void) & - (( - eventName: 'update-target-url', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'cursor-changed', - callback: ( - event: Event, - type: string, - image?: ?NativeImage, - scale?: ?number, - size?: ?Size, - hotspot?: ?Point, - ) => void, - ) => void) & - (( - eventName: 'context-menu', - callback: ( - event: Event, - params: { - x: number, - y: number, - linkURL: string, - linkText: string, - pageURL: string, - frameURL: string, - srcURL: string, - mediaType: - | 'none' - | 'image' - | 'audio' - | 'video' - | 'canvas' - | 'file' - | 'plugin', - hasImageContents: boolean, - isEditable: boolean, - selectionText: string, - titleText: string, - misspelledWord: string, - frameCharset: string, - inputFieldType: string, - menuSourceType: - | 'none' - | 'mouse' - | 'keyboard' - | 'touch' - | 'touchMenu', - mediaFlags: { - inError: boolean, - isPaused: boolean, - isMuted: boolean, - hasAudio: boolean, - isLooping: boolean, - isControlsVisible: boolean, - canToggleControls: boolean, - canRotate: boolean, - }, - editFlags: { - canUndo: boolean, - canRedo: boolean, - canCut: boolean, - canCopy: boolean, - canPaste: boolean, - canDelete: boolean, - canSelectAll: boolean, - }, - }, - ) => void, - ) => void) & - (( - eventName: 'select-bluetooth-device', - callback: ( - event: Event, - devices: Array, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'paint', - callback: ( - event: Event, - dirtyRect: Rectangle, - image: NativeImage, - ) => void, - ) => void) & - ((eventName: 'devtools-reload-page', callback: () => void) => void) & - (( - eventName: 'will-attach-webview', - callback: (event: Event, webPreferences: {}, params: {}) => void, - ) => void) & - (( - eventName: 'did-attach-webview', - callback: (event: Event, webContents: WebContents) => void, - ) => void) & - (( - eventName: 'console-message', - callback: ( - level: number, - message: string, - line: number, - sourceId: string, - ) => void, - ) => void); - once: ((eventName: 'did-finish-load', callback: () => void) => void) & - (( - eventName: 'did-fail-load', - callback: ( - event: Event, - errorCode: number, - errorDescription: string, - validatedURL: string, - isMainFrame: boolean, - ) => void, - ) => void) & - (( - eventName: 'did-frame-finish-load', - callback: (event: Event, isMainFrame: boolean) => void, - ) => void) & - ((eventName: 'did-start-loading', callback: () => void) => void) & - ((eventName: 'did-stop-loading', callback: () => void) => void) & - (( - eventName: 'did-get-response-details', - callback: ( - event: Event, - status: boolean, - newURL: string, - originalURL: string, - httpResponseCode: number, - requestMethod: string, - referrer: string, - headers: {}, - resourceType: string, - ) => void, - ) => void) & - (( - eventName: 'did-get-redirect-request', - callback: ( - event: Event, - oldURL: string, - newURL: string, - isMainFrame: boolean, - httpResponseCode: number, - requestMethod: string, - referrer: string, - headers: {}, - ) => void, - ) => void) & - ((eventName: 'dom-ready', callback: (event: Event) => void) => void) & - (( - eventName: 'page-favicon-updated', - callback: (event: Event, favicons: Array) => void, - ) => void) & - (( - eventName: 'new-window', - callback: ( - event: Event, - url: string, - frameName: string, - disposition: - | 'default' - | 'foreground-tab' - | 'background-tab' - | 'new-window' - | 'save-to-disk' - | 'other', - options: {}, - additionalFeatures: Array, - ) => void, - ) => void) & - (( - eventName: 'will-navigate', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'did-navigate', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'did-navigate-in-page', - callback: (event: Event, url: string, isMainFrame: boolean) => void, - ) => void) & - (( - eventName: 'will-prevent-unload', - callback: (event: Event) => void, - ) => void) & - (( - eventName: 'crashed', - callback: (event: Event, killed: boolean) => void, - ) => void) & - (( - eventName: 'plugin-crashed', - callback: (event: Event, name: string, version: string) => void, - ) => void) & - ((eventName: 'destroyed', callback: () => void) => void) & - (( - eventName: 'before-input-event', - callback: ( - event: Event, - input: { - type: string, - key: string, - code: string, - isAutoRepeat: boolean, - shift: boolean, - control: boolean, - alt: boolean, - meta: boolean, - }, - ) => void, - ) => void) & - ((eventName: 'devtools-opened', callback: () => void) => void) & - ((eventName: 'devtools-closed', callback: () => void) => void) & - ((eventName: 'devtools-focused', callback: () => void) => void) & - (( - eventName: 'certificate-error', - callback: ( - event: Event, - url: string, - error: string, - certificate: Certificate, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'select-client-certificate', - callback: ( - event: Event, - url: URL, - certificateList: Array, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'login', - callback: ( - event: Event, - request: { - method: string, - url: URL, - referrer: URL, - }, - authInfo: { - isProxy: boolean, - scheme: string, - host: string, - port: number, - realm: string, - }, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'found-in-page', - callback: ( - event: Event, - result: { - requestId: number, - activeMatchOrdinal: number, - matches: number, - selectionArea: {}, - finalUpdate: boolean, - }, - ) => void, - ) => void) & - ((eventName: 'media-started-playing', callback: () => void) => void) & - ((eventName: 'media-paused', callback: () => void) => void) & - (( - eventName: 'did-change-theme-color', - callback: (event: Event, color: string | null) => void, - ) => void) & - (( - eventName: 'update-target-url', - callback: (event: Event, url: string) => void, - ) => void) & - (( - eventName: 'cursor-changed', - callback: ( - event: Event, - type: string, - image?: ?NativeImage, - scale?: ?number, - size?: ?Size, - hotspot?: ?Point, - ) => void, - ) => void) & - (( - eventName: 'context-menu', - callback: ( - event: Event, - params: { - x: number, - y: number, - linkURL: string, - linkText: string, - pageURL: string, - frameURL: string, - srcURL: string, - mediaType: - | 'none' - | 'image' - | 'audio' - | 'video' - | 'canvas' - | 'file' - | 'plugin', - hasImageContents: boolean, - isEditable: boolean, - selectionText: string, - titleText: string, - misspelledWord: string, - frameCharset: string, - inputFieldType: string, - menuSourceType: - | 'none' - | 'mouse' - | 'keyboard' - | 'touch' - | 'touchMenu', - mediaFlags: { - inError: boolean, - isPaused: boolean, - isMuted: boolean, - hasAudio: boolean, - isLooping: boolean, - isControlsVisible: boolean, - canToggleControls: boolean, - canRotate: boolean, - }, - editFlags: { - canUndo: boolean, - canRedo: boolean, - canCut: boolean, - canCopy: boolean, - canPaste: boolean, - canDelete: boolean, - canSelectAll: boolean, - }, - }, - ) => void, - ) => void) & - (( - eventName: 'select-bluetooth-device', - callback: ( - event: Event, - devices: Array, - callback: Function, - ) => void, - ) => void) & - (( - eventName: 'paint', - callback: ( - event: Event, - dirtyRect: Rectangle, - image: NativeImage, - ) => void, - ) => void) & - ((eventName: 'devtools-reload-page', callback: () => void) => void) & - (( - eventName: 'will-attach-webview', - callback: (event: Event, webPreferences: {}, params: {}) => void, - ) => void) & - (( - eventName: 'did-attach-webview', - callback: (event: Event, webContents: WebContents) => void, - ) => void) & - (( - eventName: 'console-message', - callback: ( - level: number, - message: string, - line: number, - sourceId: string, - ) => void, - ) => void); - } - declare class WebRequest { - onBeforeRequest: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - onBeforeSendHeaders: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - onSendHeaders: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - onHeadersReceived: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - onResponseStarted: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - onBeforeRedirect: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - onCompleted: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - onErrorOccurred: (( - filter?: ?{ - urls: Array, - }, - listener: Function, - ) => void) & - ((listener: Function) => void); - } - declare class TouchBarButton { - constructor(options: { - label?: ?string, - backgroundColor?: ?string, - icon?: ?NativeImage, - iconPosition?: ?'left' | 'right' | 'overlay', - click?: ?Function, - }): TouchBarButton; - label: string; - backgroundColor: string; - icon: NativeImage; - } - declare class TouchBarColorPicker { - constructor(options: { - availableColors?: ?Array, - selectedColor?: ?string, - change?: ?Function, - }): TouchBarColorPicker; - availableColors: Array; - selectedColor: string; - } - declare class TouchBarGroup { - constructor(options: { - items: TouchBar, - }): TouchBarGroup; - } - declare class TouchBarLabel { - constructor(options: { - label?: ?string, - textColor?: ?string, - }): TouchBarLabel; - label: string; - textColor: string; - } - declare class TouchBarPopover { - constructor(options: { - label?: ?string, - icon?: ?NativeImage, - items?: ?TouchBar, - showCloseButton?: ?boolean, - }): TouchBarPopover; - label: string; - icon: NativeImage; - } - declare class TouchBarScrubber { - constructor(options: { - items: Array, - select: Function, - highlight: Function, - selectedStyle: string, - overlayStyle: string, - showArrowButtons: boolean, - mode: string, - continuous: boolean, - }): TouchBarScrubber; - items: Array; - selectedStyle: string; - overlayStyle: string; - showArrowButtons: boolean; - mode: string; - continuous: boolean; - } - declare class TouchBarSegmentedControl { - constructor(options: { - segmentStyle?: - | ?'automatic' - | 'rounded' - | 'textured-rounded' - | 'round-rect' - | 'textured-square' - | 'capsule' - | 'small-square' - | 'separated', - mode?: ?'single' | 'multiple' | 'buttons', - segments: Array, - selectedIndex?: ?number, - change: Function, - }): TouchBarSegmentedControl; - segmentStyle: string; - segments: Array; - selectedIndex: number; - } - declare class TouchBarSlider { - constructor(options: { - label?: ?string, - value?: ?number, - minValue?: ?number, - maxValue?: ?number, - change?: ?Function, - }): TouchBarSlider; - label: string; - value: number; - minValue: number; - maxValue: number; - } - declare class TouchBarSpacer { - constructor(options: { - size?: ?'small' | 'large' | 'flexible', - }): TouchBarSpacer; - } - declare type Accelerator = any; - declare type ReadableStream = any; - declare type MenuItemConstructorOptions = any; - declare type Protocol = any; - declare type TouchBarItem = any; -} diff --git a/flow-libs/event-kit.js.flow b/flow-libs/event-kit.js.flow deleted file mode 100644 index 67af4f8fd4..0000000000 --- a/flow-libs/event-kit.js.flow +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -declare module 'event-kit' { - declare var Emitter: typeof atom$Emitter; - declare var Disposable: typeof atom$Disposable; - declare var CompositeDisposable: typeof atom$CompositeDisposable; -} diff --git a/flow-libs/jasmine.js.flow b/flow-libs/jasmine.js.flow deleted file mode 100644 index 83fc67f39e..0000000000 --- a/flow-libs/jasmine.js.flow +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -// Type declarations for Jasmine v1.3 -// https://jasmine.github.io/1.3/introduction.html - -// Disabling Specs and Suites -// https://jasmine.github.io/1.3/introduction.html#section-Disabling_Specs_and_Suites -declare function xdescribe(title: string, spec: () => mixed): void; -declare function xit(title: string, spec: () => mixed): void; - -// Spies -// https://jasmine.github.io/1.3/introduction.html#section-Spies -type JasmineSpyCall = { - args: Array, -}; - -type JasmineSpy = { - (...args: Array): any, - andCallFake(fake: (...args: Array) => mixed): JasmineSpy, - andCallThrough(): JasmineSpy, - argsForCall: Array>, - andReturn(value: T): JasmineSpy, - andThrow(error: mixed): JasmineSpy, - callCount: number, - calls: Array, - identity: string, - mostRecentCall: JasmineSpyCall, - wasCalled: boolean, - reset(): void, -}; - -declare function spyOn(object: Object, method: string): JasmineSpy; - -// Mocking the JavaScript Clock -// https://jasmine.github.io/1.3/introduction.html#section-Mocking_the_JavaScript_Clock -type JasmineMockClock = { - tick(milliseconds: number): void, - useMock(): void, -}; - -// Asynchronous Support -// https://jasmine.github.io/1.3/introduction.html#section-Asynchronous_Support -declare function runs(func: () => mixed): void; - -// Apparently the arguments for waitsFor() can be specified in any order. -type WaitsForArg = string | number | () => mixed; - -declare function waitsFor( - latchFunction?: WaitsForArg, failureMessage?: WaitsForArg, timeout?: WaitsForArg): void; - -declare function waits(milliseconds: number): void; - -type JasmineEnvironment = { - currentSpec: { - fail(message: string): void, - }, - defaultTimeoutInterval: number, - afterEach: typeof afterEach, - beforeEach: typeof beforeEach, - describe: any, - it: any, -}; - -type JasmineSpec = { - addMatchers(matchersPrototype: {[methodName: string]: (expected: any) => boolean}): void, -}; - -type JasmineMatchers = { - message: () => string, -}; - -// Jasmine global -declare var jasmine: { - // Default timeout. - DEFAULT_TIMEOUT_INTERVAL: number, - - Clock: JasmineMockClock, - Matchers: JasmineMatchers, - any(expected: string | Object): mixed, - - /** - * This is a non-standard method that Atom adds to Jasmine via spec-helper.coffee. - * Ideally, we would declare this in atom-jasmine.js, but we can't extend this global here. - */ - attachToDOM(element: Element): ?HTMLElement, - - createSpy: (name?: string) => JasmineSpy, - createSpyObj: (name: string, spyNames: Array) => {[key: string]: JasmineSpy}, - getEnv: () => JasmineEnvironment, - pp: (value: mixed) => string, - unspy: (obj: Object, methodName: string) => void, - useMockClock: () => void, - useRealClock: () => void, -}; diff --git a/flow-libs/jest.js.flow b/flow-libs/jest.js.flow deleted file mode 100644 index b9928d2478..0000000000 --- a/flow-libs/jest.js.flow +++ /dev/null @@ -1,662 +0,0 @@ -// Fork of the flow-typed definitions for Jest. -// Modified to make sure types are compatible with existing Jasmine -// (TODO:T28636463) unify types and use original flow-typed definitions -// List of modifications: -// - modified some matchers to accept optional message arg (_?: any) -// - removed `declare jasmine` -type JestMockFn, TReturn> = { - (...args: TArguments): TReturn, - /** - * An object for introspecting mock calls - */ - mock: { - /** - * An array that represents all calls that have been made into this mock - * function. Each call is represented by an array of arguments that were - * passed during the call. - */ - calls: Array, - /** - * An array that contains all the object instances that have been - * instantiated from this mock function. - */ - instances: Array, - }, - /** - * Resets all information stored in the mockFn.mock.calls and - * mockFn.mock.instances arrays. Often this is useful when you want to clean - * up a mock's usage data between two assertions. - */ - mockClear(): void, - /** - * Resets all information stored in the mock. This is useful when you want to - * completely restore a mock back to its initial state. - */ - mockReset(): void, - /** - * Removes the mock and restores the initial implementation. This is useful - * when you want to mock functions in certain test cases and restore the - * original implementation in others. Beware that mockFn.mockRestore only - * works when mock was created with jest.spyOn. Thus you have to take care of - * restoration yourself when manually assigning jest.fn(). - */ - mockRestore(): void, - /** - * Accepts a function that should be used as the implementation of the mock. - * The mock itself will still record all calls that go into and instances - * that come from itself -- the only difference is that the implementation - * will also be executed when the mock is called. - */ - mockImplementation( - fn: (...args: TArguments) => TReturn, - ): JestMockFn, - /** - * Accepts a function that will be used as an implementation of the mock for - * one call to the mocked function. Can be chained so that multiple function - * calls produce different results. - */ - mockImplementationOnce( - fn: (...args: TArguments) => TReturn, - ): JestMockFn, - /** - * Accepts a string to use in test result output in place of "jest.fn()" to - * indicate which mock function is being referenced. - */ - mockName(name: string): JestMockFn, - /** - * Just a simple sugar function for returning `this` - */ - mockReturnThis(): void, - /** - * Deprecated: use jest.fn(() => value) instead - */ - mockReturnValue(value: TReturn): JestMockFn, - /** - * Sugar for only returning a value once inside your mock - */ - mockReturnValueOnce(value: TReturn): JestMockFn, -}; - -type JestAsymmetricEqualityType = { - /** - * A custom Jasmine equality tester - */ - asymmetricMatch(value: mixed): boolean, -}; - -type JestCallsType = { - allArgs(): mixed, - all(): mixed, - any(): boolean, - count(): number, - first(): mixed, - mostRecent(): mixed, - reset(): void, -}; - -type JestClockType = { - install(): void, - mockDate(date: Date): void, - tick(milliseconds?: number): void, - uninstall(): void, -}; - -type JestMatcherResult = { - message?: string | (() => string), - pass: boolean, -}; - -type JestMatcher = (actual: any, expected: any) => JestMatcherResult; - -type JestPromiseType = { - /** - * Use rejects to unwrap the reason of a rejected promise so any other - * matcher can be chained. If the promise is fulfilled the assertion fails. - */ - rejects: JestExpectType, - /** - * Use resolves to unwrap the value of a fulfilled promise so any other - * matcher can be chained. If the promise is rejected the assertion fails. - */ - resolves: JestExpectType, -}; - -/** - * Jest allows functions and classes to be used as test names in test() and - * describe() - */ -type JestTestName = string | Function; - -/** - * Plugin: jest-enzyme - */ -type EnzymeMatchersType = { - toBeChecked(): void, - toBeDisabled(): void, - toBeEmpty(): void, - toBeEmptyRender(): void, - toBePresent(): void, - toContainReact(element: React$Element): void, - toExist(): void, - toHaveClassName(className: string): void, - toHaveHTML(html: string): void, - toHaveProp: ((propKey: string, propValue?: any) => void) & - ((props: Object) => void), - toHaveRef(refName: string): void, - toHaveState: ((stateKey: string, stateValue?: any) => void) & - ((state: Object) => void), - toHaveStyle: ((styleKey: string, styleValue?: any) => void) & - ((style: Object) => void), - toHaveTagName(tagName: string): void, - toHaveText(text: string): void, - toIncludeText(text: string): void, - toHaveValue(value: any): void, - toMatchElement(element: React$Element): void, - toMatchSelector(selector: string): void, -}; - -// DOM testing library extensions https://github.com/kentcdodds/dom-testing-library#custom-jest-matchers -type DomTestingLibraryType = { - toBeInTheDOM(): void, - toHaveTextContent(content: string): void, - toHaveAttribute(name: string, expectedValue?: string): void, -}; - -type JestExpectType = { - not: JestExpectType & EnzymeMatchersType & DomTestingLibraryType, - - not: JestExpectType & EnzymeMatchersType, - diffJson: Function, - toEqualAtomRange: Function, - toEqualAtomRanges: Function, - diffLines: Function, - - /** - * If you have a mock function, you can use .lastCalledWith to test what - * arguments it was last called with. - */ - lastCalledWith(...args: Array): void, - /** - * toBe just checks that a value is what you expect. It uses === to check - * strict equality. - */ - toBe(value: any, _?: any): void, - /** - * Use .toHaveBeenCalled to ensure that a mock function got called. - */ - toBeCalled(): void, - /** - * Use .toBeCalledWith to ensure that a mock function was called with - * specific arguments. - */ - toBeCalledWith(...args: Array): void, - /** - * Using exact equality with floating point numbers is a bad idea. Rounding - * means that intuitive things fail. - */ - toBeCloseTo(num: number, delta: any): void, - /** - * Use .toBeDefined to check that a variable is not undefined. - */ - toBeDefined(_?: any): void, - /** - * Use .toBeFalsy when you don't care what a value is, you just want to - * ensure a value is false in a boolean context. - */ - toBeFalsy(_?: any): void, - /** - * To compare floating point numbers, you can use toBeGreaterThan. - */ - toBeGreaterThan(number: number): void, - /** - * To compare floating point numbers, you can use toBeGreaterThanOrEqual. - */ - toBeGreaterThanOrEqual(number: number): void, - /** - * To compare floating point numbers, you can use toBeLessThan. - */ - toBeLessThan(number: number): void, - /** - * To compare floating point numbers, you can use toBeLessThanOrEqual. - */ - toBeLessThanOrEqual(number: number): void, - /** - * Use .toBeInstanceOf(Class) to check that an object is an instance of a - * class. - */ - toBeInstanceOf(cls: Class<*>): void, - /** - * .toBeNull() is the same as .toBe(null) but the error messages are a bit - * nicer. - */ - toBeNull(_?: any): void, - /** - * Use .toBeTruthy when you don't care what a value is, you just want to - * ensure a value is true in a boolean context. - */ - toBeTruthy(_?: any): void, - /** - * Use .toBeUndefined to check that a variable is undefined. - */ - toBeUndefined(): void, - /** - * Use .toContain when you want to check that an item is in a list. For - * testing the items in the list, this uses ===, a strict equality check. - */ - toContain(item: any): void, - /** - * Use .toContainEqual when you want to check that an item is in a list. For - * testing the items in the list, this matcher recursively checks the - * equality of all fields, rather than checking for object identity. - */ - toContainEqual(item: any): void, - /** - * Use .toEqual when you want to check that two objects have the same value. - * This matcher recursively checks the equality of all fields, rather than - * checking for object identity. - */ - toEqual(value: any, _?: any): void, - /** - * Use .toHaveBeenCalled to ensure that a mock function got called. - */ - toHaveBeenCalled(): void, - /** - * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact - * number of times. - */ - toHaveBeenCalledTimes(number: number): void, - /** - * Use .toHaveBeenCalledWith to ensure that a mock function was called with - * specific arguments. - */ - toHaveBeenCalledWith(...args: Array): void, - /** - * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called - * with specific arguments. - */ - toHaveBeenLastCalledWith(...args: Array): void, - /** - * Check that an object has a .length property and it is set to a certain - * numeric value. - */ - toHaveLength(number: number): void, - /** - * - */ - toHaveProperty(propPath: string, value?: any): void, - /** - * Use .toMatch to check that a string matches a regular expression or string. - */ - toMatch(regexpOrString: RegExp | string): void, - /** - * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. - */ - toMatchObject(object: Object | Array): void, - /** - * This ensures that a React component matches the most recent snapshot. - */ - toMatchSnapshot(name?: string): void, - /** - * Use .toThrow to test that a function throws when it is called. - * If you want to test that a specific error gets thrown, you can provide an - * argument to toThrow. The argument can be a string for the error message, - * a class for the error, or a regex that should match the error. - * - * Alias: .toThrowError - */ - toThrow(message?: string | Error | Class | RegExp): void, - toThrowError(message?: string | Error | Class | RegExp): void, - /** - * Use .toThrowErrorMatchingSnapshot to test that a function throws a error - * matching the most recent snapshot when it is called. - */ - toThrowErrorMatchingSnapshot(): void, -}; - -type JestObjectType = { - /** - * Disables automatic mocking in the module loader. - * - * After this method is called, all `require()`s will return the real - * versions of each module (rather than a mocked version). - */ - disableAutomock(): JestObjectType, - /** - * An un-hoisted version of disableAutomock - */ - autoMockOff(): JestObjectType, - /** - * Enables automatic mocking in the module loader. - */ - enableAutomock(): JestObjectType, - /** - * An un-hoisted version of enableAutomock - */ - autoMockOn(): JestObjectType, - /** - * Clears the mock.calls and mock.instances properties of all mocks. - * Equivalent to calling .mockClear() on every mocked function. - */ - clearAllMocks(): JestObjectType, - /** - * Resets the state of all mocks. Equivalent to calling .mockReset() on every - * mocked function. - */ - resetAllMocks(): JestObjectType, - /** - * Restores all mocks back to their original value. - */ - restoreAllMocks(): JestObjectType, - /** - * Removes any pending timers from the timer system. - */ - clearAllTimers(): void, - /** - * The same as `mock` but not moved to the top of the expectation by - * babel-jest. - */ - doMock(moduleName: string, moduleFactory?: any): JestObjectType, - /** - * The same as `unmock` but not moved to the top of the expectation by - * babel-jest. - */ - dontMock(moduleName: string): JestObjectType, - /** - * Returns a new, unused mock function. Optionally takes a mock - * implementation. - */ - fn, TReturn>( - implementation?: (...args: TArguments) => TReturn, - ): JestMockFn, - /** - * Determines if the given function is a mocked function. - */ - isMockFunction(fn: Function): boolean, - /** - * Given the name of a module, use the automatic mocking system to generate a - * mocked version of the module for you. - */ - genMockFromModule(moduleName: string): any, - /** - * Mocks a module with an auto-mocked version when it is being required. - * - * The second argument can be used to specify an explicit module factory that - * is being run instead of using Jest's automocking feature. - * - * The third argument can be used to create virtual mocks -- mocks of modules - * that don't exist anywhere in the system. - */ - mock( - moduleName: string, - moduleFactory?: any, - options?: Object, - ): JestObjectType, - /** - * Returns the actual module instead of a mock, bypassing all checks on - * whether the module should receive a mock implementation or not. - */ - requireActual(moduleName: string): any, - /** - * Returns a mock module instead of the actual module, bypassing all checks - * on whether the module should be required normally or not. - */ - requireMock(moduleName: string): any, - /** - * Resets the module registry - the cache of all required modules. This is - * useful to isolate modules where local state might conflict between tests. - */ - resetModules(): JestObjectType, - /** - * Exhausts the micro-task queue (usually interfaced in node via - * process.nextTick). - */ - runAllTicks(): void, - /** - * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), - * setInterval(), and setImmediate()). - */ - runAllTimers(): void, - /** - * Exhausts all tasks queued by setImmediate(). - */ - runAllImmediates(): void, - /** - * Executes only the macro task queue (i.e. all tasks queued by setTimeout() - * or setInterval() and setImmediate()). - */ - advanceTimersByTime(msToRun: number): void, - /** - * Executes only the macro task queue (i.e. all tasks queued by setTimeout() - * or setInterval() and setImmediate()). - * - * Renamed to `advanceTimersByTime`. - */ - runTimersToTime(msToRun: number): void, - /** - * Executes only the macro-tasks that are currently pending (i.e., only the - * tasks that have been queued by setTimeout() or setInterval() up to this - * point) - */ - runOnlyPendingTimers(): void, - /** - * Explicitly supplies the mock object that the module system should return - * for the specified module. Note: It is recommended to use jest.mock() - * instead. - */ - setMock(moduleName: string, moduleExports: any): JestObjectType, - /** - * Indicates that the module system should never return a mocked version of - * the specified module from require() (e.g. that it should always return the - * real module). - */ - unmock(moduleName: string): JestObjectType, - /** - * Instructs Jest to use fake versions of the standard timer functions - * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, - * setImmediate and clearImmediate). - */ - useFakeTimers(): JestObjectType, - /** - * Instructs Jest to use the real versions of the standard timer functions. - */ - useRealTimers(): JestObjectType, - /** - * Creates a mock function similar to jest.fn but also tracks calls to - * object[methodName]. - */ - spyOn(object: Object, methodName: string): JestMockFn, - /** - * Set the default timeout interval for tests and before/after hooks in milliseconds. - * Note: The default timeout interval is 5 seconds if this method is not called. - */ - setTimeout(timeout: number): JestObjectType, - - retryTimes(n: number): JestObjectType, -}; - -type JestSpyType = { - calls: JestCallsType, -}; - -/** Runs this function after every test inside this context */ -declare function afterEach( - fn: (done: () => void) => ?Promise, - timeout?: number, -): void; -/** Runs this function before every test inside this context */ -declare function beforeEach( - fn: (done: () => void) => ?Promise, - timeout?: number, -): void; -/** Runs this function after all tests have finished inside this context */ -declare function afterAll( - fn: (done: () => void) => ?Promise, - timeout?: number, -): void; -/** Runs this function before any tests have started inside this context */ -declare function beforeAll( - fn: (done: () => void) => ?Promise, - timeout?: number, -): void; - -/** A context for grouping tests together */ -declare var describe: { - /** - * Creates a block that groups together several related tests in one "test suite" - */ - (name: JestTestName, fn: () => void): void, - - /** - * Only run this describe block - */ - only(name: JestTestName, fn: () => void): void, - - /** - * Skip running this describe block - */ - skip(name: JestTestName, fn: () => void): void, -}; - -/** An individual test unit */ -declare var it: { - /** - * An individual test unit - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - ( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number, - ): void, - /** - * Only run this test - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - only( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number, - ): void, - /** - * Skip running this test - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - skip( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number, - ): void, - /** - * Run the test concurrently - * - * @param {JestTestName} Name of Test - * @param {Function} Test - * @param {number} Timeout for the test, in milliseconds. - */ - concurrent( - name: JestTestName, - fn?: (done: () => void) => ?Promise, - timeout?: number, - ): void, -}; -declare function fit( - name: JestTestName, - fn: (done: () => void) => ?Promise, - timeout?: number, -): void; -/** An individual test unit */ -declare var test: typeof it; -/** A disabled group of tests */ -declare var xdescribe: typeof describe; -/** A focused group of tests */ -declare var fdescribe: typeof describe; -/** A disabled individual test */ -declare var xit: typeof it; -/** A disabled individual test */ -declare var xtest: typeof it; - -type JestPrettyFormatColors = { - comment: {close: string, open: string}, - content: {close: string, open: string}, - prop: {close: string, open: string}, - tag: {close: string, open: string}, - value: {close: string, open: string}, -}; - -type JestPrettyFormatIndent = string => string; -type JestPrettyFormatRefs = Array; -type JestPrettyFormatPrint = any => string; -type JestPrettyFormatStringOrNull = string | null; - -type JestPrettyFormatOptions = {| - callToJSON: boolean, - edgeSpacing: string, - escapeRegex: boolean, - highlight: boolean, - indent: number, - maxDepth: number, - min: boolean, - plugins: JestPrettyFormatPlugins, - printFunctionName: boolean, - spacing: string, - theme: {| - comment: string, - content: string, - prop: string, - tag: string, - value: string, - |}, -|}; - -type JestPrettyFormatPlugin = { - print: ( - val: any, - serialize: JestPrettyFormatPrint, - indent: JestPrettyFormatIndent, - opts: JestPrettyFormatOptions, - colors: JestPrettyFormatColors, - ) => string, - test: any => boolean, -}; - -type JestPrettyFormatPlugins = Array; - -/** The expect function is used every time you want to test a value */ -declare var expect: { - /** The object that you want to make assertions against */ - ( - value: any, - ): JestExpectType & - JestPromiseType & - EnzymeMatchersType & - DomTestingLibraryType, - /** Add additional Jasmine matchers to Jest's roster */ - extend(matchers: {[name: string]: JestMatcher}): void, - /** Add a module that formats application-specific data structures. */ - addSnapshotSerializer(pluginModule: JestPrettyFormatPlugin): void, - assertions(expectedAssertions: number): void, - hasAssertions(): void, - any(value: mixed): JestAsymmetricEqualityType, - anything(): any, - arrayContaining(value: Array): Array, - objectContaining(value: Object): Object, - /** Matches any received string that contains the exact expected string. */ - stringContaining(value: string): string, - stringMatching(value: string | RegExp): string, -}; - -// TODO handle return type -// http://jasmine.github.io/2.4/introduction.html#section-Spies -// declare function spyOn(value: mixed, method: string): Object; - -/** Holds all functions related to manipulating test runner */ -declare var jest: JestObjectType; diff --git a/flow-libs/need-to-upstream-to-flow-lib.js.flow b/flow-libs/need-to-upstream-to-flow-lib.js.flow deleted file mode 100644 index db1b92f809..0000000000 --- a/flow-libs/need-to-upstream-to-flow-lib.js.flow +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -/* - * APIs listed in this file are ones that should be built into Flow and need to be upstreamed. - */ - -type IDisposable = { - dispose(): mixed, -}; - -/* - * These Notification & NotificationOptions definitions are not exhaustive while standardization, - * browser, and Electron support remain incomplete. - */ -type NotificationOptions = { - body?: string, - icon?: string, -}; - -declare class Notification { - constructor( - message: string, - options?: NotificationOptions, - ): void, - onclick: () => void, -} - -// T9254051 - Fix flow http/https definitions. -declare class http$fixed$Server extends events$EventEmitter { - listen(port: number, hostname?: string, backlog?: number, callback?: Function): http$fixed$Server, - listen(path: string, callback?: Function): http$fixed$Server, - listen(handle: Object, callback?: Function): http$fixed$Server, - close(callback?: Function): http$fixed$Server, - address(): {port: number, fmaily: string, address: string}, - maxHeadersCount: number, -} - -declare class http$fixed$IncomingMessage extends stream$Readable { - headers: Object, - httpVersion: string, - method: string, - trailers: Object, - setTimeout(msecs: number, callback: Function): void, - socket: any, // TODO net.Socket - statusCode: number, - url: string, - connection: { destroy: () => void }, -} - -declare class http$fixed$ClientRequest extends stream$Writable { -} - -declare class http$fixed$ServerResponse { - setHeader(name: string, value: string): void, - statusCode: number, - write(value: string): void, - end(): void, -} - -declare class https$fixed { - Server: typeof http$fixed$Server, - createServer( - options: Object, - requestListener?: ( - request: http$fixed$IncomingMessage, - response: http$fixed$ServerResponse, - ) => void, - ): http$fixed$Server, - request( - options: Object | string, - callback: (response: http$fixed$IncomingMessage) => void - ): http$fixed$ClientRequest, - get( - options: Object | string, - callback: (response: http$fixed$IncomingMessage) => void - ): http$fixed$ClientRequest, -} - -declare class http$fixed { - Server: typeof http$fixed$Server, - createServer( - requestListener?: ( - request: http$fixed$IncomingMessage, - response: http$fixed$ServerResponse, - ) => void - ): http$fixed$Server, - request( - options: Object | string, - callback: (response: http$fixed$IncomingMessage) => void - ): http$fixed$ClientRequest, - get( - options: Object | string, - callback: (response: http$fixed$IncomingMessage) => void - ): http$fixed$ClientRequest, -} - -declare class module$Module { - constructor( - id?: string, - parent?: string | module$Module - ): void, - id: ?string, - exports: any, - parent?: string | module$Module, - filename?: string, - loaded: boolean, - children: Array, - paths: Array, - _compile: (content: string, filename: string) => void, - - static _resolveFilename(filename: string, module: any): string, -} - -declare module 'module' { - declare module.exports: typeof module$Module; -} - -declare module 'console' { - declare module.exports: any; -} - -declare interface net$ListenOptions { - port?: number, - host?: string, - backlog?: number, - path?: string, - exclusive?: boolean, -} - -declare export var module: module$Module; diff --git a/flow-libs/need-to-upstream-to-pty.js.flow b/flow-libs/need-to-upstream-to-pty.js.flow deleted file mode 100644 index 8d4895cbb5..0000000000 --- a/flow-libs/need-to-upstream-to-pty.js.flow +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -/* - * APIs listed in this file are ones that should be built into nuclide-prebuilt-libs/pty and need to be upstreamed. - */ - -declare module 'nuclide-prebuilt-libs/pty' { - declare export type ProcessEnv = { - +[key: string]: string; - }; - - declare export type IPtyForkOptions = { - name?: string; - cols?: number; - rows?: number; - cwd?: string; - env?: ProcessEnv; - uid?: number; - gid?: number; - }; - - declare export type IPtyOpenOptions = { - cols?: number; - rows?: number; - }; -} diff --git a/flow-libs/nuclide.flow.js b/flow-libs/nuclide.flow.js deleted file mode 100644 index 3d5be7f431..0000000000 --- a/flow-libs/nuclide.flow.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow strict - * @format - */ - -/* eslint-disable no-undef */ - -declare interface nuclide$CwdApi { - setCwd(path: string): void; - observeCwd(callback: (path: ?string) => void): IDisposable; - getCwd(): ?string; -} - -declare interface nuclide$RpcService { - getServiceByNuclideUri(serviceName: string, uri: ?string): any; -} diff --git a/flow-libs/react.flow.js b/flow-libs/react.flow.js deleted file mode 100644 index 4399099d08..0000000000 --- a/flow-libs/react.flow.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow strict-local - * @format - */ - -/* eslint-disable no-undef */ - -// This is the type for the result of calling React.createRef where the ref is a -// plain DOM element, like `input`, or `div` -// -// Usage: -// -// _inputRef: ReactHTMLElementRef = React.createRef(); -declare type ReactHTMLElementRef = { - current: null | TElement, -}; diff --git a/flow-libs/relay.js.flow b/flow-libs/relay.js.flow deleted file mode 100644 index 1c1d7a19cf..0000000000 --- a/flow-libs/relay.js.flow +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - - type Variables = {[name: string]: any}; - type RefetchOptions = { - force?: boolean, // Refetch from the server ignoring anything in the cache. - }; - - type RelayPaginationProp = { - /** - * Check if there is at least one more page. - */ - hasMore: () => boolean, - - /** - * Check if there are pending requests. - */ - isLoading: () => boolean, - - /** - * Execute the pagination query. Relay will infer the pagination direction (either 'forward' - * or 'backward') from the query parameters. `pageSize` is the additional number of items - * to load. - */ - loadMore: ( - pageSize: number, - callback: ?(error: ?Error) => void, - options: ?RefetchOptions - ) => ?IDisposable, - - /** - * Refetch the items in the connection (with potentially new variables). - */ - refetchConnection:( - totalCount: number, - callback: (error: ?Error) => void, - refetchVariables: ?Variables, - ) => ?IDisposable, - } diff --git a/flow-libs/simple-text-buffer.js.flow b/flow-libs/simple-text-buffer.js.flow deleted file mode 100644 index 7cc09d460b..0000000000 --- a/flow-libs/simple-text-buffer.js.flow +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -declare class simpleTextBuffer$TextBuffer { - constructor(contents: string): void, - - // Mixin - static deserialize: (state: Object, params: Object) => mixed, - - // Events - onWillChange(callback: (event: atom$TextEditEvent) => mixed): IDisposable, - onDidChange(callback: (event: atom$TextEditEvent) => mixed): IDisposable, - onDidStopChanging(callback: () => mixed): IDisposable, - onDidChangeModified(callback: () => mixed): IDisposable, - onDidChangeEncoding(callback: () => mixed): IDisposable, - onDidDestroy(callback: () => mixed): IDisposable, - - // File Details - setEncoding(encoding: string): void, - getEncoding(): string, - getId(): string, - - // Reading Text - isEmpty(): boolean, - getText(): string, - getTextInRange(range: atom$RangeLike): string, - getLineCount(): number, - getLines(): Array, - getLastLine(): string, - lineForRow(row: number): string, - lineEndingForRow(row: number): string, - lineLengthForRow(row: number): number, - isRowBlank(row: number): boolean, - previousNonBlankRow(startRow: number): ?number, - nextNonBlankRow(startRow: number): ?number, - - // Mutating Text - setText(text: string): atom$Range, - setTextInRange( - range: atom$RangeLike, text: string, options?: Object): atom$Range, - setTextViaDiff(text: string): void, - insert( - position: atom$Point, - text: string, - options?: { - normalizeLineEndings?: boolean, - undo?: string, - }, - ): atom$Range, - append(text: string, options: ?{ - normalizeLineEndings?: boolean, - undo?: string, - }): atom$Range, - delete(range: atom$Range): atom$Range, - deleteRows(startRow: number, endRow: number): atom$Range, - - // History - undo(): void, - redo(): void, - transact(fn: () => mixed, _: void): void, - transact(groupingInterval: number, fn: () => mixed): void, - clearUndoStack(): void, - createCheckpoint(): atom$TextBufferCheckpoint, - revertToCheckpoint(checkpoint: atom$TextBufferCheckpoint): boolean, - groupChangesSinceCheckpoint(checkpoint: atom$TextBufferCheckpoint): boolean, - // TODO describe the return type more precisely. - getChangesSinceCheckpoint(checkpoint: atom$TextBufferCheckpoint): Array, - - // Search And Replace - scanInRange(regex: RegExp, range: atom$Range, iterator: TextBufferScanIterator): void, - backwardsScanInRange( - regex: RegExp, range: atom$Range, iterator: TextBufferScanIterator): void, - - // Buffer Range Details - getLastRow(): number, - getRange(): atom$Range, - rangeForRow(row: number, includeNewLine?: boolean): atom$Range, - - // Position/Index mapping - characterIndexForPosition(position: atom$PointLike): number, - positionForCharacterIndex(index: number): atom$Point, - - // Private APIs - emitter: atom$Emitter, - refcount: number, - changeCount: number, - destroy(): void, - isDestroyed(): boolean, - - static Point: typeof atom$Point, - static Range: typeof atom$Range, -} - -declare module 'simple-text-buffer' { - declare export var Point: typeof atom$Point; - declare export var Range: typeof atom$Range; - declare export default typeof simpleTextBuffer$TextBuffer; -} diff --git a/flow-libs/ssh2-streams.js.flow b/flow-libs/ssh2-streams.js.flow deleted file mode 100644 index 94f878661e..0000000000 --- a/flow-libs/ssh2-streams.js.flow +++ /dev/null @@ -1,2154 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -// Type definitions for ssh2-streams v0.1.9 -// Project: https://github.com/mscdex/ssh2-streams -// TypeScript Definitions by: Ron Buckton - -declare module 'ssh2-streams' { - declare type ParsedKey = { - fulltype: string; - type: string; - extra: string; - comment: string; - encryption: string; - private: Buffer; - privateOrig: Buffer; - public: Buffer; - publicOrig: Buffer; - ppk?: boolean; - privateMAC?: string; - } - - declare class SSH2Stream extends stream$Transform { - /** - * The number of bytes sent since the last keying. This metric can be useful in determining when to call rekey(). - */ - bytesSent: number; - - /** - * The number of bytes received since the last keying. This metric can be useful in determining when to call rekey(). - */ - bytesReceived: number; - - /** - * Creates and returns a new SSH2Stream instance. - */ - constructor(config?: SSH2StreamConfig): void; - - /** - * (Client/Server) - * Writes a dummy GLOBAL_REQUEST packet (specifically "keepalive@openssh.com") that requests a reply. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ping(): boolean; - - /** - * (Client/Server) - * Writes a disconnect packet and closes the stream. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - disconnect(reasonCode?: number): boolean; - - /** - * (Client/Server) - * Starts the re-keying process. Incoming/Outgoing packets are buffered until the re-keying - * process has finished. Returns `false` to indicate that no more packets should be written - * until the `NEWKEYS` event is seen. - */ - rekey(): boolean; - - /** - * (Client/Server) - * Writes a request success packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - requestSuccess(data?: Buffer): boolean; - - /** - * (Client/Server) - * Writes a request failure packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - requestFailure(): boolean; - - /** - * (Client/Server) - * Writes a channel success packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelSuccess(channel: number): boolean; - - /** - * (Client/Server) - * Writes a channel failure packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelFailure(channel: number): boolean; - - /** - * (Client/Server) - * Writes a channel EOF packet for the given `channel`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelEOF(channel: number): boolean; - - /** - * (Client/Server) - * Writes a channel close packet for the given `channel`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelClose(channel: number): boolean; - - /** - * (Client/Server) - * Writes a channel window adjust packet for the given `channel` where `amount` is the - * number of bytes to add to the channel window. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelWindowAdjust(channel: number, amount: number): boolean; - - /** - * (Client/Server) - * Writes a channel data packet for the given `channel` where `data` is a _Buffer_ or _string_. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelData(channel: number, data: string | Buffer): boolean; - - /** - * (Client/Server) - * Writes a channel extended data packet for the given `channel` where `data is a _Buffer_ - * or _string_. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelExtData(channel: number, data: string | Buffer, type: number): boolean; - - /** - * (Client/Server) - * Writes a channel open confirmation packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelOpenConfirm( - remoteChannel: number, - localChannel: number, - initWindow: number, - maxPacket: number - ): boolean; - - /** - * (Client/Server) - * Writes a channel open failure packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - channelOpenFail( - remoteChannel: number, - reasonCode: number, - description?: string, - lang?: string - ): boolean; - - /** - * (Client-only) - * Writes a service request packet for `serviceName`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - service(serviceName: string): boolean; - - /** - * (Client-only) - * Writes a tcpip forward global request packet. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - tcpipForward( - bindAddr: string, - bindPort: number, - wantReply?: boolean - ): boolean; - - /** - * (Client-only) - * Writes a cancel tcpip forward global request packet. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - cancelTcpipForward( - bindAddr: string, - bindPort: number, - wantReply?: boolean - ): boolean; - - /** - * (Client-only) - * Writes a password userauth request packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authPassword(username: string, password: string): boolean; - - /** - * (Client-only) - * Writes a publickey userauth request packet. `pubKey` is the object returned from using - * `utils.parseKey()` on a private or public key. If `cbSign` is not present, a pubkey - * check userauth packet is written. Otherwise `cbSign` is called with `(blob, callback)`, - * where `blob` is the data to sign with the private key and the resulting signature - * _Buffer_ is passed to `callback` as the first argument. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authPK( - username: string, - pubKey: ParsedKey, - cbSign?: ( - blob: Buffer, - callback: (signedBlob: Buffer) => mixed - ) => mixed - ): boolean; - - /** - * (Client-only) - * Writes a hostbased userauth request packet. `pubKey` is the object returned from using - * `utils.parseKey()` on a private or public key. `cbSign` is called with `(blob, callback)`, - * where `blob` is the data to sign with the private key and the resulting signature - * _Buffer_ is passed to `callback` as the first argument. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authHostBased( - username: string, - pubKey: ParsedKey, - localHostname: string, - localUsername: string, - cbSign?: ( - blob: Buffer, - callback: (signedBlob: Buffer) => mixed - ) => mixed - ): boolean; - - /** - * (Client-only) - * Writes a keyboard-interactive userauth request packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authKeyboard(username: string): boolean; - - /** - * (Client-only) - * Writes a "none" userauth request packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authNone(username: string): boolean; - - /** - * (Client-only) - * Writes a userauth info response packet. `responses` is an _array_ of zero or more strings - * corresponding to responses to prompts previously sent by the server. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authInfoRes(responses?: string[]): boolean; - - /** - * (Client-only) - * Writes a direct tcpip channel open packet. `config` must contain `srcIP`, `srcPort`, - * `dstIP`, and `dstPort`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - directTcpip( - channel: number, - initWindow: number, - maxPacket: number, - config: TcpipForwardingConfig - ): boolean; - - /** - * (Client-only) - * Writes a session channel open packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - session(channel: number, initWindow: number, maxPacket: number): boolean; - - /** - * (Client-only) - * Writes an `auth-agent-req@openssh.com` channel request packet. `wantReply` defaults to - * `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_agentForward(channel: number, wantReply?: boolean): boolean; - - /** - * (Client-only) - * Writes a window change channel request packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - windowChange( - channel: number, - rows: number, - cols: number, - height: number, - width: number - ): boolean; - - /** - * (Client-only) - * Writes a pty channel request packet. If `terminalType` is falsey, `vt100` is used. - * `terminalModes` can be the raw bytes, an _object_ of the terminal modes to set, or a falsey value for no modes. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - pty( - channel: number, - rows: number, - cols: number, - height: number, - width: number, - terminalType?: string, - terminalModes?: any, - wantReply?: boolean - ): boolean; - - /** - * (Client-only) - * Writes an env channel request packet. `value` can be a _string_ or _Buffer_. `wantReply` - * defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - env( - channel: number, - key: string, - value: string | Buffer, - wantReply?: boolean - ): boolean; - - /** - * (Client-only) - * Writes a shell channel request packet. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - shell(channel: number, wantReply?: boolean): boolean; - - /** - * (Client-only) - * Writes an exec channel request packet. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - exec(channel: number, command: string, wantReply?: boolean): boolean; - - /** - * (Client-only) - * Writes a signal channel request packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - signal(channel: number, signalName: string): boolean; - - /** - * (Client-only) - * Writes an X11 forward channel request packet. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - x11Forward( - channel: number, - config: X11ForwardingConfig, - wantReply?: boolean - ): boolean; - - /** - * (Client-only) - * Writes a subsystem channel request packet. `name` is the name of the subsystem (e.g. - * `sftp` or `netconf`). `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - subsystem(channel: number, name: string, wantReply?: boolean): boolean; - - /** - * (Client-only) - * Writes a no-more-sessions@openssh.com request packet. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_noMoreSessions(wantReply?: boolean): boolean; - - /** - * (Client-only) - * Writes a streamlocal-forward@openssh.com request packet. `wantReply` defaults to `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_streamLocalForward(socketPath: string, wantReply?: boolean): boolean; - - /** - * (Client-only) - * Writes a cancel-streamlocal-forward@openssh.com request packet. `wantReply` defaults to - * `true`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_cancelStreamLocalForward( - socketPath: string, - wantReply?: boolean - ): boolean; - - /** - * (Client-only) - * Writes a direct-streamlocal@openssh.com channel open packet. `config` must contain - * `socketPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_directStreamLocal( - channel: number, - initWindow: number, - maxPacket: number, - config: SocketForwardingConfig - ): boolean; - - /** - * (Server-only) - * Writes a service accept packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - serviceAccept(serviceName: string): boolean; - - /** - * (Server-only) - * Writes a userauth failure packet. `authMethods` is an _array_ of authentication methods - * that can continue. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authFailure(authMethods?: string[], partialSuccess?: boolean): boolean; - - /** - * (Server-only) - * Writes a userauth success packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authSuccess(): boolean; - - /** - * (Server-only) - * Writes a userauth PK OK packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authPKOK(keyAlgorithm: string, keyData: Buffer): boolean; - - /** - * (Server-only) - * Writes a userauth info request packet. `prompts` is an array of `Prompt` objects. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - authInfoReq(name: string, instructions: string, prompts: Prompt[]): boolean; - - /** - * (Server-only) - * Writes a forwarded tcpip channel open packet. `info` must contain `boundAddr`, - * `boundPort`, `remoteAddr`, and `remotePort`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - forwardedTcpip( - channel: number, - initWindow: number, - maxPacket: number, - info: ForwardedTcpip - ): boolean; - - /** - * (Server-only) - * Writes an X11 channel open packet. `info` must contain `originAddr` and `originPort`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - x11( - channel: number, - initWindow: number, - maxPacket: number, - info: ForwardedX11 - ): boolean; - - /** - * (Server-only) - * Writes an forwarded-streamlocal@openssh.com channel open packet. `info` must contain - * `socketPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_forwardedStreamLocal( - channel: number, - initWindow: number, - maxPacket: number, - info: ForwardedSocket - ): boolean; - - /** - * (Server-only) - * Writes an exit status channel request packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - exitStatus(channel: number, exitCode: number): boolean; - - /** - * (Server-only) - * Writes an exit signal channel request packet. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - exitSignal( - channel: number, - signalName: string, - coreDumped: boolean, - errorMessage: string - ): boolean; - - /** - * (Client/Server) - * Emitted when the protocol header is seen. - */ - on(event: 'header', listener: (header: Header) => mixed): this; - - /** - * (Client/Server) - */ - on( - event: 'GLOBAL_REQUEST', - listener: ( - reqName: string, - wantReply: boolean, - request: ?(GlobalRequest | Buffer) - ) => mixed - ): this; - - /** - * (Client/Server) - */ - on( - event: 'DISCONNECT', - listener: ( - reason: string, - reasonCode: number, - description: string - ) => mixed - ): this; - - /** - * (Client/Server) - */ - on(event: 'DEBUG', listener: (message: string) => mixed): this; - - /** - * (Client/Server) - */ - on(event: 'NEWKEYS', listener: () => mixed): this; - - /** - * (Client/Server) - */ - on( - event: 'REQUEST_SUCCESS', - listener: (resData: Buffer) => mixed - ): this; - - /** - * (Client/Server) - */ - on(event: 'REQUEST_FAILURE', listener: () => mixed): this; - - /** - * (Client/Server) - */ - on( - event: 'CHANNEL_OPEN', - listener: (channelInfo: ChannelOpenInfo) => mixed - ): this; - - /** - * (Client/Server) - */ - on( - event: 'CHANNEL_OPEN_CONFIRMATION:0', - listener: (channelInfo: ChannelOpenConfirmationInfo) => mixed - ): this; - - /** - * (Client/Server) - */ - on( - event: 'CHANNEL_OPEN_FAILURE:0', - listener: (failInfo: ChannelOpenFailureInfo) => mixed - ): this; - - /** - * (Client/Server) - */ - on( - event: 'CHANNEL_REQUEST:0', - listener: (request: ChannelRequest) => mixed - ): this; - - /** - * (Client/Server) - */ - on( - event: 'CHANNEL_DATA:0', - listener: (data: Buffer) => mixed - ): this; - - /** - * (Client/Server) - */ - on( - event: 'CHANNEL_EXTENDED_DATA:0', - listener: (type: number, data: Buffer) => mixed - ): this; - - /** - * (Client/Server) - */ - on( - event: 'CHANNEL_WINDOW_ADJUST:0', - listener: (bytesToAdd: number) => mixed - ): this; - - /** - * (Client/Server) - */ - on(event: 'CHANNEL_SUCCESS:0', listener: () => mixed): this; - - /** - * (Client/Server) - */ - on(event: 'CHANNEL_FAILURE:0', listener: () => mixed): this; - - /** - * (Client/Server) - */ - on(event: 'CHANNEL_EOF:0', listener: () => mixed): this; - - /** - * (Client/Server) - */ - on(event: 'CHANNEL_CLOSE:0', listener: () => mixed): this; - - /** - * (Client-only) - * This event allows you to verify a host's key. If `callback` is called with `true`, the - * handshake continues. Otherwise a disconnection will occur if `callback` is called with - * `false`. The default behavior is to auto-allow any host key if there are no handlers - * for this event. - */ - on( - event: 'fingerprint', - listener: ( - hostKey: Buffer, - callback: (success: boolean) => mixed - ) => mixed - ): this; - - /** - * (Client-only) - */ - on( - event: 'SERVICE_ACCEPT', - listener: (serviceName: string) => mixed - ): this; - - /** - * (Client-only) - */ - on( - event: 'USERAUTH_PASSWD_CHANGEREQ', - listener: (message: string) => mixed - ): this; - - /** - * (Client-only) - */ - on( - event: 'USERAUTH_INFO_REQUEST', - listener: ( - name: string, - instructions: string, - lang: string, - prompts: Prompt[] - ) => mixed - ): this; - - /** - * (Client-only) - */ - on(event: 'USERAUTH_PK_OK', listener: () => mixed): this; - - /** - * (Client-only) - */ - on(event: 'USERAUTH_SUCCESS', listener: () => mixed): this; - - /** - * (Client-only) - */ - on( - event: 'USERAUTH_FAILURE', - listener: ( - methodsContinue: string[], - partialSuccess: boolean - ) => mixed - ): this; - - /** - * (Client-only) - */ - on( - event: 'USERAUTH_BANNER', - listener: (message: string) => mixed - ): this; - - /** - * (Server-only) - */ - on( - event: 'SERVICE_REQUEST', - listener: (serviceName: string) => mixed - ): this; - - /** - * (Server-only) - */ - on( - event: 'USERAUTH_REQUEST', - listener: ( - username: string, - serviceName: string, - authMethod: string, - authMethodData: AuthMethodData - ) => mixed - ): this; - - /** - * (Server-only) - */ - on( - event: 'USERAUTH_INFO_RESPONSE', - listener: (responses: string[]) => mixed - ): this; - - /** - * Emitted when the connection has authenticated. - */ - on(event: 'ready', listener: () => mixed): this; - - /** - * Emitted when the socket has disconnected. - */ - on(event: 'end', listener: () => mixed): this; - - /** - * Emitted when the client socket was closed. - */ - on(event: 'close', listener: () => mixed): this; - - /** - * Emitted when more requests/data can be sent to the stream. - */ - on(event: 'continue', listener: () => mixed): this; - - /** - * Emitted when an error occurred. - */ - on(event: 'error', listener: (err: any) => mixed): this; - - on(event: string, listener: Function): this - } - - declare type SSH2StreamConfig = { - /** - * Set to true to create an instance in server mode. - */ - server?: boolean; - - /** - * If in server mode, an object keyed on host key format. - */ - hostKeys?: HostKeys; - - /** - * A message that is sent to clients immediately upon connection, before handshaking begins. - */ - banner?: string; - - /** - * A custom server software name/version identifier. - * @default 'ssh2js' + moduleVersion + 'srv' - */ - ident?: string; - - /** - * This is the maximum packet size that will be accepted. It should be 35000 bytes or larger to be compatible with other SSH2 implementations. - * @default 35000 - */ - maxPacketSize?: number; - - /** - * This is the highWaterMark to use for the parser stream. - * @default 32 * 1024 - */ - highWaterMark?: number; - - /** - * This option allows you to explicitly override the default transport layer algorithms used for the connection. Each value must be an array of valid algorithms for that category. The order of the algorithms in the arrays are important, with the most favorable being first. - */ - algorithms?: Algorithms; - - /** - * Set this to a function that receives a single string argument to get detailed (local) debug information. - */ - debug?: (information: string) => any; - } - - declare type HostKeys = { - [format: string]: HostKey; - } - - declare type HostKey = { - privatekey: ParsedKey; - publickey: ParsedKey; - } - - /** - * Overrides for the default transport layer algorithms used for the connection. - * - * The order of the algorithms in the arrays are important, with the most favorable being first. - */ - declare type Algorithms = { - kex?: string[]; - cipher?: string[]; - serverHostKey?: string[]; - hmac?: string[]; - compress?: string[]; - } - - declare type Header = { - /** - * (Client-only) An optional greeting message presented by the server. - */ - greeting?: string; - - /** - * The raw identification string sent by the remote party. - */ - identRaw: string; - - /** - * Contains various version information parsed from identRaw. - */ - versions: Versions; - - /** - * Any text that comes after the software name/version. - */ - comments: string; - } - - declare type Versions = { - /** - * The SSH protocol version supported by the remote party. - */ - protocol: string; - - /** - * The software name and version used by the remote party. - */ - software: string; - } - - declare type TcpipForwardGlobalRequest = { - /** - * The IP address to start/stop binding to. - */ - bindAddr: string; - - /** - * The port to start/stop binding to. - */ - bindPort: number; - } - - declare type openssh_StreamLocalForwardGlobalRequest = { - socketPath: string; - } - - declare type GlobalRequest = TcpipForwardGlobalRequest | - openssh_StreamLocalForwardGlobalRequest | - Buffer; - - declare type ChannelOpenConfirmationInfo = { - recipient: number; - sender: number; - window: number; - packetSize: number; - } - - declare type ChannelOpenFailureInfo = { - recipient: number; - reasonCode: number; - reason: string; - description: string; - } - - declare type X11ChannelInfo = { - +type: 'x11'; - sender: number; - window: number; - packetSize: number; - data: X11ChannelData; - } - - declare type X11ChannelData = { - srcIP: string; - srcPort: number; - } - - declare type ForwardedTcpipChannelInfo = { - +type: 'forwarded-tcpip'; - sender: number; - window: number; - packetSize: number; - data: TcpipChannelData; - } - - declare type DirectTcpipChannelInfo = { - +type: 'direct-tcpip'; - sender: number; - window: number; - packetSize: number; - data: TcpipChannelData; - } - - declare type TcpipChannelData = { - srcIP: string; - srcPort: number; - destIP: string; - destPort: number; - } - - declare type openssh_ForwardedStreamLocalChannelInfo = { - +type: 'forwarded-streamlocal@openssh.com'; - sender: number; - window: number; - packetSize: number; - data: SocketChannelData; - } - - declare type openssh_DirectStreamLocalChannelInfo = { - +type: 'direct-streamlocal@openssh.com'; - sender: number; - window: number; - packetSize: number; - data: SocketChannelData; - } - - declare type SocketChannelData = { - socketPath: string; - } - - declare type openssh_AuthAgentChannelInfo = { - +type: 'auth-agent@openssh.com'; - sender: number; - window: number; - packetSize: number; - } - - declare type SessionChannelInfo = { - +type: 'session'; - sender: number; - window: number; - packetSize: number; - } - - declare type ChannelOpenInfo = X11ChannelInfo | - ForwardedTcpipChannelInfo | - openssh_ForwardedStreamLocalChannelInfo | - openssh_AuthAgentChannelInfo | - DirectTcpipChannelInfo | - openssh_DirectStreamLocalChannelInfo | - SessionChannelInfo; - - declare type ExitStatusChannelRequest = { - +request: 'exit-status'; - recipient: number; - code: number; - } - - declare type ExitSignalChannelRequest = { - +request: 'exit-signal'; - recipient: number; - signal: string; - coredump: boolean; - description: string; - } - - declare type PseudoTtyChannelRequest = { - +request: 'pty-req'; - recipient: number; - wantReply: boolean; - term: string; - cols: number; - rows: number; - width: number; - height: number; - modes: any; - } - - declare type WindowChangeChannelRequest = { - +request: 'window-change'; - recipient: number; - cols: number; - rows: number; - width: number; - height: number; - } - - declare type X11ChannelRequest = { - +request: 'x11-req'; - recipient: number; - wantReply: boolean; - single: boolean; - protocol: string; - cookie: string; - screen: number; - } - - declare type EnvChannelRequest = { - +request: 'env'; - recipient: number; - wantReply: boolean; - key: string; - val: string; - } - - declare type ShellChannelRequest = { - +request: 'shell'; - recipient: number; - wantReply: boolean; - } - - declare type ExecChannelRequest = { - +request: 'exec'; - recipient: number; - wantReply: boolean; - command: string; - } - - declare type SubsystemChannelRequest = { - +request: 'subsystem'; - recipient: number; - wantReply: boolean; - subsystem: string; - } - - declare type SignalChannelRequest = { - +request: 'signal'; - recipient: number; - signal: string; - } - - declare type FlowControlChannelRequest = { - +request: 'xon-xoff'; - recipient: number; - clientControl: boolean; - } - - declare type openssh_AuthAgentChannelRequest = { - +request: 'auth-agent-req@openssh.com'; - recipient: number; - } - - declare type ChannelRequest = ExitStatusChannelRequest | - ExitSignalChannelRequest | - PseudoTtyChannelRequest | - WindowChangeChannelRequest | - X11ChannelRequest | - EnvChannelRequest | - ShellChannelRequest | - ExecChannelRequest | - SubsystemChannelRequest | - SignalChannelRequest | - FlowControlChannelRequest; - - declare type PublicKeyAuthMethodData = { - keyAlgo: string; - key: Buffer; - signature?: Buffer; - blob?: Buffer; - } - - declare type HostbasedAuthMethodData = { - keyAlgo: string; - key: Buffer; - signature?: Buffer; - blob?: Buffer; - localHostname: string; - localUsername: string; - } - - declare type AuthMethodData = string | PublicKeyAuthMethodData | HostbasedAuthMethodData; - - declare type TcpipForwardingConfig = { - /** - * Source IP address of outgoing connection. - */ - srcIP: string; - - /** - * Source port of outgoing connection. - */ - srcPort: number; - - /** - * Destination IP address of outgoing connection. - */ - destIP: string; - - /** - * Destination port of outgoing connection. - */ - destPort: number; - } - - declare type X11ForwardingConfig = { - /** - * true if only a single connection should be forwarded. - */ - single: boolean; - - /** - * The name of the X11 authentication method used (e.g. MIT-MAGIC-COOKIE-1). - */ - protocol: string; - - /** - * The X11 authentication cookie encoded in hexadecimal. - */ - cookie: string; - - /** - * The screen number to forward X11 connections for. - */ - screen: number; - } - - declare type SocketForwardingConfig = { - socketPath: string; - } - - declare interface Prompt { - prompt: string; - echo?: boolean; - } - - declare type ForwardedTcpip = { - bindAddr: string; - bindPort: number; - remoteAddr: string; - remotePort: number; - } - - declare type ForwardedX11 = { - originAddr: string; - originPort: number; - } - - declare type ForwardedSocket = { - socketPath: string; - } - - declare class SFTPStream extends stream$Transform { - /** - * Creates and returns a new SFTPStream instance. - */ - constructor(remoteIdentRaw: string): void, - - /** - * Creates and returns a new SFTPStream instance. - */ - constructor(cfg?: SFTPStreamConfig, remoteIdentRaw?: string): void, - - /** - * Converts string flags (e.g. `'r'`, `'a+'`, etc.) to the appropriate - * `SFTPStream.OPEN_MODE` flag mask. - * - * Returns `null` if conversion failed. - */ - static stringToFlags(flagsStr: string): number, - - /** - * Converts flag mask (e.g. number containing `SFTPStream.OPEN_MODE` values) to the - * appropriate string value. - * - * Returns `null` if conversion failed. - */ - static flagsToString(flagsMask: number): string, - - /** - * (Client-only) - * Downloads a file at `remotePath` to `localPath` using parallel reads for faster throughput. - */ - fastGet( - remotePath: string, - localPath: string, - options: TransferOptions, - callback: (err: any) => mixed - ): void, - - /** - * (Client-only) - * Downloads a file at `remotePath` to `localPath` using parallel reads for faster throughput. - */ - fastGet( - remotePath: string, - localPath: string, - callback: (err: any) => mixed - ): void, - - /** - * (Client-only) - * Uploads a file from `localPath` to `remotePath` using parallel reads for faster throughput. - */ - fastPut( - localPath: string, - remotePath: string, - options: TransferOptions, - callback: (err: any) => mixed - ): void, - - /** - * (Client-only) - * Uploads a file from `localPath` to `remotePath` using parallel reads for faster throughput. - */ - fastPut( - localPath: string, - remotePath: string, - callback: (err: any) => mixed - ): void, - - /** - * (Client-only) - * Returns a new readable stream for `path`. - */ - createReadStream(path: string, options?: ReadStreamOptions): stream$Readable, - - /** - * (Client-only) - * Returns a new writable stream for `path`. - */ - createWriteStream( - path: string, - options?: WriteStreamOptions - ): stream$Writable, - - /** - * Reads a file - * @param options either the encoding (string) or a bag of options - */ - readFile(path: string, options?: string | ReadFileOptions, callback?: (error: any, data: string | Buffer) => mixed): void; - - /** - * Writes to a file - * @param options either the encoding (string) or a bag of options - */ - writeFile(path: string, data: string | Buffer, options?: string | WriteFileOptions, callback?: (error: any) => mixed): void; - - /** - * Appends to a file - * @param options either the encoding (string) or a bag of options - */ - appendFile(path: string, data: string | Buffer, options?: string | AppendFileOptions, callback?: (error: any) => mixed): void; - - /** - * (Client-only) - * Opens a file `filename` for `mode` with optional `attributes`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - open( - filename: string, - flags: ReadFlags | WriteFlags | AppendFlags, - attributes: InputAttributes, - callback: (err: any, handle: Buffer) => mixed - ): boolean, - - /** - * (Client-only) - * Opens a file `filename` for `mode`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - open( - filename: string, - flags: ReadFlags | WriteFlags | AppendFlags, - callback: (err: any, handle: Buffer) => mixed - ): boolean, - - /** - * (Client-only) - * Closes the resource associated with `handle` given by `open()` or `opendir()`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - close(handle: Buffer, callback: (err: any) => mixed): boolean, - - /** - * (Client-only) - * Reads `length` bytes from the resource associated with `handle` starting at `position` - * and stores the bytes in `buffer` starting at `offset`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - readData( - handle: Buffer, - buffer: Buffer, - offset: number, - length: number, - position: number, - callback: ( - err: any, - bytesRead: number, - buffer: Buffer, - position: number - ) => mixed - ): boolean, - - /** - * (Client-only) - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - writeData( - handle: Buffer, - buffer: Buffer, - offset: number, - length: number, - position: number, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Retrieves attributes for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fstat( - handle: Buffer, - callback: (err: any, stats: Stats) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the attributes defined in `attributes` for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fsetstat( - handle: Buffer, - attributes: InputAttributes, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the access time and modified time for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - futimes( - handle: Buffer, - atime: number | Date, - mtime: number | Date, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the owner for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fchown( - handle: Buffer, - uid: number, - gid: number, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the mode for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fchmod( - handle: Buffer, - mode: number | string, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Opens a directory `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - opendir( - path: string, - callback: (err: any, handle: Buffer) => mixed - ): boolean, - - /** - * (Client-only) - * Retrieves a directory listing. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - readdir( - location: string | Buffer, - callback: (err: any, list: FileEntry[]) => mixed - ): boolean, - - /** - * (Client-only) - * Checks whether the given file or path exists. - */ - exists(path: string, callback: (exists: boolean) => mixed): void, - - /** - * (Client-only) - * Removes the file/symlink at `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - unlink(path: string, callback: (err: any) => mixed): boolean, - - /** - * (Client-only) - * Renames/moves `srcPath` to `destPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - rename( - srcPath: string, - destPath: string, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Creates a new directory `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - mkdir( - path: string, - attributes: InputAttributes, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Creates a new directory `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - mkdir(path: string, callback: (err: any) => mixed): boolean, - - /** - * (Client-only) - * Removes the directory at `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - rmdir(path: string, callback: (err: any) => mixed): boolean, - - /** - * (Client-only) - * Retrieves attributes for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - stat( - path: string, - callback: (err: any, stats: Stats) => mixed - ): boolean, - - /** - * (Client-only) - * Retrieves attributes for `path`. If `path` is a symlink, the link itself is stat'ed - * instead of the resource it refers to. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - lstat( - path: string, - callback: (err: any, stats: Stats) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the attributes defined in `attributes` for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - setstat( - path: string, - attributes: InputAttributes, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the access time and modified time for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - utimes( - path: string, - atime: number | Date, - mtime: number | Date, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the owner for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - chown( - path: string, - uid: number, - gid: number, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Sets the mode for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - chmod( - path: string, - mode: number | string, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Retrieves the target for a symlink at `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - readlink( - path: string, - callback: (err: any, target: string) => mixed - ): boolean, - - /** - * (Client-only) - * Creates a symlink at `linkPath` to `targetPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - symlink( - targetPath: string, - linkPath: string, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only) - * Resolves `path` to an absolute path. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - realpath( - path: string, - callback: (err: any, absPath: string) => mixed - ): boolean, - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX rename(3) from `srcPath` to `destPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_rename( - srcPath: string, - destPath: string, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX statvfs(2) on `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_statvfs( - path: string, - callback: (err: any, fsInfo: any) => mixed - ): boolean, - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX fstatvfs(2) on open handle `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_fstatvfs( - handle: Buffer, - callback: (err: any, fsInfo: any) => mixed - ): boolean, - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX link(2) to create a hard link to `targetPath` at `linkPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_hardlink( - targetPath: string, - linkPath: string, - callback: (err: any) => mixed - ): boolean, - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX fsync(3) on the open handle `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_fsync( - handle: Buffer, - callback: (err: any, fsInfo: any) => mixed - ): boolean, - - /** - * (Server-only) - * Sends a status response for the request identified by `id`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - status(reqID: number, statusCode: number, message?: string): boolean, - - /** - * (Server-only) - * Sends a handle response for the request identified by `id`. - * - * @param handle A handle must be less than 256 bytes and is an opaque value that could - * merely contain the value of a backing file descriptor or some other unique, - * custom value. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - handle(reqID: number, handle: Buffer): boolean, - - /** - * (Server-only) - * Sends a data response for the request identified by `id`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - data(reqID: number, data: string | Buffer, encoding?: string): boolean, - - /** - * (Server-only) - * Sends a name response for the request identified by `id`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - name(reqID: number, names: FileEntry[]): boolean, - - /** - * (Server-only) - * Sends an attrs response for the request identified by `id`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - attrs(reqID: number, attrs: Attributes): boolean, - - /** - * (Client/Server) - * Emitted after initial protocol version check has passed. - */ - on(event: 'ready', listener: () => mixed): this, - - /** - * (Server-only) - * Emitted when the client requests to open a file. - * - * Respond with: - * * `handle()` - This indicates a successful opening of the file and passes the given handle back to the client to use to refer to this open file for future operations (e.g. reading, writing, closing). - * * `status()` - Use this to indicate a failure to open the requested file. - */ - on( - event: 'OPEN', - listener: ( - reqID: number, - filename: string, - flags: number, - attrs: InputAttributes - ) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to read data from a file handle. - * - * Respond with: - * * `data()` - Use this to send the requested chunk of data back to the client. The amount of data sent is allowed to be less than the `length` requested. - * * `status()` - Use this to indicate either end of file (`STATUS_CODE.EOF`) has been reached (`offset` is past the end of the file) or if an error occurred while reading the requested part of the file. - */ - on( - event: 'READ', - listener: ( - reqID: number, - handle: Buffer, - offset: number, - length: number - ) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to write data to a file handle. - * - * Respond with: - * * `status()` - Use this to indicate success/failure of the write to the file. - */ - on( - event: 'WRITE', - listener: ( - reqID: number, - handle: Buffer, - offset: number, - data: Buffer - ) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests attributes for the resource associated with `handle`. - * - * Respond with: - * * `attrs()` - Use this to send the attributes for the requested file/directory back to the client. - * * `status()` - Use this to indicate an error occurred while accessing the file/directory. - */ - on( - event: 'FSTAT', - listener: (reqID: number, handle: Buffer) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to write attributes for the resource associated with `handle`. - * - * Respond with: - * * `status()` - Use this to indicates success/failure of the setting of the given file/directory attributes. - */ - on( - event: 'FSETSTAT', - listener: ( - reqID: number, - handle: Buffer, - attrs: InputAttributes - ) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to close a handle. - * - * Respond with: - * * `status()` - Use this to indicate success (`STATUS_CODE.OK`) or failure of the closing of the file identified by `handle`. - */ - on( - event: 'CLOSE', - listener: (reqID: number, handle: Buffer) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to open a directory. - * - * Respond with: - * * `handle()` - This indicates a successful opening of the directory and passes the given handle back to the client to use to refer to this open directory for future operations (e.g. reading directory contents, closing). - * * `status()` - Use this to indicate a failure to open the requested directory. - */ - on( - event: 'OPENDIR', - listener: (reqID: number, path: string) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to read the contents of a directory. - * - * Respond with: - * * `name()` - Use this to send one or more directory listings for the open directory back to the client. - * * `status()` - Use this to indicate either end of directory contents (`STATUS_CODE.EOF`) or if an error occurred while reading the directory contents. - */ - on( - event: 'READDIR', - listener: (reqID: number, handle: Buffer) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests attributes for a path. If `path` is a symlink, the - * link itself should stat'ed instead of the resource it refers to. - * - * Respond with: - * * `attrs()` - Use this to send the attributes for the requested file/directory back to the client. - * * `status()` - Use this to indicate an error occurred while accessing the file/directory. - */ - on( - event: 'LSTAT', - listener: (reqID: number, path: string) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests attributes for a path. - * - * Respond with: - * * `attrs()` - Use this to send the attributes for the requested file/directory back to the client. - * * `status()` - Use this to indicate an error occurred while accessing the file/directory. - */ - on( - event: 'STAT', - listener: (reqID: number, path: string) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to delete a file or symlink. - * - * Respond with: - * * `status()` - Use this to indicate success/failure of the removal of the file at `path`. - */ - on( - event: 'REMOVE', - listener: (reqID: number, path: string) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to remove a directory. - * - * Respond with: - * * `status()` - Use this to indicate success/failure of the removal of the directory at `path`. - */ - on( - event: 'RMDIR', - listener: (reqID: number, path: string) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests the absolute path for a path. - * - * Respond with: - * * `name()` - Use this to respond with a normalized version of `path`. No file/directory attributes are required to be sent in this response. - * * `status()` - Use this to indicate a failure in normalizing `path`. - */ - on( - event: 'REALPATH', - listener: (reqID: number, path: string) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests the target for a symlink at `path`. - * - * Respond with: - * * `name()` - Use this to respond with the target of the symlink at `path`. No file/directory attributes are required to be sent in this response. - * * `status()` - Use this to indicate a failure in reading the symlink at `path`. - */ - on( - event: 'READLINK', - listener: (reqID: number, path: string) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests to set the attributes defined in `attrs` for `path`. - * - * Respond with: - * * `status()` - Use this to indicates success/failure of the setting of the given file/directory attributes. - */ - on( - event: 'SETSTAT', - listener: ( - reqID: number, - path: string, - attrs: InputAttributes - ) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests a new directory be created. - * - * Respond with: - * * `status()` - Use this to indicate success/failure of the creation of the directory at `path`. - */ - on( - event: 'MKDIR', - listener: ( - reqID: number, - path: string, - attrs: InputAttributes - ) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests a path be renamed. - * - * Respond with: - * * `status()` - Use this to indicate success/failure of the renaming of the file/directory at `oldPath` to `newPath`. - */ - on( - event: 'RENAME', - listener: ( - reqID: number, - oldPath: string, - newPath: string - ) => mixed - ): this, - - /** - * (Server-only) - * Emitted when the client requests a new symlink be created for a path. - * - * Respond with: - * * `status()` - Use this to indicate success/failure of the symlink creation. - */ - on( - event: 'SYMLINK', - listener: ( - reqID: number, - linkPath: string, - targetPath: string - ) => mixed - ): this, - - /** - * Emitted when the socket has disconnected. - */ - on(event: 'end', listener: () => mixed): this, - - /** - * Emitted when the client socket was closed. - */ - on(event: 'close', listener: () => mixed): this, - - /** - * Emitted when more requests/data can be sent to the stream. - */ - on(event: 'continue', listener: () => mixed): this, - - /** - * Emitted when an error occurred. - */ - on(event: 'error', listener: (err: any) => mixed): this, - - on(event: string, listener: Function): this - } - - /** - * Contains the various status codes (for use especially with SFTPStream#status()) - */ - declare var SFTPStream$STATUS_CODE$OK: 0; - declare var SFTPStream$STATUS_CODE$EOF: 1; - declare var SFTPStream$STATUS_CODE$NO_SUCH_FILE: 2; - declare var SFTPStream$STATUS_CODE$PERMISSION_DENIED: 3; - declare var SFTPStream$STATUS_CODE$FAILURE: 4; - declare var SFTPStream$STATUS_CODE$BAD_MESSAGE: 5; - declare var SFTPStream$STATUS_CODE$NO_CONNECTION: 6; - declare var SFTPStream$STATUS_CODE$CONNECTION_LOST: 7; - declare var SFTPStream$STATUS_CODE$OP_UNSUPPORTED: 8; - declare type SFTPStream$STATUS_CODE = - typeof SFTPStream$STATUS_CODE$OK | - typeof SFTPStream$STATUS_CODE$EOF | - typeof SFTPStream$STATUS_CODE$NO_SUCH_FILE | - typeof SFTPStream$STATUS_CODE$PERMISSION_DENIED | - typeof SFTPStream$STATUS_CODE$FAILURE | - typeof SFTPStream$STATUS_CODE$BAD_MESSAGE | - typeof SFTPStream$STATUS_CODE$NO_CONNECTION | - typeof SFTPStream$STATUS_CODE$CONNECTION_LOST | - typeof SFTPStream$STATUS_CODE$OP_UNSUPPORTED; - - /** - * Contains the various open file flags - */ - declare var SFTPStream$OPEN_MODE$READ: 0x00000001; - declare var SFTPStream$OPEN_MODE$WRITE: 0x00000002; - declare var SFTPStream$OPEN_MODE$APPEND: 0x00000004; - declare var SFTPStream$OPEN_MODE$CREAT: 0x00000008; - declare var SFTPStream$OPEN_MODE$TRUNC: 0x00000010; - declare var SFTPStream$OPEN_MODE$EXCL: 0x00000020; - declare type SFTPStream$OPEN_MODE = - typeof SFTPStream$OPEN_MODE$READ | - typeof SFTPStream$OPEN_MODE$WRITE | - typeof SFTPStream$OPEN_MODE$APPEND | - typeof SFTPStream$OPEN_MODE$CREAT | - typeof SFTPStream$OPEN_MODE$TRUNC | - typeof SFTPStream$OPEN_MODE$EXCL; - - declare type SFTPStreamConfig = { - /** - * Set to true to create an instance in server mode. - */ - server?: boolean; - - /** - * This is the highWaterMark to use for the stream. - */ - highWaterMark?: number; - - /** - * Set this to a function that receives a single string argument to get detailed (local) debug information. - */ - debug?: (information: string) => any; - } - - declare type TransferOptions = { - /** - * Number of concurrent reads - */ - concurrency?: number; - - /** - * Size of each read in bytes - */ - chunkSize?: number; - - /** - * Called every time a part of a file was transferred - */ - step?: (total_transferred: number, chunk: number, total: number) => mixed; - } - - declare type ReadStreamOptions = { - flags?: string; - encoding?: string; - handle?: Buffer; - mode?: number; - autoClose?: boolean; - start?: number; - end?: number; - } - - declare type WriteStreamOptions = { - flags?: string; - encoding?: string; - mode?: number; - } - - declare type ReadFlags = 'r' | 'r+'; - declare type WriteFlags = 'w' | 'wx' | 'xw' | 'w+' | 'wx+' | 'xw+'; - declare type AppendFlags = 'a' | 'ax' | 'xa' | 'a+' | 'ax+' | 'xa+'; - - declare type ReadFileOptions = { - flag?: ReadFlags; - encoding?: ?string; - } - - declare type WriteFileOptions = { - flag?: WriteFlags | AppendFlags; - encoding?: ?string; - mode?: number; - } - - declare type AppendFileOptions = { - flag?: WriteFlags; - encoding?: ?string; - mode?: number; - } - - declare type FileEntry = { - filename: string; - longname: string; - attrs: Attributes; - } - - declare type InputAttributes = { - mode?: number | string; - uid?: number; - gid?: number; - size?: number; - atime?: number | Date; - mtime?: number | Date; - } - - declare type Attributes = { - mode: number; - uid: number; - gid: number; - size: number; - atime: number; - mtime: number; - } - - declare type Stats = Attributes & { - isDirectory(): boolean; - isFile(): boolean; - isBlockDevice(): boolean; - isCharacterDevice(): boolean; - isSymbolicLink(): boolean; - isFIFO(): boolean; - isSocket(): boolean; - } - - declare function utils$parseKey(keyData: string | Buffer): ParsedKey | Error; - declare function utils$genPublicKey(privKeyInfo: ParsedKey): ParsedKey; - declare function utils$decryptKey(privKeyInfo: ParsedKey, passphrase: string): void; -} diff --git a/flow-libs/ssh2.js.flow b/flow-libs/ssh2.js.flow deleted file mode 100644 index b88a9552f0..0000000000 --- a/flow-libs/ssh2.js.flow +++ /dev/null @@ -1,1949 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -// Type definitions for ssh2 v0.5.x -// Project: https://github.com/mscdex/ssh2 -// TypeScript Definitions by: Qubo , Ron Buckton - -declare module 'ssh2' { - import type { - Algorithms, - AppendFileOptions, - AppendFlags, - Header, - Prompt, - SFTPStream, - InputAttributes, - Attributes, - Stats, - TransferOptions, - ReadFlags, - ReadFileOptions, - ReadStreamOptions, - WriteFlags, - WriteFileOptions, - WriteStreamOptions, - FileEntry - } from 'ssh2-streams'; - - // TODO(siegebell): made a class to allow returning `this` type, but is possibly an interface - declare class Channel extends stream$Duplex { - /** If `true` only sends `EOF` when `end()` is called. */ - allowHalfOpen: boolean; - /** Standard input for the Channel. */ - +stdin: this; - /** Standard output for the Channel. */ - +stdout: this; - /** Standard error for the Channel. */ - +stderr: stream$Readable | stream$Writable; - /** Indicates whether this is a server or client channel. */ - +server: boolean; - /** The channel type, usually "session". */ - +type: ?string; - /** The channel subtype, usually "exec", "shell", or undefined. */ - +subtype: ?string; - - /** - * Sends EOF to the remote side. - * - * Returns false if you should wait for the continue event before sending any more traffic. - */ - eof(): boolean; - - /** - * Closes the channel on both sides. - * - * Returns false if you should wait for the continue event before sending any more traffic. - */ - close(): boolean; - - /** - * Shuts down the channel on this side. - */ - destroy(): void; - } - - // TODO(siegebell): made a class to allow returning `this` type, but is possibly an interface - declare class ClientChannel extends Channel { - /** Standard error for the Channel. */ - +stderr: stream$Readable; - /** Indicates whether this is a server or client channel. */ - +server: false; - - /** - * Lets the server know that the local terminal window has been resized. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - setWindow(rows: number, cols: number, height: number, width: number): boolean; - - /** - * Sends a POSIX signal to the current process on the server. Valid signal names are: - * 'ABRT', 'ALRM', 'FPE', 'HUP', 'ILL', 'INT', 'KILL', 'PIPE', 'QUIT', 'SEGV', 'TERM', - * 'USR1', and 'USR2'. - * - * Some server implementations may ignore this request if they do not support signals. - * - * Note: If you are trying to send SIGINT and you find `signal()` doesn't work, try writing - * `'\x03'` to the Channel stream instead. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - signal(signalName: string): boolean; - - /** - * Emitted once the channel is completely closed on both the client and the server. - */ - on( - event: 'close', - listener: ( - exitCode: number | null, - exitSignal?: string, - exitDump?: string, - description?: string, - language?: string, - ) => mixed, - ): this; - - /** - * An `exit` event *may* (the SSH2 spec says it is optional) be emitted when the process - * finishes. If the process finished normally, the process's return value is passed to - * the `exit` callback. - */ - on( - event: 'exit', - listener: ( - exitCode: number | null, - signalName?: string, - didCoreDump?: boolean, - description?: string, - language?: string, - ) => mixed, - ): this; - - on(event: string, listener: Function): this; - } - - declare class ServerChannel extends Channel { - /** Standard error for the Channel. */ - +stderr: stream$Writable; - /** Indicates whether this is a server or client channel. */ - +server: true; - - /** - * Sends an exit status code to the client. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - exit(exitCode: number): boolean; - - /** - * Sends an exit signal to the client. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - exit(name: string, coreDumped: boolean, msg: string): boolean; - - /** - * Emitted once the channel is completely closed on both the client and the server. - */ - on(event: 'close', listener: () => mixed): this; - - on(event: string, listener: Function): this; - } - - declare class Client extends events$EventEmitter { - config: Object; - - // Client-events - - /** - * Emitted when a notice was sent by the server upon connection. - */ - on(event: 'banner', listener: (message: string) => mixed): this; - - /** - * Emitted when authentication was successful. - */ - on(event: 'ready', listener: () => mixed): this; - - /** - * Emitted when an incoming forwarded TCP connection is being requested. - * - * Calling `accept()` accepts the connection and returns a `Channel` object. - * Calling `reject()` rejects the connection and no further action is needed. - */ - on( - event: 'tcp connection', - listener: ( - details: TcpConnectionDetails, - accept: () => ClientChannel, - reject: () => mixed - ) => mixed - ): this; - - /** - * Emitted when an incoming X11 connection is being requested. - * - * Calling `accept()` accepts the connection and returns a `Channel` object. - * Calling `reject()` rejects the connection and no further action is needed. - */ - on( - event: 'x11', - listener: ( - details: X11Details, - accept: () => ClientChannel, - reject: () => mixed - ) => mixed - ): this; - - /** - * Emitted when the server is asking for replies to the given `prompts` for keyboard- - * interactive user authentication. - * - * * `name` is generally what you'd use as a window title (for GUI apps). - * * `prompts` is an array of `Prompt` objects. - * - * The answers for all prompts must be provided as an array of strings and passed to - * `finish` when you are ready to continue. - * - * NOTE: It's possible for the server to come back and ask more questions. - */ - on( - event: 'keyboard-interactive', - listener: ( - name: string, - instructions: string, - lang: string, - prompts: Prompt[], - finish: (responses: string[]) => mixed - ) => mixed - ): this; - - /** - * Emitted when the server has requested that the user's password be changed, if using - * password-based user authentication. - * - * Call `done` with the new password. - */ - on( - event: 'change password', - listener: ( - message: string, - lang: string, - done: (password: string) => mixed - ) => mixed - ): this; - - /** - * Emitted when more requests/data can be sent to the server (after a `Client` method - * returned `false`). - */ - on(event: 'continue', listener: () => mixed): this; - - /** - * Emitted when an error occurred. - */ - on( - event: 'error', - listener: (err: Error & ClientErrorExtensions) => mixed - ): this; - - /** - * Emitted when the socket was disconnected. - */ - on(event: 'end', listener: () => mixed): this; - - /** - * Emitted when the socket was closed. - */ - on( - event: 'close', - listener: (hadError: boolean) => mixed - ): this; - - /** - * Emitted when the socket has timed out. - */ - on(event: 'timeout', listener: () => mixed): this; - - /** - * Emitted when the socket has connected. - */ - on(event: 'connect', listener: () => mixed): this; - - /** - * Emitted when the server responds with a greeting message. - */ - on( - event: 'greeting', - listener: (greeting: string) => mixed - ): this; - - on(event: string, listener: Function): this; - - // Client-methods - - /** - * Creates and returns a new Client instance. - */ - constructor(): void; - - /** - * Attempts a connection to a server. - */ - connect(config: ConnectConfig): void; - - /** - * Executes a command on the server. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param command The command to execute. - * @param options Options for the command. - * @param callback The callback to execute when the command has completed. - */ - exec( - command: string, - options?: ExecOptions, - callback: (err: Error, channel: ClientChannel) => mixed - ): boolean; - - /** - * Starts an interactive shell session on the server. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param window Either an object containing containing pseudo-tty settings, `false` to suppress creation of a pseudo-tty. - * @param options Options for the command. - * @param callback The callback to execute when the channel has been created. - */ - shell( - window?: PseudoTtyOptions | false, - options?: ShellOptions, - callback: (err: Error, channel: ClientChannel) => mixed - ): boolean; - - /** - * Bind to `remoteAddr` on `remotePort` on the server and forward incoming TCP connections. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param remoteAddr The remote address to bind on the server. The following lists several special values for `remoteAddr` and their respective bindings: - * - * | address | description - * |:--------------|:----------- - * | `''` | Listen on all protocol families supported by the server - * | `'0.0.0.0'` | Listen on all IPv4 addresses - * | `'::'` | Listen on all IPv6 addresses - * | `'localhost'` | Listen on the loopback interface for all protocol families - * | `'127.0.0.1'` | Listen on the loopback interfaces for IPv4 - * | `'::1'` | Listen on the loopback interfaces for IPv6 - * - * @param remotePort The remote port to bind on the server. If this value is `0`, the actual bound port is provided to `callback`. - * @param callback An optional callback that is invoked when the remote address is bound. - */ - forwardIn( - remoteAddr: string, - remotePort: number, - callback?: (err: Error, bindPort: number) => mixed - ): boolean; - - /** - * Unbind from `remoteAddr` on `remotePort` on the server and stop forwarding incoming TCP - * connections. Until `callback` is called, more connections may still come in. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param remoteAddr The remote address to unbind on the server. - * @param remotePort The remote port to unbind on the server. - * @param callback An optional callback that is invoked when the remote address is unbound. - */ - unforwardIn( - remoteAddr: string, - remotePort: number, - callback?: (err: Error) => mixed - ): boolean; - - /** - * Open a connection with `srcIP` and `srcPort` as the originating address and port and - * `dstIP` and `dstPort` as the remote destination address and port. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param srcIP The originating address. - * @param srcPort The originating port. - * @param dstIP The destination address. - * @param dstPort The destination port. - * @param callback The callback that is invoked when the address is bound. - */ - forwardOut( - srcIP: string, - srcPort: number, - dstIP: string, - dstPort: number, - callback: (err: Error, channel: ClientChannel) => mixed - ): boolean; - - /** - * Starts an SFTP session. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param callback The callback that is invoked when the SFTP session has started. - */ - sftp(callback: (err: Error, sftp: SFTPWrapper) => mixed): boolean; - - /** - * Invokes `subsystem` on the server. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param subsystem The subsystem to start on the server. - * @param callback The callback that is invoked when the subsystem has started. - */ - subsys( - subsystem: string, - callback: (err: Error, channel: ClientChannel) => mixed - ): boolean; - - /** - * Disconnects the socket. - */ - end(): void; - - /** - * Destroys the socket. - */ - destroy(): void; - - /** - * OpenSSH extension that sends a request to reject any new sessions (e.g. exec, shell, - * sftp, subsys) for this connection. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_noMoreSessions(callback?: (err: Error) => mixed): boolean; - - /** - * OpenSSH extension that binds to a UNIX domain socket at `socketPath` on the server and - * forwards incoming connections. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_forwardInStreamLocal( - socketPath: string, - callback?: (err: Error) => mixed - ): boolean; - - /** - * OpenSSH extension that unbinds from a UNIX domain socket at `socketPath` on the server - * and stops forwarding incoming connections. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_unforwardInStreamLocal( - socketPath: string, - callback?: (err: Error) => mixed - ): boolean; - - /** - * OpenSSH extension that opens a connection to a UNIX domain socket at `socketPath` on - * the server. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_forwardOutStreamLocal( - socketPath: string, - callback?: (err: Error, channel: ClientChannel) => mixed - ): boolean; - } - - declare type ConnectConfig = { - /** Hostname or IP address of the server. */ - host?: string; - /** Port number of the server. */ - port?: number; - /** Only connect via resolved IPv4 address for `host`. */ - forceIPv4?: boolean; - /** Only connect via resolved IPv6 address for `host`. */ - forceIPv6?: boolean; - /** The host's key is hashed using this method and passed to `hostVerifier`. */ - hostHash?: 'md5' | 'sha1'; - /** Verifies a hexadecimal hash of the host's key. */ - hostVerifier?: (keyHash: string) => boolean; - /** Username for authentication. */ - username?: string; - /** Password for password-based user authentication. */ - password?: string; - /** Path to ssh-agent's UNIX socket for ssh-agent-based user authentication (or 'pageant' when using Pagent on Windows). */ - agent?: ?string; - /** Buffer or string that contains a private key for either key-based or hostbased user authentication (OpenSSH format). */ - privateKey?: Buffer | string; - /** For an encrypted private key, this is the passphrase used to decrypt it. */ - passphrase?: string; - /** Along with `localUsername` and `privateKey`, set this to a non-empty string for hostbased user authentication. */ - localHostname?: string; - /** Along with `localHostname` and `privateKey`, set this to a non-empty string for hostbased user authentication. */ - localUsername?: string; - /** Try keyboard-interactive user authentication if primary user authentication method fails. */ - tryKeyboard?: boolean; - /** How often (in milliseconds) to send SSH-level keepalive packets to the server. Set to 0 to disable. */ - keepaliveInterval?: number; - /** How many consecutive, unanswered SSH-level keepalive packets that can be sent to the server before disconnection. */ - keepaliveCountMax?: number; - /** * How long (in milliseconds) to wait for the SSH handshake to complete. */ - readyTimeout?: number; - /** Performs a strict server vendor check before sending vendor-specific requests. */ - strictVendor?: boolean; - /** A `ReadableStream` to use for communicating with the server instead of creating and using a new TCP connection (useful for connection hopping). */ - sock?: ReadableStream; - /** Set to `true` to use OpenSSH agent forwarding (`auth-agent@openssh.com`) for the life of the connection. */ - agentForward?: boolean; - /** Explicit overrides for the default transport layer algorithms used for the connection. */ - algorithms?: Algorithms; - /** A function that receives a single string argument to get detailed (local) debug information. */ - debug?: (information: string) => any; - } - - declare type TcpConnectionDetails = { - /** The originating IP of the connection. */ - srcIP: string; - /** The originating port of the connection. */ - srcPort: number; - /** The remote IP the connection was received on (given in earlier call to `forwardIn()`). */ - destIP: string; - /** The remote port the connection was received on (given in earlier call to `forwardIn()`). */ - destPort: number; - } - - declare type X11Details = { - /** The originating IP of the connection. */ - srcIP: string; - /** The originating port of the connection. */ - srcPort: number; - } - - declare type ClientErrorExtensions = { - /** Indicates 'client-socket' for socket-level errors and 'client-ssh' for SSH disconnection messages. */ - level?: string; - /** Additional detail for 'client-ssh' messages. */ - description?: string; - } - - declare type ExecOptions = { - /** An environment to use for the execution of the command. */ - env?: any; - /** Set to `true` to allocate a pseudo-tty with defaults, or an object containing specific pseudo-tty settings. */ - pty?: true | PseudoTtyOptions; - /** Set either to `true` to use defaults, a number to specify a specific screen number, or an object containing x11 settings. */ - x11?: boolean | number | X11Options; - } - - declare type ShellOptions = { - /** Set either to `true` to use defaults, a number to specify a specific screen number, or an object containing x11 settings. */ - x11?: boolean | number | X11Options; - } - - declare type X11Options = { - /** Whether to allow just a single connection (default: `false`).*/ - single?: boolean; - /** The Screen number to use (default: `0`). */ - screen?: number; - } - - declare type PseudoTtyOptions = { - /** The number of rows (default: `24`). */ - rows?: number; - /** The number of columns (default: `80`). */ - cols?: number; - /** The height in pixels (default: `480`). */ - height?: number; - /** The width in pixels (default: `640`). */ - width?: number; - /** The value to use for $TERM (default: `'vt100'`) */ - term?: string; - } - - declare class Server extends events$EventEmitter { - static KEEPALIVE_INTERVAL: number; - static KEEPALIVE_CLIENT_INTERVAL: number; - static KEEPALIVE_CLIENT_COUNT_MAX: number; - - // Server events - - /** - * Emitted when a new client has connected. - */ - on( - event: 'connection', - listener: (client: Connection, info: ClientInfo) => mixed - ): this; - - /** - * Emitted when an error occurs. - */ - on(event: 'error', listener: (err: Error) => mixed): this; - - /** - * Emitted when the server has been bound after calling `server.listen()`. - */ - on(event: 'listening', listener: () => mixed): this; - - /** - * Emitted when the server closes. Note that if connections exist, this event is not emitted until all connections are ended. - */ - on(event: 'close', listener: () => mixed): this; - - on(event: string, listener: Function): this; - - // Server methods - - /** - * Creates and returns a new Server instance. - * - * @param config Server configuration properties. - * @param connectionListener if supplied, is added as a connection listener. - */ - constructor( - config: ServerConfig, - connectionListener?: (client: Connection, info: ClientInfo) => mixed - ): void; - - /** - * Creates and returns a new Server instance. - * - * @param config Server configuration properties. - * @param connectionListener if supplied, is added as a connection listener. - */ - static createServer( - config: ServerConfig, - connectionListener?: (client: Connection, info: ClientInfo) => mixed - ): Server; - - /** - * Start a local socket server listening for connections on the given `path`. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param path A UNIX domain socket path. - * @param backlog The maximum length of the queue of pending connections. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen( - path: string, - backlog?: number, - callback?: () => mixed - ): this; - - /** - * Start a local socket server listening for connections on the given `path`. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param path A UNIX domain socket path. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen(path: string, callback?: () => mixed): this; - - /** - * This will cause the server to accept connections on the specified handle, but it is - * presumed that the file descriptor or handle has already been bound to a port or domain - * socket. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param handle Either a server or socket (anything with an underlying `_handle` member), or an `{fd: number}` object. - * @param backlog The maximum length of the queue of pending connections. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen( - handle: net$Server | net$Socket | { fd: number }, - backlog?: number, - callback?: () => mixed - ): this; - - /** - * This will cause the server to accept connections on the specified handle, but it is - * presumed that the file descriptor or handle has already been bound to a port or domain - * socket. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param handle Either a server or socket (anything with an underlying `_handle` member), or an `{fd: number}` object. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen( - handle: net$Server | net$Socket | { fd: number }, - callback?: () => mixed - ): this; - - /** - * This will cause the server to accept connections using the specified options. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param options Connection options. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen( - options: net$ListenOptions, - callback?: () => mixed - ): this; - - /** - * Begin accepting connections on the specified port and hostname. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param port The port on which to start listening. If this value is `undefined` or `0`, - * the operating system will define a random port which can be retrieved later - * using `server.address().port`. - * @param hostname The hostname to bind. If `hostname` is omitted, the server will accept - * conections on any IPv6 address (`::`) when IPv6 is available, or any IPv4 - * address (`0.0.0.0`) otherwise. - * @param backlog The maximum length of the queue of pending connections. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen( - port: number, - hostname?: string, - backlog?: number, - callback?: () => mixed - ): this; - - /** - * Begin accepting connections on the specified port and hostname. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param port The port on which to start listening. If this value is `undefined` or `0`, - * the operating system will define a random port which can be retrieved later - * using `server.address().port`. - * @param hostname The hostname to bind. If `hostname` is omitted, the server will accept - * conections on any IPv6 address (`::`) when IPv6 is available, or any IPv4 - * address (`0.0.0.0`) otherwise. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen( - port: number, - hostname?: string, - callback?: () => mixed - ): this; - - /** - * Begin accepting connections on the specified port. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param port The port on which to start listening. If this value is `undefined` or `0`, - * the operating system will define a random port which can be retrieved later - * using `server.address().port`. - * @param backlog The maximum length of the queue of pending connections. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen( - port: number, - backlog?: number, - callback?: () => mixed - ): this; - - /** - * Begin accepting connections on the specified port. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param port The port on which to start listening. If this value is `undefined` or `0`, - * the operating system will define a random port which can be retrieved later - * using `server.address().port`. - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen(port: number, callback?: () => mixed): this; - - /** - * Begin accepting connections on a random port. - * - * This function is asynchronous. When the server has been bound, `listening` event will be emitted. - * - * @param callback An optional callback to add to the `listening` event of the server. - */ - listen(callback?: () => mixed): this; - - /** - * Returns the bound address, the address family name, and port of the server as reported - * by the operating system. - */ - address(): { port: number; family: string; address: string; }; - - /** - * Asynchronously get the number of concurrent connections on the server. - */ - getConnections( - callback: (err: Error, count: number) => mixed - ): void; - - /** - * Stops the server from accepting new connections and keeps existing connections. This - * function is asynchronous, the server is finally closed when all connections are ended - * and the server emits a 'close' event. - * - * @param callback Optional callback that will be called once the `close` event occurs. - * Unlike that event, it will be called with an `Error` as its only argument if the - * server was not open when it was closed. - */ - close(callback?: (err: Error) => mixed): this; - - /** - * Opposite of `unref`, calling `ref` on a previously unrefd server will not let the - * program exit if it's the only server left (the default behavior). If the server is - * refd calling `ref` again will have no effect. - */ - ref(): void; - - /** - * Calling `unref` on a server will allow the program to exit if this is the only active - * server in the event system. If the server is already unrefd calling `unref` again - * will have no effect. - */ - unref(): void; - } - - declare type ServerConfig = { - /** An array of host private keys. */ - hostKeys: (Buffer | string | EncryptedPrivateKey)[]; - /** Explicit overrides for the default transport layer algorithms used for the connection. */ - algorithms?: Algorithms; - /** A message that is sent to clients immediately upon connection, before handshaking begins. */ - banner?: string; - /** A custom server software name/version identifier. */ - ident?: string; - /** This is the highWaterMark to use for the parser stream (default: `32 * 1024`). */ - highWaterMark?: number; - /** This is the maximum packet size that will be accepted. It should be 35000 bytes or larger to be compatible with other SSH2 implementations. */ - maxPacketSize?: number; - /** A function that receives a single string argument to get detailed (local) debug information. */ - debug?: (information: string) => any; - } - - declare type EncryptedPrivateKey = { - /** A Buffer or string that contains a private key. */ - key: Buffer | string; - /** The passphrase to decrypt a private key. */ - passphrase?: string; - } - - declare type ClientInfo = { - /** The remote address of the connection. */ - ip: string; - /** Information about the client. */ - header: Header; - } - - // TODO(siegebell): made a class to allow returning `this` type, but is possibly an interface - declare class Connection extends events$EventEmitter { - // Connection events - - /** - * Emitted when the client has requested authentication. - */ - on(event: 'authentication', - listener: (authCtx: AuthContext) => mixed): this; - - /** - * Emitted when the client has been successfully authenticated. - */ - on(event: 'ready', listener: () => mixed): this; - - /** - * Emitted when the client has requested a new session. - * Sessions are used to start interactive shells, execute commands, request X11 forwarding, etc. - */ - on(event: 'session', - listener: (accept: () => Session, - reject: () => boolean) => mixed): this; - - /** - * Emitted when the client has requested an outbound (TCP) connection. - */ - on(event: 'tcpip', - listener: (accept: () => ServerChannel, - reject: () => boolean, - info: TcpipRequestInfo) => mixed): this; - - /** - * Emitted when the client has requested a connection to a UNIX domain socket. - */ - on( - event: 'openssh.streamlocal', - listener: ( - accept: () => ServerChannel, - reject: () => boolean, - info: SocketRequestInfo - ) => mixed - ): this; - - /** - * Emitted when the client has sent a global request for name. - * If info.bindPort === 0, you should pass the chosen port to accept so that the client will know what port was bound. - */ - on( - event: 'request', - listener: ( - accept: (chosenPort?: number) => mixed, - reject: () => mixed, - name: 'tcpip-forward' | 'cancel-tcpip-forward', - info: TcpipBindInfo - ) => mixed - ): this; - - /** - * Emitted when the client has sent a global request for name. - */ - on( - event: 'request', - listener: ( - accept: () => mixed, - reject: () => mixed, - name: 'streamlocal-forward@openssh.com' | 'cancel-streamlocal-forward@openssh.com', - info: SocketBindInfo - ) => mixed - ): this; - - /** - * Emitted when the client has sent a global request for name. - * If info.bindPort === 0, you should pass the chosen port to accept so that the client will know what port was bound. - */ - on( - event: 'request', - listener: ( - accept: (chosenPort?: number) => mixed, - reject: () => mixed, - name: string, - info: TcpipBindInfo | SocketBindInfo - ) => mixed - ): this; - - /** - * Emitted when the client has finished rekeying (either client or server initiated). - */ - on(event: 'rekey', listener: () => mixed): this; - - /** - * Emitted when more requests/data can be sent to the client (after a Connection method returned false). - */ - on(event: 'continue', listener: () => mixed): this; - - /** - * Emitted when an error occurrs. - */ - on(event: 'error', listener: (err: Error) => mixed): this; - - /** - * Emitted when the socket has disconnected. - */ - on(event: 'end', listener: () => mixed): this; - - /** - * Emitted when the client socket was closed. - */ - on(event: 'close', listener: (hadError: boolean) => mixed): this; - - on(event: string, listener: Function): this; - - noMoreSessions: boolean; - authenticated: boolean; - - // Connection methods - - /** - * Closes the client connection. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - end(): boolean; - - /** - * Alert the client of an incoming X11 client connection from `originAddr` on port `originPort`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - x11( - originAddr: string, - originPort: number, - callback: (err: Error, channel: ServerChannel) => mixed - ): boolean; - - /** - * Alert the client of an incoming TCP connection on `boundAddr` on port `boundPort` from - * `remoteAddr` on port `remotePort`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - forwardOut( - boundAddr: string, - boundPort: number, - remoteAddr: string, - remotePort: number, - callback: (err: Error, channel: ServerChannel) => mixed - ): boolean; - - /** - * Initiates a rekeying with the client. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - * - * @param callback An optional callback added as a one-time handler for the `rekey` event. - */ - rekey(callback?: (err: Error) => mixed): boolean; - - /** - * Alert the client of an incoming UNIX domain socket connection on socketPath. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - openssh_forwardOutStreamLocal( - socketPath: string, - callback: (err: Error, channel: ServerChannel) => mixed - ): boolean; - } - - // TODO(siegebell): made a class to allow returning `this` type, but is possibly an interface - declare class AuthContextBase extends events$EventEmitter { - /** The client's username. */ - username: string; - /** The service requesting authentication. */ - service: string; - /** The method of authentication. */ - +method: string; - - /** - * Accepts the authentication request. - */ - accept(): void; - - /** - * Rejects the authentication request. - */ - reject(): void; - - /** - * Rejects the authentication request. - */ - reject(isPartialSuccess: boolean): void; - - /** - * Rejects the authentication request. - */ - reject(authMethodsLeft?: string[], isPartialSuccess?: boolean): void; - - /** - * Emitted when the client aborts the authentication request. - */ - on(event: 'abort', listener: (err: Error) => mixed): this; - - on(event: string, listener: Function): this; - } - - declare interface KeyboardAuthContext extends AuthContextBase { - /** The method of authentication. */ - +method: 'keyboard-interactive'; - - /** A list of preferred authentication "sub-methods" sent by the client. */ - submethods: string[]; - - /** - * Send prompts to the client. - * @param prompts The prompts to send to the client. - * @param callback A callback to call with the responses from the client. - */ - prompt( - prompts: string | Prompt | (string | Prompt)[], - callback: () => mixed - ): void; - - /** - * Send prompts to the client. - * @param prompts The prompts to send to the client. - * @param title The title for the prompt. - * @param callback A callback to call with the responses from the client. - */ - prompt( - prompts: string | Prompt | (string | Prompt)[], - title: string, - callback: () => mixed - ): void; - - /** - * Send prompts to the client. - * @param prompts The prompts to send to the client. - * @param title The title for the prompt. - * @param instructions Instructions for the client. - * @param callback A callback to call with the responses from the client. - */ - prompt( - prompts: string | Prompt | (string | Prompt)[], - title: string, - instructions: string, - callback: () => mixed - ): void; - } - - declare interface PublicKeyAuthContext extends AuthContextBase { - /** The method of authentication. */ - +method: 'publickey'; - /** The public key sent by the client. */ - key: PublicKey; - /** The signature to verify, or `undefined` if the client is only checking the validity of the key. */ - signature: ?Buffer; - /** The signature algorithm, or `undefined` if the client is only checking the validity of the key. */ - sigAlgo: ?string; - /** The data used to verify the key, or `undefined` if the client is only checking the validity of the key. */ - blob: ?Buffer; - } - - declare type PublicKey = { - /** The name of the key algorithm. */ - algo: string; - /** The actual key data. */ - data: Buffer; - } - - declare interface HostbasedAuthContext extends AuthContextBase { - /** The method of authentication. */ - +method: 'hostbased'; - /** The public key sent by the client. */ - key: PublicKey; - /** The signature to verify, or `undefined` if the client is only checking the validity of the key. */ - signature: ?Buffer; - /** The signature algorithm, or `undefined` if the client is only checking the validity of the key. */ - sigAlgo: ?string; - /** The data used to verify the key, or `undefined` if the client is only checking the validity of the key. */ - blob: ?Buffer; - /** The local hostname of the client. */ - localHostname: string; - /** The local username of the client. */ - localUsername: string; - } - - declare interface PasswordAuthContext extends AuthContextBase { - /** The method of authentication. */ - +method: 'password'; - /** The password sent by the client. */ - password: string; - } - - declare interface NoneAuthContext extends AuthContextBase { - /** The method of authentication. */ - +method: 'none'; - } - - declare type AuthContext = KeyboardAuthContext | - PublicKeyAuthContext | - HostbasedAuthContext | - PasswordAuthContext | - NoneAuthContext; - - declare type TcpipRequestInfo = { - /** Source IP address of outgoing connection. */ - srcIP: string; - /** Source port of outgoing connection. */ - srcPort: number; - /** Destination IP address of outgoing connection. */ - destIP: string; - /** Destination port of outgoing connection. */ - destPort: number; - } - - declare type SocketRequestInfo = { - /** Destination socket path of outgoing connection. */ - socketPath: string; - } - - declare type TcpipBindInfo = { - /** The IP address to start/stop binding to. */ - bindAddr: string; - /** The port to start/stop binding to. */ - bindPort: number; - } - - declare type SocketBindInfo = { - /** The socket path to start/stop binding to. */ - socketPath: string; - } - - // TODO(siegebell): made a class to allow returning `this` type, but is possibly an interface - declare class Session extends events$EventEmitter { - // Session events - - /** - * Emitted when the client requested allocation of a pseudo-TTY for this session. - */ - on( - event: 'pty', - listener: ( - accept: () => boolean, - reject: () => boolean, - info: PseudoTtyInfo - ) => mixed - ): this; - - /** - * Emitted when the client reported a change in window dimensions during this session. - */ - on( - event: 'window-change', - listener: (accept: () => boolean, reject: () => boolean, info: WindowChangeInfo) => mixed - ): this; - - /** - * Emitted when the client requested X11 forwarding. - */ - on( - event: 'x11', - listener: ( - accept: () => boolean, - reject: () => boolean, - info: X11Info - ) => mixed - ): this; - - /** - * Emitted when the client requested an environment variable to be set for this session. - */ - on( - event: 'env', - listener: ( - accept: () => boolean, - reject: () => boolean, - info: SetEnvInfo - ) => mixed - ): this; - - /** - * Emitted when the client has sent a POSIX signal. - */ - on( - event: 'signal', - listener: ( - accept: () => boolean, - reject: () => boolean, - info: SignalInfo - ) => mixed - ): this; - - /** - * Emitted when the client has requested incoming ssh-agent requests be forwarded to them. - */ - on( - event: 'auth-agent', - listener: ( - accept: () => boolean, - reject: () => boolean - ) => mixed - ): this; - - /** - * Emitted when the client has requested an interactive shell. - */ - on( - event: 'shell', - listener: ( - accept: () => ServerChannel, - reject: () => boolean - ) => mixed - ): this; - - /** - * Emitted when the client has requested execution of a command string. - */ - on( - event: 'exec', - listener: ( - accept: () => ServerChannel, - reject: () => boolean, - info: ExecInfo - ) => mixed - ): this; - - /** - * Emitted when the client has requested the SFTP subsystem. - */ - on( - event: 'sftp', - listener: ( - accept: () => SFTPStream, - reject: () => boolean - ) => mixed - ): this; - - /** - * Emitted when the client has requested an arbitrary subsystem. - */ - on( - event: 'subsystem', - listener: ( - accept: () => ServerChannel, - reject: () => boolean, - info: SubsystemInfo - ) => mixed - ): this; - - /** - * Emitted when the session has closed. - */ - on(event: 'close', listener: () => mixed): this; - - on(event: string, listener: Function): this; - } - - declare type PseudoTtyInfo = { - /** The number of columns for the pseudo-TTY. */ - cols: number; - /** The number of rows for the pseudo-TTY. */ - rows: number; - /** The width of the pseudo-TTY in pixels. */ - width: number; - /** The height of the pseudo-TTY in pixels. */ - height: number; - /** Contains the requested terminal modes of the pseudo-TTY. */ - modes: TerminalModes; - } - - declare type TerminalModes = { - [mode: string]: ?number; - /** Interrupt character; `255` if none. Not all of these characters are supported on all systems. */ - VINTR?: number; - /** The quit character (sends `SIGQUIT` signal on POSIX systems). */ - VQUIT?: number; - /** Erase the character to left of the cursor. */ - VERASE?: number; - /** Kill the current input line. */ - VKILL?: number; - /** End-of-file character (sends `EOF` from the terminal). */ - VEOF?: number; - /** End-of-line character in addition to carriage return and/or linefeed. */ - VEOL?: number; - /** Additional end-of-line character. */ - VEOL2?: number; - /** Continues paused output (normally control-Q). */ - VSTART?: number; - /** Pauses output (normally control-S). */ - VSTOP?: number; - /** Suspends the current program. */ - VSUSP?: number; - /** Another suspend character. */ - VDSUSP?: number; - /** Reprints the current input line. */ - VREPRINT?: number; - /** Erases a word left of cursor. */ - VWERASE?: number; - /** Enter the next character typed literally, even if it is a special character */ - VLNEXT?: number; - /** Character to flush output. */ - VFLUSH?: number; - /** Switch to a different shell layer. */ - VSWTCH?: number; - /** Prints system status line (load, command, pid, etc). */ - VSTATUS?: number; - /** Toggles the flushing of terminal output. */ - VDISCARD?: number; - /** The ignore parity flag. The parameter SHOULD be `0` if this flag is FALSE, and `1` if it is TRUE. */ - IGNPAR?: 0 | 1; - /** Mark parity and framing errors. */ - PARMRK?: 0 | 1; - /** Enable checking of parity errors. */ - INPCK?: 0 | 1; - /** Strip 8th bit off characters. */ - ISTRIP?: 0 | 1; - /** Map NL into CR on input. */ - INLCR?: 0 | 1; - /** Ignore CR on input. */ - IGNCR?: 0 | 1; - /** Map CR to NL on input. */ - ICRNL?: 0 | 1; - /** Translate uppercase characters to lowercase. */ - IUCLC?: 0 | 1; - /** Enable output flow control. */ - IXON?: 0 | 1; - /** Any char will restart after stop. */ - IXANY?: 0 | 1; - /** Enable input flow control. */ - IXOFF?: 0 | 1; - /** Ring bell on input queue full. */ - IMAXBEL?: 0 | 1; - /** Enable signals INTR, QUIT, [D]SUSP. */ - ISIG?: 0 | 1; - /** Canonicalize input lines. */ - ICANON?: 0 | 1; - /** Enable input and output of uppercase characters by preceding their lowercase equivalents with `\`. */ - XCASE?: 0 | 1; - /** Enable echoing. */ - ECHO?: 0 | 1; - /** Visually erase chars. */ - ECHOE?: 0 | 1; - /** Kill character discards current line. */ - ECHOK?: 0 | 1; - /** Echo NL even if ECHO is off. */ - ECHONL?: 0 | 1; - /** Don't flush after interrupt. */ - NOFLSH?: 0 | 1; - /** Stop background jobs from output. */ - TOSTOP?: 0 | 1; - /** Enable extensions. */ - IEXTEN?: 0 | 1; - /** Echo control characters as ^(Char). */ - ECHOCTL?: 0 | 1; - /** Visual erase for line kill. */ - ECHOKE?: 0 | 1; - /** Retype pending input. */ - PENDIN?: 0 | 1; - /** Enable output processing. */ - OPOST?: 0 | 1; - /** Convert lowercase to uppercase. */ - OLCUC?: 0 | 1; - /** Map NL to CR-NL. */ - ONLCR?: 0 | 1; - /** Translate carriage return to newline (output). */ - OCRNL?: 0 | 1; - /** Translate newline to carriage return-newline (output). */ - ONOCR?: 0 | 1; - /** Newline performs a carriage return (output). */ - ONLRET?: 0 | 1; - /** 7 bit mode. */ - CS7?: 0 | 1; - /** 8 bit mode. */ - CS8?: 0 | 1; - /** Parity enable. */ - PARENB?: 0 | 1; - /** Odd parity, else even. */ - PARODD?: 0 | 1; - /** Specifies the input baud rate in bits per second. */ - TTY_OP_ISPEED?: number; - /** Specifies the output baud rate in bits per second. */ - TTY_OP_OSPEED?: number; - } - - declare type WindowChangeInfo = { - /** The number of columns for the pseudo-TTY. */ - cols: number; - /** The number of rows for the pseudo-TTY. */ - rows: number; - /** The width of the pseudo-TTY in pixels. */ - width: number; - /** The height of the pseudo-TTY in pixels. */ - height: number; - } - - declare type X11Info = { - /** true if only a single connection should be forwarded. */ - single: boolean; - /** The name of the X11 authentication method used. */ - protocol: string; - /** The X11 authentication cookie encoded in hexadecimal. */ - cookie: string; - /** The screen number for which to forward X11 connections. */ - screen: number; - } - - declare type SetEnvInfo = { - /** The environment variable's name. */ - key: string; - /** The environment variable's value. */ - value: string; - } - - declare type SignalInfo = { - /** The signal name (e.g. SIGUSR1). */ - name: string; - } - - declare type ExecInfo = { - /** The command line to be executed. */ - command: string; - } - - declare type SubsystemInfo = { - /** The name of the subsystem. */ - name: string; - } - - // TODO(siegebell): made a class to allow returning `this` type, but is possibly an interface - declare class SFTPWrapper extends events$EventEmitter { - /** - * (Client-only) - * Downloads a file at `remotePath` to `localPath` using parallel reads for faster throughput. - */ - fastGet( - remotePath: string, - localPath: string, - options: TransferOptions, - callback: (err: any) => mixed - ): void; - - /** - * (Client-only) - * Downloads a file at `remotePath` to `localPath` using parallel reads for faster throughput. - */ - fastGet( - remotePath: string, - localPath: string, - callback: (err: any) => mixed - ): void; - - /** - * (Client-only) - * Uploads a file from `localPath` to `remotePath` using parallel reads for faster throughput. - */ - fastPut( - localPath: string, - remotePath: string, - options: TransferOptions, - callback: (err: any) => mixed - ): void; - - /** - * (Client-only) - * Uploads a file from `localPath` to `remotePath` using parallel reads for faster throughput. - */ - fastPut( - localPath: string, - remotePath: string, - callback: (err: any) => mixed - ): void; - - /** - * (Client-only) - * Returns a new readable stream for `path`. - */ - createReadStream(path: string, options?: ReadStreamOptions): stream$Readable; - - /** - * (Client-only) - * Returns a new writable stream for `path`. - */ - createWriteStream( - path: string, - options?: WriteStreamOptions - ): stream$Writable; - - /** - * (Client-only) - * Opens a file `filename` for `mode` with optional `attributes`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - open( - filename: string, - mode: string, - attributes: InputAttributes, - callback: (err: any, handle: Buffer) => mixed - ): boolean; - - /** - * (Client-only) - * Opens a file `filename` for `mode`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - open( - filename: string, - mode: string, - callback: (err: any, handle: Buffer) => mixed - ): boolean; - - /** - * (Client-only) - * Closes the resource associated with `handle` given by `open()` or `opendir()`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - close(handle: Buffer, callback: (err: any) => mixed): boolean; - - /** - * (Client-only) - * Reads `length` bytes from the resource associated with `handle` starting at `position` - * and stores the bytes in `buffer` starting at `offset`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - read( - handle: Buffer, - buffer: Buffer, - offset: number, - length: number, - position: number, - callback: ( - err: any, - bytesRead: number, - buffer: Buffer, - position: number - ) => mixed - ): boolean; - - /** - * (Client-only) - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - write( - handle: Buffer, - buffer: Buffer, - offset: number, - length: number, - position: number, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Retrieves attributes for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fstat( - handle: Buffer, - callback: (err: any, stats: Stats) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the attributes defined in `attributes` for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fsetstat( - handle: Buffer, - attributes: InputAttributes, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the access time and modified time for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - futimes( - handle: Buffer, - atime: number | Date, - mtime: number | Date, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the owner for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fchown( - handle: Buffer, - uid: number, - gid: number, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the mode for the resource associated with `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - fchmod( - handle: Buffer, - mode: number | string, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Opens a directory `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - opendir( - path: string, - callback: (err: any, handle: Buffer) => mixed - ): boolean; - - /** - * (Client-only) - * Retrieves a directory listing. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - readdir( - location: string | Buffer, - callback: (err: any, list: FileEntry[]) => mixed - ): boolean; - - /** - * Reads a file - * @param options either the encoding (string) or a bag of options - */ - readFile(path: string, options?: string | ReadFileOptions, callback?: (error: any, data: string | Buffer) => mixed): void; - - /** - * Writes to a file - * @param options either the encoding (string) or a bag of options - */ - writeFile(path: string, data: string | Buffer, options?: string | WriteFileOptions, callback?: (error: any) => mixed): void; - - /** - * Appends to a file - * @param options either the encoding (string) or a bag of options - */ - appendFile(path: string, data: string | Buffer, options?: string | AppendFileOptions, callback?: (error: any) => mixed): void; - - /** - * (Client-only) - * Checks whether the given file or path exists. - */ - exists(path: string, callback: (exists: boolean) => mixed): void; - - /** - * (Client-only) - * Removes the file/symlink at `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - unlink(path: string, callback: (err: any) => mixed): boolean; - - /** - * (Client-only) - * Renames/moves `srcPath` to `destPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - rename( - srcPath: string, - destPath: string, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Creates a new directory `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - mkdir( - path: string, - attributes: InputAttributes, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Creates a new directory `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - mkdir(path: string, callback: (err: any) => mixed): boolean; - - /** - * (Client-only) - * Removes the directory at `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - rmdir(path: string, callback: (err: any) => mixed): boolean; - - /** - * (Client-only) - * Retrieves attributes for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - stat( - path: string, - callback: (err: any, stats: Stats) => mixed - ): boolean; - - /** - * (Client-only) - * Retrieves attributes for `path`. If `path` is a symlink, the link itself is stat'ed - * instead of the resource it refers to. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - lstat( - path: string, - callback: (err: any, stats: Stats) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the attributes defined in `attributes` for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - setstat( - path: string, - attributes: InputAttributes, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the access time and modified time for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - utimes( - path: string, - atime: number | Date, - mtime: number | Date, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the owner for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - chown( - path: string, - uid: number, - gid: number, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Sets the mode for `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - chmod( - path: string, - mode: number | string, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Retrieves the target for a symlink at `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - readlink( - path: string, - callback: (err: any, target: string) => mixed - ): boolean; - - /** - * (Client-only) - * Creates a symlink at `linkPath` to `targetPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - symlink( - targetPath: string, - linkPath: string, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only) - * Resolves `path` to an absolute path. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - realpath( - path: string, - callback: (err: any, absPath: string) => mixed - ): boolean; - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX rename(3) from `srcPath` to `destPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_rename( - srcPath: string, - destPath: string, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX statvfs(2) on `path`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_statvfs( - path: string, - callback: (err: any, fsInfo: any) => mixed - ): boolean; - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX fstatvfs(2) on open handle `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_fstatvfs( - handle: Buffer, - callback: (err: any, fsInfo: any) => mixed - ): boolean; - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX link(2) to create a hard link to `targetPath` at `linkPath`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_hardlink( - targetPath: string, - linkPath: string, - callback: (err: any) => mixed - ): boolean; - - /** - * (Client-only, OpenSSH extension) - * Performs POSIX fsync(3) on the open handle `handle`. - * - * Returns `false` if you should wait for the `continue` event before sending any more traffic. - */ - ext_openssh_fsync( - handle: Buffer, - callback: (err: any, fsInfo: any) => mixed - ): boolean; - - /** - * Ends the stream. - */ - end(): void; - - /** - * Emitted when an error occurred. - */ - on(event: 'error', listener: (err: any) => mixed): this; - - /** - * Emitted when the session has ended. - */ - on(event: 'end', listener: () => mixed): this; - - /** - * Emitted when the session has closed. - */ - on(event: 'close', listener: () => mixed): this; - - /** - * Emitted when more requests/data can be sent to the stream. - */ - on(event: 'continue', listener: () => mixed): this; - - on(event: string, listener: Function): this; - } -} diff --git a/flow-libs/suda-toolbar.js.flow b/flow-libs/suda-toolbar.js.flow deleted file mode 100644 index 8f47ce4079..0000000000 --- a/flow-libs/suda-toolbar.js.flow +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -type toolbar$Callback = string | (() => void); - -type toolbar$ButtonSpec = { - priority?: number, - tooltip?: string, - iconset?: string, - icon?: string, - callback?: toolbar$Callback | {[string]: toolbar$Callback}, -} - -type toolbar$ToolbarManager = { - addButton(options: toolbar$ButtonSpec): toolbar$ToolbarButtonView, - addSpacer(options: { - priority?: number, - }): toolbar$ToolbarButtonView, - removeItems(): void, - onDidDestroy(callback: () => void): IDisposable, -}; - -type toolbar$ToolbarButtonView = { - setEnabled(enabled: boolean): void, - destroy(): void, - element: HTMLElement, -}; - -type toolbar$GetToolbar = (group: string) => toolbar$ToolbarManager; diff --git a/flow-libs/uuid.js.flow b/flow-libs/uuid.js.flow deleted file mode 100644 index 968d8ce83f..0000000000 --- a/flow-libs/uuid.js.flow +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - */ - -/** - * The `uuid` generates RFC-compliant UUIDs in JavaScript. It has a more - * extensive API than the one defined here, but this all we use from it. - * - * {@link https://github.com/broofa/node-uuid} - */ -declare module 'uuid' { - declare function v4(): string; -} diff --git a/flow-libs/vscode-debugprotocol.js.flow b/flow-libs/vscode-debugprotocol.js.flow deleted file mode 100644 index 3c93b064b6..0000000000 --- a/flow-libs/vscode-debugprotocol.js.flow +++ /dev/null @@ -1,1539 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -// Ported from https://github.com/Microsoft/vscode-debugadapter-node/blob/master/protocol/src/debugProtocol.ts - -declare module 'vscode-debugprotocol' { - declare interface base$ProtocolMessage { - /** Sequence number. */ - seq: number; - /** One of 'request', 'response', or 'event'. */ - +type: 'request' | 'response' | 'event'; - } - - declare type ProtocolMessage = Request | Event | Response; - - declare interface base$Request extends base$ProtocolMessage { - type: 'request'; - /** The command to execute. */ - +command: string; - /** Object containing arguments for the command. */ - +arguments?: any; - } - - /** Server-initiated event. */ - declare interface DebugEvent extends base$ProtocolMessage { - type: 'event'; - /** Type of event. */ - +event: string; - /** Event-specific information. */ - +body?: any; - } - - /** Response to a request. */ - declare interface base$Response extends base$ProtocolMessage { - type: 'response'; - /** Sequence number of the corresponding request. */ - request_seq: number; - /** Outcome of the request. */ - success: boolean; - /** The command requested. */ - command: string; - /** Contains error message if success == false. */ - message?: string; - /** Contains request result if success is true and optional error details if success is false. */ - +body?: any; - } - - declare interface InitializedEvent extends DebugEvent { - event: 'initialized'; - } - - declare interface StoppedEvent extends DebugEvent { - event: 'stopped'; - body: { - /** The reason for the event (such as: 'step', 'breakpoint', 'exception', 'pause', 'entry'). - For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it must not be translated). - */ - reason: string, - /** The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is. */ - description?: string, - /** The thread which was stopped. */ - threadId?: number, - /** Additional information. E.g. if reason is 'exception', text contains the exception name. This string is shown in the UI. */ - text?: string, - /** If allThreadsStopped is true, a debug adapter can announce that all threads have stopped. - * The client should use this information to enable that all threads can be expanded to access their stacktraces. - * If the attribute is missing or false, only the thread with the given threadId can be expanded. - */ - allThreadsStopped?: boolean, - /** NUCLIDE: if the stop event is due to a breakpoint, and the adapter supports it, the id of the breakpoint */ - breakpointId?: number, - }; - } - - declare interface ContinuedEvent extends DebugEvent { - event: 'continued'; - body: { - /** The thread which was continued. */ - threadId: number, - /** If allThreadsContinued is true, a debug adapter can announce that all threads have continued. */ - allThreadsContinued?: boolean, - }; - } - - /** Event message for 'exited' event type. - The event indicates that the debuggee has exited. - */ - declare interface ExitedEvent extends DebugEvent { - event: 'exited'; - body: { - /** The exit code returned from the debuggee. */ - exitCode: number, - }; - } - - /** Event message for 'terminated' event types. - The event indicates that debugging of the debuggee has terminated. - */ - declare interface TerminatedEvent extends DebugEvent { - event: 'terminated'; - body?: { - /** A debug adapter may set 'restart' to true to request that the front end restarts the session. */ - restart?: boolean, - }; - } - - /** Event message for 'thread' event type. - The event indicates that a thread has started or exited. - */ - declare interface ThreadEvent extends DebugEvent { - event: 'thread'; - body: { - /** The reason for the event (such as: 'started', 'exited'). */ - reason: string, - /** The identifier of the thread. */ - threadId: number, - }; - } - - /** Event message for 'output' event type. - The event indicates that the target has produced some output. - */ - declare interface OutputEvent extends DebugEvent { - event: 'output'; - body: { - /** The category of output (such as: 'console', 'stdout', 'stderr', 'telemetry'). If not specified, 'console' is assumed. */ - category?: string, - /** The output to report. */ - output: string, - /** An optional source location where the output was produced. */ - source?: Source, - /** An optional source location line where the output was produced. */ - line?: number, - /** An optional source location column where the output was produced. */ - column?: number, - /** If an attribute 'variablesReference' exists and its value is > 0, the output contains objects which can be retrieved by passing variablesReference to the VariablesRequest. */ - variablesReference?: number, - /** Optional data to report. For the 'telemetry' category the data will be sent to telemetry, for the other categories the data is shown in JSON format. */ - data?: any, - }; - } - - /** Event message for 'breakpoint' event type. - The event indicates that some information about a breakpoint has changed. - */ - declare interface BreakpointEvent extends DebugEvent { - event: 'breakpoint'; - body: { - /** The reason for the event (such as: 'changed', 'new'). */ - reason: string, - /** The breakpoint. */ - breakpoint: Breakpoint, - }; - } - - /** Event message for 'module' event type. - The event indicates that some information about a module has changed. - */ - declare interface ModuleEvent extends DebugEvent { - event: 'module'; - body: { - /** The reason for the event. */ - reason: 'new' | 'changed' | 'removed', - /** The new, changed, or removed module. In case of 'removed' only the module id is used. */ - module: Module, - }; - } - - declare interface LoadedSourceEvent extends DebugEvent { - event: 'loadedSource'; - body: { - /** The reason for the event. */ - reason: 'new' | 'changed' | 'removed', - /** The new, changed, or removed source. */ - source: Source, - }; - } - - /** runInTerminal request; value of command field is 'runInTerminal'. - With this request a debug adapter can run a command in a terminal. - */ - declare interface RunInTerminalRequest extends base$Request { - command: 'runInTerminal'; - arguments: RunInTerminalRequestArguments; - } - - /** Arguments for 'runInTerminal' request. */ - declare type RunInTerminalRequestArguments = { - /** What kind of terminal to launch. */ - kind?: 'integrated' | 'external', - /** Optional title of the terminal. */ - title?: string, - /** Working directory of the command. */ - cwd: string, - /** List of arguments. The first argument is the command to run. */ - args: string[], - /** Environment key-value pairs that are added to the default environment. */ - env?: {[key: string]: string}, - }; - - /** Response to Initialize request. */ - declare interface RunInTerminalResponse extends base$Response { - body: { - /** The process ID. */ - processId?: number, - }; - } - - /** On error that is whenever 'success' is false, the body can provide more details. */ - declare interface ErrorResponse extends base$Response { - body: { - /** An optional, structured error message. */ - error?: Message, - }; - } - - /** Initialize request; value of command field is 'initialize'. */ - declare interface InitializeRequest extends base$Request { - command: 'initialize'; - arguments: InitializeRequestArguments; - } - - /** Arguments for 'initialize' request. */ - declare type InitializeRequestArguments = { - /** The ID of the (frontend) client using this adapter. */ - clientID?: string, - /** The ID of the debug adapter. */ - adapterID: string, - /** If true all line numbers are 1-based (default). */ - linesStartAt1?: boolean, - /** If true all column numbers are 1-based (default). */ - columnsStartAt1?: boolean, - /** Determines in what format paths are specified. Possible values are 'path' or 'uri'. The default is 'path', which is the native format. */ - pathFormat?: string, - /** Client supports the optional type attribute for variables. */ - supportsVariableType?: boolean, - /** Client supports the paging of variables. */ - supportsVariablePaging?: boolean, - /** Client supports the runInTerminal request. */ - supportsRunInTerminalRequest?: boolean, - }; - - /** Response to 'initialize' request. */ - declare interface InitializeResponse extends base$Response { - /** The capabilities of this debug adapter. */ - body?: Capabilities; - } - - /** ConfigurationDone request; value of command field is 'configurationDone'. - The client of the debug protocol must send this request at the end of the sequence of configuration requests (which was started by the InitializedEvent). - */ - declare interface ConfigurationDoneRequest extends base$Request { - command: 'configurationDone'; - arguments?: ConfigurationDoneArguments; - } - - /** Arguments for 'configurationDone' request. - The configurationDone request has no standardized attributes. - */ - declare type ConfigurationDoneArguments = {}; - - /** Response to 'configurationDone' request. This is just an acknowledgement, so no body field is required. */ - declare interface ConfigurationDoneResponse extends base$Response {} - - /** Launch request; value of command field is 'launch'. */ - declare interface LaunchRequest extends base$Request { - command: 'launch'; - arguments: LaunchRequestArguments; - } - - /** Arguments for 'launch' request. */ - declare type LaunchRequestArguments = { - /** If noDebug is true the launch request should launch the program without enabling debugging. */ - noDebug?: boolean, - }; - - /** Response to 'launch' request. Extending the capabilities is allowed here. */ - declare interface LaunchResponse extends base$Response { - body?: Capabilities; - } - - /** Attach request; value of command field is 'attach'. */ - declare interface AttachRequest extends base$Request { - command: 'attach'; - arguments: AttachRequestArguments; - } - - /** Arguments for 'attach' request. - The attach request has no standardized attributes. - */ - declare interface AttachRequestArguments {} - - /** Response to 'attach' request. Extending the capabilities is allowed here. */ - declare interface AttachResponse extends base$Response { - body?: Capabilities; - } - - /** Restart request; value of command field is 'restart'. - Restarts a debug session. If the capability 'supportsRestartRequest' is missing or has the value false, - the client will implement 'restart' by terminating the debug adapter first and then launching it anew. - A debug adapter can override this default behaviour by implementing a restart request - and setting the capability 'supportsRestartRequest' to true. - */ - declare interface RestartRequest extends base$Request { - command: 'restart'; - arguments?: RestartArguments; - } - - /** Arguments for 'restart' request. - The restart request has no standardized attributes. - */ - declare type RestartArguments = {}; - - /** Response to 'restart' request. This is just an acknowledgement, so no body field is required. */ - declare interface RestartResponse extends base$Response {} - - /** Disconnect request; value of command field is 'disconnect'. */ - declare interface DisconnectRequest extends base$Request { - command: 'disconnect'; - arguments?: DisconnectArguments; - } - - /** Arguments for 'disconnect' request. */ - declare type DisconnectArguments = { - /** Indicates whether the debuggee should be terminated when the debugger is disconnected. - If unspecified, the debug adapter is free to do whatever it thinks is best. - A client can only rely on this attribute being properly honored if a debug adapter returns true for the 'supportTerminateDebuggee' capability. - */ - terminateDebuggee?: boolean, - }; - - /** Response to 'disconnect' request. This is just an acknowledgement, so no body field is required. */ - declare interface DisconnectResponse extends base$Response {} - - /** SetBreakpoints request; value of command field is 'setBreakpoints'. - Sets multiple breakpoints for a single source and clears all previous breakpoints in that source. - To clear all breakpoint for a source, specify an empty array. - When a breakpoint is hit, a StoppedEvent (event type 'breakpoint') is generated. - */ - declare interface SetBreakpointsRequest extends base$Request { - command: 'setBreakpoints'; - arguments: SetBreakpointsArguments; - } - - /** Arguments for 'setBreakpoints' request. */ - declare type SetBreakpointsArguments = { - /** The source location of the breakpoints; either source.path or source.reference must be specified. */ - source: Source, - /** The code locations of the breakpoints. */ - breakpoints?: SourceBreakpoint[], - /** Deprecated: The code locations of the breakpoints. */ - lines?: number[], - /** A value of true indicates that the underlying source has been modified which results in new breakpoint locations. */ - sourceModified?: boolean, - }; - - /** Response to 'setBreakpoints' request. - Returned is information about each breakpoint created by this request. - This includes the actual code location and whether the breakpoint could be verified. - The breakpoints returned are in the same order as the elements of the 'breakpoints' - (or the deprecated 'lines') in the SetBreakpointsArguments. - */ - declare interface SetBreakpointsResponse extends base$Response { - body: { - /** Information about the breakpoints. The array elements are in the same order as the elements of the 'breakpoints' (or the deprecated 'lines') in the SetBreakpointsArguments. */ - breakpoints: Breakpoint[], - }; - } - - /** SetFunctionBreakpoints request; value of command field is 'setFunctionBreakpoints'. - Sets multiple function breakpoints and clears all previous function breakpoints. - To clear all function breakpoint, specify an empty array. - When a function breakpoint is hit, a StoppedEvent (event type 'function breakpoint') is generated. - */ - declare interface SetFunctionBreakpointsRequest extends base$Request { - command: 'setFunctionBreakpoints'; - arguments: SetFunctionBreakpointsArguments; - } - - /** Arguments for 'setFunctionBreakpoints' request. */ - declare type SetFunctionBreakpointsArguments = { - /** The function names of the breakpoints. */ - breakpoints: FunctionBreakpoint[], - }; - - /** Response to 'setFunctionBreakpoints' request. - Returned is information about each breakpoint created by this request. - */ - declare interface SetFunctionBreakpointsResponse extends base$Response { - body: { - /** Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array. */ - breakpoints: Breakpoint[], - }; - } - - /** SetExceptionBreakpoints request; value of command field is 'setExceptionBreakpoints'. - The request configures the debuggers response to thrown exceptions. If an exception is configured to break, a StoppedEvent is fired (event type 'exception'). - */ - declare interface SetExceptionBreakpointsRequest extends base$Request { - command: 'setExceptionBreakpoints'; - arguments: SetExceptionBreakpointsArguments; - } - - /** Arguments for 'setExceptionBreakpoints' request. */ - declare type SetExceptionBreakpointsArguments = { - /** IDs of checked exception options. The set of IDs is returned via the 'exceptionBreakpointFilters' capability. */ - filters: string[], - /** Configuration options for selected exceptions. */ - exceptionOptions?: ExceptionOptions[], - }; - - /** Response to 'setExceptionBreakpoints' request. This is just an acknowledgement, so no body field is required. */ - declare interface SetExceptionBreakpointsResponse extends base$Response {} - - /** Continue request; value of command field is 'continue'. - The request starts the debuggee to run again. - */ - declare interface ContinueRequest extends base$Request { - command: 'continue'; - arguments: ContinueArguments; - } - - /** Arguments for 'continue' request. */ - declare type ContinueArguments = { - /** Continue execution for the specified thread (if possible). If the backend cannot continue on a single thread but will continue on all threads, it should set the allThreadsContinued attribute in the response to true. */ - threadId: number, - }; - - /** Response to 'continue' request. */ - declare interface ContinueResponse extends base$Response { - body: { - /** If true, the continue request has ignored the specified thread and continued all threads instead. If this attribute is missing a value of 'true' is assumed for backward compatibility. */ - allThreadsContinued?: boolean, - }; - } - - declare interface nuclide_ContinueToLocationRequest extends base$Request { - command: 'nuclide_continueToLocation'; - arguments: nuclide_ContinueToLocationArguments; - } - - /** Arguments for 'nuclide_continueToLocation' request. */ - declare interface nuclide_ContinueToLocationArguments { - /** The source location for which the goto targets are determined. */ - source: Source; - /** The line location for which the goto targets are determined. */ - line: number; - /** An optional column location for which the goto targets are determined. */ - column?: number; - /** Thread ID the location is associated with. */ - threadId?: number; - } - - /** Response to 'nuclide_continueToLocation' request. */ - declare interface nuclide_ContinueToLocationResponse extends base$Response {} - - /** Request type information for a symbol */ - declare interface InfoRequest extends base$Request { - command: 'info'; - arguments: InfoArguments; - } - - declare interface InfoArguments { - /** The thread id to evaluate the object on */ - threadId?: number; - /** The object to request type information on */ - object?: string; - } - - /** Response to the 'info' request */ - declare interface InfoResponse extends base$Response { - body: { - /** Possibly multiline type information about the queried object */ - info: string, - }; - } - - /** Next request; value of command field is 'next'. - The request starts the debuggee to run again for one step. - The debug adapter first sends the NextResponse and then a StoppedEvent (event type 'step') after the step has completed. - */ - declare interface NextRequest extends base$Request { - command: 'next'; - arguments: NextArguments; - } - - /** Arguments for 'next' request. */ - declare type NextArguments = { - /** Execute 'next' for this thread. */ - threadId: number, - }; - - /** Response to 'next' request. This is just an acknowledgement, so no body field is required. */ - declare interface NextResponse extends base$Response {} - - /** StepIn request; value of command field is 'stepIn'. - The request starts the debuggee to step into a function/method if possible. - If it cannot step into a target, 'stepIn' behaves like 'next'. - The debug adapter first sends the StepInResponse and then a StoppedEvent (event type 'step') after the step has completed. - If there are multiple function/method calls (or other targets) on the source line, - the optional argument 'targetId' can be used to control into which target the 'stepIn' should occur. - The list of possible targets for a given source line can be retrieved via the 'stepInTargets' request. - */ - declare interface StepInRequest extends base$Request { - command: 'stepIn'; - arguments: StepInArguments; - } - - /** Arguments for 'stepIn' request. */ - declare type StepInArguments = { - /** Execute 'stepIn' for this thread. */ - threadId: number, - /** Optional id of the target to step into. */ - targetId?: number, - }; - - /** Response to 'stepIn' request. This is just an acknowledgement, so no body field is required. */ - declare interface StepInResponse extends base$Response {} - - /** StepOut request; value of command field is 'stepOut'. - The request starts the debuggee to run again for one step. - The debug adapter first sends the StepOutResponse and then a StoppedEvent (event type 'step') after the step has completed. - */ - declare interface StepOutRequest extends base$Request { - command: 'stepOut'; - arguments: StepOutArguments; - } - - /** Arguments for 'stepOut' request. */ - declare type StepOutArguments = { - /** Execute 'stepOut' for this thread. */ - threadId: number, - }; - - /** Response to 'stepOut' request. This is just an acknowledgement, so no body field is required. */ - declare interface StepOutResponse extends base$Response {} - - /** StepBack request; value of command field is 'stepBack'. - The request starts the debuggee to run one step backwards. - The debug adapter first sends the StepBackResponse and then a StoppedEvent (event type 'step') after the step has completed. Clients should only call this request if the capability supportsStepBack is true. - */ - declare interface StepBackRequest extends base$Request { - command: 'stepBack'; - arguments: StepBackArguments; - } - - /** Arguments for 'stepBack' request. */ - declare type StepBackArguments = { - /** Exceute 'stepBack' for this thread. */ - threadId: number, - }; - - /** Response to 'stepBack' request. This is just an acknowledgement, so no body field is required. */ - declare interface StepBackResponse extends base$Response {} - - /** ReverseContinue request; value of command field is 'reverseContinue'. - The request starts the debuggee to run backward. Clients should only call this request if the capability supportsStepBack is true. - */ - declare interface ReverseContinueRequest extends base$Request { - command: 'reverseContinue'; - arguments: ReverseContinueArguments; - } - - /** Arguments for 'reverseContinue' request. */ - declare type ReverseContinueArguments = { - /** Exceute 'reverseContinue' for this thread. */ - threadId: number, - }; - - /** Response to 'reverseContinue' request. This is just an acknowledgement, so no body field is required. */ - declare interface ReverseContinueResponse extends base$Response {} - - /** RestartFrame request; value of command field is 'restartFrame'. - The request restarts execution of the specified stackframe. - The debug adapter first sends the RestartFrameResponse and then a StoppedEvent (event type 'restart') after the restart has completed. - */ - declare interface RestartFrameRequest extends base$Request { - command: 'restartFrame'; - arguments: RestartFrameArguments; - } - - /** Arguments for 'restartFrame' request. */ - declare type RestartFrameArguments = { - /** Restart this stackframe. */ - frameId: number, - }; - - /** Response to 'restartFrame' request. This is just an acknowledgement, so no body field is required. */ - declare interface RestartFrameResponse extends base$Response {} - - /** Goto request; value of command field is 'goto'. - The request sets the location where the debuggee will continue to run. - This makes it possible to skip the execution of code or to executed code again. - The code between the current location and the goto target is not executed but skipped. - The debug adapter first sends the GotoResponse and then a StoppedEvent (event type 'goto'). - */ - declare interface GotoRequest extends base$Request { - command: 'goto'; - arguments: GotoArguments; - } - - /** Arguments for 'goto' request. */ - declare type GotoArguments = { - /** Set the goto target for this thread. */ - threadId: number, - /** The location where the debuggee will continue to run. */ - targetId: number, - }; - - /** Response to 'goto' request. This is just an acknowledgement, so no body field is required. */ - declare interface GotoResponse extends base$Response {} - - /** Pause request; value of command field is 'pause'. - The request suspenses the debuggee. - The debug adapter first sends the PauseResponse and then a StoppedEvent (event type 'pause') after the thread has been paused successfully. - */ - declare interface PauseRequest extends base$Request { - command: 'pause'; - arguments: PauseArguments; - } - - /** Arguments for 'pause' request. */ - declare type PauseArguments = { - /** Pause execution for this thread. */ - threadId: number, - }; - - /** Response to 'pause' request. This is just an acknowledgement, so no body field is required. */ - declare interface PauseResponse extends base$Response {} - - /** StackTrace request; value of command field is 'stackTrace'. The request returns a stacktrace from the current execution state. */ - declare interface StackTraceRequest extends base$Request { - command: 'stackTrace'; - arguments: StackTraceArguments; - } - - /** Arguments for 'stackTrace' request. */ - declare type StackTraceArguments = { - /** Retrieve the stacktrace for this thread. */ - threadId: number, - /** The index of the first frame to return; if omitted frames start at 0. */ - startFrame?: number, - /** The maximum number of frames to return. If levels is not specified or 0, all frames are returned. */ - levels?: number, - /** Specifies details on how to format the stack frames. */ - format?: StackFrameFormat, - }; - - /** Response to 'stackTrace' request. */ - declare interface StackTraceResponse extends base$Response { - body: { - /** The frames of the stackframe. If the array has length zero, there are no stackframes available. - This means that there is no location information available. - */ - stackFrames: StackFrame[], - /** The total number of frames available. */ - totalFrames?: number, - }; - } - - /** Scopes request; value of command field is 'scopes'. - The request returns the variable scopes for a given stackframe ID. - */ - declare interface ScopesRequest extends base$Request { - command: 'scopes'; - arguments: ScopesArguments; - } - - /** Arguments for 'scopes' request. */ - declare type ScopesArguments = { - /** Retrieve the scopes for this stackframe. */ - frameId: number, - }; - - /** Response to 'scopes' request. */ - declare interface ScopesResponse extends base$Response { - body: { - /** The scopes of the stackframe. If the array has length zero, there are no scopes available. */ - scopes: Scope[], - }; - } - - /** Variables request; value of command field is 'variables'. - Retrieves all child variables for the given variable reference. - An optional filter can be used to limit the fetched children to either named or indexed children. - */ - declare interface VariablesRequest extends base$Request { - command: 'variables'; - arguments: VariablesArguments; - } - - /** Arguments for 'variables' request. */ - declare type VariablesArguments = { - /** The Variable reference. */ - variablesReference: number, - /** Optional filter to limit the child variables to either named or indexed. If omitted, both types are fetched. */ - filter?: 'indexed' | 'named', - /** The index of the first variable to return; if omitted children start at 0. */ - start?: number, - /** The number of variables to return. If count is missing or 0, all variables are returned. */ - count?: number, - /** Specifies details on how to format the Variable values. */ - format?: ValueFormat, - }; - - /** Response to 'variables' request. */ - declare interface VariablesResponse extends base$Response { - body: { - /** All (or a range) of variables for the given variable reference. */ - variables: Variable[], - }; - } - - /** setVariable request; value of command field is 'setVariable'. - Set the variable with the given name in the variable container to a new value. - */ - declare interface SetVariableRequest extends base$Request { - command: 'setVariable'; - arguments: SetVariableArguments; - } - - /** Arguments for 'setVariable' request. */ - declare type SetVariableArguments = { - /** The reference of the variable container. */ - variablesReference: number, - /** The name of the variable. */ - name: string, - /** The value of the variable. */ - value: string, - /** Specifies details on how to format the response value. */ - format?: ValueFormat, - }; - - /** Response to 'setVariable' request. */ - declare interface SetVariableResponse extends base$Response { - body: { - /** The new value of the variable. */ - value: string, - /** The type of the new value. Typically shown in the UI when hovering over the value. */ - type?: string, - /** If variablesReference is > 0, the new value is structured and its children can be retrieved by passing variablesReference to the VariablesRequest. */ - variablesReference?: number, - /** The number of named child variables. - The client can use this optional information to present the variables in a paged UI and fetch them in chunks. - */ - namedVariables?: number, - /** The number of indexed child variables. - The client can use this optional information to present the variables in a paged UI and fetch them in chunks. - */ - indexedVariables?: number, - }; - } - - /** Source request; value of command field is 'source'. - The request retrieves the source code for a given source reference. - */ - declare interface SourceRequest extends base$Request { - command: 'source'; - arguments: SourceArguments; - } - - /** Arguments for 'source' request. */ - declare type SourceArguments = { - /** Specifies the source content to load. Either source.path or source.sourceReference must be specified. */ - source?: Source, - /** The reference to the source. This is the same as source.sourceReference. This is provided for backward compatibility since old backends do not understand the 'source' attribute. */ - sourceReference: number, - }; - - /** Response to 'source' request. */ - declare interface SourceResponse extends base$Response { - body: { - /** Content of the source reference. */ - content: string, - /** Optional content type (mime type) of the source. */ - mimeType?: string, - }; - } - - /** Thread request; value of command field is 'threads'. - The request retrieves a list of all threads. - */ - declare interface ThreadsRequest extends base$Request { - command: 'threads'; - } - - /** Response to 'threads' request. */ - declare interface ThreadsResponse extends base$Response { - body: { - /** All threads. */ - threads: Thread[], - }; - } - - /** Modules can be retrieved from the debug adapter with the ModulesRequest which can either return all modules or a range of modules to support paging. */ - declare interface ModulesRequest extends base$Request { - command: 'modules'; - arguments: ModulesArguments; - } - - /** Arguments for 'modules' request. */ - declare type ModulesArguments = { - /** The index of the first module to return; if omitted modules start at 0. */ - startModule?: number, - /** The number of modules to return. If moduleCount is not specified or 0, all modules are returned. */ - moduleCount?: number, - }; - - /** Response to 'modules' request. */ - declare interface ModulesResponse extends base$Response { - body: { - /** All modules or range of modules. */ - modules: Module[], - /** The total number of modules available. */ - totalModules?: number, - }; - } - - /** Evaluate request; value of command field is 'evaluate'. - Evaluates the given expression in the context of the top most stack frame. - The expression has access to any variables and arguments that are in scope. - */ - declare interface EvaluateRequest extends base$Request { - command: 'evaluate'; - arguments: EvaluateArguments; - } - - /** Arguments for 'evaluate' request. */ - declare type EvaluateArguments = { - /** The expression to evaluate. */ - expression: string, - /** Evaluate the expression in the scope of this stack frame. If not specified, the expression is evaluated in the global scope. */ - frameId?: number, - /** The context in which the evaluate request is run. Possible values are 'watch' if evaluate is run in a watch, 'repl' if run from the REPL console, or 'hover' if run from a data hover. */ - context?: string, - /** Specifies details on how to format the Evaluate result. */ - format?: ValueFormat, - }; - - /** Response to 'evaluate' request. */ - declare interface EvaluateResponse extends base$Response { - body: { - /** The result of the evaluate request. */ - result: string, - /** The optional type of the evaluate result. */ - type?: string, - /** If variablesReference is > 0, the evaluate result is structured and its children can be retrieved by passing variablesReference to the VariablesRequest. */ - variablesReference: number, - /** The number of named child variables. - The client can use this optional information to present the variables in a paged UI and fetch them in chunks. - */ - namedVariables?: number, - /** The number of indexed child variables. - The client can use this optional information to present the variables in a paged UI and fetch them in chunks. - */ - indexedVariables?: number, - }; - } - - /** StepInTargets request; value of command field is 'stepInTargets'. - This request retrieves the possible stepIn targets for the specified stack frame. - These targets can be used in the 'stepIn' request. - The StepInTargets may only be called if the 'supportsStepInTargetsRequest' capability exists and is true. - */ - declare interface StepInTargetsRequest extends base$Request { - command: 'stepInTargets'; - arguments: StepInTargetsArguments; - } - - /** Arguments for 'stepInTargets' request. */ - declare type StepInTargetsArguments = { - /** The stack frame for which to retrieve the possible stepIn targets. */ - frameId: number, - }; - - /** Response to 'stepInTargets' request. */ - declare interface StepInTargetsResponse extends base$Response { - body: { - /** The possible stepIn targets of the specified source location. */ - targets: StepInTarget[], - }; - } - - /** GotoTargets request; value of command field is 'gotoTargets'. - This request retrieves the possible goto targets for the specified source location. - These targets can be used in the 'goto' request. - The GotoTargets request may only be called if the 'supportsGotoTargetsRequest' capability exists and is true. - */ - declare interface GotoTargetsRequest extends base$Request { - command: 'gotoTargets'; - arguments: GotoTargetsArguments; - } - - /** Arguments for 'gotoTargets' request. */ - declare type GotoTargetsArguments = { - /** The source location for which the goto targets are determined. */ - source: Source, - /** The line location for which the goto targets are determined. */ - line: number, - /** An optional column location for which the goto targets are determined. */ - column?: number, - }; - - /** Response to 'gotoTargets' request. */ - declare interface GotoTargetsResponse extends base$Response { - body: { - /** The possible goto targets of the specified location. */ - targets: GotoTarget[], - }; - } - - /** CompletionsRequest request; value of command field is 'completions'. - Returns a list of possible completions for a given caret position and text. - The CompletionsRequest may only be called if the 'supportsCompletionsRequest' capability exists and is true. - */ - declare interface CompletionsRequest extends base$Request { - command: 'completions'; - arguments: CompletionsArguments; - } - - /** Arguments for 'completions' request. */ - declare type CompletionsArguments = { - /** Returns completions in the scope of this stack frame. If not specified, the completions are returned for the global scope. */ - frameId?: number, - /** One or more source lines. Typically this is the text a user has typed into the debug console before he asked for completion. */ - text: string, - /** The character position for which to determine the completion proposals. */ - column: number, - /** An optional line for which to determine the completion proposals. If missing the first line of the text is assumed. */ - line?: number, - }; - - /** Response to 'completions' request. */ - declare interface CompletionsResponse extends base$Response { - body: { - /** The possible completions for . */ - targets: CompletionItem[], - }; - } - - /** ExceptionInfoRequest request; value of command field is 'exceptionInfo'. - Retrieves the details of the exception that caused the StoppedEvent to be raised. - */ - declare interface ExceptionInfoRequest extends base$Request { - command: 'exceptionInfo'; - arguments: ExceptionInfoArguments; - } - - /** Arguments for 'exceptionInfo' request. */ - declare interface ExceptionInfoArguments { - /** Thread for which exception information should be retrieved. */ - threadId: number; - } - - /** Response to 'exceptionInfo' request. */ - declare interface ExceptionInfoResponse extends base$Response { - body: { - /** ID of the exception that was thrown. */ - exceptionId: string, - /** Descriptive text for the exception provided by the debug adapter. */ - description?: string, - /** Mode that caused the exception notification to be raised. */ - breakMode: ExceptionBreakMode, - /** Detailed information about the exception. */ - details?: ExceptionDetails, - }; - } - - declare interface CustomRequest extends base$Request {} - declare interface CustomResponse extends base$Response {} - - declare type Request = - | RunInTerminalRequest - | InitializeRequest - | ConfigurationDoneRequest - | LaunchRequest - | AttachRequest - | RestartRequest - | DisconnectRequest - | SetBreakpointsRequest - | SetFunctionBreakpointsRequest - | SetExceptionBreakpointsRequest - | ContinueRequest - | NextRequest - | StepInRequest - | StepOutRequest - | StepBackRequest - | ReverseContinueRequest - | RestartFrameRequest - | GotoRequest - | PauseRequest - | StackTraceRequest - | ScopesRequest - | VariablesRequest - | SetVariableRequest - | SourceRequest - | ThreadsRequest - | ModulesRequest - | EvaluateRequest - | StepInTargetsRequest - | GotoTargetsRequest - | CompletionsRequest - | ExceptionInfoRequest - | nuclide_ContinueToLocationRequest - | InfoRequest - | CustomRequest; - declare type Response = - | RunInTerminalResponse - | InitializeResponse - | ConfigurationDoneResponse - | LaunchResponse - | AttachResponse - | RestartResponse - | DisconnectResponse - | SetBreakpointsResponse - | SetFunctionBreakpointsResponse - | SetExceptionBreakpointsResponse - | ContinueResponse - | NextResponse - | StepInResponse - | StepOutResponse - | StepBackResponse - | ReverseContinueResponse - | RestartFrameResponse - | GotoResponse - | PauseResponse - | StackTraceResponse - | ScopesResponse - | VariablesResponse - | SetVariableResponse - | SourceResponse - | ThreadsResponse - | ModulesResponse - | EvaluateResponse - | StepInTargetsResponse - | GotoTargetsResponse - | CompletionsResponse - | ExceptionInfoResponse - | nuclide_ContinueToLocationResponse - | CustomResponse; - declare type Event = - | InitializedEvent - | StoppedEvent - | ContinuedEvent - | ExitedEvent - | TerminatedEvent - | ThreadEvent - | OutputEvent - | BreakpointEvent - | ModuleEvent - | LoadedSourceEvent; - - declare type Capabilities = { - /** The debug adapter supports the configurationDoneRequest. */ - supportsConfigurationDoneRequest?: boolean, - /** The debug adapter supports function breakpoints. */ - supportsFunctionBreakpoints?: boolean, - /** The debug adapter supports conditional breakpoints. */ - supportsConditionalBreakpoints?: boolean, - /** The debug adapter supports breakpoints that break execution after a specified number of hits. */ - supportsHitConditionalBreakpoints?: boolean, - /** The debug adapter supports a (side effect free) evaluate request for data hovers. */ - supportsEvaluateForHovers?: boolean, - /** Available filters or options for the setExceptionBreakpoints request. */ - exceptionBreakpointFilters?: ExceptionBreakpointsFilter[], - /** The debug adapter supports stepping back via the stepBack and reverseContinue requests. */ - supportsStepBack?: boolean, - /** The debug adapter supports setting a variable to a value. */ - supportsSetVariable?: boolean, - /** The debug adapter supports restarting a frame. */ - supportsRestartFrame?: boolean, - /** The debug adapter supports the gotoTargetsRequest. */ - supportsGotoTargetsRequest?: boolean, - /** The debug adapter supports the stepInTargetsRequest. */ - supportsStepInTargetsRequest?: boolean, - /** The debug adapter supports the completionsRequest. */ - supportsCompletionsRequest?: boolean, - /** The debug adapter supports the modules request. */ - supportsModulesRequest?: boolean, - /** The set of additional module information exposed by the debug adapter. */ - // additionalModuleColumns?: ColumnDescriptor[]; - /** Checksum algorithms supported by the debug adapter. */ - // supportedChecksumAlgorithms?: ChecksumAlgorithm[]; - /** The debug adapter supports the RestartRequest. In this case a client should not implement 'restart' by terminating and relaunching the adapter but by calling the RestartRequest. */ - supportsRestartRequest?: boolean, - /** The debug adapter supports 'exceptionOptions' on the setExceptionBreakpoints request. */ - supportsExceptionOptions?: boolean, - /** The debug adapter supports a 'format' attribute on the stackTraceRequest, variablesRequest, and evaluateRequest. */ - supportsValueFormattingOptions?: boolean, - /** The debug adapter supports the exceptionInfo request. */ - supportsExceptionInfoRequest?: boolean, - /** The debug adapter supports the 'terminateDebuggee' attribute on the 'disconnect' request. */ - supportTerminateDebuggee?: boolean, - /** The debug adapter supports custom `continueToLocation` logic. - * This is not part of the standard Visual Studio Code debug protocol. - */ - supportsContinueToLocation?: boolean, - - /** Experimental support for terminate thread - this is currently proposed as - * an addition to the protocol but not added yet. - * Tracked by VS Code issue: https://github.com/Microsoft/vscode-debugadapter-node/issues/150 - */ - supportsTerminateThreadsRequest?: boolean, - /** The debug adapter supports the delayed loading of parts of the stack, which requires that both the 'startFrame' and 'levels' arguments and the 'totalFrames' result of the 'StackTrace' request are supported. */ - supportsDelayedStackTraceLoading?: boolean, - /** NUCLIDE: the debug adapter supports sending back the id of the breakpoint that was hit in the stop event, if the stop is due to a breakpoint. */ - supportsBreakpointIdOnStop?: boolean, - /** NUCLIDE: the debug adapter supports the info request for examining symbols */ - supportsInfo?: boolean, - }; - - /** An ExceptionBreakpointsFilter is shown in the UI as an option for configuring how exceptions are dealt with. */ - declare type ExceptionBreakpointsFilter = { - /** The internal ID of the filter. This value is passed to the setExceptionBreakpoints request. */ - filter: string, - /** The name of the filter. This will be shown in the UI. */ - label: string, - /** Initial value of the filter. If not specified a value 'false' is assumed. */ - default?: boolean, - }; - - /** A structured message object. Used to return errors from requests. */ - declare type Message = { - /** Unique identifier for the message. */ - id: number, - /** A format string for the message. Embedded variables have the form '{name}'. - If variable name starts with an underscore character, the variable does not contain user data (PII) and can be safely used for telemetry purposes. - */ - format: string, - /** An object used as a dictionary for looking up the variables in the format string. */ - variables?: {[key: string]: string}, - /** If true send to telemetry. */ - sendTelemetry?: boolean, - /** If true show user. */ - showUser?: boolean, - /** An optional url where additional information about this message can be found. */ - url?: string, - /** An optional label that is presented to the user as the UI for opening the url. */ - urlLabel?: string, - }; - - /** A Module object represents a row in the modules view. - Two attributes are mandatory: an id identifies a module in the modules view and is used in a ModuleEvent for identifying a module for adding, updating or deleting. - The name is used to minimally render the module in the UI. - - Additional attributes can be added to the module. They will show up in the module View if they have a corresponding ColumnDescriptor. - - To avoid an unnecessary proliferation of additional attributes with similar semantics but different names - we recommend to re-use attributes from the 'recommended' list below first, and only introduce new attributes if nothing appropriate could be found. - */ - declare type Module = { - /** Unique identifier for the module. */ - id: number | string, - /** A name of the module. */ - name: string, - /** optional but recommended attributes. - always try to use these first before introducing additional attributes. - - Logical full path to the module. The exact definition is implementation defined, but usually this would be a full path to the on-disk file for the module. - */ - path?: string, - /** True if the module is optimized. */ - isOptimized?: boolean, - /** True if the module is considered 'user code' by a debugger that supports 'Just My Code'. */ - isUserCode?: boolean, - /** Version of Module. */ - version?: string, - /** User understandable description of if symbols were found for the module (ex: 'Symbols Loaded', 'Symbols not found', etc. */ - symbolStatus?: string, - /** Logical full path to the symbol file. The exact definition is implementation defined. */ - symbolFilePath?: string, - /** Module created or modified. */ - dateTimeStamp?: string, - /** Address range covered by this module. */ - addressRange?: string, - }; - - /** A ColumnDescriptor specifies what module attribute to show in a column of the ModulesView, how to format it, and what the column's label should be. - It is only used if the underlying UI actually supports this level of customization. - */ - declare type ColumnDescriptor = { - /** Name of the attribute rendered in this column. */ - attributeName: string, - /** Header UI label of column. */ - label: string, - /** Format to use for the rendered values in this column. TBD how the format strings looks like. */ - format?: string, - /** Datatype of values in this column. Defaults to 'string' if not specified. */ - type?: 'string' | 'number' | 'boolean' | 'unixTimestampUTC', - /** Width of this column in characters (hint only). */ - width?: number, - }; - - /** The ModulesViewDescriptor is the container for all declarative configuration options of a ModuleView. - For now it only specifies the columns to be shown in the modules view. - */ - declare type ModulesViewDescriptor = { - columns: ColumnDescriptor[], - }; - - /** A Thread */ - declare type Thread = { - /** Unique identifier for the thread. */ - id: number, - /** A name of the thread. */ - name: string, - }; - - /** A Source is a descriptor for source code. It is returned from the debug adapter as part of a StackFrame and it is used by clients when specifying breakpoints. */ - declare type Source = { - /** The short name of the source. Every source returned from the debug adapter has a name. When sending a source to the debug adapter this name is optional. */ - name?: string, - /** The path of the source to be shown in the UI. It is only used to locate and load the content of the source if no sourceReference is specified (or its vaule is 0). */ - path?: string, - /** If sourceReference > 0 the contents of the source must be retrieved through the SourceRequest (even if a path is specified). A sourceReference is only valid for a session, so it must not be used to persist a source. */ - sourceReference?: number, - /** An optional hint for how to present the source in the UI. A value of 'deemphasize' can be used to indicate that the source is not available or that it is skipped on stepping. */ - presentationHint?: 'emphasize' | 'deemphasize', - /** The (optional) origin of this source: possible values 'internal module', 'inlined content from source map', etc. */ - origin?: string, - /** Optional data that a debug adapter might want to loop through the client. The client should leave the data intact and persist it across sessions. The client should not interpret the data. */ - adapterData?: any, - /** The checksums associated with this file. */ - checksums?: Checksum[], - }; - - /** A Stackframe contains the source location. */ - declare type StackFrame = { - /** An identifier for the stack frame. It must be unique across all threads. This id can be used to retrieve the scopes of the frame with the 'scopesRequest' or to restart the execution of a stackframe. */ - id: number, - /** The name of the stack frame, typically a method name. */ - name: string, - /** The optional source of the frame. */ - source?: Source, - /** The line within the file of the frame. If source is null or doesn't exist, line is 0 and must be ignored. */ - line: number, - /** The column within the line. If source is null or doesn't exist, column is 0 and must be ignored. */ - column: number, - /** An optional end line of the range covered by the stack frame. */ - endLine?: number, - /** An optional end column of the range covered by the stack frame. */ - endColumn?: number, - /** The module associated with this frame, if any. */ - moduleId?: number | string, - /** An optional hint for how to present this frame in the UI. A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label or separator. */ - presentationHint?: 'normal' | 'label', - }; - - /** A Scope is a named container for variables. Optionally a scope can map to a source or a range within a source. */ - declare type Scope = { - /** Name of the scope such as 'Arguments', 'Locals'. */ - name: string, - /** The variables of this scope can be retrieved by passing the value of variablesReference to the VariablesRequest. */ - variablesReference: number, - /** The number of named variables in this scope. - The client can use this optional information to present the variables in a paged UI and fetch them in chunks. - */ - namedVariables?: number, - /** The number of indexed variables in this scope. - The client can use this optional information to present the variables in a paged UI and fetch them in chunks. - */ - indexedVariables?: number, - /** If true, the number of variables in this scope is large or expensive to retrieve. */ - expensive: boolean, - /** Optional source for this scope. */ - source?: Source, - /** Optional start line of the range covered by this scope. */ - line?: number, - /** Optional start column of the range covered by this scope. */ - column?: number, - /** Optional end line of the range covered by this scope. */ - endLine?: number, - /** Optional end column of the range covered by this scope. */ - endColumn?: number, - }; - - /** A Variable is a name/value pair. - Optionally a variable can have a 'type' that is shown if space permits or when hovering over the variable's name. - An optional 'kind' is used to render additional properties of the variable, e.g. different icons can be used to indicate that a variable is public or private. - If the value is structured (has children), a handle is provided to retrieve the children with the VariablesRequest. - If the number of named or indexed children is large, the numbers should be returned via the optional 'namedVariables' and 'indexedVariables' attributes. - The client can use this optional information to present the children in a paged UI and fetch them in chunks. - */ - declare type Variable = { - /** The variable's name. */ - name: string, - /** The variable's value. This can be a multi-line text, e.g. for a function the body of a function. */ - value: string, - /** The type of the variable's value. Typically shown in the UI when hovering over the value. */ - type?: string, - /** Properties of a variable that can be used to determine how to render the variable in the UI. */ - presentationHint?: VariablePresentationHint, - /** Properties of a variable that can be used to determine how to render the variable in the UI. Format of the string value: TBD. */ - kind?: string, - /** Optional evaluatable name of this variable which can be passed to the 'EvaluateRequest' to fetch the variable's value. */ - evaluateName?: string, - /** If variablesReference is > 0, the variable is structured and its children can be retrieved by passing variablesReference to the VariablesRequest. */ - variablesReference: number, - /** The number of named child variables. - The client can use this optional information to present the children in a paged UI and fetch them in chunks. - */ - namedVariables?: number, - /** The number of indexed child variables. - The client can use this optional information to present the children in a paged UI and fetch them in chunks. - */ - indexedVariables?: number, - }; - - /** Optional properties of a variable that can be used to determine how to render the variable in the UI. */ - declare type VariablePresentationHint = { - /** The kind of variable. Before introducing additional values, try to use the listed values. - Values: - 'property': Indicates that the object is a property. - 'method': Indicates that the object is a method. - 'class': Indicates that the object is a class. - 'data': Indicates that the object is data. - 'event': Indicates that the object is an event. - 'baseClass': Indicates that the object is a base class. - 'innerClass': Indicates that the object is an inner class. - 'interface': Indicates that the object is an interface. - 'mostDerivedClass': Indicates that the object is the most derived class. - 'virtual': Indicates that the object is virtual, that means it is a synthetic object introduced by the adapter for rendering purposes, e.g. an index range for large arrays. - etc. - */ - kind?: string, - /** Set of attributes represented as an array of strings. Before introducing additional values, try to use the listed values. - Values: - 'static': Indicates that the object is static. - 'constant': Indicates that the object is a constant. - 'readOnly': Indicates that the object is read only. - 'rawString': Indicates that the object is a raw string. - 'hasObjectId': Indicates that the object can have an Object ID created for it. - 'canHaveObjectId': Indicates that the object has an Object ID associated with it. - 'hasSideEffects': Indicates that the evaluation had side effects. - etc. - */ - attributes?: string[], - /** Visibility of variable. Before introducing additional values, try to use the listed values. - Values: 'public', 'private', 'protected', 'internal', 'final', etc. - */ - visibility?: string, - }; - - /** Properties of a breakpoint passed to the setBreakpoints request. */ - declare type SourceBreakpoint = { - /** The source line of the breakpoint. */ - line: number, - /** An optional source column of the breakpoint. */ - column?: ?number, - /** An optional expression for conditional breakpoints. */ - condition?: ?string, - /** An optional expression that controls how many hits of the breakpoint are ignored. The backend is expected to interpret the expression as needed. */ - hitCondition?: ?string, - }; - - /** Properties of a breakpoint passed to the setFunctionBreakpoints request. */ - declare type FunctionBreakpoint = { - /** The name of the function. */ - name: string, - /** An optional expression for conditional breakpoints. */ - condition?: ?string, - /** An optional expression that controls how many hits of the breakpoint are ignored. The backend is expected to interpret the expression as needed. */ - hitCondition?: ?string, - }; - - /** Information about a Breakpoint created in setBreakpoints or setFunctionBreakpoints. */ - declare type Breakpoint = { - /** An optional unique identifier for the breakpoint. */ - id?: number, - /** If true breakpoint could be set (but not necessarily at the desired location). */ - verified: boolean, - /** An optional message about the state of the breakpoint. This is shown to the user and can be used to explain why a breakpoint could not be verified. */ - message?: string, - /** The source where the breakpoint is located. */ - source?: Source, - /** The start line of the actual range covered by the breakpoint. */ - line?: number, - /** An optional start column of the actual range covered by the breakpoint. */ - column?: number, - /** An optional end line of the actual range covered by the breakpoint. */ - endLine?: number, - /** An optional end column of the actual range covered by the breakpoint. If no end line is given, then the end column is assumed to be in the start line. */ - endColumn?: number, - - /** Nuclide custom extensions **/ - nuclide_hitCount?: number, - }; - - /** A StepInTarget can be used in the 'stepIn' request and determines into which single target the stepIn request should step. */ - declare type StepInTarget = { - /** Unique identifier for a stepIn target. */ - id: number, - /** The name of the stepIn target (shown in the UI). */ - label: string, - }; - - /** A GotoTarget describes a code location that can be used as a target in the 'goto' request. - The possible goto targets can be determined via the 'gotoTargets' request. - */ - declare type GotoTarget = { - /** Unique identifier for a goto target. This is used in the goto request. */ - id: number, - /** The name of the goto target (shown in the UI). */ - label: string, - /** The line of the goto target. */ - line: number, - /** An optional column of the goto target. */ - column?: number, - /** An optional end line of the range covered by the goto target. */ - endLine?: number, - /** An optional end column of the range covered by the goto target. */ - endColumn?: number, - }; - - /** CompletionItems are the suggestions returned from the CompletionsRequest. */ - declare type CompletionItem = { - /** The label of this completion item. By default this is also the text that is inserted when selecting this completion. */ - label: string, - /** If text is not falsy then it is inserted instead of the label. */ - text?: string, - /** The item's type. Typically the client uses this information to render the item in the UI with an icon. */ - type?: CompletionItemType, - /** This value determines the location (in the CompletionsRequest's 'text' attribute) where the completion text is added. - If missing the text is added at the location specified by the CompletionsRequest's 'column' attribute. - */ - start?: number, - /** This value determines how many characters are overwritten by the completion text. - If missing the value 0 is assumed which results in the completion text being inserted. - */ - length?: number, - }; - - /** Some predefined types for the CompletionItem. Please note that not all clients have specific icons for all of them. */ - declare type CompletionItemType = - | 'method' - | 'function' - | 'constructor' - | 'field' - | 'variable' - | 'class' - | 'interface' - | 'module' - | 'property' - | 'unit' - | 'value' - | 'enum' - | 'keyword' - | 'snippet' - | 'text' - | 'color' - | 'file' - | 'reference' - | 'customcolor'; - - /** Names of checksum algorithms that may be supported by a debug adapter. */ - declare type ChecksumAlgorithm = 'MD5' | 'SHA1' | 'SHA256' | 'timestamp'; - - /** The checksum of an item calculated by the specified algorithm. */ - declare type Checksum = { - /** The algorithm used to calculate this checksum. */ - algorithm: ChecksumAlgorithm, - /** Value of the checksum. */ - checksum: string, - }; - - /** Provides formatting information for a value. */ - declare type ValueFormat = { - /** Display the value in hex. */ - hex?: boolean, - }; - - /** Provides formatting information for a stack frame. */ - declare type StackFrameFormat = ValueFormat & { - /** Displays parameters for the stack frame. */ - parameters?: boolean, - /** Displays the types of parameters for the stack frame. */ - parameterTypes?: boolean, - /** Displays the names of parameters for the stack frame. */ - parameterNames?: boolean, - /** Displays the values of parameters for the stack frame. */ - parameterValues?: boolean, - /** Displays the line number of the stack frame. */ - line?: boolean, - /** Displays the module of the stack frame. */ - module?: boolean, - }; - - /** An ExceptionOptions assigns configuration options to a set of exceptions. */ - declare type ExceptionOptions = { - /** A path that selects a single or multiple exceptions in a tree. If 'path' is missing, the whole tree is selected. By convention the first segment of the path is a category that is used to group exceptions in the UI. */ - path?: ExceptionPathSegment[], - /** Condition when a thrown exception should result in a break. */ - breakMode: ExceptionBreakMode, - }; - - /** This enumeration defines all possible conditions when a thrown exception should result in a break. - never: never breaks, - always: always breaks, - unhandled: breaks when excpetion unhandled, - userUnhandled: breaks if the exception is not handled by user code. - */ - declare type ExceptionBreakMode = - | 'never' - | 'always' - | 'unhandled' - | 'userUnhandled'; - - /** An ExceptionPathSegment represents a segment in a path that is used to match leafs or nodes in a tree of exceptions. If a segment consists of more than one name, it matches the names provided if 'negate' is false or missing or it matches anything except the names provided if 'negate' is true. */ - declare type ExceptionPathSegment = { - /** If false or missing this segment matches the names provided, otherwise it matches anything except the names provided. */ - negate?: boolean, - /** Depending on the value of 'negate' the names that should match or not match. */ - names: string[], - }; - - /** Detailed information about an exception that has occurred. */ - declare type ExceptionDetails = { - /** Message contained in the exception. */ - message?: string, - /** Short type name of the exception object. */ - typeName?: string, - /** Fully-qualified type name of the exception object. */ - fullTypeName?: string, - /** Optional expression that can be evaluated in the current scope to obtain the exception object. */ - evaluateName?: string, - /** Stack trace at the time the exception was thrown. */ - stackTrace?: string, - /** Details of the exception contained by this exception, if any. */ - innerException?: ExceptionDetails[], - }; -} diff --git a/flow-libs/vscode-jsonrpc.js.flow b/flow-libs/vscode-jsonrpc.js.flow deleted file mode 100644 index 33bbe6d2aa..0000000000 --- a/flow-libs/vscode-jsonrpc.js.flow +++ /dev/null @@ -1,947 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -// From https://github.com/Microsoft/vscode-languageserver-node/blob/master/jsonrpc/src/main.ts -// For v3.3.0 -// TODO: Contribute this back to flow-typed. - -declare module 'vscode-jsonrpc' { - // thenable.d.ts - - declare type Thenable = Promise; - - // events.d.ts - - declare export interface Disposable { - /** - * Dispose this object. - */ - dispose(): void; - } - - // declare var Disposable: { - // create(func: () => void): Disposable; - // } - /** - * Represents a typed event. - */ - declare export interface Event { - /** - * - * @param listener The listener function will be call when the event happens. - * @param thisArgs The 'this' which will be used when calling the event listener. - * @param disposables An array to which a {{IDisposable}} will be added. The - * @return - */ - ( - listener: (e: T) => any, - thisArgs?: any, - disposables?: Disposable[], - ): Disposable; - } - // declare export namespace Event = { - // const None: Event; - // } - declare export interface EmitterOptions { - onFirstListenerAdd?: Function; - onLastListenerRemove?: Function; - } - declare export class Emitter { - // private _options; - // private static _noop; - // private _event; - // private _callbacks; - constructor(_options?: EmitterOptions): void; - /** - * For the public to allow to subscribe - * to events from this Emitter - */ - +event: Event; - /** - * To be kept private to fire an event to - * subscribers - */ - fire(event: T): any; - dispose(): void; - } - - // cancellation.d.ts - - /** - * Defines a CancellationToken. This interface is not - * intended to be implemented. A CancellationToken must - * be created via a CancellationTokenSource. - */ - declare export interface CancellationToken { - /** - * Is `true` when the token has been cancelled, `false` otherwise. - */ - +isCancellationRequested: boolean; - /** - * An [event](#Event) which fires upon cancellation. - */ - +onCancellationRequested: Event; - } - // declare export namespace CancellationToken { - // const None: CancellationToken; - // const Cancelled: CancellationToken; - // is(value: any): boolean; - // } - declare export class CancellationTokenSource { - // private _token; - +token: CancellationToken; - cancel(): void; - dispose(): void; - } - - // messages.d.ts - - /** - * A language server message - */ - declare export interface Message { - jsonrpc: string; - } - /** - * Request message - */ - declare export interface RequestMessage extends Message { - /** - * The request id. - */ - id: number | string; - /** - * The method to be invoked. - */ - method: string; - /** - * The method's params. - */ - params?: any; - } - /** - * Predefined error codes. - */ - declare export var ErrorCodes: { - ParseError: number, - InvalidRequest: number, - MethodNotFound: number, - InvalidParams: number, - InternalError: number, - serverErrorStart: number, - serverErrorEnd: number, - ServerNotInitialized: number, - UnknownErrorCode: number, - RequestCancelled: number, - MessageWriteError: number, - MessageReadError: number, - }; - declare export interface ResponseErrorLiteral { - /** - * A number indicating the error type that occured. - */ - code: number; - /** - * A string providing a short decription of the error. - */ - message: string; - /** - * A Primitive or Structured value that contains additional - * information about the error. Can be omitted. - */ - data?: D; - } - /** - * A error object return in a response in case a request - * has failed. - */ - declare export class ResponseError extends Error { - +code: number; - +data: D; - constructor(code: number, message: string, data?: D): void; - toJson(): ResponseErrorLiteral; - } - /** - * A response message. - */ - declare export interface ResponseMessage extends Message { - /** - * The request id. - */ - id: number | string | null; - /** - * The result of a request. This can be omitted in - * the case of an error. - */ - result?: any; - /** - * The error object in case a request fails. - */ - error?: ResponseErrorLiteral; - } - /** - * An interface to type messages. - */ - declare export interface MessageType { - +method: string; - +numberOfParams: number; - } - /** - * An abstract implementation of a MessageType. - */ - declare class AbstractMessageType { - // private _method; - // private _numberOfParams; - constructor(_method: string, _numberOfParams: number): void; - +method: string; - +numberOfParams: number; - } - /** - * End marker interface for request and notification types. - */ - declare interface _EM { - _$endMarker$_: number; - } - /** - * Classes to type request response pairs - */ - declare export type RequestType0 = { - // private _?; - +method: string, - }; - declare export type RequestType = { - // private _?; - +method: string, - }; - declare export type RequestType1 = { - // private _?; - +method: string, - }; - declare export type RequestType2 = { - // private _?; - +method: string, - }; - declare export type RequestType3 = { - // private _?; - +method: string, - }; - declare export type RequestType4 = { - // private _?; - +method: string, - }; - declare export type RequestType5 = { - // private _?; - +method: string, - }; - declare export type RequestType6 = { - // private _?; - +method: string, - }; - declare export type RequestType7 = { - // private _?; - +method: string, - }; - declare export type RequestType8 = { - // private _?; - +method: string, - }; - declare export type RequestType9< - P1, - P2, - P3, - P4, - P5, - P6, - P7, - P8, - P9, - R, - E, - RO, - > = { - // private _?; - +method: string, - }; - /** - * Notification Message - */ - declare interface NotificationMessage extends Message { - /** - * The method to be invoked. - */ - method: string; - /** - * The notification's params. - */ - params?: any; - } - declare export type NotificationType = { - // private _?; - +method: string, - }; - declare export type NotificationType0 = { - // private _?; - +method: string, - }; - declare export type NotificationType1 = { - // private _?; - +method: string, - }; - declare export type NotificationType2 = { - // private _?; - +method: string, - }; - declare export type NotificationType3 = { - // private _?; - +method: string, - }; - declare export type NotificationType4 = { - // private _?; - +method: string, - }; - declare export type NotificationType5 = { - // private _?; - +method: string, - }; - declare export type NotificationType6 = { - // private _?; - +method: string, - }; - declare export type NotificationType7 = { - // private _?; - +method: string, - }; - declare export type NotificationType8 = { - // private _?; - +method: string, - }; - declare export type NotificationType9< - P1, - P2, - P3, - P4, - P5, - P6, - P7, - P8, - P9, - RO, - > = { - // private _?; - +method: string, - }; - /** - * Tests if the given message is a request message - */ - declare function isRequestMessage(message: Message | void): boolean; - /** - * Tests if the given message is a notification message - */ - declare function isNotificationMessage(message: Message | void): boolean; - /** - * Tests if the given message is a response message - */ - declare function isReponseMessage(message: Message | void): boolean; - - // messageReader.d.ts - - declare export interface DataCallback { - (data: Message): void; - } - declare export interface PartialMessageInfo { - +messageToken: number; - +waitingTime: number; - } - declare export interface MessageReader { - +onError: Event; - +onClose: Event; - +onPartialMessage: Event; - listen(callback: DataCallback): void; - dispose(): void; - } - declare class AbstractMessageReader { - // private errorEmitter; - // private closeEmitter; - // private partialMessageEmitter; - constructor(): void; - dispose(): void; - +onError: Event; - /* protected */ fireError(error: any): void; - +onClose: Event; - /* protected */ fireClose(): void; - +onPartialMessage: Event; - /* protected */ firePartialMessage(info: PartialMessageInfo): void; - /* private */ asError(error: any): any; - } - declare export class StreamMessageReader extends AbstractMessageReader { - readable: stream$Readable; - // private callback; - // private buffer; - // private nextMessageLength; - // private messageToken; - // private partialMessageTimer; - // private _partialMessageTimeout; - constructor(readable: stream$Readable, encoding?: string): void; - partialMessageTimeout: number; - listen(callback: DataCallback): void; - /* private */ onData(data: any): any; - // private clearPartialMessageTimer(); - // private setPartialMessageTimer(); - } - declare export class IPCMessageReader extends AbstractMessageReader { - // private process; - constructor(process: Process | child_process$ChildProcess): void; - listen(callback: DataCallback): void; - } - declare export class SocketMessageReader extends StreamMessageReader { - constructor(socket: net$Socket, encoding?: string): void; - } - - // messageWriter.d.ts - - declare export interface MessageWriter { - +onError: Event<[Error, Message | void, number | void]>; - +onClose: Event; - write(msg: Message): void; - dispose(): void; - } - declare class AbstractMessageWriter { - // private errorEmitter; - // private closeEmitter; - constructor(): void; - dispose(): void; - +onError: Event<[Error, Message | void, number | void]>; - // protected fireError(error: any, message?: Message, count?: number): void; - +onClose: Event; - // protected fireClose(): void; - // private asError(error); - } - declare export class StreamMessageWriter extends AbstractMessageWriter { - // private writable; - // private encoding; - // private errorCount; - constructor(writable: stream$Writable, encoding?: string): void; - write(msg: Message): void; - } - declare export class IPCMessageWriter extends AbstractMessageWriter { - // private process; - // private queue; - // private sending; - // private errorCount; - constructor(process: Process | child_process$ChildProcess): void; - write(msg: Message): void; - doWriteMessage(msg: Message): void; - } - declare export class SocketMessageWriter extends AbstractMessageWriter { - // private socket; - // private queue; - // private sending; - // private encoding; - // private errorCount; - constructor(socket: net$Socket, encoding?: string): void; - write(msg: Message): void; - doWriteMessage(msg: Message): void; - // private handleError(error, msg); - } - - // pipeSupport.d.ts - - declare export function generateRandomPipeName(): string; - declare export interface PipeTransport { - onConnected(): Thenable<[MessageReader, MessageWriter]>; - } - declare export function createClientPipeTransport( - pipeName: string, - encoding?: string, - ): Thenable; - declare export function createServerPipeTransport( - pipeName: string, - encoding?: string, - ): [MessageReader, MessageWriter]; - - // main.d.ts - - declare type HandlerResult = - | R - | ResponseError - | Thenable - | Thenable>; - declare interface StarRequestHandler { - (method: string, ...params: any[]): HandlerResult; - } - declare interface GenericRequestHandler { - (...params: any[]): HandlerResult; - } - declare interface RequestHandler0 { - (token: CancellationToken): HandlerResult; - } - declare interface RequestHandler { - (params: P, token: CancellationToken): HandlerResult; - } - declare interface RequestHandler1 { - (p1: P1, token: CancellationToken): HandlerResult; - } - declare interface RequestHandler2 { - (p1: P1, p2: P2, token: CancellationToken): HandlerResult; - } - declare interface RequestHandler3 { - (p1: P1, p2: P2, p3: P3, token: CancellationToken): HandlerResult; - } - declare interface RequestHandler4 { - ( - p1: P1, - p2: P2, - p3: P3, - p4: P4, - token: CancellationToken, - ): HandlerResult; - } - declare interface RequestHandler5 { - ( - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - token: CancellationToken, - ): HandlerResult; - } - declare interface RequestHandler6 { - ( - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - token: CancellationToken, - ): HandlerResult; - } - declare interface RequestHandler7 { - ( - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - token: CancellationToken, - ): HandlerResult; - } - declare interface RequestHandler8 { - ( - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - p8: P8, - token: CancellationToken, - ): HandlerResult; - } - declare interface RequestHandler9 { - ( - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - p8: P8, - p9: P9, - token: CancellationToken, - ): HandlerResult; - } - declare interface StarNotificationHandler { - (method: string, ...params: any[]): void; - } - declare interface GenericNotificationHandler { - (...params: any[]): void; - } - declare interface NotificationHandler0 { - (): void; - } - declare interface NotificationHandler

{ - (params: P): void; - } - declare interface NotificationHandler1 { - (p1: P1): void; - } - declare interface NotificationHandler2 { - (p1: P1, p2: P2): void; - } - declare interface NotificationHandler3 { - (p1: P1, p2: P2, p3: P3): void; - } - declare interface NotificationHandler4 { - (p1: P1, p2: P2, p3: P3, p4: P4): void; - } - declare interface NotificationHandler5 { - (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5): void; - } - declare interface NotificationHandler6 { - (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6): void; - } - declare interface NotificationHandler7 { - (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7): void; - } - declare interface NotificationHandler8 { - (p1: P1, p2: P2, p3: P3, p4: P4, p5: P5, p6: P6, p7: P7, p8: P8): void; - } - declare interface NotificationHandler9 { - ( - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - p8: P8, - p9: P9, - ): void; - } - declare interface Logger { - error(message: string): void; - warn(message: string): void; - info(message: string): void; - log(message: string): void; - } - declare export var Trace: { - Off: 0, - Messages: 1, - Verbose: 2, - fromString(value: string): $Values, - toString(value: $Values): TraceValues, - }; - declare type TraceValues = 'off' | 'messages' | 'verbose'; - declare interface SetTraceParams { - value: TraceValues; - } - declare export var SetTraceNotification: { - type: NotificationType, - }; - declare interface LogTraceParams { - message: string; - verbose?: string; - } - declare export var LogTraceNotification: { - type: NotificationType, - }; - declare interface Tracer { - log(message: string, data?: string): void; - } - declare export var ConnectionErrors: { - /** - * The connection is closed. - */ - Closed: 1, - /** - * The connection got disposed. - */ - Disposed: 2, - /** - * The connection is already in listening mode. - */ - AlreadyListening: 3, - }; - declare export class ConnectionError extends Error { - +code: $Values; - constructor(code: $Values, message: string): void; - } - // declare type MessageQueue = LinkedMap; - declare type ConnectionStrategy = { - cancelUndispatched?: ( - message: Message, - next: (message: Message) => ResponseMessage | void, - ) => ResponseMessage | void, - }; - // declare export var ConnectionStrategy: { - // is(value: any): boolean, - // }; - declare export interface MessageConnection { - sendRequest( - type: RequestType0, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType, - params: P, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType1, - p1: P1, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType2, - p1: P1, - p2: P2, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType3, - p1: P1, - p2: P2, - p3: P3, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType4, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType5, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType6, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType7, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType8, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - p8: P8, - token?: CancellationToken, - ): Thenable; - sendRequest( - type: RequestType9, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - p8: P8, - p9: P9, - token?: CancellationToken, - ): Thenable; - sendRequest(method: string, ...params: any[]): Thenable; - onRequest( - type: RequestType0, - handler: RequestHandler0, - ): void; - onRequest( - type: RequestType1, - handler: RequestHandler1, - ): void; - onRequest( - type: RequestType2, - handler: RequestHandler2, - ): void; - onRequest( - type: RequestType3, - handler: RequestHandler3, - ): void; - onRequest( - type: RequestType4, - handler: RequestHandler4, - ): void; - onRequest( - type: RequestType5, - handler: RequestHandler5, - ): void; - onRequest( - type: RequestType6, - handler: RequestHandler6, - ): void; - onRequest( - type: RequestType7, - handler: RequestHandler7, - ): void; - onRequest( - type: RequestType8, - handler: RequestHandler8, - ): void; - onRequest( - type: RequestType9, - handler: RequestHandler9, - ): void; - onRequest(method: string, handler: GenericRequestHandler): void; - onRequest(handler: StarRequestHandler): void; - sendNotification(type: NotificationType0): void; - sendNotification(type: NotificationType, params?: P): void; - sendNotification(type: NotificationType1, p1: P1): void; - sendNotification( - type: NotificationType2, - p1: P1, - p2: P2, - ): void; - sendNotification( - type: NotificationType3, - p1: P1, - p2: P2, - p3: P3, - ): void; - sendNotification( - type: NotificationType4, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - ): void; - sendNotification( - type: NotificationType5, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - ): void; - sendNotification( - type: NotificationType6, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - ): void; - sendNotification( - type: NotificationType7, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - ): void; - sendNotification( - type: NotificationType8, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - p8: P8, - ): void; - sendNotification( - type: NotificationType9, - p1: P1, - p2: P2, - p3: P3, - p4: P4, - p5: P5, - p6: P6, - p7: P7, - p8: P8, - p9: P9, - ): void; - sendNotification(method: string, ...params: any[]): void; - onNotification( - type: NotificationType0, - handler: NotificationHandler0, - ): void; - onNotification( - type: NotificationType1, - handler: NotificationHandler1, - ): void; - onNotification( - type: NotificationType2, - handler: NotificationHandler2, - ): void; - onNotification( - type: NotificationType3, - handler: NotificationHandler3, - ): void; - onNotification( - type: NotificationType4, - handler: NotificationHandler4, - ): void; - onNotification( - type: NotificationType5, - handler: NotificationHandler5, - ): void; - onNotification( - type: NotificationType6, - handler: NotificationHandler6, - ): void; - onNotification( - type: NotificationType7, - handler: NotificationHandler7, - ): void; - onNotification( - type: NotificationType8, - handler: NotificationHandler8, - ): void; - onNotification( - type: NotificationType9, - handler: NotificationHandler9, - ): void; - onNotification(method: string, handler: GenericNotificationHandler): void; - onNotification(handler: StarNotificationHandler): void; - trace( - value: $Values, - tracer: Tracer, - sendNotification?: boolean, - ): void; - onError: Event<[Error, Message, number]>; - onClose: Event; - onUnhandledNotification: Event; - listen(): void; - onDispose: Event; - dispose(): void; - inspect(): void; - } - declare export function createMessageConnection( - reader: MessageReader, - writer: MessageWriter, - logger: Logger, - strategy?: ConnectionStrategy, - ): MessageConnection; - declare export function createMessageConnection( - inputStream: stream$Readable, - outputStream: stream$Writable, - logger: Logger, - strategy?: ConnectionStrategy, - ): MessageConnection; -} diff --git a/flow-libs/vscode-languageclient.js.flow b/flow-libs/vscode-languageclient.js.flow deleted file mode 100644 index 67756444e8..0000000000 --- a/flow-libs/vscode-languageclient.js.flow +++ /dev/null @@ -1,300 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -declare module 'vscode-languageclient' { - import type { - ClientCapabilities, - DocumentSelector, - InitializeError, - InitializeParams, - MessageReader, - MessageWriter, - ServerCapabilities, - RequestType, - NotificationType, - } from 'vscode-languageserver-protocol'; - import type {CancellationToken, OutputChannel, Event} from 'vscode'; - - declare type ExecutableOptions = { - cwd?: string, - stdio?: string | string[], - env?: any, - detached?: boolean, - }; - - declare type Executable = { - command: string, - args?: string[], - options?: ExecutableOptions, - }; - - declare type ForkOptions = { - cwd?: string, - env?: any, - encoding?: string, - execArgv?: string[], - }; - - declare type TransportKind = 'stdio' | 'ipc' | 'pipe'; - - declare type NodeModule = { - module: string, - transport?: TransportKind, - args?: string[], - runtime?: string, - options?: ForkOptions, - }; - - declare export type StreamInfo = { - writer: stream$Writable, - reader: stream$Readable, - detached?: boolean, - }; - - declare type ChildProcessInfo = { - process: child_process$ChildProcess, - detached: boolean, - }; - - declare type MessageTransports = { - reader: MessageReader, - writer: MessageWriter, - detached?: boolean, - }; - - declare export type ServerOptions = - | Executable - | {run: Executable, debug: Executable} - | {run: NodeModule, debug: NodeModule} - | NodeModule - | (() => Thenable< - | child_process$ChildProcess - | StreamInfo - | MessageTransports - | ChildProcessInfo, - >); - - declare export interface StaticFeature { - /** - * Called to fill the initialize params. - * - * @params the initialize params. - */ - fillInitializeParams?: (params: InitializeParams) => void; - - /** - * Called to fill in the client capabilities this feature implements. - * - * @param capabilities The client capabilities to fill. - */ - fillClientCapabilities(capabilities: ClientCapabilities): void; - - /** - * Initialize the feature. This method is called on a feature instance - * when the client has successfully received the initalize request from - * the server and before the client sends the initialized notification - * to the server. - * - * @param capabilities the server capabilities - * @param documentSelector the document selector pass to the client's constuctor. - * May be `undefined` if the client was created without a selector. - */ - initialize( - capabilities: ServerCapabilities, - documentSelector: ?DocumentSelector, - ): void; - } - - declare export interface RPCMessageType { - +method: string; - +numberOfParams: number; - } - - declare export interface RegistrationData { - id: string; - registerOptions: any; - } - - declare export interface DynamicFeature { - /** - * The message for which this features support dynamic activation / registration. - */ - +messages: RPCMessageType | RPCMessageType[]; - - /** - * Called to fill the initialize params. - * - * @params the initialize params. - */ - fillInitializeParams?: (params: InitializeParams) => void; - - /** - * Called to fill in the client capabilities this feature implements. - * - * @param capabilities The client capabilities to fill. - */ - fillClientCapabilities(capabilities: ClientCapabilities): void; - - /** - * Initialize the feature. This method is called on a feature instance - * when the client has successfully received the initalize request from - * the server and before the client sends the initialized notification - * to the server. - * - * @param capabilities the server capabilities. - * @param documentSelector the document selector pass to the client's constuctor. - * May be `undefined` if the client was created without a selector. - */ - initialize( - capabilities: ServerCapabilities, - documentSelector: ?DocumentSelector, - ): void; - - /** - * Is called when the server send a register request for the given message. - * - * @param message the message to register for. - * @param data additional registration data as defined in the protocol. - */ - register(message: RPCMessageType, data: RegistrationData): void; - - /** - * Is called when the server wants to unregister a feature. - * - * @param id the id used when registering the feature. - */ - unregister(id: string): void; - - /** - * Called when the client is stopped to dispose this feature. Usually a feature - * unregisters listeners registerd hooked up with the VS Code extension host. - */ - dispose(): void; - } - - declare export interface HandleDiagnosticsSignature { - (uri: any, diagnostics: any[]): void; - } - - declare export interface Middleware { - handleDiagnostics?: ( - uri: any, - diagnostics: any[], - next: HandleDiagnosticsSignature, - ) => void; - } - - declare export interface LanguageClientOptions { - documentSelector?: DocumentSelector | Array; - synchronize?: any; - // diagnosticCollectionName?: string; - // outputChannel?: OutputChannel; - outputChannelName?: string; - // revealOutputChannelOn?: RevealOutputChannelOn; - /** - * The encoding use to read stdout and stderr. Defaults - * to 'utf8' if ommitted. - */ - stdioEncoding?: string; - initializationOptions?: any | (() => any); - initializationFailedHandler?: (error: any) => boolean; - // errorHandler?: ErrorHandler; - middleware?: Middleware; - // uriConverters?: { - // code2Protocol: c2p.URIConverter, - // protocol2Code: p2c.URIConverter, - // }; - // workspaceFolder?: VWorkspaceFolder; - } - - declare export var ErrorAction: { - /** - * Continue running the server. - */ - Continue: 1, - /** - * Shutdown the server. - */ - Shutdown: 2, - }; - - declare export var CloseAction: { - /** - * Don't restart the server. The connection stays closed. - */ - DoNotRestart: 1, - /** - * Restart the server. - */ - Restart: 2, - }; - - declare export var RevealOutputChannelOn: { - Info: 1, - Warn: 2, - Error: 3, - Never: 4, - }; - - declare export var State: { - Stopped: 1, - Starting: 3, - Running: 2, - }; - - declare export interface StateChangeEvent { - oldState: number; - newState: number; - } - - declare export class LanguageClient { - get clientOptions(): LanguageClientOptions; - get outputChannel(): OutputChannel; - constructor( - name: string, - serverOptions: ServerOptions, - clientOptions: LanguageClientOptions, - forceDebug?: boolean, - ): void; - constructor( - id: string, - name: string, - serverOptions: ServerOptions, - clientOptions: LanguageClientOptions, - forceDebug?: boolean, - ): void; - constructor( - arg1: string, - arg2: ServerOptions | string, - arg3: LanguageClientOptions | ServerOptions, - arg4?: boolean | LanguageClientOptions, - arg5?: boolean, - ): void; - - info(message: string, data?: any): void; - warn(message: string, data?: any): void; - error(message: string, data?: any): void; - - start(): IDisposable; - stop(): Thenable; - onReady(): Thenable; - onRequest(type: RequestType, (params: any) => mixed): void; - onNotification(type: NotificationType, (params: any) => mixed): void; - registerFeature(feature: StaticFeature | DynamicFeature): void; - +onDidChangeState: Event; - sendRequest(method: string, param: any): Thenable; - sendRequest( - type: RequestType, - params: any, - token?: CancellationToken, - ): Thenable; - } -} diff --git a/flow-libs/vscode-languageserver-protocol.js.flow b/flow-libs/vscode-languageserver-protocol.js.flow deleted file mode 100644 index d83751f122..0000000000 --- a/flow-libs/vscode-languageserver-protocol.js.flow +++ /dev/null @@ -1,991 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -// Flow definitions for Microsoft's Language Server Protocol -// https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md -// https://github.com/Microsoft/language-server-protocol/blob/master/versions/protocol-2-x.md - -declare module 'vscode-languageserver-protocol' { - // Structures - - declare type Position = { - // Line position in a document (zero-based). - line: number, - // Character offset on a line in a document (zero-based). - character: number, - }; - - declare type Range = { - // The range's start position. - start: Position, - // The range's end position. - end: Position, - }; - - declare type Location = { - // The location's URI. - uri: string, - // The position within the URI. - range: Range, - }; - - declare export type DocumentFilter = - | { - /** A language id, like `typescript`. */ - language: string, - /** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */ - scheme?: string, - /** A glob pattern, like `*.{ts,js}`. */ - pattern?: string, - } - | { - /** A language id, like `typescript`. */ - language?: string, - /** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */ - scheme: string, - /** A glob pattern, like `*.{ts,js}`. */ - pattern?: string, - } - | { - /** A language id, like `typescript`. */ - language?: string, - /** A Uri [scheme](#Uri.scheme), like `file` or `untitled`. */ - scheme?: string, - /** A glob pattern, like `*.{ts,js}`. */ - pattern: string, - }; - - declare export type DocumentSelector = Array; - - declare type Diagnostic = { - // The range at which the message applies. - range: Range, - // The diagnostic's severity. Can be omitted. If omitted it is up to the - // client to interpret diagnostics as error, warning, info or hint. - severity?: number, - // The diagnostic's code. Can be omitted. - code?: number | string, - // A human-readable string describing the source of this - // diagnostic, e.g. 'typescript' or 'super lint'. - source?: string, - // The diagnostic's message. - message: string, - // Any related locations. - relatedLocations?: RelatedLocation[], - }; - - declare type RelatedLocation = { - location: Location, - message: string, - }; - - declare export var DiagnosticSeverity: { - // Reports an error. - Error: 1, - // Reports a warning. - Warning: 2, - // Reports an information. - Information: 3, - // Reports a hint. - Hint: 4, - }; - - declare type Command = { - // Title of the command, like `save`. - title: string, - // The identifier of the actual command handler. - command: string, - // Arguments that the command handler should be invoked with. - arguments?: any[], - }; - - declare export type TextEdit = { - // The range of the text document to be manipulated. To insert - // text into a document create a range where start === end. - range: Range, - // The string to be inserted. For delete operations use an empty string. - newText: string, - }; - - declare type WorkspaceEdit = { - // Holds changes to existing resources. - changes?: {[uri: string]: TextEdit[]}, - - // An array of `TextDocumentEdit`s to express changes to n different text documents - // where each text document edit addresses a specific version of a text document. - // Whether a client supports versioned document edits is expressed via - // `WorkspaceClientCapabilities.workspaceEdit.documentChanges`. - documentChanges?: TextDocumentEdit[], - }; - - declare type TextDocumentIdentifier = { - // The text document's URI. - uri: string, - }; - - declare type TextDocumentItem = { - // The text document's URI. - uri: string, - // The text document's language identifier. - languageId: string, - // The version number of this document (it will strictly increase after each - // change, including undo/redo). - version: number, - // The content of the opened text document. - text: string, - }; - - declare type VersionedTextDocumentIdentifier = TextDocumentIdentifier & { - // The version number of this document. - version: number, - }; - - declare type TextDocumentPositionParams = { - // The text document. - textDocument: TextDocumentIdentifier, - // The position inside the text document. - position: Position, - }; - - // General - - declare export var ErrorCodes: { - ParseError: -32700, - InvalidRequest: -32600, - MethodNotFound: -32601, - InvalidParams: -32602, - InternalError: -32603, - serverErrorStart: -32099, - serverErrorEnd: -32000, - ServerNotInitialized: -32002, - UnknownErrorCode: -32001, - // eslint-disable-next-line nuclide-internal/api-spelling - RequestCancelled: -32800, - }; - - declare export type InitializeParams = { - // The process Id of the parent process that started - // the server. Is null if the process has not been started by another process. - // If the parent process is not alive then the server should exit - // (see exit notification) its process. - processId?: number, - // The rootPath of the workspace. Is null if no folder is open. - rootPath?: string, - // The rootUri of the workspace. Is null if no folder is open. If both - // `rootPath` and `rootUri` are set rootUri` wins. - rootUri?: string, // TODO: this should be DocumentUri - // User provided initialization options. - initializationOptions?: any, - // The capabilities provided by the client (editor) - capabilities: ClientCapabilities, - // The initial trace setting. If omitted trace is disabled ('off') - trace?: 'off' | 'messages' | 'verbose', - }; - - // Workspace specific client capabilities. - declare type WorkspaceClientCapabilities = {| - // The client supports applying batch edits to the workspace by supporting - // the request 'workspace/applyEdit' - applyEdit?: boolean, - // Capabilities specific to `WorkspaceEdit`s - workspaceEdit?: {| - // The client supports versioned document changes in `WorkspaceEdit`s - documentChanges?: boolean, - |}, - // Capabilities specific to `workspace/didChangeConfiguration` notification. - didChangeConfiguration?: {| - // Did change configuration notification supports dynamic registration. - dynamicRegistration?: boolean, - |}, - // Capabilities specific to `workspace/didChangeWatchedFiles` notification. - didChangeWatchedFiles?: {| - // Did change watched files notification supports dynamic registration. - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `workspace/symbol` request. - symbol?: {| - // Symbol request supports dynamic registration. - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `workspace/executeCommand` request. - executeCommand?: {| - // Execute command supports dynamic registration. - dynamicRegistration?: boolean, - |}, - |}; - - // Text document specific client capabilities. - declare type TextDocumentClientCapabilities = {| - synchronization?: {| - // Whether text document synchronization supports dynamic registration. - dynamicRegistration?: boolean, - // The client supports sending will save notifications. - willSave?: boolean, - // The client supports sending a will save request and - // waits for a response providing text edits which will - // be applied to the document before it is saved. - willSaveWaitUntil?: boolean, - // The client supports did save notifications. - didSave?: boolean, - |}, - // Capabilities specific to the `textDocument/completion` - completion?: {| - dynamicRegistration?: boolean, - // The client supports the following `CompletionItem` specific capabilities - completionItem?: {| - // Client supports snippets as insert text. - // A snippet can define tab stops and placeholders with `$1`, `$2` - // and `${3:foo}`. `$0` defines the final tab stop, it defaults to - // the end of the snippet. Placeholders with equal identifiers are linked - // that is typing in one will update others too. - snippetSupport?: boolean, - |}, - |}, - // Capabilities specific to the `textDocument/hover` - hover?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/signatureHelp` - signatureHelp?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/references` - references?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/documentHighlight` - documentHighlight?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/documentSymbol` - documentSymbol?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/formatting` - formatting?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/rangeFormatting` - rangeFormatting?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/onTypeFormatting` - onTypeFormatting?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/definition` - definition?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/codeAction` - codeAction?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/codeLens` - codeLens?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/documentLink` - documentLink?: {| - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `textDocument/rename` - rename?: {| - dynamicRegistration?: boolean, - |}, - |}; - - declare type WindowClientCapabilities = {| - // Capabilities specific to the `window/showStatus` request. - status?: {| - // Status requests supports dynamic registration. - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `window/progress` notification. - progress?: {| - // Progress notification supports dynamic registration. - dynamicRegistration?: boolean, - |}, - // Capabilities specific to the `window/actionRequired` notification. - actionRequired?: {| - // ActionRequired notification supports dynamic registration. - dynamicRegistration?: boolean, - |}, - |}; - - declare export type ClientCapabilities = {| - // Workspace specific client capabilities. - workspace?: WorkspaceClientCapabilities, - // Text document specific client capabilities. - textDocument?: TextDocumentClientCapabilities, - // Window specific client capabilities. (Nuclide-only) - window?: WindowClientCapabilities, - // Experimental client capabilities. - experimental?: mixed, - |}; - - declare type InitializeResult = { - // The capabilities the language server provides. - capabilities: ServerCapabilities, - }; - - declare export type InitializeError = { - // Indicates whether the client should retry to send the - // initilize request after showing the message provided - // in the ResponseError. - retry: boolean, - }; - - // Defines how the host (editor) should sync document changes to the language server. - declare export var TextDocumentSyncKind: { - // Documents should not be synced at all. - None: 0, - // Documents are synced by always sending the full content of the document. - Full: 1, - // Documents are synced by sending the full content on open. After that only incremental - // updates to the document are sent. - Incremental: 2, - }; - - // Completion options. - declare type CompletionOptions = { - // The server provides support to resolve additional information for a completion item. - resolveProvider?: boolean, - // The characters that trigger completion automatically. - triggerCharacters?: string[], - }; - - // Signature help options. - declare type SignatureHelpOptions = { - // The characters that trigger signature help automatically. - triggerCharacters?: string[], - }; - - // Code Lens options. - declare type CodeLensOptions = { - // Code lens has a resolve provider as well. - resolveProvider?: boolean, - }; - - // Format document on type options - declare type DocumentOnTypeFormattingOptions = { - // A character on which formatting should be triggered, like `};`. - firstTriggerCharacter: string, - // More trigger characters. - moreTriggerCharacter?: string[], - }; - - // Save options. - declare type SaveOptions = { - // The client is supposed to include the content on save. - includeText?: boolean, - }; - - declare type TextDocumentSyncOptions = { - // Open and close notifications are sent to the server. - openClose?: boolean, - // Change notifications are sent to the server. One of TextDocumentSyncKind. - change?: number, - // Will save notifications are sent to the server. - willSave?: boolean, - // Will save wait until requests are sent to the server. - willSaveWaitUntil?: boolean, - // Save notifications are sent to the server. - save?: SaveOptions, - }; - - declare export type ServerCapabilities = { - // Defines how text documents are synced. If a number, is one of TextDocumentSyncKind - textDocumentSync?: TextDocumentSyncOptions | number, - // The server provides hover support. - hoverProvider?: boolean, - // The server provides completion support. - completionProvider?: CompletionOptions, - // The server provides signature help support. - signatureHelpProvider?: SignatureHelpOptions, - // The server provides goto definition support. - definitionProvider?: boolean, - // The server provides find references support. - referencesProvider?: boolean, - // The server provides document highlight support. - documentHighlightProvider?: boolean, - // The server provides document symbol support. - documentSymbolProvider?: boolean, - // The server provides workspace symbol support. - workspaceSymbolProvider?: boolean, - // The server provides code actions. - codeActionProvider?: boolean, - // The server provides code lens. - codeLensProvider?: CodeLensOptions, - // The server provides document formatting. - documentFormattingProvider?: boolean, - // The server provides document range formatting. - documentRangeFormattingProvider?: boolean, - // The server provides document formatting on typing. - documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions, - // The server provides rename support. - renameProvider?: boolean, - // The server provides type coverage support. - typeCoverageProvider?: boolean, - // The server responds to rage requests - rageProvider?: boolean, - }; - - declare type RageItem = { - // Title convention is [host:]/path/file[:meta] - if ommitted, client picks - title?: string, - // Arbitrary text for the rage report - data: string, - }; - - // Document - - declare type PublishDiagnosticsParams = { - // The URI for which diagnostic information is reported. - uri: string, - // An array of diagnostic information items. - diagnostics: Diagnostic[], - }; - - // Represents a collection of [completion items](#CompletionItem) to be presented in the editor. - declare type CompletionList = { - // This list it not complete. Further typing should result in recomputing this list. - isIncomplete: boolean, - // The completion items. - items: CompletionItem[], - }; - - // Defines whether the insert text in a completion item should be interpreted as plain text or a snippet. - declare export var InsertTextFormat: { - PlainText: 1, - Snippet: 2, - }; - - declare type MarkupKind = 'plaintext' | 'markdown'; - - declare type MarkupContent = { - // The type of the Markup - kind: MarkupKind, - - // The content itself - value: string, - }; - - declare type CompletionItem = { - // The label of this completion item. By default - // also the text that is inserted when selecting - // this completion. - label: string, - // The kind of this completion item. Based of the kind an icon is chosen by the editor. - kind?: number, - // A human-readable string with additional information - // about this item, like type or symbol information. - detail?: string, - // A human-readable string that represents a doc-comment. - documentation?: string | MarkupContent, - // A string that should be used when comparing this item - // with other items. When `falsy` the label is used. - sortText?: string, - // A string that should be used when filtering a set of - // completion items. When `falsy` the label is used. - filterText?: string, - // A string that should be inserted a document when selecting - // this completion. When `falsy` the label is used. - insertText?: string, - // The format of the insert text. The format applies to both the `insertText` property - // and the `newText` property of a provided `textEdit`. - insertTextFormat?: number, - // An edit which is applied to a document when selecting - // this completion. When an edit is provided the value of - // insertText is ignored. - textEdit?: TextEdit, - // An optional array of additional text edits that are applied when - // selecting this completion. Edits must not overlap with the main edit - // nor with themselves. - additionalTextEdits?: TextEdit[], - // An optional command that is executed *after* inserting this completion. *Note* that - // additional modifications to the current document should be described with the - // additionalTextEdits-property. - command?: Command, - // An data entry field that is preserved on a completion item between - // a completion and a completion resolve request. - data?: any, - }; - - // The kind of a completion entry. - declare export var CompletionItemKind: { - Text: 1, - Method: 2, - Function: 3, - Constructor: 4, - Field: 5, - Variable: 6, - Class: 7, - Interface: 8, - Module: 9, - Property: 10, - Unit: 11, - Value: 12, - Enum: 13, - Keyword: 14, - Snippet: 15, - Color: 16, - File: 17, - Reference: 18, - }; - - // The result of a hover request. - declare type Hover = { - // The hover's content - contents: MarkedString | MarkedString[], - // An optional range is a range inside a text document - // that is used to visualize a hover, e.g. by changing the background color. - range?: Range, - }; - - /** - * The marked string is rendered: - * - as markdown if it is represented as a string - * - as code block of the given language if it is represented as a pair of a language and a value - * - * The pair of a language and a value is an equivalent to markdown: - * ```${language}; - * ${value}; - * ``` - */ - declare type MarkedString = string | {language: string, value: string}; - - /** - * Signature help represents the signature of something - * callable. There can be multiple signature but only one - * active and only one active parameter. - */ - declare type SignatureHelp = { - // One or more signatures. - signatures: SignatureInformation[], - // The active signature. - activeSignature?: number, - // The active parameter of the active signature. - activeParameter?: number, - }; - - /** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ - declare type SignatureInformation = { - // The label of this signature. Will be shown in the UI. - label: string, - // The human-readable doc-comment of this signature. Will be shown in the UI but can be omitted. - documentation?: string, - // The parameters of this signature. - parameters?: ParameterInformation[], - }; - - /** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ - declare type ParameterInformation = { - // The label of this parameter. Will be shown in the UI. - label: string, - // The human-readable doc-comment of this parameter. Will be shown in the UI but can be omitted. - documentation?: string, - }; - - declare type ReferenceParams = TextDocumentPositionParams & { - context: ReferenceContext, - }; - - declare type ReferenceContext = { - // Include the declaration of the current symbol. - includeDeclaration: boolean, - }; - - /** - * A document highlight is a range inside a text document which deserves - * special attention. Usually a document highlight is visualized by changing - * the background color of its range. - * - */ - declare type DocumentHighlight = { - // The range this highlight applies to. - range: Range, - // The highlight kind, default is DocumentHighlightKind.Text. - kind?: number, - }; - - declare export var DocumentHighlightKind: { - // A textual occurrance. - Text: 1, - // Read-access of a symbol, like reading a variable. - Read: 2, - // Write-access of a symbol, like writing to a variable. - Write: 3, - }; - - declare type DocumentSymbolParams = { - // The text document. - textDocument: TextDocumentIdentifier, - }; - - /** - * Represents information about programming constructs like variables, classes, - * interfaces etc. - */ - declare type SymbolInformation = { - // The name of this symbol. - name: string, - // The kind of this symbol. - kind: number, - // The location of this symbol. - location: Location, - // The name of the symbol containing this symbol. - containerName?: string, - }; - - declare export var SymbolKind: { - File: 1, - Module: 2, - Namespace: 3, - Package: 4, - Class: 5, - Method: 6, - Property: 7, - Field: 8, - Constructor: 9, - Enum: 10, - Interface: 11, - Function: 12, - Variable: 13, - Constant: 14, - String: 15, - Number: 16, - Boolean: 17, - Array: 18, - }; - - // The parameters of a Workspace Symbol Request. - declare type WorkspaceSymbolParams = { - // A non-empty query string. - query: string, - }; - - // Params for the CodeActionRequest - declare type CodeActionParams = { - // The document in which the command was invoked. - textDocument: TextDocumentIdentifier, - // The range for which the command was invoked. - range: Range, - // Context carrying additional information. - context: CodeActionContext, - }; - - // Contains additional diagnostic information about the context in which a code action is run. - declare type CodeActionContext = { - // An array of diagnostics. - diagnostics: Diagnostic[], - }; - - declare type CodeLensParams = { - // The document to request code lens for. - textDocument: TextDocumentIdentifier, - }; - - /** - * A code lens represents a command that should be shown along with - * source text, like the number of references, a way to run tests, etc. - * - * A code lens is _unresolved_ when no command is associated to it. For performance - * reasons the creation of a code lens and resolving should be done in two stages. - */ - declare type CodeLens = { - // The range in which this code lens is valid. Should only span a single line. - range: Range, - // The command this code lens represents. - command?: Command, - // A data entry field that is preserved on a code lens item between a code lens - // and a code lens resolve request. - data?: any, - }; - - declare type DocumentLinkParams = { - // The document to provide document links for. - textDocument: TextDocumentIdentifier, - }; - - /** - * A document link is a range in a text document that links to an internal or - * external resource, like another - * text document or a web site. - */ - declare type DocumentLink = { - // The range this link applies to. - range: Range, - // The uri this link points to. - target: string, - }; - - declare type DocumentFormattingParams = { - // The document to format. - textDocument: TextDocumentIdentifier, - // The format options. - options: FormattingOptions, - }; - - // Value-object describing what options formatting should use. - declare type FormattingOptions = { - // Signature for further properties. - [key: string]: boolean | number | string, - // Size of a tab in spaces. - tabSize: number, - // Prefer spaces over tabs. - insertSpaces: boolean, - }; - - declare type DocumentRangeFormattingParams = { - // The document to format. - textDocument: TextDocumentIdentifier, - // The range to format. - range: Range, - // The format options. - options: FormattingOptions, - }; - - declare type DocumentOnTypeFormattingParams = { - // The document to format. - textDocument: TextDocumentIdentifier, - // The position at which this request was sent. - position: Position, - // The character that has been typed. - ch: string, - // The format options. - options: FormattingOptions, - }; - - declare type RenameParams = { - // The document to format. - textDocument: TextDocumentIdentifier, - // The position at which this request was sent. - position: Position, - /** - * The new name of the symbol. If the given name is not valid the - * request must return a [ResponseError](#ResponseError) with an - * appropriate message set. - */ - newName: string, - }; - - // TypeCoverageParams: a nuclide-specific way to show type coverage for a file - declare type TypeCoverageParams = { - textDocument: TextDocumentIdentifier, // The text document. - }; - - declare type TypeCoverageResult = { - coveredPercent: number, // what percent of the file is covered? - uncoveredRanges: UncoveredRange[], - }; - - declare type UncoveredRange = { - range: Range, - message: string, // human-readable explanation, maybe with suggested fix - }; - - // Window - - declare type ShowMessageParams = { - // The message type. See {@link MessageType};. - type: number, - // The actual message. - message: string, - }; - - declare export var MessageType: { - // An error message. - Error: 1, - // A warning message. - Warning: 2, - // An information message. - Info: 3, - // A log message. - Log: 4, - }; - - declare type ShowMessageRequestParams = { - // The message type. See {@link MessageType}; - type: number, - // The actual message - message: string, - // The message action items to present. - actions?: MessageActionItem[], - }; - - declare type MessageActionItem = { - // A short title like 'Retry', 'Open Log' etc. - title: string, - }; - - declare type LogMessageParams = { - // The message type. See {@link MessageType}; - type: number, - // The actual message - message: string, - }; - - declare type ProgressParams = { - // The id of this progress report (so we can update/close it) - id: number | string, - // A message/tooltip for this progress report; pass `null` when done. - label: string | null, - }; - - declare type ActionRequiredParams = { - // The id of this action-required report (so we can close it) - id: string | number, - // A message/tooltip. Pass `null` when action is no longer required. - label: string | null, - }; - - // Workspace - - declare type DidChangeConfigurationParams = { - // The actual changed settings - settings: any, - }; - - declare type DidOpenTextDocumentParams = { - // The document that was opened. - textDocument: TextDocumentItem, - }; - - declare type DidChangeTextDocumentParams = { - // The document that did change. The version number points - // to the version after all provided content changes have - // been applied. - textDocument: VersionedTextDocumentIdentifier, - // The actual content changes. - contentChanges: TextDocumentContentChangeEvent[], - }; - - // An event describing a change to a text document. If range and rangeLength are omitted - // the new text is considered to be the full content of the document. - declare type TextDocumentContentChangeEvent = { - // The range of the document that changed. - range?: Range, - // The length of the range that got replaced. - rangeLength?: number, - // The new text of the document. - text: string, - }; - - declare type DidCloseTextDocumentParams = { - // The document that was closed. - textDocument: TextDocumentIdentifier, - }; - - declare type DidSaveTextDocumentParams = { - // The document that was saved. - textDocument: TextDocumentIdentifier, - // Optional the content when saved. Depends on the includeText value - // when the save notifcation was requested. - text: ?string, - }; - - declare type DidChangeWatchedFilesParams = { - // The actual file events. - changes: FileEvent[], - }; - - // The file event type. - declare export var FileChangeType: { - // The file got created. - Created: 1, - // The file got changed. - Changed: 2, - // The file got deleted. - Deleted: 3, - }; - - // An event describing a file change. - declare type FileEvent = { - // The file's URI. - uri: string, - // The change type. - type: number, - }; - - declare type ExecuteCommandParams = { - // The identifier of the actual command handler. - command: string, - // Arguments that the command should be invoked with. - arguments?: any[], - }; - - declare type ApplyWorkspaceEditParams = { - // The edits to apply. - edit: WorkspaceEdit, - }; - - declare type ApplyWorkspaceEditResponse = { - // Indicates whether the edit was applied or not. - applied: boolean, - }; - - declare type TextDocumentEdit = { - // The text document to change. - textDocument: VersionedTextDocumentIdentifier, - // The edits to be applied. - edits: TextEdit[], - }; - - declare interface Message { - jsonrpc: string; - } - - declare type DataCallback = (data: Message) => void; - - declare interface PartialMessageInfo { - +messageToken: number; - +waitingTime: number; - } - - declare export interface MessageReader { - +onError: Event; - +onClose: Event; - +onPartialMessage: Event; - listen(callback: DataCallback): void; - dispose(): void; - } - - declare export interface MessageWriter { - +onError: Event; - +onClose: Event; - write(msg: Message): void; - dispose(): void; - } - - declare export class RequestType { - constructor(type: string): void; - } - - declare export class NotificationType { - constructor(type: string): void; - } - - /** - * A request send from the client to the server to execute a command. The request might return - * a workspace edit which the client will apply to the workspace. - */ - declare export var ExecuteCommandRequest: { - type: 'workspace/executeCommand', - }; -} diff --git a/flow-libs/vscode-uri.js.flow b/flow-libs/vscode-uri.js.flow deleted file mode 100644 index 416687d65b..0000000000 --- a/flow-libs/vscode-uri.js.flow +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -declare module 'vscode-uri' { - /** - * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986. - * This class is a simple parser which creates the basic component paths - * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation - * and encoding. - * - * foo://example.com:8042/over/there?name=ferret#nose - * \_/ \______________/\_________/ \_________/ \__/ - * | | | | | - * scheme authority path query fragment - * | _____________________|__ - * / \ / \ - * urn:example:animal:ferret:nose - * - * - */ - declare export default class URI { - static isUri(thing: mixed): boolean; - /** - * scheme is the 'http' part of 'http://www.msft.com/some/path?query#fragment'. - * The part before the first colon. - */ - +scheme: string; - /** - * authority is the 'www.msft.com' part of 'http://www.msft.com/some/path?query#fragment'. - * The part between the first double slashes and the next slash. - */ - +authority: string; - /** - * path is the '/some/path' part of 'http://www.msft.com/some/path?query#fragment'. - */ - +path: string; - /** - * query is the 'query' part of 'http://www.msft.com/some/path?query#fragment'. - */ - +query: string; - /** - * fragment is the 'fragment' part of 'http://www.msft.com/some/path?query#fragment'. - */ - +fragment: string; - /** - * Returns a string representing the corresponding file system path of this URI. - * Will handle UNC paths and normalize windows drive letters to lower-case. Also - * uses the platform specific path separator. Will *not* validate the path for - * invalid characters and semantics. Will *not* look at the scheme of this URI. - */ - +fsPath: string; - with(change: { - scheme?: string, - authority?: string, - path?: string, - query?: string, - fragment?: string, - }): URI; - static parse(value: string): URI; - static file(path: string): URI; - static from(components: { - scheme?: string, - authority?: string, - path?: string, - query?: string, - fragment?: string, - }): URI; - /** - * - * @param skipEncoding Do not encode the result, default is `false` - */ - toString(skipEncoding?: boolean): string; - toJSON(): any; - static revive(data: any): URI; - } -} diff --git a/flow-libs/vscode.js.flow b/flow-libs/vscode.js.flow deleted file mode 100644 index 52ed47e3de..0000000000 --- a/flow-libs/vscode.js.flow +++ /dev/null @@ -1,7259 +0,0 @@ -// flow-typed signature: bf33a49e587a84791b989cd1f0afd101 -// flow-typed version: b43dff3e0e/vscode_v1.1.10/flow_>=v0.28.x - -declare module 'vscode' { - - /** - * The version of the editor. - */ - declare export var version: string; - - /** - * Represents a reference to a command. Provides a title which - * will be used to represent a command in the UI and, optionally, - * an array of arguments which will be passed to the command handler - * function when invoked. - */ - declare export interface Command { - /** - * Title of the command, like `save`. - */ - title: string; - - /** - * The identifier of the actual command handler. - * @see [commands.registerCommand](#commands.registerCommand). - */ - command: string; - - /** - * A tooltip for for command, when represented in the UI. - */ - tooltip?: string; - - /** - * Arguments that the command handler should be - * invoked with. - */ - arguments?: any[]; - } - - /** - * Represents a line of text, such as a line of source code. - * - * TextLine objects are __immutable__. When a [document](#TextDocument) changes, - * previously retrieved lines will not represent the latest state. - */ - declare export interface TextLine { - - /** - * The zero-based line number. - */ - +lineNumber: number; - - /** - * The text of this line without the line separator characters. - */ - +text: string; - - /** - * The range this line covers without the line separator characters. - */ - +range: Range; - - /** - * The range this line covers with the line separator characters. - */ - +rangeIncludingLineBreak: Range; - - /** - * The offset of the first character which is not a whitespace character as defined - * by `/\s/`. **Note** that if a line is all whitespaces the length of the line is returned. - */ - +firstNonWhitespaceCharacterIndex: number; - - /** - * Whether this line is whitespace only, shorthand - * for [TextLine.firstNonWhitespaceCharacterIndex](#TextLine.firstNonWhitespaceCharacterIndex) === [TextLine.text.length](#TextLine.text). - */ - +isEmptyOrWhitespace: boolean; - } - - /** - * Represents a text document, such as a source file. Text documents have - * [lines](#TextLine) and knowledge about an underlying resource like a file. - */ - declare export interface TextDocument { - - /** - * The associated URI for this document. Most documents have the __file__-scheme, indicating that they - * represent files on disk. However, some documents may have other schemes indicating that they are not - * available on disk. - */ - +uri: Uri; - - /** - * The file system path of the associated resource. Shorthand - * notation for [TextDocument.uri.fsPath](#TextDocument.uri). Independent of the uri scheme. - */ - +fileName: string; - - /** - * Is this document representing an untitled file. - */ - +isUntitled: boolean; - - /** - * The identifier of the language associated with this document. - */ - +languageId: string; - - /** - * The version number of this document (it will strictly increase after each - * change, including undo/redo). - */ - +version: number; - - /** - * `true` if there are unpersisted changes. - */ - +isDirty: boolean; - - /** - * `true` if the document have been closed. A closed document isn't synchronized anymore - * and won't be re-used when the same resource is opened again. - */ - +isClosed: boolean; - - /** - * Save the underlying file. - * - * @return A promise that will resolve to true when the file - * has been saved. If the file was not dirty or the save failed, - * will return false. - */ - save(): Thenable; - - /** - * The [end of line](#EndOfLine) sequence that is predominately - * used in this document. - */ - +eol: EndOfLineType; - - /** - * The number of lines in this document. - */ - +lineCount: number; - - /** - * Returns a text line denoted by the line number. Note - * that the returned object is *not* live and changes to the - * document are not reflected. - * - * @param line A line number in [0, lineCount). - * @return A [line](#TextLine). - */ - lineAt(line: number): TextLine; - - /** - * Returns a text line denoted by the position. Note - * that the returned object is *not* live and changes to the - * document are not reflected. - * - * The position will be [adjusted](#TextDocument.validatePosition). - * - * @see [TextDocument.lineAt](#TextDocument.lineAt) - * @param position A position. - * @return A [line](#TextLine). - */ - lineAt(position: Position): TextLine; - - /** - * Converts the position to a zero-based offset. - * - * The position will be [adjusted](#TextDocument.validatePosition). - * - * @param position A position. - * @return A valid zero-based offset. - */ - offsetAt(position: Position): number; - - /** - * Converts a zero-based offset to a position. - * - * @param offset A zero-based offset. - * @return A valid [position](#Position). - */ - positionAt(offset: number): Position; - - /** - * Get the text of this document. A substring can be retrieved by providing - * a range. The range will be [adjusted](#TextDocument.validateRange). - * - * @param range Include only the text included by the range. - * @return The text inside the provided range or the entire text. - */ - getText(range?: Range): string; - - /** - * Get a word-range at the given position. By default words are defined by - * common separators, like space, -, _, etc. In addition, per languge custom - * [word definitions](#LanguageConfiguration.wordPattern) can be defined. It - * is also possible to provide a custom regular expression. - * - * * *Note 1:* A custom regular expression must not match the empty string and - * if it does, it will be ignored. - * * *Note 2:* A custom regular expression will fail to match multiline strings - * and in the name of speed regular expressions should not match words with - * spaces. Use [`TextLine.text`](#TextLine.text) for more complex, non-wordy, scenarios. - * - * The position will be [adjusted](#TextDocument.validatePosition). - * - * @param position A position. - * @param regex Optional regular expression that describes what a word is. - * @return A range spanning a word, or `undefined`. - */ - getWordRangeAtPosition(position: Position, regex?: RegExp): ?Range; - - /** - * Ensure a range is completely contained in this document. - * - * @param range A range. - * @return The given range or a new, adjusted range. - */ - validateRange(range: Range): Range; - - /** - * Ensure a position is contained in the range of this document. - * - * @param position A position. - * @return The given position or a new, adjusted position. - */ - validatePosition(position: Position): Position; - } - - /** - * Represents a line and character position, such as - * the position of the cursor. - * - * Position objects are __immutable__. Use the [with](#Position.with) or - * [translate](#Position.translate) methods to derive new positions - * from an existing position. - */ - declare export class Position { - - /** - * The zero-based line value. - */ - +line: number; - - /** - * The zero-based character value. - */ - +character: number; - - /** - * @param line A zero-based line value. - * @param character A zero-based character value. - */ - constructor(line: number, character: number): void; - - /** - * Check if this position is before `other`. - * - * @param other A position. - * @return `true` if position is on a smaller line - * or on the same line on a smaller character. - */ - isBefore(other: Position): boolean; - - /** - * Check if this position is before or equal to `other`. - * - * @param other A position. - * @return `true` if position is on a smaller line - * or on the same line on a smaller or equal character. - */ - isBeforeOrEqual(other: Position): boolean; - - /** - * Check if this position is after `other`. - * - * @param other A position. - * @return `true` if position is on a greater line - * or on the same line on a greater character. - */ - isAfter(other: Position): boolean; - - /** - * Check if this position is after or equal to `other`. - * - * @param other A position. - * @return `true` if position is on a greater line - * or on the same line on a greater or equal character. - */ - isAfterOrEqual(other: Position): boolean; - - /** - * Check if this position is equal to `other`. - * - * @param other A position. - * @return `true` if the line and character of the given position are equal to - * the line and character of this position. - */ - isEqual(other: Position): boolean; - - /** - * Compare this to `other`. - * - * @param other A position. - * @return A number smaller than zero if this position is before the given position, - * a number greater than zero if this position is after the given position, or zero when - * this and the given position are equal. - */ - compareTo(other: Position): number; - - /** - * Create a new position relative to this position. - * - * @param lineDelta Delta value for the line value, default is `0`. - * @param characterDelta Delta value for the character value, default is `0`. - * @return A position which line and character is the sum of the current line and - * character and the corresponding deltas. - */ - translate(lineDelta?: number, characterDelta?: number): Position; - - /** - * Derived a new position relative to this position. - * - * @param change An object that describes a delta to this position. - * @return A position that reflects the given delta. Will return `this` position if the change - * is not changing anything. - */ - translate(change: { lineDelta?: number; characterDelta?: number; }): Position; - - /** - * Create a new position derived from this position. - * - * @param line Value that should be used as line value, default is the [existing value](#Position.line) - * @param character Value that should be used as character value, default is the [existing value](#Position.character) - * @return A position where line and character are replaced by the given values. - */ - with(line?: number, character?: number): Position; - - /** - * Derived a new position from this position. - * - * @param change An object that describes a change to this position. - * @return A position that reflects the given change. Will return `this` position if the change - * is not changing anything. - */ - with(change: { line?: number; character?: number; }): Position; - } - - /** - * A range represents an ordered pair of two positions. - * It is guaranteed that [start](#Range.start).isBeforeOrEqual([end](#Range.end)) - * - * Range objects are __immutable__. Use the [with](#Range.with), - * [intersection](#Range.intersection), or [union](#Range.union) methods - * to derive new ranges from an existing range. - */ - declare export class Range { - - /** - * The start position. It is before or equal to [end](#Range.end). - */ - +start: Position; - - /** - * The end position. It is after or equal to [start](#Range.start). - */ - +end: Position; - - /** - * Create a new range from two positions. If `start` is not - * before or equal to `end`, the values will be swapped. - * - * @param start A position. - * @param end A position. - */ - constructor(start: Position, end: Position): void; - - /** - * Create a new range from number coordinates. It is a shorter equivalent of - * using `new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter))` - * - * @param startLine A zero-based line value. - * @param startCharacter A zero-based character value. - * @param endLine A zero-based line value. - * @param endCharacter A zero-based character value. - */ - constructor(startLine: number, startCharacter: number, endLine: number, endCharacter: number): void; - - /** - * `true` if `start` and `end` are equal. - */ - isEmpty: boolean; - - /** - * `true` if `start.line` and `end.line` are equal. - */ - isSingleLine: boolean; - - /** - * Check if a position or a range is contained in this range. - * - * @param positionOrRange A position or a range. - * @return `true` if the position or range is inside or equal - * to this range. - */ - contains(positionOrRange: Position | Range): boolean; - - /** - * Check if `other` equals this range. - * - * @param other A range. - * @return `true` when start and end are [equal](#Position.isEqual) to - * start and end of this range. - */ - isEqual(other: Range): boolean; - - /** - * Intersect `range` with this range and returns a new range or `undefined` - * if the ranges have no overlap. - * - * @param range A range. - * @return A range of the greater start and smaller end positions. Will - * return undefined when there is no overlap. - */ - intersection(range: Range): ?Range; - - /** - * Compute the union of `other` with this range. - * - * @param other A range. - * @return A range of smaller start position and the greater end position. - */ - union(other: Range): Range; - - /** - * Derived a new range from this range. - * - * @param start A position that should be used as start. The default value is the [current start](#Range.start). - * @param end A position that should be used as end. The default value is the [current end](#Range.end). - * @return A range derived from this range with the given start and end position. - * If start and end are not different `this` range will be returned. - */ - with(start?: Position, end?: Position): Range; - - /** - * Derived a new range from this range. - * - * @param change An object that describes a change to this range. - * @return A range that reflects the given change. Will return `this` range if the change - * is not changing anything. - */ - with(change: { start?: Position, end?: Position }): Range; - } - - /** - * Represents a text selection in an editor. - */ - declare export class Selection extends Range { - - /** - * The position at which the selection starts. - * This position might be before or after [active](#Selection.active). - */ - anchor: Position; - - /** - * The position of the cursor. - * This position might be before or after [anchor](#Selection.anchor). - */ - active: Position; - - /** - * Create a selection from two postions. - * - * @param anchor A position. - * @param active A position. - */ - constructor(anchor: Position, active: Position): void; - - /** - * Create a selection from four coordinates. - * - * @param anchorLine A zero-based line value. - * @param anchorCharacter A zero-based character value. - * @param activeLine A zero-based line value. - * @param activeCharacter A zero-based character value. - */ - constructor(anchorLine: number, anchorCharacter: number, activeLine: number, activeCharacter: number): void; - - /** - * A selection is reversed if [active](#Selection.active).isBefore([anchor](#Selection.anchor)). - */ - isReversed: boolean; - } - - /** - * Represents sources that can cause [selection change events](#window.onDidChangeTextEditorSelection). - */ - declare export var TextEditorSelectionChangeKind: { - /** - * Selection changed due to typing in the editor. - */ - +Keyboard: 1, - /** - * Selection change due to clicking in the editor. - */ - +Mouse: 2, - /** - * Selection changed because a command ran. - */ - +Command: 3 - } - declare export type TextEditorSelectionChangeKindType = $Values; - - /** - * Represents an event describing the change in a [text editor's selections](#TextEditor.selections). - */ - declare export interface TextEditorSelectionChangeEvent { - /** - * The [text editor](#TextEditor) for which the selections have changed. - */ - textEditor: TextEditor; - /** - * The new value for the [text editor's selections](#TextEditor.selections). - */ - selections: Selection[]; - /** - * The [change kind](#TextEditorSelectionChangeKind) which has triggered this - * event. Can be `undefined`. - */ - kind?: TextEditorSelectionChangeKindType; - } - - /** - * Represents an event describing the change in a [text editor's options](#TextEditor.options). - */ - declare export interface TextEditorOptionsChangeEvent { - /** - * The [text editor](#TextEditor) for which the options have changed. - */ - textEditor: TextEditor; - /** - * The new value for the [text editor's options](#TextEditor.options). - */ - options: TextEditorOptions; - } - - /** - * Represents an event describing the change of a [text editor's view column](#TextEditor.viewColumn). - */ - declare export interface TextEditorViewColumnChangeEvent { - /** - * The [text editor](#TextEditor) for which the options have changed. - */ - textEditor: TextEditor; - /** - * The new value for the [text editor's view column](#TextEditor.viewColumn). - */ - viewColumn: ViewColumnType; - } - - /** - * Rendering style of the cursor. - */ - declare export var TextEditorCursorStyle: { - /** - * Render the cursor as a vertical thick line. - */ - +Line: 1, - /** - * Render the cursor as a block filled. - */ - +Block: 2, - /** - * Render the cursor as a thick horizontal line. - */ - +Underline: 3, - /** - * Render the cursor as a vertical thin line. - */ - +LineThin: 4, - /** - * Render the cursor as a block outlined. - */ - +BlockOutline: 5, - /** - * Render the cursor as a thin horizontal line. - */ - +UnderlineThin: 6 - }; - declare export type TextEditorCursorStyleType = $Values; - - /** - * Rendering style of the line numbers. - */ - declare export var TextEditorLineNumbersStyle: { - /** - * Do not render the line numbers. - */ - +Off: 0, - /** - * Render the line numbers. - */ - +On: 1, - /** - * Render the line numbers with values relative to the primary cursor location. - */ - +Relative: 2 - } - declare export type TextEditorLineNumbersStyleType = $Values; - - /** - * Represents a [text editor](#TextEditor)'s [options](#TextEditor.options). - */ - declare export interface TextEditorOptions { - - /** - * The size in spaces a tab takes. This is used for two purposes: - * - the rendering width of a tab character; - * - the number of spaces to insert when [insertSpaces](#TextEditorOptions.insertSpaces) is true. - * - * When getting a text editor's options, this property will always be a number (resolved). - * When setting a text editor's options, this property is optional and it can be a number or `"auto"`. - */ - tabSize?: number | string; - - /** - * When pressing Tab insert [n](#TextEditorOptions.tabSize) spaces. - * When getting a text editor's options, this property will always be a boolean (resolved). - * When setting a text editor's options, this property is optional and it can be a boolean or `"auto"`. - */ - insertSpaces?: boolean | string; - - /** - * The rendering style of the cursor in this editor. - * When getting a text editor's options, this property will always be present. - * When setting a text editor's options, this property is optional. - */ - cursorStyle?: TextEditorCursorStyleType; - - /** - * Render relative line numbers w.r.t. the current line number. - * When getting a text editor's options, this property will always be present. - * When setting a text editor's options, this property is optional. - */ - lineNumbers?: TextEditorLineNumbersStyleType; - } - - /** - * Represents a handle to a set of decorations - * sharing the same [styling options](#DecorationRenderOptions) in a [text editor](#TextEditor). - * - * To get an instance of a `TextEditorDecorationType` use - * [createTextEditorDecorationType](#window.createTextEditorDecorationType). - */ - declare export interface TextEditorDecorationType { - - /** - * Internal representation of the handle. - */ - +key: string; - - /** - * Remove this decoration type and all decorations on all text editors using it. - */ - dispose(): void; - } - - /** - * Represents different [reveal](#TextEditor.revealRange) strategies in a text editor. - */ - declare export var TextEditorRevealType: { - /** - * The range will be revealed with as little scrolling as possible. - */ - +Default: 0, - /** - * The range will always be revealed in the center of the viewport. - */ - +InCenter: 1, - /** - * If the range is outside the viewport, it will be revealed in the center of the viewport. - * Otherwise, it will be revealed with as little scrolling as possible. - */ - +InCenterIfOutsideViewport: 2, - /** - * The range will always be revealed at the top of the viewport. - */ - +AtTop: 3 - } - declare export type TextEditorRevealTypeType = $Values; - - /** - * Represents different positions for rendering a decoration in an [overview ruler](#DecorationRenderOptions.overviewRulerLane). - * The overview ruler supports three lanes. - */ - declare export var OverviewRulerLane: { - +Left: 1, - +Center: 2, - +Right: 4, - +Full: 7 - } - declare export type OverviewRulerLaneType = $Values; - - /** - * Describes the behavior of decorations when typing/editing at their edges. - */ - declare export var DecorationRangeBehavior: { - /** - * The decoration's range will widen when edits occur at the start or end. - */ - +OpenOpen: 0, - /** - * The decoration's range will not widen when edits occur at the start of end. - */ - +ClosedClosed: 1, - /** - * The decoration's range will widen when edits occur at the start, but not at the end. - */ - +OpenClosed: 2, - /** - * The decoration's range will widen when edits occur at the end, but not at the start. - */ - +ClosedOpen: 3 - } - declare export type DecorationRangeBehaviorType = $Values; - - /** - * Represents options to configure the behavior of showing a [document](#TextDocument) in an [editor](#TextEditor). - */ - declare export interface TextDocumentShowOptions { - /** - * An optional view column in which the [editor](#TextEditor) should be shown. - * The default is the [one](#ViewColumn.One), other values are adjusted to - * be `Min(column, columnCount + 1)`, the [active](#ViewColumn.Active)-column is - * not adjusted. - */ - viewColumn?: ViewColumnType; - - /** - * An optional flag that when `true` will stop the [editor](#TextEditor) from taking focus. - */ - preserveFocus?: boolean; - - /** - * An optional flag that controls if an [editor](#TextEditor)-tab will be replaced - * with the next editor or if it will be kept. - */ - preview?: boolean; - - /** - * An optional selection to apply for the document in the [editor](#TextEditor). - */ - selection?: Range; - } - - /** - * A reference to one of the workbench colors as defined in https://code.visualstudio.com/docs/getstarted/theme-color-reference. - * Using a theme color is preferred over a custom color as it gives theme authors and users the possibility to change the color. - */ - declare export class ThemeColor { - - /** - * Creates a reference to a theme color. - * @param id of the color. The available colors are listed in https://code.visualstudio.com/docs/getstarted/theme-color-reference. - */ - constructor(id: string): void; - } - - /** - * Represents theme specific rendering styles for a [text editor decoration](#TextEditorDecorationType). - */ - declare export interface ThemableDecorationRenderOptions { - /** - * Background color of the decoration. Use rgba() and define transparent background colors to play well with other decorations. - * Alternatively a color from the color registry can be [referenced](#ThemeColor). - */ - backgroundColor?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - outline?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'outline' for setting one or more of the individual outline properties. - */ - outlineColor?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'outline' for setting one or more of the individual outline properties. - */ - outlineStyle?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'outline' for setting one or more of the individual outline properties. - */ - outlineWidth?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - border?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderColor?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderRadius?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderSpacing?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderStyle?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderWidth?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - fontStyle?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - fontWeight?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - textDecoration?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - cursor?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - color?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - letterSpacing?: string; - - /** - * An **absolute path** or an URI to an image to be rendered in the gutter. - */ - gutterIconPath?: string | Uri; - - /** - * Specifies the size of the gutter icon. - * Available values are 'auto', 'contain', 'cover' and any percentage value. - * For further information: https://msdn.microsoft.com/en-us/library/jj127316(v=vs.85).aspx - */ - gutterIconSize?: string; - - /** - * The color of the decoration in the overview ruler. Use rgba() and define transparent colors to play well with other decorations. - */ - overviewRulerColor?: string | ThemeColor; - - /** - * Defines the rendering options of the attachment that is inserted before the decorated text - */ - before?: ThemableDecorationAttachmentRenderOptions; - - /** - * Defines the rendering options of the attachment that is inserted after the decorated text - */ - after?: ThemableDecorationAttachmentRenderOptions; - } - - declare export interface ThemableDecorationAttachmentRenderOptions { - /** - * Defines a text content that is shown in the attachment. Either an icon or a text can be shown, but not both. - */ - contentText?: string; - /** - * An **absolute path** or an URI to an image to be rendered in the attachment. Either an icon - * or a text can be shown, but not both. - */ - contentIconPath?: string | Uri; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - border?: string; - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - borderColor?: string | ThemeColor; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - fontStyle?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - fontWeight?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - textDecoration?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - color?: string | ThemeColor; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - backgroundColor?: string | ThemeColor; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - margin?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - width?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - height?: string; - } - - /** - * Represents rendering styles for a [text editor decoration](#TextEditorDecorationType). - */ - declare export interface DecorationRenderOptions extends ThemableDecorationRenderOptions { - /** - * Should the decoration be rendered also on the whitespace after the line text. - * Defaults to `false`. - */ - isWholeLine?: boolean; - - /** - * Customize the growing behavior of the decoration when edits occur at the edges of the decoration's range. - * Defaults to `DecorationRangeBehavior.OpenOpen`. - */ - rangeBehavior?: DecorationRangeBehaviorType; - - /** - * The position in the overview ruler where the decoration should be rendered. - */ - overviewRulerLane?: OverviewRulerLaneType; - - /** - * Overwrite options for light themes. - */ - light?: ThemableDecorationRenderOptions; - - /** - * Overwrite options for dark themes. - */ - dark?: ThemableDecorationRenderOptions; - } - - /** - * Represents options for a specific decoration in a [decoration set](#TextEditorDecorationType). - */ - declare export interface DecorationOptions { - - /** - * Range to which this decoration is applied. The range must not be empty. - */ - range: Range; - - /** - * A message that should be rendered when hovering over the decoration. - */ - hoverMessage?: MarkedString | MarkedString[]; - - /** - * Render options applied to the current decoration. For performance reasons, keep the - * number of decoration specific options small, and use decoration types whereever possible. - */ - renderOptions?: DecorationInstanceRenderOptions; - } - - declare export interface ThemableDecorationInstanceRenderOptions { - /** - * Defines the rendering options of the attachment that is inserted before the decorated text - */ - before?: ThemableDecorationAttachmentRenderOptions; - - /** - * Defines the rendering options of the attachment that is inserted after the decorated text - */ - after?: ThemableDecorationAttachmentRenderOptions; - } - - declare export interface DecorationInstanceRenderOptions extends ThemableDecorationInstanceRenderOptions { - /** - * Overwrite options for light themes. - */ - light?: ThemableDecorationInstanceRenderOptions; - - /** - * Overwrite options for dark themes. - */ - dark?: ThemableDecorationInstanceRenderOptions; - } - - /** - * Represents an editor that is attached to a [document](#TextDocument). - */ - declare export interface TextEditor { - - /** - * The document associated with this text editor. The document will be the same for the entire lifetime of this text editor. - */ - document: TextDocument; - - /** - * The primary selection on this text editor. Shorthand for `TextEditor.selections[0]`. - */ - selection: Selection; - - /** - * The selections in this text editor. The primary selection is always at index 0. - */ - selections: Selection[]; - - /** - * Text editor options. - */ - options: TextEditorOptions; - - /** - * The column in which this editor shows. Will be `undefined` in case this - * isn't one of the three main editors, e.g an embedded editor. - */ - viewColumn?: ViewColumnType; - - /** - * Perform an edit on the document associated with this text editor. - * - * The given callback-function is invoked with an [edit-builder](#TextEditorEdit) which must - * be used to make edits. Note that the edit-builder is only valid while the - * callback executes. - * - * @param callback A function which can create edits using an [edit-builder](#TextEditorEdit). - * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit. - * @return A promise that resolves with a value indicating if the edits could be applied. - */ - edit(callback: (editBuilder: TextEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable; - - /** - * Insert a [snippet](#SnippetString) and put the editor into snippet mode. "Snippet mode" - * means the editor adds placeholders and additionals cursors so that the user can complete - * or accept the snippet. - * - * @param snippet The snippet to insert in this edit. - * @param location Position or range at which to insert the snippet, defaults to the current editor selection or selections. - * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit. - * @return A promise that resolves with a value indicating if the snippet could be inserted. Note that the promise does not signal - * that the snippet is completely filled-in or accepted. - */ - insertSnippet(snippet: SnippetString, location?: Position | Range | Position[] | Range[], options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable; - - /** - * Adds a set of decorations to the text editor. If a set of decorations already exists with - * the given [decoration type](#TextEditorDecorationType), they will be replaced. - * - * @see [createTextEditorDecorationType](#window.createTextEditorDecorationType). - * - * @param decorationType A decoration type. - * @param rangesOrOptions Either [ranges](#Range) or more detailed [options](#DecorationOptions). - */ - setDecorations(decorationType: TextEditorDecorationType, rangesOrOptions: Range[] | DecorationOptions[]): void; - - /** - * Scroll as indicated by `revealType` in order to reveal the given range. - * - * @param range A range. - * @param revealType The scrolling strategy for revealing `range`. - */ - revealRange(range: Range, revealType?: TextEditorRevealTypeType): void; - } - - /** - * Represents an end of line character sequence in a [document](#TextDocument). - */ - declare export var EndOfLine: { - /** - * The line feed `\n` character. - */ - +LF: 1, - /** - * The carriage return line feed `\r\n` sequence. - */ - +CRLF: 2 - } - declare export type EndOfLineType = $Values; - - /** - * A complex edit that will be applied in one transaction on a TextEditor. - * This holds a description of the edits and if the edits are valid (i.e. no overlapping regions, document was not changed in the meantime, etc.) - * they can be applied on a [document](#TextDocument) associated with a [text editor](#TextEditor). - * - */ - declare export interface TextEditorEdit { - /** - * Replace a certain text region with a new value. - * You can use \r\n or \n in `value` and they will be normalized to the current [document](#TextDocument). - * - * @param location The range this operation should remove. - * @param value The new text this operation should insert after removing `location`. - */ - replace(location: Position | Range | Selection, value: string): void; - - /** - * Insert text at a location. - * You can use \r\n or \n in `value` and they will be normalized to the current [document](#TextDocument). - * Although the equivalent text edit can be made with [replace](#TextEditorEdit.replace), `insert` will produce a different resulting selection (it will get moved). - * - * @param location The position where the new text should be inserted. - * @param value The new text this operation should insert. - */ - insert(location: Position, value: string): void; - - /** - * Delete a certain text region. - * - * @param location The range this operation should remove. - */ - delete(location: Range | Selection): void; - - /** - * Set the end of line sequence. - * - * @param endOfLine The new end of line for the [document](#TextDocument). - */ - setEndOfLine(endOfLine: EndOfLineType): void; - } - - /** - * A universal resource identifier representing either a file on disk - * or another resource, like untitled resources. - */ - declare export class Uri { - - /** - * Create an URI from a file system path. The [scheme](#Uri.scheme) - * will be `file`. - * - * @param path A file system or UNC path. - * @return A new Uri instance. - */ - static file(path: string): Uri; - - /** - * Create an URI from a string. Will throw if the given value is not - * valid. - * - * @param value The string value of an Uri. - * @return A new Uri instance. - */ - static parse(value: string): Uri; - - /** - * Use the `file` and `parse` factory functions to create new `Uri` objects. - */ - // private constructor(scheme: string, authority: string, path: string, query: string, fragment: string): void; - - /** - * Scheme is the `http` part of `http://www.msft.com/some/path?query#fragment`. - * The part before the first colon. - */ - +scheme: string; - - /** - * Authority is the `www.msft.com` part of `http://www.msft.com/some/path?query#fragment`. - * The part between the first double slashes and the next slash. - */ - +authority: string; - - /** - * Path is the `/some/path` part of `http://www.msft.com/some/path?query#fragment`. - */ - +path: string; - - /** - * Query is the `query` part of `http://www.msft.com/some/path?query#fragment`. - */ - +query: string; - - /** - * Fragment is the `fragment` part of `http://www.msft.com/some/path?query#fragment`. - */ - +fragment: string; - - /** - * The string representing the corresponding file system path of this Uri. - * - * Will handle UNC paths and normalize windows drive letters to lower-case. Also - * uses the platform specific path separator. Will *not* validate the path for - * invalid characters and semantics. Will *not* look at the scheme of this Uri. - */ - +fsPath: string; - - /** - * Derive a new Uri from this Uri. - * - * ```ts - * let file = Uri.parse('before:some/file/path'); - * let other = file.with({ scheme: 'after' }); - * assert.ok(other.toString() === 'after:some/file/path'); - * ``` - * - * @param change An object that describes a change to this Uri. To unset components use `null` or - * the empty string. - * @return A new Uri that reflects the given change. Will return `this` Uri if the change - * is not changing anything. - */ - with(change: { scheme?: string; authority?: string; path?: string; query?: string; fragment?: string }): Uri; - - /** - * Returns a string representation of this Uri. The representation and normalization - * of a URI depends on the scheme. The resulting string can be safely used with - * [Uri.parse](#Uri.parse). - * - * @param skipEncoding Do not percentage-encode the result, defaults to `false`. Note that - * the `#` and `?` characters occuring in the path will always be encoded. - * @returns A string representation of this Uri. - */ - toString(skipEncoding?: boolean): string; - - /** - * Returns a JSON representation of this Uri. - * - * @return An object. - */ - toJSON(): any; - } - - /** - * A cancellation token is passed to an asynchronous or long running - * operation to request cancellation, like cancelling a request - * for completion items because the user continued to type. - * - * To get an instance of a `CancellationToken` use a - * [CancellationTokenSource](#CancellationTokenSource). - */ - declare export interface CancellationToken { - - /** - * Is `true` when the token has been cancelled, `false` otherwise. - */ - isCancellationRequested: boolean; - - /** - * An [event](#Event) which fires upon cancellation. - */ - onCancellationRequested: Event; - } - - /** - * A cancellation source creates and controls a [cancellation token](#CancellationToken). - */ - declare export class CancellationTokenSource { - - /** - * The cancellation token of this source. - */ - token: CancellationToken; - - /** - * Signal cancellation on the token. - */ - cancel(): void; - - /** - * Dispose object and free resources. Will call [cancel](#CancellationTokenSource.cancel). - */ - dispose(): void; - } - - declare export type IDisposable = { - dispose(): any; - }; - - /** - * Represents a type which can release resources, such - * as event listening or a timer. - */ - declare export class Disposable { - - /** - * Combine many disposable-likes into one. Use this method - * when having objects with a dispose function which are not - * instances of Disposable. - * - * @param disposableLikes Objects that have at least a `dispose`-function member. - * @return Returns a new disposable which, upon dispose, will - * dispose all provided disposables. - */ - static from(...disposableLikes: { +dispose: () => any }[]): Disposable; - - /** - * Creates a new Disposable calling the provided function - * on dispose. - * @param callOnDispose Function that disposes something. - */ - constructor(callOnDispose: Function): void; - - /** - * Dispose this object. - */ - dispose(): any; - } - - /** - * Represents a typed event. - * - * A function that represents an event to which you subscribe by calling it with - * a listener function as argument. - * - * @sample `item.onDidChange(function(event) { console.log("Event happened: " + event); });` - */ - declare export interface Event { - - /** - * A function that represents an event to which you subscribe by calling it with - * a listener function as argument. - * - * @param listener The listener function will be called when the event happens. - * @param thisArgs The `this`-argument which will be used when calling the event listener. - * @param disposables An array to which a [disposable](#Disposable) will be added. - * @return A disposable which unsubscribes the event listener. - */ - (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]): Disposable; - } - - /** - * An event emitter can be used to create and manage an [event](#Event) for others - * to subscribe to. One emitter always owns one event. - * - * Use this class if you want to provide event from within your extension, for instance - * inside a [TextDocumentContentProvider](#TextDocumentContentProvider) or when providing - * API to other extensions. - */ - declare export class EventEmitter { - - /** - * The event listeners can subscribe to. - */ - event: Event; - - /** - * Notify all subscribers of the [event](EventEmitter#event). Failure - * of one or more listener will not fail this function call. - * - * @param data The event object. - */ - fire(data?: T): void; - - /** - * Dispose this object and free resources. - */ - dispose(): void; - } - - /** - * A file system watcher notifies about changes to files and folders - * on disk. - * - * To get an instance of a `FileSystemWatcher` use - * [createFileSystemWatcher](#workspace.createFileSystemWatcher). - */ - declare export interface FileSystemWatcher extends Disposable { - - /** - * true if this file system watcher has been created such that - * it ignores creation file system events. - */ - ignoreCreateEvents: boolean; - - /** - * true if this file system watcher has been created such that - * it ignores change file system events. - */ - ignoreChangeEvents: boolean; - - /** - * true if this file system watcher has been created such that - * it ignores delete file system events. - */ - ignoreDeleteEvents: boolean; - - /** - * An event which fires on file/folder creation. - */ - onDidCreate: Event; - - /** - * An event which fires on file/folder change. - */ - onDidChange: Event; - - /** - * An event which fires on file/folder deletion. - */ - onDidDelete: Event; - } - - /** - * A text document content provider allows to add documents - * to the editor, such as source from a dll or generated html from md. - * - * Content providers are [registered](#workspace.registerTextDocumentContentProvider) - * for a [uri-scheme](#Uri.scheme). When a uri with that scheme is to - * be [loaded](#workspace.openTextDocument) the content provider is - * asked. - */ - declare export interface TextDocumentContentProvider { - - /** - * An event to signal a resource has changed. - */ - onDidChange?: Event; - - /** - * Provide textual content for a given uri. - * - * The editor will use the returned string-content to create a readonly - * [document](#TextDocument). Resources allocated should be released when - * the corresponding document has been [closed](#workspace.onDidCloseTextDocument). - * - * @param uri An uri which scheme matches the scheme this provider was [registered](#workspace.registerTextDocumentContentProvider) for. - * @param token A cancellation token. - * @return A string or a thenable that resolves to such. - */ - provideTextDocumentContent(uri: Uri, token: CancellationToken): ProviderResult; - } - - /** - * Represents an item that can be selected from - * a list of items. - */ - declare export interface QuickPickItem { - - /** - * A human readable string which is rendered prominent. - */ - label: string; - - /** - * A human readable string which is rendered less prominent. - */ - description: string; - - /** - * A human readable string which is rendered less prominent. - */ - detail?: string; - } - - /** - * Options to configure the behavior of the quick pick UI. - */ - declare export interface QuickPickOptions { - /** - * An optional flag to include the description when filtering the picks. - */ - matchOnDescription?: boolean; - - /** - * An optional flag to include the detail when filtering the picks. - */ - matchOnDetail?: boolean; - - /** - * An optional string to show as place holder in the input box to guide the user what to pick on. - */ - placeHolder?: string; - - /** - * Set to `true` to keep the picker open when focus moves to another part of the editor or to another window. - */ - ignoreFocusOut?: boolean; - - /** - * An optional function that is invoked whenever an item is selected. - */ - +onDidSelectItem?: (item: QuickPickItem | string) => any; - } - - /** - * Options to configure the behaviour of the [workspace folder](#WorkspaceFolder) pick UI. - */ - declare export interface WorkspaceFolderPickOptions { - - /** - * An optional string to show as place holder in the input box to guide the user what to pick on. - */ - placeHolder?: string; - - /** - * Set to `true` to keep the picker open when focus moves to another part of the editor or to another window. - */ - ignoreFocusOut?: boolean; - } - - /** - * Options to configure the behaviour of a file open dialog. - * - * * Note 1: A dialog can select files, folders, or both. This is not true for Windows - * which enforces to open either files or folder, but *not both*. - * * Note 2: Explictly setting `canSelectFiles` and `canSelectFolders` to `false` is futile - * and the editor then silently adjusts the options to select files. - */ - declare export interface OpenDialogOptions { - /** - * The resource the dialog shows when opened. - */ - defaultUri?: Uri; - - /** - * A human-readable string for the open button. - */ - openLabel?: string; - - /** - * Allow to select files, defaults to `true`. - */ - canSelectFiles?: boolean; - - /** - * Allow to select folders, defaults to `false`. - */ - canSelectFolders?: boolean; - - /** - * Allow to select many files or folders. - */ - canSelectMany?: boolean; - - /** - * A set of file filters that are used by the dialog. Each entry is a human readable label, - * like "TypeScript", and an array of extensions, e.g. - * ```ts - * { - * 'Images': ['png', 'jpg'] - * 'TypeScript': ['ts', 'tsx'] - * } - * ``` - */ - filters?: { [name: string]: string[] }; - } - - /** - * Options to configure the behaviour of a file save dialog. - */ - declare export interface SaveDialogOptions { - /** - * The resource the dialog shows when opened. - */ - defaultUri?: Uri; - - /** - * A human-readable string for the save button. - */ - saveLabel?: string; - - /** - * A set of file filters that are used by the dialog. Each entry is a human readable label, - * like "TypeScript", and an array of extensions, e.g. - * ```ts - * { - * 'Images': ['png', 'jpg'] - * 'TypeScript': ['ts', 'tsx'] - * } - * ``` - */ - filters?: { [name: string]: string[] }; - } - - /** - * Represents an action that is shown with an information, warning, or - * error message. - * - * @see [showInformationMessage](#window.showInformationMessage) - * @see [showWarningMessage](#window.showWarningMessage) - * @see [showErrorMessage](#window.showErrorMessage) - */ - declare export interface MessageItem { - - /** - * A short title like 'Retry', 'Open Log' etc. - */ - title: string; - - /** - * Indicates that this item replaces the default - * 'Close' action. - */ - isCloseAffordance?: boolean; - } - - /** - * Options to configure the behavior of the message. - * - * @see [showInformationMessage](#window.showInformationMessage) - * @see [showWarningMessage](#window.showWarningMessage) - * @see [showErrorMessage](#window.showErrorMessage) - */ - declare export interface MessageOptions { - - /** - * Indicates that this message should be modal. - */ - modal?: boolean; - } - - /** - * Options to configure the behavior of the input box UI. - */ - declare export interface InputBoxOptions { - - /** - * The value to prefill in the input box. - */ - value?: string; - - /** - * Selection of the prefilled [`value`](#InputBoxOptions.value). Defined as tuple of two number where the - * first is the inclusive start index and the second the exclusive end index. When `undefined` the whole - * word will be selected, when empty (start equals end) only the cursor will be set, - * otherwise the defined range will be selected. - */ - valueSelection?: [number, number]; - - /** - * The text to display underneath the input box. - */ - prompt?: string; - - /** - * An optional string to show as place holder in the input box to guide the user what to type. - */ - placeHolder?: string; - - /** - * Set to `true` to show a password prompt that will not show the typed value. - */ - password?: boolean; - - /** - * Set to `true` to keep the input box open when focus moves to another part of the editor or to another window. - */ - ignoreFocusOut?: boolean; - - /** - * An optional function that will be called to validate input and to give a hint - * to the user. - * - * @param value The current value of the input box. - * @return A human readable string which is presented as diagnostic message. - * Return `undefined`, `null`, or the empty string when 'value' is valid. - */ - +validateInput?: (value: string) => ?string | Thenable; - } - - /** - * A relative pattern is a helper to construct glob patterns that are matched - * relatively to a base path. The base path can either be an absolute file path - * or a [workspace folder](#WorkspaceFolder). - */ - declare export class RelativePattern { - - /** - * A base file path to which this pattern will be matched against relatively. - */ - base: string; - - /** - * A file glob pattern like `*.{ts,js}` that will be matched on file paths - * relative to the base path. - * - * Example: Given a base of `/home/work/folder` and a file path of `/home/work/folder/index.js`, - * the file glob pattern will match on `index.js`. - */ - pattern: string; - - /** - * Creates a new relative pattern object with a base path and pattern to match. This pattern - * will be matched on file paths relative to the base path. - * - * @param base A base file path to which this pattern will be matched against relatively. - * @param pattern A file glob pattern like `*.{ts,js}` that will be matched on file paths - * relative to the base path. - */ - constructor(base: WorkspaceFolder | string, pattern: string): void - } - - /** - * A file glob pattern to match file paths against. This can either be a glob pattern string - * (like `**​/*.{ts,js}` or `*.{ts,js}`) or a [relative pattern](#RelativePattern). - * - * Glob patterns can have the following syntax: - * * `*` to match one or more characters in a path segment - * * `?` to match on one character in a path segment - * * `**` to match any number of path segments, including none - * * `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files) - * * `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …) - * * `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`) - */ - declare export type GlobPattern = string | RelativePattern; - - /** - * A document filter denotes a document by different properties like - * the [language](#TextDocument.languageId), the [scheme](#Uri.scheme) of - * its resource, or a glob-pattern that is applied to the [path](#TextDocument.fileName). - * - * @sample A language filter that applies to typescript files on disk: `{ language: 'typescript', scheme: 'file' }` - * @sample A language filter that applies to all package.json paths: `{ language: 'json', pattern: '**​/package.json' }` - */ - declare export interface DocumentFilter { - - /** - * A language id, like `typescript`. - */ - language?: string; - - /** - * A Uri [scheme](#Uri.scheme), like `file` or `untitled`. - */ - scheme?: string; - - /** - * A [glob pattern](#GlobPattern) that is matched on the absolute path of the document. Use a [relative pattern](#RelativePattern) - * to filter documents to a [workspace folder](#WorkspaceFolder). - */ - pattern?: GlobPattern; - } - - /** - * A language selector is the combination of one or many language identifiers - * and [language filters](#DocumentFilter). - * - * @sample `let sel:DocumentSelector = 'typescript'`; - * @sample `let sel:DocumentSelector = ['typescript', { language: 'json', pattern: '**​/tsconfig.json' }]`; - */ - declare export type DocumentSelector = string | DocumentFilter | (string | DocumentFilter)[]; - - /** - * A provider result represents the values a provider, like the [`HoverProvider`](#HoverProvider), - * may return. For once this is the actual result type `T`, like `Hover`, or a thenable that resolves - * to that type `T`. In addition, `null` and `undefined` can be returned - either directly or from a - * thenable. - * - * The snippets below are all valid implementions of the [`HoverProvider`](#HoverProvider): - * - * ```ts - * let a: HoverProvider = { - * provideHover(doc, pos, token): ProviderResult { - * return new Hover('Hello World'); - * } - * } - * - * let b: HoverProvider = { - * provideHover(doc, pos, token): ProviderResult { - * return new Promise(resolve => { - * resolve(new Hover('Hello World')); - * }); - * } - * } - * - * let c: HoverProvider = { - * provideHover(doc, pos, token): ProviderResult { - * return; // undefined - * } - * } - * ``` - */ - declare export type ProviderResult = ?T | Thenable; - - /** - * Kind of a code action. - * - * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`. - */ - declare export class CodeActionKind { - /** - * Empty kind. - */ - static +Empty: CodeActionKind; - - /** - * Base kind for quickfix actions. - */ - static +QuickFix: CodeActionKind; - - /** - * Base kind for refactoring actions. - */ - static +Refactor: CodeActionKind; - - /** - * Base kind for refactoring extraction actions. - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - static +RefactorExtract: CodeActionKind; - - /** - * Base kind for refactoring inline actions. - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - static +RefactorInline: CodeActionKind; - - /** - * Base kind for refactoring rewrite actions. - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - Move method to base class - * - ... - */ - static +RefactorRewrite: CodeActionKind; - - // private constructor(value: string): void; - - /** - * String value of the kind, e.g. `"refactor.extract.function"`. - */ - +value?: string; - - /** - * Create a new kind by appending a more specific selector to the current kind. - * - * Does not modify the current kind. - */ - append(parts: string): CodeActionKind; - - /** - * Does this kind contain `other`? - * - * The kind `"refactor"` for example contains `"refactor.extract"` and ``"refactor.extract.function"`, but not `"unicorn.refactor.extract"` or `"refactory.extract"` - * - * @param other Kind to check. - */ - contains(other: CodeActionKind): boolean; - } - - /** - * Contains additional diagnostic information about the context in which - * a [code action](#CodeActionProvider.provideCodeActions) is run. - */ - declare export interface CodeActionContext { - /** - * An array of diagnostics. - */ - +diagnostics: Diagnostic[]; - - /** - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out before being shown by the lightbulb. - */ - +only?: CodeActionKind; - } - - /** - * A code action represents a change that can be performed in code, e.g. to fix a problem or - * to refactor code. - * - * A CodeAction must set either [`edit`](CodeAction#edit) and/or a [`command`](CodeAction#command). If both are supplied, the `edit` is applied first, then the command is executed. - */ - declare export class CodeAction { - - /** - * A short, human-readable, title for this code action. - */ - title: string; - - /** - * A [workspace edit](#WorkspaceEdit) this code action performs. - */ - edit?: WorkspaceEdit; - - /** - * [Diagnostics](#Diagnostic) that this code action resolves. - */ - diagnostics?: Diagnostic[]; - - /** - * A [command](#Command) this code action executes. - */ - command?: Command; - - /** - * [Kind](#CodeActionKind) of the code action. - * - * Used to filter code actions. - */ - kind?: CodeActionKind; - - /** - * Creates a new code action. - * - * A code action must have at least a [title](#CodeAction.title) and either [edits](#CodeAction.edit) - * or a [command](#CodeAction.command). - * - * @param title The title of the code action. - * @param kind The kind of the code action. - */ - constructor(title: string, kind?: CodeActionKind): void; - } - - /** - * The code action interface defines the contract between extensions and - * the [light bulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature. - * - * A code action can be any command that is [known](#commands.getCommands) to the system. - */ - declare export interface CodeActionProvider { - - /** - * Provide commands for the given document and range. - * - * @param document The document in which the command was invoked. - * @param range The range for which the command was invoked. - * @param context Context carrying additional information. - * @param token A cancellation token. - * @return An array of commands, quick fixes, or refactorings or a thenable of such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideCodeActions(document: TextDocument, range: Range, context: CodeActionContext, token: CancellationToken): ProviderResult<(Command | CodeAction)[]>; - } - - /** - * A code lens represents a [command](#Command) that should be shown along with - * source text, like the number of references, a way to run tests, etc. - * - * A code lens is _unresolved_ when no command is associated to it. For performance - * reasons the creation of a code lens and resolving should be done to two stages. - * - * @see [CodeLensProvider.provideCodeLenses](#CodeLensProvider.provideCodeLenses) - * @see [CodeLensProvider.resolveCodeLens](#CodeLensProvider.resolveCodeLens) - */ - declare export class CodeLens { - - /** - * The range in which this code lens is valid. Should only span a single line. - */ - range: Range; - - /** - * The command this code lens represents. - */ - command?: Command; - - /** - * `true` when there is a command associated. - */ - +isResolved: boolean; - - /** - * Creates a new code lens object. - * - * @param range The range to which this code lens applies. - * @param command The command associated to this code lens. - */ - constructor(range: Range, command?: Command): void; - } - - /** - * A code lens provider adds [commands](#Command) to source text. The commands will be shown - * as dedicated horizontal lines in between the source text. - */ - declare export interface CodeLensProvider { - - /** - * An optional event to signal that the code lenses from this provider have changed. - */ - onDidChangeCodeLenses?: Event; - - /** - * Compute a list of [lenses](#CodeLens). This call should return as fast as possible and if - * computing the commands is expensive implementors should only return code lens objects with the - * range set and implement [resolve](#CodeLensProvider.resolveCodeLens). - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of code lenses or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult; - - /** - * This function will be called for each visible code lens, usually when scrolling and after - * calls to [compute](#CodeLensProvider.provideCodeLenses)-lenses. - * - * @param codeLens code lens that must be resolved. - * @param token A cancellation token. - * @return The given, resolved code lens or thenable that resolves to such. - */ - +resolveCodeLens?: (codeLens: CodeLens, token: CancellationToken) => ProviderResult; - } - - /** - * The definition of a symbol represented as one or many [locations](#Location). - * For most programming languages there is only one location at which a symbol is - * defined. - */ - declare export type Definition = Location | Location[]; - - /** - * The definition provider interface defines the contract between extensions and - * the [go to definition](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-definition) - * and peek definition features. - */ - declare export interface DefinitionProvider { - - /** - * Provide the definition of the symbol at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A definition or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * The implemenetation provider interface defines the contract between extensions and - * the go to implementation feature. - */ - declare export interface ImplementationProvider { - - /** - * Provide the implementations of the symbol at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A definition or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideImplementation(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * The type definition provider defines the contract between extensions and - * the go to type definition feature. - */ - declare export interface TypeDefinitionProvider { - - /** - * Provide the type definition of the symbol at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A definition or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideTypeDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * The MarkdownString represents human readable text that supports formatting via the - * markdown syntax. Standard markdown is supported, also tables, but no embedded html. - */ - declare export class MarkdownString { - - /** - * The markdown string. - */ - value: string; - - /** - * Indicates that this markdown string is from a trusted source. Only *trusted* - * markdown supports links that execute commands, e.g. `[Run it](command:myCommandId)`. - */ - isTrusted?: boolean; - - /** - * Creates a new markdown string with the given value. - * - * @param value Optional, initial value. - */ - constructor(value?: string): void; - - /** - * Appends and escapes the given string to this markdown string. - * @param value Plain text. - */ - appendText(value: string): MarkdownString; - - /** - * Appends the given string 'as is' to this markdown string. - * @param value Markdown string. - */ - appendMarkdown(value: string): MarkdownString; - - /** - * Appends the given string as codeblock using the provided language. - * @param value A code snippet. - * @param language An optional [language identifier](#languages.getLanguages). - */ - appendCodeblock(value: string, language?: string): MarkdownString; - } - - /** - * ~~MarkedString can be used to render human readable text. It is either a markdown string - * or a code-block that provides a language and a code snippet. Note that - * markdown strings will be sanitized - that means html will be escaped.~~ - * - * @deprecated This type is deprecated, please use [`MarkdownString`](#MarkdownString) instead. - */ - declare export type MarkedString = MarkdownString | string | { language: string; value: string }; - - /** - * A hover represents additional information for a symbol or word. Hovers are - * rendered in a tooltip-like widget. - */ - declare export class Hover { - - /** - * The contents of this hover. - */ - contents: MarkedString[]; - - /** - * The range to which this hover applies. When missing, the - * editor will use the range at the current position or the - * current position itself. - */ - range?: Range; - - /** - * Creates a new hover object. - * - * @param contents The contents of the hover. - * @param range The range to which the hover applies. - */ - constructor(contents: MarkedString | MarkedString[], range?: Range): void; - } - - /** - * The hover provider interface defines the contract between extensions and - * the [hover](https://code.visualstudio.com/docs/editor/intellisense)-feature. - */ - declare export interface HoverProvider { - - /** - * Provide a hover for the given position and document. Multiple hovers at the same - * position will be merged by the editor. A hover can have a range which defaults - * to the word range at the position when omitted. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A hover or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * A document highlight kind. - */ - declare export var DocumentHighlightKind: { - - /** - * A textual occurrence. - */ - +Text: 0, - - /** - * Read-access of a symbol, like reading a variable. - */ - +Read: 1, - - /** - * Write-access of a symbol, like writing to a variable. - */ - +Write: 2 - } - declare export type DocumentHighlightKindType = $Values; - - /** - * A document highlight is a range inside a text document which deserves - * special attention. Usually a document highlight is visualized by changing - * the background color of its range. - */ - declare export class DocumentHighlight { - - /** - * The range this highlight applies to. - */ - range: Range; - - /** - * The highlight kind, default is [text](#DocumentHighlightKind.Text). - */ - kind?: DocumentHighlightKindType; - - /** - * Creates a new document highlight object. - * - * @param range The range the highlight applies to. - * @param kind The highlight kind, default is [text](#DocumentHighlightKind.Text). - */ - constructor(range: Range, kind?: DocumentHighlightKindType): void; - } - - /** - * The document highlight provider interface defines the contract between extensions and - * the word-highlight-feature. - */ - declare export interface DocumentHighlightProvider { - - /** - * Provide a set of document highlights, like all occurrences of a variable or - * all exit-points of a function. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentHighlights(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * A symbol kind. - */ - declare export var SymbolKind: { - +File: 0, - +Module: 1, - +Namespace: 2, - +Package: 3, - +Class: 4, - +Method: 5, - +Property: 6, - +Field: 7, - +Constructor: 8, - +Enum: 9, - +Interface: 10, - +Function: 11, - +Variable: 12, - +Constant: 13, - +String: 14, - +Number: 15, - +Boolean: 16, - +Array: 17, - +Object: 18, - +Key: 19, - +Null: 20, - +EnumMember: 21, - +Struct: 22, - +Event: 23, - +Operator: 24, - +TypeParameter: 25 - } - declare export type SymbolKindType = $Values; - - /** - * Represents information about programming constructs like variables, classes, - * interfaces etc. - */ - declare export class SymbolInformation { - - /** - * The name of this symbol. - */ - name: string; - - /** - * The name of the symbol containing this symbol. - */ - containerName: string; - - /** - * The kind of this symbol. - */ - kind: SymbolKindType; - - /** - * The location of this symbol. - */ - location: Location; - - /** - * Creates a new symbol information object. - * - * @param name The name of the symbol. - * @param kind The kind of the symbol. - * @param containerName The name of the symbol containing the symbol. - * @param location The the location of the symbol. - */ - constructor(name: string, kind: SymbolKindType, containerName: string, location: Location): void; - - /** - * ~~Creates a new symbol information object.~~ - * - * @deprecated Please use the constructor taking a [location](#Location) object. - * - * @param name The name of the symbol. - * @param kind The kind of the symbol. - * @param range The range of the location of the symbol. - * @param uri The resource of the location of symbol, defaults to the current document. - * @param containerName The name of the symbol containing the symbol. - */ - constructor(name: string, kind: SymbolKindType, range: Range, uri?: Uri, containerName?: string): void; - } - - /** - * The document symbol provider interface defines the contract between extensions and - * the [go to symbol](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-symbol)-feature. - */ - declare export interface DocumentSymbolProvider { - - /** - * Provide symbol information for the given document. - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult; - } - - /** - * The workspace symbol provider interface defines the contract between extensions and - * the [symbol search](https://code.visualstudio.com/docs/editor/editingevolved#_open-symbol-by-name)-feature. - */ - declare export interface WorkspaceSymbolProvider { - - /** - * Project-wide search for a symbol matching the given query string. It is up to the provider - * how to search given the query string, like substring, indexOf etc. To improve performance implementors can - * skip the [location](#SymbolInformation.location) of symbols and implement `resolveWorkspaceSymbol` to do that - * later. - * - * The `query`-parameter should be interpreted in a *relaxed way* as the editor will apply its own highlighting - * and scoring on the results. A good rule of thumb is to match case-insensitive and to simply check that the - * characters of *query* appear in their order in a candidate symbol. Don't use prefix, substring, or similar - * strict matching. - * - * @param query A non-empty query string. - * @param token A cancellation token. - * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideWorkspaceSymbols(query: string, token: CancellationToken): ProviderResult; - - /** - * Given a symbol fill in its [location](#SymbolInformation.location). This method is called whenever a symbol - * is selected in the UI. Providers can implement this method and return incomplete symbols from - * [`provideWorkspaceSymbols`](#WorkspaceSymbolProvider.provideWorkspaceSymbols) which often helps to improve - * performance. - * - * @param symbol The symbol that is to be resolved. Guaranteed to be an instance of an object returned from an - * earlier call to `provideWorkspaceSymbols`. - * @param token A cancellation token. - * @return The resolved symbol or a thenable that resolves to that. When no result is returned, - * the given `symbol` is used. - */ - +resolveWorkspaceSymbol?: (symbol: SymbolInformation, token: CancellationToken) => ProviderResult; - } - - /** - * Value-object that contains additional information when - * requesting references. - */ - declare export interface ReferenceContext { - - /** - * Include the declaration of the current symbol. - */ - includeDeclaration: boolean; - } - - /** - * The reference provider interface defines the contract between extensions and - * the [find references](https://code.visualstudio.com/docs/editor/editingevolved#_peek)-feature. - */ - declare export interface ReferenceProvider { - - /** - * Provide a set of project-wide references for the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param context - * @param token A cancellation token. - * @return An array of locations or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideReferences(document: TextDocument, position: Position, context: ReferenceContext, token: CancellationToken): ProviderResult; - } - - /** - * A text edit represents edits that should be applied - * to a document. - */ - declare export class TextEdit { - - /** - * Utility to create a replace edit. - * - * @param range A range. - * @param newText A string. - * @return A new text edit object. - */ - static replace(range: Range, newText: string): TextEdit; - - /** - * Utility to create an insert edit. - * - * @param position A position, will become an empty range. - * @param newText A string. - * @return A new text edit object. - */ - static insert(position: Position, newText: string): TextEdit; - - /** - * Utility to create a delete edit. - * - * @param range A range. - * @return A new text edit object. - */ - static delete(range: Range): TextEdit; - - /** - * Utility to create an eol-edit. - * - * @param eol An eol-sequence - * @return A new text edit object. - */ - static setEndOfLine(eol: EndOfLineType): TextEdit; - - /** - * The range this edit applies to. - */ - range: Range; - - /** - * The string this edit will insert. - */ - newText: string; - - /** - * The eol-sequence used in the document. - * - * *Note* that the eol-sequence will be applied to the - * whole document. - */ - newEol: EndOfLineType; - - /** - * Create a new TextEdit. - * - * @param range A range. - * @param newText A string. - */ - constructor(range: Range, newText: string): void; - } - - /** - * A workspace edit represents textual and files changes for - * multiple resources and documents. - */ - declare export class WorkspaceEdit { - - /** - * The number of affected resources. - */ - +size: number; - - /** - * Replace the given range with given text for the given resource. - * - * @param uri A resource identifier. - * @param range A range. - * @param newText A string. - */ - replace(uri: Uri, range: Range, newText: string): void; - - /** - * Insert the given text at the given position. - * - * @param uri A resource identifier. - * @param position A position. - * @param newText A string. - */ - insert(uri: Uri, position: Position, newText: string): void; - - /** - * Delete the text at the given range. - * - * @param uri A resource identifier. - * @param range A range. - */ - delete(uri: Uri, range: Range): void; - - /** - * Check if this edit affects the given resource. - * @param uri A resource identifier. - * @return `true` if the given resource will be touched by this edit. - */ - has(uri: Uri): boolean; - - /** - * Set (and replace) text edits for a resource. - * - * @param uri A resource identifier. - * @param edits An array of text edits. - */ - set(uri: Uri, edits: TextEdit[]): void; - - /** - * Get the text edits for a resource. - * - * @param uri A resource identifier. - * @return An array of text edits. - */ - get(uri: Uri): TextEdit[]; - - /** - * Get all text edits grouped by resource. - * - * @return A shallow copy of `[Uri, TextEdit[]]`-tuples. - */ - entries(): [Uri, TextEdit[]][]; - } - - /** - * A snippet string is a template which allows to insert text - * and to control the editor cursor when insertion happens. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Variables are defined with `$name` and - * `${name:default value}`. The full snippet syntax is documented - * [here](http://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets). - */ - declare export class SnippetString { - - /** - * The snippet string. - */ - value: string; - - constructor(value?: string): void; - - /** - * Builder-function that appends the given string to - * the [`value`](#SnippetString.value) of this snippet string. - * - * @param string A value to append 'as given'. The string will be escaped. - * @return This snippet string. - */ - appendText(string: string): SnippetString; - - /** - * Builder-function that appends a tabstop (`$1`, `$2` etc) to - * the [`value`](#SnippetString.value) of this snippet string. - * - * @param number The number of this tabstop, defaults to an auto-incremet - * value starting at 1. - * @return This snippet string. - */ - appendTabstop(number?: number): SnippetString; - - /** - * Builder-function that appends a placeholder (`${1:value}`) to - * the [`value`](#SnippetString.value) of this snippet string. - * - * @param value The value of this placeholder - either a string or a function - * with which a nested snippet can be created. - * @param number The number of this tabstop, defaults to an auto-incremet - * value starting at 1. - * @return This snippet string. - */ - appendPlaceholder(value: string | ((snippet: SnippetString) => any), number?: number): SnippetString; - - /** - * Builder-function that appends a variable (`${VAR}`) to - * the [`value`](#SnippetString.value) of this snippet string. - * - * @param name The name of the variable - excluding the `$`. - * @param defaultValue The default value which is used when the variable name cannot - * be resolved - either a string or a function with which a nested snippet can be created. - * @return This snippet string. - */ - appendVariable(name: string, defaultValue: string | ((snippet: SnippetString) => any)): SnippetString; - } - - /** - * The rename provider interface defines the contract between extensions and - * the [rename](https://code.visualstudio.com/docs/editor/editingevolved#_rename-symbol)-feature. - */ - declare export interface RenameProvider { - - /** - * Provide an edit that describes changes that have to be made to one - * or many resources to rename a symbol to a different name. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param newName The new name of the symbol. If the given name is not valid, the provider must return a rejected promise. - * @param token A cancellation token. - * @return A workspace edit or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideRenameEdits(document: TextDocument, position: Position, newName: string, token: CancellationToken): ProviderResult; - } - - /** - * Value-object describing what options formatting should use. - */ - declare export interface FormattingOptions { - - /** - * Size of a tab in spaces. - */ - tabSize: number; - - /** - * Prefer spaces over tabs. - */ - insertSpaces: boolean; - - /** - * Signature for further properties. - */ - [key: string]: boolean | number | string; - } - - /** - * The document formatting provider interface defines the contract between extensions and - * the formatting-feature. - */ - declare export interface DocumentFormattingEditProvider { - - /** - * Provide formatting edits for a whole document. - * - * @param document The document in which the command was invoked. - * @param options Options controlling formatting. - * @param token A cancellation token. - * @return A set of text edits or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentFormattingEdits(document: TextDocument, options: FormattingOptions, token: CancellationToken): ProviderResult; - } - - /** - * The document formatting provider interface defines the contract between extensions and - * the formatting-feature. - */ - declare export interface DocumentRangeFormattingEditProvider { - - /** - * Provide formatting edits for a range in a document. - * - * The given range is a hint and providers can decide to format a smaller - * or larger range. Often this is done by adjusting the start and end - * of the range to full syntax nodes. - * - * @param document The document in which the command was invoked. - * @param range The range which should be formatted. - * @param options Options controlling formatting. - * @param token A cancellation token. - * @return A set of text edits or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult; - } - - /** - * The document formatting provider interface defines the contract between extensions and - * the formatting-feature. - */ - declare export interface OnTypeFormattingEditProvider { - - /** - * Provide formatting edits after a character has been typed. - * - * The given position and character should hint to the provider - * what range the position to expand to, like find the matching `{` - * when `}` has been entered. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param ch The character that has been typed. - * @param options Options controlling formatting. - * @param token A cancellation token. - * @return A set of text edits or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideOnTypeFormattingEdits(document: TextDocument, position: Position, ch: string, options: FormattingOptions, token: CancellationToken): ProviderResult; - } - - /** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ - declare export class ParameterInformation { - - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkdownString; - - /** - * Creates a new parameter information object. - * - * @param label A label string. - * @param documentation A doc string. - */ - constructor(label: string, documentation?: string | MarkdownString): void; - } - - /** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ - declare export class SignatureInformation { - - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkdownString; - - /** - * The parameters of this signature. - */ - parameters: ParameterInformation[]; - - /** - * Creates a new signature information object. - * - * @param label A label string. - * @param documentation A doc string. - */ - constructor(label: string, documentation?: string | MarkdownString): void; - } - - /** - * Signature help represents the signature of something - * callable. There can be multiple signatures but only one - * active and only one active parameter. - */ - declare export class SignatureHelp { - - /** - * One or more signatures. - */ - signatures: SignatureInformation[]; - - /** - * The active signature. - */ - activeSignature: number; - - /** - * The active parameter of the active signature. - */ - activeParameter: number; - } - - /** - * The signature help provider interface defines the contract between extensions and - * the [parameter hints](https://code.visualstudio.com/docs/editor/intellisense)-feature. - */ - declare export interface SignatureHelpProvider { - - /** - * Provide help for the signature at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return Signature help or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * Completion item kinds. - */ - declare export var CompletionItemKind: { - +Text: 0, - +Method: 1, - +Function: 2, - +Constructor: 3, - +Field: 4, - +Variable: 5, - +Class: 6, - +Interface: 7, - +Module: 8, - +Property: 9, - +Unit: 10, - +Value: 11, - +Enum: 12, - +Keyword: 13, - +Snippet: 14, - +Color: 15, - +Reference: 17, - +File: 16, - +Folder: 18, - +EnumMember: 19, - +Constant: 20, - +Struct: 21, - +Event: 22, - +Operator: 23, - +TypeParameter: 24 - } - declare export type CompletionItemKindType = $Values; - - /** - * A completion item represents a text snippet that is proposed to complete text that is being typed. - * - * It is suffient to create a completion item from just a [label](#CompletionItem.label). In that - * case the completion item will replace the [word](#TextDocument.getWordRangeAtPosition) - * until the cursor with the given label or [insertText](#CompletionItem.insertText). Otherwise the - * the given [edit](#CompletionItem.textEdit) is used. - * - * When selecting a completion item in the editor its defined or synthesized text edit will be applied - * to *all* cursors/selections whereas [additionalTextEdits](CompletionItem.additionalTextEdits) will be - * applied as provided. - * - * @see [CompletionItemProvider.provideCompletionItems](#CompletionItemProvider.provideCompletionItems) - * @see [CompletionItemProvider.resolveCompletionItem](#CompletionItemProvider.resolveCompletionItem) - */ - declare export class CompletionItem { - - /** - * The label of this completion item. By default - * this is also the text that is inserted when selecting - * this completion. - */ - label: string; - - /** - * The kind of this completion item. Based on the kind - * an icon is chosen by the editor. - */ - kind?: CompletionItemKindType; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - detail?: string; - - /** - * A human-readable string that represents a doc-comment. - */ - documentation?: string | MarkdownString; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the [label](#CompletionItem.label) - * is used. - */ - sortText?: string; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the [label](#CompletionItem.label) - * is used. - */ - filterText?: string; - - /** - * A string or snippet that should be inserted in a document when selecting - * this completion. When `falsy` the [label](#CompletionItem.label) - * is used. - */ - insertText?: string | SnippetString; - - /** - * A range of text that should be replaced by this completion item. - * - * Defaults to a range from the start of the [current word](#TextDocument.getWordRangeAtPosition) to the - * current position. - * - * *Note:* The range must be a [single line](#Range.isSingleLine) and it must - * [contain](#Range.contains) the position at which completion has been [requested](#CompletionItemProvider.provideCompletionItems). - */ - range?: Range; - - /** - * An optional set of characters that when pressed while this completion is active will accept it first and - * then type that character. *Note* that all commit characters should have `length=1` and that superfluous - * characters will be ignored. - */ - commitCharacters?: string[]; - - /** - * An optional array of additional [text edits](#TextEdit) that are applied when - * selecting this completion. Edits must not overlap with the main [edit](#CompletionItem.textEdit) - * nor with themselves. - */ - additionalTextEdits?: TextEdit[]; - - /** - * An optional [command](#Command) that is executed *after* inserting this completion. *Note* that - * additional modifications to the current document should be described with the - * [additionalTextEdits](#CompletionItem.additionalTextEdits)-property. - */ - command?: Command; - - /** - * Creates a new completion item. - * - * Completion items must have at least a [label](#CompletionItem.label) which then - * will be used as insert text as well as for sorting and filtering. - * - * @param label The label of the completion. - * @param kind The [kind](#CompletionItemKind) of the completion. - */ - constructor(label: string, kind?: CompletionItemKindType): void; - } - - /** - * Represents a collection of [completion items](#CompletionItem) to be presented - * in the editor. - */ - declare export class CompletionList { - - /** - * This list is not complete. Further typing should result in recomputing - * this list. - */ - isIncomplete?: boolean; - - /** - * The completion items. - */ - items: CompletionItem[]; - - /** - * Creates a new completion list. - * - * @param items The completion items. - * @param isIncomplete The list is not complete. - */ - constructor(items?: CompletionItem[], isIncomplete?: boolean): void; - } - - /** - * How a [completion provider](#CompletionItemProvider) was triggered - */ - declare export var CompletionTriggerKind: { - /** - * Completion was triggered normally. - */ - +Invoke: 0, - /** - * Completion was triggered by a trigger character. - */ - +TriggerCharacter: 1, - /** - * Completion was re-triggered as current completion list is incomplete - */ - +TriggerForIncompleteCompletions: 2 - } - declare export type CompletionTriggerKindType = $Values; - - /** - * Contains additional information about the context in which - * [completion provider](#CompletionItemProvider.provideCompletionItems) is triggered. - */ - declare export interface CompletionContext { - /** - * How the completion was triggered. - */ - +triggerKind: CompletionTriggerKindType; - - /** - * Character that triggered the completion item provider. - * - * `undefined` if provider was not triggered by a character. - * - * The trigger character is already in the document when the completion provider is triggered. - */ - +triggerCharacter?: string; - } - - /** - * The completion item provider interface defines the contract between extensions and - * [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense). - * - * Providers can delay the computation of the [`detail`](#CompletionItem.detail) - * and [`documentation`](#CompletionItem.documentation) properties by implementing the - * [`resolveCompletionItem`](#CompletionItemProvider.resolveCompletionItem)-function. However, properties that - * are needed for the inital sorting and filtering, like `sortText`, `filterText`, `insertText`, and `range`, must - * not be changed during resolve. - * - * Providers are asked for completions either explicitly by a user gesture or -depending on the configuration- - * implicitly when typing words or trigger characters. - */ - declare export interface CompletionItemProvider { - - /** - * Provide completion items for the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @param context How the completion was triggered. - * - * @return An array of completions, a [completion list](#CompletionList), or a thenable that resolves to either. - * The lack of a result can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult; - - /** - * Given a completion item fill in more data, like [doc-comment](#CompletionItem.documentation) - * or [details](#CompletionItem.detail). - * - * The editor will only resolve a completion item once. - * - * @param item A completion item currently active in the UI. - * @param token A cancellation token. - * @return The resolved completion item or a thenable that resolves to of such. It is OK to return the given - * `item`. When no result is returned, the given `item` will be used. - */ - +resolveCompletionItem?: (item: CompletionItem, token: CancellationToken) => ProviderResult; - } - - - /** - * A document link is a range in a text document that links to an internal or external resource, like another - * text document or a web site. - */ - declare export class DocumentLink { - - /** - * The range this link applies to. - */ - range: Range; - - /** - * The uri this link points to. - */ - target?: Uri; - - /** - * Creates a new document link. - * - * @param range The range the document link applies to. Must not be empty. - * @param target The uri the document link points to. - */ - constructor(range: Range, target?: Uri): void; - } - - /** - * The document link provider defines the contract between extensions and feature of showing - * links in the editor. - */ - declare export interface DocumentLinkProvider { - - /** - * Provide links for the given document. Note that the editor ships with a default provider that detects - * `http(s)` and `file` links. - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of [document links](#DocumentLink) or a thenable that resolves to such. The lack of a result - * can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentLinks(document: TextDocument, token: CancellationToken): ProviderResult; - - /** - * Given a link fill in its [target](#DocumentLink.target). This method is called when an incomplete - * link is selected in the UI. Providers can implement this method and return incomple links - * (without target) from the [`provideDocumentLinks`](#DocumentLinkProvider.provideDocumentLinks) method which - * often helps to improve performance. - * - * @param link The link that is to be resolved. - * @param token A cancellation token. - */ - +resolveDocumentLink?: (link: DocumentLink, token: CancellationToken) => ProviderResult; - } - - /** - * Represents a color in RGBA space. - */ - declare export class Color { - - /** - * The red component of this color in the range [0-1]. - */ - +red: number; - - /** - * The green component of this color in the range [0-1]. - */ - +green: number; - - /** - * The blue component of this color in the range [0-1]. - */ - +blue: number; - - /** - * The alpha component of this color in the range [0-1]. - */ - +alpha: number; - - /** - * Creates a new color instance. - * - * @param red The red component. - * @param green The green component. - * @param blue The bluew component. - * @param alpha The alpha component. - */ - constructor(red: number, green: number, blue: number, alpha: number): void; - } - - /** - * Represents a color range from a document. - */ - declare export class ColorInformation { - - /** - * The range in the document where this color appers. - */ - range: Range; - - /** - * The actual color value for this color range. - */ - color: Color; - - /** - * Creates a new color range. - * - * @param range The range the color appears in. Must not be empty. - * @param color The value of the color. - * @param format The format in which this color is currently formatted. - */ - constructor(range: Range, color: Color): void; - } - - /** - * A color presentation object describes how a [`color`](#Color) should be represented as text and what - * edits are required to refer to it from source code. - * - * For some languages one color can have multiple presentations, e.g. css can represent the color red with - * the constant `Red`, the hex-value `#ff0000`, or in rgba and hsla forms. In csharp other representations - * apply, e.g `System.Drawing.Color.Red`. - */ - declare export class ColorPresentation { - - /** - * The label of this color presentation. It will be shown on the color - * picker header. By default this is also the text that is inserted when selecting - * this color presentation. - */ - label: string; - - /** - * An [edit](#TextEdit) which is applied to a document when selecting - * this presentation for the color. When `falsy` the [label](#ColorPresentation.label) - * is used. - */ - textEdit?: TextEdit; - - /** - * An optional array of additional [text edits](#TextEdit) that are applied when - * selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves. - */ - additionalTextEdits?: TextEdit[]; - - /** - * Creates a new color presentation. - * - * @param label The label of this color presentation. - */ - constructor(label: string): void; - } - - /** - * The document color provider defines the contract between extensions and feature of - * picking and modifying colors in the editor. - */ - declare export interface DocumentColorProvider { - - /** - * Provide colors for the given document. - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of [color informations](#ColorInformation) or a thenable that resolves to such. The lack of a result - * can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentColors(document: TextDocument, token: CancellationToken): ProviderResult; - - /** - * Provide [representations](#ColorPresentation) for a color. - * - * @param color The color to show and insert. - * @param context A context object with additional information - * @param token A cancellation token. - * @return An array of color presentations or a thenable that resolves to such. The lack of a result - * can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideColorPresentations(color: Color, context: { document: TextDocument, range: Range }, token: CancellationToken): ProviderResult; - } - - /** - * A tuple of two characters, like a pair of - * opening and closing brackets. - */ - declare export type CharacterPair = [string, string]; - - /** - * Describes how comments for a language work. - */ - declare export interface CommentRule { - - /** - * The line comment token, like `// this is a comment` - */ - lineComment?: string; - - /** - * The block comment character pair, like `/* block comment */` - */ - blockComment?: CharacterPair; - } - - /** - * Describes indentation rules for a language. - */ - declare export interface IndentationRule { - /** - * If a line matches this pattern, then all the lines after it should be unindendented once (until another rule matches). - */ - decreaseIndentPattern: RegExp; - /** - * If a line matches this pattern, then all the lines after it should be indented once (until another rule matches). - */ - increaseIndentPattern: RegExp; - /** - * If a line matches this pattern, then **only the next line** after it should be indented once. - */ - indentNextLinePattern?: RegExp; - /** - * If a line matches this pattern, then its indentation should not be changed and it should not be evaluated against the other rules. - */ - unIndentedLinePattern?: RegExp; - } - - /** - * Describes what to do with the indentation when pressing Enter. - */ - declare export var IndentAction: { - /** - * Insert new line and copy the previous line's indentation. - */ - +None: 0, - /** - * Insert new line and indent once (relative to the previous line's indentation). - */ - +Indent: 1, - /** - * Insert two new lines: - * - the first one indented which will hold the cursor - * - the second one at the same indentation level - */ - +IndentOutdent: 2, - /** - * Insert new line and outdent once (relative to the previous line's indentation). - */ - +Outdent: 3 - } - declare export type IndentActionType = $Values; - - /** - * Describes what to do when pressing Enter. - */ - declare export interface EnterAction { - /** - * Describe what to do with the indentation. - */ - indentAction: IndentActionType; - /** - * Describes text to be appended after the new line and after the indentation. - */ - appendText?: string; - /** - * Describes the number of characters to remove from the new line's indentation. - */ - removeText?: number; - } - - /** - * Describes a rule to be evaluated when pressing Enter. - */ - declare export interface OnEnterRule { - /** - * This rule will only execute if the text before the cursor matches this regular expression. - */ - beforeText: RegExp; - /** - * This rule will only execute if the text after the cursor matches this regular expression. - */ - afterText?: RegExp; - /** - * The action to execute. - */ - action: EnterAction; - } - - /** - * The language configuration interfaces defines the contract between extensions - * and various editor features, like automatic bracket insertion, automatic indentation etc. - */ - declare export interface LanguageConfiguration { - /** - * The language's comment settings. - */ - comments?: CommentRule; - /** - * The language's brackets. - * This configuration implicitly affects pressing Enter around these brackets. - */ - brackets?: CharacterPair[]; - /** - * The language's word definition. - * If the language supports Unicode identifiers (e.g. JavaScript), it is preferable - * to provide a word definition that uses exclusion of known separators. - * e.g.: A regex that matches anything except known separators (and dot is allowed to occur in a floating point number): - * /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g - */ - wordPattern?: RegExp; - /** - * The language's indentation settings. - */ - indentationRules?: IndentationRule; - /** - * The language's rules to be evaluated when pressing Enter. - */ - onEnterRules?: OnEnterRule[]; - } - - /** - * The configuration target - */ - declare export var ConfigurationTarget: { - /** - * Global configuration - */ - +Global: 1, - - /** - * Workspace configuration - */ - +Workspace: 2, - - /** - * Workspace folder configuration - */ - +WorkspaceFolder: 3 - } - declare export type ConfigurationTargetType = $Values; - - /** - * Represents the configuration. It is a merged view of - * - * - Default configuration - * - Global configuration - * - Workspace configuration (if available) - * - Workspace folder configuration of the requested resource (if available) - * - * *Global configuration* comes from User Settings and shadows Defaults. - * - * *Workspace configuration* comes from Workspace Settings and shadows Global configuration. - * - * *Workspace Folder configuration* comes from `.vscode` folder under one of the [workspace folders](#workspace.workspaceFolders). - * - * *Note:* Workspace and Workspace Folder configurations contains `launch` and `tasks` settings. Their basename will be - * part of the section identifier. The following snippets shows how to retrieve all configurations - * from `launch.json`: - * - * ```ts - * // launch.json configuration - * const config = workspace.getConfiguration('launch', vscode.window.activeTextEditor.document.uri); - * - * // retrieve values - * const values = config.get('configurations'); - * ``` - * - * Refer to [Settings](https://code.visualstudio.com/docs/getstarted/settings) for more information. - */ - declare export interface WorkspaceConfiguration { - /** - * Return a value from this configuration. - * - * @param section Configuration name, supports _dotted_ names. - * @param defaultValue A value should be returned when no value could be found, is `undefined`. - * @return The value `section` denotes or the default. - */ - get(section: string, defaultValue?: T): T; - - /** - * Check if this configuration has a certain value. - * - * @param section Configuration name, supports _dotted_ names. - * @return `true` if the section doesn't resolve to `undefined`. - */ - has(section: string): boolean; - - /** - * Retrieve all information about a configuration setting. A configuration value - * often consists of a *default* value, a global or installation-wide value, - * a workspace-specific value and a folder-specific value. - * - * The *effective* value (returned by [`get`](#WorkspaceConfiguration.get)) - * is computed like this: `defaultValue` overwritten by `globalValue`, - * `globalValue` overwritten by `workspaceValue`. `workspaceValue` overwritten by `workspaceFolderValue`. - * Refer to [Settings Inheritence](https://code.visualstudio.com/docs/getstarted/settings) - * for more information. - * - * *Note:* The configuration name must denote a leaf in the configuration tree - * (`editor.fontSize` vs `editor`) otherwise no result is returned. - * - * @param section Configuration name, supports _dotted_ names. - * @return Information about a configuration setting or `undefined`. - */ - inspect(section: string): ?{ key: string; defaultValue?: T; globalValue?: T; workspaceValue?: T, workspaceFolderValue?: T }; - - /** - * Update a configuration value. The updated configuration values are persisted. - * - * A value can be changed in - * - * - [Global configuration](#ConfigurationTarget.Global): Changes the value for all instances of the editor. - * - [Workspace configuration](#ConfigurationTarget.Workspace): Changes the value for current workspace, if available. - * - [Workspace folder configuration](#ConfigurationTarget.WorkspaceFolder): Changes the value for the - * [Workspace folder](#workspace.workspaceFolders) to which the current [configuration](#WorkspaceConfiguration) is scoped to. - * - * *Note 1:* Setting a global value in the presence of a more specific workspace value - * has no observable effect in that workspace, but in others. Setting a workspace value - * in the presence of a more specific folder value has no observable effect for the resources - * under respective [folder](#workspace.workspaceFolders), but in others. Refer to - * [Settings Inheritence](https://code.visualstudio.com/docs/getstarted/settings) for more information. - * - * *Note 2:* To remove a configuration value use `undefined`, like so: `config.update('somekey', undefined)` - * - * Will throw error when - * - Writing a configuration which is not registered. - * - Writing a configuration to workspace or folder target when no workspace is opened - * - Writing a configuration to folder target when there is no folder settings - * - Writing to folder target without passing a resource when getting the configuration (`workspace.getConfiguration(section, resource)`) - * - Writing a window configuration to folder target - * - * @param section Configuration name, supports _dotted_ names. - * @param value The new value. - * @param configurationTarget The [configuration target](#ConfigurationTarget) or a boolean value. - * - If `true` configuration target is `ConfigurationTarget.Global`. - * - If `false` configuration target is `ConfigurationTarget.Workspace`. - * - If `undefined` or `null` configuration target is - * `ConfigurationTarget.WorkspaceFolder` when configuration is resource specific - * `ConfigurationTarget.Workspace` otherwise. - */ - update(section: string, value: any, configurationTarget?: ConfigurationTargetType | boolean): Thenable; - - /** - * Readable dictionary that backs this configuration. - */ - +[key: string]: any; - } - - /** - * Represents a location inside a resource, such as a line - * inside a text file. - */ - declare export class Location { - - /** - * The resource identifier of this location. - */ - uri: Uri; - - /** - * The document range of this location. - */ - range: Range; - - /** - * Creates a new location object. - * - * @param uri The resource identifier. - * @param rangeOrPosition The range or position. Positions will be converted to an empty range. - */ - constructor(uri: Uri, rangeOrPosition: Range | Position): void; - } - - /** - * Represents the severity of diagnostics. - */ - declare export var DiagnosticSeverity: { - - /** - * Something not allowed by the rules of a language or other means. - */ - +Error: 0, - - /** - * Something suspicious but allowed. - */ - +Warning: 1, - - /** - * Something to inform about but not a problem. - */ - +Information: 2, - - /** - * Something to hint to a better way of doing it, like proposing - * a refactoring. - */ - +Hint: 3 - } - declare export type DiagnosticSeverityType = $Values; - - /** - * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects - * are only valid in the scope of a file. - */ - declare export class Diagnostic { - - /** - * The range to which this diagnostic applies. - */ - range: Range; - - /** - * The human-readable message. - */ - message: string; - - /** - * A human-readable string describing the source of this - * diagnostic, e.g. 'typescript' or 'super lint'. - */ - source: string; - - /** - * The severity, default is [error](#DiagnosticSeverity.Error). - */ - severity: ConfigurationTargetType; - - /** - * A code or identifier for this diagnostics. Will not be surfaced - * to the user, but should be used for later processing, e.g. when - * providing [code actions](#CodeActionContext). - */ - code: string | number; - - /** - * Creates a new diagnostic object. - * - * @param range The range to which this diagnostic applies. - * @param message The human-readable message. - * @param severity The severity, default is [error](#DiagnosticSeverity.Error). - */ - constructor(range: Range, message: string, severity?: ConfigurationTargetType): void; - } - - /** - * A diagnostics collection is a container that manages a set of - * [diagnostics](#Diagnostic). Diagnostics are always scopes to a - * diagnostics collection and a resource. - * - * To get an instance of a `DiagnosticCollection` use - * [createDiagnosticCollection](#languages.createDiagnosticCollection). - */ - declare export interface DiagnosticCollection { - - /** - * The name of this diagnostic collection, for instance `typescript`. Every diagnostic - * from this collection will be associated with this name. Also, the task framework uses this - * name when defining [problem matchers](https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher). - */ - +name: string; - - /** - * Assign diagnostics for given resource. Will replace - * existing diagnostics for that resource. - * - * @param uri A resource identifier. - * @param diagnostics Array of diagnostics or `undefined` - */ - set(uri: Uri, diagnostics: ?Diagnostic[]): void; - - /** - * Replace all entries in this collection. - * - * Diagnostics of multiple tuples of the same uri will be merged, e.g - * `[[file1, [d1]], [file1, [d2]]]` is equivalent to `[[file1, [d1, d2]]]`. - * If a diagnostics item is `undefined` as in `[file1, undefined]` - * all previous but not subsequent diagnostics are removed. - * - * @param entries An array of tuples, like `[[file1, [d1, d2]], [file2, [d3, d4, d5]]]`, or `undefined`. - */ - set(entries: [Uri, ?Diagnostic[]][]): void; - - /** - * Remove all diagnostics from this collection that belong - * to the provided `uri`. The same as `#set(uri, undefined)`. - * - * @param uri A resource identifier. - */ - delete(uri: Uri): void; - - /** - * Remove all diagnostics from this collection. The same - * as calling `#set(undefined)`; - */ - clear(): void; - - /** - * Iterate over each entry in this collection. - * - * @param callback Function to execute for each entry. - * @param thisArg The `this` context used when invoking the handler function. - */ - forEach(callback: (uri: Uri, diagnostics: Diagnostic[], collection: DiagnosticCollection) => any, thisArg?: any): void; - - /** - * Get the diagnostics for a given resource. *Note* that you cannot - * modify the diagnostics-array returned from this call. - * - * @param uri A resource identifier. - * @returns An immutable array of [diagnostics](#Diagnostic) or `undefined`. - */ - get(uri: Uri): ?Diagnostic[]; - - /** - * Check if this collection contains diagnostics for a - * given resource. - * - * @param uri A resource identifier. - * @returns `true` if this collection has diagnostic for the given resource. - */ - has(uri: Uri): boolean; - - /** - * Dispose and free associated resources. Calls - * [clear](#DiagnosticCollection.clear). - */ - dispose(): void; - } - - /** - * Denotes a column in the editor window. Columns are - * used to show editors side by side. - */ - declare export var ViewColumn: { - /** - * A *symbolic* editor column representing the currently - * active column. This value can be used when opening editors, but the - * *resolved* [viewColumn](#TextEditor.viewColumn)-value of editors will always - * be `One`, `Two`, `Three`, or `undefined` but never `Active`. - */ - +Active: -1, - /** - * The left most editor column. - */ - +One: 1, - /** - * The center editor column. - */ - +Two: 2, - /** - * The right most editor column. - */ - +Three: 3 - } - declare export type ViewColumnType = $Values; - - /** - * An output channel is a container for textual information. - * - * To get an instance of an `OutputChannel` use - * [createOutputChannel](#window.createOutputChannel). - */ - declare export interface OutputChannel { - - /** - * The human-readable name of this output channel. - */ - +name: string; - - /** - * Append the given value to the channel. - * - * @param value A string, falsy values will not be printed. - */ - append(value: string): void; - - /** - * Append the given value and a line feed character - * to the channel. - * - * @param value A string, falsy values will be printed. - */ - appendLine(value: string): void; - - /** - * Removes all output from the channel. - */ - clear(): void; - - /** - * Reveal this channel in the UI. - * - * @param preserveFocus When `true` the channel will not take focus. - */ - show(preserveFocus?: boolean): void; - - /** - * Hide this channel from the UI. - */ - hide(): void; - - /** - * Dispose and free associated resources. - */ - dispose(): void; - } - - /** - * Represents the alignment of status bar items. - */ - declare export var StatusBarAlignment: { - - /** - * Aligned to the left side. - */ - +Left: 1, - - /** - * Aligned to the right side. - */ - +Right: 2 - } - declare export type StatusBarAlignmentType = $Values; - - /** - * A status bar item is a status bar contribution that can - * show text and icons and run a command on click. - */ - declare export interface StatusBarItem { - - /** - * The alignment of this item. - */ - +alignment: StatusBarAlignmentType; - - /** - * The priority of this item. Higher value means the item should - * be shown more to the left. - */ - +priority: number; - - /** - * The text to show for the entry. You can embed icons in the text by leveraging the syntax: - * - * `My text $(icon-name) contains icons like $(icon'name) this one.` - * - * Where the icon-name is taken from the [octicon](https://octicons.github.com) icon set, e.g. - * `light-bulb`, `thumbsup`, `zap` etc. - */ - text: string; - - /** - * The tooltip text when you hover over this entry. - */ - tooltip: ?string; - - /** - * The foreground color for this entry. - */ - color: ?(string | ThemeColor); - - /** - * The identifier of a command to run on click. The command must be - * [known](#commands.getCommands). - */ - command: ?string; - - /** - * Shows the entry in the status bar. - */ - show(): void; - - /** - * Hide the entry in the status bar. - */ - hide(): void; - - /** - * Dispose and free associated resources. Call - * [hide](#StatusBarItem.hide). - */ - dispose(): void; - } - - /** - * Defines a generalized way of reporting progress updates. - */ - declare export interface Progress { - - /** - * Report a progress update. - * @param value A progress item, like a message or an updated percentage value - */ - report(value: T): void; - } - - /** - * An individual terminal instance within the integrated terminal. - */ - declare export interface Terminal { - - /** - * The name of the terminal. - */ - +name: string; - - /** - * The process ID of the shell process. - */ - +processId: Thenable; - - /** - * Send text to the terminal. The text is written to the stdin of the underlying pty process - * (shell) of the terminal. - * - * @param text The text to send. - * @param addNewLine Whether to add a new line to the text being sent, this is normally - * required to run a command in the terminal. The character(s) added are \n or \r\n - * depending on the platform. This defaults to `true`. - */ - sendText(text: string, addNewLine?: boolean): void; - - /** - * Show the terminal panel and reveal this terminal in the UI. - * - * @param preserveFocus When `true` the terminal will not take focus. - */ - show(preserveFocus?: boolean): void; - - /** - * Hide the terminal panel if this terminal is currently showing. - */ - hide(): void; - - /** - * Dispose and free associated resources. - */ - dispose(): void; - } - - /** - * Represents an extension. - * - * To get an instance of an `Extension` use [getExtension](#extensions.getExtension). - */ - declare export interface Extension { - - /** - * The canonical extension identifier in the form of: `publisher.name`. - */ - +id: string; - - /** - * The absolute file path of the directory containing this extension. - */ - +extensionPath: string; - - /** - * `true` if the extension has been activated. - */ - +isActive: boolean; - - /** - * The parsed contents of the extension's package.json. - */ - +packageJSON: any; - - /** - * The public API exported by this extension. It is an invalid action - * to access this field before this extension has been activated. - */ - +exports: T; - - /** - * Activates this extension and returns its public API. - * - * @return A promise that will resolve when this extension has been activated. - */ - activate(): Thenable; - } - - /** - * An extension context is a collection of utilities private to an - * extension. - * - * An instance of an `ExtensionContext` is provided as the first - * parameter to the `activate`-call of an extension. - */ - declare export interface ExtensionContext { - - /** - * An array to which disposables can be added. When this - * extension is deactivated the disposables will be disposed. - */ - subscriptions: { dispose(): any }[]; - - /** - * A memento object that stores state in the context - * of the currently opened [workspace](#workspace.workspaceFolders). - */ - workspaceState: Memento; - - /** - * A memento object that stores state independent - * of the current opened [workspace](#workspace.workspaceFolders). - */ - globalState: Memento; - - /** - * The absolute file path of the directory containing the extension. - */ - extensionPath: string; - - /** - * Get the absolute path of a resource contained in the extension. - * - * @param relativePath A relative path to a resource contained in the extension. - * @return The absolute path of the resource. - */ - asAbsolutePath(relativePath: string): string; - - /** - * An absolute file path of a workspace specific directory in which the extension - * can store private state. The directory might not exist on disk and creation is - * up to the extension. However, the parent directory is guaranteed to be existent. - * - * Use [`workspaceState`](#ExtensionContext.workspaceState) or - * [`globalState`](#ExtensionContext.globalState) to store key value data. - */ - storagePath: ?string; - - /* BEGIN PROPOSED *******************************************************************************/ - /** - * This extension's logger - */ - logger: Logger; - - /** - * Path where an extension can write log files. - * - * Extensions must create this directory before writing to it. The parent directory will always exist. - */ - +logDirectory: string; - /* END PROPOSED *********************************************************************************/ - } - - /** - * A memento represents a storage utility. It can store and retrieve - * values. - */ - declare export interface Memento { - - /** - * Return a value. - * - * @param key A string. - * @param defaultValue A value that should be returned when there is no - * value (`undefined`) with the given key. - * @return The stored value or the defaultValue. - */ - get(key: string, defaultValue?: T): T; - - /** - * Store a value. The value must be JSON-stringifyable. - * - * @param key A string. - * @param value A value. MUST not contain cyclic references. - */ - update(key: string, value: any): Thenable; - } - - /** - * Controls the behaviour of the terminal's visibility. - */ - declare export var TaskRevealKind: { - /** - * Always brings the terminal to front if the task is executed. - */ - +Always: 1, - - /** - * Only brings the terminal to front if a problem is detected executing the task - * (e.g. the task couldn't be started because). - */ - +Silent: 2, - - /** - * The terminal never comes to front when the task is executed. - */ - +Never: 3 - } - declare export type TaskRevealKindType = $Values; - - /** - * Controls how the task channel is used between tasks - */ - declare export var TaskPanelKind: { - - /** - * Shares a panel with other tasks. This is the default. - */ - +Shared: 1, - - /** - * Uses a dedicated panel for this tasks. The panel is not - * shared with other tasks. - */ - +Dedicated: 2, - - /** - * Creates a new panel whenever this task is executed. - */ - +New: 3 - } - declare export type TaskPanelKindType = $Values; - - /** - * Controls how the task is presented in the UI. - */ - declare export interface TaskPresentationOptions { - /** - * Controls whether the task output is reveal in the user interface. - * Defaults to `RevealKind.Always`. - */ - reveal?: TaskRevealKindType; - - /** - * Controls whether the command associated with the task is echoed - * in the user interface. - */ - echo?: boolean; - - /** - * Controls whether the panel showing the task output is taking focus. - */ - focus?: boolean; - - /** - * Controls if the task panel is used for this task only (dedicated), - * shared between tasks (shared) or if a new panel is created on - * every task execution (new). Defaults to `TaskInstanceKind.Shared` - */ - panel?: TaskPanelKindType; - } - - /** - * A grouping for tasks. The editor by default supports the - * 'Clean', 'Build', 'RebuildAll' and 'Test' group. - */ - declare export class TaskGroup { - - /** - * The clean task group; - */ - static Clean: TaskGroup; - - /** - * The build task group; - */ - static Build: TaskGroup; - - /** - * The rebuild all task group; - */ - static Rebuild: TaskGroup; - - /** - * The test all task group; - */ - static Test: TaskGroup; - - // private constructor(id: string, label: string): void; - } - - - /** - * A structure that defines a task kind in the system. - * The value must be JSON-stringifyable. - */ - declare export type TaskDefinition = { - /** - * The task definition describing the task provided by an extension. - * Usually a task provider defines more properties to identify - * a task. They need to be defined in the package.json of the - * extension under the 'taskDefinitions' extension point. The npm - * task definition for example looks like this - * ```typescript - * interface NpmTaskDefinition extends TaskDefinition { - * script: string; - * } - * ``` - */ - +type: string; - - /** - * Additional attributes of a concrete task definition. - */ - [name: string]: any; - } - - /** - * Options for a process execution - */ - declare export interface ProcessExecutionOptions { - /** - * The current working directory of the executed program or shell. - * If omitted the tools current workspace root is used. - */ - cwd?: string; - - /** - * The additional environment of the executed program or shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - } - - /** - * The execution of a task happens as an external process - * without shell interaction. - */ - declare export class ProcessExecution { - - /** - * Creates a process execution. - * - * @param process The process to start. - * @param args Arguments to be passed to the process. - * @param options Optional options for the started process. - */ - constructor(process: string, args?: string[], options?: ProcessExecutionOptions): void; - - /** - * The process to be executed. - */ - process: string; - - /** - * The arguments passed to the process. Defaults to an empty array. - */ - args: string[]; - - /** - * The process options used when the process is executed. - * Defaults to undefined. - */ - options?: ProcessExecutionOptions; - } - - /** - * Options for a shell execution - */ - declare export interface ShellExecutionOptions { - /** - * The shell executable. - */ - executable?: string; - - /** - * The arguments to be passed to the shell executable used to run the task. - */ - shellArgs?: string[]; - - /** - * The current working directory of the executed shell. - * If omitted the tools current workspace root is used. - */ - cwd?: string; - - /** - * The additional environment of the executed shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - } - - - declare export class ShellExecution { - /** - * Creates a process execution. - * - * @param commandLine The command line to execute. - * @param options Optional options for the started the shell. - */ - constructor(commandLine: string, options?: ShellExecutionOptions): void; - - /** - * The shell command line - */ - commandLine: string; - - /** - * The shell options used when the command line is executed in a shell. - * Defaults to undefined. - */ - options?: ShellExecutionOptions; - } - - /** - * The scope of a task. - */ - declare export var TaskScope: { - /** - * The task is a global task - */ - +Global: 1, - - /** - * The task is a workspace task - */ - +Workspace: 2 - } - declare export type TaskScopeType = $Values; - - /** - * A task to execute - */ - declare export class Task { - - /** - * Creates a new task. - * - * @param definition The task definition as defined in the taskDefinitions extension point. - * @param target Specifies the task's target. It is either a global or a workspace task or a task for a specific workspace folder. - * @param name The task's name. Is presented in the user interface. - * @param source The task's source (e.g. 'gulp', 'npm', ...). Is presented in the user interface. - * @param execution The process or shell execution. - * @param problemMatchers the names of problem matchers to use, like '$tsc' - * or '$eslint'. Problem matchers can be contributed by an extension using - * the `problemMatchers` extension point. - */ - constructor(taskDefinition: TaskDefinition, target?: WorkspaceFolder | typeof TaskScope.Global | typeof TaskScope.Workspace, name: string, source: string, execution?: ProcessExecution | ShellExecution, problemMatchers?: string | string[]): void; - - /** - * The task's definition. - */ - definition: TaskDefinition; - - /** - * The task's scope. - */ - scope?: typeof TaskScope.Global | typeof TaskScope.Workspace | WorkspaceFolder; - - /** - * The task's name - */ - name: string; - - /** - * The task's execution engine - */ - execution: ProcessExecution | ShellExecution; - - /** - * Whether the task is a background task or not. - */ - isBackground: boolean; - - /** - * A human-readable string describing the source of this - * shell task, e.g. 'gulp' or 'npm'. - */ - source: string; - - /** - * The task group this tasks belongs to. See TaskGroup - * for a predefined set of available groups. - * Defaults to undefined meaning that the task doesn't - * belong to any special group. - */ - group?: TaskGroup; - - /** - * The presentation options. Defaults to an empty literal. - */ - presentationOptions: TaskPresentationOptions; - - /** - * The problem matchers attached to the task. Defaults to an empty - * array. - */ - problemMatchers: string[]; - } - - /** - * A task provider allows to add tasks to the task service. - * A task provider is registered via #workspace.registerTaskProvider. - */ - declare export interface TaskProvider { - /** - * Provides tasks. - * @param token A cancellation token. - * @return an array of tasks - */ - provideTasks(token?: CancellationToken): ProviderResult; - - /** - * Resolves a task that has no [`execution`](#Task.execution) set. Tasks are - * often created from information found in the `task.json`-file. Such tasks miss - * the information on how to execute them and a task provider must fill in - * the missing information in the `resolveTask`-method. - * - * @param task The task to resolve. - * @param token A cancellation token. - * @return The resolved task - */ - resolveTask(task: Task, token?: CancellationToken): ProviderResult | void; - } - - /** - * An object representing an executed Task. It can be used - * to terminate a task. - * - * This interface is not intended to be implemented. - */ - declare export type TaskExecution = { - /** - * The task that got started. - */ - task: Task; - - /** - * Terminates the task execution. - */ - terminate(): void; - } - - /** - * An event signaling the start of a task execution. - * - * This interface is not intended to be implemented. - */ - declare export type TaskStartEvent = { - /** - * The task item representing the task that got started. - */ - execution: TaskExecution; - } - - /** - * An event signaling the end of an executed task. - * - * This interface is not intended to be implemented. - */ - declare export type TaskEndEvent = { - /** - * The task item representing the task that finished. - */ - execution: TaskExecution; - } - - /** - * An event signaling the start of a process execution - * triggered through a task - */ - declare export type TaskProcessStartEvent = { - - /** - * The task execution for which the process got started. - */ - execution: TaskExecution; - - /** - * The underlying process id. - */ - processId: number; - } - - /** - * An event signaling the end of a process execution - * triggered through a task - */ - declare export type TaskProcessEndEvent = { - - /** - * The task execution for which the process got started. - */ - execution: TaskExecution; - - /** - * The process's exit code. - */ - exitCode: number; - } - - declare export type TaskFilter = { - /** - * The task version as used in the tasks.json file. - * The string support the package.json semver notation. - */ - version?: string; - - /** - * The task type to return; - */ - type?: string; - } - - /** - * Namespace describing the environment the editor runs in. - */ - declare export var env: { - - /** - * The application name of the editor, like 'VS Code'. - * - * @readonly - */ - appName: string; - - /** - * The application root folder from which the editor is running. - * - * @readonly - */ - appRoot: string; - - /** - * Represents the preferred user-language, like `de-CH`, `fr`, or `en-US`. - * - * @readonly - */ - language: string; - - /** - * A unique identifier for the computer. - * - * @readonly - */ - machineId: string; - - /** - * A unique identifier for the current session. - * Changes each time the editor is started. - * - * @readonly - */ - sessionId: string; - } - - /** - * Namespace for dealing with commands. In short, a command is a function with a - * unique identifier. The function is sometimes also called _command handler_. - * - * Commands can be added to the editor using the [registerCommand](#commands.registerCommand) - * and [registerTextEditorCommand](#commands.registerTextEditorCommand) functions. Commands - * can be executed [manually](#commands.executeCommand) or from a UI gesture. Those are: - * - * * palette - Use the `commands`-section in `package.json` to make a command show in - * the [command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette). - * * keybinding - Use the `keybindings`-section in `package.json` to enable - * [keybindings](https://code.visualstudio.com/docs/getstarted/keybindings#_customizing-shortcuts) - * for your extension. - * - * Commands from other extensions and from the editor itself are accessible to an extension. However, - * when invoking an editor command not all argument types are supported. - * - * This is a sample that registers a command handler and adds an entry for that command to the palette. First - * register a command handler with the identifier `extension.sayHello`. - * ```javascript - * commands.registerCommand('extension.sayHello', () => { - * window.showInformationMessage('Hello World!'); - * }); - * ``` - * Second, bind the command identifier to a title under which it will show in the palette (`package.json`). - * ```json - * { - * "contributes": { - * "commands": [{ - * "command": "extension.sayHello", - * "title": "Hello World" - * }] - * } - * } - * ``` - */ - declare export var commands: { - - /** - * Registers a command that can be invoked via a keyboard shortcut, - * a menu item, an action, or directly. - * - * Registering a command with an existing command identifier twice - * will cause an error. - * - * @param command A unique identifier for the command. - * @param callback A command handler function. - * @param thisArg The `this` context used when invoking the handler function. - * @return Disposable which unregisters this command on disposal. - */ - registerCommand(command: string, callback: (...args: any[]) => any, thisArg?: any): Disposable; - - /** - * Registers a text editor command that can be invoked via a keyboard shortcut, - * a menu item, an action, or directly. - * - * Text editor commands are different from ordinary [commands](#commands.registerCommand) as - * they only execute when there is an active editor when the command is called. Also, the - * command handler of an editor command has access to the active editor and to an - * [edit](#TextEditorEdit)-builder. - * - * @param command A unique identifier for the command. - * @param callback A command handler function with access to an [editor](#TextEditor) and an [edit](#TextEditorEdit). - * @param thisArg The `this` context used when invoking the handler function. - * @return Disposable which unregisters this command on disposal. - */ - registerTextEditorCommand(command: string, callback: (textEditor: TextEditor, edit: TextEditorEdit, ...args: any[]) => void, thisArg?: any): Disposable; - - /** - * Executes the command denoted by the given command identifier. - * - * * *Note 1:* When executing an editor command not all types are allowed to - * be passed as arguments. Allowed are the primitive types `string`, `boolean`, - * `number`, `undefined`, and `null`, as well as [`Position`](#Position), [`Range`](#Range), [`Uri`](#Uri) and [`Location`](#Location). - * * *Note 2:* There are no restrictions when executing commands that have been contributed - * by extensions. - * - * @param command Identifier of the command to execute. - * @param rest Parameters passed to the command function. - * @return A thenable that resolves to the returned value of the given command. `undefined` when - * the command handler function doesn't return anything. - */ - executeCommand(command: string, ...rest: any[]): Thenable; - - /** - * Retrieve the list of all available commands. Commands starting an underscore are - * treated as internal commands. - * - * @param filterInternal Set `true` to not see internal commands (starting with an underscore) - * @return Thenable that resolves to a list of command ids. - */ - getCommands(filterInternal?: boolean): Thenable; - - /* BEGIN PROPOSED *******************************************************************************/ - /** - * Registers a diff information command that can be invoked via a keyboard shortcut, - * a menu item, an action, or directly. - * - * Diff information commands are different from ordinary [commands](#commands.registerCommand) as - * they only execute when there is an active diff editor when the command is called, and the diff - * information has been computed. Also, the command handler of an editor command has access to - * the diff information. - * - * @param command A unique identifier for the command. - * @param callback A command handler function with access to the [diff information](#LineChange). - * @param thisArg The `this` context used when invoking the handler function. - * @return Disposable which unregisters this command on disposal. - */ - registerDiffInformationCommand(command: string, callback: (diff: LineChange[], ...args: any[]) => any, thisArg?: any): Disposable; - /* END PROPOSED *********************************************************************************/ - } - - /** - * Represents the state of a window. - */ - declare export interface WindowState { - - /** - * Whether the current window is focused. - */ - +focused: boolean; - } - - /** - * Namespace for dealing with the current window of the editor. That is visible - * and active editors, as well as, UI elements to show messages, selections, and - * asking for user input. - */ - declare export var window: { - - /** - * The currently active editor or `undefined`. The active editor is the one - * that currently has focus or, when none has focus, the one that has changed - * input most recently. - */ - activeTextEditor: ?TextEditor; - - /** - * The currently visible editors or an empty array. - */ - visibleTextEditors: TextEditor[]; - - /** - * An [event](#Event) which fires when the [active editor](#window.activeTextEditor) - * has changed. *Note* that the event also fires when the active editor changes - * to `undefined`. - */ - +onDidChangeActiveTextEditor: Event; - - /** - * An [event](#Event) which fires when the array of [visible editors](#window.visibleTextEditors) - * has changed. - */ - +onDidChangeVisibleTextEditors: Event; - - /** - * An [event](#Event) which fires when the selection in an editor has changed. - */ - +onDidChangeTextEditorSelection: Event; - - /** - * An [event](#Event) which fires when the options of an editor have changed. - */ - +onDidChangeTextEditorOptions: Event; - - /** - * An [event](#Event) which fires when the view column of an editor has changed. - */ - +onDidChangeTextEditorViewColumn: Event; - - /** - * An [event](#Event) which fires when a terminal is disposed. - */ - +onDidCloseTerminal: Event; - - /** - * Represents the current window's state. - * - * @readonly - */ - state: WindowState; - - /** - * An [event](#Event) which fires when the focus state of the current window - * changes. The value of the event represents whether the window is focused. - */ - +onDidChangeWindowState: Event; - - /** - * Show the given document in a text editor. A [column](#ViewColumn) can be provided - * to control where the editor is being shown. Might change the [active editor](#window.activeTextEditor). - * - * @param document A text document to be shown. - * @param column A view column in which the [editor](#TextEditor) should be shown. The default is the [one](#ViewColumn.One), other values - * are adjusted to be `Min(column, columnCount + 1)`, the [active](#ViewColumn.Active)-column is - * not adjusted. - * @param preserveFocus When `true` the editor will not take focus. - * @return A promise that resolves to an [editor](#TextEditor). - */ - showTextDocument(document: TextDocument, column?: ViewColumnType, preserveFocus?: boolean): Thenable; - - /** - * Show the given document in a text editor. [Options](#TextDocumentShowOptions) can be provided - * to control options of the editor is being shown. Might change the [active editor](#window.activeTextEditor). - * - * @param document A text document to be shown. - * @param options [Editor options](#TextDocumentShowOptions) to configure the behavior of showing the [editor](#TextEditor). - * @return A promise that resolves to an [editor](#TextEditor). - */ - showTextDocument(document: TextDocument, options?: TextDocumentShowOptions): Thenable; - - /** - * A short-hand for `openTextDocument(uri).then(document => showTextDocument(document, options))`. - * - * @see [openTextDocument](#openTextDocument) - * - * @param uri A resource identifier. - * @param options [Editor options](#TextDocumentShowOptions) to configure the behavior of showing the [editor](#TextEditor). - * @return A promise that resolves to an [editor](#TextEditor). - */ - showTextDocument(uri: Uri, options?: TextDocumentShowOptions): Thenable; - - /** - * Create a TextEditorDecorationType that can be used to add decorations to text editors. - * - * @param options Rendering options for the decoration type. - * @return A new decoration type instance. - */ - createTextEditorDecorationType(options: DecorationRenderOptions): TextEditorDecorationType; - - /** - * Show an information message to users. Optionally provide an array of items which will be presented as - * clickable buttons. - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - showInformationMessage(message: string, options?: MessageOptions, ...items: string[]): Thenable; - - /** - * Show an information message. - * - * @see [showInformationMessage](#window.showInformationMessage) - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - showInformationMessage(message: string, options?: MessageOptions, ...items: T[]): Thenable; - - /** - * Show a warning message. - * - * @see [showInformationMessage](#window.showInformationMessage) - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - showWarningMessage(message: string, options?: MessageOptions, ...items: string[]): Thenable; - - /** - * Show a warning message. - * - * @see [showInformationMessage](#window.showInformationMessage) - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - showWarningMessage(message: string, options?: MessageOptions, ...items: T[]): Thenable; - - /** - * Show an error message. - * - * @see [showInformationMessage](#window.showInformationMessage) - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - showErrorMessage(message: string, options?: MessageOptions, ...items: string[]): Thenable; - - /** - * Show an error message. - * - * @see [showInformationMessage](#window.showInformationMessage) - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - showErrorMessage(message: string, options?: MessageOptions, ...items: T[]): Thenable; - - /** - * Shows a selection list. - * - * @param items An array of strings, or a promise that resolves to an array of strings. - * @param options Configures the behavior of the selection list. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to the selection or `undefined`. - */ - showQuickPick(items: string[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable; - - /** - * Shows a selection list. - * - * @param items An array of items, or a promise that resolves to an array of items. - * @param options Configures the behavior of the selection list. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to the selected item or `undefined`. - */ - showQuickPick(items: T[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable; - - /** - * Shows a selection list of [workspace folders](#workspace.workspaceFolders) to pick from. - * Returns `undefined` if no folder is open. - * - * @param options Configures the behavior of the workspace folder list. - * @return A promise that resolves to the workspace folder or `undefined`. - */ - showWorkspaceFolderPick(options?: WorkspaceFolderPickOptions): Thenable; - - /** - * Shows a file open dialog to the user which allows to select a file - * for opening-purposes. - * - * @param options Options that control the dialog. - * @returns A promise that resolves to the selected resources or `undefined`. - */ - showOpenDialog(options: OpenDialogOptions): Thenable; - - /** - * Shows a file save dialog to the user which allows to select a file - * for saving-purposes. - * - * @param options Options that control the dialog. - * @returns A promise that resolves to the selected resource or `undefined`. - */ - showSaveDialog(options: SaveDialogOptions): Thenable; - - /** - * Opens an input box to ask the user for input. - * - * The returned value will be `undefined` if the input box was canceled (e.g. pressing ESC). Otherwise the - * returned value will be the string typed by the user or an empty string if the user did not type - * anything but dismissed the input box with OK. - * - * @param options Configures the behavior of the input box. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to a string the user provided or to `undefined` in case of dismissal. - */ - showInputBox(options?: InputBoxOptions, token?: CancellationToken): Thenable; - - /** - * Create a new [output channel](#OutputChannel) with the given name. - * - * @param name Human-readable string which will be used to represent the channel in the UI. - */ - createOutputChannel(name: string): OutputChannel; - - /** - * Set a message to the status bar. This is a short hand for the more powerful - * status bar [items](#window.createStatusBarItem). - * - * @param text The message to show, supports icon substitution as in status bar [items](#StatusBarItem.text). - * @param hideAfterTimeout Timeout in milliseconds after which the message will be disposed. - * @return A disposable which hides the status bar message. - */ - setStatusBarMessage(text: string, hideAfterTimeout: number): Disposable; - - /** - * Set a message to the status bar. This is a short hand for the more powerful - * status bar [items](#window.createStatusBarItem). - * - * @param text The message to show, supports icon substitution as in status bar [items](#StatusBarItem.text). - * @param hideWhenDone Thenable on which completion (resolve or reject) the message will be disposed. - * @return A disposable which hides the status bar message. - */ - setStatusBarMessage(text: string, hideWhenDone: Thenable): Disposable; - - /** - * Set a message to the status bar. This is a short hand for the more powerful - * status bar [items](#window.createStatusBarItem). - * - * *Note* that status bar messages stack and that they must be disposed when no - * longer used. - * - * @param text The message to show, supports icon substitution as in status bar [items](#StatusBarItem.text). - * @return A disposable which hides the status bar message. - */ - setStatusBarMessage(text: string): Disposable; - - /** - * Show progress in the editor. Progress is shown while running the given callback - * and while the promise it returned isn't resolved nor rejected. The location at which - * progress should show (and other details) is defined via the passed [`ProgressOptions`](#ProgressOptions). - * - * @param task A callback returning a promise. Progress state can be reported with - * the provided [progress](#Progress)-object. - * @return The thenable the task-callback returned. - */ - withProgress(options: ProgressOptions, task: (progress: Progress<{ message?: string; }>) => Thenable): Thenable; - - /** - * Creates a status bar [item](#StatusBarItem). - * - * @param alignment The alignment of the item. - * @param priority The priority of the item. Higher values mean the item should be shown more to the left. - * @return A new status bar item. - */ - createStatusBarItem(alignment?: StatusBarAlignmentType, priority?: number): StatusBarItem; - - /** - * Creates a [Terminal](#Terminal). The cwd of the terminal will be the workspace directory - * if it exists, regardless of whether an explicit customStartPath setting exists. - * - * @param name Optional human-readable string which will be used to represent the terminal in the UI. - * @param shellPath Optional path to a custom shell executable to be used in the terminal. - * @param shellArgs Optional args for the custom shell executable, this does not work on Windows (see #8429) - * @return A new Terminal. - */ - createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): Terminal; - - /** - * Creates a [Terminal](#Terminal). The cwd of the terminal will be the workspace directory - * if it exists, regardless of whether an explicit customStartPath setting exists. - * - * @param options A TerminalOptions object describing the characteristics of the new terminal. - * @return A new Terminal. - */ - createTerminal(options: TerminalOptions): Terminal; - - /** - * Register a [TreeDataProvider](#TreeDataProvider) for the view contributed using the extension point `views`. - * @param viewId Id of the view contributed using the extension point `views`. - * @param treeDataProvider A [TreeDataProvider](#TreeDataProvider) that provides tree data for the view - */ - registerTreeDataProvider(viewId: string, treeDataProvider: TreeDataProvider): Disposable; - - /* BEGIN PROPOSED *******************************************************************************/ - registerDecorationProvider(provider: DecorationProvider): Disposable; - /* END PROPOSED *********************************************************************************/ - } - - /** - * A data provider that provides tree data - */ - declare export interface TreeDataProvider { - /** - * An optional event to signal that an element or root has changed. - * This will trigger the view to update the changed element/root and its children recursively (if shown). - * To signal that root has changed, do not pass any argument or pass `undefined` or `null`. - */ - onDidChangeTreeData?: Event; - - /** - * Get [TreeItem](#TreeItem) representation of the `element` - * - * @param element The element for which [TreeItem](#TreeItem) representation is asked for. - * @return [TreeItem](#TreeItem) representation of the element - */ - getTreeItem(element: T): TreeItem | Thenable; - - /** - * Get the children of `element` or root if no element is passed. - * - * @param element The element from which the provider gets children. Can be `undefined`. - * @return Children of `element` or root if no element is passed. - */ - getChildren(element?: T): ProviderResult; - } - - declare export class TreeItem { - /** - * A human-readable string describing this item. When `falsy`, it is derived from [resourceUri](#TreeItem.resourceUri). - */ - label?: string; - - /** - * Optional id for the tree item that has to be unique across tree. The id is used to preserve the selection and expansion state of the tree item. - * - * If not provided, an id is generated using the tree item's label. **Note** that when labels change, ids will change and that selection and expansion state cannot be kept stable anymore. - */ - id?: string; - - /** - * The icon path for the tree item. When `falsy`, it is derived from [resourceUri](#TreeItem.resourceUri). - */ - iconPath?: string | Uri | { light: string | Uri; dark: string | Uri }; - - /** - * The [uri](#Uri) of the resource representing this item. - * - * Will be used to derive the [label](#TreeItem.label), when it is not provided. - * Will be used to derive the icon from current file icon theme, when [iconPath](#TreeItem.iconPath) is not provided. - */ - resourceUri?: Uri; - - /** - * The [command](#Command) which should be run when the tree item is selected. - */ - command?: Command; - - /** - * [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item. - */ - collapsibleState?: TreeItemCollapsibleStateType; - - /** - * Context value of the tree item. This can be used to contribute item specific actions in the tree. - * For example, a tree item is given a context value as `folder`. When contributing actions to `view/item/context` - * using `menus` extension point, you can specify context value for key `viewItem` in `when` expression like `viewItem == folder`. - * ``` - * "contributes": { - * "menus": { - * "view/item/context": [ - * { - * "command": "extension.deleteFolder", - * "when": "viewItem == folder" - * } - * ] - * } - * } - * ``` - * This will show action `extension.deleteFolder` only for items with `contextValue` is `folder`. - */ - contextValue?: string; - - /** - * @param label A human-readable string describing this item - * @param collapsibleState [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item. Default is [TreeItemCollapsibleState.None](#TreeItemCollapsibleState.None) - */ - constructor(label: string, collapsibleState?: TreeItemCollapsibleStateType): void; - - /** - * @param resourceUri The [uri](#Uri) of the resource representing this item. - * @param collapsibleState [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item. Default is [TreeItemCollapsibleState.None](#TreeItemCollapsibleState.None) - */ - constructor(resourceUri: Uri, collapsibleState?: TreeItemCollapsibleStateType): void; - } - - /** - * Collapsible state of the tree item - */ - declare export var TreeItemCollapsibleState: { - /** - * Determines an item can be neither collapsed nor expanded. Implies it has no children. - */ - +None: 0, - /** - * Determines an item is collapsed - */ - +Collapsed: 1, - /** - * Determines an item is expanded - */ - +Expanded: 2 - } - declare export type TreeItemCollapsibleStateType = $Values; - - /** - * Value-object describing what options a terminal should use. - */ - declare export interface TerminalOptions { - /** - * A human-readable string which will be used to represent the terminal in the UI. - */ - name?: string; - - /** - * A path to a custom shell executable to be used in the terminal. - */ - shellPath?: string; - - /** - * Args for the custom shell executable, this does not work on Windows (see #8429) - */ - shellArgs?: string[]; - - /** - * A path for the current working directory to be used for the terminal. - */ - cwd?: string; - - /** - * Object with environment variables that will be added to the VS Code process. - */ - env?: { [key: string]: string | null }; - } - - /** - * A location in the editor at which progress information can be shown. It depends on the - * location how progress is visually represented. - */ - declare export var ProgressLocation: { - - /** - * Show progress for the source control viewlet, as overlay for the icon and as progress bar - * inside the viewlet (when visible). - */ - +SourceControl: 1, - - /** - * Show progress in the status bar of the editor. - */ - +Window: 10 - } - declare export type ProgressLocationType = $Values; - - /** - * Value-object describing where and how progress should show. - */ - declare export interface ProgressOptions { - - /** - * The location at which progress should show. - */ - location: ProgressLocationType; - - /** - * A human-readable string which will be used to describe the - * operation. - */ - title?: string; - } - - /** - * An event describing an individual change in the text of a [document](#TextDocument). - */ - declare export interface TextDocumentContentChangeEvent { - /** - * The range that got replaced. - */ - range: Range; - /** - * The length of the range that got replaced. - */ - rangeLength: number; - /** - * The new text for the range. - */ - text: string; - } - - /** - * An event describing a transactional [document](#TextDocument) change. - */ - declare export interface TextDocumentChangeEvent { - - /** - * The affected document. - */ - document: TextDocument; - - /** - * An array of content changes. - */ - contentChanges: TextDocumentContentChangeEvent[]; - } - - /** - * Represents reasons why a text document is saved. - */ - declare export var TextDocumentSaveReason: { - - /** - * Manually triggered, e.g. by the user pressing save, by starting debugging, - * or by an API call. - */ - +Manual: 1, - - /** - * Automatic after a delay. - */ - +AfterDelay: 2, - - /** - * When the editor lost focus. - */ - +FocusOut: 3 - } - declare export type TextDocumentSaveReasonType = $Values; - - /** - * An event that is fired when a [document](#TextDocument) will be saved. - * - * To make modifications to the document before it is being saved, call the - * [`waitUntil`](#TextDocumentWillSaveEvent.waitUntil)-function with a thenable - * that resolves to an array of [text edits](#TextEdit). - */ - declare export interface TextDocumentWillSaveEvent { - - /** - * The document that will be saved. - */ - document: TextDocument; - - /** - * The reason why save was triggered. - */ - reason: TextDocumentSaveReasonType; - - /** - * Allows to pause the event loop and to apply [pre-save-edits](#TextEdit). - * Edits of subsequent calls to this function will be applied in order. The - * edits will be *ignored* if concurrent modifications of the document happened. - * - * *Note:* This function can only be called during event dispatch and not - * in an asynchronous manner: - * - * ```ts - * workspace.onWillSaveTextDocument(event => { - * // async, will *throw* an error - * setTimeout(() => event.waitUntil(promise)); - * - * // sync, OK - * event.waitUntil(promise); - * }) - * ``` - * - * @param thenable A thenable that resolves to [pre-save-edits](#TextEdit). - */ - waitUntil(thenable: Thenable): void; - - /** - * Allows to pause the event loop until the provided thenable resolved. - * - * *Note:* This function can only be called during event dispatch. - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - } - - /** - * An event describing a change to the set of [workspace folders](#workspace.workspaceFolders). - */ - declare export interface WorkspaceFoldersChangeEvent { - /** - * Added workspace folders. - */ - +added: WorkspaceFolder[]; - - /** - * Removed workspace folders. - */ - +removed: WorkspaceFolder[]; - } - - /** - * A workspace folder is one of potentially many roots opened by the editor. All workspace folders - * are equal which means there is no notion of an active or master workspace folder. - */ - declare export interface WorkspaceFolder { - - /** - * The associated uri for this workspace folder. - * - * *Note:* The [Uri](#Uri)-type was intentionally chosen such that future releases of the editor can support - * workspace folders that are not stored on the local disk, e.g. `ftp://server/workspaces/foo`. - */ - +uri: Uri; - - /** - * The name of this workspace folder. Defaults to - * the basename of its [uri-path](#Uri.path) - */ - +name: string; - - /** - * The ordinal number of this workspace folder. - */ - +index: number; - } - - /** - * Namespace for dealing with the current workspace. A workspace is the representation - * of the folder that has been opened. There is no workspace when just a file but not a - * folder has been opened. - * - * The workspace offers support for [listening](#workspace.createFileSystemWatcher) to fs - * events and for [finding](#workspace.findFiles) files. Both perform well and run _outside_ - * the editor-process so that they should be always used instead of nodejs-equivalents. - */ - declare export var workspace: { - - /** - * List of workspace folders or `undefined` when no folder is open. - * *Note* that the first entry corresponds to the value of `rootPath`. - * - * @readonly - */ - workspaceFolders: ?WorkspaceFolder[]; - - /** - * The name of the workspace. `undefined` when no folder - * has been opened. - * - * @readonly - */ - name: ?string; - - /** - * An event that is emitted when a workspace folder is added or removed. - */ - +onDidChangeWorkspaceFolders: Event; - - /** - * Returns the [workspace folder](#WorkspaceFolder) that contains a given uri. - * * returns `undefined` when the given uri doesn't match any workspace folder - * * returns the *input* when the given uri is a workspace folder itself - * - * @param uri An uri. - * @return A workspace folder or `undefined` - */ - getWorkspaceFolder(uri: Uri): ?WorkspaceFolder; - - /** - * Returns a path that is relative to the workspace folder or folders. - * - * When there are no [workspace folders](#workspace.workspaceFolders) or when the path - * is not contained in them, the input is returned. - * - * @param pathOrUri A path or uri. When a uri is given its [fsPath](#Uri.fsPath) is used. - * @param includeWorkspaceFolder When `true` and when the given path is contained inside a - * workspace folder the name of the workspace is prepended. Defaults to `true` when there are - * multiple workspace folders and `false` otherwise. - * @return A path relative to the root or the input. - */ - asRelativePath(pathOrUri: string | Uri, includeWorkspaceFolder?: boolean): string; - - /** - * Creates a file system watcher. - * - * A glob pattern that filters the file events on their absolute path must be provided. Optionally, - * flags to ignore certain kinds of events can be provided. To stop listening to events the watcher must be disposed. - * - * *Note* that only files within the current [workspace folders](#workspace.workspaceFolders) can be watched. - * - * @param globPattern A [glob pattern](#GlobPattern) that is applied to the absolute paths of created, changed, - * and deleted files. Use a [relative pattern](#RelativePattern) to limit events to a certain [workspace folder](#WorkspaceFolder). - * @param ignoreCreateEvents Ignore when files have been created. - * @param ignoreChangeEvents Ignore when files have been changed. - * @param ignoreDeleteEvents Ignore when files have been deleted. - * @return A new file system watcher instance. - */ - createFileSystemWatcher(globPattern: GlobPattern, ignoreCreateEvents?: boolean, ignoreChangeEvents?: boolean, ignoreDeleteEvents?: boolean): FileSystemWatcher; - - /** - * Find files across all [workspace folders](#workspace.workspaceFolders) in the workspace. - * - * @sample `findFiles('**​/*.js', '**​/node_modules/**', 10)` - * @param include A [glob pattern](#GlobPattern) that defines the files to search for. The glob pattern - * will be matched against the file paths of resulting matches relative to their workspace. Use a [relative pattern](#RelativePattern) - * to restrict the search results to a [workspace folder](#WorkspaceFolder). - * @param exclude A [glob pattern](#GlobPattern) that defines files and folders to exclude. The glob pattern - * will be matched against the file paths of resulting matches relative to their workspace. When `undefined` only default excludes will - * apply, when `null` no excludes will apply. - * @param maxResults An upper-bound for the result. - * @param token A token that can be used to signal cancellation to the underlying search engine. - * @return A thenable that resolves to an array of resource identifiers. Will return no results if no - * [workspace folders](#workspace.workspaceFolders) are opened. - */ - findFiles(include: GlobPattern, exclude?: GlobPattern | null, maxResults?: number, token?: CancellationToken): Thenable; - - /** - * Save all dirty files. - * - * @param includeUntitled Also save files that have been created during this session. - * @return A thenable that resolves when the files have been saved. - */ - saveAll(includeUntitled?: boolean): Thenable; - - /** - * Make changes to one or many resources as defined by the given - * [workspace edit](#WorkspaceEdit). - * - * When applying a workspace edit, the editor implements an 'all-or-nothing'-strategy, - * that means failure to load one document or make changes to one document will cause - * the edit to be rejected. - * - * @param edit A workspace edit. - * @return A thenable that resolves when the edit could be applied. - */ - applyEdit(edit: WorkspaceEdit): Thenable; - - /** - * All text documents currently known to the system. - * - * @readonly - */ - textDocuments: TextDocument[]; - - /** - * Opens a document. Will return early if this document is already open. Otherwise - * the document is loaded and the [didOpen](#workspace.onDidOpenTextDocument)-event fires. - * - * The document is denoted by an [uri](#Uri). Depending on the [scheme](#Uri.scheme) the - * following rules apply: - * * `file`-scheme: Open a file on disk, will be rejected if the file does not exist or cannot be loaded. - * * `untitled`-scheme: A new file that should be saved on disk, e.g. `untitled:c:\frodo\new.js`. The language - * will be derived from the file name. - * * For all other schemes the registered text document content [providers](#TextDocumentContentProvider) are consulted. - * - * *Note* that the lifecycle of the returned document is owned by the editor and not by the extension. That means an - * [`onDidClose`](#workspace.onDidCloseTextDocument)-event can occur at any time after opening it. - * - * @param uri Identifies the resource to open. - * @return A promise that resolves to a [document](#TextDocument). - */ - openTextDocument(uri: Uri): Thenable; - - /** - * A short-hand for `openTextDocument(Uri.file(fileName))`. - * - * @see [openTextDocument](#openTextDocument) - * @param fileName A name of a file on disk. - * @return A promise that resolves to a [document](#TextDocument). - */ - openTextDocument(fileName: string): Thenable; - - /** - * Opens an untitled text document. The editor will prompt the user for a file - * path when the document is to be saved. The `options` parameter allows to - * specify the *language* and/or the *content* of the document. - * - * @param options Options to control how the document will be created. - * @return A promise that resolves to a [document](#TextDocument). - */ - openTextDocument(options?: { language?: string; content?: string; }): Thenable; - - /** - * Register a text document content provider. - * - * Only one provider can be registered per scheme. - * - * @param scheme The uri-scheme to register for. - * @param provider A content provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerTextDocumentContentProvider(scheme: string, provider: TextDocumentContentProvider): Disposable; - - /** - * An event that is emitted when a [text document](#TextDocument) is opened. - * - * To add an event listener when a visible text document is opened, use the [TextEditor](#TextEditor) events in the - * [window](#window) namespace. Note that: - * - * - The event is emitted before the [document](#TextDocument) is updated in the - * [active text editor](#window.activeTextEditor) - * - When a [text document](#TextDocument) is already open (e.g.: open in another [visible text editor](#window.visibleTextEditors)) this event is not emitted - * - */ - +onDidOpenTextDocument: Event; - - /** - * An event that is emitted when a [text document](#TextDocument) is disposed. - * - * To add an event listener when a visible text document is closed, use the [TextEditor](#TextEditor) events in the - * [window](#window) namespace. Note that this event is not emitted when a [TextEditor](#TextEditor) is closed - * but the document remains open in another [visible text editor](#window.visibleTextEditors). - */ - +onDidCloseTextDocument: Event; - - /** - * An event that is emitted when a [text document](#TextDocument) is changed. This usually happens - * when the [contents](#TextDocument.getText) changes but also when other things like the - * [dirty](#TextDocument.isDirty)-state changes. - */ - +onDidChangeTextDocument: Event; - - /** - * An event that is emitted when a [text document](#TextDocument) will be saved to disk. - * - * *Note 1:* Subscribers can delay saving by registering asynchronous work. For the sake of data integrity the editor - * might save without firing this event. For instance when shutting down with dirty files. - * - * *Note 2:* Subscribers are called sequentially and they can [delay](#TextDocumentWillSaveEvent.waitUntil) saving - * by registering asynchronous work. Protection against misbehaving listeners is implemented as such: - * * there is an overall time budget that all listeners share and if that is exhausted no further listener is called - * * listeners that take a long time or produce errors frequently will not be called anymore - * - * The current thresholds are 1.5 seconds as overall time budget and a listener can misbehave 3 times before being ignored. - */ - +onWillSaveTextDocument: Event; - - /** - * An event that is emitted when a [text document](#TextDocument) is saved to disk. - */ - +onDidSaveTextDocument: Event; - - /** - * Get a workspace configuration object. - * - * When a section-identifier is provided only that part of the configuration - * is returned. Dots in the section-identifier are interpreted as child-access, - * like `{ myExt: { setting: { doIt: true }}}` and `getConfiguration('myExt.setting').get('doIt') === true`. - * - * When a resource is provided, configuration scoped to that resource is returned. - * - * @param section A dot-separated identifier. - * @param resource A resource for which the configuration is asked for - * @return The full configuration or a subset. - */ - getConfiguration(section?: string, resource?: Uri): WorkspaceConfiguration; - - /** - * An event that is emitted when the [configuration](#WorkspaceConfiguration) changed. - */ - +onDidChangeConfiguration: Event; - - /** - * Register a filesystem provider for a given scheme, e.g. `ftp`. - * - * There can only be one provider per scheme and an error is being thrown when a scheme - * has been claimed by another provider or when it is reserved. - * - * @param scheme The uri-[scheme](#Uri.scheme) the provider registers for. - * @param provider The filesystem provider. - * @param options Immutable metadata about the provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options: { isCaseSensitive?: boolean }): Disposable; - - /* BEGIN PROPOSED *******************************************************************************/ - /** - * DEPRECATED - */ - registerSearchProvider(scheme: string, provider: FileSearchProvider & TextSearchProvider): Disposable; - - /** - * Register a file index provider. - * - * Only one provider can be registered per scheme. - * - * @param scheme The provider will be invoked for workspace folders that have this file scheme. - * @param provider The provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - // registerFileIndexProvider(scheme: string, provider: FileIndexProvider): Disposable; - - /** - * Register a search provider. - * - * Only one provider can be registered per scheme. - * - * @param scheme The provider will be invoked for workspace folders that have this file scheme. - * @param provider The provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerFileSearchProvider(scheme: string, provider: FileSearchProvider): Disposable; - - /** - * Register a text search provider. - * - * Only one provider can be registered per scheme. - * - * @param scheme The provider will be invoked for workspace folders that have this file scheme. - * @param provider The provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerTextSearchProvider(scheme: string, provider: TextSearchProvider): Disposable; - - /** - * Search text in files across all [workspace folders](#workspace.workspaceFolders) in the workspace. - * @param query The query parameters for the search - the search string, whether it's case-sensitive, or a regex, or matches whole words. - * @param callback A callback, called for each result - * @param token A token that can be used to signal cancellation to the underlying search engine. - * @return A thenable that resolves when the search is complete. - */ - findTextInFiles(query: TextSearchQuery, callback: (result: TextSearchResult) => void, token?: CancellationToken): Thenable; - - /** - * Search text in files across all [workspace folders](#workspace.workspaceFolders) in the workspace. - * @param query The query parameters for the search - the search string, whether it's case-sensitive, or a regex, or matches whole words. - * @param options An optional set of query options. Include and exclude patterns, maxResults, etc. - * @param callback A callback, called for each result - * @param token A token that can be used to signal cancellation to the underlying search engine. - * @return A thenable that resolves when the search is complete. - */ - findTextInFiles(query: TextSearchQuery, options: FindTextInFilesOptions, callback: (result: TextSearchResult) => void, token?: CancellationToken): Thenable; - - /** - * This method replaces `deleteCount` [workspace folders](#workspace.workspaceFolders) starting at index `start` - * by an optional set of `workspaceFoldersToAdd` on the `vscode.workspace.workspaceFolders` array. This "splice" - * behavior can be used to add, remove and change workspace folders in a single operation. - * - * If the first workspace folder is added, removed or changed, the currently executing extensions (including the * one that called this method) will be terminated and restarted so that the (deprecated) `rootPath` property is - * updated to point to the first workspace folder. - * - * Use the [`onDidChangeWorkspaceFolders()`](#onDidChangeWorkspaceFolders) event to get notified when the - * workspace folders have been updated. - * - * **Example:** adding a new workspace folder at the end of workspace folders - * ```typescript - * workspace.updateWorkspaceFolders(workspace.workspaceFolders ? workspace.workspaceFolders.length : 0, null, { uri: ...}); - * ``` - * - * **Example:** removing the first workspace folder - * ```typescript - * workspace.updateWorkspaceFolders(0, 1); - * ``` - * - * **Example:** replacing an existing workspace folder with a new one - * ```typescript - * workspace.updateWorkspaceFolders(0, 1, { uri: ...}); - * ``` - * - * It is valid to remove an existing workspace folder and add it again with a different name - * to rename that folder. - * - * **Note:** it is not valid to call [updateWorkspaceFolders()](#updateWorkspaceFolders) multiple times - * without waiting for the [`onDidChangeWorkspaceFolders()`](#onDidChangeWorkspaceFolders) to fire. - * - * @param start the zero-based location in the list of currently opened [workspace folders](#WorkspaceFolder) - * from which to start deleting workspace folders. - * @param deleteCount the optional number of workspace folders to remove. - * @param workspaceFoldersToAdd the optional variable set of workspace folders to add in place of the deleted ones. - * Each workspace is identified with a mandatory URI and an optional name. - * @return true if the operation was successfully started and false otherwise if arguments were used that would result - * in invalid workspace folder state (e.g. 2 folders with the same URI). - */ - updateWorkspaceFolders(start: number, deleteCount: ?number, ...workspaceFoldersToAdd: { uri: Uri, name?: string }[]): boolean; - /* END PROPOSED *********************************************************************************/ - } - - /** - * Namespace for tasks functionality. - */ - declare export var tasks: { - /** - * Register a task provider. - * - * @param type The task kind type this provider is registered for. - * @param provider A task provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerTaskProvider(type: string, provider: TaskProvider): Disposable; - - /** - * Fetches all tasks available in the systems. This includes tasks - * from `tasks.json` files as well as tasks from task providers - * contributed through extensions. - * - * @param filter a filter to filter the return tasks. - */ - fetchTasks(filter?: TaskFilter): Thenable; - - /** - * Executes a task that is managed by VS Code. The returned - * task execution can be used to terminate the task. - * - * @param task the task to execute - */ - executeTask(task: Task): Thenable; - - /** - * The currently active task executions or an empty array. - * - * @readonly - */ - +taskExecutions: $ReadOnlyArray; - - /** - * Fires when a task starts. - */ - +onDidStartTask: Event; - - /** - * Fires when a task ends. - */ - +onDidEndTask: Event; - - /** - * Fires when the underlying process has been started. - * This event will not fire for tasks that don't - * execute an underlying process. - */ - +onDidStartTaskProcess: Event; - - /** - * Fires when the underlying process has ended. - * This event will not fire for tasks that don't - * execute an underlying process. - */ - +onDidEndTaskProcess: Event; - } - - /** - * An event describing the change in Configuration - */ - declare export interface ConfigurationChangeEvent { - - /** - * Returns `true` if the given section for the given resource (if provided) is affected. - * - * @param section Configuration name, supports _dotted_ names. - * @param resource A resource Uri. - * @return `true` if the given section for the given resource (if provided) is affected. - */ - affectsConfiguration(section: string, resource?: Uri): boolean; - } - - /** - * Namespace for participating in language-specific editor [features](https://code.visualstudio.com/docs/editor/editingevolved), - * like IntelliSense, code actions, diagnostics etc. - * - * Many programming languages exist and there is huge variety in syntaxes, semantics, and paradigms. Despite that, features - * like automatic word-completion, code navigation, or code checking have become popular across different tools for different - * programming languages. - * - * The editor provides an API that makes it simple to provide such common features by having all UI and actions already in place and - * by allowing you to participate by providing data only. For instance, to contribute a hover all you have to do is provide a function - * that can be called with a [TextDocument](#TextDocument) and a [Position](#Position) returning hover info. The rest, like tracking the - * mouse, positioning the hover, keeping the hover stable etc. is taken care of by the editor. - * - * ```javascript - * languages.registerHoverProvider('javascript', { - * provideHover(document, position, token) { - * return new Hover('I am a hover!'); - * } - * }); - * ``` - * - * Registration is done using a [document selector](#DocumentSelector) which is either a language id, like `javascript` or - * a more complex [filter](#DocumentFilter) like `{ language: 'typescript', scheme: 'file' }`. Matching a document against such - * a selector will result in a [score](#languages.match) that is used to determine if and how a provider shall be used. When - * scores are equal the provider that came last wins. For features that allow full arity, like [hover](#languages.registerHoverProvider), - * the score is only checked to be `>0`, for other features, like [IntelliSense](#languages.registerCompletionItemProvider) the - * score is used for determining the order in which providers are asked to participate. - */ - declare export var languages: { - - /** - * Return the identifiers of all known languages. - * @return Promise resolving to an array of identifier strings. - */ - getLanguages(): Thenable; - - /** - * Compute the match between a document [selector](#DocumentSelector) and a document. Values - * greater than zero mean the selector matches the document. - * - * A match is computed according to these rules: - * 1. When [`DocumentSelector`](#DocumentSelector) is an array, compute the match for each contained `DocumentFilter` or language identifier and take the maximum value. - * 2. A string will be desugared to become the `language`-part of a [`DocumentFilter`](#DocumentFilter), so `"fooLang"` is like `{ language: "fooLang" }`. - * 3. A [`DocumentFilter`](#DocumentFilter) will be matched against the document by comparing its parts with the document. The following rules apply: - * 1. When the `DocumentFilter` is empty (`{}`) the result is `0` - * 2. When `scheme`, `language`, or `pattern` are defined but one doesn’t match, the result is `0` - * 3. Matching against `*` gives a score of `5`, matching via equality or via a glob-pattern gives a score of `10` - * 4. The result is the maximun value of each match - * - * Samples: - * ```js - * // default document from disk (file-scheme) - * doc.uri; //'file:///my/file.js' - * doc.languageId; // 'javascript' - * match('javascript', doc); // 10; - * match({language: 'javascript'}, doc); // 10; - * match({language: 'javascript', scheme: 'file'}, doc); // 10; - * match('*', doc); // 5 - * match('fooLang', doc); // 0 - * match(['fooLang', '*'], doc); // 5 - * - * // virtual document, e.g. from git-index - * doc.uri; // 'git:/my/file.js' - * doc.languageId; // 'javascript' - * match('javascript', doc); // 10; - * match({language: 'javascript', scheme: 'git'}, doc); // 10; - * match('*', doc); // 5 - * ``` - * - * @param selector A document selector. - * @param document A text document. - * @return A number `>0` when the selector matches and `0` when the selector does not match. - */ - match(selector: DocumentSelector, document: TextDocument): number; - - /** - * Create a diagnostics collection. - * - * @param name The [name](#DiagnosticCollection.name) of the collection. - * @return A new diagnostic collection. - */ - createDiagnosticCollection(name?: string): DiagnosticCollection; - - /** - * Register a completion provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and groups of equal score are sequentially asked for - * completion items. The process stops when one or many providers of a group return a - * result. A failing provider (rejected promise or exception) will not fail the whole - * operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A completion provider. - * @param triggerCharacters Trigger completion when the user types one of the characters, like `.` or `:`. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerCompletionItemProvider(selector: DocumentSelector, provider: CompletionItemProvider, ...triggerCharacters: string[]): Disposable; - - /** - * Register a code action provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A code action provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerCodeActionsProvider(selector: DocumentSelector, provider: CodeActionProvider): Disposable; - - /** - * Register a code lens provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A code lens provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerCodeLensProvider(selector: DocumentSelector, provider: CodeLensProvider): Disposable; - - /** - * Register a definition provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A definition provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerDefinitionProvider(selector: DocumentSelector, provider: DefinitionProvider): Disposable; - - /** - * Register an implementation provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An implementation provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerImplementationProvider(selector: DocumentSelector, provider: ImplementationProvider): Disposable; - - /** - * Register a type definition provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A type definition provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerTypeDefinitionProvider(selector: DocumentSelector, provider: TypeDefinitionProvider): Disposable; - - /** - * Register a hover provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A hover provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerHoverProvider(selector: DocumentSelector, provider: HoverProvider): Disposable; - - /** - * Register a document highlight provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and groups sequentially asked for document highlights. - * The process stops when a provider returns a `non-falsy` or `non-failure` result. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document highlight provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerDocumentHighlightProvider(selector: DocumentSelector, provider: DocumentHighlightProvider): Disposable; - - /** - * Register a document symbol provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document symbol provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerDocumentSymbolProvider(selector: DocumentSelector, provider: DocumentSymbolProvider): Disposable; - - /** - * Register a workspace symbol provider. - * - * Multiple providers can be registered. In that case providers are asked in parallel and - * the results are merged. A failing provider (rejected promise or exception) will not cause - * a failure of the whole operation. - * - * @param provider A workspace symbol provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerWorkspaceSymbolProvider(provider: WorkspaceSymbolProvider): Disposable; - - /** - * Register a reference provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A reference provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerReferenceProvider(selector: DocumentSelector, provider: ReferenceProvider): Disposable; - - /** - * Register a reference provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A rename provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerRenameProvider(selector: DocumentSelector, provider: RenameProvider): Disposable; - - /** - * Register a formatting provider for a document. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document formatting edit provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerDocumentFormattingEditProvider(selector: DocumentSelector, provider: DocumentFormattingEditProvider): Disposable; - - /** - * Register a formatting provider for a document range. - * - * *Note:* A document range provider is also a [document formatter](#DocumentFormattingEditProvider) - * which means there is no need to [register](registerDocumentFormattingEditProvider) a document - * formatter when also registering a range provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document range formatting edit provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerDocumentRangeFormattingEditProvider(selector: DocumentSelector, provider: DocumentRangeFormattingEditProvider): Disposable; - - /** - * Register a formatting provider that works on type. The provider is active when the user enables the setting `editor.formatOnType`. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An on type formatting edit provider. - * @param firstTriggerCharacter A character on which formatting should be triggered, like `}`. - * @param moreTriggerCharacter More trigger characters. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerOnTypeFormattingEditProvider(selector: DocumentSelector, provider: OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacter: string[]): Disposable; - - /** - * Register a signature help provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and called sequentially until a provider returns a - * valid result. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A signature help provider. - * @param triggerCharacters Trigger signature help when the user types one of the characters, like `,` or `(`. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerSignatureHelpProvider(selector: DocumentSelector, provider: SignatureHelpProvider, ...triggerCharacters: string[]): Disposable; - - /** - * Register a document link provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document link provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerDocumentLinkProvider(selector: DocumentSelector, provider: DocumentLinkProvider): Disposable; - - /** - * Register a color provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A color provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerColorProvider(selector: DocumentSelector, provider: DocumentColorProvider): Disposable; - - /** - * Set a [language configuration](#LanguageConfiguration) for a language. - * - * @param language A language identifier like `typescript`. - * @param configuration Language configuration. - * @return A [disposable](#Disposable) that unsets this configuration. - */ - setLanguageConfiguration(language: string, configuration: LanguageConfiguration): Disposable; - } - - /** - * Represents the input box in the Source Control viewlet. - */ - declare export interface SourceControlInputBox { - - /** - * Setter and getter for the contents of the input box. - */ - value: string; - - /** - * A string to show as place holder in the input box to guide the user. - */ - placeholder: string; - - /* BEGIN PROPOSED *******************************************************************************/ - /** - * A validation function for the input box. It's possible to change - * the validation provider simply by setting this property to a different function. - */ - +validateInput?: (value: string, cursorPosition: number) => ProviderResult; - /* END PROPOSED *********************************************************************************/ - } - - declare export interface QuickDiffProvider { - - /** - * Provide a [uri](#Uri) to the original resource of any given resource uri. - * - * @param uri The uri of the resource open in a text editor. - * @param token A cancellation token. - * @return A thenable that resolves to uri of the matching original resource. - */ - +provideOriginalResource?: (uri: Uri, token: CancellationToken) => ProviderResult; - } - - /** - * The theme-aware decorations for a - * [source control resource state](#SourceControlResourceState). - */ - declare export interface SourceControlResourceThemableDecorations { - - /** - * The icon path for a specific - * [source control resource state](#SourceControlResourceState). - */ - +iconPath?: string | Uri; - } - - /** - * The decorations for a [source control resource state](#SourceControlResourceState). - * Can be independently specified for light and dark themes. - */ - declare export interface SourceControlResourceDecorations extends SourceControlResourceThemableDecorations { - - /** - * Whether the [source control resource state](#SourceControlResourceState) should - * be striked-through in the UI. - */ - +strikeThrough?: boolean; - - /** - * Whether the [source control resource state](#SourceControlResourceState) should - * be faded in the UI. - */ - +faded?: boolean; - - /** - * The title for a specific - * [source control resource state](#SourceControlResourceState). - */ - +tooltip?: string; - - /** - * The light theme decorations. - */ - +light?: SourceControlResourceThemableDecorations; - - /** - * The dark theme decorations. - */ - +dark?: SourceControlResourceThemableDecorations; - - /* BEGIN PROPOSED *******************************************************************************/ - source?: string; - letter?: string; - color?: ThemeColor; - /* END PROPOSED *********************************************************************************/ - } - - /** - * An source control resource state represents the state of an underlying workspace - * resource within a certain [source control group](#SourceControlResourceGroup). - */ - declare export interface SourceControlResourceState { - - /** - * The [uri](#Uri) of the underlying resource inside the workspace. - */ - +resourceUri: Uri; - - /** - * The [command](#Command) which should be run when the resource - * state is open in the Source Control viewlet. - */ - +command?: Command; - - /** - * The [decorations](#SourceControlResourceDecorations) for this source control - * resource state. - */ - +decorations?: SourceControlResourceDecorations; - } - - /** - * A source control resource group is a collection of - * [source control resource states](#SourceControlResourceState). - */ - declare export interface SourceControlResourceGroup { - - /** - * The id of this source control resource group. - */ - +id: string; - - /** - * The label of this source control resource group. - */ - label: string; - - /** - * Whether this source control resource group is hidden when it contains - * no [source control resource states](#SourceControlResourceState). - */ - hideWhenEmpty?: boolean; - - /** - * This group's collection of - * [source control resource states](#SourceControlResourceState). - */ - resourceStates: SourceControlResourceState[]; - - /** - * Dispose this source control resource group. - */ - dispose(): void; - } - - /** - * An source control is able to provide [resource states](#SourceControlResourceState) - * to the editor and interact with the editor in several source control related ways. - */ - declare export interface SourceControl { - - /** - * The id of this source control. - */ - +id: string; - - /** - * The human-readable label of this source control. - */ - +label: string; - - /** - * The (optional) Uri of the root of this source control. - */ - +rootUri: ?Uri; - - /** - * The [input box](#SourceControlInputBox) for this source control. - */ - +inputBox: SourceControlInputBox; - - /** - * The UI-visible count of [resource states](#SourceControlResourceState) of - * this source control. - * - * Equals to the total number of [resource state](#SourceControlResourceState) - * of this source control, if undefined. - */ - count?: number; - - /** - * An optional [quick diff provider](#QuickDiffProvider). - */ - quickDiffProvider?: QuickDiffProvider; - - /** - * Optional commit template string. - * - * The Source Control viewlet will populate the Source Control - * input with this value when appropriate. - */ - commitTemplate?: string; - - /** - * Optional accept input command. - * - * This command will be invoked when the user accepts the value - * in the Source Control input. - */ - acceptInputCommand?: Command; - - /** - * Optional status bar commands. - * - * These commands will be displayed in the editor's status bar. - */ - statusBarCommands?: Command[]; - - /** - * Create a new [resource group](#SourceControlResourceGroup). - */ - createResourceGroup(id: string, label: string): SourceControlResourceGroup; - - /** - * Dispose this source control. - */ - dispose(): void; - } - - declare export var scm: { - - /** - * Creates a new [source control](#SourceControl) instance. - * - * @param id An `id` for the source control. Something short, eg: `git`. - * @param label A human-readable string for the source control. Eg: `Git`. - * @param rootUri An optional Uri of the root of the source control. Eg: `Uri.parse(workspaceRoot)`. - * @return An instance of [source control](#SourceControl). - */ - createSourceControl(id: string, label: string, rootUri?: Uri): SourceControl; - } - - /** - * Configuration for a debug session. - */ - declare export interface DebugConfiguration { - /** - * The type of the debug session. - */ - type: string; - - /** - * The name of the debug session. - */ - name: string; - - /** - * The request type of the debug session. - */ - request: string; - - /** - * Port of a debugger running locally. If set, VS Code will attempt to - * connect to 127.0.0.1 on this port instead of trying to spawn the debugger - * process itself. - */ - debugServer?: number; - - /** - * Additional debug type specific properties. - */ - [key: string]: any; - } - - /** - * A debug session. - */ - declare export interface DebugSession { - - /** - * The unique ID of this debug session. - */ - +id: string; - - /** - * The debug session's type from the [debug configuration](#DebugConfiguration). - */ - +type: string; - - /** - * The debug session's name from the [debug configuration](#DebugConfiguration). - */ - +name: string; - - /** - * Send a custom request to the debug adapter. - */ - customRequest(command: string, args?: any): Thenable; - } - - /** - * A custom Debug Adapter Protocol event received from a [debug session](#DebugSession). - */ - declare export interface DebugSessionCustomEvent { - /** - * The [debug session](#DebugSession) for which the custom event was received. - */ - session: DebugSession; - - /** - * Type of event. - */ - event: string; - - /** - * Event specific information. - */ - body?: any; - } - - /** - * A debug configuration provider allows to add the initial debug configurations to a newly created launch.json - * and to resolve a launch configuration before it is used to start a new debug session. - * A debug configuration provider is registered via #debug.registerDebugConfigurationProvider. - */ - declare export interface DebugConfigurationProvider { - /** - * Provides initial [debug configuration](#DebugConfiguration). If more than one debug configuration provider is - * registered for the same type, debug configurations are concatenated in arbitrary order. - * - * @param folder The workspace folder for which the configurations are used or undefined for a folderless setup. - * @param token A cancellation token. - * @return An array of [debug configurations](#DebugConfiguration). - */ - +provideDebugConfigurations?: (folder: ?WorkspaceFolder, token?: CancellationToken) => ProviderResult; - - /** - * Resolves a [debug configuration](#DebugConfiguration) by filling in missing values or by adding/changing/removing attributes. - * If more than one debug configuration provider is registered for the same type, the resolveDebugConfiguration calls are chained - * in arbitrary order and the initial debug configuration is piped through the chain. - * Returning the value 'undefined' prevents the debug session from starting. - * - * @param folder The workspace folder from which the configuration originates from or undefined for a folderless setup. - * @param debugConfiguration The [debug configuration](#DebugConfiguration) to resolve. - * @param token A cancellation token. - * @return The resolved debug configuration or undefined. - */ - +resolveDebugConfiguration?: (folder: ?WorkspaceFolder, debugConfiguration: DebugConfiguration, token?: CancellationToken) => ProviderResult; - - /* BEGIN PROPOSED *******************************************************************************/ - /** - * This optional method is called just before a debug adapter is started to determine its excutable path and arguments. - * Registering more than one debugAdapterExecutable for a type results in an error. - * @param folder The workspace folder from which the configuration originates from or undefined for a folderless setup. - * @param token A cancellation token. - * @return a [debug adapter's executable and optional arguments](#DebugAdapterExecutable) or undefined. - */ - +debugAdapterExecutable?: (folder: ?WorkspaceFolder, token?: CancellationToken) => ProviderResult; - /* END PROPOSED *********************************************************************************/ - - } - - /** - * Represents the debug console. - */ - declare export interface DebugConsole { - /** - * Append the given value to the debug console. - * - * @param value A string, falsy values will not be printed. - */ - append(value: string): void; - - /** - * Append the given value and a line feed character - * to the debug console. - * - * @param value A string, falsy values will be printed. - */ - appendLine(value: string): void; - } - - /** - * Namespace for dealing with debug sessions. - */ - declare export var debug: { - - /** - * The currently active [debug session](#DebugSession) or `undefined`. The active debug session is the one - * represented by the debug action floating window or the one currently shown in the drop down menu of the debug action floating window. - * If no debug session is active, the value is `undefined`. - */ - activeDebugSession: ?DebugSession; - - /** - * The currently active [debug console](#DebugConsole). - */ - activeDebugConsole: DebugConsole; - - /** - * List of breakpoints. - */ - breakpoints: Breakpoint[]; - - /** - * An [event](#Event) which fires when the [active debug session](#debug.activeDebugSession) - * has changed. *Note* that the event also fires when the active debug session changes - * to `undefined`. - */ - +onDidChangeActiveDebugSession: Event; - - /** - * An [event](#Event) which fires when a new [debug session](#DebugSession) has been started. - */ - +onDidStartDebugSession: Event; - - /** - * An [event](#Event) which fires when a custom DAP event is received from the [debug session](#DebugSession). - */ - +onDidReceiveDebugSessionCustomEvent: Event; - - /** - * An [event](#Event) which fires when a [debug session](#DebugSession) has terminated. - */ - +onDidTerminateDebugSession: Event; - - /** - * An event that is emitted when a breakpoint is added, removed, or changed. - */ - +onDidChangeBreakpoints: Event; - - /** - * Register a [debug configuration provider](#DebugConfigurationProvider) for a specifc debug type. - * More than one provider can be registered for the same type. - * - * @param type The debug type for which the provider is registered. - * @param provider The [debug configuration provider](#DebugConfigurationProvider) to register. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - registerDebugConfigurationProvider(debugType: string, provider: DebugConfigurationProvider): Disposable; - - /** - * Start debugging by using either a named launch or named compound configuration, - * or by directly passing a [DebugConfiguration](#DebugConfiguration). - * The named configurations are looked up in '.vscode/launch.json' found in the given folder. - * Before debugging starts, all unsaved files are saved and the launch configurations are brought up-to-date. - * Folder specific variables used in the configuration (e.g. '${workspaceFolder}') are resolved against the given folder. - * @param folder The [workspace folder](#WorkspaceFolder) for looking up named configurations and resolving variables or `undefined` for a non-folder setup. - * @param nameOrConfiguration Either the name of a debug or compound configuration or a [DebugConfiguration](#DebugConfiguration) object. - * @return A thenable that resolves when debugging could be successfully started. - */ - startDebugging(folder: ?WorkspaceFolder, nameOrConfiguration: string | DebugConfiguration): Thenable; - - /** - * Add breakpoints. - * @param breakpoints The breakpoints to add. - */ - addBreakpoints(breakpoints: Breakpoint[]): void; - - /** - * Remove breakpoints. - * @param breakpoints The breakpoints to remove. - */ - removeBreakpoints(breakpoints: Breakpoint[]): void; - } - - /** - * Namespace for dealing with installed extensions. Extensions are represented - * by an [extension](#Extension)-interface which allows to reflect on them. - * - * Extension writers can provide APIs to other extensions by returning their API public - * surface from the `activate`-call. - * - * ```javascript - * export function activate(context: vscode.ExtensionContext) { - * let api = { - * sum(a, b) { - * return a + b; - * }, - * mul(a, b) { - * return a * b; - * } - * }; - * // 'export' public api-surface - * return api; - * } - * ``` - * When depending on the API of another extension add an `extensionDependency`-entry - * to `package.json`, and use the [getExtension](#extensions.getExtension)-function - * and the [exports](#Extension.exports)-property, like below: - * - * ```javascript - * let mathExt = extensions.getExtension('genius.math'); - * let importedApi = mathExt.exports; - * - * console.log(importedApi.mul(42, 1)); - * ``` - */ - declare export var extensions: { - - /** - * Get an extension by its full identifier in the form of: `publisher.name`. - * - * @param extensionId An extension identifier. - * @return An extension or `undefined`. - */ - getExtension(extensionId: string): ?Extension; - - /** - * Get an extension its full identifier in the form of: `publisher.name`. - * - * @param extensionId An extension identifier. - * @return An extension or `undefined`. - */ - getExtension(extensionId: string): ?Extension; - - /** - * All extensions currently known to the system. - */ - all: Extension[]; - } - - /** - * Enumeration of file types. - */ - declare export var FileType: { - /** - * The file type is unknown. - */ - Unknown: 0, - /** - * A regular file. - */ - File: 1, - /** - * A directory. - */ - Directory: 2, - /** - * A symbolic link to a file. - */ - SymbolicLink: 64 - } - declare export type FileTypeType = $Values; - - /** - * The `FileStat`-type represents metadata about a file. - */ - declare export type FileStat = { - /** - * The type of the file, e.g. is a regular file, a directory, or symbolic link - * to a file. - */ - type: FileTypeType; - - /** - * The creation timestamp in milliseconds. - */ - ctime: number; - - /** - * The modification timestamp in milliseconds. - */ - mtime: number; - - /** - * The size in bytes. - */ - size: number; - } - - /** - * A type that filesystem providers should use to signal errors. - * - * This class has factory methods for common error-cases, like `EntryNotFound` when - * a file or folder doesn't exist, use them like so: `throw vscode.FileSystemError.EntryNotFound(someUri);` - */ - declare export class FileSystemError extends Error { - /** - * Create an error to signal that a file or folder wasn't found. - * @param messageOrUri Message or uri. - */ - static FileNotFound(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file or folder already exists, e.g. when - * creating but not overwriting a file. - * @param messageOrUri Message or uri. - */ - static FileExists(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file is not a folder. - * @param messageOrUri Message or uri. - */ - static FileNotADirectory(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file is a folder. - * @param messageOrUri Message or uri. - */ - static FileIsADirectory(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that an operation lacks required permissions. - * @param messageOrUri Message or uri. - */ - static NoPermissions(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that the file system is unavailable or too busy to - * complete a request. - * @param messageOrUri Message or uri. - */ - static Unavailable(messageOrUri?: string | Uri): FileSystemError; - - /** - * Creates a new filesystem error. - * - * @param messageOrUri Message or uri. - */ - constructor(messageOrUri?: string | Uri) : void; - } - - declare export var FileChangeType: { - Changed: 1, - Created: 2, - Deleted: 3 - } - declare export type FileChangeTypeType = $Values; - - /** - * The event filesystem providers must use to signal a file change. - */ - declare export interface FileChangeEvent { - /** - * The type of change. - */ - type: FileChangeTypeType; - - /** - * The uri of the file that has changed. - */ - uri: Uri; - } - - /** - * The filesystem provider defines what the editor needs to read, write, discover, - * and to manage files and folders. It allows extensions to serve files from remote places, - * like ftp-servers, and to seamlessly integrate those into the editor. - * - * * *Note 1:* The filesystem provider API works with [uris](#Uri) and assumes hierarchical - * paths, e.g. `foo:/my/path` is a child of `foo:/my/` and a parent of `foo:/my/path/deeper`. - * * *Note 2:* There is an activation event `onFileSystem:` that fires when a file - * or folder is being accessed. - * - */ - declare export interface FileSystemProvider { - - /** - * An event to signal that a resource has been created, changed, or deleted. This - * event should fire for resources that are being [watched](#FileSystemProvider.watch) - * by clients of this provider. - */ - +onDidChangeFile: Event; - - /** - * Subscribe to events in the file or folder denoted by `uri`. - * @param uri The uri of the file to be watched. - * @param options Configures the watch. - * @returns A disposable that tells the provider to stop watching this `uri`. - */ - watch(uri: Uri, options: { recursive: boolean; excludes: string[] }): Disposable; - - /** - * Retrieve metadata about a file. - * - * @param uri The uri of the file to retrieve meta data about. - * @return The file metadata about the file. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. - */ - stat(uri: Uri): FileStat | Thenable; - - /** - * Retrieve the meta data of all entries of a [directory](#FileType.Directory) - * - * @param uri The uri of the folder. - * @return An array of name/type-tuples or a thenable that resolves to such. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. - */ - readDirectory(uri: Uri): [string, FileTypeType][] | Thenable<[string, FileTypeType][]>; - - /** - * Create a new directory. *Note* that new files are created via `write`-calls. - * - * @param uri The uri of the new folder. - * @returns Metadata about the created directory or a thenable that resolves to such. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist. - * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists. - * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. - */ - createDirectory(uri: Uri): void | Thenable; - - /** - * Read the entire contents of a file. - * - * @param uri The uri of the file. - * @return An array of bytes or a thenable that resolves to such. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. - */ - readFile(uri: Uri): Uint8Array | Thenable; - - /** - * Write data to a file, replacing its entire contents. - * - * @param uri The uri of the file. - * @param content The new content of the file. - * @param options Defines is missing files should or must be created. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist and `create` is not set. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when the parent of `uri` doesn't exist and `create` is set. - * @throws [`FileExists`](#FileSystemError.FileExists) when `uri` already exists and `overwrite` is set. - * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. - */ - writeFile(uri: Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void | Thenable; - - /** - * Delete a file. - * - * @param uri The resource that is to be deleted. - * @param options Defines if deletion of folders is recursive. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `uri` doesn't exist. - * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. - */ - delete(uri: Uri, options: { recursive: boolean }): void | Thenable; - - /** - * Rename a file or folder. - * - * @param oldUri The existing file or folder. - * @param newUri The target location. - * @param options Defines if existing files should be overwriten. - * @returns Metadata about the renamed file or a thenable that resolves to such. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `oldUri` doesn't exist. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `newUri` doesn't exist - * @throws [`FileExists`](#FileSystemError.FileExists) when `newUri` exists and when the `overwrite` option is not `true`. - * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. - */ - rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): void | Thenable; - - /** - * Copy files or folders. Implementing this function is optional but it will speedup - * the copy operation. - * - * @param source The existing file or folder. - * @param destination The destination location. - * @param options Defines if existing files should be overwriten. - * @returns Metadata about the copied file or a thenable that resolves to such. - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when `source` doesn't exist - * @throws [`FileNotFound`](#FileSystemError.FileNotFound) when parent of `destination` doesn't exist - * @throws [`FileExists`](#FileSystemError.FileExists) when `destination` exists and when the `overwrite` option is not `true`. - * @throws [`NoPermissions`](#FileSystemError.NoPermissions) when permissions aren't sufficient. - */ - +copy?: (source: Uri, destination: Uri, options: { overwrite: boolean }) => void | Thenable; - } - - /* BEGIN PROPOSED *******************************************************************************/ - declare export interface FileSearchQuery { - pattern: string; - } - - /** - * The parameters of a query for text search. - */ - declare export interface TextSearchQuery { - /** - * The text pattern to search for. - */ - pattern: string; - - /** - * Whether or not `pattern` should be interpreted as a regular expression. - */ - isRegExp?: boolean; - - /** - * Whether or not the search should be case-sensitive. - */ - isCaseSensitive?: boolean; - - /** - * Whether or not to search for whole word matches only. - */ - isWordMatch?: boolean; - } - - /** - * A file glob pattern to match file paths against. - * TODO@roblou - merge this with the GlobPattern docs/definition in vscode.d.ts. - * @see [GlobPattern](#GlobPattern) - */ - declare export type GlobString = string; - - /** - * Options common to file and text search - */ - declare export interface SearchOptions { - /** - * The root folder to search within. - */ - folder: Uri; - - /** - * Files that match an `includes` glob pattern should be included in the search. - */ - includes: GlobString[]; - - /** - * Files that match an `excludes` glob pattern should be excluded from the search. - */ - excludes: GlobString[]; - - /** - * Whether external files that exclude files, like .gitignore, should be respected. - * See the vscode setting `"search.useIgnoreFiles"`. - */ - useIgnoreFiles: boolean; - - /** - * Whether symlinks should be followed while searching. - * See the vscode setting `"search.followSymlinks"`. - */ - followSymlinks: boolean; - - /** - * Whether global files that exclude files, like .gitignore, should be respected. - * See the vscode setting `"search.useGlobalIgnoreFiles"`. - */ - useGlobalIgnoreFiles: boolean; - } - - declare export interface FileSearchOptions extends SearchOptions { - maxResults: number; - } - - declare export type TextSearchPreviewOptions = { - /** - * The maximum number of lines in the preview. - * Only search providers that support multiline search will ever return more than one line in the match. - */ - matchLines: number; - - /** - * The maximum number of characters included per line. - */ - charsPerLine: number; - } - - /** - * Options that apply to text search. - */ - declare export interface TextSearchOptions extends SearchOptions { - /** - * The maximum number of results to be returned. - */ - maxResults: number; - - /** - * Options to specify the size of the result text preview. - */ - previewOptions?: TextSearchPreviewOptions; - - /** - * Exclude files larger than `maxFileSize` in bytes. - */ - maxFileSize?: number; - - /** - * Interpret files using this encoding. - * See the vscode setting `"files.encoding"` - */ - encoding?: string; - } - - /** - * Information collected when text search is complete. - */ - declare export type TextSearchComplete = { - /** - * Whether the search hit the limit on the maximum number of search results. - * `maxResults` on [`TextSearchOptions`](#TextSearchOptions) specifies the max number of results. - * - If exactly that number of matches exist, this should be false. - * - If `maxResults` matches are returned and more exist, this should be true. - * - If search hits an internal limit which is less than `maxResults`, this should be true. - */ - limitHit?: boolean; - } - - declare export type TextSearchResultPreview = { - /** - * The matching line of text, or a portion of the matching line that contains the match. - * For now, this can only be a single line. - */ - text: string; - - /** - * The Range within `text` corresponding to the text of the match. - */ - match: Range; - } - - /** - * A match from a text search - */ - declare export type TextSearchResult = { - /** - * The uri for the matching document. - */ - uri: Uri; - - /** - * The range of the match within the document. - */ - range: Range; - - /** - * A preview of the matching line - */ - preview: TextSearchResultPreview; - } - - declare export interface FileSearchProvider { - +provideFileSearchResults: (query: FileSearchQuery, options: FileSearchOptions, token: CancellationToken) => ProviderResult; - } - - declare export interface TextSearchProvider { - +provideTextSearchResults: (query: TextSearchQuery, options: TextSearchOptions, progress: Progress, token: CancellationToken) => ProviderResult; - } - - /** - * Options that can be set on a findTextInFiles search. - */ - declare export interface FindTextInFilesOptions { - /** - * A [glob pattern](#GlobPattern) that defines the files to search for. The glob pattern - * will be matched against the file paths of files relative to their workspace. Use a [relative pattern](#RelativePattern) - * to restrict the search results to a [workspace folder](#WorkspaceFolder). - */ - include?: GlobPattern; - - /** - * A [glob pattern](#GlobPattern) that defines files and folders to exclude. The glob pattern - * will be matched against the file paths of resulting matches relative to their workspace. When `undefined` only default excludes will - * apply, when `null` no excludes will apply. - */ - exclude?: GlobPattern | null; - - /** - * The maximum number of results to search for - */ - maxResults?: number; - - /** - * Whether external files that exclude files, like .gitignore, should be respected. - * See the vscode setting `"search.useIgnoreFiles"`. - */ - useIgnoreFiles?: boolean; - - /** - * Whether symlinks should be followed while searching. - * See the vscode setting `"search.followSymlinks"`. - */ - followSymlinks?: boolean; - - /** - * Whether global files that exclude files, like .gitignore, should be respected. - * See the vscode setting `"search.useGlobalIgnoreFiles"`. - */ - useGlobalIgnoreFiles: boolean; - - /** - * Interpret files using this encoding. - * See the vscode setting `"files.encoding"` - */ - encoding?: string; - } - - /** - * The contiguous set of modified lines in a diff. - */ - declare export interface LineChange { - +originalStartLineNumber: number; - +originalEndLineNumber: number; - +modifiedStartLineNumber: number; - +modifiedEndLineNumber: number; - } - - //#region decorations - //todo@joh -> make class - declare export interface DecorationData { - priority?: number; - title?: string; - bubble?: boolean; - abbreviation?: string; - color?: ThemeColor; - source?: string; - } - - declare export interface DecorationProvider { - onDidChangeDecorations: Event; - provideDecoration(uri: Uri, token: CancellationToken): ProviderResult; - } - - /** - * An event describing a change to the set of [breakpoints](#debug.Breakpoint). - */ - declare export interface BreakpointsChangeEvent { - /** - * Added breakpoints. - */ - +added: Breakpoint[]; - - /** - * Removed breakpoints. - */ - +removed: Breakpoint[]; - - /** - * Changed breakpoints. - */ - +changed: Breakpoint[]; - } - - /** - * The base class of all breakpoint types. - */ - declare export class Breakpoint { - /** - * Is breakpoint enabled. - */ - +enabled: boolean; - /** - * An optional expression for conditional breakpoints. - */ - +condition?: string; - /** - * An optional expression that controls how many hits of the breakpoint are ignored. - */ - +hitCondition?: string; - - // protected constructor(enabled?: boolean, condition?: string, hitCondition?: string); - } - - /** - * A breakpoint specified by a source location. - */ - declare export class SourceBreakpoint extends Breakpoint { - /** - * The source and line position of this breakpoint. - */ - +location: Location; - - /** - * Create a new breakpoint for a source location. - */ - constructor(location: Location, enabled?: boolean, condition?: string, hitCondition?: string): void; - } - - /** - * A breakpoint specified by a function name. - */ - declare export class FunctionBreakpoint extends Breakpoint { - /** - * The name of the function to which this breakpoint is attached. - */ - +functionName: string; - - /** - * Create a new function breakpoint. - */ - constructor(functionName: string, enabled?: boolean, condition?: string, hitCondition?: string): void; - } - - /** - * Represents a debug adapter executable and optional arguments passed to it. - */ - declare export class DebugAdapterExecutable { - /** - * The command path of the debug adapter executable. - * A command must be either an absolute path or the name of an executable looked up via the PATH environment variable. - * The special value 'node' will be mapped to VS Code's built-in node runtime. - */ - +command: string; - - /** - * Optional arguments passed to the debug adapter executable. - */ - +args: string[]; - - /** - * Create a new debug adapter specification. - */ - constructor(command: string, args?: string[]): void; - } - - /** - * The severity level of a log message - */ - declare export var LogLevel: { - Trace: 1, - Debug: 2, - Info: 3, - Warning: 4, - Error: 5, - Critical: 6, - Off: 7 - } - declare export type LogLevelType = $Values; - - /** - * A logger for writing to an extension's log file, and accessing its dedicated log directory. - */ - declare export interface Logger { - +onDidChangeLogLevel: Event; - +currentLevel: LogLevelType; - +logDirectory: Thenable; - - trace(message: string, ...args: any[]): void; - debug(message: string, ...args: any[]): void; - info(message: string, ...args: any[]): void; - warn(message: string, ...args: any[]): void; - error(message: string | Error, ...args: any[]): void; - critical(message: string | Error, ...args: any[]): void; - } - - declare export interface RenameInitialValue { - range: Range; - text?: string; - } - - /** - * Represents the validation type of the Source Control input. - */ - declare export var SourceControlInputBoxValidationType: { - - /** - * Something not allowed by the rules of a language or other means. - */ - Error: 0, - - /** - * Something suspicious but allowed. - */ - Warning: 1, - - /** - * Something to inform about but not a problem. - */ - Information: 2 - } - declare export type SourceControlInputBoxValidationTypeType = $Values; - - declare export interface SourceControlInputBoxValidation { - - /** - * The validation message to display. - */ - +message: string; - - /** - * The validation type. - */ - +type: SourceControlInputBoxValidationTypeType; - } - /* END PROPOSED *********************************************************************************/ - -} - -/** - * Thenable is a common denominator between ES6 promises, Q, jquery.Deferred, WinJS.Promise, - * and others. This API makes no assumption about what promise libary is being used which - * enables reusing existing code without migrating to a specific promise implementation. Still, - * we recommend the use of native promises which are available in this editor. - */ -declare type Thenable = Promise; diff --git a/flow-libs/ws.js.flow b/flow-libs/ws.js.flow deleted file mode 100644 index b6763550f9..0000000000 --- a/flow-libs/ws.js.flow +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -/** - * https://github.com/websockets/ws/blob/master/doc/ws.md - */ - -declare module 'ws' { - declare class ws$Server extends events$EventEmitter { - // TODO properly type the options object - constructor(options: Object): void, - close(): void, - } - - declare class ws$WebSocket extends events$EventEmitter { - constructor( - address: string | Array, - options?: ?Object, - ): ws$WebSocket, - constructor( - address: string, - protocols: string | Array, - options: Object, - ): ws$WebSocket, - static Server: typeof ws$Server, - - onopen?: () => mixed, - onclose?: () => mixed, - onerror?: () => mixed, - - send(message: string | Buffer, ack?: (error: ?Object) => void): void, - send( - message: string | Buffer, - options: Object, - ack: (error: ?Object) => void, - ): void, - close(): void, - close(statusCode: number, message: string): void, - terminate(): void, - ping(data: ?string, mask?: boolean, failSilently?: boolean): void, - url: string, - } - - declare module.exports: typeof ws$WebSocket; -} diff --git a/flow-libs/yauzl.js.flow b/flow-libs/yauzl.js.flow deleted file mode 100644 index 5b59538ff0..0000000000 --- a/flow-libs/yauzl.js.flow +++ /dev/null @@ -1,564 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow strict - * @format - */ - -/** - * Typings for yauzl 2.10.0 - * https://www.npmjs.com/package/yauzl - */ - -declare module 'yauzl' { - declare export type BasicOptions = { - /** - * Effectively equivalent to: - * ```javascript - * zipfile.once("end", function() { - * zipfile.close(); - * }); - * ``` - */ - autoClose?: boolean, - /** - * Indicates that entries should be read only when `readEntry()` is called. If `lazyEntries` - * is `false`, `entry` events will be emitted as fast as possible to allow `pipe()`ing file - * data from all entries in parallel. This is not recommended, as it can lead to out of - * control memory usage for zip files with many entries. See issue #22. If `lazyEntries` is - * `true`, an `entry` or `end` event will be emitted in response to each call to - * `readEntry()`. This allows processing of one entry at a time, and will keep memory usage - * under control for zip files with many entries. - */ - lazyEntries?: boolean, - /** - * `true` by default, and ensures that an entry's reported uncompressed size matches its - * actual uncompressed size. This check happens as early as possible, which is either before - * emitting each `"entry"` event (for entries with no compression), or during the - * `readStream` piping after calling `openReadStream()`. See `openReadStream()` for more - * information on defending against zip bomb attacks. - */ - validateEntrySizes?: boolean, - /** - * When `strictFileNames` is `false` (the default) and `decodeStrings` is `true`, all - * backslash (`\`) characters in each `entry.fileName` are replaced with forward slashes - * (`/`). The spec forbids file names with backslashes, but Microsoft's - * `System.IO.Compression.ZipFile` class in .NET versions 4.5.0 until 4.6.1 creates non- - * conformant zipfiles with backslashes in file names. `strictFileNames` is `false` by - * default so that clients can read these non-conformant zipfiles without knowing about this - * Microsoft-specific bug. When `strictFileNames` is `true` and `decodeStrings` is `true`, - * entries with backslashes in their file names will result in an error. See - * `validateFileName()`. When `decodeStrings` is `false`, `strictFileNames` has no effect. - */ - strictFileNames?: boolean, - }; - - declare export type OptionsWithDecoding = BasicOptions & { - /** - * `true` by default, and causes yauzl to decode strings with `CP437` or `UTF-8` as required - * by the spec. The exact effects of turning this option off are: - * - `zipfile.comment`, `entry.fileName`, and `entry.fileComment` will be `Buffer` objects - * instead of `String`s. - * - Any Info-ZIP Unicode Path Extra Field will be ignored. See `extraFields`. - * - Automatic file name validation will not be performed. See `validateFileName()`. - */ - decodeStrings?: true, - }; - - declare export type OptionsWithoutDecoding = BasicOptions & { - /** - * `true` by default, and causes yauzl to decode strings with `CP437` or `UTF-8` as required - * by the spec. The exact effects of turning this option off are: - * - `zipfile.comment`, `entry.fileName`, and `entry.fileComment` will be `Buffer` objects - * instead of `String`s. - * - Any Info-ZIP Unicode Path Extra Field will be ignored. See `extraFields`. - * - Automatic file name validation will not be performed. See `validateFileName()`. - */ - decodeStrings: false, - }; - - declare export type Options = BasicOptions & { - /** - * `true` by default, and causes yauzl to decode strings with `CP437` or `UTF-8` as required - * by the spec. The exact effects of turning this option off are: - * - `zipfile.comment`, `entry.fileName`, and `entry.fileComment` will be `Buffer` objects - * instead of `String`s. - * - Any Info-ZIP Unicode Path Extra Field will be ignored. See `extraFields`. - * - Automatic file name validation will not be performed. See `validateFileName()`. - */ - decodeStrings?: boolean, - }; - - declare export type ZipFileOptions = { - /** - * If the entry is compressed (with a supported compression method), and the `decompress` - * option is `true` (or omitted), the read stream provides the decompressed data. Omitting - * the `decompress` option is what most clients should do. - * - * The `decompress` option must be `null` (or omitted) when the entry is not compressed - * (see `isCompressed()`), and either `true` (or omitted) or `false` when the entry is - * compressed. Specifying `decompress: false` for a compressed entry causes the read stream - * to provide the raw compressed file data without going through a zlib inflate transform. - */ - decompress: boolean, - /** - * If the entry is encrypted (see `isEncrypted()`), clients may want to avoid calling - * `openReadStream()` on the entry entirely. Alternatively, clients may call - * `openReadStream()` for encrypted entries and specify `decrypt: false`. If the entry is - * also compressed, clients must also specify `decompress: false`. Specifying - * `decrypt: false` for an encrypted entry causes the read stream to provide the raw, - * still-encrypted file data. (This data includes the 12-byte header described in the spec.) - * - * The `decrypt` option must be `null` (or omitted) for non-encrypted entries, and `false` - * for encrypted entries. Omitting the `decrypt` option (or specifying it as `null`) for an - * encrypted entry will result in the callback receiving an `err`. This default behavior is - * so that clients not accounting for encrypted files aren't surprised by bogus file data. - */ - decrypt?: boolean, - /** - * The `start` (inclusive) option is a byte offset into this entry's file data, and can be - * used to obtain part of an entry's file data rather than the whole thing. If either this - * option or `end` are specified and non-null, then the above options must be used to obtain - * the file's raw data. Specifying `{start: 0, end: entry.compressedSize}` will result in - * the complete file, which is effectively the default values for these options, but note - * that unlike omitting the options, when you specify `start` or `end` as any non-null - * value, the above requirement is still enforced that you must also pass the appropriate - * options to get the file's raw data. - */ - start: number, - /** - * The `end` (exclusive) option is a byte offset into this entry's file data, and can be - * used to obtain part of an entry's file data rather than the whole thing. If either this - * option of `start` are specified and non-null, then the above options must be used to - * obtain the file's raw data. Specifying `{start: 0, end: entry.compressedSize}` will - * result in the complete file, which is effectively the default values for these options, - * but note that unlike omitting the options, when you specify `start` or `end` as any - * non-null value, the above requirement is still enforced that you must also pass the - * appropriate options to get the file's raw data. - */ - end: number, - }; - - /** - * Objects of this class represent Central Directory Records. Refer to the zipfile specification - * for more details about these fields. - */ - declare export class Entry { - +versionMadeBy: number, - +versionNeededToExtract: number, - +generalPurposeBitFlag: number, - +compressionMethod: number, - /** MS-DOS format, see getLastModDateTime */ - +lastModFileTime: number, - /** MS-DOS format, see getLastModDateTime */ - +lastModFileDate: number, - +crc32: number, - +compressedSize: number, - +uncompressedSize: number, - /** in bytes */ - +fileNameLength: number, - /** in bytes */ - +extraFieldLength: number, - /** in bytes */ - +fileCommentLength: number, - +internalFileAttributes: number, - +externalFileAttributes: number, - +relativeOffsetOfLocalHeader: number, - - /** - * Following the spec, the bytes for the file name are decoded with UTF-8 if - * `generalPurposeBitFlag & 0x800`, otherwise with CP437. Alternatively, this field may be - * populated from the Info-ZIP Unicode Path Extra Field (see `extraFields`). - * - * This field is automatically validated by `validateFileName()` before yauzl emits an - * `"entry"` event. If this field would contain unsafe characters, yauzl emits an `error` - * instead of an entry. - * - * If `decodeStrings` is `false` (see `open()`), this field is the undecoded `Buffer` - * instead of a decoded `String`. Therefore, `generalPurposeBitFlag` and any Info-ZIP - * Unicode Path Extra Field are ignored. Furthermore, no automatic file name validation is - * performed for this file name. - */ - +fileName: Data, - - /** - * This library looks for and reads the ZIP64 Extended Information Extra Field (0x0001) in - * order to support ZIP64 format zip files. - * - * This library also looks for and reads the Info-ZIP Unicode Path Extra Field (0x7075) in - * order to support some zipfiles that use it instead of General Purpose Bit 11 to convey - * UTF-8 file names. When the field is identified and verified to be reliable (see the - * zipfile spec), then the file name in this field is stored in the `fileName` property, and - * the file name in the central directory record for this entry is ignored. Note that when - * `decodeStrings` is `false`, all Info-ZIP Unicode Path Extra Fields are ignored. - * - * None of the other fields are considered significant by this library. Fields that this - * library reads are left unalterned in the `extraFields` array. - */ - +extraFields: $ReadOnlyArray<{id: number, data: Buffer}>, - - /** - * Decoded with the charset indicated by `generalPurposeBitFlag & 0x800` as with the - * `fileName`. (The Info-ZIP Unicode Path Extra Field has no effect on the charset used for - * this field.) - * - * If `decodeStrings` is `false` (see `open()`), this field is the undecoded `Buffer` - * instead of a decoded `String`. - * - * Prior to yauzl version 2.7.0, this field was erroneously documented as `comment` instead - * of `fileComment`. For compatibility with any code that uses the field name `comment`, - * yauzl creates an alias field named `comment` which is identical to `fileComment`. - */ - +fileComment: Data, - - /** - * Effectively implemented as: - * ```return dosDateTimeToDate(this.lastModFileDate, this.lastModFileTime);``` - */ - getLastModDate(): Date, - - /** - * Returns whether this entry is encrypted with "Traditional Encryption". Effectively - * implemented as: - * ```return (this.generalPurposeBitFlag & 0x1) !== 0;``` - * - * See `openReadStream()` for the implications of this value. - * - * Note that "Strong Encryption" is not supported, and will result in an `"error"` event - * emitted from the `ZipFile`. - */ - isEncrypted(): boolean, - - /** - * Effectively implemented as: - * ```return this.compressionMethod === 8;``` - * - * See `openReadStream()` for the implications of this value. - */ - isCompressed(): boolean, - } - - /** - * The constructor for this class is not part of the public API. Use `open()`, `fromFd()`, - * `fromBuffer()`, or `fromRandomAccessReader()` instead. - */ - declare export class ZipFile { - /** @private */ - constructor(): void; - - /** - * See `open()` and `readEntry()` for when this event is emitted. - * - * If `decodeStrings` is `true`, entries emitted via this event have already passed file - * name validation. See `validateFileName()` and `open()` for more information. - * - * If `validateEntrySizes` is `true` and this entry's `compressionMethod` is `0` (stored - * without compression), this entry has already passed entry size validation. See `open()` - * for more information. - */ - on(event: 'entry', callback: (entry: Entry) => mixed): this; - /** - * See `open()` and `readEntry()` for when this event is emitted. - * - * If `decodeStrings` is `true`, entries emitted via this event have already passed file - * name validation. See `validateFileName()` and `open()` for more information. - * - * If `validateEntrySizes` is `true` and this entry's `compressionMethod` is `0` (stored - * without compression), this entry has already passed entry size validation. See `open()` - * for more information. - */ - once(event: 'entry', callback: (entry: Entry) => mixed): this; - - /** - * Emitted after the last `entry` event has been emitted. See `open()` and `readEntry()` for - * more info on when this event is emitted. - */ - on(event: 'end', callback: () => mixed): this; - /** - * Emitted after the last `entry` event has been emitted. See `open()` and `readEntry()` for - * more info on when this event is emitted. - */ - once(event: 'end', callback: () => mixed): this; - - /** - * Emitted after the fd is actually closed. This is after calling `close()` (or after the - * `end` event when `autoClose` is `true`), and after all stream pipelines created from - * `openReadStream()` have finished reading data from the fd. - * - * If this `ZipFile` was acquired from `fromRandomAccessReader()`, the "fd" in the previous - * paragraph refers to the `RandomAccessReader` implemented by the client. - * - * If this `ZipFile` was acquired from `fromBuffer()`, this event is never emitted. - */ - on(event: 'close', callback: () => mixed): this; - /** - * Emitted after the fd is actually closed. This is after calling `close()` (or after the - * `end` event when `autoClose` is `true`), and after all stream pipelines created from - * `openReadStream()` have finished reading data from the fd. - * - * If this `ZipFile` was acquired from `fromRandomAccessReader()`, the "fd" in the previous - * paragraph refers to the `RandomAccessReader` implemented by the client. - * - * If this `ZipFile` was acquired from `fromBuffer()`, this event is never emitted. - */ - once(event: 'close', callback: () => mixed): this; - - /** - * Emitted in the case of errors with reading the zip file. (Note that other errors can be - * emitted from the streams created from `openReadStream()` as well.) After this event has - * been emitted, no further `entry`, `end`, or `error` events will be emitted, but the - * `close` event may still be emitted. - */ - on(event: 'error', callback: (error: Error) => mixed): this; - once(event: 'error', callback: (error: Error) => mixed): this; - - getMaxListeners(): number; - listenerCount(event: string): number; - removeAllListeners(event: string): this; - removeListener(event: string, handler: Function): this; - setMaxListeners(count: number): this; - - /** - * Causes this `ZipFile` to emit an `entry` or `end` event (or an `error` event). This - * method must only be called when this `ZipFile` was created with the `lazyEntries` option - * set to `true` (see `open()`). When this `ZipFile` was created with the `lazyEntries` - * option set to `true`, `entry` and `end` events are only ever emitted in response to this - * method call. - * - * The event that is emitted in response to this method will not be emitted until after this - * method has returned, so it is safe to call this method before attaching event listeners. - * - * After calling this method, calling this method again before the response event has been - * emitted will cause undefined behavior. Calling this method after the `end` event has been - * emitted will cause undefined behavior. Calling this method after calling `close()` will - * cause undefined behavior. - */ - readEntry(): void; - - /** - * If this `ZipFile` is already closed (see `close()`), the callback will receive an `err`. - * - * @param options may be omitted or `null`, and has the following defaults: - * ``` - * { - * decompress: entry.isCompressed() ? true : null, - * decrypt: null, - * start: 0, // actually the default is null, see below - * end: entry.compressedSize, // actually the default is null, see below - * } - * ``` - * - * It's possible for the `readStream` provided to the callback to emit errors for several - * reasons. For example, if zlib cannot decompress the data, the zlib error will be emitted - * from the `readStream`. Two more error cases (when `validateEntrySizes` is `true`) are if - * the decompressed data has too many or too few actual bytes compared to the reported byte - * count from the entry's `uncompressedSize` field. yauzl notices this false information and - * emits an error from the `readStream` after some number of bytes have already been piped - * through the stream. - * - * This check allows clients to trust the `uncompressedSize` field in `Entry` objects. - * Guarding against zip bomb attacks can be accomplished by doing some heuristic checks on - * the size metadata and then watching out for the above errors. Such heuristics are outside - * the scope of this library, but enforcing the `uncompressedSize` is implemented here as a - * security feature. - * - * It is possible to destroy the `readStream` before it has piped all of its data. To do - * this, call `readStream.destroy()`. You must `unpipe()` the `readStream` from any - * destination before calling `readStream.destroy()`. If this zipfile was created using - * `fromRandomAccessReader()`, the `RandomAccessReader` implementation must provide readable - * streams that implement a `.destroy()` method (see - * `randomAccessReader._readStreamForRange()`) in order for calls to `readStream.destroy()` - * to work in this context. - * - * @param entry must be an `Entry` object from this `ZipFile`. - */ - openReadStream(entry: Entry, callback: (err: ?Error, readStream: stream$Readable) => mixed): void; - openReadStream(entry: Entry, options: ZipFileOptions, callback: (err: ?Error, readStream: stream$Readable) => mixed): void; - - /** - * Causes all future calls to `openReadStream()` to fail, and closes the fd, if any, after - * all streams created by `openReadStream()` have emitted their end events. - * - * If the `autoClose` option is set to `true` (see `open()`), this function will be called - * automatically effectively in response to this object's `end` event. - * - * If the `lazyEntries` option is set to `false` (see `open()`) and this object's `end` - * event has not been emitted yet, this function causes undefined behavior. If the - * `lazyEntries` option is set to `true`, you can call this function instead of calling - * `readEntry()` to abort reading the entries of a zipfile. - * - * It is safe to call this function multiple times; after the first call, successive calls - * have no effect. This includes situations where the `autoClose` option effectively calls - * this function for you. - * - * If `close()` is never called, then the zipfile is "kept open". For zipfiles created with - * `fromFd()`, this will leave the fd open, which may be desirable. For zipfiles created - * with `open()`, this will leave the underlying fd open, thereby "leaking" it, which is - * probably undesirable. For zipfiles created with `fromRandomAccessReader()`, the reader's - * `close()` method will never be called. For zipfiles created with `fromBuffer()`, the - * `close()` function has no effect whether called or not. - * - * Regardless of how this `ZipFile` was created, there are no resources other than those - * listed above that require cleanup from this function. This means it may be desirable to - * never call `close()` in some usecases. - */ - close(): void; - - /** - * `true` until `close()` is called; then it's `false`. - */ - isOpen: boolean; - - /** - * Total number of central directory records. - */ - entryCount: number; - - /** - * Always decoded with CP437 per the spec. - * - * If `decodeStrings` is `false` (see `open()`), this field is the undecoded `Buffer` - * instead of a decoded `String`. - */ - comment: Data; - } - - declare export class RandomAccessReader { - /** - * Subclasses *must* implement this method. - * - * `start` and `end` are `Numbers` and indicate byte offsets from the start of the file. - * `end` is exclusive, so `_readStreamForRange(0x1000, 0x2000)` would indicate to read - * 0x1000 bytes. `end - start` will always be at least 1. - * - * This method should return a readable stream which will be `pipe()`ed into another stream. - * It is expected that the readable stream will provide data in several chunks if necessary. - * If the readable stream provides too many or too few bytes, an error will be emitted. - * (Note that `validateEntrySizes` has no effect on this check, because this is a low-level - * API that should behave correctly regardless of the contents of the file.) Any errors - * emitted on the readable stream will be handled and re-emitted on the client-visible - * stream (returned from `zipfile.openReadStream()`) or provided as the `err` argument to - * the appropriate callback (for example, for `fromRandomAccessReader()`). - * - * The returned stream must implement a method `.destroy()` if you call - * `readStream.destroy()` on streams you get from `openReadStream()`. If you never call - * `readStream.destroy()`, then streams returned from this method do not need to implement a - * method `.destroy()`. `.destroy()` should abort any streaming that is in progress and - * clean up any associated resources. `.destroy()` will only be called after the stream has - * been `unpipe()`d from its destination. - * - * Note that the stream returned from this method might not be the same object that is - * provided by `openReadStream()`. The stream returned from this method might be `pipe()`d - * through one or more filter streams (for example, a zlib inflate stream). - */ - _readStreamForRange(start: number, end: number): stream$Readable; - - /** - * Subclasses may implement this method. The default implementation uses - * `createReadStream()` to fill the buffer. - * - * This method should behave like `fs.read()`. - */ - read(buffer: Buffer | Uint8Array, offset: number, length: number, position: number, callback: (err: ?Error, bytesRead: number, buffer: Buffer) => mixed): void; - - /** - * Subclasses may implement this method. The default implementation is effectively - * `setImmediate(callback);`. - * - * This method is called once all streams returned from `_readStreamForRange()` have ended, - * and no more `_readStreamForRange()` or `read()` requests will be issued to this object. - */ - close(callback: (err: ?Error) => mixed): void; - } - - declare type ZipFileCallback = (err: ?Error, zipfile: ZipFile) => mixed; - - declare export interface Exports { - /** - * Calls `fs.open(path, "r")` and reads the `fd` effectively the same as `fromFd()` would. - * @param path see `fs.open` - * @param options may be omitted or `null`. The defaults are `{autoClose: true, lazyEntries: false, decodeStrings: true, validateEntrySizes: true, strictFileNames: false}`. - * @param callback is given the arguments `(err, zipfile)`. An `err` is provided if the End - * of Central Directory Record cannot be found, or if its metadata appears malformed. This - * kind of error usually indicates that this is not a zip file. Otherwise, zipfile is an - * instance of `ZipFile`. - */ - open(path: string, callbackOrOptions?: OptionsWithDecoding | ZipFileCallback): void; - open(path: string, options: OptionsWithDecoding, callback: ZipFileCallback): void; - open(path: string, options: OptionsWithoutDecoding, callback?: ZipFileCallback): void; - - /** - * Reads from the `fd`, which is presumed to be an open .zip file. Note that random access - * is required by the zip file specification, so the `fd` cannot be an open socket or any - * other `fd` that does not support random access. - * - * See `open()` for the meaning of the options and callback. - * - * @param fd file descriptor (see `fs.open`) - * @param options may be omitted or `null`. The defaults are `{autoClose: false, lazyEntries: false, decodeStrings: true, validateEntrySizes: true, strictFileNames: false}`. - * @param callback - */ - fromFd(fd: number, callbackOrOptions?: OptionsWithDecoding | ZipFileCallback): void; - fromFd(fd: number, options: OptionsWithDecoding, callback: ZipFileCallback): void; - fromFd(fd: number, options: OptionsWithoutDecoding, callback?: ZipFileCallback): void; - - /** - * Like `fromFd()`, but reads from a RAM buffer instead of an open file. If a `ZipFile` is - * acquired from this method, it will never emit the `close` event, and calling `close()` is - * not necessary. - * - * See `open()` for the meaning of `options` and `callback`. The `autoClose` option is ignored - * for this method. - * - * @param buffer - * @param options may be omitted or `null`. The defaults are `{lazyEntries: false, decodeStrings: true, validateEntrySizes: true, strictFileNames: false}`. - * @param callback - */ - fromBuffer(buffer: Buffer, callbackOrOptions?: OptionsWithDecoding | ZipFileCallback): void; - fromBuffer(buffer: Buffer, options: OptionsWithDecoding, callback: ZipFileCallback): void; - fromBuffer(buffer: Buffer, options: OptionsWithoutDecoding, callback?: ZipFileCallback): void; - - /** - * This method of reading a zip file allows clients to implement their own back-end file - * system. For example, a client might translate read calls into network requests. - * - * See `open()` for the meaning of `options` and `callback`. - * - * @param reader must be of a type that is a subclass of `RandomAccessReader` that implements the required methods. - * @param totalSize a `Number` that indicates the total file size of the zip file. - * @param options may be omitted or null. The defaults are {autoClose: true, lazyEntries: false, decodeStrings: true, validateEntrySizes: true, strictFileNames: false}. - * @param callback - */ - fromRandomAccessReader(reader: RandomAccessReader, totalSize: number, callbackOrOptions?: OptionsWithDecoding | ZipFileCallback): void; - fromRandomAccessReader(reader: RandomAccessReader, totalSize: number, options: OptionsWithDecoding, callback: ZipFileCallback): void; - fromRandomAccessReader(reader: RandomAccessReader, totalSize: number, options: OptionsWithoutDecoding, callback?: ZipFileCallback): void; - - /** - * Converts MS-DOS date and time data into a JavaScript Date object. Each parameter is a - * `Number` treated as an unsigned 16-bit integer. Note that this format does not support - * timezones, so the returned object will use the local timezone. - * @param data - * @param time - */ - dosDateTimeToDate(data: number, time: number): Date; - - /** - * Returns `null` or a `String` error message depending on the validity of `fileName`. If - * `fileName` starts with `"/"` or `/[A-Za-z]:\//` or if it contains `".."` path segments or - * `"\\"`, this function returns an error message appropriate for use like this: - * ```javascript - * var errorMessage = yauzl.validateFileName(fileName); - * if (errorMessage != null) throw new Error(errorMessage); - * ``` - * - * This function is automatically run for each entry, as long as `decodeStrings` is `true`. - * See `open()`, `strictFileNames`, and `Event: "entry"` for more information. - */ - validateFileName(fileName: string): ?string; - } - declare export default Exports; -} diff --git a/flow-typed/README.md b/flow-typed/README.md deleted file mode 100644 index 66f90f9a56..0000000000 --- a/flow-typed/README.md +++ /dev/null @@ -1,14 +0,0 @@ -## flow-typed - -The definitions under the `npm` folder here are pulled down from -[`flow-typed`](https://github.com/flowtype/flow-typed). Please do not change these files directly. - -### Updating these definitions - -1. Put up a pull request on [`flow-typed`](https://github.com/flowtype/flow-typed) with the proposed changes. Include tests. -2. Once it's merged, update the files here by either bothering @nmote, or - - `npm install -g flow-typed` (as of this writing, it's in beta so you will need to install `flow-typed@2.0.0-beta4` to get the CLI). - - `flow-typed install packageName -f flowVersion -o`, where: - - `packageName` is the name of the package (e.g. `classnames` or `rxjs`) - - `flowVersion` is the Flow version we are currently using e.g. `0.25.0` - - `-o` just indicates the the existing defs should be overwritten diff --git a/flow-typed/npm/chalk_v1.x.x.js b/flow-typed/npm/chalk_v1.x.x.js deleted file mode 100644 index 9cabf16bcd..0000000000 --- a/flow-typed/npm/chalk_v1.x.x.js +++ /dev/null @@ -1,114 +0,0 @@ -// flow-typed signature: b1a2d646047879188d7e44cb218212b5 -// flow-typed version: b43dff3e0e/chalk_v1.x.x/flow_>=v0.19.x - -type $npm$chalk$StyleElement = { - open: string; - close: string; -}; - -type $npm$chalk$Chain = $npm$chalk$Style & (...text: any[]) => string; - -type $npm$chalk$Style = { - // General - reset: $npm$chalk$Chain; - bold: $npm$chalk$Chain; - dim: $npm$chalk$Chain; - italic: $npm$chalk$Chain; - underline: $npm$chalk$Chain; - inverse: $npm$chalk$Chain; - strikethrough: $npm$chalk$Chain; - - // Text colors - black: $npm$chalk$Chain; - red: $npm$chalk$Chain; - green: $npm$chalk$Chain; - yellow: $npm$chalk$Chain; - blue: $npm$chalk$Chain; - magenta: $npm$chalk$Chain; - cyan: $npm$chalk$Chain; - white: $npm$chalk$Chain; - gray: $npm$chalk$Chain; - grey: $npm$chalk$Chain; - - // Background colors - bgBlack: $npm$chalk$Chain; - bgRed: $npm$chalk$Chain; - bgGreen: $npm$chalk$Chain; - bgYellow: $npm$chalk$Chain; - bgBlue: $npm$chalk$Chain; - bgMagenta: $npm$chalk$Chain; - bgCyan: $npm$chalk$Chain; - bgWhite: $npm$chalk$Chain; -}; - -type $npm$chalk$StyleMap = { - // General - reset: $npm$chalk$StyleElement; - bold: $npm$chalk$StyleElement; - dim: $npm$chalk$StyleElement; - italic: $npm$chalk$StyleElement; - underline: $npm$chalk$StyleElement; - inverse: $npm$chalk$StyleElement; - strikethrough: $npm$chalk$StyleElement; - - // Text colors - black: $npm$chalk$StyleElement; - red: $npm$chalk$StyleElement; - green: $npm$chalk$StyleElement; - yellow: $npm$chalk$StyleElement; - blue: $npm$chalk$StyleElement; - magenta: $npm$chalk$StyleElement; - cyan: $npm$chalk$StyleElement; - white: $npm$chalk$StyleElement; - gray: $npm$chalk$StyleElement; - - // Background colors - bgBlack: $npm$chalk$StyleElement; - bgRed: $npm$chalk$StyleElement; - bgGreen: $npm$chalk$StyleElement; - bgYellow: $npm$chalk$StyleElement; - bgBlue: $npm$chalk$StyleElement; - bgMagenta: $npm$chalk$StyleElement; - bgCyan: $npm$chalk$StyleElement; - bgWhite: $npm$chalk$StyleElement; -}; - -declare module "chalk" { - declare var enabled: boolean; - declare var supportsColor: boolean; - declare var styles: $npm$chalk$StyleMap; - - declare function stripColor(value: string): any; - declare function hasColor(str: string): boolean; - - // General - declare var reset: $npm$chalk$Chain; - declare var bold: $npm$chalk$Chain; - declare var dim: $npm$chalk$Chain; - declare var italic: $npm$chalk$Chain; - declare var underline: $npm$chalk$Chain; - declare var inverse: $npm$chalk$Chain; - declare var strikethrough: $npm$chalk$Chain; - - // Text colors - declare var black: $npm$chalk$Chain; - declare var red: $npm$chalk$Chain; - declare var green: $npm$chalk$Chain; - declare var yellow: $npm$chalk$Chain; - declare var blue: $npm$chalk$Chain; - declare var magenta: $npm$chalk$Chain; - declare var cyan: $npm$chalk$Chain; - declare var white: $npm$chalk$Chain; - declare var gray: $npm$chalk$Chain; - declare var grey: $npm$chalk$Chain; - - // Background colors - declare var bgBlack: $npm$chalk$Chain; - declare var bgRed: $npm$chalk$Chain; - declare var bgGreen: $npm$chalk$Chain; - declare var bgYellow: $npm$chalk$Chain; - declare var bgBlue: $npm$chalk$Chain; - declare var bgMagenta: $npm$chalk$Chain; - declare var bgCyan: $npm$chalk$Chain; - declare var bgWhite: $npm$chalk$Chain; -} diff --git a/flow-typed/npm/classnames_v2.x.x.js b/flow-typed/npm/classnames_v2.x.x.js deleted file mode 100644 index 7dae310a97..0000000000 --- a/flow-typed/npm/classnames_v2.x.x.js +++ /dev/null @@ -1,22 +0,0 @@ -// flow-typed signature: 24cdb511d3752119d012d31eab9e5c8d -// flow-typed version: 7a7121569e/classnames_v2.x.x/flow_>=v0.25.x - -type $npm$classnames$Classes = - | string - | { [className: string]: * } - | Array - | false - | void - | null; - -declare module 'classnames' { - declare module.exports: (...classes: Array<$npm$classnames$Classes>) => string; -} - -declare module 'classnames/bind' { - declare module.exports: $Exports<'classnames'>; -} - -declare module 'classnames/dedupe' { - declare module.exports: $Exports<'classnames'>; -} diff --git a/flow-typed/npm/dedent_v0.7.x.js b/flow-typed/npm/dedent_v0.7.x.js deleted file mode 100644 index 65595397d8..0000000000 --- a/flow-typed/npm/dedent_v0.7.x.js +++ /dev/null @@ -1,11 +0,0 @@ -// flow-typed signature: 097b2887f219dba3f2df79cfe16c063b -// flow-typed version: d4e3edcf09/dedent_v0.7.x/flow_>=v0.25.x - -// @flow - -declare module 'dedent' { - declare module.exports: ( - strings: string | Array, - ...values: Array - ) => string; -} diff --git a/flow-typed/npm/double-ended-queue_v2.1.x.js b/flow-typed/npm/double-ended-queue_v2.1.x.js deleted file mode 100644 index adb7f3b85a..0000000000 --- a/flow-typed/npm/double-ended-queue_v2.1.x.js +++ /dev/null @@ -1,29 +0,0 @@ -declare module "double-ended-queue" { - declare export default class Deque { - length: number, - - constructor(capacity?: number | Array | void): Deque, - - toArray: () => Array, - push: (item: T) => number, - pop: () => ?T, - shift: () => ?T, - unshift: (item: T) => number, - peekBack: () => ?T, - peekFront: () => ?T, - get: (index: number) => ?T, - isEmpty: () => boolean, - clear: () => void, - toString: () => string, - - // aliases - valueOf: () => string, // toString - removeFront: () => ?T, // shift - removeBack: () => ?T, // pop - insertFront: (item: T) => number, // unshift - insertBack: (item: T) => number, // push - enqueue: (item: T) => number, // push - dequeue: () => ?T, // shift - toJSON: () => Array // toArray - } -} diff --git a/flow-typed/npm/escape-html_v1.x.x.js b/flow-typed/npm/escape-html_v1.x.x.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flow-typed/npm/escape-string-regexp_v1.x.x.js b/flow-typed/npm/escape-string-regexp_v1.x.x.js deleted file mode 100644 index b2842c27b3..0000000000 --- a/flow-typed/npm/escape-string-regexp_v1.x.x.js +++ /dev/null @@ -1,6 +0,0 @@ -// flow-typed signature: ed810fce1a8248c9f857e4b34ac68c14 -// flow-typed version: 94e9f7e0a4/escape-string-regexp_v1.x.x/flow_>=v0.28.x - -declare module 'escape-string-regexp' { - declare module.exports: (input: string) => string; -} diff --git a/flow-typed/npm/flow-bin_v0.x.x.js b/flow-typed/npm/flow-bin_v0.x.x.js deleted file mode 100644 index c538e2086f..0000000000 --- a/flow-typed/npm/flow-bin_v0.x.x.js +++ /dev/null @@ -1,6 +0,0 @@ -// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 -// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x - -declare module "flow-bin" { - declare module.exports: string; -} diff --git a/flow-typed/npm/idb-keyval_v2.x.x.js b/flow-typed/npm/idb-keyval_v2.x.x.js deleted file mode 100644 index 40580bfed1..0000000000 --- a/flow-typed/npm/idb-keyval_v2.x.x.js +++ /dev/null @@ -1,25 +0,0 @@ -// flow-typed signature: 57ecb560d39f9264e4d18131dd961c8b -// flow-typed version: d679eeac2f/idb-keyval_v2.x.x/flow_>=v0.34.x - -// Derived from TS typings at https://github.com/jakearchibald/idb-keyval/blob/b49b4e9fbf2f5deb63598f9cf0d9899d2f89dc95/typings.d.ts - -declare module 'idb-keyval' { - declare interface IDBKeyVal { - /** Add a new value or update an existing one */ - set(key: Key, value: Value): Promise, - - /** Get a value by key */ - get(key: Key): Promise, - - /** Get all keys in the database */ - keys(): Promise>, - - /** Delete an entry in the database by key */ - delete(key: Key): Promise, - - /** Delete all entries in the database */ - clear(): Promise, - } - - declare module.exports: IDBKeyVal; -} diff --git a/flow-typed/npm/idb_v2.x.x.js b/flow-typed/npm/idb_v2.x.x.js deleted file mode 100644 index d80acbb1e4..0000000000 --- a/flow-typed/npm/idb_v2.x.x.js +++ /dev/null @@ -1,428 +0,0 @@ -// flow-typed signature: 266e43152fad31355599ae324f4f5924 -// flow-typed version: 42ca8a9a47/idb_v2.x.x/flow_>=v0.34.x - -// Derived from TS typings at https://github.com/jakearchibald/idb/blob/c8bab898f01bacab96097f87c1e42a0c19e01425/lib/idb.d.ts - -type IDBArrayKey = Array; -type IDBValidKey = number | string | Date | IDBArrayKey; - -// TODO: upstream this to Flow DOM definitions -declare class DOMStringList { - +length: number; - // Comment syntax here as @@iterator is invalid syntax for eslint and babylon - /*:: @@iterator(): Iterator; */ - contains(str: string): boolean; - item(index: number): string | null; - [index: number]: string; -} - -declare module 'idb' { - /** This is your entry point to the API. It's exposed to the global scope unless you're using a module system such as browserify, in which case it's the exported object. */ - declare module.exports: IDBStatic; - - /** - * This is a tiny library that mirrors IndexedDB, but replaces IDBRequest objects with promises. - * This is your entry point to the API. It's exposed to the global scope unless you're using a module system such as browserify, in which case it's the exported object. - */ - declare interface IDBStatic { - /** - * This method returns a promise that resolves to a DB. - * @param name The name of the database. - * @param version Optional. The version to open the database with. If the version is not provided and the database exists, then a connection to the database will be opened without changing its version. If the version is not provided and the database does not exist, then it will be created with version 1. - * @param upgradeCallback Optional. Called if version is greater than the version last opened. It's similar to IDB's onupgradeneeded. The callback receives an instance of UpgradeDB. - * @returns A Promise that passes the DB once it has been opened. - */ - open( - name: string, - version?: number, - upgradeCallback?: (db: UpgradeDB) => void - ): Promise; - - /** - * Behaves like indexedDB.deleteDatabase, but returns a promise. - * @param name The name of the database. - * @returns A Promise that completes once the DB has been removed. - */ - delete(name: string): Promise; - } - - /** Similar to equivalent IDBDatabase. */ - declare interface DB { - /** A DOMString that contains the name of the connected database. */ - +name: string; - - /** A 64-bit integer that contains the version of the connected database. When a database is first created, this attribute is an empty string. */ - +version: number; - - /** A DOMStringList that contains a list of the names of the object stores currently in the connected database. */ - +objectStoreNames: DOMStringList; - - /** Returns immediately and closes the connection to a database in a separate thread. */ - close(): void; - - /** - * Immediately returns a transaction object (Transaction) containing the IDBTransaction.objectStore method, which you can use to access your object store. Runs in a separate thread. - * @param storeNames The names of object stores and indexes that are in the scope of the new transaction, declared as an array of strings. Specify only the object stores that you need to access. - * If you need to access only one object store, you can specify its name as a string. - * @param mode Optional. The types of access that can be performed in the transaction. Transactions are opened in one of three modes: 'readonly' or 'readwrite'. 'versionchange' mode can't be specified here. If you don't provide the parameter, the default access mode is readonly. To avoid slowing things down, don't open a readwrite transaction unless you actually need to write into the database. - * @returns The transaction object. - */ - transaction( - storeNames: string | Array, - mode?: 'readonly' | 'readwrite' - ): Transaction; - } - - /** Represent the equivalent IDBDatabase during an upgrade. */ - declare interface UpgradeDB { - /** A DOMString that contains the name of the connected database. */ - +name: string; - - /** A 64-bit integer that contains the version of the connected database. When a database is first created, this attribute is an empty string. */ - +version: number; - - /** The previous version of the DB seen by the browser, or 0 if it's new */ - +oldVersion: number; - - /** A DOMStringList that contains a list of the names of the object stores currently in the connected database. */ - +objectStoreNames: DOMStringList; - - /** This is a property rather than a method. It's a Transaction representing the upgrade transaction */ - +transaction: Transaction; - - /** - * Creates and returns a new object store or index. - * @param name The name of the new object store to be created. Note that it is possible to create an object store with an empty name. - * @param optionalParameters Optional. An options object whose attributes are optional parameters to the method. - * @returns The new object store. - */ - createObjectStore( - name: string, - optionalParameters?: { - keyPath?: string, - autoIncrement?: boolean, - } - ): ObjectStore; - - /** - * Destroys the object store with the given name in the connected database, along with any indexes that reference it. - * @param name The name of the object store to be removed. - */ - deleteObjectStore(name: string): void; - } - - /** Wrapper of IDBTransaction that presents the asynchronous operations as a Promise. */ - declare interface Transaction { - /** Resolves when transaction completes, rejects if transaction aborts or errors. */ - +complete: Promise; - - /** Returns a DOMStringList of the names of IDBObjectStore objects. */ - +objectStoreNames: DOMStringList; - - /** The mode for isolating access to data in the object stores that are in the scope of the transaction. For possible values, see the Constants section below. The default value is readonly. */ - +mode: 'readonly' | 'readwrite' | 'versionchange'; - - /** Rolls back all the changes to objects in the database associated with this transaction. If this transaction has been aborted or completed, then this method throws an error event. */ - abort(): void; - - /** - * Returns an ObjectStore object representing an object store that is part of the scope of this transaction. - * @param name The name of the requested object store. - * @returns The object store in the context of the transaction. - */ - objectStore(name: string): ObjectStore; - } - - /** Common interface for ObjectStore and Index, since bothe provide these cursor methods */ - declare interface HasCursor { - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves a new cursor object. - * Used for iterating through an object store by primary key with a cursor. - * @param range Optional. A key or IDBKeyRange to be queried. If a single valid key is passed, this will default to a range containing only that key. If nothing is passed, this will default to a key range that selects all the records in this object store. - * @param direction Optional. An IDBCursorDirection telling the cursor what direction to travel. Defaults to "next". - * @returns A promise that resolves with the cursor once it has been opened. - */ - openCursor( - range?: IDBKeyRange | IDBValidKey | null, - direction?: 'next' | 'nextunique' | 'prev' | 'prevunique' - ): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves a new cursor object. - * Used for iterating through an object store with a key. - * @param range Optional. A key or IDBKeyRange to be queried. If a single valid key is passed, this will default to a range containing only that key. If nothing is passed, this will default to a key range that selects all the records in this object store. - * @param direction Optional. An IDBCursorDirection telling the cursor what direction to travel. Defaults to "next". - * @returns A promise that resolves with the cursor once it has been opened. - */ - openKeyCursor( - range?: IDBKeyRange | IDBValidKey | null, - direction?: 'next' | 'nextunique' | 'prev' | 'prevunique' - ): Promise; - - /** - * Due to the microtask issues in some browsers, iterating over a cursor using promises doesn't always work. - * So in the mean time, iterateCursor maps to openCursor, takes identical arguments, plus an additional callback that receives an IDBCursor - */ - iterateCursor(callback: (c: Cursor) => void): void; - iterateCursor( - range: IDBKeyRange | IDBValidKey | null, - callback: (c: Cursor) => void - ): void; - iterateCursor( - range: IDBKeyRange | IDBValidKey | null, - direction: 'next' | 'nextunique' | 'prev' | 'prevunique', - callback: (c: Cursor) => void - ): void; - - /** - * Due to the microtask issues in some browsers, iterating over a cursor using promises doesn't always work. - * So in the mean time, iterateKeyCursor maps to openKeyCursor, takes identical arguments, plus an additional callback that receives an IDBCursor - */ - iterateKeyCursor(callback: (c: Cursor) => void): void; - iterateKeyCursor( - range: IDBKeyRange | IDBValidKey | null, - callback: (c: Cursor) => void - ): void; - iterateKeyCursor( - range: IDBKeyRange | IDBValidKey | null, - direction: 'next' | 'nextunique' | 'prev' | 'prevunique', - callback: (c: Cursor) => void - ): void; - } - - /** Wrapper of IDBObjectStore that presents the asynchronous operations as Promises. */ - declare interface ObjectStore extends HasCursor { - /** The name of this object store. Settable only during upgrades. */ - name: string; - - /** The key path of this object store. If this attribute is null, the application must provide a key for each modification operation. */ - +keyPath: string | Array; - - /** A list of the names of indexes on objects in this object store. */ - +indexNames: DOMStringList; - - /** The value of the auto increment flag for this object store. */ - +autoIncrement: boolean; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) creates a structured clone of the value, and updates the cloned value in the object store. - * This is for updating existing records in an object store when the transaction's mode is readwrite. - * @param value The value to be stored. - * @param key Optional. The key to use to identify the record. If unspecified, it results to null. - * @returns A promise that resolves with the new key when the underlying put IDBRequest is successful. - */ - put(value: any, key?: IDBKeyRange | IDBValidKey): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) creates a structured clone of the value, and stores the cloned value in the object store. - * This is for adding new records to an object store. - * @param value The value to be stored. - * @param key Optional. The key to use to identify the record. If unspecified, it results to null. - * @returns A promise that resolves with the new key when the underlying add IDBRequest is successful. - */ - add(value: any, key?: IDBKeyRange | IDBValidKey): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) deletes the store object specified. - * This is for deleting individual records out of an object store. - * @param key The key of the record to be deleted, or an IDBKeyRange to delete all records with keys in range. - * @returns A promise that resolves when the underlying delete IDBRequest is successful. - */ - delete(key: IDBKeyRange | IDBValidKey): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) clears the object store. - * This is for deleting all current records out of an object store. - * @returns A promise that resolves when the underlying clear IDBRequest is successful. - */ - clear(): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves with the store object store selected by the specified key. - * This is for retrieving specific records from an object store. - * @param key The key or key range that identifies the record to be retrieved. - * @returns A promise that resolves with the item when the underlying get IDBRequest is successful. - */ - get(key: any): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves with the objects in the object store matching the specified parameter or all objects in the store if no parameters are given. - * @param query Optional. A key or IDBKeyRange to be queried. If nothing is passed, this will default to a key range that selects all the records in this object store. - * @param count Optional. Specifies the number of values to return if more than one is found. If it is lower than 0 or greater than 232-1 a TypeError exception will be thrown. - * @returns A promise that resolves with the items when the underlying getAll IDBRequest is successful. - */ - getAll( - query?: IDBKeyRange | IDBValidKey, - count?: number - ): Promise>; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) finds either the given key or the primary key, if key is an IDBKeyRange. - * @param key The key or key range that identifies the record to be retrieved. - * @returns A promise that resolves with the item when the underlying get IDBRequest is successful. - */ - getKey(key: IDBKeyRange | IDBValidKey): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves with record keys for all the objects matching the specified parameter or all record keys in the store if no parameters are given. - * @param query Optional. A key or IDBKeyRange to be queried. If nothing is passed, this will default to a key range that selects all the records in this object store. - * @param count Optional. Specifies the number of values to return if more than one is found. If it is lower than 0 or greater than 232-1 a TypeError exception will be thrown. - * @returns A promise that resolves with the record keys when the underlying getAllKeys IDBRequest is successful. - */ - getAllKeys(query?: IDBKeyRange, count?: number): Promise>; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) counts the matching records. - * If no arguments are provided, it returns the total number of records in the store. - * @param key A key or IDBKeyRange object that specifies a range of records you want to count. - * @returns A promise that resolves with the total when the underlying count IDBRequest is successful. - */ - count(key?: IDBKeyRange | IDBValidKey): Promise; - - /** - * Creates a new index during a version upgrade, returning a new Index object in the connected database. - * @param name The name of the index to create. It is possible to create an index with an empty name. - * @param keyPath The key path for the index to use. It is possible to create an index with an empty keyPath, and also to pass in an array as a keyPath. - * @param optionalParameters Additional options: unique and multiEntry. - * @returns The newly created index. - */ - createIndex( - name: string, - keyPath: string | Array, - optionalParameters?: { - unique?: boolean, - multiEntry?: boolean, - locale?: string | 'auto' | null, - } - ): Index; - - /** - * Destroys the specified index in the connected database, used during a version upgrade. - * @param indexName The name of the existing index to remove. - */ - deleteIndex(indexName: string): void; - - /** - * Opens an index from this object store after which it can, for example, be used to return a sequence of records sorted by that index using a cursor. - * @param name The name of the existing index to get. - * @returns The specified index. - */ - index(name: string): Index; - } - - /** Wrapper of IDBIndex that presents the asynchronous operations as Promises. */ - declare interface Index extends HasCursor { - /** The name of this index. */ - +name: string; - - /** The key path of this index. If null, this index is not auto-populated. */ - +keyPath: string | Array; - - /** - * Affects how the index behaves when the result of evaluating the index's key path yields an array. - * If true, there is one record in the index for each item in an array of keys. - * If false, then there is one record for each key that is an array. - */ - +multiEntry: boolean; - - /** If true, this index does not allow duplicate values for a key. */ - +unique: boolean; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) counts the matching records. - * If no arguments are provided, it returns the total number of records in the store. - * @param key A key or IDBKeyRange object that specifies a range of records you want to count. - * @returns A promise that resolves with the total when the underlying count IDBRequest is successful. - */ - count(key?: IDBKeyRange | IDBValidKey): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves with the store object store selected by the specified key. - * This is for retrieving specific records from an object store. - * @param key The key or key range that identifies the record to be retrieved. - * @returns A promise that resolves with the item when the underlying get IDBRequest is successful. - */ - get(key: IDBKeyRange | IDBValidKey): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) finds either the given key or the primary key, if key is an IDBKeyRange. - * @param key The key or key range that identifies the record to be retrieved. - * @returns A promise that resolves with the item when the underlying get IDBRequest is successful. - */ - getKey(key: IDBKeyRange | IDBValidKey): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves with the objects in the object store matching the specified parameter or all objects in the store if no parameters are given. - * @param query Optional. A key or IDBKeyRange to be queried. If nothing is passed, this will default to a key range that selects all the records in this object store. - * @param count Optional. Specifies the number of values to return if more than one is found. If it is lower than 0 or greater than 232-1 a TypeError exception will be thrown. - * @returns A promise that resolves with the items when the underlying getAll IDBRequest is successful. - */ - getAll( - query?: IDBKeyRange | IDBValidKey, - count?: number - ): Promise>; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) resolves with record keys for all the objects matching the specified parameter or all record keys in the store if no parameters are given. - * @param query Optional. A key or IDBKeyRange to be queried. If nothing is passed, this will default to a key range that selects all the records in this object store. - * @param count Optional. Specifies the number of values to return if more than one is found. If it is lower than 0 or greater than 232-1 a TypeError exception will be thrown. - * @returns A promise that resolves with the record keys when the underlying getAllKeys IDBRequest is successful. - */ - getAllKeys(query?: IDBKeyRange, count?: number): Promise>; - } - - /** Wrapper of IDBCursor that presents the asynchronous operations as Promises. */ - declare interface Cursor { - /** The key for the record at the cursor's position. If the cursor is outside its range, this is set to undefined. The cursor's key can be any data type. */ - +key: IDBKeyRange | IDBValidKey; - - /** The cursor's current effective primary key. If the cursor is currently being iterated or has iterated outside its range, this is set to undefined. The cursor's primary key can be any data type. */ - +primaryKey: any; - - /** The direction of traversal of the cursor. */ - +direction: 'next' | 'nextunique' | 'prev' | 'prevunique'; - - /** The current value under the cursor. */ - +value: any; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) deletes the record at the cursor's position, without changing the cursor's position. - * This can be used to delete specific records. - * @returns A promise that resolves when the underlying delete IDBRequest is successful. - */ - delete(): Promise; - - /** - * Returns a Promise of an IDBRequest object that (in a separate thread) updates the value at the current position of the cursor in the object store. - * This can be used to update specific records. - * @param value The value to write over the current cursor location. - * @returns A promise that resolves when the underlying update IDBRequest is successful. - */ - update(value: any): Promise; - - /** - * Sets the number times a cursor should move its position forward. - * @param count The number of times to move the cursor forward. - * @returns The cursor after having been moved forward the specified number of times. - */ - advance(count: number): Promise; - - /** - * Advances the cursor to the next position along its direction, to the item whose key matches the optional key parameter. - * @param key Optional. The key to position the cursor at. If no key is specified, the cursor advances to the immediate next position, based on the its direction. - * @returns The cursor after having been continued to the next or specified record. - */ - continue(key?: IDBKeyRange | IDBValidKey): Promise; - - /** - * Sets the cursor to the given index key and primary key given as arguments. - * @param key The key to position the cursor at. - * @param primaryKey The primary key to position the cursor at. - * @returns The cursor after having been continued to the next or specified record. - */ - continuePrimaryKey( - key?: IDBKeyRange | IDBValidKey, - primaryKey?: any - ): Promise; - } -} diff --git a/flow-typed/npm/invariant_v2.x.x.js b/flow-typed/npm/invariant_v2.x.x.js deleted file mode 100644 index 14974ead54..0000000000 --- a/flow-typed/npm/invariant_v2.x.x.js +++ /dev/null @@ -1 +0,0 @@ -// Empty stub to prevent flow-typed from installing its own definition diff --git a/flow-typed/npm/json-stringify-safe_v5.x.x.js b/flow-typed/npm/json-stringify-safe_v5.x.x.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/flow-typed/npm/lodash_v4.x.x.js b/flow-typed/npm/lodash_v4.x.x.js deleted file mode 100644 index 951225d173..0000000000 --- a/flow-typed/npm/lodash_v4.x.x.js +++ /dev/null @@ -1,5991 +0,0 @@ -// flow-typed signature: 1b1fe531123a979fe1c4624ccc62bd5a -// flow-typed version: dea0770be9/lodash_v4.x.x/flow_>=v0.63.x - -declare module "lodash" { - declare type __CurriedFunction1 = (...r: [AA]) => R; - declare type CurriedFunction1 = __CurriedFunction1; - - declare type __CurriedFunction2 = (( - ...r: [AA] - ) => CurriedFunction1) & - ((...r: [AA, BB]) => R); - declare type CurriedFunction2 = __CurriedFunction2; - - declare type __CurriedFunction3 = (( - ...r: [AA] - ) => CurriedFunction2) & - ((...r: [AA, BB]) => CurriedFunction1) & - ((...r: [AA, BB, CC]) => R); - declare type CurriedFunction3 = __CurriedFunction3< - A, - B, - C, - R, - *, - *, - * - >; - - declare type __CurriedFunction4< - A, - B, - C, - D, - R, - AA: A, - BB: B, - CC: C, - DD: D - > = ((...r: [AA]) => CurriedFunction3) & - ((...r: [AA, BB]) => CurriedFunction2) & - ((...r: [AA, BB, CC]) => CurriedFunction1) & - ((...r: [AA, BB, CC, DD]) => R); - declare type CurriedFunction4 = __CurriedFunction4< - A, - B, - C, - D, - R, - *, - *, - *, - * - >; - - declare type __CurriedFunction5< - A, - B, - C, - D, - E, - R, - AA: A, - BB: B, - CC: C, - DD: D, - EE: E - > = ((...r: [AA]) => CurriedFunction4) & - ((...r: [AA, BB]) => CurriedFunction3) & - ((...r: [AA, BB, CC]) => CurriedFunction2) & - ((...r: [AA, BB, CC, DD]) => CurriedFunction1) & - ((...r: [AA, BB, CC, DD, EE]) => R); - declare type CurriedFunction5 = __CurriedFunction5< - A, - B, - C, - D, - E, - R, - *, - *, - *, - *, - * - >; - - declare type __CurriedFunction6< - A, - B, - C, - D, - E, - F, - R, - AA: A, - BB: B, - CC: C, - DD: D, - EE: E, - FF: F - > = ((...r: [AA]) => CurriedFunction5) & - ((...r: [AA, BB]) => CurriedFunction4) & - ((...r: [AA, BB, CC]) => CurriedFunction3) & - ((...r: [AA, BB, CC, DD]) => CurriedFunction2) & - ((...r: [AA, BB, CC, DD, EE]) => CurriedFunction1) & - ((...r: [AA, BB, CC, DD, EE, FF]) => R); - declare type CurriedFunction6 = __CurriedFunction6< - A, - B, - C, - D, - E, - F, - R, - *, - *, - *, - *, - *, - * - >; - - declare type Curry = (((...r: [A]) => R) => CurriedFunction1) & - (((...r: [A, B]) => R) => CurriedFunction2) & - (((...r: [A, B, C]) => R) => CurriedFunction3) & - (( - (...r: [A, B, C, D]) => R - ) => CurriedFunction4) & - (( - (...r: [A, B, C, D, E]) => R - ) => CurriedFunction5) & - (( - (...r: [A, B, C, D, E, F]) => R - ) => CurriedFunction6); - - declare type UnaryFn = (a: A) => R; - - declare type TemplateSettings = { - escape?: RegExp, - evaluate?: RegExp, - imports?: Object, - interpolate?: RegExp, - variable?: string - }; - - declare type TruncateOptions = { - length?: number, - omission?: string, - separator?: RegExp | string - }; - - declare type DebounceOptions = { - leading?: boolean, - maxWait?: number, - trailing?: boolean - }; - - declare type ThrottleOptions = { - leading?: boolean, - trailing?: boolean - }; - - declare type NestedArray = Array>; - - declare type matchesIterateeShorthand = Object; - declare type matchesPropertyIterateeShorthand = [string, any]; - declare type propertyIterateeShorthand = string; - - declare type OPredicate = - | ((value: A, key: string, object: O) => any) - | matchesIterateeShorthand - | matchesPropertyIterateeShorthand - | propertyIterateeShorthand; - - declare type OIterateeWithResult = - | Object - | string - | ((value: V, key: string, object: O) => R); - declare type OIteratee = OIterateeWithResult; - declare type OFlatMapIteratee = OIterateeWithResult>; - - declare type Predicate = - | ((value: T, index: number, array: Array) => any) - | matchesIterateeShorthand - | matchesPropertyIterateeShorthand - | propertyIterateeShorthand; - - declare type _ValueOnlyIteratee = (value: T) => mixed; - declare type ValueOnlyIteratee = _ValueOnlyIteratee | string; - declare type _Iteratee = ( - item: T, - index: number, - array: ?Array - ) => mixed; - declare type Iteratee = _Iteratee | Object | string; - declare type FlatMapIteratee = - | ((item: T, index: number, array: ?$ReadOnlyArray) => Array) - | Object - | string; - declare type Comparator = (item: T, item2: T) => boolean; - - declare type MapIterator = - | ((item: T, index: number, array: Array) => U) - | propertyIterateeShorthand; - - declare type ReadOnlyMapIterator = - | ((item: T, index: number, array: $ReadOnlyArray) => U) - | propertyIterateeShorthand; - - declare type OMapIterator = - | ((item: T, key: string, object: O) => U) - | propertyIterateeShorthand; - - declare class Lodash { - // Array - chunk(array?: ?Array, size?: ?number): Array>; - compact(array?: ?Array): Array; - concat(base?: ?$ReadOnlyArray, ...elements: Array): Array; - difference(array?: ?$ReadOnlyArray, ...values: Array>): Array; - differenceBy( - array?: ?$ReadOnlyArray, - values?: ?$ReadOnlyArray, - iteratee?: ?ValueOnlyIteratee - ): T[]; - differenceWith(array?: ?$ReadOnlyArray, values?: ?$ReadOnlyArray, comparator?: ?Comparator): T[]; - drop(array?: ?Array, n?: ?number): Array; - dropRight(array?: ?Array, n?: ?number): Array; - dropRightWhile(array?: ?Array, predicate?: ?Predicate): Array; - dropWhile(array?: ?Array, predicate?: ?Predicate): Array; - fill( - array?: ?Array, - value?: ?U, - start?: ?number, - end?: ?number - ): Array; - findIndex( - array: $ReadOnlyArray, - predicate?: ?Predicate, - fromIndex?: ?number - ): number; - findIndex( - array: void | null, - predicate?: ?Predicate, - fromIndex?: ?number - ): -1; - findLastIndex( - array: $ReadOnlyArray, - predicate?: ?Predicate, - fromIndex?: ?number - ): number; - findLastIndex( - array: void | null, - predicate?: ?Predicate, - fromIndex?: ?number - ): -1; - // alias of _.head - first(array: ?$ReadOnlyArray): T; - flatten(array?: ?Array | X>): Array; - flattenDeep(array?: ?any[]): Array; - flattenDepth(array?: ?any[], depth?: ?number): any[]; - fromPairs(pairs?: ?Array<[A, B]>): { [key: A]: B }; - head(array: ?$ReadOnlyArray): T; - indexOf(array: Array, value: T, fromIndex?: number): number; - indexOf(array: void | null, value?: ?T, fromIndex?: ?number): -1; - initial(array: ?Array): Array; - intersection(...arrays?: Array<$ReadOnlyArray>): Array; - //Workaround until (...parameter: T, parameter2: U) works - intersectionBy(a1?: ?$ReadOnlyArray, iteratee?: ?ValueOnlyIteratee): Array; - intersectionBy( - a1?: ?$ReadOnlyArray, - a2?: ?$ReadOnlyArray, - iteratee?: ?ValueOnlyIteratee - ): Array; - intersectionBy( - a1?: ?$ReadOnlyArray, - a2?: ?$ReadOnlyArray, - a3?: ?$ReadOnlyArray, - iteratee?: ?ValueOnlyIteratee - ): Array; - intersectionBy( - a1?: ?$ReadOnlyArray, - a2?: ?$ReadOnlyArray, - a3?: ?$ReadOnlyArray, - a4?: ?$ReadOnlyArray, - iteratee?: ?ValueOnlyIteratee - ): Array; - //Workaround until (...parameter: T, parameter2: U) works - intersectionWith(a1?: ?$ReadOnlyArray, comparator?: ?Comparator): Array; - intersectionWith( - a1?: ?$ReadOnlyArray, - a2?: ?$ReadOnlyArray, - comparator?: ?Comparator - ): Array; - intersectionWith( - a1?: ?$ReadOnlyArray, - a2?: ?$ReadOnlyArray, - a3?: ?$ReadOnlyArray, - comparator?: ?Comparator - ): Array; - intersectionWith( - a1?: ?$ReadOnlyArray, - a2?: ?$ReadOnlyArray, - a3?: ?$ReadOnlyArray, - a4?: ?$ReadOnlyArray, - comparator?: ?Comparator - ): Array; - join(array: Array, separator?: ?string): string; - join(array: void | null, separator?: ?string): ''; - last(array: ?$ReadOnlyArray): T; - lastIndexOf(array: Array, value?: ?T, fromIndex?: ?number): number; - lastIndexOf(array: void | null, value?: ?T, fromIndex?: ?number): -1; - nth(array: T[], n?: ?number): T; - nth(array: void | null, n?: ?number): void; - pull(array: Array, ...values?: Array): Array; - pull(array: T, ...values?: Array): T; - pullAll(array: Array, values?: ?Array): Array; - pullAll(array: T, values?: ?Array): T; - pullAllBy( - array: Array, - values?: ?Array, - iteratee?: ?ValueOnlyIteratee - ): Array; - pullAllBy( - array: T, - values?: ?Array, - iteratee?: ?ValueOnlyIteratee - ): T; - pullAllWith(array: T[], values?: ?T[], comparator?: ?Function): T[]; - pullAllWith(array: T, values?: ?Array, comparator?: ?Function): T; - pullAt(array?: ?Array, ...indexed?: Array): Array; - pullAt(array?: ?Array, indexed?: ?Array): Array; - remove(array?: ?Array, predicate?: ?Predicate): Array; - reverse(array: Array): Array; - reverse(array: T): T; - slice(array?: ?$ReadOnlyArray, start?: ?number, end?: ?number): Array; - sortedIndex(array: Array, value: T): number; - sortedIndex(array: void | null, value: ?T): 0; - sortedIndexBy( - array: Array, - value?: ?T, - iteratee?: ?ValueOnlyIteratee - ): number; - sortedIndexBy( - array: void | null, - value?: ?T, - iteratee?: ?ValueOnlyIteratee - ): 0; - sortedIndexOf(array: Array, value: T): number; - sortedIndexOf(array: void | null, value?: ?T): -1; - sortedLastIndex(array: Array, value: T): number; - sortedLastIndex(array: void | null, value?: ?T): 0; - sortedLastIndexBy( - array: Array, - value: T, - iteratee?: ValueOnlyIteratee - ): number; - sortedLastIndexBy( - array: void | null, - value?: ?T, - iteratee?: ?ValueOnlyIteratee - ): 0; - sortedLastIndexOf(array: Array, value: T): number; - sortedLastIndexOf(array: void | null, value?: ?T): -1; - sortedUniq(array?: ?Array): Array; - sortedUniqBy(array?: ?Array, iteratee?: ?(value: T) => mixed): Array; - tail(array?: ?Array): Array; - take(array?: ?Array, n?: ?number): Array; - takeRight(array?: ?Array, n?: ?number): Array; - takeRightWhile(array?: ?Array, predicate?: ?Predicate): Array; - takeWhile(array?: ?Array, predicate?: ?Predicate): Array; - union(...arrays?: Array<$ReadOnlyArray>): Array; - //Workaround until (...parameter: T, parameter2: U) works - unionBy(a1?: ?$ReadOnlyArray, iteratee?: ?ValueOnlyIteratee): Array; - unionBy( - a1?: ?$ReadOnlyArray, - a2: $ReadOnlyArray, - iteratee?: ValueOnlyIteratee - ): Array; - unionBy( - a1: $ReadOnlyArray, - a2: $ReadOnlyArray, - a3: $ReadOnlyArray, - iteratee?: ValueOnlyIteratee - ): Array; - unionBy( - a1: $ReadOnlyArray, - a2: $ReadOnlyArray, - a3: $ReadOnlyArray, - a4: $ReadOnlyArray, - iteratee?: ValueOnlyIteratee - ): Array; - //Workaround until (...parameter: T, parameter2: U) works - unionWith(a1?: ?Array, comparator?: ?Comparator): Array; - unionWith( - a1: $ReadOnlyArray, - a2: $ReadOnlyArray, - comparator?: Comparator - ): Array; - unionWith( - a1: $ReadOnlyArray, - a2: $ReadOnlyArray, - a3: $ReadOnlyArray, - comparator?: Comparator - ): Array; - unionWith( - a1: $ReadOnlyArray, - a2: $ReadOnlyArray, - a3: $ReadOnlyArray, - a4: $ReadOnlyArray, - comparator?: Comparator - ): Array; - uniq(array?: ?Array): Array; - uniqBy(array?: ?Array, iteratee?: ?ValueOnlyIteratee): Array; - uniqWith(array?: ?Array, comparator?: ?Comparator): Array; - unzip(array?: ?Array): Array; - unzipWith(array: ?Array, iteratee?: ?Iteratee): Array; - without(array?: ?$ReadOnlyArray, ...values?: Array): Array; - xor(...array: Array>): Array; - //Workaround until (...parameter: T, parameter2: U) works - xorBy(a1?: ?Array, iteratee?: ?ValueOnlyIteratee): Array; - xorBy( - a1: Array, - a2: Array, - iteratee?: ValueOnlyIteratee - ): Array; - xorBy( - a1: Array, - a2: Array, - a3: Array, - iteratee?: ValueOnlyIteratee - ): Array; - xorBy( - a1: Array, - a2: Array, - a3: Array, - a4: Array, - iteratee?: ValueOnlyIteratee - ): Array; - //Workaround until (...parameter: T, parameter2: U) works - xorWith(a1?: ?Array, comparator?: ?Comparator): Array; - xorWith( - a1: Array, - a2: Array, - comparator?: Comparator - ): Array; - xorWith( - a1: Array, - a2: Array, - a3: Array, - comparator?: Comparator - ): Array; - xorWith( - a1: Array, - a2: Array, - a3: Array, - a4: Array, - comparator?: Comparator - ): Array; - zip(a1?: ?A[], a2?: ?B[]): Array<[A, B]>; - zip(a1: A[], a2: B[], a3: C[]): Array<[A, B, C]>; - zip(a1: A[], a2: B[], a3: C[], a4: D[]): Array<[A, B, C, D]>; - zip( - a1: A[], - a2: B[], - a3: C[], - a4: D[], - a5: E[] - ): Array<[A, B, C, D, E]>; - - zipObject(props: Array, values?: ?Array): { [key: K]: V }; - zipObject(props: void | null, values?: ?Array): {}; - zipObjectDeep(props: any[], values?: ?any): Object; - zipObjectDeep(props: void | null, values?: ?any): {}; - - zipWith(a1?: ?Array): Array<[A]>; - zipWith(a1: Array, iteratee: (A) => T): Array; - - zipWith(a1: Array, a2: Array): Array<[A, B]>; - zipWith( - a1: Array, - a2: Array, - iteratee: (A, B) => T - ): Array; - - zipWith( - a1: Array, - a2: Array, - a3: Array - ): Array<[A, B, C]>; - zipWith( - a1: Array, - a2: Array, - a3: Array, - iteratee: (A, B, C) => T - ): Array; - - zipWith( - a1: Array, - a2: Array, - a3: Array, - a4: Array - ): Array<[A, B, C, D]>; - zipWith( - a1: Array, - a2: Array, - a3: Array, - a4: Array, - iteratee: (A, B, C, D) => T - ): Array; - - // Collection - countBy(array: Array, iteratee?: ?ValueOnlyIteratee): Object; - countBy(array: void | null, iteratee?: ?ValueOnlyIteratee): {}; - countBy(object: T, iteratee?: ?ValueOnlyIteratee): Object; - // alias of _.forEach - each(array: $ReadOnlyArray, iteratee?: ?Iteratee): Array; - each(array: T, iteratee?: ?Iteratee): T; - each(object: T, iteratee?: ?OIteratee): T; - // alias of _.forEachRight - eachRight(array: $ReadOnlyArray, iteratee?: ?Iteratee): Array; - eachRight(array: T, iteratee?: ?Iteratee): T; - eachRight(object: T, iteratee?: OIteratee): T; - every(array?: ?$ReadOnlyArray, iteratee?: ?Iteratee): boolean; - every(object: T, iteratee?: OIteratee): boolean; - filter(array?: ?$ReadOnlyArray, predicate?: ?Predicate): Array; - filter( - object: T, - predicate?: OPredicate - ): Array; - find( - array: $ReadOnlyArray, - predicate?: ?Predicate, - fromIndex?: ?number - ): T | void; - find( - array: void | null, - predicate?: ?Predicate, - fromIndex?: ?number - ): void; - find( - object: T, - predicate?: OPredicate, - fromIndex?: number - ): V; - findLast( - array: ?$ReadOnlyArray, - predicate?: ?Predicate, - fromIndex?: ?number - ): T | void; - findLast( - object: T, - predicate?: ?OPredicate - ): V; - flatMap( - array?: ?$ReadOnlyArray, - iteratee?: ?FlatMapIteratee - ): Array; - flatMap( - object: T, - iteratee?: OFlatMapIteratee - ): Array; - flatMapDeep( - array?: ?$ReadOnlyArray, - iteratee?: ?FlatMapIteratee - ): Array; - flatMapDeep( - object: T, - iteratee?: ?OFlatMapIteratee - ): Array; - flatMapDepth( - array?: ?Array, - iteratee?: ?FlatMapIteratee, - depth?: ?number - ): Array; - flatMapDepth( - object: T, - iteratee?: OFlatMapIteratee, - depth?: number - ): Array; - forEach(array: $ReadOnlyArray, iteratee?: ?Iteratee): Array; - forEach(array: T, iteratee?: ?Iteratee): T; - forEach(object: T, iteratee?: ?OIteratee): T; - forEachRight(array: $ReadOnlyArray, iteratee?: ?Iteratee): Array; - forEachRight(array: T, iteratee?: ?Iteratee): T; - forEachRight(object: T, iteratee?: ?OIteratee): T; - groupBy( - array: $ReadOnlyArray, - iteratee?: ?ValueOnlyIteratee - ): { [key: V]: Array }; - groupBy( - array: void | null, - iteratee?: ?ValueOnlyIteratee - ): {}; - groupBy( - object: T, - iteratee?: ValueOnlyIteratee - ): { [key: V]: Array }; - includes(array: $ReadOnlyArray, value: T, fromIndex?: ?number): boolean; - includes(array: void | null, value?: ?T, fromIndex?: ?number): false; - includes(object: T, value: any, fromIndex?: number): boolean; - includes(str: string, value: string, fromIndex?: number): boolean; - invokeMap( - array?: ?$ReadOnlyArray, - path?: ?((value: T) => Array | string) | Array | string, - ...args?: Array - ): Array; - invokeMap( - object: T, - path: ((value: any) => Array | string) | Array | string, - ...args?: Array - ): Array; - keyBy( - array: $ReadOnlyArray, - iteratee?: ?ValueOnlyIteratee - ): { [key: V]: T }; - keyBy( - array: void | null, - iteratee?: ?ValueOnlyIteratee<*> - ): {}; - keyBy( - object: T, - iteratee?: ?ValueOnlyIteratee - ): { [key: V]: A }; - map(array?: ?Array, iteratee?: ?MapIterator): Array; - map( - array: ?$ReadOnlyArray, - iteratee?: ReadOnlyMapIterator - ): Array, - map( - object: ?T, - iteratee?: OMapIterator - ): Array; - map( - str: ?string, - iteratee?: (char: string, index: number, str: string) => any - ): string; - orderBy( - array: $ReadOnlyArray, - iteratees?: ?$ReadOnlyArray> | ?string, - orders?: ?$ReadOnlyArray<"asc" | "desc"> | ?string - ): Array; - orderBy( - array: null | void, - iteratees?: ?$ReadOnlyArray> | ?string, - orders?: ?$ReadOnlyArray<"asc" | "desc"> | ?string - ): Array; - orderBy( - object: T, - iteratees?: $ReadOnlyArray> | string, - orders?: $ReadOnlyArray<"asc" | "desc"> | string - ): Array; - partition( - array?: ?Array, - predicate?: ?Predicate - ): [Array, Array]; - partition( - object: T, - predicate?: OPredicate - ): [Array, Array]; - reduce( - array: $ReadOnlyArray, - iteratee?: ( - accumulator: U, - value: T, - index: number, - array: ?Array - ) => U, - accumulator?: U - ): U; - reduce( - array: void | null, - iteratee?: ?( - accumulator: U, - value: T, - index: number, - array: ?Array - ) => U, - accumulator?: ?U - ): void | null; - reduce( - object: T, - iteratee?: (accumulator: U, value: any, key: string, object: T) => U, - accumulator?: U - ): U; - reduceRight( - array: void | null, - iteratee?: ?( - accumulator: U, - value: T, - index: number, - array: ?Array - ) => U, - accumulator?: ?U - ): void | null; - reduceRight( - array: $ReadOnlyArray, - iteratee?: ?( - accumulator: U, - value: T, - index: number, - array: ?Array - ) => U, - accumulator?: ?U - ): U; - reduceRight( - object: T, - iteratee?: ?(accumulator: U, value: any, key: string, object: T) => U, - accumulator?: ?U - ): U; - reject(array: ?$ReadOnlyArray, predicate?: Predicate): Array; - reject( - object?: ?T, - predicate?: ?OPredicate - ): Array; - sample(array: ?Array): T; - sample(object: T): V; - sampleSize(array?: ?Array, n?: ?number): Array; - sampleSize(object: T, n?: number): Array; - shuffle(array: ?Array): Array; - shuffle(object: T): Array; - size(collection: $ReadOnlyArray | Object | string): number; - some(array: ?$ReadOnlyArray, predicate?: Predicate): boolean; - some(array: void | null, predicate?: ?Predicate): false; - some( - object?: ?T, - predicate?: OPredicate - ): boolean; - sortBy( - array: ?$ReadOnlyArray, - ...iteratees?: $ReadOnlyArray> - ): Array; - sortBy( - array: ?$ReadOnlyArray, - iteratees?: $ReadOnlyArray> - ): Array; - sortBy( - object: T, - ...iteratees?: Array> - ): Array; - sortBy( - object: T, - iteratees?: $ReadOnlyArray> - ): Array; - - // Date - now(): number; - - // Function - after(n: number, fn: Function): Function; - ary(func: Function, n?: number): Function; - before(n: number, fn: Function): Function; - bind(func: Function, thisArg: any, ...partials: Array): Function; - bindKey(obj?: ?Object, key?: ?string, ...partials?: Array): Function; - curry: Curry; - curry(func: Function, arity?: number): Function; - curryRight(func: Function, arity?: number): Function; - debounce(func: F, wait?: number, options?: DebounceOptions): F; - defer(func: Function, ...args?: Array): TimeoutID; - delay(func: Function, wait: number, ...args?: Array): TimeoutID; - flip(func: Function): Function; - memoize(func: F, resolver?: Function): F; - negate(predicate: Function): Function; - once(func: Function): Function; - overArgs(func?: ?Function, ...transforms?: Array): Function; - overArgs(func?: ?Function, transforms?: ?Array): Function; - partial(func: Function, ...partials: any[]): Function; - partialRight(func: Function, ...partials: Array): Function; - partialRight(func: Function, partials: Array): Function; - rearg(func: Function, ...indexes: Array): Function; - rearg(func: Function, indexes: Array): Function; - rest(func: Function, start?: number): Function; - spread(func: Function): Function; - throttle( - func: Function, - wait?: number, - options?: ThrottleOptions - ): Function; - unary(func: Function): Function; - wrap(value?: any, wrapper?: ?Function): Function; - - // Lang - castArray(value: *): any[]; - clone(value: T): T; - cloneDeep(value: T): T; - cloneDeepWith( - value: T, - customizer?: ?(value: T, key: number | string, object: T, stack: any) => U - ): U; - cloneWith( - value: T, - customizer?: ?(value: T, key: number | string, object: T, stack: any) => U - ): U; - conformsTo( - source: T, - predicates: T & { [key: string]: (x: any) => boolean } - ): boolean; - eq(value: any, other: any): boolean; - gt(value: any, other: any): boolean; - gte(value: any, other: any): boolean; - isArguments(value: void | null): false; - isArguments(value: any): boolean; - isArray(value: Array): true; - isArray(value: any): false; - isArrayBuffer(value: ArrayBuffer): true; - isArrayBuffer(value: any): false; - isArrayLike(value: Array | string | {length: number}): true; - isArrayLike(value: any): false; - isArrayLikeObject(value: {length: number} | Array): true; - isArrayLikeObject(value: any): false; - isBoolean(value: boolean): true; - isBoolean(value: any): false; - isBuffer(value: void | null): false; - isBuffer(value: any): boolean; - isDate(value: Date): true; - isDate(value: any): false; - isElement(value: Element): true; - isElement(value: any): false; - isEmpty(value: void | null | '' | {} | [] | number | boolean): true; - isEmpty(value: any): boolean; - isEqual(value: any, other: any): boolean; - isEqualWith( - value?: ?T, - other?: ?U, - customizer?: ?( - objValue: any, - otherValue: any, - key: number | string, - object: T, - other: U, - stack: any - ) => boolean | void - ): boolean; - isError(value: Error): true; - isError(value: any): false; - isFinite(value: number): boolean; - isFinite(value: any): false; - isFunction(value: Function): true; - isFunction(value: any): false; - isInteger(value: number): boolean; - isInteger(value: any): false; - isLength(value: void | null): false; - isLength(value: any): boolean; - isMap(value: Map): true; - isMap(value: any): false; - isMatch(object?: ?Object, source?: ?Object): boolean; - isMatchWith( - object?: ?T, - source?: ?U, - customizer?: ?( - objValue: any, - srcValue: any, - key: number | string, - object: T, - source: U - ) => boolean | void - ): boolean; - isNaN(value: number): boolean; - isNaN(value: any): false; - isNative(value: number | string | void | null | Object): false; - isNative(value: any): boolean; - isNil(value: void | null): true; - isNil(value: any): false; - isNull(value: null): true; - isNull(value: any): false; - isNumber(value: number): true; - isNumber(value: any): false; - isObject(value: Object): true; - isObject(value: any): false; - isObjectLike(value: void | null): false; - isObjectLike(value: any): boolean; - isPlainObject(value: Object): true; - isPlainObject(value: any): false; - isRegExp(value: RegExp): true; - isRegExp(value: any): false; - isSafeInteger(value: number): boolean; - isSafeInteger(value: any): false; - isSet(value: Set): true; - isSet(value: any): false; - isString(value: string): true; - isString(value: any): false; - isSymbol(value: Symbol): true; - isSymbol(value: any): false; - isTypedArray(value: $TypedArray): true; - isTypedArray(value: any): false; - isUndefined(value: void): true; - isUndefined(value: any): false; - isWeakMap(value: WeakMap): true; - isWeakMap(value: any): false; - isWeakSet(value: WeakSet): true; - isWeakSet(value: any): false; - lt(value: any, other: any): boolean; - lte(value: any, other: any): boolean; - toArray(value: any): Array; - toFinite(value: void | null): 0; - toFinite(value: any): number; - toInteger(value: void | null): 0; - toInteger(value: any): number; - toLength(value: void | null): 0; - toLength(value: any): number; - toNumber(value: void | null): 0; - toNumber(value: any): number; - toPlainObject(value: any): Object; - toSafeInteger(value: void | null): 0; - toSafeInteger(value: any): number; - toString(value: void | null): ''; - toString(value: any): string; - - // Math - add(augend: number, addend: number): number; - ceil(number: number, precision?: number): number; - divide(dividend: number, divisor: number): number; - floor(number: number, precision?: number): number; - max(array: ?Array): T; - maxBy(array: ?$ReadOnlyArray, iteratee?: Iteratee): T; - mean(array: Array<*>): number; - meanBy(array: Array, iteratee?: Iteratee): number; - min(array: ?Array): T; - minBy(array: ?$ReadOnlyArray, iteratee?: Iteratee): T; - multiply(multiplier: number, multiplicand: number): number; - round(number: number, precision?: number): number; - subtract(minuend: number, subtrahend: number): number; - sum(array: Array<*>): number; - sumBy(array: Array, iteratee?: Iteratee): number; - - // number - clamp(number?: number, lower?: ?number, upper?: ?number): number; - clamp(number: ?number, lower?: ?number, upper?: ?number): 0; - inRange(number: number, start?: number, end: number): boolean; - random(lower?: number, upper?: number, floating?: boolean): number; - - // Object - assign(object?: ?Object, ...sources?: Array): Object; - assignIn(): {}; - assignIn(a: A, b: B): A & B; - assignIn(a: A, b: B, c: C): A & B & C; - assignIn(a: A, b: B, c: C, d: D): A & B & C & D; - assignIn(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E; - assignInWith(): {}; - assignInWith( - object: T, - s1: A, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void - ): Object; - assignInWith( - object: T, - s1: A, - s2: B, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B - ) => any | void - ): Object; - assignInWith( - object: T, - s1: A, - s2: B, - s3: C, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C - ) => any | void - ): Object; - assignInWith( - object: T, - s1: A, - s2: B, - s3: C, - s4: D, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C | D - ) => any | void - ): Object; - assignWith(): {}; - assignWith( - object: T, - s1: A, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void - ): Object; - assignWith( - object: T, - s1: A, - s2: B, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B - ) => any | void - ): Object; - assignWith( - object: T, - s1: A, - s2: B, - s3: C, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C - ) => any | void - ): Object; - assignWith( - object: T, - s1: A, - s2: B, - s3: C, - s4: D, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C | D - ) => any | void - ): Object; - at(object?: ?Object, ...paths: Array): Array; - at(object?: ?Object, paths: Array): Array; - create(prototype: T, properties: Object): $Supertype; - create(prototype: any, properties: void | null): {}; - defaults(object?: ?Object, ...sources?: Array): Object; - defaultsDeep(object?: ?Object, ...sources?: Array): Object; - // alias for _.toPairs - entries(object?: ?Object): Array<[string, any]>; - // alias for _.toPairsIn - entriesIn(object?: ?Object): Array<[string, any]>; - // alias for _.assignIn - extend(a?: ?A, b?: ?B): A & B; - extend(a: A, b: B, c: C): A & B & C; - extend(a: A, b: B, c: C, d: D): A & B & C & D; - extend(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E; - // alias for _.assignInWith - extendWith( - object?: ?T, - s1?: ?A, - customizer?: ?( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void - ): Object; - extendWith( - object: T, - s1: A, - s2: B, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B - ) => any | void - ): Object; - extendWith( - object: T, - s1: A, - s2: B, - s3: C, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C - ) => any | void - ): Object; - extendWith( - object: T, - s1: A, - s2: B, - s3: C, - s4: D, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C | D - ) => any | void - ): Object; - findKey( - object: T, - predicate?: ?OPredicate - ): string | void; - findKey( - object: void | null, - predicate?: ?OPredicate - ): void; - findLastKey( - object: T, - predicate?: ?OPredicate - ): string | void; - findLastKey( - object: void | null, - predicate?: ?OPredicate - ): void; - forIn(object: Object, iteratee?: ?OIteratee<*>): Object; - forIn(object: void | null, iteratee?: ?OIteratee<*>): null; - forInRight(object: Object, iteratee?: ?OIteratee<*>): Object; - forInRight(object: void | null, iteratee?: ?OIteratee<*>): null; - forOwn(object: Object, iteratee?: ?OIteratee<*>): Object; - forOwn(object: void | null, iteratee?: ?OIteratee<*>): null; - forOwnRight(object: Object, iteratee?: ?OIteratee<*>): Object; - forOwnRight(object: void | null, iteratee?: ?OIteratee<*>): null; - functions(object?: ?Object): Array; - functionsIn(object?: ?Object): Array; - get( - object?: ?Object | ?$ReadOnlyArray | void | null, - path?: ?$ReadOnlyArray | string | number, - defaultValue?: any - ): any; - has(object: Object, path: Array | string): boolean; - has(object: Object, path: void | null): false; - has(object: void | null, path?: ?Array | ?string): false; - hasIn(object: Object, path: Array | string): boolean; - hasIn(object: Object, path: void | null): false; - hasIn(object: void | null, path?: ?Array | ?string): false; - invert(object: Object, multiVal?: ?boolean): Object; - invert(object: void | null, multiVal?: ?boolean): {}; - invertBy(object: Object, iteratee?: ?Function): Object; - invertBy(object: void | null, iteratee?: ?Function): {}; - invoke( - object?: ?Object, - path?: ?Array | string, - ...args?: Array - ): any; - keys(object?: ?{ [key: K]: any }): Array; - keys(object?: ?Object): Array; - keysIn(object?: ?Object): Array; - mapKeys(object: Object, iteratee?: ?OIteratee<*>): Object; - mapKeys(object: void | null, iteratee?: ?OIteratee<*>): {}; - mapValues(object: Object, iteratee?: ?OIteratee<*>): Object; - mapValues(object: void | null, iteratee?: ?OIteratee<*>): {}; - merge(object?: ?Object, ...sources?: Array): Object; - mergeWith(): {}; - mergeWith( - object: T, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void - ): Object; - mergeWith( - object: T, - s1: A, - s2: B, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B - ) => any | void - ): Object; - mergeWith( - object: T, - s1: A, - s2: B, - s3: C, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C - ) => any | void - ): Object; - mergeWith( - object: T, - s1: A, - s2: B, - s3: C, - s4: D, - customizer?: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B | C | D - ) => any | void - ): Object; - omit(object?: ?Object, ...props: Array): Object; - omit(object?: ?Object, props: Array): Object; - omitBy( - object: T, - predicate?: ?OPredicate - ): Object; - omitBy( - object: void | null, - predicate?: ?OPredicate - ): {}; - pick(object?: ?Object, ...props: Array): Object; - pick(object?: ?Object, props: Array): Object; - pickBy( - object: T, - predicate?: ?OPredicate - ): Object; - pickBy( - object: void | null, - predicate?: ?OPredicate - ): {}; - result( - object?: ?Object, - path?: ?Array | string, - defaultValue?: any - ): any; - set(object: Object, path?: ?Array | string, value: any): Object; - set( - object: T, - path?: ?Array | string, - value?: ?any): T; - setWith( - object: T, - path?: ?Array | string, - value: any, - customizer?: (nsValue: any, key: string, nsObject: T) => any - ): Object; - setWith( - object: T, - path?: ?Array | string, - value?: ?any, - customizer?: ?(nsValue: any, key: string, nsObject: T) => any - ): T; - toPairs(object?: ?Object | Array<*>): Array<[string, any]>; - toPairsIn(object?: ?Object): Array<[string, any]>; - transform( - collection: Object | $ReadOnlyArray, - iteratee?: ?OIteratee<*>, - accumulator?: any - ): any; - transform( - collection: void | null, - iteratee?: ?OIteratee<*>, - accumulator?: ?any - ): {}; - unset(object: Object, path?: ?Array | ?string): boolean; - unset(object: void | null, path?: ?Array | ?string): true; - update(object: Object, path: string[] | string, updater: Function): Object; - update( - object: T, - path?: ?string[] | ?string, - updater?: ?Function): T; - updateWith( - object: Object, - path?: ?string[] | ?string, - updater?: ?Function, - customizer?: ?Function - ): Object; - updateWith( - object: T, - path?: ?string[] | ?string, - updater?: ?Function, - customizer?: ?Function - ): T; - values(object?: ?Object): Array; - valuesIn(object?: ?Object): Array; - - // Seq - // harder to read, but this is _() - (value: any): any; - chain(value: T): any; - tap(value: T, interceptor: (value: T) => any): T; - thru(value: T1, interceptor: (value: T1) => T2): T2; - // TODO: _.prototype.* - - // String - camelCase(string: string): string; - camelCase(string: void | null): ''; - capitalize(string: string): string; - capitalize(string: void | null): ''; - deburr(string: string): string; - deburr(string: void | null): ''; - endsWith(string: string, target?: string, position?: ?number): boolean; - endsWith(string: void | null, target?: ?string, position?: ?number): false; - escape(string: string): string; - escape(string: void | null): ''; - escapeRegExp(string: string): string; - escapeRegExp(string: void | null): ''; - kebabCase(string: string): string; - kebabCase(string: void | null): ''; - lowerCase(string: string): string; - lowerCase(string: void | null): ''; - lowerFirst(string: string): string; - lowerFirst(string: void | null): ''; - pad(string?: ?string, length?: ?number, chars?: ?string): string; - padEnd(string?: ?string, length?: ?number, chars?: ?string): string; - padStart(string?: ?string, length?: ?number, chars?: ?string): string; - parseInt(string: string, radix?: ?number): number; - repeat(string: string, n?: ?number): string; - repeat(string: void | null, n?: ?number): ''; - replace( - string: string, - pattern: RegExp | string, - replacement: ((string: string) => string) | string - ): string; - replace( - string: void | null, - pattern?: ?RegExp | ?string, - replacement: ?((string: string) => string) | ?string - ): ''; - snakeCase(string: string): string; - snakeCase(string: void | null): ''; - split( - string?: ?string, - separator?: ?RegExp | ?string, - limit?: ?number - ): Array; - startCase(string: string): string; - startCase(string: void | null): ''; - startsWith(string: string, target?: string, position?: number): boolean; - startsWith(string: void | null, target?: ?string, position?: ?number): false; - template(string?: ?string, options?: ?TemplateSettings): Function; - toLower(string: string): string; - toLower(string: void | null): ''; - toUpper(string: string): string; - toUpper(string: void | null): ''; - trim(string: string, chars?: string): string; - trim(string: void | null, chars?: ?string): ''; - trimEnd(string: string, chars?: ?string): string; - trimEnd(string: void | null, chars?: ?string): ''; - trimStart(string: string, chars?: ?string): string; - trimStart(string: void | null, chars?: ?string): ''; - truncate(string: string, options?: TruncateOptions): string; - truncate(string: void | null, options?: ?TruncateOptions): ''; - unescape(string: string): string; - unescape(string: void | null): ''; - upperCase(string: string): string; - upperCase(string: void | null): ''; - upperFirst(string: string): string; - upperFirst(string: void | null): ''; - words(string?: ?string, pattern?: ?RegExp | ?string): Array; - - // Util - attempt(func: Function, ...args: Array): any; - bindAll(object: Object, methodNames?: ?Array): Object; - bindAll(object: T, methodNames?: ?Array): T; - bindAll(object: Object, ...methodNames: Array): Object; - cond(pairs?: ?NestedArray): Function; - conforms(source?: ?Object): Function; - constant(value: T): () => T; - defaultTo( - value: T1, - defaultValue: T2 - ): T1; - // NaN is a number instead of its own type, otherwise it would behave like null/void - defaultTo(value: T1, defaultValue: T2): T1 | T2; - defaultTo(value: T1, defaultValue: T2): T2; - flow: ($ComposeReverse & (funcs: Array) => Function); - flowRight: ($Compose & (funcs: Array) => Function); - identity(value: T): T; - iteratee(func?: any): Function; - matches(source?: ?Object): Function; - matchesProperty(path?: ?Array | string, srcValue: any): Function; - method(path?: ?Array | string, ...args?: Array): Function; - methodOf(object?: ?Object, ...args?: Array): Function; - mixin( - object?: T, - source: Object, - options?: { chain: boolean } - ): T; - noConflict(): Lodash; - noop(...args: Array): void; - nthArg(n?: ?number): Function; - over(...iteratees: Array): Function; - over(iteratees: Array): Function; - overEvery(...predicates: Array): Function; - overEvery(predicates: Array): Function; - overSome(...predicates: Array): Function; - overSome(predicates: Array): Function; - property(path?: ?Array | string): Function; - propertyOf(object?: ?Object): Function; - range(start: number, end: number, step?: number): Array; - range(end: number, step?: number): Array; - rangeRight(start?: ?number, end?: ?number, step?: ?number): Array; - rangeRight(end?: ?number, step?: ?number): Array; - runInContext(context?: ?Object): Function; - - stubArray(): Array<*>; - stubFalse(): false; - stubObject(): {}; - stubString(): ""; - stubTrue(): true; - times(n?: ?number, ...rest?: Array): Array; - times(n: number, iteratee: (i: number) => T): Array; - toPath(value: any): Array; - uniqueId(prefix?: ?string): string; - - // Properties - VERSION: string; - templateSettings: TemplateSettings; - } - - declare module.exports: Lodash; -} - -declare module "lodash/fp" { - declare type __CurriedFunction1 = (...r: [AA]) => R; - declare type CurriedFunction1 = __CurriedFunction1; - - declare type __CurriedFunction2 = (( - ...r: [AA] - ) => CurriedFunction1) & - ((...r: [AA, BB]) => R); - declare type CurriedFunction2 = __CurriedFunction2; - - declare type __CurriedFunction3 = (( - ...r: [AA] - ) => CurriedFunction2) & - ((...r: [AA, BB]) => CurriedFunction1) & - ((...r: [AA, BB, CC]) => R); - declare type CurriedFunction3 = __CurriedFunction3< - A, - B, - C, - R, - *, - *, - * - >; - - declare type __CurriedFunction4< - A, - B, - C, - D, - R, - AA: A, - BB: B, - CC: C, - DD: D - > = ((...r: [AA]) => CurriedFunction3) & - ((...r: [AA, BB]) => CurriedFunction2) & - ((...r: [AA, BB, CC]) => CurriedFunction1) & - ((...r: [AA, BB, CC, DD]) => R); - declare type CurriedFunction4 = __CurriedFunction4< - A, - B, - C, - D, - R, - *, - *, - *, - * - >; - - declare type __CurriedFunction5< - A, - B, - C, - D, - E, - R, - AA: A, - BB: B, - CC: C, - DD: D, - EE: E - > = ((...r: [AA]) => CurriedFunction4) & - ((...r: [AA, BB]) => CurriedFunction3) & - ((...r: [AA, BB, CC]) => CurriedFunction2) & - ((...r: [AA, BB, CC, DD]) => CurriedFunction1) & - ((...r: [AA, BB, CC, DD, EE]) => R); - declare type CurriedFunction5 = __CurriedFunction5< - A, - B, - C, - D, - E, - R, - *, - *, - *, - *, - * - >; - - declare type __CurriedFunction6< - A, - B, - C, - D, - E, - F, - R, - AA: A, - BB: B, - CC: C, - DD: D, - EE: E, - FF: F - > = ((...r: [AA]) => CurriedFunction5) & - ((...r: [AA, BB]) => CurriedFunction4) & - ((...r: [AA, BB, CC]) => CurriedFunction3) & - ((...r: [AA, BB, CC, DD]) => CurriedFunction2) & - ((...r: [AA, BB, CC, DD, EE]) => CurriedFunction1) & - ((...r: [AA, BB, CC, DD, EE, FF]) => R); - declare type CurriedFunction6 = __CurriedFunction6< - A, - B, - C, - D, - E, - F, - R, - *, - *, - *, - *, - *, - * - >; - - declare type Curry = (((...r: [A]) => R) => CurriedFunction1) & - (((...r: [A, B]) => R) => CurriedFunction2) & - (((...r: [A, B, C]) => R) => CurriedFunction3) & - (( - (...r: [A, B, C, D]) => R - ) => CurriedFunction4) & - (( - (...r: [A, B, C, D, E]) => R - ) => CurriedFunction5) & - (( - (...r: [A, B, C, D, E, F]) => R - ) => CurriedFunction6); - - declare type UnaryFn = (a: A) => R; - - declare type TemplateSettings = { - escape?: RegExp, - evaluate?: RegExp, - imports?: Object, - interpolate?: RegExp, - variable?: string - }; - - declare type TruncateOptions = { - length?: number, - omission?: string, - separator?: RegExp | string - }; - - declare type DebounceOptions = { - leading?: boolean, - maxWait?: number, - trailing?: boolean - }; - - declare type ThrottleOptions = { - leading?: boolean, - trailing?: boolean - }; - - declare type NestedArray = Array>; - - declare type matchesIterateeShorthand = Object; - declare type matchesPropertyIterateeShorthand = [string, any]; - declare type propertyIterateeShorthand = string; - - declare type OPredicate = - | ((value: A) => any) - | matchesIterateeShorthand - | matchesPropertyIterateeShorthand - | propertyIterateeShorthand; - - declare type OIterateeWithResult = Object | string | ((value: V) => R); - declare type OIteratee = OIterateeWithResult; - declare type OFlatMapIteratee = OIterateeWithResult>; - - declare type Predicate = - | ((value: T) => any) - | matchesIterateeShorthand - | matchesPropertyIterateeShorthand - | propertyIterateeShorthand; - - declare type _ValueOnlyIteratee = (value: T) => mixed; - declare type ValueOnlyIteratee = _ValueOnlyIteratee | string; - declare type _Iteratee = (item: T) => mixed; - declare type Iteratee = _Iteratee | Object | string; - declare type FlatMapIteratee = - | ((item: T) => Array) - | Object - | string; - declare type Comparator = (item: T, item2: T) => boolean; - - declare type MapIterator = ((item: T) => U) | propertyIterateeShorthand; - - declare type OMapIterator = - | ((item: T) => U) - | propertyIterateeShorthand; - - declare class Lodash { - // Array - chunk(size: number): (array: Array) => Array>; - chunk(size: number, array: Array): Array>; - compact(array?: ?$ReadOnlyArray): Array; - concat | T, B: Array | U>( - base: A - ): (elements: B) => Array; - concat | T, B: Array | U>( - base: A, - elements: B - ): Array; - difference(values: $ReadOnlyArray): (array: $ReadOnlyArray) => T[]; - difference(values: $ReadOnlyArray, array: $ReadOnlyArray): T[]; - differenceBy( - iteratee: ValueOnlyIteratee - ): ((values: $ReadOnlyArray) => (array: $ReadOnlyArray) => T[]) & - ((values: $ReadOnlyArray, array: $ReadOnlyArray) => T[]); - differenceBy( - iteratee: ValueOnlyIteratee, - values: $ReadOnlyArray - ): (array: $ReadOnlyArray) => T[]; - differenceBy( - iteratee: ValueOnlyIteratee, - values: $ReadOnlyArray, - array: $ReadOnlyArray - ): T[]; - differenceWith( - comparator: Comparator, - ): ((first: $ReadOnly) => (second: $ReadOnly) => T[]) & - ((first: $ReadOnly, second: $ReadOnly) => T[]); - differenceWith( - comparator: Comparator, - first: $ReadOnly, - ): (second: $ReadOnly) => T[]; - differenceWith( - comparator: Comparator, - first: $ReadOnly, - second: $ReadOnly - ): T[]; - drop(n: number): (array: Array) => Array; - drop(n: number, array: Array): Array; - dropLast(n: number): (array: Array) => Array; - dropLast(n: number, array: Array): Array; - dropRight(n: number): (array: Array) => Array; - dropRight(n: number, array: Array): Array; - dropRightWhile(predicate: Predicate): (array: Array) => Array; - dropRightWhile(predicate: Predicate, array: Array): Array; - dropWhile(predicate: Predicate): (array: Array) => Array; - dropWhile(predicate: Predicate, array: Array): Array; - dropLastWhile(predicate: Predicate): (array: Array) => Array; - dropLastWhile(predicate: Predicate, array: Array): Array; - fill( - start: number - ): (( - end: number - ) => ((value: U) => (array: Array) => Array) & - ((value: U, array: Array) => Array)) & - ((end: number, value: U) => (array: Array) => Array) & - ((end: number, value: U, array: Array) => Array); - fill( - start: number, - end: number - ): ((value: U) => (array: Array) => Array) & - ((value: U, array: Array) => Array); - fill( - start: number, - end: number, - value: U - ): (array: Array) => Array; - fill( - start: number, - end: number, - value: U, - array: Array - ): Array; - findIndex(predicate: Predicate): (array: $ReadOnlyArray) => number; - findIndex(predicate: Predicate, array: $ReadOnlyArray): number; - findIndexFrom( - predicate: Predicate - ): ((fromIndex: number) => (array: $ReadOnlyArray) => number) & - ((fromIndex: number, array: $ReadOnlyArray) => number); - findIndexFrom( - predicate: Predicate, - fromIndex: number - ): (array: $ReadOnlyArray) => number; - findIndexFrom( - predicate: Predicate, - fromIndex: number, - array: $ReadOnlyArray - ): number; - findLastIndex( - predicate: Predicate - ): (array: $ReadOnlyArray) => number; - findLastIndex(predicate: Predicate, array: $ReadOnlyArray): number; - findLastIndexFrom( - predicate: Predicate - ): ((fromIndex: number) => (array: $ReadOnlyArray) => number) & - ((fromIndex: number, array: $ReadOnlyArray) => number); - findLastIndexFrom( - predicate: Predicate, - fromIndex: number - ): (array: $ReadOnlyArray) => number; - findLastIndexFrom( - predicate: Predicate, - fromIndex: number, - array: $ReadOnlyArray - ): number; - // alias of _.head - first(array: $ReadOnlyArray): T; - flatten(array: Array | X>): Array; - unnest(array: Array | X>): Array; - flattenDeep(array: any[]): Array; - flattenDepth(depth: number): (array: any[]) => any[]; - flattenDepth(depth: number, array: any[]): any[]; - fromPairs(pairs: Array<[A, B]>): { [key: A]: B }; - head(array: $ReadOnlyArray): T; - indexOf(value: T): (array: Array) => number; - indexOf(value: T, array: Array): number; - indexOfFrom( - value: T - ): ((fromIndex: number) => (array: Array) => number) & - ((fromIndex: number, array: Array) => number); - indexOfFrom(value: T, fromIndex: number): (array: Array) => number; - indexOfFrom(value: T, fromIndex: number, array: Array): number; - initial(array: Array): Array; - init(array: Array): Array; - intersection(a1: Array): (a2: Array) => Array; - intersection(a1: Array, a2: Array): Array; - intersectionBy( - iteratee: ValueOnlyIteratee - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - intersectionBy( - iteratee: ValueOnlyIteratee, - a1: Array - ): (a2: Array) => Array; - intersectionBy( - iteratee: ValueOnlyIteratee, - a1: Array, - a2: Array - ): Array; - intersectionWith( - comparator: Comparator - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - intersectionWith( - comparator: Comparator, - a1: Array - ): (a2: Array) => Array; - intersectionWith( - comparator: Comparator, - a1: Array, - a2: Array - ): Array; - join(separator: string): (array: Array) => string; - join(separator: string, array: Array): string; - last(array: Array): T; - lastIndexOf(value: T): (array: Array) => number; - lastIndexOf(value: T, array: Array): number; - lastIndexOfFrom( - value: T - ): ((fromIndex: number) => (array: Array) => number) & - ((fromIndex: number, array: Array) => number); - lastIndexOfFrom( - value: T, - fromIndex: number - ): (array: Array) => number; - lastIndexOfFrom(value: T, fromIndex: number, array: Array): number; - nth(n: number): (array: T[]) => T; - nth(n: number, array: T[]): T; - pull(value: T): (array: Array) => Array; - pull(value: T, array: Array): Array; - pullAll(values: Array): (array: Array) => Array; - pullAll(values: Array, array: Array): Array; - pullAllBy( - iteratee: ValueOnlyIteratee - ): ((values: Array) => (array: Array) => Array) & - ((values: Array, array: Array) => Array); - pullAllBy( - iteratee: ValueOnlyIteratee, - values: Array - ): (array: Array) => Array; - pullAllBy( - iteratee: ValueOnlyIteratee, - values: Array, - array: Array - ): Array; - pullAllWith( - comparator: Function - ): ((values: T[]) => (array: T[]) => T[]) & - ((values: T[], array: T[]) => T[]); - pullAllWith(comparator: Function, values: T[]): (array: T[]) => T[]; - pullAllWith(comparator: Function, values: T[], array: T[]): T[]; - pullAt(indexed: Array): (array: Array) => Array; - pullAt(indexed: Array, array: Array): Array; - remove(predicate: Predicate): (array: Array) => Array; - remove(predicate: Predicate, array: Array): Array; - reverse(array: Array): Array; - slice( - start: number - ): ((end: number) => (array: Array) => Array) & - ((end: number, array: Array) => Array); - slice(start: number, end: number): (array: Array) => Array; - slice(start: number, end: number, array: Array): Array; - sortedIndex(value: T): (array: Array) => number; - sortedIndex(value: T, array: Array): number; - sortedIndexBy( - iteratee: ValueOnlyIteratee - ): ((value: T) => (array: Array) => number) & - ((value: T, array: Array) => number); - sortedIndexBy( - iteratee: ValueOnlyIteratee, - value: T - ): (array: Array) => number; - sortedIndexBy( - iteratee: ValueOnlyIteratee, - value: T, - array: Array - ): number; - sortedIndexOf(value: T): (array: Array) => number; - sortedIndexOf(value: T, array: Array): number; - sortedLastIndex(value: T): (array: Array) => number; - sortedLastIndex(value: T, array: Array): number; - sortedLastIndexBy( - iteratee: ValueOnlyIteratee - ): ((value: T) => (array: Array) => number) & - ((value: T, array: Array) => number); - sortedLastIndexBy( - iteratee: ValueOnlyIteratee, - value: T - ): (array: Array) => number; - sortedLastIndexBy( - iteratee: ValueOnlyIteratee, - value: T, - array: Array - ): number; - sortedLastIndexOf(value: T): (array: Array) => number; - sortedLastIndexOf(value: T, array: Array): number; - sortedUniq(array: Array): Array; - sortedUniqBy( - iteratee: (value: T) => mixed - ): (array: Array) => Array; - sortedUniqBy(iteratee: (value: T) => mixed, array: Array): Array; - tail(array: Array): Array; - take(n: number): (array: Array) => Array; - take(n: number, array: Array): Array; - takeRight(n: number): (array: Array) => Array; - takeRight(n: number, array: Array): Array; - takeLast(n: number): (array: Array) => Array; - takeLast(n: number, array: Array): Array; - takeRightWhile(predicate: Predicate): (array: Array) => Array; - takeRightWhile(predicate: Predicate, array: Array): Array; - takeLastWhile(predicate: Predicate): (array: Array) => Array; - takeLastWhile(predicate: Predicate, array: Array): Array; - takeWhile(predicate: Predicate): (array: Array) => Array; - takeWhile(predicate: Predicate, array: Array): Array; - union(a1: Array): (a2: Array) => Array; - union(a1: Array, a2: Array): Array; - unionBy( - iteratee: ValueOnlyIteratee - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - unionBy( - iteratee: ValueOnlyIteratee, - a1: Array - ): (a2: Array) => Array; - unionBy( - iteratee: ValueOnlyIteratee, - a1: Array, - a2: Array - ): Array; - unionWith( - comparator: Comparator - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - unionWith( - comparator: Comparator, - a1: Array - ): (a2: Array) => Array; - unionWith( - comparator: Comparator, - a1: Array, - a2: Array - ): Array; - uniq(array: Array): Array; - uniqBy(iteratee: ValueOnlyIteratee): (array: Array) => Array; - uniqBy(iteratee: ValueOnlyIteratee, array: Array): Array; - uniqWith(comparator: Comparator): (array: Array) => Array; - uniqWith(comparator: Comparator, array: Array): Array; - unzip(array: Array): Array; - unzipWith(iteratee: Iteratee): (array: Array) => Array; - unzipWith(iteratee: Iteratee, array: Array): Array; - without(values: Array): (array: Array) => Array; - without(values: Array, array: Array): Array; - xor(a1: Array): (a2: Array) => Array; - xor(a1: Array, a2: Array): Array; - symmetricDifference(a1: Array): (a2: Array) => Array; - symmetricDifference(a1: Array, a2: Array): Array; - xorBy( - iteratee: ValueOnlyIteratee - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - xorBy( - iteratee: ValueOnlyIteratee, - a1: Array - ): (a2: Array) => Array; - xorBy( - iteratee: ValueOnlyIteratee, - a1: Array, - a2: Array - ): Array; - symmetricDifferenceBy( - iteratee: ValueOnlyIteratee - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - symmetricDifferenceBy( - iteratee: ValueOnlyIteratee, - a1: Array - ): (a2: Array) => Array; - symmetricDifferenceBy( - iteratee: ValueOnlyIteratee, - a1: Array, - a2: Array - ): Array; - xorWith( - comparator: Comparator - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - xorWith( - comparator: Comparator, - a1: Array - ): (a2: Array) => Array; - xorWith(comparator: Comparator, a1: Array, a2: Array): Array; - symmetricDifferenceWith( - comparator: Comparator - ): ((a1: Array) => (a2: Array) => Array) & - ((a1: Array, a2: Array) => Array); - symmetricDifferenceWith( - comparator: Comparator, - a1: Array - ): (a2: Array) => Array; - symmetricDifferenceWith( - comparator: Comparator, - a1: Array, - a2: Array - ): Array; - zip(a1: A[]): (a2: B[]) => Array<[A, B]>; - zip(a1: A[], a2: B[]): Array<[A, B]>; - zipAll(arrays: Array>): Array; - zipObject(props?: Array): (values?: Array) => { [key: K]: V }; - zipObject(props?: Array, values?: Array): { [key: K]: V }; - zipObj(props: Array): (values: Array) => Object; - zipObj(props: Array, values: Array): Object; - zipObjectDeep(props: any[]): (values: any) => Object; - zipObjectDeep(props: any[], values: any): Object; - zipWith( - iteratee: Iteratee - ): ((a1: NestedArray) => (a2: NestedArray) => Array) & - ((a1: NestedArray, a2: NestedArray) => Array); - zipWith( - iteratee: Iteratee, - a1: NestedArray - ): (a2: NestedArray) => Array; - zipWith( - iteratee: Iteratee, - a1: NestedArray, - a2: NestedArray - ): Array; - // Collection - countBy( - iteratee: ValueOnlyIteratee - ): (collection: Array | { [id: any]: T }) => { [string]: number }; - countBy( - iteratee: ValueOnlyIteratee, - collection: Array | { [id: any]: T } - ): { [string]: number }; - // alias of _.forEach - each( - iteratee: Iteratee | OIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - each( - iteratee: Iteratee | OIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): Array; - // alias of _.forEachRight - eachRight( - iteratee: Iteratee | OIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - eachRight( - iteratee: Iteratee | OIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): Array; - every( - iteratee: Iteratee | OIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => boolean; - every( - iteratee: Iteratee | OIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): boolean; - all( - iteratee: Iteratee | OIteratee - ): (collection: Array | { [id: any]: T }) => boolean; - all( - iteratee: Iteratee | OIteratee, - collection: Array | { [id: any]: T } - ): boolean; - filter( - predicate: Predicate | OPredicate - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - filter( - predicate: Predicate | OPredicate, - collection: $ReadOnlyArray | { [id: any]: T } - ): Array; - find( - predicate: Predicate | OPredicate - ): (collection: $ReadOnlyArray | { [id: any]: T }) => T | void; - find( - predicate: Predicate | OPredicate, - collection: $ReadOnlyArray | { [id: any]: T } - ): T | void; - findFrom( - predicate: Predicate | OPredicate - ): (( - fromIndex: number - ) => (collection: $ReadOnlyArray | { [id: any]: T }) => T | void) & - (( - fromIndex: number, - collection: $ReadOnlyArray | { [id: any]: T } - ) => T | void); - findFrom( - predicate: Predicate | OPredicate, - fromIndex: number - ): (collection: Array | { [id: any]: T }) => T | void; - findFrom( - predicate: Predicate | OPredicate, - fromIndex: number, - collection: $ReadOnlyArray | { [id: any]: T } - ): T | void; - findLast( - predicate: Predicate | OPredicate - ): (collection: $ReadOnlyArray | { [id: any]: T }) => T | void; - findLast( - predicate: Predicate | OPredicate, - collection: $ReadOnlyArray | { [id: any]: T } - ): T | void; - findLastFrom( - predicate: Predicate | OPredicate - ): (( - fromIndex: number - ) => (collection: $ReadOnlyArray | { [id: any]: T }) => T | void) & - (( - fromIndex: number, - collection: $ReadOnlyArray | { [id: any]: T } - ) => T | void); - findLastFrom( - predicate: Predicate | OPredicate, - fromIndex: number - ): (collection: $ReadOnlyArray | { [id: any]: T }) => T | void; - findLastFrom( - predicate: Predicate | OPredicate, - fromIndex: number, - collection: $ReadOnlyArray | { [id: any]: T } - ): T | void; - flatMap( - iteratee: FlatMapIteratee | OFlatMapIteratee - ): (collection: Array | { [id: any]: T }) => Array; - flatMap( - iteratee: FlatMapIteratee | OFlatMapIteratee, - collection: Array | { [id: any]: T } - ): Array; - flatMapDeep( - iteratee: FlatMapIteratee | OFlatMapIteratee - ): (collection: Array | { [id: any]: T }) => Array; - flatMapDeep( - iteratee: FlatMapIteratee | OFlatMapIteratee, - collection: Array | { [id: any]: T } - ): Array; - flatMapDepth( - iteratee: FlatMapIteratee | OFlatMapIteratee - ): (( - depth: number - ) => (collection: Array | { [id: any]: T }) => Array) & - ((depth: number, collection: Array | { [id: any]: T }) => Array); - flatMapDepth( - iteratee: FlatMapIteratee | OFlatMapIteratee, - depth: number - ): (collection: Array | { [id: any]: T }) => Array; - flatMapDepth( - iteratee: FlatMapIteratee | OFlatMapIteratee, - depth: number, - collection: Array | { [id: any]: T } - ): Array; - forEach( - iteratee: Iteratee | OIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - forEach( - iteratee: Iteratee | OIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): Array; - forEachRight( - iteratee: Iteratee | OIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - forEachRight( - iteratee: Iteratee | OIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): Array; - groupBy( - iteratee: ValueOnlyIteratee - ): ( - collection: $ReadOnlyArray | { [id: any]: T } - ) => { [key: V]: Array }; - groupBy( - iteratee: ValueOnlyIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): { [key: V]: Array }; - includes(value: T): (collection: Array | { [id: any]: T }) => boolean; - includes(value: T, collection: Array | { [id: any]: T }): boolean; - includes(value: string): (str: string) => boolean; - includes(value: string, str: string): boolean; - contains(value: string): (str: string) => boolean; - contains(value: string, str: string): boolean; - contains(value: T): (collection: Array | { [id: any]: T }) => boolean; - contains(value: T, collection: Array | { [id: any]: T }): boolean; - includesFrom( - value: string - ): ((fromIndex: number) => (str: string) => boolean) & - ((fromIndex: number, str: string) => boolean); - includesFrom(value: string, fromIndex: number): (str: string) => boolean; - includesFrom(value: string, fromIndex: number, str: string): boolean; - includesFrom( - value: T - ): ((fromIndex: number) => (collection: Array) => boolean) & - ((fromIndex: number, collection: Array) => boolean); - includesFrom( - value: T, - fromIndex: number - ): (collection: Array) => boolean; - includesFrom(value: T, fromIndex: number, collection: Array): boolean; - invokeMap( - path: ((value: T) => Array | string) | Array | string - ): (collection: Array | { [id: any]: T }) => Array; - invokeMap( - path: ((value: T) => Array | string) | Array | string, - collection: Array | { [id: any]: T } - ): Array; - invokeArgsMap( - path: ((value: T) => Array | string) | Array | string - ): (( - collection: Array | { [id: any]: T } - ) => (args: Array) => Array) & - (( - collection: Array | { [id: any]: T }, - args: Array - ) => Array); - invokeArgsMap( - path: ((value: T) => Array | string) | Array | string, - collection: Array | { [id: any]: T } - ): (args: Array) => Array; - invokeArgsMap( - path: ((value: T) => Array | string) | Array | string, - collection: Array | { [id: any]: T }, - args: Array - ): Array; - keyBy( - iteratee: ValueOnlyIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => { [key: V]: T }; - keyBy( - iteratee: ValueOnlyIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): { [key: V]: T }; - indexBy( - iteratee: ValueOnlyIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => { [key: V]: T }; - indexBy( - iteratee: ValueOnlyIteratee, - collection: $ReadOnlyArray | { [id: any]: T } - ): { [key: V]: T }; - map( - iteratee: MapIterator | OMapIterator - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - map( - iteratee: MapIterator | OMapIterator, - collection: $ReadOnlyArray | { [id: any]: T } - ): Array; - map(iteratee: (char: string) => any): (str: string) => string; - map(iteratee: (char: string) => any, str: string): string; - pluck( - iteratee: MapIterator | OMapIterator - ): (collection: Array | { [id: any]: T }) => Array; - pluck( - iteratee: MapIterator | OMapIterator, - collection: Array | { [id: any]: T } - ): Array; - pluck(iteratee: (char: string) => any): (str: string) => string; - pluck(iteratee: (char: string) => any, str: string): string; - orderBy( - iteratees: $ReadOnlyArray | OIteratee<*>> | string - ): (( - orders: $ReadOnlyArray<"asc" | "desc"> | string - ) => (collection: $ReadOnlyArray | { [id: any]: T }) => Array) & - (( - orders: $ReadOnlyArray<"asc" | "desc"> | string, - collection: $ReadOnlyArray | { [id: any]: T } - ) => Array); - orderBy( - iteratees: $ReadOnlyArray | OIteratee<*>> | string, - orders: $ReadOnlyArray<"asc" | "desc"> | string - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - orderBy( - iteratees: $ReadOnlyArray | OIteratee<*>> | string, - orders: $ReadOnlyArray<"asc" | "desc"> | string, - collection: $ReadOnlyArray | { [id: any]: T } - ): Array; - partition( - predicate: Predicate | OPredicate - ): (collection: Array | { [id: any]: T }) => [Array, Array]; - partition( - predicate: Predicate | OPredicate, - collection: Array | { [id: any]: T } - ): [Array, Array]; - reduce( - iteratee: (accumulator: U, value: T) => U - ): ((accumulator: U) => (collection: Array | { [id: any]: T }) => U) & - ((accumulator: U, collection: Array | { [id: any]: T }) => U); - reduce( - iteratee: (accumulator: U, value: T) => U, - accumulator: U - ): (collection: Array | { [id: any]: T }) => U; - reduce( - iteratee: (accumulator: U, value: T) => U, - accumulator: U, - collection: Array | { [id: any]: T } - ): U; - reduceRight( - iteratee: (value: T, accumulator: U) => U - ): ((accumulator: U) => (collection: Array | { [id: any]: T }) => U) & - ((accumulator: U, collection: Array | { [id: any]: T }) => U); - reduceRight( - iteratee: (value: T, accumulator: U) => U, - accumulator: U - ): (collection: Array | { [id: any]: T }) => U; - reduceRight( - iteratee: (value: T, accumulator: U) => U, - accumulator: U, - collection: Array | { [id: any]: T } - ): U; - reject( - predicate: Predicate | OPredicate - ): (collection: Array | { [id: any]: T }) => Array; - reject( - predicate: Predicate | OPredicate, - collection: Array | { [id: any]: T } - ): Array; - sample(collection: Array | { [id: any]: T }): T; - sampleSize( - n: number - ): (collection: Array | { [id: any]: T }) => Array; - sampleSize(n: number, collection: Array | { [id: any]: T }): Array; - shuffle(collection: Array | { [id: any]: T }): Array; - size(collection: $ReadOnlyArray | Object | string): number; - some( - predicate: Predicate | OPredicate - ): (collection: $ReadOnlyArray | { [id: any]: T }) => boolean; - some( - predicate: Predicate | OPredicate, - collection: $ReadOnlyArray | { [id: any]: T } - ): boolean; - any( - predicate: Predicate | OPredicate - ): (collection: $ReadOnlyArray | { [id: any]: T }) => boolean; - any( - predicate: Predicate | OPredicate, - collection: $ReadOnlyArray | { [id: any]: T } - ): boolean; - sortBy( - iteratees: | $ReadOnlyArray | OIteratee> - | Iteratee - | OIteratee - ): (collection: $ReadOnlyArray | { [id: any]: T }) => Array; - sortBy( - iteratees: | $ReadOnlyArray | OIteratee> - | Iteratee - | OIteratee, - collection: $ReadOnlyArray | { [id: any]: T }, - ): Array; - - // Date - now(): number; - - // Function - after(fn: Function): (n: number) => Function; - after(fn: Function, n: number): Function; - ary(func: Function): Function; - nAry(n: number): (func: Function) => Function; - nAry(n: number, func: Function): Function; - before(fn: Function): (n: number) => Function; - before(fn: Function, n: number): Function; - bind(func: Function): (thisArg: any) => Function; - bind(func: Function, thisArg: any): Function; - bindKey(obj: Object): (key: string) => Function; - bindKey(obj: Object, key: string): Function; - curry: Curry; - curryN(arity: number): (func: Function) => Function; - curryN(arity: number, func: Function): Function; - curryRight(func: Function): Function; - curryRightN(arity: number): (func: Function) => Function; - curryRightN(arity: number, func: Function): Function; - debounce(wait: number): (func: F) => F; - debounce(wait: number, func: F): F; - defer(func: Function): TimeoutID; - delay(wait: number): (func: Function) => TimeoutID; - delay(wait: number, func: Function): TimeoutID; - flip(func: Function): Function; - memoize(func: F): F; - negate(predicate: Function): Function; - complement(predicate: Function): Function; - once(func: Function): Function; - overArgs(func: Function): (transforms: Array) => Function; - overArgs(func: Function, transforms: Array): Function; - useWith(func: Function): (transforms: Array) => Function; - useWith(func: Function, transforms: Array): Function; - partial(func: Function): (partials: any[]) => Function; - partial(func: Function, partials: any[]): Function; - partialRight(func: Function): (partials: Array) => Function; - partialRight(func: Function, partials: Array): Function; - rearg(indexes: Array): (func: Function) => Function; - rearg(indexes: Array, func: Function): Function; - rest(func: Function): Function; - unapply(func: Function): Function; - restFrom(start: number): (func: Function) => Function; - restFrom(start: number, func: Function): Function; - spread(func: Function): Function; - apply(func: Function): Function; - spreadFrom(start: number): (func: Function) => Function; - spreadFrom(start: number, func: Function): Function; - throttle(wait: number): (func: Function) => Function; - throttle(wait: number, func: Function): Function; - unary(func: Function): Function; - wrap(wrapper: Function): (value: any) => Function; - wrap(wrapper: Function, value: any): Function; - - // Lang - castArray(value: *): any[]; - clone(value: T): T; - cloneDeep(value: T): T; - cloneDeepWith( - customizer: (value: T, key: number | string, object: T, stack: any) => U - ): (value: T) => U; - cloneDeepWith( - customizer: (value: T, key: number | string, object: T, stack: any) => U, - value: T - ): U; - cloneWith( - customizer: (value: T, key: number | string, object: T, stack: any) => U - ): (value: T) => U; - cloneWith( - customizer: (value: T, key: number | string, object: T, stack: any) => U, - value: T - ): U; - conformsTo( - predicates: T & { [key: string]: (x: any) => boolean } - ): (source: T) => boolean; - conformsTo( - predicates: T & { [key: string]: (x: any) => boolean }, - source: T - ): boolean; - where( - predicates: T & { [key: string]: (x: any) => boolean } - ): (source: T) => boolean; - where( - predicates: T & { [key: string]: (x: any) => boolean }, - source: T - ): boolean; - conforms( - predicates: T & { [key: string]: (x: any) => boolean } - ): (source: T) => boolean; - conforms( - predicates: T & { [key: string]: (x: any) => boolean }, - source: T - ): boolean; - eq(value: any): (other: any) => boolean; - eq(value: any, other: any): boolean; - identical(value: any): (other: any) => boolean; - identical(value: any, other: any): boolean; - gt(value: any): (other: any) => boolean; - gt(value: any, other: any): boolean; - gte(value: any): (other: any) => boolean; - gte(value: any, other: any): boolean; - isArguments(value: any): boolean; - isArray(value: any): boolean; - isArrayBuffer(value: any): boolean; - isArrayLike(value: any): boolean; - isArrayLikeObject(value: any): boolean; - isBoolean(value: any): boolean; - isBuffer(value: any): boolean; - isDate(value: any): boolean; - isElement(value: any): boolean; - isEmpty(value: any): boolean; - isEqual(value: any): (other: any) => boolean; - isEqual(value: any, other: any): boolean; - equals(value: any): (other: any) => boolean; - equals(value: any, other: any): boolean; - isEqualWith( - customizer: ( - objValue: any, - otherValue: any, - key: number | string, - object: T, - other: U, - stack: any - ) => boolean | void - ): ((value: T) => (other: U) => boolean) & - ((value: T, other: U) => boolean); - isEqualWith( - customizer: ( - objValue: any, - otherValue: any, - key: number | string, - object: T, - other: U, - stack: any - ) => boolean | void, - value: T - ): (other: U) => boolean; - isEqualWith( - customizer: ( - objValue: any, - otherValue: any, - key: number | string, - object: T, - other: U, - stack: any - ) => boolean | void, - value: T, - other: U - ): boolean; - isError(value: any): boolean; - isFinite(value: any): boolean; - isFunction(value: Function): true; - isFunction(value: number | string | void | null | Object): false; - isInteger(value: any): boolean; - isLength(value: any): boolean; - isMap(value: any): boolean; - isMatch(source: Object): (object: Object) => boolean; - isMatch(source: Object, object: Object): boolean; - whereEq(source: Object): (object: Object) => boolean; - whereEq(source: Object, object: Object): boolean; - isMatchWith( - customizer: ( - objValue: any, - srcValue: any, - key: number | string, - object: T, - source: U - ) => boolean | void - ): ((source: U) => (object: T) => boolean) & - ((source: U, object: T) => boolean); - isMatchWith( - customizer: ( - objValue: any, - srcValue: any, - key: number | string, - object: T, - source: U - ) => boolean | void, - source: U - ): (object: T) => boolean; - isMatchWith( - customizer: ( - objValue: any, - srcValue: any, - key: number | string, - object: T, - source: U - ) => boolean | void, - source: U, - object: T - ): boolean; - isNaN(value: any): boolean; - isNative(value: any): boolean; - isNil(value: any): boolean; - isNull(value: any): boolean; - isNumber(value: any): boolean; - isObject(value: any): boolean; - isObjectLike(value: any): boolean; - isPlainObject(value: any): boolean; - isRegExp(value: any): boolean; - isSafeInteger(value: any): boolean; - isSet(value: any): boolean; - isString(value: string): true; - isString(value: any): false; - isSymbol(value: any): boolean; - isTypedArray(value: any): boolean; - isUndefined(value: any): boolean; - isWeakMap(value: any): boolean; - isWeakSet(value: any): boolean; - lt(value: any): (other: any) => boolean; - lt(value: any, other: any): boolean; - lte(value: any): (other: any) => boolean; - lte(value: any, other: any): boolean; - toArray(value: any): Array; - toFinite(value: any): number; - toInteger(value: any): number; - toLength(value: any): number; - toNumber(value: any): number; - toPlainObject(value: any): Object; - toSafeInteger(value: any): number; - toString(value: any): string; - - // Math - add(augend: number): (addend: number) => number; - add(augend: number, addend: number): number; - ceil(number: number): number; - divide(dividend: number): (divisor: number) => number; - divide(dividend: number, divisor: number): number; - floor(number: number): number; - max(array: Array): T; - maxBy(iteratee: Iteratee): (array: Array) => T; - maxBy(iteratee: Iteratee, array: Array): T; - mean(array: Array<*>): number; - meanBy(iteratee: Iteratee): (array: Array) => number; - meanBy(iteratee: Iteratee, array: Array): number; - min(array: Array): T; - minBy(iteratee: Iteratee): (array: Array) => T; - minBy(iteratee: Iteratee, array: Array): T; - multiply(multiplier: number): (multiplicand: number) => number; - multiply(multiplier: number, multiplicand: number): number; - round(number: number): number; - subtract(minuend: number): (subtrahend: number) => number; - subtract(minuend: number, subtrahend: number): number; - sum(array: Array<*>): number; - sumBy(iteratee: Iteratee): (array: Array) => number; - sumBy(iteratee: Iteratee, array: Array): number; - - // number - clamp( - lower: number - ): ((upper: number) => (number: number) => number) & - ((upper: number, number: number) => number); - clamp(lower: number, upper: number): (number: number) => number; - clamp(lower: number, upper: number, number: number): number; - inRange( - start: number - ): ((end: number) => (number: number) => boolean) & - ((end: number, number: number) => boolean); - inRange(start: number, end: number): (number: number) => boolean; - inRange(start: number, end: number, number: number): boolean; - random(lower: number): (upper: number) => number; - random(lower: number, upper: number): number; - - // Object - assign(object: Object): (source: Object) => Object; - assign(object: Object, source: Object): Object; - assignAll(objects: Array): Object; - assignInAll(objects: Array): Object; - extendAll(objects: Array): Object; - assignIn(a: A): (b: B) => A & B; - assignIn(a: A, b: B): A & B; - assignInWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void - ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); - assignInWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void, - object: T - ): (s1: A) => Object; - assignInWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void, - object: T, - s1: A - ): Object; - assignWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void - ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); - assignWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void, - object: T - ): (s1: A) => Object; - assignWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void, - object: T, - s1: A - ): Object; - assignInAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void - ): (objects: Array) => Object; - assignInAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void, - objects: Array - ): Object; - extendAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void - ): (objects: Array) => Object; - extendAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void, - objects: Array - ): Object; - assignAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void - ): (objects: Array) => Object; - assignAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void, - objects: Array - ): Object; - at(paths: Array): (object: Object) => Array; - at(paths: Array, object: Object): Array; - props(paths: Array): (object: Object) => Array; - props(paths: Array, object: Object): Array; - paths(paths: Array): (object: Object) => Array; - paths(paths: Array, object: Object): Array; - create(prototype: T): $Supertype; - defaults(source: Object): (object: Object) => Object; - defaults(source: Object, object: Object): Object; - defaultsAll(objects: Array): Object; - defaultsDeep(source: Object): (object: Object) => Object; - defaultsDeep(source: Object, object: Object): Object; - defaultsDeepAll(objects: Array): Object; - // alias for _.toPairs - entries(object: Object): Array<[string, any]>; - // alias for _.toPairsIn - entriesIn(object: Object): Array<[string, any]>; - // alias for _.assignIn - extend(a: A): (b: B) => A & B; - extend(a: A, b: B): A & B; - // alias for _.assignInWith - extendWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void - ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); - extendWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void, - object: T - ): (s1: A) => Object; - extendWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A - ) => any | void, - object: T, - s1: A - ): Object; - findKey( - predicate: OPredicate - ): (object: T) => string | void; - findKey( - predicate: OPredicate, - object: T - ): string | void; - findLastKey( - predicate: OPredicate - ): (object: T) => string | void; - findLastKey( - predicate: OPredicate, - object: T - ): string | void; - forIn(iteratee: OIteratee<*>): (object: Object) => Object; - forIn(iteratee: OIteratee<*>, object: Object): Object; - forInRight(iteratee: OIteratee<*>): (object: Object) => Object; - forInRight(iteratee: OIteratee<*>, object: Object): Object; - forOwn(iteratee: OIteratee<*>): (object: Object) => Object; - forOwn(iteratee: OIteratee<*>, object: Object): Object; - forOwnRight(iteratee: OIteratee<*>): (object: Object) => Object; - forOwnRight(iteratee: OIteratee<*>, object: Object): Object; - functions(object: Object): Array; - functionsIn(object: Object): Array; - get(path: $ReadOnlyArray | string | number): (object: Object | $ReadOnlyArray | void | null) => any; - get(path: $ReadOnlyArray | string | number, object: Object | $ReadOnlyArray | void | null): any; - prop(path: Array | string): (object: Object | Array) => any; - prop(path: Array | string, object: Object | Array): any; - path(path: Array | string): (object: Object | Array) => any; - path(path: Array | string, object: Object | Array): any; - getOr( - defaultValue: any - ): (( - path: Array | string - ) => (object: Object | Array) => any) & - ((path: Array | string, object: Object | $ReadOnlyArray | void | null) => any); - getOr( - defaultValue: any, - path: Array | string - ): (object: Object | $ReadOnlyArray | void | null) => any; - getOr( - defaultValue: any, - path: Array | string, - object: Object | $ReadOnlyArray | void | null - ): any; - propOr( - defaultValue: any - ): (( - path: Array | string - ) => (object: Object | Array) => any) & - ((path: Array | string, object: Object | Array) => any); - propOr( - defaultValue: any, - path: Array | string - ): (object: Object | Array) => any; - propOr( - defaultValue: any, - path: Array | string, - object: Object | Array - ): any; - pathOr( - defaultValue: any - ): (( - path: Array | string - ) => (object: Object | Array) => any) & - ((path: Array | string, object: Object | Array) => any); - pathOr( - defaultValue: any, - path: Array | string - ): (object: Object | Array) => any; - pathOr( - defaultValue: any, - path: Array | string, - object: Object | Array - ): any; - has(path: Array | string): (object: Object) => boolean; - has(path: Array | string, object: Object): boolean; - hasIn(path: Array | string): (object: Object) => boolean; - hasIn(path: Array | string, object: Object): boolean; - invert(object: Object): Object; - invertObj(object: Object): Object; - invertBy(iteratee: Function): (object: Object) => Object; - invertBy(iteratee: Function, object: Object): Object; - invoke(path: Array | string): (object: Object) => any; - invoke(path: Array | string, object: Object): any; - invokeArgs( - path: Array | string - ): ((object: Object) => (args: Array) => any) & - ((object: Object, args: Array) => any); - invokeArgs( - path: Array | string, - object: Object - ): (args: Array) => any; - invokeArgs( - path: Array | string, - object: Object, - args: Array - ): any; - keys(object: { [key: K]: any }): Array; - keys(object: Object): Array; - keysIn(object: Object): Array; - mapKeys(iteratee: OIteratee<*>): (object: Object) => Object; - mapKeys(iteratee: OIteratee<*>, object: Object): Object; - mapValues(iteratee: OIteratee<*>): (object: Object) => Object; - mapValues(iteratee: OIteratee<*>, object: Object): Object; - merge(object: Object): (source: Object) => Object; - merge(object: Object, source: Object): Object; - mergeAll(objects: Array): Object; - mergeWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B - ) => any | void - ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object); - mergeWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B - ) => any | void, - object: T - ): (s1: A) => Object; - mergeWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: T, - source: A | B - ) => any | void, - object: T, - s1: A - ): Object; - mergeAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void - ): (objects: Array) => Object; - mergeAllWith( - customizer: ( - objValue: any, - srcValue: any, - key: string, - object: Object, - source: Object - ) => any | void, - objects: Array - ): Object; - omit(props: Array): (object: Object) => Object; - omit(props: Array, object: Object): Object; - omitAll(props: Array): (object: Object) => Object; - omitAll(props: Array, object: Object): Object; - omitBy( - predicate: OPredicate - ): (object: T) => Object; - omitBy(predicate: OPredicate, object: T): Object; - pick(props: Array): (object: Object) => Object; - pick(props: Array, object: Object): Object; - pickAll(props: Array): (object: Object) => Object; - pickAll(props: Array, object: Object): Object; - pickBy( - predicate: OPredicate - ): (object: T) => Object; - pickBy(predicate: OPredicate, object: T): Object; - result(path: Array | string): (object: Object) => any; - result(path: Array | string, object: Object): any; - set( - path: Array | string - ): ((value: any) => (object: Object) => Object) & - ((value: any, object: Object) => Object); - set(path: Array | string, value: any): (object: Object) => Object; - set(path: Array | string, value: any, object: Object): Object; - assoc( - path: Array | string - ): ((value: any) => (object: Object) => Object) & - ((value: any, object: Object) => Object); - assoc(path: Array | string, value: any): (object: Object) => Object; - assoc(path: Array | string, value: any, object: Object): Object; - assocPath( - path: Array | string - ): ((value: any) => (object: Object) => Object) & - ((value: any, object: Object) => Object); - assocPath( - path: Array | string, - value: any - ): (object: Object) => Object; - assocPath(path: Array | string, value: any, object: Object): Object; - setWith( - customizer: (nsValue: any, key: string, nsObject: T) => any - ): (( - path: Array | string - ) => ((value: any) => (object: T) => Object) & - ((value: any, object: T) => Object)) & - ((path: Array | string, value: any) => (object: T) => Object) & - ((path: Array | string, value: any, object: T) => Object); - setWith( - customizer: (nsValue: any, key: string, nsObject: T) => any, - path: Array | string - ): ((value: any) => (object: T) => Object) & - ((value: any, object: T) => Object); - setWith( - customizer: (nsValue: any, key: string, nsObject: T) => any, - path: Array | string, - value: any - ): (object: T) => Object; - setWith( - customizer: (nsValue: any, key: string, nsObject: T) => any, - path: Array | string, - value: any, - object: T - ): Object; - toPairs(object: Object | Array<*>): Array<[string, any]>; - toPairsIn(object: Object): Array<[string, any]>; - transform( - iteratee: OIteratee<*> - ): (( - accumulator: any - ) => (collection: Object | $ReadOnlyArray) => any) & - ((accumulator: any, collection: Object | $ReadOnlyArray) => any); - transform( - iteratee: OIteratee<*>, - accumulator: any - ): (collection: Object | $ReadOnlyArray) => any; - transform( - iteratee: OIteratee<*>, - accumulator: any, - collection: Object | $ReadOnlyArray - ): any; - unset(path: Array | string): (object: Object) => Object; - unset(path: Array | string, object: Object): Object; - dissoc(path: Array | string): (object: Object) => Object; - dissoc(path: Array | string, object: Object): Object; - dissocPath(path: Array | string): (object: Object) => Object; - dissocPath(path: Array | string, object: Object): Object; - update( - path: string[] | string - ): ((updater: Function) => (object: Object) => Object) & - ((updater: Function, object: Object) => Object); - update( - path: string[] | string, - updater: Function - ): (object: Object) => Object; - update(path: string[] | string, updater: Function, object: Object): Object; - updateWith( - customizer: Function - ): (( - path: string[] | string - ) => ((updater: Function) => (object: Object) => Object) & - ((updater: Function, object: Object) => Object)) & - (( - path: string[] | string, - updater: Function - ) => (object: Object) => Object) & - ((path: string[] | string, updater: Function, object: Object) => Object); - updateWith( - customizer: Function, - path: string[] | string - ): ((updater: Function) => (object: Object) => Object) & - ((updater: Function, object: Object) => Object); - updateWith( - customizer: Function, - path: string[] | string, - updater: Function - ): (object: Object) => Object; - updateWith( - customizer: Function, - path: string[] | string, - updater: Function, - object: Object - ): Object; - values(object: Object): Array; - valuesIn(object: Object): Array; - - tap(interceptor: (value: T) => any): (value: T) => T; - tap(interceptor: (value: T) => any, value: T): T; - thru(interceptor: (value: T1) => T2): (value: T1) => T2; - thru(interceptor: (value: T1) => T2, value: T1): T2; - - // String - camelCase(string: string): string; - capitalize(string: string): string; - deburr(string: string): string; - endsWith(target: string): (string: string) => boolean; - endsWith(target: string, string: string): boolean; - escape(string: string): string; - escapeRegExp(string: string): string; - kebabCase(string: string): string; - lowerCase(string: string): string; - lowerFirst(string: string): string; - pad(length: number): (string: string) => string; - pad(length: number, string: string): string; - padChars( - chars: string - ): ((length: number) => (string: string) => string) & - ((length: number, string: string) => string); - padChars(chars: string, length: number): (string: string) => string; - padChars(chars: string, length: number, string: string): string; - padEnd(length: number): (string: string) => string; - padEnd(length: number, string: string): string; - padCharsEnd( - chars: string - ): ((length: number) => (string: string) => string) & - ((length: number, string: string) => string); - padCharsEnd(chars: string, length: number): (string: string) => string; - padCharsEnd(chars: string, length: number, string: string): string; - padStart(length: number): (string: string) => string; - padStart(length: number, string: string): string; - padCharsStart( - chars: string - ): ((length: number) => (string: string) => string) & - ((length: number, string: string) => string); - padCharsStart(chars: string, length: number): (string: string) => string; - padCharsStart(chars: string, length: number, string: string): string; - parseInt(radix: number): (string: string) => number; - parseInt(radix: number, string: string): number; - repeat(n: number): (string: string) => string; - repeat(n: number, string: string): string; - replace( - pattern: RegExp | string - ): (( - replacement: ((string: string) => string) | string - ) => (string: string) => string) & - (( - replacement: ((string: string) => string) | string, - string: string - ) => string); - replace( - pattern: RegExp | string, - replacement: ((string: string) => string) | string - ): (string: string) => string; - replace( - pattern: RegExp | string, - replacement: ((string: string) => string) | string, - string: string - ): string; - snakeCase(string: string): string; - split(separator: RegExp | string): (string: string) => Array; - split(separator: RegExp | string, string: string): Array; - startCase(string: string): string; - startsWith(target: string): (string: string) => boolean; - startsWith(target: string, string: string): boolean; - template(string: string): Function; - toLower(string: string): string; - toUpper(string: string): string; - trim(string: string): string; - trimChars(chars: string): (string: string) => string; - trimChars(chars: string, string: string): string; - trimEnd(string: string): string; - trimCharsEnd(chars: string): (string: string) => string; - trimCharsEnd(chars: string, string: string): string; - trimStart(string: string): string; - trimCharsStart(chars: string): (string: string) => string; - trimCharsStart(chars: string, string: string): string; - truncate(options: TruncateOptions): (string: string) => string; - truncate(options: TruncateOptions, string: string): string; - unescape(string: string): string; - upperCase(string: string): string; - upperFirst(string: string): string; - words(string: string): Array; - - // Util - attempt(func: Function): any; - bindAll(methodNames: Array): (object: Object) => Object; - bindAll(methodNames: Array, object: Object): Object; - cond(pairs: NestedArray): Function; - constant(value: T): () => T; - always(value: T): () => T; - defaultTo( - defaultValue: T2 - ): (value: T1) => T1; - defaultTo( - defaultValue: T2, - value: T1 - ): T1; - // NaN is a number instead of its own type, otherwise it would behave like null/void - defaultTo(defaultValue: T2): (value: T1) => T1 | T2; - defaultTo(defaultValue: T2, value: T1): T1 | T2; - defaultTo(defaultValue: T2): (value: T1) => T2; - defaultTo(defaultValue: T2, value: T1): T2; - flow: ($ComposeReverse & (funcs: Array) => Function); - pipe: ($ComposeReverse & (funcs: Array) => Function); - flowRight: ($Compose & (funcs: Array) => Function); - compose: ($Compose & (funcs: Array) => Function); - compose(funcs: Array): Function; - identity(value: T): T; - iteratee(func: any): Function; - matches(source: Object): (object: Object) => boolean; - matches(source: Object, object: Object): boolean; - matchesProperty(path: Array | string): (srcValue: any) => Function; - matchesProperty(path: Array | string, srcValue: any): Function; - propEq(path: Array | string): (srcValue: any) => Function; - propEq(path: Array | string, srcValue: any): Function; - pathEq(path: Array | string): (srcValue: any) => Function; - pathEq(path: Array | string, srcValue: any): Function; - method(path: Array | string): Function; - methodOf(object: Object): Function; - mixin( - object: T - ): ((source: Object) => (options: { chain: boolean }) => T) & - ((source: Object, options: { chain: boolean }) => T); - mixin( - object: T, - source: Object - ): (options: { chain: boolean }) => T; - mixin( - object: T, - source: Object, - options: { chain: boolean } - ): T; - noConflict(): Lodash; - noop(...args: Array): void; - nthArg(n: number): Function; - over(iteratees: Array): Function; - juxt(iteratees: Array): Function; - overEvery(predicates: Array): Function; - allPass(predicates: Array): Function; - overSome(predicates: Array): Function; - anyPass(predicates: Array): Function; - property( - path: Array | string - ): (object: Object | Array) => any; - property(path: Array | string, object: Object | Array): any; - propertyOf(object: Object): (path: Array | string) => Function; - propertyOf(object: Object, path: Array | string): Function; - range(start: number): (end: number) => Array; - range(start: number, end: number): Array; - rangeStep( - step: number - ): ((start: number) => (end: number) => Array) & - ((start: number, end: number) => Array); - rangeStep(step: number, start: number): (end: number) => Array; - rangeStep(step: number, start: number, end: number): Array; - rangeRight(start: number): (end: number) => Array; - rangeRight(start: number, end: number): Array; - rangeStepRight( - step: number - ): ((start: number) => (end: number) => Array) & - ((start: number, end: number) => Array); - rangeStepRight(step: number, start: number): (end: number) => Array; - rangeStepRight(step: number, start: number, end: number): Array; - runInContext(context: Object): Function; - - stubArray(): Array<*>; - stubFalse(): false; - F(): false; - stubObject(): {}; - stubString(): ""; - stubTrue(): true; - T(): true; - times(iteratee: (i: number) => T): (n: number) => Array; - times(iteratee: (i: number) => T, n: number): Array; - toPath(value: any): Array; - uniqueId(prefix: string): string; - - __: any; - placeholder: any; - - convert(options: { - cap?: boolean, - curry?: boolean, - fixed?: boolean, - immutable?: boolean, - rearg?: boolean - }): void; - - // Properties - VERSION: string; - templateSettings: TemplateSettings; - } - - declare module.exports: Lodash; -} - -declare module "lodash/chunk" { - declare module.exports: $PropertyType<$Exports<"lodash">, "chunk">; -} - -declare module "lodash/compact" { - declare module.exports: $PropertyType<$Exports<"lodash">, "compact">; -} - -declare module "lodash/concat" { - declare module.exports: $PropertyType<$Exports<"lodash">, "concat">; -} - -declare module "lodash/difference" { - declare module.exports: $PropertyType<$Exports<"lodash">, "difference">; -} - -declare module "lodash/differenceBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "differenceBy">; -} - -declare module "lodash/differenceWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "differenceWith">; -} - -declare module "lodash/drop" { - declare module.exports: $PropertyType<$Exports<"lodash">, "drop">; -} - -declare module "lodash/dropRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "dropRight">; -} - -declare module "lodash/dropRightWhile" { - declare module.exports: $PropertyType<$Exports<"lodash">, "dropRightWhile">; -} - -declare module "lodash/dropWhile" { - declare module.exports: $PropertyType<$Exports<"lodash">, "dropWhile">; -} - -declare module "lodash/fill" { - declare module.exports: $PropertyType<$Exports<"lodash">, "fill">; -} - -declare module "lodash/findIndex" { - declare module.exports: $PropertyType<$Exports<"lodash">, "findIndex">; -} - -declare module "lodash/findLastIndex" { - declare module.exports: $PropertyType<$Exports<"lodash">, "findLastIndex">; -} - -declare module "lodash/first" { - declare module.exports: $PropertyType<$Exports<"lodash">, "first">; -} - -declare module "lodash/flatten" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flatten">; -} - -declare module "lodash/flattenDeep" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flattenDeep">; -} - -declare module "lodash/flattenDepth" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flattenDepth">; -} - -declare module "lodash/fromPairs" { - declare module.exports: $PropertyType<$Exports<"lodash">, "fromPairs">; -} - -declare module "lodash/head" { - declare module.exports: $PropertyType<$Exports<"lodash">, "head">; -} - -declare module "lodash/indexOf" { - declare module.exports: $PropertyType<$Exports<"lodash">, "indexOf">; -} - -declare module "lodash/initial" { - declare module.exports: $PropertyType<$Exports<"lodash">, "initial">; -} - -declare module "lodash/intersection" { - declare module.exports: $PropertyType<$Exports<"lodash">, "intersection">; -} - -declare module "lodash/intersectionBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "intersectionBy">; -} - -declare module "lodash/intersectionWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "intersectionWith">; -} - -declare module "lodash/join" { - declare module.exports: $PropertyType<$Exports<"lodash">, "join">; -} - -declare module "lodash/last" { - declare module.exports: $PropertyType<$Exports<"lodash">, "last">; -} - -declare module "lodash/lastIndexOf" { - declare module.exports: $PropertyType<$Exports<"lodash">, "lastIndexOf">; -} - -declare module "lodash/nth" { - declare module.exports: $PropertyType<$Exports<"lodash">, "nth">; -} - -declare module "lodash/pull" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pull">; -} - -declare module "lodash/pullAll" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pullAll">; -} - -declare module "lodash/pullAllBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pullAllBy">; -} - -declare module "lodash/pullAllWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pullAllWith">; -} - -declare module "lodash/pullAt" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pullAt">; -} - -declare module "lodash/remove" { - declare module.exports: $PropertyType<$Exports<"lodash">, "remove">; -} - -declare module "lodash/reverse" { - declare module.exports: $PropertyType<$Exports<"lodash">, "reverse">; -} - -declare module "lodash/slice" { - declare module.exports: $PropertyType<$Exports<"lodash">, "slice">; -} - -declare module "lodash/sortedIndex" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sortedIndex">; -} - -declare module "lodash/sortedIndexBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sortedIndexBy">; -} - -declare module "lodash/sortedIndexOf" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sortedIndexOf">; -} - -declare module "lodash/sortedLastIndex" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sortedLastIndex">; -} - -declare module "lodash/sortedLastIndexBy" { - declare module.exports: $PropertyType< - $Exports<"lodash">, - "sortedLastIndexBy" - >; -} - -declare module "lodash/sortedLastIndexOf" { - declare module.exports: $PropertyType< - $Exports<"lodash">, - "sortedLastIndexOf" - >; -} - -declare module "lodash/sortedUniq" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sortedUniq">; -} - -declare module "lodash/sortedUniqBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sortedUniqBy">; -} - -declare module "lodash/tail" { - declare module.exports: $PropertyType<$Exports<"lodash">, "tail">; -} - -declare module "lodash/take" { - declare module.exports: $PropertyType<$Exports<"lodash">, "take">; -} - -declare module "lodash/takeRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "takeRight">; -} - -declare module "lodash/takeRightWhile" { - declare module.exports: $PropertyType<$Exports<"lodash">, "takeRightWhile">; -} - -declare module "lodash/takeWhile" { - declare module.exports: $PropertyType<$Exports<"lodash">, "takeWhile">; -} - -declare module "lodash/union" { - declare module.exports: $PropertyType<$Exports<"lodash">, "union">; -} - -declare module "lodash/unionBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "unionBy">; -} - -declare module "lodash/unionWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "unionWith">; -} - -declare module "lodash/uniq" { - declare module.exports: $PropertyType<$Exports<"lodash">, "uniq">; -} - -declare module "lodash/uniqBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "uniqBy">; -} - -declare module "lodash/uniqWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "uniqWith">; -} - -declare module "lodash/unzip" { - declare module.exports: $PropertyType<$Exports<"lodash">, "unzip">; -} - -declare module "lodash/unzipWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "unzipWith">; -} - -declare module "lodash/without" { - declare module.exports: $PropertyType<$Exports<"lodash">, "without">; -} - -declare module "lodash/xor" { - declare module.exports: $PropertyType<$Exports<"lodash">, "xor">; -} - -declare module "lodash/xorBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "xorBy">; -} - -declare module "lodash/xorWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "xorWith">; -} - -declare module "lodash/zip" { - declare module.exports: $PropertyType<$Exports<"lodash">, "zip">; -} - -declare module "lodash/zipObject" { - declare module.exports: $PropertyType<$Exports<"lodash">, "zipObject">; -} - -declare module "lodash/zipObjectDeep" { - declare module.exports: $PropertyType<$Exports<"lodash">, "zipObjectDeep">; -} - -declare module "lodash/zipWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "zipWith">; -} - -declare module "lodash/countBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "countBy">; -} - -declare module "lodash/each" { - declare module.exports: $PropertyType<$Exports<"lodash">, "each">; -} - -declare module "lodash/eachRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "eachRight">; -} - -declare module "lodash/every" { - declare module.exports: $PropertyType<$Exports<"lodash">, "every">; -} - -declare module "lodash/filter" { - declare module.exports: $PropertyType<$Exports<"lodash">, "filter">; -} - -declare module "lodash/find" { - declare module.exports: $PropertyType<$Exports<"lodash">, "find">; -} - -declare module "lodash/findLast" { - declare module.exports: $PropertyType<$Exports<"lodash">, "findLast">; -} - -declare module "lodash/flatMap" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flatMap">; -} - -declare module "lodash/flatMapDeep" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flatMapDeep">; -} - -declare module "lodash/flatMapDepth" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flatMapDepth">; -} - -declare module "lodash/forEach" { - declare module.exports: $PropertyType<$Exports<"lodash">, "forEach">; -} - -declare module "lodash/forEachRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "forEachRight">; -} - -declare module "lodash/groupBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "groupBy">; -} - -declare module "lodash/includes" { - declare module.exports: $PropertyType<$Exports<"lodash">, "includes">; -} - -declare module "lodash/invokeMap" { - declare module.exports: $PropertyType<$Exports<"lodash">, "invokeMap">; -} - -declare module "lodash/keyBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "keyBy">; -} - -declare module "lodash/map" { - declare module.exports: $PropertyType<$Exports<"lodash">, "map">; -} - -declare module "lodash/orderBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "orderBy">; -} - -declare module "lodash/partition" { - declare module.exports: $PropertyType<$Exports<"lodash">, "partition">; -} - -declare module "lodash/reduce" { - declare module.exports: $PropertyType<$Exports<"lodash">, "reduce">; -} - -declare module "lodash/reduceRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "reduceRight">; -} - -declare module "lodash/reject" { - declare module.exports: $PropertyType<$Exports<"lodash">, "reject">; -} - -declare module "lodash/sample" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sample">; -} - -declare module "lodash/sampleSize" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sampleSize">; -} - -declare module "lodash/shuffle" { - declare module.exports: $PropertyType<$Exports<"lodash">, "shuffle">; -} - -declare module "lodash/size" { - declare module.exports: $PropertyType<$Exports<"lodash">, "size">; -} - -declare module "lodash/some" { - declare module.exports: $PropertyType<$Exports<"lodash">, "some">; -} - -declare module "lodash/sortBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sortBy">; -} - -declare module "lodash/now" { - declare module.exports: $PropertyType<$Exports<"lodash">, "now">; -} - -declare module "lodash/after" { - declare module.exports: $PropertyType<$Exports<"lodash">, "after">; -} - -declare module "lodash/ary" { - declare module.exports: $PropertyType<$Exports<"lodash">, "ary">; -} - -declare module "lodash/before" { - declare module.exports: $PropertyType<$Exports<"lodash">, "before">; -} - -declare module "lodash/bind" { - declare module.exports: $PropertyType<$Exports<"lodash">, "bind">; -} - -declare module "lodash/bindKey" { - declare module.exports: $PropertyType<$Exports<"lodash">, "bindKey">; -} - -declare module "lodash/curry" { - declare module.exports: $PropertyType<$Exports<"lodash">, "curry">; -} - -declare module "lodash/curryRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "curryRight">; -} - -declare module "lodash/debounce" { - declare module.exports: $PropertyType<$Exports<"lodash">, "debounce">; -} - -declare module "lodash/defer" { - declare module.exports: $PropertyType<$Exports<"lodash">, "defer">; -} - -declare module "lodash/delay" { - declare module.exports: $PropertyType<$Exports<"lodash">, "delay">; -} - -declare module "lodash/flip" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flip">; -} - -declare module "lodash/memoize" { - declare module.exports: $PropertyType<$Exports<"lodash">, "memoize">; -} - -declare module "lodash/negate" { - declare module.exports: $PropertyType<$Exports<"lodash">, "negate">; -} - -declare module "lodash/once" { - declare module.exports: $PropertyType<$Exports<"lodash">, "once">; -} - -declare module "lodash/overArgs" { - declare module.exports: $PropertyType<$Exports<"lodash">, "overArgs">; -} - -declare module "lodash/partial" { - declare module.exports: $PropertyType<$Exports<"lodash">, "partial">; -} - -declare module "lodash/partialRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "partialRight">; -} - -declare module "lodash/rearg" { - declare module.exports: $PropertyType<$Exports<"lodash">, "rearg">; -} - -declare module "lodash/rest" { - declare module.exports: $PropertyType<$Exports<"lodash">, "rest">; -} - -declare module "lodash/spread" { - declare module.exports: $PropertyType<$Exports<"lodash">, "spread">; -} - -declare module "lodash/throttle" { - declare module.exports: $PropertyType<$Exports<"lodash">, "throttle">; -} - -declare module "lodash/unary" { - declare module.exports: $PropertyType<$Exports<"lodash">, "unary">; -} - -declare module "lodash/wrap" { - declare module.exports: $PropertyType<$Exports<"lodash">, "wrap">; -} - -declare module "lodash/castArray" { - declare module.exports: $PropertyType<$Exports<"lodash">, "castArray">; -} - -declare module "lodash/clone" { - declare module.exports: $PropertyType<$Exports<"lodash">, "clone">; -} - -declare module "lodash/cloneDeep" { - declare module.exports: $PropertyType<$Exports<"lodash">, "cloneDeep">; -} - -declare module "lodash/cloneDeepWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "cloneDeepWith">; -} - -declare module "lodash/cloneWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "cloneWith">; -} - -declare module "lodash/conformsTo" { - declare module.exports: $PropertyType<$Exports<"lodash">, "conformsTo">; -} - -declare module "lodash/eq" { - declare module.exports: $PropertyType<$Exports<"lodash">, "eq">; -} - -declare module "lodash/gt" { - declare module.exports: $PropertyType<$Exports<"lodash">, "gt">; -} - -declare module "lodash/gte" { - declare module.exports: $PropertyType<$Exports<"lodash">, "gte">; -} - -declare module "lodash/isArguments" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isArguments">; -} - -declare module "lodash/isArray" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isArray">; -} - -declare module "lodash/isArrayBuffer" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isArrayBuffer">; -} - -declare module "lodash/isArrayLike" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isArrayLike">; -} - -declare module "lodash/isArrayLikeObject" { - declare module.exports: $PropertyType< - $Exports<"lodash">, - "isArrayLikeObject" - >; -} - -declare module "lodash/isBoolean" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isBoolean">; -} - -declare module "lodash/isBuffer" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isBuffer">; -} - -declare module "lodash/isDate" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isDate">; -} - -declare module "lodash/isElement" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isElement">; -} - -declare module "lodash/isEmpty" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isEmpty">; -} - -declare module "lodash/isEqual" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isEqual">; -} - -declare module "lodash/isEqualWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isEqualWith">; -} - -declare module "lodash/isError" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isError">; -} - -declare module "lodash/isFinite" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isFinite">; -} - -declare module "lodash/isFunction" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isFunction">; -} - -declare module "lodash/isInteger" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isInteger">; -} - -declare module "lodash/isLength" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isLength">; -} - -declare module "lodash/isMap" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isMap">; -} - -declare module "lodash/isMatch" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isMatch">; -} - -declare module "lodash/isMatchWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isMatchWith">; -} - -declare module "lodash/isNaN" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isNaN">; -} - -declare module "lodash/isNative" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isNative">; -} - -declare module "lodash/isNil" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isNil">; -} - -declare module "lodash/isNull" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isNull">; -} - -declare module "lodash/isNumber" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isNumber">; -} - -declare module "lodash/isObject" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isObject">; -} - -declare module "lodash/isObjectLike" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isObjectLike">; -} - -declare module "lodash/isPlainObject" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isPlainObject">; -} - -declare module "lodash/isRegExp" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isRegExp">; -} - -declare module "lodash/isSafeInteger" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isSafeInteger">; -} - -declare module "lodash/isSet" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isSet">; -} - -declare module "lodash/isString" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isString">; -} - -declare module "lodash/isSymbol" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isSymbol">; -} - -declare module "lodash/isTypedArray" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isTypedArray">; -} - -declare module "lodash/isUndefined" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isUndefined">; -} - -declare module "lodash/isWeakMap" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isWeakMap">; -} - -declare module "lodash/isWeakSet" { - declare module.exports: $PropertyType<$Exports<"lodash">, "isWeakSet">; -} - -declare module "lodash/lt" { - declare module.exports: $PropertyType<$Exports<"lodash">, "lt">; -} - -declare module "lodash/lte" { - declare module.exports: $PropertyType<$Exports<"lodash">, "lte">; -} - -declare module "lodash/toArray" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toArray">; -} - -declare module "lodash/toFinite" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toFinite">; -} - -declare module "lodash/toInteger" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toInteger">; -} - -declare module "lodash/toLength" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toLength">; -} - -declare module "lodash/toNumber" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toNumber">; -} - -declare module "lodash/toPlainObject" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toPlainObject">; -} - -declare module "lodash/toSafeInteger" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toSafeInteger">; -} - -declare module "lodash/toString" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toString">; -} - -declare module "lodash/add" { - declare module.exports: $PropertyType<$Exports<"lodash">, "add">; -} - -declare module "lodash/ceil" { - declare module.exports: $PropertyType<$Exports<"lodash">, "ceil">; -} - -declare module "lodash/divide" { - declare module.exports: $PropertyType<$Exports<"lodash">, "divide">; -} - -declare module "lodash/floor" { - declare module.exports: $PropertyType<$Exports<"lodash">, "floor">; -} - -declare module "lodash/max" { - declare module.exports: $PropertyType<$Exports<"lodash">, "max">; -} - -declare module "lodash/maxBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "maxBy">; -} - -declare module "lodash/mean" { - declare module.exports: $PropertyType<$Exports<"lodash">, "mean">; -} - -declare module "lodash/meanBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "meanBy">; -} - -declare module "lodash/min" { - declare module.exports: $PropertyType<$Exports<"lodash">, "min">; -} - -declare module "lodash/minBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "minBy">; -} - -declare module "lodash/multiply" { - declare module.exports: $PropertyType<$Exports<"lodash">, "multiply">; -} - -declare module "lodash/round" { - declare module.exports: $PropertyType<$Exports<"lodash">, "round">; -} - -declare module "lodash/subtract" { - declare module.exports: $PropertyType<$Exports<"lodash">, "subtract">; -} - -declare module "lodash/sum" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sum">; -} - -declare module "lodash/sumBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "sumBy">; -} - -declare module "lodash/clamp" { - declare module.exports: $PropertyType<$Exports<"lodash">, "clamp">; -} - -declare module "lodash/inRange" { - declare module.exports: $PropertyType<$Exports<"lodash">, "inRange">; -} - -declare module "lodash/random" { - declare module.exports: $PropertyType<$Exports<"lodash">, "random">; -} - -declare module "lodash/assign" { - declare module.exports: $PropertyType<$Exports<"lodash">, "assign">; -} - -declare module "lodash/assignIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "assignIn">; -} - -declare module "lodash/assignInWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "assignInWith">; -} - -declare module "lodash/assignWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "assignWith">; -} - -declare module "lodash/at" { - declare module.exports: $PropertyType<$Exports<"lodash">, "at">; -} - -declare module "lodash/create" { - declare module.exports: $PropertyType<$Exports<"lodash">, "create">; -} - -declare module "lodash/defaults" { - declare module.exports: $PropertyType<$Exports<"lodash">, "defaults">; -} - -declare module "lodash/defaultsDeep" { - declare module.exports: $PropertyType<$Exports<"lodash">, "defaultsDeep">; -} - -declare module "lodash/entries" { - declare module.exports: $PropertyType<$Exports<"lodash">, "entries">; -} - -declare module "lodash/entriesIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "entriesIn">; -} - -declare module "lodash/extend" { - declare module.exports: $PropertyType<$Exports<"lodash">, "extend">; -} - -declare module "lodash/extendWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "extendWith">; -} - -declare module "lodash/findKey" { - declare module.exports: $PropertyType<$Exports<"lodash">, "findKey">; -} - -declare module "lodash/findLastKey" { - declare module.exports: $PropertyType<$Exports<"lodash">, "findLastKey">; -} - -declare module "lodash/forIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "forIn">; -} - -declare module "lodash/forInRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "forInRight">; -} - -declare module "lodash/forOwn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "forOwn">; -} - -declare module "lodash/forOwnRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "forOwnRight">; -} - -declare module "lodash/functions" { - declare module.exports: $PropertyType<$Exports<"lodash">, "functions">; -} - -declare module "lodash/functionsIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "functionsIn">; -} - -declare module "lodash/get" { - declare module.exports: $PropertyType<$Exports<"lodash">, "get">; -} - -declare module "lodash/has" { - declare module.exports: $PropertyType<$Exports<"lodash">, "has">; -} - -declare module "lodash/hasIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "hasIn">; -} - -declare module "lodash/invert" { - declare module.exports: $PropertyType<$Exports<"lodash">, "invert">; -} - -declare module "lodash/invertBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "invertBy">; -} - -declare module "lodash/invoke" { - declare module.exports: $PropertyType<$Exports<"lodash">, "invoke">; -} - -declare module "lodash/keys" { - declare module.exports: $PropertyType<$Exports<"lodash">, "keys">; -} - -declare module "lodash/keysIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "keysIn">; -} - -declare module "lodash/mapKeys" { - declare module.exports: $PropertyType<$Exports<"lodash">, "mapKeys">; -} - -declare module "lodash/mapValues" { - declare module.exports: $PropertyType<$Exports<"lodash">, "mapValues">; -} - -declare module "lodash/merge" { - declare module.exports: $PropertyType<$Exports<"lodash">, "merge">; -} - -declare module "lodash/mergeWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "mergeWith">; -} - -declare module "lodash/omit" { - declare module.exports: $PropertyType<$Exports<"lodash">, "omit">; -} - -declare module "lodash/omitBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "omitBy">; -} - -declare module "lodash/pick" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pick">; -} - -declare module "lodash/pickBy" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pickBy">; -} - -declare module "lodash/result" { - declare module.exports: $PropertyType<$Exports<"lodash">, "result">; -} - -declare module "lodash/set" { - declare module.exports: $PropertyType<$Exports<"lodash">, "set">; -} - -declare module "lodash/setWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "setWith">; -} - -declare module "lodash/toPairs" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toPairs">; -} - -declare module "lodash/toPairsIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toPairsIn">; -} - -declare module "lodash/transform" { - declare module.exports: $PropertyType<$Exports<"lodash">, "transform">; -} - -declare module "lodash/unset" { - declare module.exports: $PropertyType<$Exports<"lodash">, "unset">; -} - -declare module "lodash/update" { - declare module.exports: $PropertyType<$Exports<"lodash">, "update">; -} - -declare module "lodash/updateWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "updateWith">; -} - -declare module "lodash/values" { - declare module.exports: $PropertyType<$Exports<"lodash">, "values">; -} - -declare module "lodash/valuesIn" { - declare module.exports: $PropertyType<$Exports<"lodash">, "valuesIn">; -} - -declare module "lodash/chain" { - declare module.exports: $PropertyType<$Exports<"lodash">, "chain">; -} - -declare module "lodash/tap" { - declare module.exports: $PropertyType<$Exports<"lodash">, "tap">; -} - -declare module "lodash/thru" { - declare module.exports: $PropertyType<$Exports<"lodash">, "thru">; -} - -declare module "lodash/camelCase" { - declare module.exports: $PropertyType<$Exports<"lodash">, "camelCase">; -} - -declare module "lodash/capitalize" { - declare module.exports: $PropertyType<$Exports<"lodash">, "capitalize">; -} - -declare module "lodash/deburr" { - declare module.exports: $PropertyType<$Exports<"lodash">, "deburr">; -} - -declare module "lodash/endsWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "endsWith">; -} - -declare module "lodash/escape" { - declare module.exports: $PropertyType<$Exports<"lodash">, "escape">; -} - -declare module "lodash/escapeRegExp" { - declare module.exports: $PropertyType<$Exports<"lodash">, "escapeRegExp">; -} - -declare module "lodash/kebabCase" { - declare module.exports: $PropertyType<$Exports<"lodash">, "kebabCase">; -} - -declare module "lodash/lowerCase" { - declare module.exports: $PropertyType<$Exports<"lodash">, "lowerCase">; -} - -declare module "lodash/lowerFirst" { - declare module.exports: $PropertyType<$Exports<"lodash">, "lowerFirst">; -} - -declare module "lodash/pad" { - declare module.exports: $PropertyType<$Exports<"lodash">, "pad">; -} - -declare module "lodash/padEnd" { - declare module.exports: $PropertyType<$Exports<"lodash">, "padEnd">; -} - -declare module "lodash/padStart" { - declare module.exports: $PropertyType<$Exports<"lodash">, "padStart">; -} - -declare module "lodash/parseInt" { - declare module.exports: $PropertyType<$Exports<"lodash">, "parseInt">; -} - -declare module "lodash/repeat" { - declare module.exports: $PropertyType<$Exports<"lodash">, "repeat">; -} - -declare module "lodash/replace" { - declare module.exports: $PropertyType<$Exports<"lodash">, "replace">; -} - -declare module "lodash/snakeCase" { - declare module.exports: $PropertyType<$Exports<"lodash">, "snakeCase">; -} - -declare module "lodash/split" { - declare module.exports: $PropertyType<$Exports<"lodash">, "split">; -} - -declare module "lodash/startCase" { - declare module.exports: $PropertyType<$Exports<"lodash">, "startCase">; -} - -declare module "lodash/startsWith" { - declare module.exports: $PropertyType<$Exports<"lodash">, "startsWith">; -} - -declare module "lodash/template" { - declare module.exports: $PropertyType<$Exports<"lodash">, "template">; -} - -declare module "lodash/toLower" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toLower">; -} - -declare module "lodash/toUpper" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toUpper">; -} - -declare module "lodash/trim" { - declare module.exports: $PropertyType<$Exports<"lodash">, "trim">; -} - -declare module "lodash/trimEnd" { - declare module.exports: $PropertyType<$Exports<"lodash">, "trimEnd">; -} - -declare module "lodash/trimStart" { - declare module.exports: $PropertyType<$Exports<"lodash">, "trimStart">; -} - -declare module "lodash/truncate" { - declare module.exports: $PropertyType<$Exports<"lodash">, "truncate">; -} - -declare module "lodash/unescape" { - declare module.exports: $PropertyType<$Exports<"lodash">, "unescape">; -} - -declare module "lodash/upperCase" { - declare module.exports: $PropertyType<$Exports<"lodash">, "upperCase">; -} - -declare module "lodash/upperFirst" { - declare module.exports: $PropertyType<$Exports<"lodash">, "upperFirst">; -} - -declare module "lodash/words" { - declare module.exports: $PropertyType<$Exports<"lodash">, "words">; -} - -declare module "lodash/attempt" { - declare module.exports: $PropertyType<$Exports<"lodash">, "attempt">; -} - -declare module "lodash/bindAll" { - declare module.exports: $PropertyType<$Exports<"lodash">, "bindAll">; -} - -declare module "lodash/cond" { - declare module.exports: $PropertyType<$Exports<"lodash">, "cond">; -} - -declare module "lodash/conforms" { - declare module.exports: $PropertyType<$Exports<"lodash">, "conforms">; -} - -declare module "lodash/constant" { - declare module.exports: $PropertyType<$Exports<"lodash">, "constant">; -} - -declare module "lodash/defaultTo" { - declare module.exports: $PropertyType<$Exports<"lodash">, "defaultTo">; -} - -declare module "lodash/flow" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flow">; -} - -declare module "lodash/flowRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "flowRight">; -} - -declare module "lodash/identity" { - declare module.exports: $PropertyType<$Exports<"lodash">, "identity">; -} - -declare module "lodash/iteratee" { - declare module.exports: $PropertyType<$Exports<"lodash">, "iteratee">; -} - -declare module "lodash/matches" { - declare module.exports: $PropertyType<$Exports<"lodash">, "matches">; -} - -declare module "lodash/matchesProperty" { - declare module.exports: $PropertyType<$Exports<"lodash">, "matchesProperty">; -} - -declare module "lodash/method" { - declare module.exports: $PropertyType<$Exports<"lodash">, "method">; -} - -declare module "lodash/methodOf" { - declare module.exports: $PropertyType<$Exports<"lodash">, "methodOf">; -} - -declare module "lodash/mixin" { - declare module.exports: $PropertyType<$Exports<"lodash">, "mixin">; -} - -declare module "lodash/noConflict" { - declare module.exports: $PropertyType<$Exports<"lodash">, "noConflict">; -} - -declare module "lodash/noop" { - declare module.exports: $PropertyType<$Exports<"lodash">, "noop">; -} - -declare module "lodash/nthArg" { - declare module.exports: $PropertyType<$Exports<"lodash">, "nthArg">; -} - -declare module "lodash/over" { - declare module.exports: $PropertyType<$Exports<"lodash">, "over">; -} - -declare module "lodash/overEvery" { - declare module.exports: $PropertyType<$Exports<"lodash">, "overEvery">; -} - -declare module "lodash/overSome" { - declare module.exports: $PropertyType<$Exports<"lodash">, "overSome">; -} - -declare module "lodash/property" { - declare module.exports: $PropertyType<$Exports<"lodash">, "property">; -} - -declare module "lodash/propertyOf" { - declare module.exports: $PropertyType<$Exports<"lodash">, "propertyOf">; -} - -declare module "lodash/range" { - declare module.exports: $PropertyType<$Exports<"lodash">, "range">; -} - -declare module "lodash/rangeRight" { - declare module.exports: $PropertyType<$Exports<"lodash">, "rangeRight">; -} - -declare module "lodash/runInContext" { - declare module.exports: $PropertyType<$Exports<"lodash">, "runInContext">; -} - -declare module "lodash/stubArray" { - declare module.exports: $PropertyType<$Exports<"lodash">, "stubArray">; -} - -declare module "lodash/stubFalse" { - declare module.exports: $PropertyType<$Exports<"lodash">, "stubFalse">; -} - -declare module "lodash/stubObject" { - declare module.exports: $PropertyType<$Exports<"lodash">, "stubObject">; -} - -declare module "lodash/stubString" { - declare module.exports: $PropertyType<$Exports<"lodash">, "stubString">; -} - -declare module "lodash/stubTrue" { - declare module.exports: $PropertyType<$Exports<"lodash">, "stubTrue">; -} - -declare module "lodash/times" { - declare module.exports: $PropertyType<$Exports<"lodash">, "times">; -} - -declare module "lodash/toPath" { - declare module.exports: $PropertyType<$Exports<"lodash">, "toPath">; -} - -declare module "lodash/uniqueId" { - declare module.exports: $PropertyType<$Exports<"lodash">, "uniqueId">; -} - -declare module "lodash/fp/chunk" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "chunk">; -} - -declare module "lodash/fp/compact" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "compact">; -} - -declare module "lodash/fp/concat" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "concat">; -} - -declare module "lodash/fp/difference" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "difference">; -} - -declare module "lodash/fp/differenceBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "differenceBy">; -} - -declare module "lodash/fp/differenceWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "differenceWith">; -} - -declare module "lodash/fp/drop" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "drop">; -} - -declare module "lodash/fp/dropLast" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "dropLast">; -} - -declare module "lodash/fp/dropRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "dropRight">; -} - -declare module "lodash/fp/dropRightWhile" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "dropRightWhile">; -} - -declare module "lodash/fp/dropWhile" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "dropWhile">; -} - -declare module "lodash/fp/dropLastWhile" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "dropLastWhile">; -} - -declare module "lodash/fp/fill" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "fill">; -} - -declare module "lodash/fp/findIndex" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findIndex">; -} - -declare module "lodash/fp/findIndexFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findIndexFrom">; -} - -declare module "lodash/fp/findLastIndex" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findLastIndex">; -} - -declare module "lodash/fp/findLastIndexFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findLastIndexFrom">; -} - -declare module "lodash/fp/first" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "first">; -} - -declare module "lodash/fp/flatten" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flatten">; -} - -declare module "lodash/fp/unnest" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unnest">; -} - -declare module "lodash/fp/flattenDeep" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flattenDeep">; -} - -declare module "lodash/fp/flattenDepth" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flattenDepth">; -} - -declare module "lodash/fp/fromPairs" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "fromPairs">; -} - -declare module "lodash/fp/head" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "head">; -} - -declare module "lodash/fp/indexOf" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "indexOf">; -} - -declare module "lodash/fp/indexOfFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "indexOfFrom">; -} - -declare module "lodash/fp/initial" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "initial">; -} - -declare module "lodash/fp/init" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "init">; -} - -declare module "lodash/fp/intersection" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "intersection">; -} - -declare module "lodash/fp/intersectionBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "intersectionBy">; -} - -declare module "lodash/fp/intersectionWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "intersectionWith">; -} - -declare module "lodash/fp/join" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "join">; -} - -declare module "lodash/fp/last" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "last">; -} - -declare module "lodash/fp/lastIndexOf" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "lastIndexOf">; -} - -declare module "lodash/fp/lastIndexOfFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "lastIndexOfFrom">; -} - -declare module "lodash/fp/nth" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "nth">; -} - -declare module "lodash/fp/pull" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pull">; -} - -declare module "lodash/fp/pullAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pullAll">; -} - -declare module "lodash/fp/pullAllBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pullAllBy">; -} - -declare module "lodash/fp/pullAllWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pullAllWith">; -} - -declare module "lodash/fp/pullAt" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pullAt">; -} - -declare module "lodash/fp/remove" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "remove">; -} - -declare module "lodash/fp/reverse" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "reverse">; -} - -declare module "lodash/fp/slice" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "slice">; -} - -declare module "lodash/fp/sortedIndex" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedIndex">; -} - -declare module "lodash/fp/sortedIndexBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedIndexBy">; -} - -declare module "lodash/fp/sortedIndexOf" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedIndexOf">; -} - -declare module "lodash/fp/sortedLastIndex" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedLastIndex">; -} - -declare module "lodash/fp/sortedLastIndexBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedLastIndexBy">; -} - -declare module "lodash/fp/sortedLastIndexOf" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedLastIndexOf">; -} - -declare module "lodash/fp/sortedUniq" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedUniq">; -} - -declare module "lodash/fp/sortedUniqBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortedUniqBy">; -} - -declare module "lodash/fp/tail" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "tail">; -} - -declare module "lodash/fp/take" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "take">; -} - -declare module "lodash/fp/takeRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "takeRight">; -} - -declare module "lodash/fp/takeLast" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "takeLast">; -} - -declare module "lodash/fp/takeRightWhile" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "takeRightWhile">; -} - -declare module "lodash/fp/takeLastWhile" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "takeLastWhile">; -} - -declare module "lodash/fp/takeWhile" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "takeWhile">; -} - -declare module "lodash/fp/union" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "union">; -} - -declare module "lodash/fp/unionBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unionBy">; -} - -declare module "lodash/fp/unionWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unionWith">; -} - -declare module "lodash/fp/uniq" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "uniq">; -} - -declare module "lodash/fp/uniqBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "uniqBy">; -} - -declare module "lodash/fp/uniqWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "uniqWith">; -} - -declare module "lodash/fp/unzip" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unzip">; -} - -declare module "lodash/fp/unzipWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unzipWith">; -} - -declare module "lodash/fp/without" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "without">; -} - -declare module "lodash/fp/xor" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "xor">; -} - -declare module "lodash/fp/symmetricDifference" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "symmetricDifference">; -} - -declare module "lodash/fp/xorBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "xorBy">; -} - -declare module "lodash/fp/symmetricDifferenceBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "symmetricDifferenceBy">; -} - -declare module "lodash/fp/xorWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "xorWith">; -} - -declare module "lodash/fp/symmetricDifferenceWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "symmetricDifferenceWith">; -} - -declare module "lodash/fp/zip" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "zip">; -} - -declare module "lodash/fp/zipAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "zipAll">; -} - -declare module "lodash/fp/zipObject" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "zipObject">; -} - -declare module "lodash/fp/zipObj" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "zipObj">; -} - -declare module "lodash/fp/zipObjectDeep" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "zipObjectDeep">; -} - -declare module "lodash/fp/zipWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "zipWith">; -} - -declare module "lodash/fp/countBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "countBy">; -} - -declare module "lodash/fp/each" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "each">; -} - -declare module "lodash/fp/eachRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "eachRight">; -} - -declare module "lodash/fp/every" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "every">; -} - -declare module "lodash/fp/all" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "all">; -} - -declare module "lodash/fp/filter" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "filter">; -} - -declare module "lodash/fp/find" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "find">; -} - -declare module "lodash/fp/findFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findFrom">; -} - -declare module "lodash/fp/findLast" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findLast">; -} - -declare module "lodash/fp/findLastFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findLastFrom">; -} - -declare module "lodash/fp/flatMap" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flatMap">; -} - -declare module "lodash/fp/flatMapDeep" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flatMapDeep">; -} - -declare module "lodash/fp/flatMapDepth" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flatMapDepth">; -} - -declare module "lodash/fp/forEach" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "forEach">; -} - -declare module "lodash/fp/forEachRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "forEachRight">; -} - -declare module "lodash/fp/groupBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "groupBy">; -} - -declare module "lodash/fp/includes" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "includes">; -} - -declare module "lodash/fp/contains" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "contains">; -} - -declare module "lodash/fp/includesFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "includesFrom">; -} - -declare module "lodash/fp/invokeMap" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "invokeMap">; -} - -declare module "lodash/fp/invokeArgsMap" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "invokeArgsMap">; -} - -declare module "lodash/fp/keyBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "keyBy">; -} - -declare module "lodash/fp/indexBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "indexBy">; -} - -declare module "lodash/fp/map" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "map">; -} - -declare module "lodash/fp/pluck" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pluck">; -} - -declare module "lodash/fp/orderBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "orderBy">; -} - -declare module "lodash/fp/partition" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "partition">; -} - -declare module "lodash/fp/reduce" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "reduce">; -} - -declare module "lodash/fp/reduceRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "reduceRight">; -} - -declare module "lodash/fp/reject" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "reject">; -} - -declare module "lodash/fp/sample" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sample">; -} - -declare module "lodash/fp/sampleSize" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sampleSize">; -} - -declare module "lodash/fp/shuffle" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "shuffle">; -} - -declare module "lodash/fp/size" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "size">; -} - -declare module "lodash/fp/some" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "some">; -} - -declare module "lodash/fp/any" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "any">; -} - -declare module "lodash/fp/sortBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sortBy">; -} - -declare module "lodash/fp/now" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "now">; -} - -declare module "lodash/fp/after" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "after">; -} - -declare module "lodash/fp/ary" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "ary">; -} - -declare module "lodash/fp/nAry" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "nAry">; -} - -declare module "lodash/fp/before" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "before">; -} - -declare module "lodash/fp/bind" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "bind">; -} - -declare module "lodash/fp/bindKey" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "bindKey">; -} - -declare module "lodash/fp/curry" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "curry">; -} - -declare module "lodash/fp/curryN" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "curryN">; -} - -declare module "lodash/fp/curryRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "curryRight">; -} - -declare module "lodash/fp/curryRightN" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "curryRightN">; -} - -declare module "lodash/fp/debounce" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "debounce">; -} - -declare module "lodash/fp/defer" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "defer">; -} - -declare module "lodash/fp/delay" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "delay">; -} - -declare module "lodash/fp/flip" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flip">; -} - -declare module "lodash/fp/memoize" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "memoize">; -} - -declare module "lodash/fp/negate" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "negate">; -} - -declare module "lodash/fp/complement" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "complement">; -} - -declare module "lodash/fp/once" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "once">; -} - -declare module "lodash/fp/overArgs" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "overArgs">; -} - -declare module "lodash/fp/useWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "useWith">; -} - -declare module "lodash/fp/partial" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "partial">; -} - -declare module "lodash/fp/partialRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "partialRight">; -} - -declare module "lodash/fp/rearg" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "rearg">; -} - -declare module "lodash/fp/rest" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "rest">; -} - -declare module "lodash/fp/unapply" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unapply">; -} - -declare module "lodash/fp/restFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "restFrom">; -} - -declare module "lodash/fp/spread" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "spread">; -} - -declare module "lodash/fp/apply" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "apply">; -} - -declare module "lodash/fp/spreadFrom" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "spreadFrom">; -} - -declare module "lodash/fp/throttle" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "throttle">; -} - -declare module "lodash/fp/unary" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unary">; -} - -declare module "lodash/fp/wrap" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "wrap">; -} - -declare module "lodash/fp/castArray" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "castArray">; -} - -declare module "lodash/fp/clone" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "clone">; -} - -declare module "lodash/fp/cloneDeep" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "cloneDeep">; -} - -declare module "lodash/fp/cloneDeepWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "cloneDeepWith">; -} - -declare module "lodash/fp/cloneWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "cloneWith">; -} - -declare module "lodash/fp/conformsTo" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "conformsTo">; -} - -declare module "lodash/fp/where" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "where">; -} - -declare module "lodash/fp/conforms" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "conforms">; -} - -declare module "lodash/fp/eq" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "eq">; -} - -declare module "lodash/fp/identical" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "identical">; -} - -declare module "lodash/fp/gt" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "gt">; -} - -declare module "lodash/fp/gte" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "gte">; -} - -declare module "lodash/fp/isArguments" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isArguments">; -} - -declare module "lodash/fp/isArray" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isArray">; -} - -declare module "lodash/fp/isArrayBuffer" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isArrayBuffer">; -} - -declare module "lodash/fp/isArrayLike" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isArrayLike">; -} - -declare module "lodash/fp/isArrayLikeObject" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isArrayLikeObject">; -} - -declare module "lodash/fp/isBoolean" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isBoolean">; -} - -declare module "lodash/fp/isBuffer" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isBuffer">; -} - -declare module "lodash/fp/isDate" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isDate">; -} - -declare module "lodash/fp/isElement" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isElement">; -} - -declare module "lodash/fp/isEmpty" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isEmpty">; -} - -declare module "lodash/fp/isEqual" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isEqual">; -} - -declare module "lodash/fp/equals" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "equals">; -} - -declare module "lodash/fp/isEqualWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isEqualWith">; -} - -declare module "lodash/fp/isError" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isError">; -} - -declare module "lodash/fp/isFinite" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isFinite">; -} - -declare module "lodash/fp/isFunction" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isFunction">; -} - -declare module "lodash/fp/isInteger" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isInteger">; -} - -declare module "lodash/fp/isLength" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isLength">; -} - -declare module "lodash/fp/isMap" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isMap">; -} - -declare module "lodash/fp/isMatch" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isMatch">; -} - -declare module "lodash/fp/whereEq" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "whereEq">; -} - -declare module "lodash/fp/isMatchWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isMatchWith">; -} - -declare module "lodash/fp/isNaN" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isNaN">; -} - -declare module "lodash/fp/isNative" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isNative">; -} - -declare module "lodash/fp/isNil" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isNil">; -} - -declare module "lodash/fp/isNull" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isNull">; -} - -declare module "lodash/fp/isNumber" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isNumber">; -} - -declare module "lodash/fp/isObject" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isObject">; -} - -declare module "lodash/fp/isObjectLike" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isObjectLike">; -} - -declare module "lodash/fp/isPlainObject" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isPlainObject">; -} - -declare module "lodash/fp/isRegExp" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isRegExp">; -} - -declare module "lodash/fp/isSafeInteger" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isSafeInteger">; -} - -declare module "lodash/fp/isSet" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isSet">; -} - -declare module "lodash/fp/isString" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isString">; -} - -declare module "lodash/fp/isSymbol" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isSymbol">; -} - -declare module "lodash/fp/isTypedArray" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isTypedArray">; -} - -declare module "lodash/fp/isUndefined" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isUndefined">; -} - -declare module "lodash/fp/isWeakMap" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isWeakMap">; -} - -declare module "lodash/fp/isWeakSet" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "isWeakSet">; -} - -declare module "lodash/fp/lt" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "lt">; -} - -declare module "lodash/fp/lte" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "lte">; -} - -declare module "lodash/fp/toArray" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toArray">; -} - -declare module "lodash/fp/toFinite" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toFinite">; -} - -declare module "lodash/fp/toInteger" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toInteger">; -} - -declare module "lodash/fp/toLength" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toLength">; -} - -declare module "lodash/fp/toNumber" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toNumber">; -} - -declare module "lodash/fp/toPlainObject" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toPlainObject">; -} - -declare module "lodash/fp/toSafeInteger" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toSafeInteger">; -} - -declare module "lodash/fp/toString" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toString">; -} - -declare module "lodash/fp/add" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "add">; -} - -declare module "lodash/fp/ceil" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "ceil">; -} - -declare module "lodash/fp/divide" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "divide">; -} - -declare module "lodash/fp/floor" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "floor">; -} - -declare module "lodash/fp/max" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "max">; -} - -declare module "lodash/fp/maxBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "maxBy">; -} - -declare module "lodash/fp/mean" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "mean">; -} - -declare module "lodash/fp/meanBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "meanBy">; -} - -declare module "lodash/fp/min" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "min">; -} - -declare module "lodash/fp/minBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "minBy">; -} - -declare module "lodash/fp/multiply" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "multiply">; -} - -declare module "lodash/fp/round" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "round">; -} - -declare module "lodash/fp/subtract" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "subtract">; -} - -declare module "lodash/fp/sum" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sum">; -} - -declare module "lodash/fp/sumBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "sumBy">; -} - -declare module "lodash/fp/clamp" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "clamp">; -} - -declare module "lodash/fp/inRange" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "inRange">; -} - -declare module "lodash/fp/random" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "random">; -} - -declare module "lodash/fp/assign" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assign">; -} - -declare module "lodash/fp/assignAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assignAll">; -} - -declare module "lodash/fp/assignInAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assignInAll">; -} - -declare module "lodash/fp/extendAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "extendAll">; -} - -declare module "lodash/fp/assignIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assignIn">; -} - -declare module "lodash/fp/assignInWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assignInWith">; -} - -declare module "lodash/fp/assignWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assignWith">; -} - -declare module "lodash/fp/assignInAllWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assignInAllWith">; -} - -declare module "lodash/fp/extendAllWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "extendAllWith">; -} - -declare module "lodash/fp/assignAllWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assignAllWith">; -} - -declare module "lodash/fp/at" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "at">; -} - -declare module "lodash/fp/props" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "props">; -} - -declare module "lodash/fp/paths" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "paths">; -} - -declare module "lodash/fp/create" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "create">; -} - -declare module "lodash/fp/defaults" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "defaults">; -} - -declare module "lodash/fp/defaultsAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "defaultsAll">; -} - -declare module "lodash/fp/defaultsDeep" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "defaultsDeep">; -} - -declare module "lodash/fp/defaultsDeepAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "defaultsDeepAll">; -} - -declare module "lodash/fp/entries" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "entries">; -} - -declare module "lodash/fp/entriesIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "entriesIn">; -} - -declare module "lodash/fp/extend" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "extend">; -} - -declare module "lodash/fp/extendWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "extendWith">; -} - -declare module "lodash/fp/findKey" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findKey">; -} - -declare module "lodash/fp/findLastKey" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "findLastKey">; -} - -declare module "lodash/fp/forIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "forIn">; -} - -declare module "lodash/fp/forInRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "forInRight">; -} - -declare module "lodash/fp/forOwn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "forOwn">; -} - -declare module "lodash/fp/forOwnRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "forOwnRight">; -} - -declare module "lodash/fp/functions" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "functions">; -} - -declare module "lodash/fp/functionsIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "functionsIn">; -} - -declare module "lodash/fp/get" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "get">; -} - -declare module "lodash/fp/prop" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "prop">; -} - -declare module "lodash/fp/path" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "path">; -} - -declare module "lodash/fp/getOr" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "getOr">; -} - -declare module "lodash/fp/propOr" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "propOr">; -} - -declare module "lodash/fp/pathOr" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pathOr">; -} - -declare module "lodash/fp/has" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "has">; -} - -declare module "lodash/fp/hasIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "hasIn">; -} - -declare module "lodash/fp/invert" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "invert">; -} - -declare module "lodash/fp/invertObj" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "invertObj">; -} - -declare module "lodash/fp/invertBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "invertBy">; -} - -declare module "lodash/fp/invoke" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "invoke">; -} - -declare module "lodash/fp/invokeArgs" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "invokeArgs">; -} - -declare module "lodash/fp/keys" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "keys">; -} - -declare module "lodash/fp/keysIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "keysIn">; -} - -declare module "lodash/fp/mapKeys" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "mapKeys">; -} - -declare module "lodash/fp/mapValues" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "mapValues">; -} - -declare module "lodash/fp/merge" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "merge">; -} - -declare module "lodash/fp/mergeAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "mergeAll">; -} - -declare module "lodash/fp/mergeWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "mergeWith">; -} - -declare module "lodash/fp/mergeAllWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "mergeAllWith">; -} - -declare module "lodash/fp/omit" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "omit">; -} - -declare module "lodash/fp/omitAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "omitAll">; -} - -declare module "lodash/fp/omitBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "omitBy">; -} - -declare module "lodash/fp/pick" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pick">; -} - -declare module "lodash/fp/pickAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pickAll">; -} - -declare module "lodash/fp/pickBy" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pickBy">; -} - -declare module "lodash/fp/result" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "result">; -} - -declare module "lodash/fp/set" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "set">; -} - -declare module "lodash/fp/assoc" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assoc">; -} - -declare module "lodash/fp/assocPath" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "assocPath">; -} - -declare module "lodash/fp/setWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "setWith">; -} - -declare module "lodash/fp/toPairs" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toPairs">; -} - -declare module "lodash/fp/toPairsIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toPairsIn">; -} - -declare module "lodash/fp/transform" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "transform">; -} - -declare module "lodash/fp/unset" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unset">; -} - -declare module "lodash/fp/dissoc" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "dissoc">; -} - -declare module "lodash/fp/dissocPath" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "dissocPath">; -} - -declare module "lodash/fp/update" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "update">; -} - -declare module "lodash/fp/updateWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "updateWith">; -} - -declare module "lodash/fp/values" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "values">; -} - -declare module "lodash/fp/valuesIn" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "valuesIn">; -} - -declare module "lodash/fp/tap" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "tap">; -} - -declare module "lodash/fp/thru" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "thru">; -} - -declare module "lodash/fp/camelCase" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "camelCase">; -} - -declare module "lodash/fp/capitalize" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "capitalize">; -} - -declare module "lodash/fp/deburr" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "deburr">; -} - -declare module "lodash/fp/endsWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "endsWith">; -} - -declare module "lodash/fp/escape" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "escape">; -} - -declare module "lodash/fp/escapeRegExp" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "escapeRegExp">; -} - -declare module "lodash/fp/kebabCase" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "kebabCase">; -} - -declare module "lodash/fp/lowerCase" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "lowerCase">; -} - -declare module "lodash/fp/lowerFirst" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "lowerFirst">; -} - -declare module "lodash/fp/pad" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pad">; -} - -declare module "lodash/fp/padChars" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "padChars">; -} - -declare module "lodash/fp/padEnd" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "padEnd">; -} - -declare module "lodash/fp/padCharsEnd" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "padCharsEnd">; -} - -declare module "lodash/fp/padStart" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "padStart">; -} - -declare module "lodash/fp/padCharsStart" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "padCharsStart">; -} - -declare module "lodash/fp/parseInt" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "parseInt">; -} - -declare module "lodash/fp/repeat" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "repeat">; -} - -declare module "lodash/fp/replace" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "replace">; -} - -declare module "lodash/fp/snakeCase" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "snakeCase">; -} - -declare module "lodash/fp/split" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "split">; -} - -declare module "lodash/fp/startCase" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "startCase">; -} - -declare module "lodash/fp/startsWith" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "startsWith">; -} - -declare module "lodash/fp/template" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "template">; -} - -declare module "lodash/fp/toLower" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toLower">; -} - -declare module "lodash/fp/toUpper" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toUpper">; -} - -declare module "lodash/fp/trim" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "trim">; -} - -declare module "lodash/fp/trimChars" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "trimChars">; -} - -declare module "lodash/fp/trimEnd" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "trimEnd">; -} - -declare module "lodash/fp/trimCharsEnd" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "trimCharsEnd">; -} - -declare module "lodash/fp/trimStart" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "trimStart">; -} - -declare module "lodash/fp/trimCharsStart" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "trimCharsStart">; -} - -declare module "lodash/fp/truncate" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "truncate">; -} - -declare module "lodash/fp/unescape" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "unescape">; -} - -declare module "lodash/fp/upperCase" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "upperCase">; -} - -declare module "lodash/fp/upperFirst" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "upperFirst">; -} - -declare module "lodash/fp/words" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "words">; -} - -declare module "lodash/fp/attempt" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "attempt">; -} - -declare module "lodash/fp/bindAll" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "bindAll">; -} - -declare module "lodash/fp/cond" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "cond">; -} - -declare module "lodash/fp/constant" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "constant">; -} - -declare module "lodash/fp/always" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "always">; -} - -declare module "lodash/fp/defaultTo" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "defaultTo">; -} - -declare module "lodash/fp/flow" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flow">; -} - -declare module "lodash/fp/pipe" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pipe">; -} - -declare module "lodash/fp/flowRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "flowRight">; -} - -declare module "lodash/fp/compose" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "compose">; -} - -declare module "lodash/fp/identity" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "identity">; -} - -declare module "lodash/fp/iteratee" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "iteratee">; -} - -declare module "lodash/fp/matches" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "matches">; -} - -declare module "lodash/fp/matchesProperty" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "matchesProperty">; -} - -declare module "lodash/fp/propEq" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "propEq">; -} - -declare module "lodash/fp/pathEq" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "pathEq">; -} - -declare module "lodash/fp/method" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "method">; -} - -declare module "lodash/fp/methodOf" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "methodOf">; -} - -declare module "lodash/fp/mixin" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "mixin">; -} - -declare module "lodash/fp/noConflict" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "noConflict">; -} - -declare module "lodash/fp/noop" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "noop">; -} - -declare module "lodash/fp/nthArg" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "nthArg">; -} - -declare module "lodash/fp/over" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "over">; -} - -declare module "lodash/fp/juxt" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "juxt">; -} - -declare module "lodash/fp/overEvery" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "overEvery">; -} - -declare module "lodash/fp/allPass" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "allPass">; -} - -declare module "lodash/fp/overSome" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "overSome">; -} - -declare module "lodash/fp/anyPass" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "anyPass">; -} - -declare module "lodash/fp/property" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "property">; -} - -declare module "lodash/fp/propertyOf" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "propertyOf">; -} - -declare module "lodash/fp/range" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "range">; -} - -declare module "lodash/fp/rangeStep" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "rangeStep">; -} - -declare module "lodash/fp/rangeRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "rangeRight">; -} - -declare module "lodash/fp/rangeStepRight" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "rangeStepRight">; -} - -declare module "lodash/fp/runInContext" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "runInContext">; -} - -declare module "lodash/fp/stubArray" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "stubArray">; -} - -declare module "lodash/fp/stubFalse" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "stubFalse">; -} - -declare module "lodash/fp/F" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "F">; -} - -declare module "lodash/fp/stubObject" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "stubObject">; -} - -declare module "lodash/fp/stubString" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "stubString">; -} - -declare module "lodash/fp/stubTrue" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "stubTrue">; -} - -declare module "lodash/fp/T" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "T">; -} - -declare module "lodash/fp/times" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "times">; -} - -declare module "lodash/fp/toPath" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "toPath">; -} - -declare module "lodash/fp/uniqueId" { - declare module.exports: $PropertyType<$Exports<"lodash/fp">, "uniqueId">; -} diff --git a/flow-typed/npm/log4js_v1.x.x.js b/flow-typed/npm/log4js_v1.x.x.js deleted file mode 100644 index 4c9927c9e1..0000000000 --- a/flow-typed/npm/log4js_v1.x.x.js +++ /dev/null @@ -1,44 +0,0 @@ -// flow-typed signature: c69efc63ea2cb8646a8685b0e937fb25 -// flow-typed version: b43dff3e0e/log4js_v1.x.x/flow_>=v0.25.x - -type log4js$Logger = { - level: string, - setLevel(level: string): void, - removeLevel(): void, - isLevelEnabled(level: string): boolean, - - log(...args: Array): void, - trace(...args: Array): void, - debug(...args: Array): void, - info(...args: Array): void, - warn(...args: Array): void, - error(...args: Array): void, - fatal(...args: Array): void, - mark(...args: Array): void, -} - -type log4js$Appender = { - type: string, -} - -type log4js$Config = { - appenders?: Array, - levels?: {[name: string]: string}, -} - -declare module 'log4js' { - declare module.exports: { - getLogger(category?: string): log4js$Logger, - - configure( - configurationFileOrObject: string | log4js$Config, - options?: Object, - ): void, - - shutdown(callback: () => mixed): void, - - connectLogger(logger: log4js$Logger, options?: Object): any, - - levels: Object, - } -} diff --git a/flow-typed/npm/lru-cache_v4.0.x.js b/flow-typed/npm/lru-cache_v4.0.x.js deleted file mode 100644 index 8e5c7473bd..0000000000 --- a/flow-typed/npm/lru-cache_v4.0.x.js +++ /dev/null @@ -1,32 +0,0 @@ -// flow-typed signature: 2e415f033284600956b323d56d206449 -// flow-typed version: b43dff3e0e/lru-cache_v4.0.x/flow_>=v0.20.0 - -declare module 'lru-cache' { - declare type LRUCache = { - set: (key: K, value: V, maxAge?: number) => void, - get: (key: K) => V, - peek: (key: K) => V, - del: (key: K) => void, - reset: () => void, - has: (key: K) => boolean, - dump: () => Array<{k: K, v: V}>, - load: (Array<{k: K, v: V}>) => void, - itemCount: number, - forEach: ( - handler: (value: V, key: K, cacheInstance: LRUCache) => void, - context?: LRUCache, - ) => void, - // TODO add the rest of the things documented at https://www.npmjs.com/package/lru-cache - }; - - declare type Options = { - max?: number, - maxAge?: number, - length?: (value: V, key: K) => number, - dispose?: (key: K, value: V) => void, - stale?: boolean, - }; - - // TODO You can supply just an integer (max size), or even nothing at all. - declare module.exports: (options: Options) => LRUCache; -} diff --git a/flow-typed/npm/marked_v0.3.x.js b/flow-typed/npm/marked_v0.3.x.js deleted file mode 100644 index 14bc8c3724..0000000000 --- a/flow-typed/npm/marked_v0.3.x.js +++ /dev/null @@ -1,162 +0,0 @@ -// flow-typed signature: 4a38f4feaff5e86951b8882473d31965 -// flow-typed version: 78c72eef44/marked_v0.3.x/flow_>=v0.28.x - -type marked$AlignFlag = 'left' | 'right' | 'center' - -type marked$NodeCallback = (e: ?Error, d: ?T) => void - -class marked$Renderer { - options: marked$MarkedOptions; - code: (c: string, l: string) => string; - blockquote: (q: string) => string; - html: (h: string) => string; - heading: (t: string, l: number) => string; - hr: () => string; - list: (b: string, o: boolean) => string; - listitem: (t: string) => string; - paragraph: (t: string) => string; - table: (h: string, b: string) => string; - tablerow: (c: string) => string; - tablecell: (c: string, f: ?marked$AlignFlag) => string; - heading: (t: string, l: number) => string; - strong: (t: string) => string; - em: (t: string) => string; - codespan: (c: string) => string; - br: () => string; - del: (t: string) => string; - link: (h: string, ti: string, te: string) => string; - image: (h: string, ti: string, te: string) => string; - text: (t: string) => string; - constructor(o?: marked$MarkedOptions): marked$Renderer { - return this; - } -} - -type marked$HighlightFunction = - ((c: string, l: string, cb: marked$NodeCallback) => void) - | ((c: string, cb: marked$NodeCallback) => void) - | ((c: string, l?: string) => string) - -type marked$MarkedOptions = { - highlight?: marked$HighlightFunction; - renderer?: marked$Renderer; - gfm?: boolean; - tables?: boolean; - breaks?: boolean; - pedantic?: boolean; - sanitize?: boolean; - smartLists?: boolean; - smartypants?: boolean; -} - -/* - * marked$Tokens - */ - -type marked$Space = { type: 'space'; } -type marked$Code = { type: 'code'; text: string; lang?: string; } -type marked$Heading = { type: 'heading'; depth: number; text: string; } -type marked$Table = { type: 'table'; header: string; align: Array ; cells: Array> } -type marked$Hr = { type: 'hr'; } -type marked$BlockquoteStart = { type: 'blockquote_start' } -type marked$BlockquoteEnd = { type: 'blockquote_end' } -type marked$ListStart = { type: 'list_start' } -type marked$ListEnd = { type: 'list_end' } -type marked$Paragraph = { type: 'paragraph'; pre: boolean; text: string; } -type marked$Html = { type: 'paragraph'; pre: boolean; text: string; } -type marked$Text = { type: 'text'; text: string; } - -type marked$Token = - marked$Space - | marked$Code - | marked$Heading - | marked$Table - | marked$Hr - | marked$BlockquoteStart - | marked$BlockquoteEnd - | marked$ListStart - | marked$ListEnd - | marked$Paragraph - | marked$Html - | marked$Text - -type marked$Link = { - title: ?string; - href: string; -} - -type marked$Tokens = { links: Array } & Array; - -type marked$NoopRule = { - (i: mixed): void; - exec: (i: mixed) => void; -} - -type marked$Rule = RegExp | marked$NoopRule - -type marked$lex = (t: string) => marked$Tokens; - -class marked$Lexer { - static lexer: (t: string, o?: marked$MarkedOptions) => marked$Tokens; - static rules: { [key: string]: marked$Rule }; - rules: { [key: string]: marked$Rule }; - lex: marked$lex; - tokens: marked$Tokens; - options: marked$MarkedOptions; - constructor(o?: marked$MarkedOptions): marked$Lexer { - return this; - } -} - -class marked$Parser { - static parse: (t: marked$Tokens, o?: marked$MarkedOptions) => string; - parse: (t: marked$Tokens) => string; - next: () => marked$Token; - peek: () => marked$Token; - parsemarked$Text: () => string; - tok: () => string; - tokens: marked$Tokens; - token: ?marked$Token; - options: marked$MarkedOptions; - renderer: marked$Renderer; - constructor(o?: marked$MarkedOptions): marked$Parser { - return this; - } -} - -class marked$InlineLexer { - static rules: Array; - static output: (s: string, l: Array, o?: marked$MarkedOptions) => string; - output: (s: string) => string; - outputmarked$Link: (c: Array, l: marked$Link) => string; - smartypants: (t: string) => string; - mangle: (t: string) => string; - options: marked$MarkedOptions; - links: Array; - rules: Array; - renderer: marked$Renderer; - constructor(l: Array, o?: marked$MarkedOptions): marked$InlineLexer { - return this; - } -} - -type marked$Marked = { - (md: string, o: marked$MarkedOptions, cb: marked$NodeCallback): void; - (md: string, cb: marked$NodeCallback): void; - (md: string, o?: marked$MarkedOptions): string; - setOptions: (o: marked$MarkedOptions) => void; - defaults: marked$MarkedOptions; - Parser: typeof marked$Parser; - parser: typeof marked$Parser.parse; - Lexer: typeof marked$Lexer; - lexer: typeof marked$Lexer.lexer; - InlineLexer: typeof marked$InlineLexer; - inlinelexer: typeof marked$InlineLexer.output; - Renderer: typeof marked$Renderer; - parse: marked$Marked; -} - - -declare module marked { - declare export default marked$Marked; -} diff --git a/flow-typed/npm/mkdirp_v0.5.x.js b/flow-typed/npm/mkdirp_v0.5.x.js deleted file mode 100644 index e26f9a4be7..0000000000 --- a/flow-typed/npm/mkdirp_v0.5.x.js +++ /dev/null @@ -1,13 +0,0 @@ -// flow-typed signature: 82aa0feffc2bbd64dce3bec492f5d601 -// flow-typed version: 3315d89a00/mkdirp_v0.5.x/flow_>=v0.25.0 - -declare module 'mkdirp' { - declare type Options = number | { mode?: number; fs?: mixed }; - - declare type Callback = (err: ?Error, path: ?string) => void; - - declare module.exports: { - (path: string, options?: Options | Callback, callback?: Callback): void; - sync(path: string, options?: Options): void; - }; -} diff --git a/flow-typed/npm/prettier_v1.x.x.js b/flow-typed/npm/prettier_v1.x.x.js deleted file mode 100644 index 0c24491525..0000000000 --- a/flow-typed/npm/prettier_v1.x.x.js +++ /dev/null @@ -1,178 +0,0 @@ -// flow-typed signature: 4eed8da2dc730dc33e7710b465eaa44b -// flow-typed version: cc7a557b34/prettier_v1.x.x/flow_>=v0.56.x - -declare module "prettier" { - declare type AST = Object; - declare type Doc = Object; - declare type FastPath = Object; - - declare type PrettierParserName = - | "babylon" - | "flow" - | "typescript" - | "postcss" - | "css" - | "less" - | "scss" - | "json" - | "graphql" - | "markdown" - | "vue"; - - declare type PrettierParser = { - [name: PrettierParserName]: (text: string, options?: Object) => AST - }; - - declare type CustomParser = ( - text: string, - parsers: PrettierParser, - options: Options - ) => AST; - - declare type Options = {| - printWidth?: number, - tabWidth?: number, - useTabs?: boolean, - semi?: boolean, - singleQuote?: boolean, - trailingComma?: "none" | "es5" | "all", - bracketSpacing?: boolean, - jsxBracketSameLine?: boolean, - arrowParens?: "avoid" | "always", - rangeStart?: number, - rangeEnd?: number, - parser?: PrettierParserName | CustomParser, - filepath?: string, - requirePragma?: boolean, - insertPragma?: boolean, - proseWrap?: "always" | "never" | "preserve", - plugins?: Array - |}; - - declare type Plugin = { - languages: SupportLanguage, - parsers: { [parserName: string]: Parser }, - printers: { [astFormat: string]: Printer } - }; - - declare type Parser = { - parse: ( - text: string, - parsers: { [parserName: string]: Parser }, - options: Object - ) => AST, - astFormat: string - }; - - declare type Printer = { - print: ( - path: FastPath, - options: Object, - print: (path: FastPath) => Doc - ) => Doc, - embed: ( - path: FastPath, - print: (path: FastPath) => Doc, - textToDoc: (text: string, options: Object) => Doc, - options: Object - ) => ?Doc - }; - - declare type CursorOptions = {| - cursorOffset: number, - printWidth?: $PropertyType, - tabWidth?: $PropertyType, - useTabs?: $PropertyType, - semi?: $PropertyType, - singleQuote?: $PropertyType, - trailingComma?: $PropertyType, - bracketSpacing?: $PropertyType, - jsxBracketSameLine?: $PropertyType, - arrowParens?: $PropertyType, - parser?: $PropertyType, - filepath?: $PropertyType, - requirePragma?: $PropertyType, - insertPragma?: $PropertyType, - proseWrap?: $PropertyType, - plugins?: $PropertyType - |}; - - declare type CursorResult = {| - formatted: string, - cursorOffset: number - |}; - - declare type ResolveConfigOptions = {| - useCache?: boolean, - config?: string, - editorconfig?: boolean - |}; - - declare type SupportLanguage = { - name: string, - since: string, - parsers: Array, - group?: string, - tmScope: string, - aceMode: string, - codemirrorMode: string, - codemirrorMimeType: string, - aliases?: Array, - extensions: Array, - filenames?: Array, - linguistLanguageId: number, - vscodeLanguageIds: Array - }; - - declare type SupportOption = {| - since: string, - type: "int" | "boolean" | "choice" | "path", - deprecated?: string, - redirect?: SupportOptionRedirect, - description: string, - oppositeDescription?: string, - default: SupportOptionValue, - range?: SupportOptionRange, - choices?: SupportOptionChoice - |}; - - declare type SupportOptionRedirect = {| - options: string, - value: SupportOptionValue - |}; - - declare type SupportOptionRange = {| - start: number, - end: number, - step: number - |}; - - declare type SupportOptionChoice = {| - value: boolean | string, - description?: string, - since?: string, - deprecated?: string, - redirect?: SupportOptionValue - |}; - - declare type SupportOptionValue = number | boolean | string; - - declare type SupportInfo = {| - languages: Array, - options: Array - |}; - - declare type Prettier = {| - format: (source: string, options?: Options) => string, - check: (source: string, options?: Options) => boolean, - formatWithCursor: (source: string, options: CursorOptions) => CursorResult, - resolveConfig: { - (filePath: string, options?: ResolveConfigOptions): Promise, - sync(filePath: string, options?: ResolveConfigOptions): Promise - }, - clearConfigCache: () => void, - getSupportInfo: (version?: string) => SupportInfo - |}; - - declare export default Prettier; -} diff --git a/flow-typed/npm/react-redux_v5.x.x.js b/flow-typed/npm/react-redux_v5.x.x.js deleted file mode 100644 index 30380824d6..0000000000 --- a/flow-typed/npm/react-redux_v5.x.x.js +++ /dev/null @@ -1,114 +0,0 @@ -// flow-typed signature: f0d96df48e9abc14bcc1405ba2a47dde -// flow-typed version: 83053e4020/react-redux_v5.x.x/flow_>=v0.53.x - -// flow-typed signature: 8db7b853f57c51094bf0ab8b2650fd9c -// flow-typed version: ab8db5f14d/react-redux_v5.x.x/flow_>=v0.30.x - -import type { Dispatch, Store } from "redux"; - -declare module "react-redux" { - /* - - S = State - A = Action - OP = OwnProps - SP = StateProps - DP = DispatchProps - - */ - - declare type MapStateToProps = ( - state: S, - ownProps: OP - ) => ((state: S, ownProps: OP) => SP) | SP; - - declare type MapDispatchToProps = - | ((dispatch: Dispatch, ownProps: OP) => DP) - | DP; - - declare type MergeProps = ( - stateProps: SP, - dispatchProps: DP, - ownProps: OP - ) => P; - - declare type Context = { store: Store<*, *> }; - - declare class ConnectedComponent extends React$Component { - static WrappedComponent: Class>, - getWrappedInstance(): React$Component

, - props: OP, - state: void - } - - declare type ConnectedComponentClass = Class< - ConnectedComponent - >; - - declare type Connector = ( - component: React$ComponentType

- ) => ConnectedComponentClass; - - declare class Provider extends React$Component<{ - store: Store, - children?: any - }> {} - - declare function createProvider( - storeKey?: string, - subKey?: string - ): Provider<*, *>; - - declare type ConnectOptions = { - pure?: boolean, - withRef?: boolean - }; - - declare type Null = null | void; - - declare function connect( - ...rest: Array // <= workaround for https://github.com/facebook/flow/issues/2360 - ): Connector } & OP>>; - - declare function connect( - mapStateToProps: Null, - mapDispatchToProps: Null, - mergeProps: Null, - options: ConnectOptions - ): Connector } & OP>>; - - declare function connect( - mapStateToProps: MapStateToProps, - mapDispatchToProps: Null, - mergeProps: Null, - options?: ConnectOptions - ): Connector } & OP>>; - - declare function connect( - mapStateToProps: Null, - mapDispatchToProps: MapDispatchToProps, - mergeProps: Null, - options?: ConnectOptions - ): Connector>; - - declare function connect( - mapStateToProps: MapStateToProps, - mapDispatchToProps: MapDispatchToProps, - mergeProps: Null, - options?: ConnectOptions - ): Connector>; - - declare function connect( - mapStateToProps: MapStateToProps, - mapDispatchToProps: Null, - mergeProps: MergeProps, - options?: ConnectOptions - ): Connector; - - declare function connect( - mapStateToProps: MapStateToProps, - mapDispatchToProps: MapDispatchToProps, - mergeProps: MergeProps, - options?: ConnectOptions - ): Connector; -} diff --git a/flow-typed/npm/reselect_v3.x.x.js b/flow-typed/npm/reselect_v3.x.x.js deleted file mode 100644 index be78f5e8ce..0000000000 --- a/flow-typed/npm/reselect_v3.x.x.js +++ /dev/null @@ -1,753 +0,0 @@ -// flow-typed signature: 0199525b667f385f2e61dbeae3215f21 -// flow-typed version: b43dff3e0e/reselect_v3.x.x/flow_>=v0.28.x - -declare module 'reselect' { - declare type Selector = { - (state: TState, props: TProps, ...rest: any[]): TResult; - }; - - declare type SelectorCreator = { - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - selector10: Selector, - selector11: Selector, - selector12: Selector, - selector13: Selector, - selector14: Selector, - selector15: Selector, - selector16: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13, - arg14: T14, - arg15: T15, - arg16: T16 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13, - arg14: T14, - arg15: T15, - arg16: T16 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - selector10: Selector, - selector11: Selector, - selector12: Selector, - selector13: Selector, - selector14: Selector, - selector15: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13, - arg14: T14, - arg15: T15 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13, - arg14: T14, - arg15: T15 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - selector10: Selector, - selector11: Selector, - selector12: Selector, - selector13: Selector, - selector14: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13, - arg14: T14 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13, - arg14: T14 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - selector10: Selector, - selector11: Selector, - selector12: Selector, - selector13: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12, - arg13: T13 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - selector10: Selector, - selector11: Selector, - selector12: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11, - arg12: T12 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - selector10: Selector, - selector11: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10, - arg11: T11 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - selector10: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9, - arg10: T10 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - selector9: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8, - arg9: T9 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - selector8: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7, - arg8: T8 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - selector7: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6, - arg7: T7 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - selector6: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5, - arg6: T6 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - selector5: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4, - arg5: T5 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - selector4: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3, - arg4: T4 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - selector3: Selector, - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2, - arg3: T3 - ) => TResult - ): Selector; - - ( - selector1: Selector, - selector2: Selector, - resultFunc: ( - arg1: T1, - arg2: T2 - ) => TResult - ): Selector; - ( - selectors: [ - Selector, - Selector - ], - resultFunc: ( - arg1: T1, - arg2: T2 - ) => TResult - ): Selector; - - ( - selector1: Selector, - resultFunc: ( - arg1: T1 - ) => TResult - ): Selector; - ( - selectors: [ - Selector - ], - resultFunc: ( - arg1: T1 - ) => TResult - ): Selector; - }; - - declare type Reselect = { - createSelector: SelectorCreator; - - defaultMemoize: ( - func: TFunc, - equalityCheck?: (a: any, b: any) => boolean - ) => TFunc; - - createSelectorCreator: ( - memoize: Function, - ...memoizeOptions: any[] - ) => SelectorCreator; - - createStructuredSelector: ( - inputSelectors: { - [k: string | number]: Selector - }, - selectorCreator?: SelectorCreator - ) => Selector; - }; - - declare module.exports: Reselect; -}; diff --git a/flow-typed/npm/rimraf_v2.x.x.js b/flow-typed/npm/rimraf_v2.x.x.js deleted file mode 100644 index 13b85249c4..0000000000 --- a/flow-typed/npm/rimraf_v2.x.x.js +++ /dev/null @@ -1,18 +0,0 @@ -// flow-typed signature: 1dff23447d5e18f5ac2b05aaec7cfb74 -// flow-typed version: a453e98ea2/rimraf_v2.x.x/flow_>=v0.25.0 - -declare module 'rimraf' { - declare type Options = { - maxBusyTries?: number, - emfileWait?: number, - glob?: boolean, - disableGlob?: boolean - }; - - declare type Callback = (err: ?Error, path: ?string) => void; - - declare module.exports: { - (f: string, opts?: Options | Callback, callback?: Callback): void; - sync(path: string, opts?: Options): void; - }; -} diff --git a/flow-typed/npm/rxjs_v5.0.x.js b/flow-typed/npm/rxjs_v5.0.x.js deleted file mode 100644 index 6100445acb..0000000000 --- a/flow-typed/npm/rxjs_v5.0.x.js +++ /dev/null @@ -1,1501 +0,0 @@ -// flow-typed signature: 4aae218bc9c7bbec427ed4b027decad2 -// flow-typed version: e59aa15f07/rxjs_v5.0.x/flow_>=v0.34.x - -// FIXME(samgoldman) Remove top-level interface once Babel supports -// `declare interface` syntax. -// FIXME(samgoldman) Remove this once rxjs$Subject can mixin rxjs$Observer -interface rxjs$IObserver<-T> { - closed?: boolean; - next(value: T): mixed; - error(error: any): mixed; - complete(): mixed; -} - -type rxjs$PartialObserver<-T> = - | { - +next: (value: T) => mixed, - +error?: (error: any) => mixed, - +complete?: () => mixed - } - | { - +next?: (value: T) => mixed, - +error: (error: any) => mixed, - +complete?: () => mixed - } - | { - +next?: (value: T) => mixed, - +error?: (error: any) => mixed, - +complete: () => mixed - }; - -interface rxjs$ISubscription { - unsubscribe(): void; -} - -type rxjs$TeardownLogic = rxjs$ISubscription | (() => void); - -type rxjs$EventListenerOptions = - | { - capture?: boolean, - passive?: boolean, - once?: boolean - } - | boolean; - -type rxjs$ObservableInput = rxjs$Observable | Promise | Iterable; - -type rxjs$OperatorFunction = (rxjs$Observable) => rxjs$Observable; -type rxjs$OperatorFunctionLast> = ( - rxjs$Observable -) => R; - -type rxjs$NotificationKind = 'N' | 'C' | 'E'; -type rxjs$Notification = { - error: any, - hasValue: true, - kind: rxjs$NotificationKind, - value: T, -} | { - error: any, - hasValue: false, - kind: rxjs$NotificationKind, - value: void, -}; - -declare class rxjs$Observable<+T> { - static bindCallback( - callbackFunc: (callback: (_: void) => any) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): () => rxjs$Observable; - static bindCallback( - callbackFunc: (callback: (result: U) => any) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): () => rxjs$Observable; - static bindCallback( - callbackFunc: (v1: T, callback: (result: U) => any) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T) => rxjs$Observable; - static bindCallback( - callbackFunc: (v1: T, v2: T2, callback: (result: U) => any) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2) => rxjs$Observable; - static bindCallback( - callbackFunc: (v1: T, v2: T2, v3: T3, callback: (result: U) => any) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - callback: (result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - v5: T5, - callback: (result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - v5: T5, - v6: T6, - callback: (result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => rxjs$Observable; - static bindCallback( - callbackFunc: (callback: (...args: Array) => any) => any, - selector: (...args: Array) => U, - scheduler?: rxjs$SchedulerClass - ): () => rxjs$Observable; - static bindCallback( - callbackFunc: (v1: T, callback: (...args: Array) => any) => any, - selector: (...args: Array) => U, - scheduler?: rxjs$SchedulerClass - ): (v1: T) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - callback: (...args: Array) => any - ) => any, - selector: (...args: Array) => U, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - callback: (...args: Array) => any - ) => any, - selector: (...args: Array) => U, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - callback: (...args: Array) => any - ) => any, - selector: (...args: Array) => U, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - v5: T5, - callback: (...args: Array) => any - ) => any, - selector: (...args: Array) => U, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => rxjs$Observable; - static bindCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - v5: T5, - v6: T6, - callback: (...args: Array) => any - ) => any, - selector: (...args: Array) => U, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => rxjs$Observable; - static bindCallback( - callbackFunc: Function, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (...args: Array) => rxjs$Observable; - static bindCallback( - callbackFunc: Function, - selector?: (...args: Array) => T, - scheduler?: rxjs$SchedulerClass - ): (...args: Array) => rxjs$Observable; - - static bindNodeCallback( - callbackFunc: (callback: (err: any, result: U) => any) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): () => rxjs$Observable; - static bindNodeCallback( - callbackFunc: (v1: T, callback: (err: any, result: U) => any) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T) => rxjs$Observable; - static bindNodeCallback( - callbackFunc: ( - v1: T, - v2: T2, - callback: (err: any, result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2) => rxjs$Observable; - static bindNodeCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - callback: (err: any, result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3) => rxjs$Observable; - static bindNodeCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - callback: (err: any, result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4) => rxjs$Observable; - static bindNodeCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - v5: T5, - callback: (err: any, result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => rxjs$Observable; - static bindNodeCallback( - callbackFunc: ( - v1: T, - v2: T2, - v3: T3, - v4: T4, - v5: T5, - v6: T6, - callback: (err: any, result: U) => any - ) => any, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => rxjs$Observable; - static bindNodeCallback( - callbackFunc: Function, - selector?: void, - scheduler?: rxjs$SchedulerClass - ): (...args: Array) => rxjs$Observable; - static bindNodeCallback( - callbackFunc: Function, - selector?: (...args: Array) => T, - scheduler?: rxjs$SchedulerClass - ): (...args: Array) => rxjs$Observable; - - static concat(...sources: rxjs$Observable[]): rxjs$Observable; - - static create( - subscribe: ( - observer: rxjs$Observer - ) => rxjs$ISubscription | Function | void - ): rxjs$Observable; - - static defer( - observableFactory: () => rxjs$Observable | Promise - ): rxjs$Observable; - - static from( - input: rxjs$ObservableInput, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - static fromEvent( - element: any, - eventName: string, - ...none: Array - ): rxjs$Observable; - static fromEvent( - element: any, - eventName: string, - options: rxjs$EventListenerOptions, - ...none: Array - ): rxjs$Observable; - static fromEvent( - element: any, - eventName: string, - selector: () => T, - ...none: Array - ): rxjs$Observable; - static fromEvent( - element: any, - eventName: string, - options: rxjs$EventListenerOptions, - selector: () => T - ): rxjs$Observable; - - static fromEventPattern( - addHandler: (handler: (item: T) => void) => void, - removeHandler: (handler: (item: T) => void) => void, - selector?: () => T - ): rxjs$Observable; - - static fromPromise(promise: Promise): rxjs$Observable; - - static empty(): rxjs$Observable; - - static interval(period: number): rxjs$Observable; - - static timer( - initialDelay: number | Date, - period?: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - static merge( - source0: rxjs$Observable, - source1: rxjs$Observable - ): rxjs$Observable; - static merge( - source0: rxjs$Observable, - source1: rxjs$Observable, - source2: rxjs$Observable - ): rxjs$Observable; - static merge(...sources: rxjs$Observable[]): rxjs$Observable; - - static never(): rxjs$Observable; - - static of(...values: T[]): rxjs$Observable; - - static race(...sources: rxjs$Observable[]): rxjs$Observable; - - static range( - start?: number, - count?: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - static throw(error: any): rxjs$Observable; - - audit( - durationSelector: (value: T) => rxjs$Observable | Promise - ): rxjs$Observable; - - auditTime( - duration: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - race(other: rxjs$Observable): rxjs$Observable; - - repeat(count?: number): rxjs$Observable; - - buffer(bufferBoundaries: rxjs$Observable): rxjs$Observable>; - - bufferCount( - bufferSize: number, - startBufferEvery?: number - ): rxjs$Observable>; - - bufferTime( - bufferTimeSpan: number, - bufferCreationInterval?: number, - maxBufferSize?: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable>; - - bufferToggle( - openings: rxjs$Observable | Promise, - closingSelector: (value: U) => rxjs$Observable | Promise - ): rxjs$Observable>; - - bufferWhen( - closingSelector: () => rxjs$Observable - ): rxjs$Observable>; - - catch( - selector: (err: any, caught: rxjs$Observable) => rxjs$Observable - ): rxjs$Observable; - - concat(...sources: rxjs$Observable[]): rxjs$Observable; - - concatAll(): rxjs$Observable; - - concatMap( - f: (value: T, index: number) => rxjs$ObservableInput, - _: void - ): rxjs$Observable; - concatMap( - f: (value: T, index: number) => rxjs$ObservableInput, - resultSelector: ( - outerValue: T, - innerValue: U, - outerIndex: number, - innerIndex: number - ) => V - ): rxjs$Observable; - - debounceTime( - dueTime: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - defaultIfEmpty(defaultValue: U): rxjs$Observable; - - delay(dueTime: number, scheduler?: rxjs$SchedulerClass): rxjs$Observable; - - distinctUntilChanged(compare?: (x: T, y: T) => boolean): rxjs$Observable; - - distinct( - keySelector?: (value: T) => U, - flushes?: rxjs$Observable - ): rxjs$Observable; - - distinctUntilKeyChanged( - key: string, - compare?: (x: mixed, y: mixed) => boolean - ): rxjs$Observable; - - elementAt(index: number, defaultValue?: T): rxjs$Observable; - - exhaustMap( - project: (value: T, index: number) => rxjs$ObservableInput, - _: void - ): rxjs$Observable; - exhaustMap( - project: (value: T, index: number) => rxjs$ObservableInput, - resultSelector: ( - outerValue: T, - innerValue: U, - outerIndex: number, - innerIndex: number - ) => V - ): rxjs$Observable; - - expand( - project: (value: T, index: number) => rxjs$Observable, - concurrent?: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - filter(predicate: typeof Boolean): rxjs$Observable<$NonMaybeType>; - filter( - predicate: (value: T, index: number) => boolean, - thisArg?: any - ): rxjs$Observable; - - finally(f: () => mixed): rxjs$Observable; - - first( - predicate?: (value: T, index: number, source: rxjs$Observable) => boolean - ): rxjs$Observable; - first( - predicate: ?( - value: T, - index: number, - source: rxjs$Observable - ) => boolean, - defaultValue: T - ): rxjs$Observable; - - groupBy( - keySelector: (value: T) => K, - _: void - ): rxjs$Observable>; - groupBy( - keySelector: (value: T) => K, - elementSelector: (value: T) => V, - durationSelector?: ( - grouped: rxjs$GroupedObservable - ) => rxjs$Observable - ): rxjs$Observable>; - - ignoreElements(): rxjs$Observable; - - last( - predicate?: (value: T, index: number, source: rxjs$Observable) => boolean - ): rxjs$Observable; - last( - predicate: ?( - value: T, - index: number, - source: rxjs$Observable - ) => boolean, - resultSelector: (value: T, index: number) => U - ): rxjs$Observable; - last( - predicate: ?( - value: T, - index: number, - source: rxjs$Observable - ) => boolean, - resultSelector: ?(value: T, index: number) => U, - defaultValue: U - ): rxjs$Observable; - - let( - project: (self: rxjs$Observable) => rxjs$Observable - ): rxjs$Observable; - - // Alias for `let` - letBind( - project: (self: rxjs$Observable) => rxjs$Observable - ): rxjs$Observable; - - switch(): T; // assumption: T is Observable - - // Alias for `mergeMap` - flatMap( - project: (value: T, index: number) => rxjs$ObservableInput, - concurrency?: number - ): rxjs$Observable; - flatMap( - project: (value: T, index: number) => rxjs$ObservableInput, - resultSelector: ( - outerValue: T, - innerValue: U, - outerIndex: number, - innerIndex: number - ) => V, - concurrency?: number - ): rxjs$Observable; - - flatMapTo(innerObservable: rxjs$Observable): rxjs$Observable; - - flatMapTo( - innerObservable: rxjs$Observable, - resultSelector: ( - outerValue: T, - innerValue: U, - outerIndex: number, - innerIndex: number - ) => V, - concurrent?: number - ): rxjs$Observable; - - switchMap( - project: (value: T, index: number) => rxjs$ObservableInput, - _: void - ): rxjs$Observable; - switchMap( - project: (value: T, index: number) => rxjs$ObservableInput, - resultSelector: ( - outerValue: T, - innerValue: U, - outerIndex: number, - innerIndex: number - ) => V - ): rxjs$Observable; - - switchMapTo(innerObservable: rxjs$Observable): rxjs$Observable; - - materialize(): rxjs$Observable>; - - map(f: (value: T) => U): rxjs$Observable; - - mapTo(value: U): rxjs$Observable; - - merge(other: rxjs$Observable): rxjs$Observable; - - mergeAll(): rxjs$Observable; - - mergeMap( - project: (value: T, index: number) => rxjs$ObservableInput, - concurrency?: number - ): rxjs$Observable; - mergeMap( - project: (value: T, index: number) => rxjs$ObservableInput, - resultSelector: ( - outerValue: T, - innerValue: U, - outerIndex: number, - innerIndex: number - ) => V, - concurrency?: number - ): rxjs$Observable; - - mergeMapTo(innerObservable: rxjs$Observable): rxjs$Observable; - - mergeMapTo( - innerObservable: rxjs$Observable, - resultSelector: ( - outerValue: T, - innerValue: U, - outerIndex: number, - innerIndex: number - ) => V, - concurrent?: number - ): rxjs$Observable; - - multicast( - subjectOrSubjectFactory: rxjs$Subject | (() => rxjs$Subject) - ): rxjs$ConnectableObservable; - - observeOn(scheduler: rxjs$SchedulerClass): rxjs$Observable; - - pairwise(): rxjs$Observable<[T, T]>; - - partition( - predicate: (value: T, index: number) => boolean, - thisArg: any - ): [rxjs$Observable, rxjs$Observable]; - - pipe(): rxjs$Observable; - - pipe(op1: rxjs$OperatorFunctionLast): A; - - pipe( - op1: rxjs$OperatorFunction, - op2: rxjs$OperatorFunctionLast - ): B; - - pipe( - op1: rxjs$OperatorFunction, - op2: rxjs$OperatorFunction, - op3: rxjs$OperatorFunctionLast - ): C; - - pipe( - op1: rxjs$OperatorFunction, - op2: rxjs$OperatorFunction, - op3: rxjs$OperatorFunction, - op4: rxjs$OperatorFunctionLast - ): D; - - pipe( - op1: rxjs$OperatorFunction, - op2: rxjs$OperatorFunction, - op3: rxjs$OperatorFunction, - op4: rxjs$OperatorFunction, - op5: rxjs$OperatorFunctionLast - ): E; - - publish(): rxjs$ConnectableObservable; - - publishLast(): rxjs$ConnectableObservable; - - reduce( - accumulator: ( - acc: U, - currentValue: T, - index: number, - source: rxjs$Observable - ) => U, - seed: U - ): rxjs$Observable; - - sample(notifier: rxjs$Observable): rxjs$Observable; - - sampleTime( - delay: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - publishReplay( - bufferSize?: number, - windowTime?: number, - scheduler?: rxjs$SchedulerClass - ): rxjs$ConnectableObservable; - - retry(retryCount: ?number): rxjs$Observable; - - retryWhen( - notifier: (errors: rxjs$Observable) => rxjs$Observable - ): rxjs$Observable; - - scan(f: (acc: U, value: T) => U, initialValue: U): rxjs$Observable; - - share(): rxjs$Observable; - - shareReplay(bufferSize?: number, windowTime?: number, scheduler?: rxjs$SchedulerClass): rxjs$Observable; - - skip(count: number): rxjs$Observable; - - skipUntil(other: rxjs$Observable | Promise): rxjs$Observable; - - skipWhile( - predicate: (value: T, index: number) => boolean - ): rxjs$Observable; - - startWith(...values: Array): rxjs$Observable; - - subscribeOn(scheduler: rxjs$SchedulerClass): rxjs$Observable; - - take(count: number): rxjs$Observable; - - takeLast(count: number): rxjs$Observable; - - takeUntil(other: rxjs$Observable): rxjs$Observable; - - takeWhile( - predicate: (value: T, index: number) => boolean - ): rxjs$Observable; - - do( - onNext?: (value: T) => mixed, - onError?: (error: any) => mixed, - onCompleted?: () => mixed - ): rxjs$Observable; - do(observer: { - next?: (value: T) => mixed, - error?: (error: any) => mixed, - complete?: () => mixed - }): rxjs$Observable; - - throttleTime(duration: number): rxjs$Observable; - - timeout(due: number | Date, _: void): rxjs$Observable; - - timeoutWith( - due: number | Date, - withObservable: rxjs$Observable, - scheduler?: rxjs$SchedulerClass - ): rxjs$Observable; - - toArray(): rxjs$Observable; - - toPromise(): Promise; - - subscribe(observer: rxjs$PartialObserver): rxjs$Subscription; - subscribe( - onNext: ?(value: T) => mixed, - onError: ?(error: any) => mixed, - onCompleted: ?() => mixed - ): rxjs$Subscription; - - combineAll(): rxjs$Observable; - combineAll(project: (...values: any[]) => U): rxjs$Observable; - - static combineLatest( - a: rxjs$Observable, - resultSelector: (a: A) => B - ): rxjs$Observable; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - resultSelector: (a: A, b: B) => C - ): rxjs$Observable; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - resultSelector: (a: A, b: B, c: C) => D - ): rxjs$Observable; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D) => E - ): rxjs$Observable; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E) => F - ): rxjs$Observable; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G - ): rxjs$Observable; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H - ): rxjs$Observable; - - static combineLatest(a: rxjs$Observable, _: void): rxjs$Observable<[A]>; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B]>; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C]>; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D]>; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E]>; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F]>; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F, G]>; - - static combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - h: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F, G, H]>; - - combineLatest(a: rxjs$Observable, _: void): rxjs$Observable<[T, A]>; - - combineLatest( - a: rxjs$Observable, - resultSelector: (a: A) => B - ): rxjs$Observable; - - combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - resultSelector: (a: A, b: B) => C - ): rxjs$Observable; - - combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - resultSelector: (a: A, b: B, c: C) => D - ): rxjs$Observable; - - combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D) => E - ): rxjs$Observable; - - combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E) => F - ): rxjs$Observable; - - combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G - ): rxjs$Observable; - - combineLatest( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H - ): rxjs$Observable; - - static zip( - a: rxjs$Observable, - resultSelector: (a: A) => B - ): rxjs$Observable; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - resultSelector: (a: A, b: B) => C - ): rxjs$Observable; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - resultSelector: (a: A, b: B, c: C) => D - ): rxjs$Observable; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D) => E - ): rxjs$Observable; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E) => F - ): rxjs$Observable; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G - ): rxjs$Observable; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H - ): rxjs$Observable; - - static zip(a: rxjs$Observable, _: void): rxjs$Observable<[A]>; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B]>; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C]>; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D]>; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E]>; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F]>; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F, G]>; - - static zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - h: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F, G, H]>; - - zip(a: rxjs$Observable, _: void): rxjs$Observable<[T, A]>; - - zip( - a: rxjs$Observable, - resultSelector: (a: A) => B - ): rxjs$Observable; - - zip( - a: rxjs$Observable, - b: rxjs$Observable, - resultSelector: (a: A, b: B) => C - ): rxjs$Observable; - - zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - resultSelector: (a: A, b: B, c: C) => D - ): rxjs$Observable; - - zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D) => E - ): rxjs$Observable; - - zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E) => F - ): rxjs$Observable; - - zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G - ): rxjs$Observable; - - zip( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - resultSelector: (a: A) => B - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - resultSelector: (a: A, b: B) => C - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - resultSelector: (a: A, b: B, c: C) => D - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D) => E - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E) => F - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H - ): rxjs$Observable; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B]>; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C]>; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D]>; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E]>; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F]>; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F, G]>; - - static forkJoin( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - h: rxjs$Observable, - _: void - ): rxjs$Observable<[A, B, C, D, E, F, G, H]>; - - static forkJoin( - a: Array>, - _: void - ): rxjs$Observable>; - - static forkJoin( - a: Array>, - _: void - ): rxjs$Observable; - - static forkJoin( - a: Array>, - resultSelector: (...values: Array) => B - ): rxjs$Observable; - - static forkJoin( - a: Array>, - resultSelector: (...values: Array) => A - ): rxjs$Observable; - - window( - windowBoundaries: rxjs$Observable - ): rxjs$Observable>; - windowCount( - windowSize: number, - startWindowEvery?: number - ): rxjs$Observable>; - windowToggle( - openings: rxjs$Observable, - closingSelector: (value: A) => rxjs$Observable - ): rxjs$Observable>; - windowWhen( - closingSelector: () => rxjs$Observable - ): rxjs$Observable>; - - withLatestFrom(a: rxjs$Observable, _: void): rxjs$Observable<[T, A]>; - - withLatestFrom( - a: rxjs$Observable, - resultSelector: (a: A) => B - ): rxjs$Observable; - - withLatestFrom( - a: rxjs$Observable, - b: rxjs$Observable, - resultSelector: (a: A, b: B) => C - ): rxjs$Observable; - - withLatestFrom( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - resultSelector: (a: A, b: B, c: C) => D - ): rxjs$Observable; - - withLatestFrom( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D) => E - ): rxjs$Observable; - - withLatestFrom( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E) => F - ): rxjs$Observable; - - withLatestFrom( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G - ): rxjs$Observable; - - withLatestFrom( - a: rxjs$Observable, - b: rxjs$Observable, - c: rxjs$Observable, - d: rxjs$Observable, - e: rxjs$Observable, - f: rxjs$Observable, - g: rxjs$Observable, - resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H - ): rxjs$Observable; - - static using( - resourceFactory: () => ?R, - observableFactory: (resource: R) => rxjs$Observable | Promise | void - ): rxjs$Observable; - - _subscribe(observer: rxjs$Subscriber): rxjs$Subscription; - - _isScalar: boolean; - source: ?rxjs$Observable; - operator: ?rxjs$Operator; -} - -declare class rxjs$ConnectableObservable extends rxjs$Observable { - connect(): rxjs$Subscription; - refCount(): rxjs$Observable; -} - -declare class rxjs$GroupedObservable extends rxjs$Observable { - key: K; -} - -declare class rxjs$Observer { - next(value: T): mixed; - - error(error: any): mixed; - - complete(): mixed; -} - -declare interface rxjs$Operator { - call(subscriber: rxjs$Subscriber, source: any): rxjs$TeardownLogic; -} - -// FIXME(samgoldman) should be `mixins rxjs$Observable, rxjs$Observer` -// once Babel parsing support exists: https://phabricator.babeljs.io/T6821 -declare class rxjs$Subject extends rxjs$Observable { - asObservable(): rxjs$Observable; - - observers: Array>; - - unsubscribe(): void; - - // Copied from rxjs$Observer - next(value: T): mixed; - error(error: any): mixed; - complete(): mixed; - - // For use in subclasses only: - _next(value: T): void; -} - -declare class rxjs$AnonymousSubject extends rxjs$Subject { - source: ?rxjs$Observable; - destination: ?rxjs$Observer; - - constructor( - destination?: rxjs$IObserver, - source?: rxjs$Observable - ): void; - next(value: T): void; - error(err: any): void; - complete(): void; -} - -declare class rxjs$BehaviorSubject extends rxjs$Subject { - constructor(initialValue: T): void; - - getValue(): T; -} - -declare class rxjs$ReplaySubject extends rxjs$Subject { - constructor( - bufferSize?: number, - windowTime?: number, - scheduler?: rxjs$SchedulerClass - ): void; -} - -declare class rxjs$Subscription { - unsubscribe(): void; - add(teardown: rxjs$TeardownLogic): rxjs$Subscription; -} - -declare class rxjs$Subscriber extends rxjs$Subscription { - static create( - next?: (x?: T) => void, - error?: (e?: any) => void, - complete?: () => void - ): rxjs$Subscriber; - - constructor( - destinationOrNext?: rxjs$PartialObserver | ((value: T) => void), - error?: (e?: any) => void, - complete?: () => void - ): void; - next(value?: T): void; - error(err?: any): void; - complete(): void; - unsubscribe(): void; -} - -declare class rxjs$SchedulerClass { - schedule( - work: (state?: T) => void, - delay?: number, - state?: T - ): rxjs$Subscription; -} - -declare class rxjs$TimeoutError extends Error {} - -declare module "rxjs" { - declare module.exports: { - Observable: typeof rxjs$Observable, - Observer: typeof rxjs$Observer, - ConnectableObservable: typeof rxjs$ConnectableObservable, - Subject: typeof rxjs$Subject, - Subscriber: typeof rxjs$Subscriber, - AnonymousSubject: typeof rxjs$AnonymousSubject, - BehaviorSubject: typeof rxjs$BehaviorSubject, - ReplaySubject: typeof rxjs$ReplaySubject, - Scheduler: { - asap: rxjs$SchedulerClass, - queue: rxjs$SchedulerClass, - animationFrame: rxjs$SchedulerClass, - async: rxjs$SchedulerClass - }, - Subscription: typeof rxjs$Subscription, - TimeoutError: typeof rxjs$TimeoutError - }; -} - -declare module "rxjs/Observable" { - declare module.exports: { - Observable: typeof rxjs$Observable - }; -} - -declare module "rxjs/Observer" { - declare module.exports: { - Observer: typeof rxjs$Observer - }; -} - -declare module "rxjs/BehaviorSubject" { - declare module.exports: { - BehaviorSubject: typeof rxjs$BehaviorSubject - }; -} - -declare module "rxjs/ReplaySubject" { - declare module.exports: { - ReplaySubject: typeof rxjs$ReplaySubject - }; -} - -declare module "rxjs/Subject" { - declare module.exports: { - Subject: typeof rxjs$Subject, - AnonymousSubject: typeof rxjs$AnonymousSubject - }; -} - -declare module "rxjs/Subscriber" { - declare module.exports: { - Subscriber: typeof rxjs$Subscriber - }; -} - -declare module "rxjs/Subscription" { - declare module.exports: { - Subscription: typeof rxjs$Subscription - }; -} - -declare module "rxjs/testing/TestScheduler" { - declare module.exports: { - TestScheduler: typeof rxjs$SchedulerClass - }; -} diff --git a/flow-typed/npm/semver_v5.1.x.js b/flow-typed/npm/semver_v5.1.x.js deleted file mode 100644 index d10661216c..0000000000 --- a/flow-typed/npm/semver_v5.1.x.js +++ /dev/null @@ -1,110 +0,0 @@ -// flow-typed signature: 1d1f54a0e3983f7bd1d91411d7e64f22 -// flow-typed version: 99dfe36842/semver_v5.1.x/flow_>=v0.20.x - -declare module 'semver' { - declare type Release = - 'major' | - 'premajor' | - 'minor' | - 'preminor' | - 'patch' | - 'prepatch' | - 'prerelease'; - - // The supported comparators are taken from the source here: - // https://github.com/npm/node-semver/blob/8bd070b550db2646362c9883c8d008d32f66a234/semver.js#L623 - declare type Operator = - '===' | - '!==' | - '==' | - '=' | - '' | // Not sure why you would want this, but whatever. - '!=' | - '>' | - '>=' | - '<' | - '<='; - - declare class SemVer { - build: Array; - loose: ?boolean; - major: number; - minor: number; - patch: number; - prerelease: Array; - raw: string; - version: string; - - constructor(version: string | SemVer, loose?: boolean): SemVer; - compare(other: string | SemVer): -1 | 0 | 1; - compareMain(other: string | SemVer): -1 | 0 | 1; - comparePre(other: string | SemVer): -1 | 0 | 1; - format(): string; - inc(release: Release, identifier: string): this; - } - - declare class Comparator { - loose?: boolean; - operator: Operator; - semver: SemVer; - value: string; - - constructor(comp: string | Comparator, loose?: boolean): Comparator; - parse(comp: string): void; - test(version: string): boolean; - } - - declare class Range { - loose: ?boolean; - raw: string; - set: Array>; - - constructor(range: string | Range, loose?: boolean): Range; - format(): string; - parseRange(range: string): Array; - test(version: string): boolean; - toString(): string; - } - - declare var SEMVER_SPEC_VERSION: string; - declare var re: Array; - declare var src: Array; - - // Functions - declare function valid(v: string | SemVer, loose?: boolean): string | null; - declare function clean(v: string | SemVer, loose?: boolean): string | null; - declare function inc(v: string | SemVer, release: Release, loose?: boolean, identifier?: string): string | null; - declare function inc(v: string | SemVer, release: Release, identifier: string): string | null; - declare function major(v: string | SemVer, loose?: boolean): number; - declare function minor(v: string | SemVer, loose?: boolean): number; - declare function patch(v: string | SemVer, loose?: boolean): number; - - // Comparison - declare function gt(v1: string | SemVer, v2: string | SemVer, loose?: boolean): boolean; - declare function gte(v1: string | SemVer, v2: string | SemVer, loose?: boolean): boolean; - declare function lt(v1: string | SemVer, v2: string | SemVer, loose?: boolean): boolean; - declare function lte(v1: string | SemVer, v2: string | SemVer, loose?: boolean): boolean; - declare function eq(v1: string | SemVer, v2: string | SemVer, loose?: boolean): boolean; - declare function neq(v1: string | SemVer, v2: string | SemVer, loose?: boolean): boolean; - declare function cmp(v1: string | SemVer, comparator: Operator, v2: string | SemVer, loose?: boolean): boolean; - declare function compare(v1: string | SemVer, v2: string | SemVer, loose?: boolean): -1 | 0 | 1; - declare function rcompare(v1: string | SemVer, v2: string | SemVer, loose?: boolean): -1 | 0 | 1; - declare function compareLoose(v1: string | SemVer, v2: string | SemVer): -1 | 0 | 1; - declare function diff(v1: string | SemVer, v2: string | SemVer): ?Release; - declare function sort(list: Array, loose?: boolean): Array; - declare function rsort(list: Array, loose?: boolean): Array; - declare function compareIdentifiers(v1: string | SemVer, v2: string | SemVer): -1 | 0 | 1; - declare function rcompareIdentifiers(v1: string | SemVer, v2: string | SemVer): -1 | 0 | 1; - - // Ranges - declare function validRange(range: string | Range, loose?: boolean): string | null; - declare function satisfies(version: string | SemVer, range: string | Range, loose?: boolean): boolean; - declare function maxSatisfying(versions: Array, range: string | Range, loose?: boolean): string | SemVer | null; - declare function gtr(version: string | SemVer, range: string | Range, loose?: boolean): boolean; - declare function ltr(version: string | SemVer, range: string | Range, loose?: boolean): boolean; - declare function outside(version: string | SemVer, range: string | Range, hilo: '>' | '<', loose?: boolean): boolean; - - // Not explicitly documented, or deprecated - declare function parse(version: string, loose?: boolean): ?SemVer; - declare function toComparators(range: string | Range, loose?: boolean): Array>; -} diff --git a/flow-typed/npm/smoothscroll-polyfill_v0.x.x.js b/flow-typed/npm/smoothscroll-polyfill_v0.x.x.js deleted file mode 100644 index d973f9eaf0..0000000000 --- a/flow-typed/npm/smoothscroll-polyfill_v0.x.x.js +++ /dev/null @@ -1,8 +0,0 @@ -// flow-typed signature: f5d1cd32fd86e3c7b132d220e88b3454 -// flow-typed version: 463c76ef0c/smoothscroll-polyfill_v0.x.x/flow_>=v0.47.x - -declare module "smoothscroll-polyfill" { - declare module.exports: { - polyfill: () => void - }; -} diff --git a/flow-typed/npm/strip-ansi_v3.x.x.js b/flow-typed/npm/strip-ansi_v3.x.x.js deleted file mode 100644 index d36b7653a6..0000000000 --- a/flow-typed/npm/strip-ansi_v3.x.x.js +++ /dev/null @@ -1,6 +0,0 @@ -// flow-typed signature: 8b05dd8048f5193e21269eab58859283 -// flow-typed version: 94e9f7e0a4/strip-ansi_v3.x.x/flow_>=v0.28.x - -declare module 'strip-ansi' { - declare module.exports: (input: string) => string; -} diff --git a/flow-typed/npm/strip-json-comments_v2.x.x.js b/flow-typed/npm/strip-json-comments_v2.x.x.js deleted file mode 100644 index 6650343790..0000000000 --- a/flow-typed/npm/strip-json-comments_v2.x.x.js +++ /dev/null @@ -1,9 +0,0 @@ -// flow-typed signature: 355bccb70c51fc8f5126d5130c2ff1de -// flow-typed version: b43dff3e0e/strip-json-comments_v2.x.x/flow_>=v0.25.x - -declare module 'strip-json-comments' { - declare module.exports: ( - input: string, - options?: { whitespace: boolean } - ) => string; -} diff --git a/flow-typed/npm/tabbable_v3.x.x.js b/flow-typed/npm/tabbable_v3.x.x.js deleted file mode 100644 index 1b7eedea33..0000000000 --- a/flow-typed/npm/tabbable_v3.x.x.js +++ /dev/null @@ -1,19 +0,0 @@ -// flow-typed signature: 1ab336c579b3b3d661207ff1f9f28311 -// flow-typed version: a0c55e127f/tabbable_v3.x.x/flow_>=v0.54.x - -declare module 'tabbable' { - declare type TabbableOptions = {| - includeContainer?: ?boolean, - |}; - - declare interface UntouchabilityChecker { - hasDisplayNone(node: Node, nodeComputedStyle: any): boolean; - isUntouchable(node: Node): boolean; - } - - declare module.exports: { - (el: Node, options?: ?TabbableOptions): Array, - isTabbable(node: Node, untouchabilityChecker?: ?UntouchabilityChecker): boolean, - isFocusable(node: Node, untouchabilityChecker?: ?UntouchabilityChecker): boolean, - }; -} diff --git a/flow-typed/npm/uuid_v3.x.x.js b/flow-typed/npm/uuid_v3.x.x.js deleted file mode 100644 index bf8d507b36..0000000000 --- a/flow-typed/npm/uuid_v3.x.x.js +++ /dev/null @@ -1,102 +0,0 @@ -// flow-typed signature: 3cf668e64747095cab0bb360cf2fb34f -// flow-typed version: d659bd0cb8/uuid_v3.x.x/flow_>=v0.32.x - -declare module "uuid" { - declare class uuid { - static ( - options?: {| - random?: number[], - rng?: () => number[] | Buffer - |}, - buffer?: number[] | Buffer, - offset?: number - ): string, - - static v1( - options?: {| - node?: number[], - clockseq?: number, - msecs?: number | Date, - nsecs?: number - |}, - buffer?: number[] | Buffer, - offset?: number - ): string, - - static v4( - options?: {| - random?: number[], - rng?: () => number[] | Buffer - |}, - buffer?: number[] | Buffer, - offset?: number - ): string - } - declare module.exports: Class; -} - -declare module "uuid/v1" { - declare class v1 { - static ( - options?: {| - node?: number[], - clockseq?: number, - msecs?: number | Date, - nsecs?: number - |}, - buffer?: number[] | Buffer, - offset?: number - ): string - } - - declare module.exports: Class; -} - -declare module "uuid/v3" { - declare class v3 { - static ( - name?: string | number[], - namespace?: string | number[], - buffer?: number[] | Buffer, - offset?: number - ): string, - - static name: string, - static DNS: string, - static URL: string - } - - declare module.exports: Class; -} - -declare module "uuid/v4" { - declare class v4 { - static ( - options?: {| - random?: number[], - rng?: () => number[] | Buffer - |}, - buffer?: number[] | Buffer, - offset?: number - ): string - } - - declare module.exports: Class; -} - -declare module "uuid/v5" { - declare class v5 { - static ( - name?: string | number[], - namespace?: string | number[], - buffer?: number[] | Buffer, - offset?: number - ): string, - - static name: string, - static DNS: string, - static URL: string - } - - declare module.exports: Class; -} diff --git a/flow-typed/npm/xterm_v3.x.x.js b/flow-typed/npm/xterm_v3.x.x.js deleted file mode 100644 index d8a4002467..0000000000 --- a/flow-typed/npm/xterm_v3.x.x.js +++ /dev/null @@ -1,258 +0,0 @@ -// flow-typed signature: 648842eba230bb7a0960d21a0dc2fe5e -// flow-typed version: d94fd329cc/xterm_v3.x.x/flow_>=v0.56.x - -declare module "xterm" { - declare export type FontWeight = - | "normal" - | "bold" - | "100" - | "200" - | "300" - | "400" - | "500" - | "600" - | "700" - | "800" - | "900"; - - declare export type Theme = $Shape<{ - foreground: string, - background: string, - cursor: string, - cursorAccent: string, - selection: string, - black: string, - red: string, - green: string, - yellow: string, - blue: string, - magenta: string, - cyan: string, - white: string, - brightBlack: string, - brightRed: string, - brightGreen: string, - brightYellow: string, - brightBlue: string, - brightMagenta: string, - brightCyan: string, - brightWhite: string - }>; - - declare export type TerminalOptions = $Shape<{ - allowTransparency: boolean, - bellSound: string, - bellStyle: "none" | "sound", - cols: number, - cursorBlink: boolean, - cursorStyle: "block" | "underline" | "bar", - disableStdin: boolean, - enableBold: boolean, - fontSize: number, - fontFamily: string, - fontWeight: FontWeight, - fontWeightBold: FontWeight, - letterSpacing: number, - lineHeight: number, - macOptionIsMeta: boolean, - rightClickSelectsWord: boolean, - rows: number, - screenReaderMode: boolean, - scrollback: number, - tabStopWidth: number, - theme: Theme, - }>; - - declare export type LinkMatcherOptions = $Shape<{ - matchIndex: number, - validationCallback: ( - uri: string, - callback: (isValid: boolean) => void - ) => void, - tooltipCallback: (event: MouseEvent, uri: string) => boolean | void, - leaveCallback: (event: MouseEvent, uri: string) => boolean | void, - priority: number, - willLinkActivate: (event: MouseEvent, uri: string) => boolean - }>; - - declare export type Disposable = {| - dispose(): void - |}; - - declare export type Marker = {| - ...Disposable, - +id: number, - +isDisposed: boolean, - +line: number - |}; - - declare export type LocalizableStrings = {| - blankLine: string, - promptLabel: string, - tooMuchOutput: string - |}; - - declare export class Terminal { - element: HTMLElement; - textarea: HTMLTextAreaElement; - rows: number; - cols: number; - markers: Marker[]; - static strings: LocalizableStrings; - constructor(options?: TerminalOptions): Terminal; - blur(): void; - focus(): void; - on( - type: "blur" | "focus" | "linefeed" | "selection", - listener: () => void - ): void; - on(type: "data", listener: (...args: any[]) => void): void; - on( - type: "key", - listener: (key?: string, event?: KeyboardEvent) => void - ): void; - on( - type: "keypress" | "keydown", - listener: (event?: KeyboardEvent) => void - ): void; - on( - type: "refresh", - listener: (data?: { start: number, end: number }) => void - ): void; - on( - type: "resize", - listener: (data?: { cols: number, rows: number }) => void - ): void; - on(type: "scroll", listener: (ydisp?: number) => void): void; - on(type: "title", listener: (title?: string) => void): void; - on(type: string, listener: (...args: any[]) => void): void; - off( - type: | "blur" - | "focus" - | "linefeed" - | "selection" - | "data" - | "key" - | "keypress" - | "keydown" - | "refresh" - | "resize" - | "scroll" - | "title" - | string, - listener: (...args: any[]) => void - ): void; - emit(type: string, data?: any): void; - addDisposableListener( - type: string, - handler: (...args: any[]) => void - ): Disposable; - resize(columns: number, rows: number): void; - writeln(data: string): void; - open(parent: HTMLElement): void; - attachCustomKeyEventHandler( - customKeyEventHandler: (event: KeyboardEvent) => boolean - ): void; - registerLinkMatcher( - regex: RegExp, - handler: (event: MouseEvent, uri: string) => void, - options?: LinkMatcherOptions - ): number; - deregisterLinkMatcher(matcherId: number): void; - addMarker(cursorYOffset: number): Marker; - hasSelection(): boolean; - getSelection(): string; - clearSelection(): void; - selectAll(): void; - selectLines(start: number, end: number): void; - destroy(): void; - scrollLines(amount: number): void; - scrollPages(pageCount: number): void; - scrollToTop(): void; - scrollToBottom(): void; - scrollToLine(line: number): void; - clear(): void; - write(data: string): void; - getOption( - key: | "bellSound" - | "bellStyle" - | "cursorStyle" - | "fontFamily" - | "fontWeight" - | "fontWeightBold" - | "termName" - ): string; - getOption( - key: | "allowTransparency" - | "cancelEvents" - | "convertEol" - | "cursorBlink" - | "debug" - | "disableStdin" - | "enableBold" - | "macOptionIsMeta" - | "rightClickSelectsWord" - | "popOnBell" - | "screenKeys" - | "useFlowControl" - | "visualBell" - ): boolean; - getOption(key: "colors"): Array; - getOption( - key: | "cols" - | "fontSize" - | "letterSpacing" - | "lineHeight" - | "rows" - | "tabStopWidth" - | "scrollback" - ): number; - getOption(key: "handler"): (data: string) => void; - getOption(key: string): any; - setOption( - key: "fontFamily" | "termName" | "bellSound", - value: string - ): void; - setOption(key: "fontWeight" | "fontWeightBold", value: ?FontWeight): void; - setOption( - key: "bellStyle", - value: null | "none" | "visual" | "sound" | "both" - ): void; - setOption( - key: "cursorStyle", - value: null | "block" | "underline" | "bar" - ): void; - setOption( - key: | "allowTransparency" - | "cancelEvents" - | "convertEol" - | "cursorBlink" - | "debug" - | "disableStdin" - | "enableBold" - | "macOptionIsMeta" - | "popOnBell" - | "rightClickSelectsWord" - | "screenKeys" - | "useFlowControl" - | "visualBell", - value: boolean - ): void; - setOption(key: "colors", value: Array): void; - setOption( - key: | "fontSize" - | "letterSpacing" - | "lineHeight" - | "tabStopWidth" - | "scrollback", - value: number - ): void; - setOption(key: "handler", value: (data: string) => void): void; - setOption(key: "theme", value: Theme): void; - setOption(key: "cols" | "rows", value: number): void; - setOption(key: string, value: any): void; - refresh(start: number, end: number): void; - reset(): void; - static applyAddon(addon: any): void; - } -} diff --git a/jest/__atom_tests__/builtin-modules-test.js b/jest/__atom_tests__/builtin-modules-test.js index e52eed4b52..548c8a8b25 100644 --- a/jest/__atom_tests__/builtin-modules-test.js +++ b/jest/__atom_tests__/builtin-modules-test.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,14 +7,15 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ test('pass', () => { const atom = require('atom'); + const electron = require('electron'); expect(atom).toBeDefined(); expect(electron).toBeDefined(); -}); +}); \ No newline at end of file diff --git a/jest/__atom_tests__/fake_timers-test.js b/jest/__atom_tests__/fake_timers-test.js index 99ad2cebf4..52f917ddab 100644 --- a/jest/__atom_tests__/fake_timers-test.js +++ b/jest/__atom_tests__/fake_timers-test.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,7 +7,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ @@ -13,4 +15,4 @@ test('fake timers are not available yet', () => { expect(() => { jest.useFakeTimers(); }).toThrow('fakeTimers are not supproted in atom environment'); -}); +}); \ No newline at end of file diff --git a/jest/__atom_tests__/sample-1-test.js b/jest/__atom_tests__/sample-1-test.js index c6b7235afb..5ae6515df4 100644 --- a/jest/__atom_tests__/sample-1-test.js +++ b/jest/__atom_tests__/sample-1-test.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,10 +7,10 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict + * strict * @format * @emails oncall+nuclide */ test('atom', () => { expect(1).toBe(1); -}); +}); \ No newline at end of file diff --git a/jest/__atom_tests__/sample-2-test.js b/jest/__atom_tests__/sample-2-test.js index d110983e04..877a4481b8 100644 --- a/jest/__atom_tests__/sample-2-test.js +++ b/jest/__atom_tests__/sample-2-test.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,10 +7,10 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict + * strict * @format * @emails oncall+nuclide */ test('atom', () => { expect(3).toBe(3); -}); +}); \ No newline at end of file diff --git a/jest/__mocks__/emptyObject.js b/jest/__mocks__/emptyObject.js index 6978cae610..56e804697b 100644 --- a/jest/__mocks__/emptyObject.js +++ b/jest/__mocks__/emptyObject.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,9 +7,8 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict + * strict * @format */ - // eslint-disable-next-line nuclide-internal/no-commonjs -module.exports = {}; +module.exports = {}; \ No newline at end of file diff --git a/jest/__mocks__/log4js.js b/jest/__mocks__/log4js.js index a83144064a..1303f060a9 100644 --- a/jest/__mocks__/log4js.js +++ b/jest/__mocks__/log4js.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.getLogger = void 0; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,11 +12,10 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict + * strict * @format */ - -const logger: log4js$Logger = { +const logger = { debug: jest.fn(), error: jest.fn(), fatal: jest.fn(), @@ -22,15 +28,16 @@ const logger: log4js$Logger = { removeLevel: jest.fn(), setLevel: jest.fn(), trace: jest.fn(), - warn: jest.fn(), + warn: jest.fn() }; -export const getLogger = (name: string): log4js$Logger => logger; +const getLogger = name => logger; +exports.getLogger = getLogger; const log4js = { getLogger, // $FlowFixMe - configure: jest.fn(), + configure: jest.fn() }; - -export default log4js; +var _default = log4js; +exports.default = _default; \ No newline at end of file diff --git a/jest/__mocks__/nuclide-commons/analytics.js b/jest/__mocks__/nuclide-commons/analytics.js index ccc212dba3..baefeab4c7 100644 --- a/jest/__mocks__/nuclide-commons/analytics.js +++ b/jest/__mocks__/nuclide-commons/analytics.js @@ -1,3 +1,11 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.trackTiming = trackTiming; +exports.trackSampled = exports.trackTimingSampled = exports.setRawAnalyticsService = exports.trackImmediate = exports.startTracking = exports.track = void 0; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,33 +13,30 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ - -export function trackTiming( - eventName: string, - operation: () => T, - values?: {[key: string]: any} = {}, -): T { +function trackTiming(eventName, operation, values = {}) { return operation(); } -export const track: any = jest.fn(); +const track = jest.fn(); +exports.track = track; -export const startTracking = () => { - const timingTracker: any = { +const startTracking = () => { + const timingTracker = { onError: jest.fn(), - onSuccess: jest.fn(), + onSuccess: jest.fn() }; - return timingTracker; }; -export const trackImmediate: any = jest.fn(); - -export const setRawAnalyticsService: any = jest.fn(); - -export const trackTimingSampled: any = jest.fn((event, fn) => fn()); - -export const trackSampled: any = jest.fn(); +exports.startTracking = startTracking; +const trackImmediate = jest.fn(); +exports.trackImmediate = trackImmediate; +const setRawAnalyticsService = jest.fn(); +exports.setRawAnalyticsService = setRawAnalyticsService; +const trackTimingSampled = jest.fn((event, fn) => fn()); +exports.trackTimingSampled = trackTimingSampled; +const trackSampled = jest.fn(); +exports.trackSampled = trackSampled; \ No newline at end of file diff --git a/jest/__tests__/jest_mock_utils-test.js b/jest/__tests__/jest_mock_utils-test.js index 522f301609..3fa4b38277 100644 --- a/jest/__tests__/jest_mock_utils-test.js +++ b/jest/__tests__/jest_mock_utils-test.js @@ -1,3 +1,15 @@ +"use strict"; + +function _jest_mock_utils() { + const data = require("../jest_mock_utils"); + + _jest_mock_utils = function () { + return data; + }; + + return data; +} + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,30 +17,32 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ -import {getMock, mockFunction} from '../jest_mock_utils'; - test('mocks function', () => { - const obj = {a: () => 'hey'}; + const obj = { + a: () => 'hey' + }; expect(obj.a()).toBe('hey'); - mockFunction(obj, 'a', () => 'pizza'); + (0, _jest_mock_utils().mockFunction)(obj, 'a', () => 'pizza'); expect(obj.a()).toBe('pizza'); }); - test('get mock', () => { - const obj = {a: arg => 'hey'}; - mockFunction(obj, 'a', () => 'pizza'); - const mock = getMock(obj.a); + const obj = { + a: arg => 'hey' + }; + (0, _jest_mock_utils().mockFunction)(obj, 'a', () => 'pizza'); + const mock = (0, _jest_mock_utils().getMock)(obj.a); expect(mock).toHaveProperty('_isMockFunction', true); mock.mockImplementation(() => 'whiskey'); expect(obj.a('taco')).toBe('whiskey'); expect(mock.mock.calls[0][0]).toBe('taco'); }); - test('get mock throws when used on a non-mock fn', () => { - const obj = {a: () => {}}; - expect(() => getMock(obj.a)).toThrowError('is not a mock'); -}); + const obj = { + a: () => {} + }; + expect(() => (0, _jest_mock_utils().getMock)(obj.a)).toThrowError('is not a mock'); +}); \ No newline at end of file diff --git a/jest/__tests__/nuclide_e2e_package_deps-test.js b/jest/__tests__/nuclide_e2e_package_deps-test.js index 0006fecbb4..0504aa2393 100644 --- a/jest/__tests__/nuclide_e2e_package_deps-test.js +++ b/jest/__tests__/nuclide_e2e_package_deps-test.js @@ -1,3 +1,11 @@ +"use strict"; + +var _child_process = require("child_process"); + +var _path = _interopRequireDefault(require("path")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,43 +13,36 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format * @emails oncall+nuclide */ /* eslint-disable nuclide-internal/consistent-import-name */ +const THIRD_PARTY_DIR = _path.default.resolve(__dirname, '../third_party'); -import {execSync} from 'child_process'; -import path from 'path'; +const TAR_PATH = _path.default.join(THIRD_PARTY_DIR, 'apm_deps.tar.gz'); -const THIRD_PARTY_DIR = path.resolve(__dirname, '../third_party'); -const TAR_PATH = path.join(THIRD_PARTY_DIR, 'apm_deps.tar.gz'); - -const NUCLIDE_PACKAGE_JSON = path.resolve(__dirname, '../../package.json'); +const NUCLIDE_PACKAGE_JSON = _path.default.resolve(__dirname, '../../package.json'); const depsInsideTar = () => { - const output = String(execSync(`tar tf ${TAR_PATH}`)); - return Array.from( - new Set( - output - .split('\n') - .map(line => line.split('/')[0]) - .filter(Boolean), - ), - ); -}; - -// We need to have APM dependencies installed for Nuclide E2E tests, but there + const output = String((0, _child_process.execSync)(`tar tf ${TAR_PATH}`)); + return Array.from(new Set(output.split('\n').map(line => line.split('/')[0]).filter(Boolean))); +}; // We need to have APM dependencies installed for Nuclide E2E tests, but there // is no offline mirror for it that we can use (like we do with Yarn). So we // create a .tar with all the deps and check it into the repo so we can reuse it // in our sandcastle build (see package_apm_deps.js). This test ensures that // the list of packages does not get out of sync with package.json dependencies + + test('the list of packed deps matches what is in package.json', () => { // $FlowFixMe dynamic require const nuclidePkgJson = require(NUCLIDE_PACKAGE_JSON); + expect(nuclidePkgJson).toHaveProperty('package-deps'); - const {'package-deps': packageDeps} = nuclidePkgJson; + const { + 'package-deps': packageDeps + } = nuclidePkgJson; const packageDepsInTar = depsInsideTar(); expect(packageDeps.sort()).toEqual(packageDepsInTar.sort()); -}); +}); \ No newline at end of file diff --git a/jest/__tests__/waits_for-test.js b/jest/__tests__/waits_for-test.js index 95d695d1a1..588a732ed0 100644 --- a/jest/__tests__/waits_for-test.js +++ b/jest/__tests__/waits_for-test.js @@ -1,3 +1,17 @@ +"use strict"; + +function _waits_for() { + const data = _interopRequireWildcard(require("../waits_for")); + + _waits_for = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,65 +19,46 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ -import waitsFor, {waitsForAsync} from '../waits_for'; - it('waits', async () => { let condition = false; - Promise.resolve().then(() => (condition = true)); - await waitsFor(() => condition); + Promise.resolve().then(() => condition = true); + await (0, _waits_for().default)(() => condition); }); - it("can't wait anymore", async () => { - await expect(waitsFor(() => false, undefined, 1)).rejects.toThrow( - 'but it never did', - ); + await expect((0, _waits_for().default)(() => false, undefined, 1)).rejects.toThrow('but it never did'); }); - it('gives a message', async () => { - await expect(waitsFor(() => false, 'lol', 1)).rejects.toThrow('lol'); + await expect((0, _waits_for().default)(() => false, 'lol', 1)).rejects.toThrow('lol'); }); - it('waits an async predicate', async () => { - const fn = jest - .fn() - .mockImplementationOnce( - () => new Promise(res => setTimeout(() => res(false))), - ) - .mockImplementationOnce( - () => new Promise(res => setTimeout(() => res(true))), - ) - .mockImplementationOnce( - () => new Promise(res => setTimeout(() => res(false))), - ); - - await waitsFor(() => fn()); + const fn = jest.fn().mockImplementationOnce(() => new Promise(res => setTimeout(() => res(false)))).mockImplementationOnce(() => new Promise(res => setTimeout(() => res(true)))).mockImplementationOnce(() => new Promise(res => setTimeout(() => res(false)))); + await (0, _waits_for().default)(() => fn()); expect(fn).toHaveBeenCalledTimes(2); }); - it('returns a value', async () => { let someVar; - setTimeout(() => (someVar = 'hello'), 200); - const value: string = await waitsFor(() => someVar); + setTimeout(() => someVar = 'hello', 200); + const value = await (0, _waits_for().default)(() => someVar); expect(value).toBe('hello'); }); - it('returns value from a promise', async () => { let someVar; - setTimeout(() => (someVar = 'hello'), 200); - const value: string = await waitsForAsync(() => Promise.resolve(someVar)); + setTimeout(() => someVar = 'hello', 200); + const value = await (0, _waits_for().waitsForAsync)(() => Promise.resolve(someVar)); expect(value).toBe('hello'); }); - test('stack trace points to the callsite, not the implementation', async () => { - const fail = () => waitsFor(() => false, 'yea', 1); + const fail = () => (0, _waits_for().default)(() => false, 'yea', 1); + expect.assertions(1); + try { await fail(); } catch (e) { expect(e.stack).not.toMatch(/waits_for\.js/); } -}); +}); \ No newline at end of file diff --git a/jest/jest_mock_utils.js b/jest/jest_mock_utils.js index 2fd4fc1e19..15a720efdf 100644 --- a/jest/jest_mock_utils.js +++ b/jest/jest_mock_utils.js @@ -5,25 +5,30 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ - 'use strict'; -export const mockFunction = , TReturn>( - obj: Object, - propName: string, - mockImplementation?: (...TArgs) => TReturn, -) => { - const mock: JestMockFn = jest.fn(mockImplementation); +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getMock = exports.mockFunction = void 0; + +const mockFunction = (obj, propName, mockImplementation) => { + const mock = jest.fn(mockImplementation); obj[propName] = mock; return mock; }; -export const getMock = (fn: Function): JestMockFn => { +exports.mockFunction = mockFunction; + +const getMock = fn => { if (!fn._isMockFunction) { throw new Error('Passed function is not a mock'); } + return fn; }; + +exports.getMock = getMock; \ No newline at end of file diff --git a/jest/setup.js b/jest/setup.js index 6a1beef424..5ab0ee8e3d 100644 --- a/jest/setup.js +++ b/jest/setup.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,11 +7,10 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict + * strict * @format */ - -jest.mock('nuclide-commons/analytics'); +jest.mock("../modules/nuclide-commons/analytics"); jest.mock('log4js'); if (process.env.SANDCASTLE != null) { @@ -19,4 +20,4 @@ if (process.env.SANDCASTLE != null) { jest.retryTimes(2); } -global.NUCLIDE_DO_NOT_LOG = true; +global.NUCLIDE_DO_NOT_LOG = true; \ No newline at end of file diff --git a/jest/setupTestFrameworkScriptFile.atom.js b/jest/setupTestFrameworkScriptFile.atom.js index 8d36966bdb..4f00568a7f 100644 --- a/jest/setupTestFrameworkScriptFile.atom.js +++ b/jest/setupTestFrameworkScriptFile.atom.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,13 +7,13 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format */ - beforeEach(async () => { await global.atom.reset(); -}); +}); // Disable prompt to download react devtools in atom tests -// Disable prompt to download react devtools in atom tests -window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = {isDisabled: true}; +window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = { + isDisabled: true +}; \ No newline at end of file diff --git a/jest/setupTestFrameworkScriptFile.node.js b/jest/setupTestFrameworkScriptFile.node.js index d7f4ed5606..3dcbd44410 100644 --- a/jest/setupTestFrameworkScriptFile.node.js +++ b/jest/setupTestFrameworkScriptFile.node.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,8 +7,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format */ - -jest.setTimeout(10000); +jest.setTimeout(10000); \ No newline at end of file diff --git a/jest/waits_for.js b/jest/waits_for.js index b47f70ccbe..1aeb89c3b9 100644 --- a/jest/waits_for.js +++ b/jest/waits_for.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.waitsForAsync = exports.default = void 0; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,10 +12,9 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ - // remove references to this file from stack trace, so we can get // a nice code frame in test failures that looks like this: // 60 | @@ -20,53 +26,44 @@ const removeImplementationFromStackTrace = e => { const regexp = new RegExp(`\\s+at waitsFor.*${__filename}.*\\n`); e.stack = e.stack.replace(regexp, '\n'); }; - /* * Async implementation of Jasmine's waitsFor() */ -const waitsFor = async ( - fn: () => ?T, - message?: string | (() => string), - timeout: number = global[Symbol.for('WAITS_FOR_TIMEOUT')] || 4500, -): Promise => { - const errorMessage = - (message != null - ? typeof message === 'function' - ? message() - : message - : 'Expected the function to start returning "true" but it never did.') + - ` Timeout = ${timeout}`; - // Error must be created right away, so we keep the stack trace. + + +const waitsFor = async (fn, message, timeout = global[Symbol.for('WAITS_FOR_TIMEOUT')] || 4500) => { + const errorMessage = (message != null ? typeof message === 'function' ? message() : message : 'Expected the function to start returning "true" but it never did.') + ` Timeout = ${timeout}`; // Error must be created right away, so we keep the stack trace. // (we would lose it if we threw it from a promise/async loop) + const error = new Error(errorMessage); removeImplementationFromStackTrace(error); - const startTime = Date.now(); - let returnValue; - // eslint-disable-next-line no-await-in-loop - while (!Boolean((returnValue = await fn()))) { + let returnValue; // eslint-disable-next-line no-await-in-loop + + while (!Boolean(returnValue = await fn())) { if (Date.now() - startTime > timeout) { throw error; - } - // eslint-disable-next-line no-await-in-loop + } // eslint-disable-next-line no-await-in-loop + + await new Promise(resolve => setTimeout(resolve, 40)); } if (returnValue == null) { throw new Error('value must be present'); } + return returnValue; }; -export default waitsFor; - -// Same function but flow compatible with returning a promise +var _default = waitsFor; // Same function but flow compatible with returning a promise // from the passed fn -export const waitsForAsync = async ( - fn: () => Promise, - message?: string, - timeout?: number, -): Promise => { + +exports.default = _default; + +const waitsForAsync = async (fn, message, timeout) => { const result = await waitsFor(fn, message, timeout); return result; }; + +exports.waitsForAsync = waitsForAsync; \ No newline at end of file diff --git a/lib/ActivateGKFeatures.js b/lib/ActivateGKFeatures.js index adef975e97..00abdab9eb 100644 --- a/lib/ActivateGKFeatures.js +++ b/lib/ActivateGKFeatures.js @@ -1,3 +1,32 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _passesGK() { + const data = require("../modules/nuclide-commons/passesGK"); + + _passesGK = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,7 +34,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ @@ -18,18 +47,12 @@ * * Now, the package will only load and activate if the GK is enabled. */ - -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {onceGkInitialized, isGkEnabled} from 'nuclide-commons/passesGK'; - // May use: "!my_gk_name:gk:nuclide" to avoid activating the package when the GK passes. const GK_HOOK_RE = /^(!?)([\w-]+):gk:nuclide$/; -export default class ActivateGKFeatures { - _subscriptions: UniversalDisposable; - +class ActivateGKFeatures { constructor() { - this._subscriptions = new UniversalDisposable(); + this._subscriptions = new (_UniversalDisposable().default)(); const boundOnGKInitialized = this._onGKInitialized.bind(this); @@ -37,7 +60,7 @@ export default class ActivateGKFeatures { // call in next tick to more closely simulate what's happening in the normal case process.nextTick(boundOnGKInitialized); } else { - this._subscriptions.add(onceGkInitialized(boundOnGKInitialized)); + this._subscriptions.add((0, _passesGK().onceGkInitialized)(boundOnGKInitialized)); } } @@ -48,11 +71,14 @@ export default class ActivateGKFeatures { if (pack.metadata.nuclide != null) { for (const hookName of pack.getActivationHooks()) { const match = hookName.match(GK_HOOK_RE); + if (match == null) { continue; } + const [, isNegated, gkName] = match; - if (atom.inSpecMode() || isGkEnabled(gkName) === !isNegated) { + + if (atom.inSpecMode() || (0, _passesGK().isGkEnabled)(gkName) === !isNegated) { usedGKNames.add(hookName); } } @@ -67,4 +93,7 @@ export default class ActivateGKFeatures { dispose() { this._subscriptions.dispose(); } + } + +exports.default = ActivateGKFeatures; \ No newline at end of file diff --git a/lib/ReactDevPerfMonitor.js b/lib/ReactDevPerfMonitor.js index 2efc74139e..ef6605ef92 100644 --- a/lib/ReactDevPerfMonitor.js +++ b/lib/ReactDevPerfMonitor.js @@ -1,3 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _nuclideAnalytics() { + const data = require("../modules/nuclide-analytics"); + + _nuclideAnalytics = function () { + return data; + }; + + return data; +} + +function _observableDom() { + const data = require("../modules/nuclide-commons-ui/observable-dom"); + + _observableDom = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,29 +44,18 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format */ /* eslint-env browser */ -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {trackSampled} from '../modules/nuclide-analytics'; -import {PerformanceObservable} from 'nuclide-commons-ui/observable-dom'; - const REACT_EMOJI = '\u269B'; const WARNING_EMOJI = '\u26D4'; - const SAMPLE_RATE = 20; -const STALL_THRESHOLD_MS = 30; - -// parse "mount" from '\u269B MarkedStringSnippet [mount]' -const LIFECYCLE_RE = new RegExp( - `(${REACT_EMOJI}|${WARNING_EMOJI}) (\\S+) \\[(\\S+)\\]`, -); -const METHOD_RE = new RegExp( - `(${REACT_EMOJI}|${WARNING_EMOJI}) (\\S+)\\.(\\S+)$`, -); +const STALL_THRESHOLD_MS = 30; // parse "mount" from '\u269B MarkedStringSnippet [mount]' +const LIFECYCLE_RE = new RegExp(`(${REACT_EMOJI}|${WARNING_EMOJI}) (\\S+) \\[(\\S+)\\]`); +const METHOD_RE = new RegExp(`(${REACT_EMOJI}|${WARNING_EMOJI}) (\\S+)\\.(\\S+)$`); /** * Monitor important measurements while React renders out components. * The only reasonable way to do this is patching performance.measure as React @@ -39,54 +67,45 @@ const METHOD_RE = new RegExp( * events in that case. */ -export default class ReactDevPerfMonitor { - _disposable: UniversalDisposable; - +class ReactDevPerfMonitor { constructor() { - this._disposable = new UniversalDisposable( - new PerformanceObservable({entryTypes: ['measure']}) - .mergeMap(list => list.getEntries()) - .filter( - entry => - (entry.name.startsWith(REACT_EMOJI) || - entry.name.startsWith(WARNING_EMOJI)) && - entry.name[2] !== '(', // high-level react processes aren't interesting - ) - .map(entry => { - let component; - let lifecycle; - let method; - const lifecycleResult = entry.name.match(LIFECYCLE_RE); - const methodResult = entry.name.match(METHOD_RE); - if (lifecycleResult) { - [component, lifecycle] = lifecycleResult.slice(2); - } else if (methodResult) { - [component, method] = methodResult.slice(2); - } - - return { - duration: entry.duration.toString(), - eventName: entry.name.slice(2), // remove the emoji - component, - lifecycle, - method, - }; - }) - .subscribe(trackEntry => { - trackSampled( - 'react-performance', - // We always want to track long renders as their insight is valuable, so set - // their sample rate to 1. - // In reporting, weight faster renders at SAMPLE_RATE*x their value to - // continue to get accurate reporting. - Number(trackEntry.duration) >= STALL_THRESHOLD_MS ? 1 : SAMPLE_RATE, - trackEntry, - ); - }), - ); + this._disposable = new (_UniversalDisposable().default)(new (_observableDom().PerformanceObservable)({ + entryTypes: ['measure'] + }).mergeMap(list => list.getEntries()).filter(entry => (entry.name.startsWith(REACT_EMOJI) || entry.name.startsWith(WARNING_EMOJI)) && entry.name[2] !== '(' // high-level react processes aren't interesting + ).map(entry => { + let component; + let lifecycle; + let method; + const lifecycleResult = entry.name.match(LIFECYCLE_RE); + const methodResult = entry.name.match(METHOD_RE); + + if (lifecycleResult) { + [component, lifecycle] = lifecycleResult.slice(2); + } else if (methodResult) { + [component, method] = methodResult.slice(2); + } + + return { + duration: entry.duration.toString(), + eventName: entry.name.slice(2), + // remove the emoji + component, + lifecycle, + method + }; + }).subscribe(trackEntry => { + (0, _nuclideAnalytics().trackSampled)('react-performance', // We always want to track long renders as their insight is valuable, so set + // their sample rate to 1. + // In reporting, weight faster renders at SAMPLE_RATE*x their value to + // continue to get accurate reporting. + Number(trackEntry.duration) >= STALL_THRESHOLD_MS ? 1 : SAMPLE_RATE, trackEntry); + })); } dispose() { this._disposable.dispose(); } + } + +exports.default = ReactDevPerfMonitor; \ No newline at end of file diff --git a/lib/installDevTools.js b/lib/installDevTools.js index 6fbb96f91c..f401c2a259 100644 --- a/lib/installDevTools.js +++ b/lib/installDevTools.js @@ -1,3 +1,58 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = installDevTools; + +var _electron = _interopRequireDefault(require("electron")); + +var _os = _interopRequireDefault(require("os")); + +function _nuclideUri() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +var _fs = _interopRequireDefault(require("fs")); + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _ReactDevPerfMonitor() { + const data = _interopRequireDefault(require("./ReactDevPerfMonitor")); + + _ReactDevPerfMonitor = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,32 +60,17 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ +const extensionIDsToLoad = [// React DevTools +'fmkadmapgofadopljbjfkapdkoienihi']; // eslint-disable-next-line no-console -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; - -import electron from 'electron'; -import invariant from 'assert'; -import os from 'os'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import fs from 'fs'; -import nullthrows from 'nullthrows'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import ReactDevPerfMonitor from './ReactDevPerfMonitor'; - -const extensionIDsToLoad = [ - // React DevTools - 'fmkadmapgofadopljbjfkapdkoienihi', -]; - -// eslint-disable-next-line no-console const log = console.debug || console.log; - let installed; -export default function installDevTools(): IDisposable { - const disposable = new UniversalDisposable(new ReactDevPerfMonitor()); + +function installDevTools() { + const disposable = new (_UniversalDisposable().default)(new (_ReactDevPerfMonitor().default)()); if (installed) { return disposable; @@ -38,55 +78,35 @@ export default function installDevTools(): IDisposable { const chromeHome = getChromeHomeDir(); const profileDirs = getProfileDirs(chromeHome); - nullthrows(electron.webFrame).registerURLSchemeAsBypassingCSP( - 'chrome-extension', - ); - const remote = nullthrows(electron.remote); + (0, _nullthrows().default)(_electron.default.webFrame).registerURLSchemeAsBypassingCSP('chrome-extension'); + const remote = (0, _nullthrows().default)(_electron.default.remote); for (const extensionID of extensionIDsToLoad) { remote.BrowserWindow.removeDevToolsExtension(extensionID); - const extensionVersions = getVersionDirsForExtension( - profileDirs, - extensionID, - ); + const extensionVersions = getVersionDirsForExtension(profileDirs, extensionID); if (extensionVersions == null || extensionVersions.length === 0) { - log( - `Unable to load extension ${extensionID}. Make sure it is installed in one of your Chrome profiles.`, - ); + log(`Unable to load extension ${extensionID}. Make sure it is installed in one of your Chrome profiles.`); continue; } - const namesWithTimes = extensionVersions.map(dirname => ({ - ...fs.statSync(dirname), - dirname, + const namesWithTimes = extensionVersions.map(dirname => Object.assign({}, _fs.default.statSync(dirname), { + dirname })); - const latest = namesWithTimes.sort((a, b) => a.mtimeMs - b.mtimeMs)[0]; - let latestManifest: ?{name: string}; + let latestManifest; + try { - latestManifest = JSON.parse( - fs.readFileSync( - nuclideUri.join(latest.dirname, 'manifest.json'), - 'utf-8', - ), - ); + latestManifest = JSON.parse(_fs.default.readFileSync(_nuclideUri().default.join(latest.dirname, 'manifest.json'), 'utf-8')); } catch (e) { - log( - `Unable to read or parse a valid manifest for extension ${extensionID}`, - ); + log(`Unable to read or parse a valid manifest for extension ${extensionID}`); } if (latest != null && latestManifest != null) { try { remote.BrowserWindow.addDevToolsExtension(latest.dirname); - log( - `Successfully loaded Chrome extension "${latestManifest.name} - ${ - latest.dirname - }"`, - ); - } catch (e) { - // the above call to `addDevToolsExtension` seems to frequently throw after + log(`Successfully loaded Chrome extension "${latestManifest.name} - ${latest.dirname}"`); + } catch (e) {// the above call to `addDevToolsExtension` seems to frequently throw after // a recent Electron upgrade, despite the extension actually being added } } @@ -96,38 +116,34 @@ export default function installDevTools(): IDisposable { return disposable; } -function getChromeHomeDir(): NuclideUri { +function getChromeHomeDir() { switch (process.platform) { case 'darwin': - return nuclideUri.join( - os.homedir(), - 'Library', - 'Application Support', - 'Google', - 'Chrome', - ); + return _nuclideUri().default.join(_os.default.homedir(), 'Library', 'Application Support', 'Google', 'Chrome'); + case 'win32': - invariant(process.env.LOCALAPPDATA != null); - return nuclideUri.join( - process.env.LOCALAPPDATA, - 'Google', - 'Chrome', - 'User Data', - ); + if (!(process.env.LOCALAPPDATA != null)) { + throw new Error("Invariant violation: \"process.env.LOCALAPPDATA != null\""); + } + + return _nuclideUri().default.join(process.env.LOCALAPPDATA, 'Google', 'Chrome', 'User Data'); + default: - return nuclideUri.join(os.homedir(), '.config', 'google-chrome'); + return _nuclideUri().default.join(_os.default.homedir(), '.config', 'google-chrome'); } } -function getProfileDirs(chromeHome: NuclideUri) { - const profileDirs = [nuclideUri.join(chromeHome, 'Default')]; - +function getProfileDirs(chromeHome) { + const profileDirs = [_nuclideUri().default.join(chromeHome, 'Default')]; let done; let profileNum = 1; + while (!done) { try { - const profilePath = nuclideUri.join(chromeHome, `Profile ${profileNum}`); - fs.statSync(profilePath); + const profilePath = _nuclideUri().default.join(chromeHome, `Profile ${profileNum}`); + + _fs.default.statSync(profilePath); + profileDirs.push(profilePath); profileNum++; } catch (e) { @@ -138,21 +154,13 @@ function getProfileDirs(chromeHome: NuclideUri) { return profileDirs; } -function getVersionDirsForExtension( - profileDirs: Array, - extensionID: string, -): ?Array { +function getVersionDirsForExtension(profileDirs, extensionID) { for (const profileDir of profileDirs) { - const extensionPath = nuclideUri.join( - profileDir, - 'Extensions', - extensionID, - ); + const extensionPath = _nuclideUri().default.join(profileDir, 'Extensions', extensionID); + try { - return fs - .readdirSync(extensionPath) - .filter(base => !base.startsWith('.')) // Remove .DS_Store and others - .map(base => nuclideUri.join(extensionPath, base)); + return _fs.default.readdirSync(extensionPath).filter(base => !base.startsWith('.')) // Remove .DS_Store and others + .map(base => _nuclideUri().default.join(extensionPath, base)); } catch (e) {} } -} +} \ No newline at end of file diff --git a/lib/installErrorReporter.js b/lib/installErrorReporter.js index 140f03db50..c4410f6486 100644 --- a/lib/installErrorReporter.js +++ b/lib/installErrorReporter.js @@ -1,3 +1,32 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = installErrorReporter; + +function _log4js() { + const data = require("log4js"); + + _log4js = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,88 +34,71 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ - -import {getLogger} from 'log4js'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; - let disposable; -export default function installErrorReporter(): IDisposable { +function installErrorReporter() { if (disposable != null) { throw new Error('installErrorReporter was called multiple times.'); } - window.addEventListener('unhandledrejection', onUnhandledRejection); - disposable = new UniversalDisposable( - atom.onWillThrowError(onUnhandledException), - atom.notifications.onDidAddNotification(handleAtomNotification), - () => { - window.removeEventListener('unhandledrejection', onUnhandledRejection); - disposable = null; - }, - ); + window.addEventListener('unhandledrejection', onUnhandledRejection); + disposable = new (_UniversalDisposable().default)(atom.onWillThrowError(onUnhandledException), atom.notifications.onDidAddNotification(handleAtomNotification), () => { + window.removeEventListener('unhandledrejection', onUnhandledRejection); + disposable = null; + }); return disposable; } function onUnhandledException(event) { try { - getLogger('installErrorReporter').error( - `Caught unhandled exception: ${event.message}`, - event.originalError, - ); - } catch (e) { - // Ensure we don't recurse forever. Even under worst case scenarios. + (0, _log4js().getLogger)('installErrorReporter').error(`Caught unhandled exception: ${event.message}`, event.originalError); + } catch (e) {// Ensure we don't recurse forever. Even under worst case scenarios. } } function onUnhandledRejection(event) { try { - getLogger('installErrorReporter').error( - 'Caught unhandled rejection', - event.reason, - ); - } catch (e) { - // Ensure we don't recurse forever. Even under worst case scenarios. + (0, _log4js().getLogger)('installErrorReporter').error('Caught unhandled rejection', event.reason); + } catch (e) {// Ensure we don't recurse forever. Even under worst case scenarios. } } -function isNuclideInCallStack(callStack: Array) { +function isNuclideInCallStack(callStack) { const ignoreCallSitesFromThisFile = callSite => { const fileName = callSite.getFileName(); return fileName != null && !fileName.includes('installErrorReporter.js'); }; - const containsNuclideWord = callSite => - callSite - .toString() - .toLowerCase() - .includes('nuclide'); - - return callStack - .filter(ignoreCallSitesFromThisFile) - .some(containsNuclideWord); + + const containsNuclideWord = callSite => callSite.toString().toLowerCase().includes('nuclide'); + + return callStack.filter(ignoreCallSitesFromThisFile).some(containsNuclideWord); } -function handleAtomNotification(notification: atom$Notification) { +function handleAtomNotification(notification) { // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) if (notification.type !== 'error' && notification.type !== 'fatal') { return; } const error = Error(notification.getMessage()); - const {stack} = notification.getOptions(); + const { + stack + } = notification.getOptions(); + if (typeof stack === 'string' && stack) { error.stack = stack; } else { // This will exclude handleAtomNotification from the stack. Error.captureStackTrace(error, handleAtomNotification); - } + } // $FlowFixMe: getRawStack() is missing from Error() + - // $FlowFixMe: getRawStack() is missing from Error() const rawStack = error.getRawStack(); + if (rawStack == null || isNuclideInCallStack(rawStack)) { - getLogger('atom-error-notification').error(error); + (0, _log4js().getLogger)('atom-error-notification').error(error); } -} +} \ No newline at end of file diff --git a/lib/main.js b/lib/main.js index 89301f0ed5..6463e19cf4 100644 --- a/lib/main.js +++ b/lib/main.js @@ -1,3 +1,220 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.handleURI = exports.serialize = exports.deactivate = exports.activate = exports.config = void 0; + +function _monkeyPatchProjectConfigs() { + const data = _interopRequireDefault(require("./monkeyPatchProjectConfigs")); + + _monkeyPatchProjectConfigs = function () { + return data; + }; + + return data; +} + +require("./preload-dependencies"); + +function _nuclideUri() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _promise() { + const data = require("../modules/nuclide-commons/promise"); + + _promise = function () { + return data; + }; + + return data; +} + +function _FeatureLoader() { + const data = _interopRequireDefault(require("../modules/nuclide-commons-atom/FeatureLoader")); + + _FeatureLoader = function () { + return data; + }; + + return data; +} + +function _ActivateGKFeatures() { + const data = _interopRequireDefault(require("./ActivateGKFeatures")); + + _ActivateGKFeatures = function () { + return data; + }; + + return data; +} + +function _featureConfig() { + const data = _interopRequireDefault(require("../modules/nuclide-commons-atom/feature-config")); + + _featureConfig = function () { + return data; + }; + + return data; +} + +var _fs = _interopRequireDefault(require("fs")); + +var _electron = _interopRequireDefault(require("electron")); + +var _path = _interopRequireDefault(require("path")); + +function _atomPackageDeps() { + const data = require("atom-package-deps"); + + _atomPackageDeps = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _semver() { + const data = _interopRequireDefault(require("semver")); + + _semver = function () { + return data; + }; + + return data; +} + +function _log4js() { + const data = _interopRequireDefault(require("log4js")); + + _log4js = function () { + return data; + }; + + return data; +} + +function _installErrorReporter() { + const data = _interopRequireDefault(require("./installErrorReporter")); + + _installErrorReporter = function () { + return data; + }; + + return data; +} + +function _installDevTools() { + const data = _interopRequireDefault(require("./installDevTools")); + + _installDevTools = function () { + return data; + }; + + return data; +} + +function _package() { + const data = _interopRequireDefault(require("../package.json")); + + _package = function () { + return data; + }; + + return data; +} + +function _deepLink() { + const data = require("../pkg/commons-atom/deep-link"); + + _deepLink = function () { + return data; + }; + + return data; +} + +function _nuclideLogging() { + const data = require("../pkg/nuclide-logging"); + + _nuclideLogging = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _featureGroups() { + const data = _interopRequireDefault(require("./featureGroups.json")); + + _featureGroups = function () { + return data; + }; + + return data; +} + +function _dompurify() { + const data = _interopRequireDefault(require("dompurify")); + + _dompurify = function () { + return data; + }; + + return data; +} + +function _patchAtomTextEditor() { + const data = _interopRequireDefault(require("./patchAtomTextEditor")); + + _patchAtomTextEditor = function () { + return data; + }; + + return data; +} + +function _menuUtils() { + const data = require("../modules/nuclide-commons/menuUtils"); + + _menuUtils = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,7 +222,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ @@ -18,136 +235,120 @@ * |__| | \| | | | |___ |__/ | | | |___ | \_ | | |__] |___ * */ - -import type {Feature} from 'nuclide-commons-atom/FeatureLoader'; - -import monkeyPatchProjectConfigs from './monkeyPatchProjectConfigs'; -import './preload-dependencies'; - -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {sleep} from 'nuclide-commons/promise'; -import FeatureLoader from 'nuclide-commons-atom/FeatureLoader'; -import ActivateGKFeatures from './ActivateGKFeatures'; -import featureConfig from 'nuclide-commons-atom/feature-config'; -import fs from 'fs'; -import invariant from 'assert'; -import electron from 'electron'; // eslint-disable-next-line nuclide-internal/prefer-nuclide-uri -import path from 'path'; -import {install as atomPackageDepsInstall} from 'atom-package-deps'; -import nullthrows from 'nullthrows'; -import semver from 'semver'; -import log4js from 'log4js'; - -import installErrorReporter from './installErrorReporter'; -import installDevTools from './installDevTools'; -import nuclidePackageJson from '../package.json'; -import {sendDeepLink} from '../pkg/commons-atom/deep-link'; -import {initializeLogging, getDefaultConfig} from '../pkg/nuclide-logging'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import pubFeatureGroups from './featureGroups.json'; -import createDOMPurify from 'dompurify'; -import patchAtomTextEditor from './patchAtomTextEditor'; -import {sortMenuGroups} from 'nuclide-commons/menuUtils'; - // Monkeypatch project APIs into Atom. This can be removed after this functionality has been // upstreamed, i.e. when `atom.project.replace()` and `atom.project.getSpecification()` are // available. -monkeyPatchProjectConfigs(); +(0, _monkeyPatchProjectConfigs().default)(); + +let featureGroups = _featureGroups().default; -let featureGroups = pubFeatureGroups; try { // $eslint-disable-next-line $FlowFB - const fbFeatureGroups = require('./fb-featureGroups.json'); + const fbFeatureGroups = require("./fb-featureGroups.json"); + featureGroups = mergeFeatureGroups(featureGroups, fbFeatureGroups); } catch (e) {} -const domPurify = createDOMPurify(); - -// The minimum version of Atom required to run Nuclide. Anything less than this and users will get +const domPurify = (0, _dompurify().default)(); // The minimum version of Atom required to run Nuclide. Anything less than this and users will get // a redbox and Nuclide will not activate. -const MINIMUM_SUPPORTED_ATOM_VERSION = '1.28.0'; -// Install the error reporting even before Nuclide is activated. -let errorReporterDisposable = installErrorReporter(); -// Install the logger config before Nuclide is activated. -initializeLogging(); +const MINIMUM_SUPPORTED_ATOM_VERSION = '1.28.0'; // Install the error reporting even before Nuclide is activated. -const {remote} = electron; -invariant(remote != null); +let errorReporterDisposable = (0, _installErrorReporter().default)(); // Install the logger config before Nuclide is activated. + +(0, _nuclideLogging().initializeLogging)(); +const { + remote +} = _electron.default; + +if (!(remote != null)) { + throw new Error("Invariant violation: \"remote != null\""); +} const baseConfig = { installRecommendedPackages: { default: false, - description: - 'On start up, check for and install Atom packages recommended for use with Nuclide. The' + - " list of packages can be found in the package-deps setting in this package's" + - ' "package.json" file. Disabling this setting will not uninstall packages it previously' + - ' installed. Restart Atom after changing this setting for it to take effect.', + description: 'On start up, check for and install Atom packages recommended for use with Nuclide. The' + " list of packages can be found in the package-deps setting in this package's" + ' "package.json" file. Disabling this setting will not uninstall packages it previously' + ' installed. Restart Atom after changing this setting for it to take effect.', title: 'Install Recommended Packages on Startup', type: 'boolean', - order: 0, + order: 0 }, useLocalRpc: { default: !atom.inSpecMode(), - description: - 'Use a RPC process for local services. This ensures better compatibility between the local' + - ' and remote case and improves local performance. Requires restart to take' + - ' effect.', + description: 'Use a RPC process for local services. This ensures better compatibility between the local' + ' and remote case and improves local performance. Requires restart to take' + ' effect.', title: 'Use RPC for local services.', type: 'boolean', - order: 0, - }, -}; + order: 0 + } +}; // Nuclide packages for Atom are called "features" -// Nuclide packages for Atom are called "features" -const FEATURES_DIR = path.join(__dirname, '../pkg'); -const features: Array = []; +const FEATURES_DIR = _path.default.join(__dirname, '../pkg'); +const features = []; /** * Get the "package.json" of all the features. */ -fs.readdirSync(FEATURES_DIR).forEach(item => { + +_fs.default.readdirSync(FEATURES_DIR).forEach(item => { // Optimization: Our directories don't have periods - this must be a file if (item.indexOf('.') !== -1) { return; } - const featurePath = path.join(FEATURES_DIR, item); - const filename = path.join(featurePath, 'package.json'); + + const featurePath = _path.default.join(FEATURES_DIR, item); + + const filename = _path.default.join(featurePath, 'package.json'); + let src; + try { - src = fs.readFileSync(filename, 'utf8'); + src = _fs.default.readFileSync(filename, 'utf8'); } catch (err) { if (err && (err.code === 'ENOENT' || err.code === 'ENOTDIR')) { return; } + throw err; - } - // Optimization: Avoid JSON parsing if it can't reasonably be an Atom package + } // Optimization: Avoid JSON parsing if it can't reasonably be an Atom package + + if (src.indexOf('"AtomPackage"') === -1) { return; } + const pkg = JSON.parse(src); + if (pkg.nuclide && pkg.nuclide.packageType === 'AtomPackage') { - invariant(pkg.name); + if (!pkg.name) { + throw new Error("Invariant violation: \"pkg.name\""); + } + features.push({ pkg, - path: featurePath, + path: featurePath }); } -}); +}); // atom-ide-ui packages are a lot more consistent. + -// atom-ide-ui packages are a lot more consistent. function addFeature(directory, name) { - const featurePath = path.join(directory, name); - const filename = path.join(featurePath, 'package.json'); + const featurePath = _path.default.join(directory, name); + + const filename = _path.default.join(featurePath, 'package.json'); + try { - const src = fs.readFileSync(filename, 'utf8'); + const src = _fs.default.readFileSync(filename, 'utf8'); + const pkg = JSON.parse(src); - invariant(pkg.name); + + if (!pkg.name) { + throw new Error("Invariant violation: \"pkg.name\""); + } + features.push({ pkg, - path: featurePath, + path: featurePath }); } catch (err) { if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { @@ -156,259 +357,242 @@ function addFeature(directory, name) { } } -const MODULES_DIR = path.join(__dirname, '../modules'); -const ATOM_IDE_DIR = path.join(MODULES_DIR, 'atom-ide-ui/pkg'); +const MODULES_DIR = _path.default.join(__dirname, '../modules'); -fs.readdirSync(ATOM_IDE_DIR).forEach(name => addFeature(ATOM_IDE_DIR, name)); -fs.readdirSync(MODULES_DIR) - .filter(name => name.startsWith('atom-ide-debugger-')) - .forEach(name => addFeature(MODULES_DIR, name)); +const ATOM_IDE_DIR = _path.default.join(MODULES_DIR, 'atom-ide-ui/pkg'); -const shouldInitialize = ensureAtomVersion(); +_fs.default.readdirSync(ATOM_IDE_DIR).forEach(name => addFeature(ATOM_IDE_DIR, name)); + +_fs.default.readdirSync(MODULES_DIR).filter(name => name.startsWith('atom-ide-debugger-')).forEach(name => addFeature(MODULES_DIR, name)); +const shouldInitialize = ensureAtomVersion(); let featureLoader; if (shouldInitialize) { - featureLoader = new FeatureLoader({ - path: path.resolve(__dirname, '..'), + featureLoader = new (_FeatureLoader().default)({ + path: _path.default.resolve(__dirname, '..'), features, - featureGroups, + featureGroups }); featureLoader.load(); } -export const config = shouldInitialize - ? {...baseConfig, ...nullthrows(featureLoader).getConfig()} - : undefined; - +const config = shouldInitialize ? Object.assign({}, baseConfig, (0, _nullthrows().default)(featureLoader).getConfig()) : undefined; +exports.config = config; let disposables; + function _activate() { // These need to be re-activated after de-activation. if (errorReporterDisposable == null) { - errorReporterDisposable = installErrorReporter(); - log4js.configure(getDefaultConfig()); - } + errorReporterDisposable = (0, _installErrorReporter().default)(); - disposables = new UniversalDisposable(); - if (process.env.SANDCASTLE == null) { - disposables.add(installDevTools()); + _log4js().default.configure((0, _nuclideLogging().getDefaultConfig)()); } - // TODO(T31782876): Remove once fixed upstream in Atom + disposables = new (_UniversalDisposable().default)(); + + if (process.env.SANDCASTLE == null) { + disposables.add((0, _installDevTools().default)()); + } // TODO(T31782876): Remove once fixed upstream in Atom // https://github.com/atom/atom/pull/17702 - patchAtomTextEditor(); - - // Add the "Nuclide" menu, if it's not there already. - disposables.add( - atom.menu.add([ - { - // On Windows, menu labels have an & before a letter to indicate which - // ALT key combination maps to that menu. In our case, Alt+N should open - // the Nuclide menu. - label: process.platform === 'win32' ? '&Nuclide' : 'Nuclide', - submenu: [ - { - label: `Version ${nuclidePackageJson.version}`, - enabled: false, - }, - ], - }, - { - label: process.platform === 'win32' ? '&Go' : 'Go', - // an empty submenu is required to manipulate its position below - submenu: [], - }, - ]), - ); - - // Manually manipulate the menu template order. - const insertIndex = atom.menu.template.findIndex( - item => item.role === 'window' || item.role === 'help', - ); + + + (0, _patchAtomTextEditor().default)(); // Add the "Nuclide" menu, if it's not there already. + + disposables.add(atom.menu.add([{ + // On Windows, menu labels have an & before a letter to indicate which + // ALT key combination maps to that menu. In our case, Alt+N should open + // the Nuclide menu. + label: process.platform === 'win32' ? '&Nuclide' : 'Nuclide', + submenu: [{ + label: `Version ${_package().default.version}`, + enabled: false + }] + }, { + label: process.platform === 'win32' ? '&Go' : 'Go', + // an empty submenu is required to manipulate its position below + submenu: [] + }])); // Manually manipulate the menu template order. + + const insertIndex = atom.menu.template.findIndex(item => item.role === 'window' || item.role === 'help'); + if (insertIndex !== -1) { - const nuclideIndex = atom.menu.template.findIndex( - item => item.label === 'Nuclide', - ); + const nuclideIndex = atom.menu.template.findIndex(item => item.label === 'Nuclide'); const menuItem = atom.menu.template.splice(nuclideIndex, 1)[0]; const newIndex = insertIndex > nuclideIndex ? insertIndex - 1 : insertIndex; atom.menu.template.splice(newIndex, 0, menuItem); atom.menu.update(); } - const goInsertIndex = atom.menu.template.findIndex( - item => item.label === 'Packages', - ); + const goInsertIndex = atom.menu.template.findIndex(item => item.label === 'Packages'); + if (goInsertIndex !== -1) { const goIndex = atom.menu.template.findIndex(item => item.label === 'Go'); const menuItem = atom.menu.template.splice(goIndex, 1)[0]; - const newIndex = - goInsertIndex > goIndex ? goInsertIndex - 1 : goInsertIndex; + const newIndex = goInsertIndex > goIndex ? goInsertIndex - 1 : goInsertIndex; atom.menu.template.splice(newIndex, 0, menuItem); atom.menu.update(); - } - - // Remove all remote directories up front to prevent packages from using remote URIs + } // Remove all remote directories up front to prevent packages from using remote URIs // before they are ready. The nuclide-remote-projects package manually // serializes/deserializes and then reloads these during the activation phase. - atom.project.setPaths( - atom.project.getPaths().filter(uri => !nuclideUri.isRemote(uri)), - ); - // Activate all of the loaded features. Technically, this will be a no-op + + atom.project.setPaths(atom.project.getPaths().filter(uri => !_nuclideUri().default.isRemote(uri))); // Activate all of the loaded features. Technically, this will be a no-op // generally because Atom [will activate all loaded packages][1]. However, // that won't happen, for example, with our `activateAllPackages()` // integration test helper. // // [1]: https://github.com/atom/atom/blob/v1.9.0/src/package-manager.coffee#L425 - featureLoader.activate(); - // Activate packages with GK hooks. - disposables.add(new ActivateGKFeatures()); + featureLoader.activate(); // Activate packages with GK hooks. - // Install public, 3rd-party Atom packages listed in this package's 'package-deps' setting. Run + disposables.add(new (_ActivateGKFeatures().default)()); // Install public, 3rd-party Atom packages listed in this package's 'package-deps' setting. Run // this *after* other packages are activated so they can modify this setting if desired before // installation is attempted. - if (featureConfig.get('installRecommendedPackages')) { + + if (_featureConfig().default.get('installRecommendedPackages')) { // Workaround for restoring multiple Atom windows. This prevents having all // the windows trying to install the deps at the same time - often clobbering // each other's install. const firstWindowId = remote.BrowserWindow.getAllWindows()[0].id; const currentWindowId = remote.getCurrentWindow().id; + if (firstWindowId === currentWindowId) { - atomPackageDepsInstall('nuclide', /* promptUser */ false); + (0, _atomPackageDeps().install)('nuclide', + /* promptUser */ + false); } } const menusToSort = ['Nuclide', 'View']; - disposables.add( - atom.packages.onDidActivateInitialPackages(() => { - sortMenuGroups(menusToSort); - invariant(disposables != null); - disposables.add( - atom.packages.onDidActivatePackage(() => { - sortMenuGroups(menusToSort); - }), - ); - }), - ); + disposables.add(atom.packages.onDidActivateInitialPackages(() => { + (0, _menuUtils().sortMenuGroups)(menusToSort); + if (!(disposables != null)) { + throw new Error("Invariant violation: \"disposables != null\""); + } + + disposables.add(atom.packages.onDidActivatePackage(() => { + (0, _menuUtils().sortMenuGroups)(menusToSort); + })); + })); patchNotificationManager(); } function patchNotificationManager() { - const {addNotification} = atom.notifications; - - // Patch the notification functions to make sure they only display cleaned + const { + addNotification + } = atom.notifications; // Patch the notification functions to make sure they only display cleaned // HTML output. // $FlowIgnore - property not writeable - atom.notifications.addNotification = (notification: atom$Notification) => { + + atom.notifications.addNotification = notification => { // $FlowIgnore - internal property notification.message = domPurify.sanitize(notification.message, { - FORBID_TAGS: ['style'], + FORBID_TAGS: ['style'] }); return addNotification.bind(atom.notifications)(notification); }; } -function mergeFeatureGroups( - firstGroup: {[string]: Array}, - secondGroup: {[string]: Array}, -): {[string]: Array} { +function mergeFeatureGroups(firstGroup, secondGroup) { const mergedObject = {}; + for (const key in firstGroup) { - mergedObject[key] = [ - ...(firstGroup[key] || []), - ...(secondGroup[key] || []), - ]; + mergedObject[key] = [...(firstGroup[key] || []), ...(secondGroup[key] || [])]; } + for (const key in secondGroup) { - mergedObject[key] = [ - ...(firstGroup[key] || []), - ...(secondGroup[key] || []), - ]; + mergedObject[key] = [...(firstGroup[key] || []), ...(secondGroup[key] || [])]; } + return mergedObject; } -function _deactivate(): Promise { - invariant(disposables != null); +function _deactivate() { + if (!(disposables != null)) { + throw new Error("Invariant violation: \"disposables != null\""); + } + featureLoader.deactivate(); disposables.dispose(); disposables = null; - invariant(errorReporterDisposable != null); + + if (!(errorReporterDisposable != null)) { + throw new Error("Invariant violation: \"errorReporterDisposable != null\""); + } + errorReporterDisposable.dispose(); errorReporterDisposable = null; - return Promise.race([ - // Prevent Atom from exiting until log4js shutdown completes. - new Promise(resolve => log4js.shutdown(resolve)), - // But guard against log4js misbehaving. - sleep(1000), - ]); + return Promise.race([// Prevent Atom from exiting until log4js shutdown completes. + new Promise(resolve => _log4js().default.shutdown(resolve)), // But guard against log4js misbehaving. + (0, _promise().sleep)(1000)]); } function _serialize() { featureLoader.serialize(); } -function _handleURI({pathname, query}: url$urlObject, uri: string): void { +function _handleURI({ + pathname, + query +}, uri) { if (pathname == null || pathname === '') { atom.notifications.addError(`Invalid URI ${uri}: must have a path.`); return; } - const message = pathname.substr(1); - // Atom waits for Nuclide to initialize before sending the URI through. + const message = pathname.substr(1); // Atom waits for Nuclide to initialize before sending the URI through. // So, at this point it should be fairly safe to delegate to nuclide-deep-link. - sendDeepLink(remote.getCurrentWindow(), message, query || {}); + + (0, _deepLink().sendDeepLink)(remote.getCurrentWindow(), message, query || {}); } function ensureAtomVersion() { - if (semver.lt(atom.getVersion(), MINIMUM_SUPPORTED_ATOM_VERSION)) { - const notification = atom.notifications.addError( - '**Atom Upgrade Required**', - { - description: - `Nuclide requires Atom ${MINIMUM_SUPPORTED_ATOM_VERSION}. **All of its functionality will` + - ' be disabled until you upgrade.**', - dismissable: true, - buttons: [ - { - text: 'Quit Atom', - className: 'icon icon-stop', - onDidClick() { - atom.commands.dispatch( - atom.views.getView(atom.workspace), - 'application:quit', - ); - }, - }, - { - text: 'Continue without Nuclide', - className: 'nuclide-min-atom-button', - onDidClick() { - notification.dismiss(); - }, - }, - ], - }, - ); - // Hide the normal close button so that people need to use our custom button to close (and are + if (_semver().default.lt(atom.getVersion(), MINIMUM_SUPPORTED_ATOM_VERSION)) { + const notification = atom.notifications.addError('**Atom Upgrade Required**', { + description: `Nuclide requires Atom ${MINIMUM_SUPPORTED_ATOM_VERSION}. **All of its functionality will` + ' be disabled until you upgrade.**', + dismissable: true, + buttons: [{ + text: 'Quit Atom', + className: 'icon icon-stop', + + onDidClick() { + atom.commands.dispatch(atom.views.getView(atom.workspace), 'application:quit'); + } + + }, { + text: 'Continue without Nuclide', + className: 'nuclide-min-atom-button', + + onDidClick() { + notification.dismiss(); + } + + }] + }); // Hide the normal close button so that people need to use our custom button to close (and are // hopefully, as a result, more aware of what we're saying). Unfortunately, Atom doesn't provide // access to this view so we have to find it. + const continueButton = document.querySelector('.nuclide-min-atom-button'); - const notificationEl = - continueButton && continueButton.closest('atom-notification'); - const closeButton = - notificationEl && notificationEl.querySelector('.close'); + const notificationEl = continueButton && continueButton.closest('atom-notification'); + const closeButton = notificationEl && notificationEl.querySelector('.close'); + if (closeButton != null) { closeButton.style.display = 'none'; } + return false; } + return true; } -export const activate = shouldInitialize ? _activate : undefined; -export const deactivate = shouldInitialize ? _deactivate : undefined; -export const serialize = shouldInitialize ? _serialize : undefined; -export const handleURI = shouldInitialize ? _handleURI : undefined; +const activate = shouldInitialize ? _activate : undefined; +exports.activate = activate; +const deactivate = shouldInitialize ? _deactivate : undefined; +exports.deactivate = deactivate; +const serialize = shouldInitialize ? _serialize : undefined; +exports.serialize = serialize; +const handleURI = shouldInitialize ? _handleURI : undefined; +exports.handleURI = handleURI; \ No newline at end of file diff --git a/lib/monkeyPatchProjectConfigs.js b/lib/monkeyPatchProjectConfigs.js index f07ec76c0f..2536c62c2e 100644 --- a/lib/monkeyPatchProjectConfigs.js +++ b/lib/monkeyPatchProjectConfigs.js @@ -1,3 +1,32 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = monkeyPatchProjectConfigs; + +function _isPlainObject2() { + const data = _interopRequireDefault(require("lodash/isPlainObject")); + + _isPlainObject2 = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,46 +34,45 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ - // TODO: Remove this file once `atom.project.replace()` and `atom.project.getSpecification()` have // been upstreamed. https://github.com/atom/atom/pull/16845. - // $eslint-disable-next-line -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {isPlainObject} from 'lodash'; - let currentProjectSpec; -export default function monkeyPatchProjectConfigs() { +function monkeyPatchProjectConfigs() { if (atom.project.replace == null) { updateConfigGet(); addConfigResetProjectSettings(); addReplace(); addGettersAndEvents(); - } - - // `atom.project.replace()` may be present but only look for `config` in the top level. We want to + } // `atom.project.replace()` may be present but only look for `config` in the top level. We want to // support it nested in an "atom" key too (for portability). // TODO: Remove this once it's upstreamed. + + const replaceProject = atom.project.replace; + if (replaceProject != null) { atom.project.replace = projectSpecification => { - let formatted = {...projectSpecification}; - if ((formatted: any).atom != null) { - formatted = {...formatted, ...(formatted: any).atom}; + let formatted = Object.assign({}, projectSpecification); + + if (formatted.atom != null) { + formatted = Object.assign({}, formatted, formatted.atom); delete formatted.atom; } + currentProjectSpec = formatted; return replaceProject.call(atom.project, formatted); }; - } - - // TODO: Upstream this and remove it here. + } // TODO: Upstream this and remove it here. // $FlowIgnore: Add this to our typedefs once upstreamed. + + const getProjectSpecification = atom.project.getSpecification; + if (getProjectSpecification == null) { // $FlowIgnore: Add this to our typedefs once upstreamed. atom.project.getSpecification = () => currentProjectSpec; @@ -60,28 +88,24 @@ const addReplace = () => { } else { if (projectSpecification.originPath == null) { return; - } + } // If no path is specified, set to directory of originPath. + - // If no path is specified, set to directory of originPath. if (!Array.isArray(projectSpecification.paths)) { - projectSpecification.paths = [ - nuclideUri.dirname(projectSpecification.originPath), - ]; - } - // $FlowIgnore - atom.config.resetProjectSettings( - projectSpecification.config, - projectSpecification.originPath, - ); + projectSpecification.paths = [_nuclideUri().default.dirname(projectSpecification.originPath)]; + } // $FlowIgnore + + + atom.config.resetProjectSettings(projectSpecification.config, projectSpecification.originPath); // $FlowIgnore - // $FlowIgnore atom.project.setPaths(projectSpecification.paths); - } - // $FlowIgnore + } // $FlowIgnore + + atom.project.emitter.emit('did-replace', projectSpecification); - }; + }; // $FlowIgnore + - // $FlowIgnore atom.project.onDidReplace = callback => { // $FlowIgnore return atom.project.emitter.on('did-replace', callback); @@ -98,32 +122,27 @@ const addGettersAndEvents = () => { const updateConfigGet = () => { // $FlowIgnore - atom.config.projectFile = null; - // $FlowIgnore - atom.config.projectSettings = {}; + atom.config.projectFile = null; // $FlowIgnore + + atom.config.projectSettings = {}; // $FlowIgnore - // $FlowIgnore atom.config.getRawValue = (keyPath, options = {}) => { let value; - if ( - !options.excludeSources || - // $FlowIgnore - !options.excludeSources.includes(atom.config.mainSource) - ) { + + if (!options.excludeSources || // $FlowIgnore + !options.excludeSources.includes(atom.config.mainSource)) { // $FlowIgnore - value = getValueAtKeyPath(atom.config.settings, keyPath); - // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) + value = getValueAtKeyPath(atom.config.settings, keyPath); // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) + if (atom.config.projectFile != null) { - const projectValue = getValueAtKeyPath( - // $FlowIgnore - atom.config.projectSettings, - keyPath, - ); + const projectValue = getValueAtKeyPath( // $FlowIgnore + atom.config.projectSettings, keyPath); value = projectValue === undefined ? value : projectValue; } } let defaultValue; + if (!options.sources || options.sources.length === 0) { defaultValue = getValueAtKeyPath(atom.config.defaultSettings, keyPath); } @@ -131,27 +150,25 @@ const updateConfigGet = () => { if (value != null) { // $FlowIgnore value = atom.config.deepClone(value); - if (isPlainObject(value) && isPlainObject(defaultValue)) { + + if ((0, _isPlainObject2().default)(value) && (0, _isPlainObject2().default)(defaultValue)) { // $FlowIgnore atom.config.deepDefaults(value, defaultValue); } + return value; } else { // $FlowIgnore return atom.config.deepClone(defaultValue); } - }; - // $FlowIgnore + }; // $FlowIgnore + + atom.config.setRawValue = (keyPath, value, options = {}) => { const source = options.source ? options.source : undefined; - const settingsToChange = - // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) - source === atom.config.projectFile ? 'projectSettings' : 'settings'; - - const defaultValue = getValueAtKeyPath( - atom.config.defaultSettings, - keyPath, - ); + const settingsToChange = // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) + source === atom.config.projectFile ? 'projectSettings' : 'settings'; + const defaultValue = getValueAtKeyPath(atom.config.defaultSettings, keyPath); if (isEqual(defaultValue, value)) { if (keyPath != null) { @@ -169,20 +186,24 @@ const updateConfigGet = () => { // $FlowIgnore atom.config[settingsToChange] = value; } - } - // $FlowIgnore + } // $FlowIgnore + + return atom.config.emitChangeEvent(); - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.get = (...args) => { let keyPath; let options; let scope; + if (args.length > 1) { if (typeof args[0] === 'string' || args[0] == null) { [keyPath, options] = args; - ({scope} = options); + ({ + scope + } = options); } } else { [keyPath] = args; @@ -190,38 +211,33 @@ const updateConfigGet = () => { if (scope != null) { // $FlowIgnore - const value = atom.config.getRawScopedValue(scope, keyPath, options); - // $FlowIgnore + const value = atom.config.getRawScopedValue(scope, keyPath, options); // $FlowIgnore + return value != null ? value : atom.config.getRawValue(keyPath, options); } else { // $FlowIgnore return atom.config.getRawValue(keyPath, options); } - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.set = (...args) => { // eslint-disable-next-line - let [keyPath, value, options = {}] = args; - // $FlowIgnore + let [keyPath, value, options = {}] = args; // $FlowIgnore + if (!atom.config.settingsLoaded) { // $FlowIgnore - atom.config.pendingOperations.push(() => - atom.config.set(keyPath, value, options), - ); + atom.config.pendingOperations.push(() => atom.config.set(keyPath, value, options)); } const scopeSelector = options.scopeSelector; let source = options.source; + const shouldSave = options.save != null ? options.save : true; // $FlowIgnore - const shouldSave = options.save != null ? options.save : true; - - // $FlowIgnore if (source && !scopeSelector && source !== atom.config.projectFile) { - throw new Error( - "::set with a 'source' and no 'sourceSelector' is not yet implemented!", - ); + throw new Error("::set with a 'source' and no 'sourceSelector' is not yet implemented!"); } + if (source == null) { // $FlowIgnore source = atom.config.mainSource; @@ -241,123 +257,103 @@ const updateConfigGet = () => { atom.config.setRawScopedValue(keyPath, value, source, scopeSelector); } else { // $FlowIgnore - atom.config.setRawValue(keyPath, value, {source}); + atom.config.setRawValue(keyPath, value, { + source + }); } - if ( - // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) - source === atom.config.mainSource && - shouldSave && - // $FlowIgnore - atom.config.settingsLoaded - ) { + if ( // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) + source === atom.config.mainSource && shouldSave && // $FlowIgnore + atom.config.settingsLoaded) { // $FlowIgnore atom.config.requestSave(); } + return true; - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.getRawScopedValue = (scopeDescriptor, keyPath, options) => { - const newScopeDescriptor = ScopeDescriptor.fromObject(scopeDescriptor); + const newScopeDescriptor = ScopeDescriptor.fromObject(scopeDescriptor); // $FlowIgnore + + const result = atom.config.scopedSettingsStore.getPropertyValue(newScopeDescriptor.getScopeChain(), keyPath, options); // $FlowIgnore + + const legacyScopeDescriptor = atom.config.getLegacyScopeDescriptorForNewScopeDescriptor(newScopeDescriptor); - // $FlowIgnore - const result = atom.config.scopedSettingsStore.getPropertyValue( - newScopeDescriptor.getScopeChain(), - keyPath, - options, - ); - // $FlowIgnore - const legacyScopeDescriptor = atom.config.getLegacyScopeDescriptorForNewScopeDescriptor( - newScopeDescriptor, - ); if (result != null) { return result; } else if (legacyScopeDescriptor) { // $FlowIgnore - return atom.config.scopedSettingsStore.getPropertyValue( - legacyScopeDescriptor.getScopeChain(), - keyPath, - options, - ); + return atom.config.scopedSettingsStore.getPropertyValue(legacyScopeDescriptor.getScopeChain(), keyPath, options); } - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.getAll = (keyPath, options = {}) => { let result; let scope; + if (options != null) { - ({scope} = options); + ({ + scope + } = options); } if (scope != null) { - const scopeDescriptor = ScopeDescriptor.fromObject(scope); - // $FlowIgnore - result = atom.config.scopedSettingsStore.getAll( - scopeDescriptor.getScopeChain(), - keyPath, - options, - ); - // $FlowIgnore - const legacyScopeDescriptor = atom.config.getLegacyScopeDescriptorForNewScopeDescriptor( - scopeDescriptor, - ); + const scopeDescriptor = ScopeDescriptor.fromObject(scope); // $FlowIgnore + + result = atom.config.scopedSettingsStore.getAll(scopeDescriptor.getScopeChain(), keyPath, options); // $FlowIgnore + + const legacyScopeDescriptor = atom.config.getLegacyScopeDescriptorForNewScopeDescriptor(scopeDescriptor); + if (legacyScopeDescriptor) { - result.push( - ...Array.from( - // $FlowIgnore - atom.config.scopedSettingsStore.getAll( - legacyScopeDescriptor.getScopeChain(), - keyPath, - options, - ) || [], - ), - ); + result.push(...Array.from( // $FlowIgnore + atom.config.scopedSettingsStore.getAll(legacyScopeDescriptor.getScopeChain(), keyPath, options) || [])); } } else { result = []; } - const globalValue = atom.config.getRawValue(keyPath, options); - // $FlowIgnore + const globalValue = atom.config.getRawValue(keyPath, options); // $FlowIgnore + if (globalValue) { - result.push({scopeSelector: '*', value: globalValue}); + result.push({ + scopeSelector: '*', + value: globalValue + }); } return result; - }; + }; // $FlowIgnore - // $FlowIgnore - atom.config.legacyScopeAliases = new Map(); - // $FlowIgnore - atom.config.setLegacyScopeAliasForNewScope = ( - languageId, - legacyScopeName, - ) => { + atom.config.legacyScopeAliases = new Map(); // $FlowIgnore + + atom.config.setLegacyScopeAliasForNewScope = (languageId, legacyScopeName) => { // $FlowIgnore atom.config.legacyScopeAliases.set(languageId, legacyScopeName); - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.removeLegacyScopeAliasForNewScope = languageId => { // $FlowIgnore atom.config.legacyScopeAliases.delete(languageId); - }; - // $FlowIgnore + }; // $FlowIgnore + + atom.config.getLegacyScopeDescriptorForNewScopeDescriptor = scopeDescriptor => { - const newScopeDescriptor = ScopeDescriptor.fromObject(scopeDescriptor); - // $FlowIgnore - const legacyAlias = atom.config.legacyScopeAliases.get( - // $FlowIgnore - newScopeDescriptor.scopes[0], - ); + const newScopeDescriptor = ScopeDescriptor.fromObject(scopeDescriptor); // $FlowIgnore + + const legacyAlias = atom.config.legacyScopeAliases.get( // $FlowIgnore + newScopeDescriptor.scopes[0]); + if (legacyAlias) { // $FlowIgnore const scopes = newScopeDescriptor.scopes.slice(); scopes[0] = legacyAlias; - return new ScopeDescriptor({scopes}); + return new ScopeDescriptor({ + scopes + }); } }; }; @@ -371,52 +367,47 @@ const addConfigResetProjectSettings = () => { } else { atom.config.settings = {}; } - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.resetScopedSettings = (newScopedSettings, options = {}) => { - const source = - // $FlowIgnore - options.source == null ? atom.config.mainSource : options.source; + const source = // $FlowIgnore + options.source == null ? atom.config.mainSource : options.source; // $FlowIgnore - // $FlowIgnore - const priority = atom.config.priorityForSource(source); + const priority = atom.config.priorityForSource(source); // $FlowIgnore - // $FlowIgnore atom.config.scopedSettingsStore.removePropertiesForSource(source); for (const scopeSelector in newScopedSettings) { - let settings = newScopedSettings[scopeSelector]; - // $FlowIgnore + let settings = newScopedSettings[scopeSelector]; // $FlowIgnore + settings = atom.config.makeValueConformToSchema(null, settings, { - suppressException: true, + suppressException: true }); const validatedSettings = {}; validatedSettings[scopeSelector] = withoutEmptyObjects(settings); + if (validatedSettings[scopeSelector] != null) { // $FlowIgnore - atom.config.scopedSettingsStore.addProperties( - source, - validatedSettings, - { - priority, - }, - ); + atom.config.scopedSettingsStore.addProperties(source, validatedSettings, { + priority + }); } - } - // $FlowIgnore + } // $FlowIgnore + + return atom.config.emitChangeEvent(); - }; + }; // $FlowIgnore - // $FlowIgnore - atom.config.resetUserScopedSettings = atom.config.resetScopedSettings; - // $FlowIgnore + atom.config.resetUserScopedSettings = atom.config.resetScopedSettings; // $FlowIgnore + atom.config._resetSettings = (ns, options = {}) => { let newSettings = ns; - const source = options.source; - // eslint-disable-next-line + const source = options.source; // eslint-disable-next-line + newSettings = Object.assign({}, newSettings); + if (newSettings.global != null) { newSettings['*'] = newSettings.global; delete newSettings.global; @@ -425,110 +416,118 @@ const addConfigResetProjectSettings = () => { if (newSettings['*'] != null) { const scopedSettings = newSettings; newSettings = newSettings['*']; - delete scopedSettings['*']; - // $FlowIgnore - atom.config.resetScopedSettings(scopedSettings, {source}); - } + delete scopedSettings['*']; // $FlowIgnore + + atom.config.resetScopedSettings(scopedSettings, { + source + }); + } // $FlowIgnore + - // $FlowIgnore return atom.config.transact(() => { // $FlowIgnore - atom.config._clearUnscopedSettingsForSource(source); - // $FlowIgnore + atom.config._clearUnscopedSettingsForSource(source); // $FlowIgnore + + atom.config.settingsLoaded = true; + for (const key in newSettings) { const value = newSettings[key]; - atom.config.set(key, value, {save: false, source}); - } - // $FlowIgnore + atom.config.set(key, value, { + save: false, + source + }); + } // $FlowIgnore + + if (atom.config.pendingOperations.length) { for (const op of atom.config.pendingOperations) { op(); - } - // $FlowIgnore + } // $FlowIgnore + + atom.config.pendingOperations = []; } }); - }; - // $FlowIgnore + }; // $FlowIgnore + + atom.config.resetUserSettings = (newSettings, options = {}) => { // $FlowIgnore atom.config._resetSettings(newSettings, options); - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.resetProjectSettings = (newSettings, projectFile) => { // Sets the scope and source of all project settings to `path`. // eslint-disable-next-line - newSettings = Object.assign({}, newSettings); - // $FlowIgnore - const oldProjectFile = atom.config.projectFile; - // $FlowIgnore + newSettings = Object.assign({}, newSettings); // $FlowIgnore + + const oldProjectFile = atom.config.projectFile; // $FlowIgnore + atom.config.projectFile = projectFile; + if (atom.config.projectFile != null) { // $FlowIgnore atom.config._resetSettings(newSettings, { - source: atom.config.projectFile, + source: atom.config.projectFile }); } else { // $FlowIgnore - atom.config.scopedSettingsStore.removePropertiesForSource(oldProjectFile); - // $FlowIgnore + atom.config.scopedSettingsStore.removePropertiesForSource(oldProjectFile); // $FlowIgnore + atom.config.projectSettings = {}; } - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.clearProjectSettings = () => { // $FlowIgnore atom.config.resetProjectSettings({}, null); - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.priorityForSource = source => { switch (source) { // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) case atom.config.mainSource: return 1000; + case atom.config.projectFile: return 2000; + default: return 0; } - }; + }; // $FlowIgnore + - // $FlowIgnore atom.config.resetUserSettings = (newScopedSettings, options = {}) => { - const source = - // $FlowIgnore - options.source == null ? atom.config.mainSource : options.source; + const source = // $FlowIgnore + options.source == null ? atom.config.mainSource : options.source; // $FlowIgnore - // $FlowIgnore - const priority = atom.config.priorityForSource(source); + const priority = atom.config.priorityForSource(source); // $FlowIgnore - // $FlowIgnore atom.config.scopedSettingsStore.removePropertiesForSource(source); for (const scopeSelector in newScopedSettings) { - let settings = newScopedSettings[scopeSelector]; - // $FlowIgnore + let settings = newScopedSettings[scopeSelector]; // $FlowIgnore + settings = atom.config.makeValueConformToSchema(null, settings, { - suppressException: true, + suppressException: true }); const validatedSettings = {}; validatedSettings[scopeSelector] = withoutEmptyObjects(settings); + if (validatedSettings[scopeSelector] != null) { // $FlowIgnore - atom.config.scopedSettingsStore.addProperties( - source, - validatedSettings, - { - priority, - }, - ); + atom.config.scopedSettingsStore.addProperties(source, validatedSettings, { + priority + }); } - } - // $FlowIgnore + } // $FlowIgnore + + return atom.config.emitChangeEvent(); }; }; @@ -538,24 +537,28 @@ class ScopeDescriptor { if (scopes != null && Array.isArray(scopes.scopes)) { return scopes; } else { - return new ScopeDescriptor({scopes}); + return new ScopeDescriptor({ + scopes + }); } } - /* Section: Construction and Destruction */ - // Public: Create a {ScopeDescriptor} object. // // * `object` {Object} // * `scopes` {Array} of {String}s - constructor({scopes}) { + + + constructor({ + scopes + }) { // $FlowIgnore this.scopes = scopes; - } + } // Public: Returns an {Array} of {String}s + - // Public: Returns an {Array} of {String}s getScopesArray() { // $FlowIgnore return this.scopes; @@ -566,19 +569,23 @@ class ScopeDescriptor { // leading dots (e.g. 'source.js' -> '.source.js'). // $FlowIgnore if (this.scopes[0] != null ? this.scopes[0].includes('.') : undefined) { - let result = ''; - // $FlowIgnore + let result = ''; // $FlowIgnore + for (let i = 0; i < this.scopes.length; i++) { // $FlowIgnore const scope = this.scopes[i]; + if (i > 0) { result += ' '; } + if (scope[0] !== '.') { result += '.'; } + result += scope; } + return result; } else { // $FlowIgnore @@ -595,14 +602,18 @@ class ScopeDescriptor { if (this.scopes.length !== other.scopes.length) { return false; } + for (let i = 0; i < this.scopes.length; i++) { const scope = this.scopes[i]; + if (scope !== other.scopes[i]) { return false; } } + return true; } + } const ESCAPED_DOT = /\\\./g; @@ -614,47 +625,53 @@ function splitKeyPath(keyPath) { let startIndex = 0; const keyPathArray = []; + for (let i = 0, len = keyPath.length; i < len; i++) { const char = keyPath[i]; + if (char === '.' && (i === 0 || keyPath[i - 1] !== '\\')) { - keyPathArray.push( - keyPath.substring(startIndex, i).replace(ESCAPED_DOT, '.'), - ); + keyPathArray.push(keyPath.substring(startIndex, i).replace(ESCAPED_DOT, '.')); startIndex = i + 1; } } - keyPathArray.push( - keyPath.substr(startIndex, keyPath.length).replace(ESCAPED_DOT, '.'), - ); + keyPathArray.push(keyPath.substr(startIndex, keyPath.length).replace(ESCAPED_DOT, '.')); return keyPathArray; } function deleteValueAtKeyPath(o, keyPath) { let object = o; const keys = splitKeyPath(keyPath); + while (keys.length > 1) { const key = keys.shift(); + if (object[key] == null) { return; - } - // eslint-disable-next-line + } // eslint-disable-next-line + + object = object[key]; } + delete object[keys.shift()]; } function setValueAtKeyPath(o, keyPath, value) { let object = o; const keys = splitKeyPath(keyPath); + while (keys.length > 1) { const key = keys.shift(); + if (object[key] == null) { object[key] = {}; - } - // eslint-disable-next-line + } // eslint-disable-next-line + + object = object[key]; } + object[keys.shift()] = value; } @@ -666,46 +683,50 @@ const getValueAtKeyPath = (o, keyPath) => { } const keys = splitKeyPath(keyPath); + for (let i = 0, len = keys.length; i < len; i++) { - const key = keys[i]; - // eslint-disable-next-line + const key = keys[i]; // eslint-disable-next-line + object = object[key]; + if (object == null) { return object; } } + return object; }; const withoutEmptyObjects = o => { const object = o; let resultObject; - if (isPlainObject(object)) { + + if ((0, _isPlainObject2().default)(object)) { for (const key in object) { const value = object[key]; const newValue = withoutEmptyObjects(value); + if (newValue != null) { if (resultObject == null) { resultObject = {}; } + resultObject[key] = newValue; } } } else { resultObject = object; } + return resultObject; }; const isEqual = (x, y) => { - if ( - typeof x === 'object' && - x != null && - (typeof y === 'object' && y != null) - ) { + if (typeof x === 'object' && x != null && typeof y === 'object' && y != null) { if (Object.keys(x).length !== Object.keys(y).length) { return false; } + for (const prop in x) { if (y.hasOwnProperty(prop)) { if (!isEqual(x[prop], y[prop])) { @@ -715,10 +736,11 @@ const isEqual = (x, y) => { return false; } } + return true; } else if (x !== y) { return false; } else { return true; } -}; +}; \ No newline at end of file diff --git a/lib/patchAtomTextEditor.js b/lib/patchAtomTextEditor.js index c1979041c0..18a26d7ee2 100644 --- a/lib/patchAtomTextEditor.js +++ b/lib/patchAtomTextEditor.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = patchAtomTextEditor; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,51 +12,46 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow strict-local + * strict-local * @format */ - -import invariant from 'assert'; - // TODO(T31782876): Remove once fixed upstream in Atom // https://github.com/atom/atom/pull/17702 - // Currently, the updateClassList function on Atom's TextEditorComponent class // does not properly re-add its managed classes (editor, isFocused, mini) to the // element when the element has been rerendered with changed classes passed in. // This patches the atom-text-editor element to fix the updateClassList function // until a proper fix can be upstreamed to Atom - // Flag to prevent repatching if the Atom package is disabled and then re-enabled. // Repatching would cause an infinite loop since the patchedUpdateClassList function // calls the prototype updateClassList implementation let isPatched = false; -export default function patchAtomTextEditor() { +function patchAtomTextEditor() { if (isPatched) { return; } - isPatched = true; - const atomTextEditor: atom$TextEditor = atom.workspace.buildTextEditor(); - // getElement initializes the AtomTextEditor's component property if it does + isPatched = true; + const atomTextEditor = atom.workspace.buildTextEditor(); // getElement initializes the AtomTextEditor's component property if it does // not exist yet - atomTextEditor.getElement(); - // $FlowFixMe component is added by getElement() call if it doesn't exist - invariant(atomTextEditor.component != null); + atomTextEditor.getElement(); // $FlowFixMe component is added by getElement() call if it doesn't exist - const atomTextEditorComponentPrototype = Object.getPrototypeOf( - atomTextEditor.component, - ); + if (!(atomTextEditor.component != null)) { + throw new Error("Invariant violation: \"atomTextEditor.component != null\""); + } + + const atomTextEditorComponentPrototype = Object.getPrototypeOf(atomTextEditor.component); const updateClassListFn = atomTextEditorComponentPrototype.updateClassList; if (updateClassListFn != null) { - atomTextEditorComponentPrototype.updateClassList = function() { + atomTextEditorComponentPrototype.updateClassList = function () { updateClassListFn.call(this); + for (let i = 0; i < this.classList.length; i++) { this.element.classList.add(this.classList[i]); } }; } -} +} \ No newline at end of file diff --git a/lib/preload-dependencies.js b/lib/preload-dependencies.js index 1373e6dcd0..12735f6bc7 100644 --- a/lib/preload-dependencies.js +++ b/lib/preload-dependencies.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,7 +7,7 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ @@ -22,13 +24,17 @@ * - Be transpiled so that `use-minified-libs-tr` is applied to it. * - Use `require` and not `import` to avoid `inline-imports` optimizations. */ - require('immutable'); + require('log4js'); + require('react'); + require('react-dom'); -require('redux'); -require('rxjs'); -// Single out fs-plus since we can probably remove it one day. -require('fs-plus'); +require("redux/dist/redux.min.js"); + +require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); // Single out fs-plus since we can probably remove it one day. + + +require('fs-plus'); \ No newline at end of file diff --git a/lib/test-runner.js b/lib/test-runner.js index aa1e933446..f05326b9b3 100644 --- a/lib/test-runner.js +++ b/lib/test-runner.js @@ -1,3 +1,36 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _fs = _interopRequireDefault(require("fs")); + +function _testHelpers() { + const data = require("../modules/nuclide-commons/test-helpers"); + + _testHelpers = function () { + return data; + }; + + return data; +} + +function _patchAtomConsole() { + const data = _interopRequireDefault(require("../modules/nuclide-commons/patch-atom-console")); + + _patchAtomConsole = function () { + return data; + }; + + return data; +} + +var _path = _interopRequireDefault(require("path")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. @@ -5,42 +38,30 @@ * This source code is licensed under the license found in the LICENSE file in * the root directory of this source tree. * - * @flow + * * @format */ - -import type {TestRunnerParams, ExitCode} from './types'; - -import fs from 'fs'; -import {writeCoverage} from 'nuclide-commons/test-helpers'; -import patchAtomConsole from 'nuclide-commons/patch-atom-console'; - // eslint-disable-next-line nuclide-internal/prefer-nuclide-uri -import path from 'path'; - -patchAtomConsole(); +(0, _patchAtomConsole().default)(); -const integrationTestsDir = path.join(__dirname, '../spec'); +const integrationTestsDir = _path.default.join(__dirname, '../spec'); -export default (async function(params: TestRunnerParams): Promise { - const isIntegrationTest = params.testPaths.some(testPath => - testPath.startsWith(integrationTestsDir), - ); - const isApmTest = !isIntegrationTest; +var _default = async function _default(params) { + const isIntegrationTest = params.testPaths.some(testPath => testPath.startsWith(integrationTestsDir)); + const isApmTest = !isIntegrationTest; // It's assumed that all of the tests belong to the same package. - // It's assumed that all of the tests belong to the same package. const pkg = getPackage(params.testPaths[0]); + if (pkg == null) { - throw new Error( - `Couldn't find a parent "package.json" for ${params.testPaths[0]}`, - ); + throw new Error(`Couldn't find a parent "package.json" for ${params.testPaths[0]}`); } - const nuclideConfig = pkg.atomConfig || (pkg.nuclide && pkg.nuclide.config); + const nuclideConfig = pkg.atomConfig || pkg.nuclide && pkg.nuclide.config; const statusCode = await params.legacyTestRunner({ logFile: params.logFile, headless: params.headless, testPaths: params.testPaths, + buildAtomEnvironment(buildEnvParams) { const atomGlobal = params.buildAtomEnvironment(buildEnvParams); @@ -52,25 +73,23 @@ export default (async function(params: TestRunnerParams): Promise { if (isIntegrationTest) { jasmine.getEnv().beforeEach(() => { // Integration tests have to activate all Nuclide packages. - jasmine.getEnv().defaultTimeoutInterval = 20000; - // If we're running integration tests in parallel, double the timeout. + jasmine.getEnv().defaultTimeoutInterval = 20000; // If we're running integration tests in parallel, double the timeout. + if (process.env.SANDCASTLE === '1') { jasmine.getEnv().defaultTimeoutInterval *= 2; - } - // `atom.confirm` blocks Atom and stops the integration tests. - spyOn(atomGlobal, 'confirm'); - // Ensure 3rd-party packages are not installed via the + } // `atom.confirm` blocks Atom and stops the integration tests. + + + spyOn(atomGlobal, 'confirm'); // Ensure 3rd-party packages are not installed via the // 'atom-package-deps' package when the 'nuclide' package is activated. // They are assumed to be already in ~/.atom/packages. js_test_runner.py // handles installing them during automated testing. + atomGlobal.config.set('nuclide.installRecommendedPackages', false); }); - jasmine.getEnv().afterEach(() => { if (atomGlobal.confirm.calls.length) { - const details = atomGlobal.confirm.argsForCall.map( - (args, i) => `call #${i} with ${JSON.stringify(args)}`, - ); + const details = atomGlobal.confirm.argsForCall.map((args, i) => `call #${i} with ${JSON.stringify(args)}`); throw new Error('atom.confirm was called.\n' + details); } }); @@ -82,25 +101,24 @@ export default (async function(params: TestRunnerParams): Promise { // and it doesn't load for unit tests, it's necessary to manually // construct any default config that they define. Object.keys(nuclideConfig).forEach(key => { - atomGlobal.config.setSchema( - `${pkg.name}.${key}`, - nuclideConfig[key], - ); + atomGlobal.config.setSchema(`${pkg.name}.${key}`, nuclideConfig[key]); }); }); } return atomGlobal; - }, - }); + } + }); await new Promise(resolve => { const temp = require('temp'); + if (statusCode === 0) { - writeCoverage(); - // Atom intercepts "process.exit" so we have to do our own manual cleanup. + (0, _testHelpers().writeCoverage)(); // Atom intercepts "process.exit" so we have to do our own manual cleanup. + temp.cleanup((err, stats) => { resolve(); + if (err && err.message !== 'not tracking') { // eslint-disable-next-line no-console console.log('temp.cleanup() failed.', err); @@ -112,18 +130,22 @@ export default (async function(params: TestRunnerParams): Promise { resolve(); } }); - return statusCode; -}); +}; + +exports.default = _default; function getPackage(start) { - let current = path.resolve(start); + let current = _path.default.resolve(start); + while (true) { - const filename = path.join(current, 'package.json'); - if (fs.existsSync(filename)) { - return JSON.parse(fs.readFileSync(filename, 'utf8')); + const filename = _path.default.join(current, 'package.json'); + + if (_fs.default.existsSync(filename)) { + return JSON.parse(_fs.default.readFileSync(filename, 'utf8')); } else { - const next = path.join(current, '..'); + const next = _path.default.join(current, '..'); + if (next === current) { return null; } else { @@ -131,4 +153,4 @@ function getPackage(start) { } } } -} +} \ No newline at end of file diff --git a/lib/types.js b/lib/types.js index 682bd576bf..9a390c31f7 100644 --- a/lib/types.js +++ b/lib/types.js @@ -1,44 +1 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - * - * @flow - * @format - */ - -// http://flight-manual.atom.io/hacking-atom/sections/writing-specs/#customizing-your-test-runner -export type TestRunnerParams = { - /** Absolute paths to tests to run. Could be paths to files or directories. */ - testPaths: Array, - /** Creates the `atom` global object. */ - buildAtomEnvironment: (params: BuildAtomEnvironmentParams) => AtomGlobal, - /** Currently undocumented, but seemingly necessary to use buildAtomEnvironment(). */ - buildDefaultApplicationDelegate: () => Object, - /** An optional path to a log file to which test output should be logged. */ - logFile: ?string, - /** A boolean indicating whether or not the tests are running headless. */ - headless: boolean, - /** The legacy Jasmine runner */ - legacyTestRunner: (params: LegacyTestRunnerParams) => Promise, -}; - -// https://github.com/atom/atom/blob/v1.6.2/spec/jasmine-test-runner.coffee -export type LegacyTestRunnerParams = { - logFile: ?string, - headless: boolean, - testPaths: Array, - buildAtomEnvironment: (params: BuildAtomEnvironmentParams) => AtomGlobal, -}; - -export type BuildAtomEnvironmentParams = { - applicationDelegate: Object, - window: Object, - document: Object, - configDirPath?: string, - enablePersistence?: boolean, -}; - -export type ExitCode = number; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-debugger-java-android/AndroidJavaDebuggerHelpers.js b/modules/atom-ide-debugger-java-android/AndroidJavaDebuggerHelpers.js index 8025489c39..88afb54e52 100644 --- a/modules/atom-ide-debugger-java-android/AndroidJavaDebuggerHelpers.js +++ b/modules/atom-ide-debugger-java-android/AndroidJavaDebuggerHelpers.js @@ -1,3 +1,96 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.launchAndroidServiceOrActivity = launchAndroidServiceOrActivity; +exports.getPidFromPackageName = getPidFromPackageName; +exports.getAdbAttachPortTargetInfo = getAdbAttachPortTargetInfo; + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _analytics() { + const data = require("../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function _promise() { + const data = require("../nuclide-commons/promise"); + + _promise = function () { + return data; + }; + + return data; +} + +function _utils() { + const data = require("../atom-ide-debugger-java/utils"); + + _utils = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _consumeFirstProvider() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/consumeFirstProvider")); + + _consumeFirstProvider = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _nuclideAdb() { + const data = require("../nuclide-adb"); + + _nuclideAdb = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,155 +99,78 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {SshTunnelService} from 'nuclide-adb/lib/types'; -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; -import type {JavaAttachPortTargetConfig} from 'atom-ide-debugger-java/JavaDebuggerHelpersService'; - -import nullthrows from 'nullthrows'; -import invariant from 'assert'; -import {track} from 'nuclide-commons/analytics'; -import {sleep} from 'nuclide-commons/promise'; // eslint-disable-next-line nuclide-internal/modules-dependencies -import {getJavaDebuggerHelpersServiceByNuclideUri} from 'atom-ide-debugger-java/utils'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {Subject} from 'rxjs'; -import consumeFirstProvider from 'nuclide-commons-atom/consumeFirstProvider'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {getAdbServiceByNuclideUri} from 'nuclide-adb'; - // Only one AdbProcessInfo can be active at a time. Since it ties up a forwarded // adb port, new instances need to wait for the previous one to clean up before -// they can begin debugging. -let cleanupSubject: ?Subject = null; - -export type AndroidDebugTargetInfo = { - pid: number, - attach: boolean, -}; - -export async function launchAndroidServiceOrActivity( - adbServiceUri: NuclideUri, - service: ?string, - activity: ?string, - action: ?string, - deviceSerial: string, - packageName: string, -): Promise { - const adbService = getAdbServiceByNuclideUri(adbServiceUri); +let cleanupSubject = null; + +async function launchAndroidServiceOrActivity(adbServiceUri, service, activity, action, deviceSerial, packageName) { + const adbService = (0, _nuclideAdb().getAdbServiceByNuclideUri)(adbServiceUri); + if (service != null) { - await adbService.launchService( - deviceSerial, - packageName, - service || '', - true, - ); + await adbService.launchService(deviceSerial, packageName, service || '', true); } else if (activity != null && action != null) { // First query the device to be sure the activity exists in the specified package. // This will allow us to bubble up a useful error message instead of a cryptic // adb failure if the user simply mistyped the activity or package name. - const activityExists = await adbService.activityExists( - deviceSerial, - packageName, - activity || '', - ); + const activityExists = await adbService.activityExists(deviceSerial, packageName, activity || ''); if (!activityExists) { const packages = await adbService.getAllAvailablePackages(deviceSerial); - const availableActivities = new Set( - packages.filter(line => line.includes(packageName + '/')), - ); - atom.notifications.addError( - `Activity ${activity || ''} does not exist in package ` + - packageName + - '\n' + - 'Did you mean one of these activities: ' + - '\n' + - Array.from(availableActivities) - .map(activityLine => activityLine.split('/')[1]) - .join('\n'), - ); + const availableActivities = new Set(packages.filter(line => line.includes(packageName + '/'))); + atom.notifications.addError(`Activity ${activity || ''} does not exist in package ` + packageName + '\n' + 'Did you mean one of these activities: ' + '\n' + Array.from(availableActivities).map(activityLine => activityLine.split('/')[1]).join('\n')); } - await adbService.launchActivity( - deviceSerial, - packageName, - activity || '', - true, - action, - ); + await adbService.launchActivity(deviceSerial, packageName, activity || '', true, action); } } -export async function getPidFromPackageName( - adbServiceUri: NuclideUri, - deviceSerial: string, - packageName: string, -): Promise { - const adbService = getAdbServiceByNuclideUri(adbServiceUri); +async function getPidFromPackageName(adbServiceUri, deviceSerial, packageName) { + const adbService = (0, _nuclideAdb().getAdbServiceByNuclideUri)(adbServiceUri); let pid = await adbService.getPidFromPackageName(deviceSerial, packageName); const firstTryFails = !Number.isInteger(pid); + if (firstTryFails) { // Try twice after a short delay because sometimes it works. - await sleep(300); + await (0, _promise().sleep)(300); pid = await adbService.getPidFromPackageName(deviceSerial, packageName); } + const success = Number.isInteger(pid); - track('atom-ide-debugger-java-android-getPidFromPackageName', { + (0, _analytics().track)('atom-ide-debugger-java-android-getPidFromPackageName', { triedTwice: firstTryFails, success, - pid, + pid }); + if (success) { return pid; } else { - throw new Error( - `Fail to get pid for package: ${packageName}. Instead got: ${pid}`, - ); + throw new Error(`Fail to get pid for package: ${packageName}. Instead got: ${pid}`); } } -export async function getAdbAttachPortTargetInfo( - deviceSerial: string, - adbServiceUri: NuclideUri, - targetUri: NuclideUri, - pid: ?number, - subscriptions: UniversalDisposable, - packageName: string, -): Promise { - const tunnelRequired = - nuclideUri.isLocal(adbServiceUri) && nuclideUri.isRemote(targetUri); - const tunnelService = tunnelRequired - ? (await consumeFirstProvider('nuclide.ssh-tunnel'): ?SshTunnelService) - : null; - const adbService = getAdbServiceByNuclideUri(adbServiceUri); - // tunnel Service's getAvailableServerPort does something weird where it +async function getAdbAttachPortTargetInfo(deviceSerial, adbServiceUri, targetUri, pid, subscriptions, packageName) { + const tunnelRequired = _nuclideUri().default.isLocal(adbServiceUri) && _nuclideUri().default.isRemote(targetUri); + + const tunnelService = tunnelRequired ? await (0, _consumeFirstProvider().default)('nuclide.ssh-tunnel') : null; + const adbService = (0, _nuclideAdb().getAdbServiceByNuclideUri)(adbServiceUri); // tunnel Service's getAvailableServerPort does something weird where it // wants adbServiceUri to be either '' or 'localhost' - const adbPort = tunnelRequired - ? await nullthrows(tunnelService).getAvailableServerPort( - nuclideUri.isLocal(adbServiceUri) ? 'localhost' : adbServiceUri, - ) - : await getJavaDebuggerHelpersServiceByNuclideUri( - adbServiceUri, - ).getPortForJavaDebugger(); - const forwardSpec = await adbService.forwardJdwpPortToPid( - deviceSerial, - adbPort, - pid || 0, - ); + + const adbPort = tunnelRequired ? await (0, _nullthrows().default)(tunnelService).getAvailableServerPort(_nuclideUri().default.isLocal(adbServiceUri) ? 'localhost' : adbServiceUri) : await (0, _utils().getJavaDebuggerHelpersServiceByNuclideUri)(adbServiceUri).getPortForJavaDebugger(); + const forwardSpec = await adbService.forwardJdwpPortToPid(deviceSerial, adbPort, pid || 0); if (cleanupSubject != null) { await cleanupSubject.toPromise(); } - cleanupSubject = new Subject(); + + cleanupSubject = new _rxjsCompatUmdMin.Subject(); subscriptions.add(async () => { - const result = await adbService.removeJdwpForwardSpec( - deviceSerial, - forwardSpec, - ); + const result = await adbService.removeJdwpForwardSpec(deviceSerial, forwardSpec); + if (result.trim().startsWith('error')) { // TODO(Ericblue): The OneWorld proxy swaps TCP forward for a local filesystem // redirection, which confuses adb and prevents proper removal of @@ -167,22 +183,29 @@ export async function getAdbAttachPortTargetInfo( cleanupSubject.complete(); } }); - const attachPort = await new Promise(async (resolve, reject) => { try { if (!tunnelRequired) { resolve(adbPort); return; } - invariant(tunnelService); + + if (!tunnelService) { + throw new Error("Invariant violation: \"tunnelService\""); + } + const tunnel = { description: 'Java debugger', from: { - host: nuclideUri.getHostname(targetUri), + host: _nuclideUri().default.getHostname(targetUri), port: 'any_available', - family: 4, + family: 4 }, - to: {host: 'localhost', port: adbPort, family: 4}, + to: { + host: 'localhost', + port: adbPort, + family: 4 + } }; const openTunnel = tunnelService.openTunnels([tunnel]).share(); subscriptions.add(openTunnel.subscribe()); @@ -197,6 +220,6 @@ export async function getAdbAttachPortTargetInfo( machineName: 'localhost', port: attachPort, packageName, - deviceSerial, + deviceSerial }; -} +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-java-android/SourceFilePathsModal.js b/modules/atom-ide-debugger-java-android/SourceFilePathsModal.js index 2293eb4f7a..162851be68 100644 --- a/modules/atom-ide-debugger-java-android/SourceFilePathsModal.js +++ b/modules/atom-ide-debugger-java-android/SourceFilePathsModal.js @@ -1,3 +1,76 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SourceFilePathsModal = void 0; + +var React = _interopRequireWildcard(require("react")); + +function _AtomInput() { + const data = require("../nuclide-commons-ui/AtomInput"); + + _AtomInput = function () { + return data; + }; + + return data; +} + +function _ListView() { + const data = require("../nuclide-commons-ui/ListView"); + + _ListView = function () { + return data; + }; + + return data; +} + +function _ButtonGroup() { + const data = require("../nuclide-commons-ui/ButtonGroup"); + + _ButtonGroup = function () { + return data; + }; + + return data; +} + +function _Button() { + const data = require("../nuclide-commons-ui/Button"); + + _Button = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _analytics() { + const data = require("../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,161 +79,124 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +class SourceFilePathsModal extends React.Component { + constructor(...args) { + var _temp; -import * as React from 'react'; -import {AtomInput} from 'nuclide-commons-ui/AtomInput'; -import {ListView, ListViewItem} from 'nuclide-commons-ui/ListView'; -import {ButtonGroup} from 'nuclide-commons-ui/ButtonGroup'; -import {Button, ButtonTypes} from 'nuclide-commons-ui/Button'; -import nullthrows from 'nullthrows'; -import {track} from 'nuclide-commons/analytics'; - -type PropsType = { - initialSourcePaths: Array, - sourcePathsChanged: (Array) => void, - onClosed: () => void, -}; - -type StateType = { - currentPaths: Array, -}; - -export class SourceFilePathsModal extends React.Component< - PropsType, - StateType, -> { - _newSourcePath: ?AtomInput; - _savedSourcePaths: Array = []; - state = { - currentPaths: this.props.initialSourcePaths.slice(0), - }; + return _temp = super(...args), this._savedSourcePaths = [], this.state = { + currentPaths: this.props.initialSourcePaths.slice(0) + }, this._addItem = () => { + const text = (0, _nullthrows().default)(this._newSourcePath).getText().trim().replace(/;/g, ''); // Do not allow semicolons since we are using them + // to delimit paths. TODO: handle paths that actually contain ;'s? + + if (text !== '') { + this.state.currentPaths.push(text); + (0, _nullthrows().default)(this._newSourcePath).setText(''); + this.setState({ + // TODO: (wbinnssmith) T30771435 this setState depends on current state + // and should use an updater function rather than an object + // eslint-disable-next-line react/no-access-state-in-setstate + currentPaths: this.state.currentPaths + }); + } + }, this._cancelClick = () => { + this.setState({ + currentPaths: this._savedSourcePaths + }); + this.props.onClosed(); + (0, _analytics().track)('fb-java-debugger-source-dialog-cancel', {}); + }, this._handleSaveClick = () => { + this._addItem(); + + this._savedSourcePaths = this.state.currentPaths.slice(0); + this.props.sourcePathsChanged(this._savedSourcePaths); + this.props.onClosed(); + (0, _analytics().track)('fb-java-debugger-source-dialog-saved', {}); + }, _temp; + } - _getSourcePathControls(): Array> { + _getSourcePathControls() { const items = []; const paths = Array.from(new Set(this.state.currentPaths)); if (paths.length === 0) { - return [ - -

- , - ]; + return [React.createElement(_ListView().ListViewItem, { + key: 0, + index: 0 + }, React.createElement("div", null, React.createElement("i", null, "(No custom source file paths have been specified)")))]; } paths.forEach((path, idx) => { - items.push( - -
- { - this.state.currentPaths.splice(idx, 1); - this.setState({ - // TODO: (wbinnssmith) T30771435 this setState depends on current state - // and should use an updater function rather than an object - // eslint-disable-next-line react/no-access-state-in-setstate - currentPaths: this.state.currentPaths, - }); - }} - /> - {path} -
-
, - ); + items.push(React.createElement(_ListView().ListViewItem, { + key: idx, + index: idx + }, React.createElement("div", { + className: "block" + }, React.createElement("i", { + className: "icon icon-x nuclide-source-content-x", + title: "Remove path", + onClick: () => { + this.state.currentPaths.splice(idx, 1); + this.setState({ + // TODO: (wbinnssmith) T30771435 this setState depends on current state + // and should use an updater function rather than an object + // eslint-disable-next-line react/no-access-state-in-setstate + currentPaths: this.state.currentPaths + }); + } + }), React.createElement("span", null, path)))); }); return items; } - _addItem = () => { - const text = nullthrows(this._newSourcePath) - .getText() - .trim() - .replace(/;/g, ''); // Do not allow semicolons since we are using them - // to delimit paths. TODO: handle paths that actually contain ;'s? - - if (text !== '') { - this.state.currentPaths.push(text); - nullthrows(this._newSourcePath).setText(''); - this.setState({ - // TODO: (wbinnssmith) T30771435 this setState depends on current state - // and should use an updater function rather than an object - // eslint-disable-next-line react/no-access-state-in-setstate - currentPaths: this.state.currentPaths, - }); - } - }; - - render(): React.Node { + render() { const sourcePaths = this._getSourcePathControls(); - return ( -
-
-

Configure source file paths:

-
- - Nuclide will automatically search for source in your project root - paths. You can add additional search paths here. - -
-
- { - this._newSourcePath = input; - }} - initialValue="" - autofocus={true} - placeholderText="Add a source file path..." - /> - -
-
- {sourcePaths} -
-
-
- - - - -
-
- ); - } - _cancelClick = (): void => { - this.setState({ - currentPaths: this._savedSourcePaths, - }); - this.props.onClosed(); - track('fb-java-debugger-source-dialog-cancel', {}); - }; + return React.createElement("div", { + className: "sourcepath-modal" + }, React.createElement("div", { + className: "select-list" + }, React.createElement("h2", null, "Configure source file paths:"), React.createElement("div", { + className: "nuclide-source-add-content" + }, React.createElement("span", null, "Nuclide will automatically search for source in your project root paths. You can add additional search paths here.")), React.createElement("div", { + className: "sourcepath-add-bar" + }, React.createElement(_AtomInput().AtomInput, { + className: "sourcepath-pane", + ref: input => { + this._newSourcePath = input; + }, + initialValue: "", + autofocus: true, + placeholderText: "Add a source file path..." + }), React.createElement(_Button().Button, { + onClick: this._addItem, + title: "Add Path", + className: "sourcepath-add-button" + }, React.createElement("i", { + className: "icon icon-plus" + }))), React.createElement("div", { + className: "sourcepath-sources" + }, React.createElement(_ListView().ListView, { + alternateBackground: true + }, sourcePaths))), React.createElement("div", { + className: "sourcepath-buttons", + style: { + display: 'flex', + flexDirection: 'row-reverse' + } + }, React.createElement(_ButtonGroup().ButtonGroup, null, React.createElement(_Button().Button, { + tabIndex: "17", + onClick: this._cancelClick + }, "Cancel"), React.createElement(_Button().Button, { + buttonType: _Button().ButtonTypes.PRIMARY, + tabIndex: "16", + onClick: this._handleSaveClick + }, "Save")))); + } - _handleSaveClick = (): void => { - this._addItem(); - this._savedSourcePaths = this.state.currentPaths.slice(0); - this.props.sourcePathsChanged(this._savedSourcePaths); - this.props.onClosed(); - track('fb-java-debugger-source-dialog-saved', {}); - }; } + +exports.SourceFilePathsModal = SourceFilePathsModal; \ No newline at end of file diff --git a/modules/atom-ide-debugger-java-android/main.js b/modules/atom-ide-debugger-java-android/main.js index 1a2a9761db..15a4d9d3de 100644 --- a/modules/atom-ide-debugger-java-android/main.js +++ b/modules/atom-ide-debugger-java-android/main.js @@ -1,3 +1,47 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +function _AutoGenLaunchAttachProvider() { + const data = require("../nuclide-debugger-common/AutoGenLaunchAttachProvider"); + + _AutoGenLaunchAttachProvider = function () { + return data; + }; + + return data; +} + +function _utils() { + const data = require("./utils"); + + _utils = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,45 +50,30 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type { - NuclideDebuggerProvider, - DebuggerConfigurationProvider, -} from 'nuclide-debugger-common'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import {VsAdapterTypes, VsAdapterNames} from 'nuclide-debugger-common'; -import {AutoGenLaunchAttachProvider} from 'nuclide-debugger-common/AutoGenLaunchAttachProvider'; -import {getJavaAndroidConfig, resolveConfiguration} from './utils'; - class Activation { constructor() {} + dispose() {} - createDebuggerProvider(): NuclideDebuggerProvider { + createDebuggerProvider() { return { - type: VsAdapterTypes.JAVA_ANDROID, + type: _nuclideDebuggerCommon().VsAdapterTypes.JAVA_ANDROID, getLaunchAttachProvider: connection => { - return new AutoGenLaunchAttachProvider( - VsAdapterNames.JAVA_ANDROID, - connection, - getJavaAndroidConfig(), - ); - }, + return new (_AutoGenLaunchAttachProvider().AutoGenLaunchAttachProvider)(_nuclideDebuggerCommon().VsAdapterNames.JAVA_ANDROID, connection, (0, _utils().getJavaAndroidConfig)()); + } }; } - createDebuggerConfigurator(): Array { - return [ - { - resolveConfiguration, - adapterType: VsAdapterTypes.JAVA_ANDROID, - }, - ]; + createDebuggerConfigurator() { + return [{ + resolveConfiguration: _utils().resolveConfiguration, + adapterType: _nuclideDebuggerCommon().VsAdapterTypes.JAVA_ANDROID + }]; } + } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-debugger-java-android/types.js b/modules/atom-ide-debugger-java-android/types.js index c5ed2f4f3d..9a390c31f7 100644 --- a/modules/atom-ide-debugger-java-android/types.js +++ b/modules/atom-ide-debugger-java-android/types.js @@ -1,44 +1 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; -import type {IProcessConfig} from 'nuclide-debugger-common/types'; - -export type IJavaAndroidLaunchProcessConfig = {| - ...IProcessConfig, - +config: {| - activity?: string, - service?: string, - intent?: string, - deviceAndPackage: { - deviceSerial: string, - selectedPackage: string, - }, - selectSources: string, - |}, -|}; - -export type IJavaAndroidAttachProcessConfig = {| - ...IProcessConfig, - +config: {| - deviceAndProcess: { - deviceSerial: string, - selectedProcess: { - user?: string, - pid?: string, - name: string, - }, - }, - selectedSources?: string, - adbServiceUri: NuclideUri, - |}, -|}; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-debugger-java-android/utils.js b/modules/atom-ide-debugger-java-android/utils.js index cab9c16d22..fdc383ee9e 100644 --- a/modules/atom-ide-debugger-java-android/utils.js +++ b/modules/atom-ide-debugger-java-android/utils.js @@ -1,3 +1,107 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getJavaAndroidConfig = getJavaAndroidConfig; +exports.getCustomControlButtonsForJavaSourcePaths = getCustomControlButtonsForJavaSourcePaths; +exports.resolveConfiguration = resolveConfiguration; +exports.NUCLIDE_DEBUGGER_DEV_GK = void 0; + +function _constants() { + const data = require("../atom-ide-ui/pkg/atom-ide-debugger/lib/constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _nuclideAdb() { + const data = require("../nuclide-adb"); + + _nuclideAdb = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _constants2() { + const data = require("../nuclide-debugger-common/constants"); + + _constants2 = function () { + return data; + }; + + return data; +} + +function _utils() { + const data = require("../atom-ide-debugger-java/utils"); + + _utils = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _analytics() { + const data = require("../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function _AndroidJavaDebuggerHelpers() { + const data = require("./AndroidJavaDebuggerHelpers"); + + _AndroidJavaDebuggerHelpers = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,283 +110,197 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; -import type { - AutoGenConfig, - IProcessConfig, - ControlButtonSpecification, - DebuggerConfigAction, -} from 'nuclide-debugger-common/types'; - -import {AnalyticsEvents} from 'atom-ide-ui/pkg/atom-ide-debugger/lib/constants'; -import {getAdbServiceByNuclideUri} from 'nuclide-adb'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {Subject} from 'rxjs'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {VsAdapterTypes} from 'nuclide-debugger-common/constants'; // eslint-disable-next-line nuclide-internal/modules-dependencies -import { - getJavaDebuggerHelpersServiceByNuclideUri, - getSourcePathClickSubscriptions, -} from 'atom-ide-debugger-java/utils'; -import nullthrows from 'nullthrows'; -import {track} from 'nuclide-commons/analytics'; -import { - getAdbAttachPortTargetInfo, - launchAndroidServiceOrActivity, - getPidFromPackageName, -} from './AndroidJavaDebuggerHelpers'; - -export const NUCLIDE_DEBUGGER_DEV_GK = 'nuclide_debugger_dev'; - -export function getJavaAndroidConfig(): AutoGenConfig { +const NUCLIDE_DEBUGGER_DEV_GK = 'nuclide_debugger_dev'; +exports.NUCLIDE_DEBUGGER_DEV_GK = NUCLIDE_DEBUGGER_DEV_GK; + +function getJavaAndroidConfig() { const deviceAndPackage = { name: 'deviceAndPackage', type: 'deviceAndPackage', description: '', required: true, - visible: true, + visible: true }; const activity = { name: 'activity', type: 'string', description: 'com.example.app.main.MainActivity', required: false, - visible: true, + visible: true }; const service = { name: 'service', type: 'string', description: '.example.package.path.MyServiceClass', required: false, - visible: true, + visible: true }; const intent = { name: 'intent', type: 'string', description: 'android.intent.action.MAIN', required: false, - visible: true, + visible: true }; - const deviceAndProcess = { name: 'deviceAndProcess', type: 'deviceAndProcess', description: '', required: true, - visible: true, + visible: true }; const selectSources = { name: 'selectSources', type: 'selectSources', description: '', required: true, - visible: true, + visible: true }; - return { launch: { launch: true, - vsAdapterType: VsAdapterTypes.JAVA_ANDROID, + vsAdapterType: _constants2().VsAdapterTypes.JAVA_ANDROID, properties: [deviceAndPackage, activity, service, intent, selectSources], cwdPropertyName: 'cwd', header: null, + // Value will be replaced in the return value of resolveConfiguration(). getProcessName(values) { return 'Android'; - }, + } + }, attach: { launch: false, - vsAdapterType: VsAdapterTypes.JAVA_ANDROID, + vsAdapterType: _constants2().VsAdapterTypes.JAVA_ANDROID, properties: [deviceAndProcess, selectSources], header: null, + // Value will be replaced in the return value of resolveConfiguration(). getProcessName(values) { return 'Android'; - }, - }, + } + + } }; } -export function getCustomControlButtonsForJavaSourcePaths( - clickEvents: rxjs$Subject, -): ControlButtonSpecification[] { - return [ - { - icon: 'file-code', - title: 'Set Source Path', - onClick: () => clickEvents.next(), - }, - ]; +function getCustomControlButtonsForJavaSourcePaths(clickEvents) { + return [{ + icon: 'file-code', + title: 'Set Source Path', + onClick: () => clickEvents.next() + }]; } -function _getPackageName(debugMode: DebuggerConfigAction, config): string { - return debugMode === 'launch' - ? config.deviceAndPackage.selectedPackage - : config.deviceAndProcess.selectedProcess.name; +function _getPackageName(debugMode, config) { + return debugMode === 'launch' ? config.deviceAndPackage.selectedPackage : config.deviceAndProcess.selectedProcess.name; } -function _getDeviceSerial(debugMode: DebuggerConfigAction, config): string { - return nullthrows( - debugMode === 'launch' - ? config.deviceAndPackage.deviceSerial - : config.deviceAndProcess.deviceSerial, - ); +function _getDeviceSerial(debugMode, config) { + return (0, _nullthrows().default)(debugMode === 'launch' ? config.deviceAndPackage.deviceSerial : config.deviceAndProcess.deviceSerial); } -async function _getPid( - debugMode: DebuggerConfigAction, - config, - adbServiceUri: string, - deviceSerial: string, - packageName: string, -): Promise { - const selectedProcessPidString = - config.deviceAndProcess?.selectedProcess?.pid; - const pid = - debugMode === 'attach' && selectedProcessPidString != null - ? parseInt(selectedProcessPidString, 10) - : await getPidFromPackageName(adbServiceUri, deviceSerial, packageName); +async function _getPid(debugMode, config, adbServiceUri, deviceSerial, packageName) { + var _config$deviceAndProc, _config$deviceAndProc2; + + const selectedProcessPidString = (_config$deviceAndProc = config.deviceAndProcess) === null || _config$deviceAndProc === void 0 ? void 0 : (_config$deviceAndProc2 = _config$deviceAndProc.selectedProcess) === null || _config$deviceAndProc2 === void 0 ? void 0 : _config$deviceAndProc2.pid; + const pid = debugMode === 'attach' && selectedProcessPidString != null ? parseInt(selectedProcessPidString, 10) : await (0, _AndroidJavaDebuggerHelpers().getPidFromPackageName)(adbServiceUri, deviceSerial, packageName); + if (isNaN(pid)) { - throw new Error( - 'Selected process pid is not a number: ' + - JSON.stringify(selectedProcessPidString), - ); + throw new Error('Selected process pid is not a number: ' + JSON.stringify(selectedProcessPidString)); } + return pid; } -async function _getAndroidSdkSourcePaths( - targetUri: NuclideUri, - adbServiceUri: NuclideUri, - deviceSerial: string, -): Promise> { - const sdkVersion = await getAdbServiceByNuclideUri( - adbServiceUri, - ).getAPIVersion(deviceSerial); - const sdkSourcePath = - sdkVersion !== '' - ? await getJavaDebuggerHelpersServiceByNuclideUri( - targetUri, - ).getSdkVersionSourcePath(sdkVersion, { - useSdkManager: nuclideUri.isLocal(targetUri), - }) - : null; +async function _getAndroidSdkSourcePaths(targetUri, adbServiceUri, deviceSerial) { + const sdkVersion = await (0, _nuclideAdb().getAdbServiceByNuclideUri)(adbServiceUri).getAPIVersion(deviceSerial); + const sdkSourcePath = sdkVersion !== '' ? await (0, _utils().getJavaDebuggerHelpersServiceByNuclideUri)(targetUri).getSdkVersionSourcePath(sdkVersion, { + useSdkManager: _nuclideUri().default.isLocal(targetUri) + }) : null; + if (sdkSourcePath == null) { - atom.notifications.addInfo( - 'Unable to find Android Sdk Sources for version: ' + - sdkVersion + - '. Check if they are installed. Nuclide can still debug your application, but source code for frames inside Android library routines will not be available.', - ); + atom.notifications.addInfo('Unable to find Android Sdk Sources for version: ' + sdkVersion + '. Check if they are installed. Nuclide can still debug your application, but source code for frames inside Android library routines will not be available.'); } - track(AnalyticsEvents.ANDROID_DEBUGGER_SDK_SOURCES, { + + (0, _analytics().track)(_constants().AnalyticsEvents.ANDROID_DEBUGGER_SDK_SOURCES, { deviceSerial, sdkVersion, sdkSourcePathExists: sdkSourcePath != null, - sdkSourcePath, + sdkSourcePath }); - const sdkSourcePathResolved = - sdkSourcePath != null ? nuclideUri.getPath(sdkSourcePath) : null; + const sdkSourcePathResolved = sdkSourcePath != null ? _nuclideUri().default.getPath(sdkSourcePath) : null; return sdkSourcePathResolved != null ? [sdkSourcePathResolved] : []; } -export async function resolveConfiguration( - configuration: IProcessConfig, -): Promise { +async function resolveConfiguration(configuration) { + var _config$adbServiceUri, _config$selectSources; + // adapterType === VsAdapterTypes.JAVA_ANDROID - const {config, debugMode, targetUri} = configuration; - const adbServiceUri = config.adbServiceUri ?? targetUri; - const resolvedTargetUri = config.selectSources ?? targetUri; + const { + config, + debugMode, + targetUri + } = configuration; + const adbServiceUri = (_config$adbServiceUri = config.adbServiceUri) !== null && _config$adbServiceUri !== void 0 ? _config$adbServiceUri : targetUri; + const resolvedTargetUri = (_config$selectSources = config.selectSources) !== null && _config$selectSources !== void 0 ? _config$selectSources : targetUri; + const packageName = _getPackageName(debugMode, config); + const deviceSerial = _getDeviceSerial(debugMode, config); - track('atom-ide-debugger-java-android-configuration', { + (0, _analytics().track)('atom-ide-debugger-java-android-configuration', { adbServiceUri, packageName, deviceSerial, - debugMode, + debugMode }); if (debugMode === 'launch') { - const {service, intent, activity} = config; - await launchAndroidServiceOrActivity( - adbServiceUri, - (service: ?string), - (activity: ?string), - (intent: ?string) /* intent and action are the same */, - deviceSerial, - packageName, - ); + const { + service, + intent, + activity + } = config; + await (0, _AndroidJavaDebuggerHelpers().launchAndroidServiceOrActivity)(adbServiceUri, service, activity, intent, + /* intent and action are the same */ + deviceSerial, packageName); } - const pid = await _getPid( - debugMode, - config, - adbServiceUri, - deviceSerial, - packageName, - ); - - const subscriptions = new UniversalDisposable(); - const attachPortTargetConfig = await getAdbAttachPortTargetInfo( - deviceSerial, - adbServiceUri, - resolvedTargetUri, - pid, - subscriptions, - packageName, - ); + const pid = await _getPid(debugMode, config, adbServiceUri, deviceSerial, packageName); + const subscriptions = new (_UniversalDisposable().default)(); + const attachPortTargetConfig = await (0, _AndroidJavaDebuggerHelpers().getAdbAttachPortTargetInfo)(deviceSerial, adbServiceUri, resolvedTargetUri, pid, subscriptions, packageName); + const androidSdkSourcePaths = await _getAndroidSdkSourcePaths(resolvedTargetUri, adbServiceUri, deviceSerial); + const clickEvents = new _rxjsCompatUmdMin.Subject(); + const adapterExecutable = await (0, _utils().getJavaDebuggerHelpersServiceByNuclideUri)(resolvedTargetUri).getJavaVSAdapterExecutableInfo(false); + let processName = packageName; // Gets rid of path to package. - const androidSdkSourcePaths = await _getAndroidSdkSourcePaths( - resolvedTargetUri, - adbServiceUri, - deviceSerial, - ); - - const clickEvents = new Subject(); - const adapterExecutable = await getJavaDebuggerHelpersServiceByNuclideUri( - resolvedTargetUri, - ).getJavaVSAdapterExecutableInfo(false); - - let processName = packageName; - - // Gets rid of path to package. const lastPeriod = processName.lastIndexOf('.'); + if (lastPeriod >= 0) { processName = processName.substring(lastPeriod + 1, processName.length); } - return { - ...configuration, + return Object.assign({}, configuration, { targetUri: resolvedTargetUri, debugMode: 'attach', adapterExecutable, - customControlButtons: getCustomControlButtonsForJavaSourcePaths( - clickEvents, - ), + customControlButtons: getCustomControlButtonsForJavaSourcePaths(clickEvents), servicedFileExtensions: ['java'], - config: { - ...attachPortTargetConfig, + config: Object.assign({}, attachPortTargetConfig, { deviceSerial, packageName, - grammarName: 'source.java', - }, + grammarName: 'source.java' + }), onDebugStartingCallback: instance => { - subscriptions.add( - ...getSourcePathClickSubscriptions( - resolvedTargetUri, - instance, - clickEvents, - androidSdkSourcePaths, - ), - ); + subscriptions.add(...(0, _utils().getSourcePathClickSubscriptions)(resolvedTargetUri, instance, clickEvents, androidSdkSourcePaths)); return subscriptions; }, - processName, - }; -} + processName + }); +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-java/JavaDebuggerHelpersService.js b/modules/atom-ide-debugger-java/JavaDebuggerHelpersService.js index 4e50002a65..c8264360da 100644 --- a/modules/atom-ide-debugger-java/JavaDebuggerHelpersService.js +++ b/modules/atom-ide-debugger-java/JavaDebuggerHelpersService.js @@ -1,3 +1,66 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getPortForJavaDebugger = getPortForJavaDebugger; +exports.getJavaVSAdapterExecutableInfo = getJavaVSAdapterExecutableInfo; +exports.getSdkVersionSourcePath = getSdkVersionSourcePath; + +function _analytics() { + const data = require("../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function _fsPromise() { + const data = _interopRequireDefault(require("../nuclide-commons/fsPromise")); + + _fsPromise = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +var _os = _interopRequireDefault(require("os")); + +function _process() { + const data = require("../nuclide-commons/process"); + + _process = function () { + return data; + }; + + return data; +} + +function _serverPort() { + const data = require("../nuclide-commons/serverPort"); + + _serverPort = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,187 +69,116 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; -import type {VSAdapterExecutableInfo} from 'nuclide-debugger-common'; - -import {track} from 'nuclide-commons/analytics'; -import fsPromise from 'nuclide-commons/fsPromise'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import os from 'os'; -import {runCommand} from 'nuclide-commons/process'; -import {getAvailableServerPort} from 'nuclide-commons/serverPort'; - -export type JavaLaunchTargetConfig = {| - +debugMode: 'launch', - +entryPointClass: string, - +classPath: string, - +runArgs?: ?Array, -|}; - -export type JavaAttachPortTargetConfig = {| - +debugMode: 'attach', - +machineName: string, - +port: number, - +packageName: string, - +deviceSerial: string, -|}; - -export type JavaTargetConfig = - | JavaLaunchTargetConfig - | JavaAttachPortTargetConfig; - -export type TerminalLaunchInfo = {| - +launchCommand: string, - +launchCwd: NuclideUri, - +targetExecutable: NuclideUri, - +launchArgs: Array, - +attachPort: number, - +attachHost: string, -|}; - const JAVA = 'java'; -export async function getPortForJavaDebugger(): Promise { - return getAvailableServerPort(); +async function getPortForJavaDebugger() { + return (0, _serverPort().getAvailableServerPort)(); } -export async function getJavaVSAdapterExecutableInfo( - debug: boolean, -): Promise { +async function getJavaVSAdapterExecutableInfo(debug) { return { command: JAVA, - args: await _getJavaArgs(debug), + args: await _getJavaArgs(debug) }; } -async function _getJavaArgs(debug: boolean): Promise> { - const baseJavaArgs = [ - '-classpath', - await _getClassPath(), - 'com.facebook.nuclide.debugger.JavaDbg', - ]; - const debugArgs = debug - ? [ - '-Xdebug', - '-Xrunjdwp:transport=dt_socket,address=127.0.0.1:' + - (await getAvailableServerPort()).toString() + - ',server=y,suspend=n', - ] - : []; +async function _getJavaArgs(debug) { + const baseJavaArgs = ['-classpath', await _getClassPath(), 'com.facebook.nuclide.debugger.JavaDbg']; + const debugArgs = debug ? ['-Xdebug', '-Xrunjdwp:transport=dt_socket,address=127.0.0.1:' + (await (0, _serverPort().getAvailableServerPort)()).toString() + ',server=y,suspend=n'] : []; return debugArgs.concat(baseJavaArgs); } -async function _getClassPath(): Promise { - const serverJarPath = nuclideUri.join( - __dirname, - 'Build', - 'java_debugger_server.jar', - ); - - if (!(await fsPromise.exists(serverJarPath))) { - throw new Error( - `Could not locate the java debugger server jar: ${serverJarPath}. ` + - 'Please check your Nuclide installation.', - ); - } +async function _getClassPath() { + const serverJarPath = _nuclideUri().default.join(__dirname, 'Build', 'java_debugger_server.jar'); + + if (!(await _fsPromise().default.exists(serverJarPath))) { + throw new Error(`Could not locate the java debugger server jar: ${serverJarPath}. ` + 'Please check your Nuclide installation.'); + } // Determining JDK lib path varies by platform. + - // Determining JDK lib path varies by platform. let toolsJarPath; - switch (os.platform()) { + + switch (_os.default.platform()) { case 'win32': toolsJarPath = (process.env.JAVA_HOME || '') + '\\lib\\tools.jar'; - - break; - case 'linux': { - // Find java - const java = (await runCommand('which', ['java']).toPromise()).trim(); - const javaHome = await fsPromise.realpath(java); - - // $FlowFixMe (>= v0.75.0) - const matches: RegExp$matchResult = /(.*)\/java/.exec(javaHome); - toolsJarPath = matches.length > 1 ? matches[1] + '/../lib/tools.jar' : ''; break; - } - case 'darwin': - default: { - const javaHome = (await runCommand( - '/usr/libexec/java_home', - ).toPromise()).trim(); - toolsJarPath = javaHome + '/lib/tools.jar'; - break; - } + case 'linux': + { + // Find java + const java = (await (0, _process().runCommand)('which', ['java']).toPromise()).trim(); + const javaHome = await _fsPromise().default.realpath(java); // $FlowFixMe (>= v0.75.0) + + const matches = /(.*)\/java/.exec(javaHome); + toolsJarPath = matches.length > 1 ? matches[1] + '/../lib/tools.jar' : ''; + break; + } + + case 'darwin': + default: + { + const javaHome = (await (0, _process().runCommand)('/usr/libexec/java_home').toPromise()).trim(); + toolsJarPath = javaHome + '/lib/tools.jar'; + break; + } } - if (!(await fsPromise.exists(toolsJarPath))) { + + if (!(await _fsPromise().default.exists(toolsJarPath))) { // Tools.jar is not expected on Java 10+ and is not required. return serverJarPath; } - return nuclideUri.joinPathList([serverJarPath, toolsJarPath]); + + return _nuclideUri().default.joinPathList([serverJarPath, toolsJarPath]); } -export async function getSdkVersionSourcePath( - sdkVersion: string, - options: {useSdkManager: boolean}, -): Promise { +async function getSdkVersionSourcePath(sdkVersion, options) { if (Number.isNaN(parseInt(sdkVersion, 10))) { return null; - } - - // First try process.env.ANDROID_HOME + } // First try process.env.ANDROID_HOME // Then try /opt/android/sdk_DXXXXXXX which is the remote case. // Then try /opt/android_sdk which is the local case - let androidHomeDir = (process.env.ANDROID_HOME: ?string); - let sourcesDirectory = await _getSdkVersionSourcePath( - androidHomeDir, - sdkVersion, - {useSdkManager: options.useSdkManager}, - ); + + let androidHomeDir = process.env.ANDROID_HOME; + let sourcesDirectory = await _getSdkVersionSourcePath(androidHomeDir, sdkVersion, { + useSdkManager: options.useSdkManager + }); + if (sourcesDirectory != null) { return sourcesDirectory; } androidHomeDir = null; const remoteAndroidHomeDirDir = '/opt/android/'; - if (await fsPromise.exists(remoteAndroidHomeDirDir)) { - const children = await fsPromise.readdir(remoteAndroidHomeDirDir); + + if (await _fsPromise().default.exists(remoteAndroidHomeDirDir)) { + const children = await _fsPromise().default.readdir(remoteAndroidHomeDirDir); const sdkDirs = children.filter(c => c.startsWith('sdk_D')); - const sdkDirStats = await Promise.all( - sdkDirs.map(d => - fsPromise.stat(nuclideUri.join(remoteAndroidHomeDirDir, d)), - ), - ); + const sdkDirStats = await Promise.all(sdkDirs.map(d => _fsPromise().default.stat(_nuclideUri().default.join(remoteAndroidHomeDirDir, d)))); const sdkDirTimes = sdkDirStats.map(s => s.mtime.getTime()); - const sortedSdkDirs = sdkDirs - .map((d, i) => [d, sdkDirTimes[i]]) - .sort((a, b) => b[1] - a[1]); + const sortedSdkDirs = sdkDirs.map((d, i) => [d, sdkDirTimes[i]]).sort((a, b) => b[1] - a[1]); + if (sortedSdkDirs.length > 0) { - androidHomeDir = nuclideUri.join( - remoteAndroidHomeDirDir, - sortedSdkDirs[0][0], - ); + androidHomeDir = _nuclideUri().default.join(remoteAndroidHomeDirDir, sortedSdkDirs[0][0]); } } - sourcesDirectory = await _getSdkVersionSourcePath( - androidHomeDir, - sdkVersion, - {useSdkManager: false}, - ); + sourcesDirectory = await _getSdkVersionSourcePath(androidHomeDir, sdkVersion, { + useSdkManager: false + }); + if (sourcesDirectory != null) { return sourcesDirectory; } androidHomeDir = '/opt/android_sdk'; - sourcesDirectory = await _getSdkVersionSourcePath( - androidHomeDir, - sdkVersion, - {useSdkManager: options.useSdkManager}, - ); + sourcesDirectory = await _getSdkVersionSourcePath(androidHomeDir, sdkVersion, { + useSdkManager: options.useSdkManager + }); + if (sourcesDirectory != null) { return sourcesDirectory; } @@ -194,51 +186,40 @@ export async function getSdkVersionSourcePath( return null; } -async function _getSdkVersionSourcePath( - androidHomeDir: ?string, - sdkVersion: string, - options: {useSdkManager: boolean}, -): Promise { +async function _getSdkVersionSourcePath(androidHomeDir, sdkVersion, options) { if (androidHomeDir != null && androidHomeDir !== '') { - const sourcesDirectory = nuclideUri.join( - androidHomeDir, - 'sources', - 'android-' + sdkVersion, - ); + const sourcesDirectory = _nuclideUri().default.join(androidHomeDir, 'sources', 'android-' + sdkVersion); - if (await fsPromise.exists(sourcesDirectory)) { + if (await _fsPromise().default.exists(sourcesDirectory)) { return sourcesDirectory; } - const sdkManagerPath = nuclideUri.join( - androidHomeDir, - 'tools/bin/sdkmanager', - ); + const sdkManagerPath = _nuclideUri().default.join(androidHomeDir, 'tools/bin/sdkmanager'); - if (options.useSdkManager && (await fsPromise.exists(sdkManagerPath))) { + if (options.useSdkManager && (await _fsPromise().default.exists(sdkManagerPath))) { try { - await runCommand(sdkManagerPath, ['sources;android-' + sdkVersion]) - .timeout(30000) - .toPromise(); - // try again - const sourcesDirectoryExists = await fsPromise.exists(sourcesDirectory); - track('atom-ide-debugger-java-installSdkSourcesUsingSdkManager', { + await (0, _process().runCommand)(sdkManagerPath, ['sources;android-' + sdkVersion]).timeout(30000).toPromise(); // try again + + const sourcesDirectoryExists = await _fsPromise().default.exists(sourcesDirectory); + (0, _analytics().track)('atom-ide-debugger-java-installSdkSourcesUsingSdkManager', { sourcesDirectoryExists, sourcesDirectory, - sdkManagerPath, + sdkManagerPath }); + if (sourcesDirectoryExists) { return sourcesDirectory; } } catch (err) { - track('atom-ide-debugger-java-installSdkSourcesUsingSdkManager-error', { + (0, _analytics().track)('atom-ide-debugger-java-installSdkSourcesUsingSdkManager-error', { sourcesDirectoryExists: false, sourcesDirectory, sdkManagerPath, - errMessage: err.toString(), + errMessage: err.toString() }); } } } + return null; -} +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-java/JavaDebuggerHelpersServiceProxy.js b/modules/atom-ide-debugger-java/JavaDebuggerHelpersServiceProxy.js new file mode 100644 index 0000000000..7760872529 --- /dev/null +++ b/modules/atom-ide-debugger-java/JavaDebuggerHelpersServiceProxy.js @@ -0,0 +1,483 @@ +"use strict"; + +module.exports = _client => { + const remoteModule = {}; + + remoteModule.getPortForJavaDebugger = function () { + return _client.callRemoteFunction("JavaDebuggerHelpersService/getPortForJavaDebugger", "promise", _client.marshalArguments(Array.from(arguments), [])).then(value => { + return _client.unmarshal(value, { + kind: "number" + }); + }); + }; + + remoteModule.getJavaVSAdapterExecutableInfo = function (arg0) { + return _client.callRemoteFunction("JavaDebuggerHelpersService/getJavaVSAdapterExecutableInfo", "promise", _client.marshalArguments(Array.from(arguments), [{ + name: "debug", + type: { + kind: "boolean" + } + }])).then(value => { + return _client.unmarshal(value, { + kind: "named", + name: "VSAdapterExecutableInfo" + }); + }); + }; + + remoteModule.getSdkVersionSourcePath = function (arg0, arg1) { + return _client.callRemoteFunction("JavaDebuggerHelpersService/getSdkVersionSourcePath", "promise", _client.marshalArguments(Array.from(arguments), [{ + name: "sdkVersion", + type: { + kind: "string" + } + }, { + name: "options", + type: { + kind: "object", + fields: [{ + name: "useSdkManager", + type: { + kind: "boolean" + }, + optional: false + }] + } + }])).then(value => { + return _client.unmarshal(value, { + kind: "nullable", + type: { + kind: "named", + name: "NuclideUri" + } + }); + }); + }; + + return remoteModule; +}; + +Object.defineProperty(module.exports, "defs", { + value: { + Object: { + kind: "alias", + name: "Object", + location: { + type: "builtin" + } + }, + Date: { + kind: "alias", + name: "Date", + location: { + type: "builtin" + } + }, + RegExp: { + kind: "alias", + name: "RegExp", + location: { + type: "builtin" + } + }, + Buffer: { + kind: "alias", + name: "Buffer", + location: { + type: "builtin" + } + }, + "fs.Stats": { + kind: "alias", + name: "fs.Stats", + location: { + type: "builtin" + } + }, + NuclideUri: { + kind: "alias", + name: "NuclideUri", + location: { + type: "builtin" + } + }, + atom$Point: { + kind: "alias", + name: "atom$Point", + location: { + type: "builtin" + } + }, + atom$Range: { + kind: "alias", + name: "atom$Range", + location: { + type: "builtin" + } + }, + JavaLaunchTargetConfig: { + kind: "alias", + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 23 + }, + name: "JavaLaunchTargetConfig", + definition: { + kind: "object", + fields: [{ + name: "debugMode", + type: { + kind: "string-literal", + value: "launch" + }, + optional: false + }, { + name: "entryPointClass", + type: { + kind: "string" + }, + optional: false + }, { + name: "classPath", + type: { + kind: "string" + }, + optional: false + }, { + name: "runArgs", + type: { + kind: "nullable", + type: { + kind: "array", + type: { + kind: "string" + } + } + }, + optional: true + }] + } + }, + JavaAttachPortTargetConfig: { + kind: "alias", + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 30 + }, + name: "JavaAttachPortTargetConfig", + definition: { + kind: "object", + fields: [{ + name: "debugMode", + type: { + kind: "string-literal", + value: "attach" + }, + optional: false + }, { + name: "machineName", + type: { + kind: "string" + }, + optional: false + }, { + name: "port", + type: { + kind: "number" + }, + optional: false + }, { + name: "packageName", + type: { + kind: "string" + }, + optional: false + }, { + name: "deviceSerial", + type: { + kind: "string" + }, + optional: false + }] + } + }, + JavaTargetConfig: { + kind: "alias", + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 38 + }, + name: "JavaTargetConfig", + definition: { + kind: "union", + types: [{ + kind: "object", + fields: [{ + name: "debugMode", + type: { + kind: "string-literal", + value: "launch" + }, + optional: false + }, { + name: "entryPointClass", + type: { + kind: "string" + }, + optional: false + }, { + name: "classPath", + type: { + kind: "string" + }, + optional: false + }, { + name: "runArgs", + type: { + kind: "nullable", + type: { + kind: "array", + type: { + kind: "string" + } + } + }, + optional: true + }] + }, { + kind: "object", + fields: [{ + name: "debugMode", + type: { + kind: "string-literal", + value: "attach" + }, + optional: false + }, { + name: "machineName", + type: { + kind: "string" + }, + optional: false + }, { + name: "port", + type: { + kind: "number" + }, + optional: false + }, { + name: "packageName", + type: { + kind: "string" + }, + optional: false + }, { + name: "deviceSerial", + type: { + kind: "string" + }, + optional: false + }] + }], + discriminantField: "debugMode" + } + }, + TerminalLaunchInfo: { + kind: "alias", + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 42 + }, + name: "TerminalLaunchInfo", + definition: { + kind: "object", + fields: [{ + name: "launchCommand", + type: { + kind: "string" + }, + optional: false + }, { + name: "launchCwd", + type: { + kind: "named", + name: "NuclideUri" + }, + optional: false + }, { + name: "targetExecutable", + type: { + kind: "named", + name: "NuclideUri" + }, + optional: false + }, { + name: "launchArgs", + type: { + kind: "array", + type: { + kind: "string" + } + }, + optional: false + }, { + name: "attachPort", + type: { + kind: "number" + }, + optional: false + }, { + name: "attachHost", + type: { + kind: "string" + }, + optional: false + }] + } + }, + getPortForJavaDebugger: { + kind: "function", + name: "getPortForJavaDebugger", + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 53 + }, + type: { + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 53 + }, + kind: "function", + argumentTypes: [], + returnType: { + kind: "promise", + type: { + kind: "number" + } + } + } + }, + VSAdapterExecutableInfo: { + kind: "alias", + location: { + type: "source", + fileName: "types.js", + line: 35 + }, + name: "VSAdapterExecutableInfo", + definition: { + kind: "object", + fields: [{ + name: "command", + type: { + kind: "string" + }, + optional: false + }, { + name: "args", + type: { + kind: "array", + type: { + kind: "string" + } + }, + optional: false + }, { + name: "cwd", + type: { + kind: "string" + }, + optional: true + }, { + name: "env", + type: { + kind: "object", + fields: [] + }, + optional: true + }] + } + }, + getJavaVSAdapterExecutableInfo: { + kind: "function", + name: "getJavaVSAdapterExecutableInfo", + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 57 + }, + type: { + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 57 + }, + kind: "function", + argumentTypes: [{ + name: "debug", + type: { + kind: "boolean" + } + }], + returnType: { + kind: "promise", + type: { + kind: "named", + name: "VSAdapterExecutableInfo" + } + } + } + }, + getSdkVersionSourcePath: { + kind: "function", + name: "getSdkVersionSourcePath", + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 131 + }, + type: { + location: { + type: "source", + fileName: "JavaDebuggerHelpersService.js", + line: 131 + }, + kind: "function", + argumentTypes: [{ + name: "sdkVersion", + type: { + kind: "string" + } + }, { + name: "options", + type: { + kind: "object", + fields: [{ + name: "useSdkManager", + type: { + kind: "boolean" + }, + optional: false + }] + } + }], + returnType: { + kind: "promise", + type: { + kind: "nullable", + type: { + kind: "named", + name: "NuclideUri" + } + } + } + } + } + } +}); \ No newline at end of file diff --git a/modules/atom-ide-debugger-java/SourceFilePathsModal.js b/modules/atom-ide-debugger-java/SourceFilePathsModal.js index 771b668bbe..20881f8890 100644 --- a/modules/atom-ide-debugger-java/SourceFilePathsModal.js +++ b/modules/atom-ide-debugger-java/SourceFilePathsModal.js @@ -1,3 +1,76 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SourceFilePathsModal = void 0; + +var React = _interopRequireWildcard(require("react")); + +function _AtomInput() { + const data = require("../nuclide-commons-ui/AtomInput"); + + _AtomInput = function () { + return data; + }; + + return data; +} + +function _ListView() { + const data = require("../nuclide-commons-ui/ListView"); + + _ListView = function () { + return data; + }; + + return data; +} + +function _ButtonGroup() { + const data = require("../nuclide-commons-ui/ButtonGroup"); + + _ButtonGroup = function () { + return data; + }; + + return data; +} + +function _Button() { + const data = require("../nuclide-commons-ui/Button"); + + _Button = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _analytics() { + const data = require("../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,158 +79,124 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ +class SourceFilePathsModal extends React.Component { + constructor(...args) { + var _temp; -import * as React from 'react'; -import {AtomInput} from 'nuclide-commons-ui/AtomInput'; -import {ListView, ListViewItem} from 'nuclide-commons-ui/ListView'; -import {ButtonGroup} from 'nuclide-commons-ui/ButtonGroup'; -import {Button, ButtonTypes} from 'nuclide-commons-ui/Button'; -import nullthrows from 'nullthrows'; -import {track} from 'nuclide-commons/analytics'; - -type Props = { - initialSourcePaths: Array, - sourcePathsChanged: (Array) => void, - onClosed: () => void, -}; - -type State = { - currentPaths: Array, -}; - -export class SourceFilePathsModal extends React.Component { - _newSourcePath: ?AtomInput; - _savedSourcePaths: Array = []; - state = { - currentPaths: this.props.initialSourcePaths.slice(0), - }; + return _temp = super(...args), this._savedSourcePaths = [], this.state = { + currentPaths: this.props.initialSourcePaths.slice(0) + }, this._addItem = () => { + const text = (0, _nullthrows().default)(this._newSourcePath).getText().trim().replace(/;/g, ''); // Do not allow semicolons since we are using them + // to delimit paths. TODO: handle paths that actually contain ;'s? + + if (text !== '') { + this.state.currentPaths.push(text); + (0, _nullthrows().default)(this._newSourcePath).setText(''); + this.setState({ + // TODO: (wbinnssmith) T30771435 this setState depends on current state + // and should use an updater function rather than an object + // eslint-disable-next-line react/no-access-state-in-setstate + currentPaths: this.state.currentPaths + }); + } + }, this._cancelClick = () => { + this.setState({ + currentPaths: this._savedSourcePaths + }); + this.props.onClosed(); + (0, _analytics().track)('fb-java-debugger-source-dialog-cancel', {}); + }, this._handleSaveClick = () => { + this._addItem(); + + this._savedSourcePaths = this.state.currentPaths.slice(0); + this.props.sourcePathsChanged(this._savedSourcePaths); + this.props.onClosed(); + (0, _analytics().track)('fb-java-debugger-source-dialog-saved', {}); + }, _temp; + } _getSourcePathControls() { const items = []; const paths = Array.from(new Set(this.state.currentPaths)); if (paths.length === 0) { - return [ - -
- (No custom source file paths have been specified) -
-
, - ]; + return [React.createElement(_ListView().ListViewItem, { + key: 0, + index: 0 + }, React.createElement("div", null, React.createElement("i", null, "(No custom source file paths have been specified)")))]; } paths.forEach((path, idx) => { - items.push( - -
- { - this.state.currentPaths.splice(idx, 1); - this.setState({ - // TODO: (wbinnssmith) T30771435 this setState depends on current state - // and should use an updater function rather than an object - // eslint-disable-next-line react/no-access-state-in-setstate - currentPaths: this.state.currentPaths, - }); - }} - /> - {path} -
-
, - ); + items.push(React.createElement(_ListView().ListViewItem, { + key: idx, + index: idx + }, React.createElement("div", { + className: "block" + }, React.createElement("i", { + className: "icon icon-x nuclide-source-content-x", + title: "Remove path", + onClick: () => { + this.state.currentPaths.splice(idx, 1); + this.setState({ + // TODO: (wbinnssmith) T30771435 this setState depends on current state + // and should use an updater function rather than an object + // eslint-disable-next-line react/no-access-state-in-setstate + currentPaths: this.state.currentPaths + }); + } + }), React.createElement("span", null, path)))); }); return items; } - _addItem = () => { - const text = nullthrows(this._newSourcePath) - .getText() - .trim() - .replace(/;/g, ''); // Do not allow semicolons since we are using them - // to delimit paths. TODO: handle paths that actually contain ;'s? - - if (text !== '') { - this.state.currentPaths.push(text); - nullthrows(this._newSourcePath).setText(''); - this.setState({ - // TODO: (wbinnssmith) T30771435 this setState depends on current state - // and should use an updater function rather than an object - // eslint-disable-next-line react/no-access-state-in-setstate - currentPaths: this.state.currentPaths, - }); - } - }; - - render(): React.Node { + render() { const sourcePaths = this._getSourcePathControls(); - return ( -
-
-

Configure source file paths:

-
- - Nuclide will automatically search for source in your project root - paths. You can add additional search paths here. - -
-
- { - this._newSourcePath = input; - }} - initialValue="" - autofocus={true} - placeholderText="Add a source file path..." - /> - -
-
- {sourcePaths} -
-
-
- - - - -
-
- ); - } - _cancelClick = (): void => { - this.setState({ - currentPaths: this._savedSourcePaths, - }); - this.props.onClosed(); - track('fb-java-debugger-source-dialog-cancel', {}); - }; + return React.createElement("div", { + className: "sourcepath-modal" + }, React.createElement("div", { + className: "select-list" + }, React.createElement("h2", null, "Configure source file paths:"), React.createElement("div", { + className: "nuclide-source-add-content" + }, React.createElement("span", null, "Nuclide will automatically search for source in your project root paths. You can add additional search paths here.")), React.createElement("div", { + className: "sourcepath-add-bar" + }, React.createElement(_AtomInput().AtomInput, { + className: "sourcepath-pane", + ref: input => { + this._newSourcePath = input; + }, + initialValue: "", + autofocus: true, + placeholderText: "Add a source file path..." + }), React.createElement(_Button().Button, { + onClick: this._addItem, + title: "Add Path", + className: "sourcepath-add-button" + }, React.createElement("i", { + className: "icon icon-plus" + }))), React.createElement("div", { + className: "sourcepath-sources" + }, React.createElement(_ListView().ListView, { + alternateBackground: true + }, sourcePaths))), React.createElement("div", { + className: "sourcepath-buttons", + style: { + display: 'flex', + flexDirection: 'row-reverse' + } + }, React.createElement(_ButtonGroup().ButtonGroup, null, React.createElement(_Button().Button, { + tabIndex: "17", + onClick: this._cancelClick + }, "Cancel"), React.createElement(_Button().Button, { + buttonType: _Button().ButtonTypes.PRIMARY, + tabIndex: "16", + onClick: this._handleSaveClick + }, "Save")))); + } - _handleSaveClick = (): void => { - this._addItem(); - this._savedSourcePaths = this.state.currentPaths.slice(0); - this.props.sourcePathsChanged(this._savedSourcePaths); - this.props.onClosed(); - track('fb-java-debugger-source-dialog-saved', {}); - }; } + +exports.SourceFilePathsModal = SourceFilePathsModal; \ No newline at end of file diff --git a/modules/atom-ide-debugger-java/__tests__/vscode-java-debugger-test.js b/modules/atom-ide-debugger-java/__tests__/vscode-java-debugger-test.js index 4fcdba7d66..c06a9613bf 100644 --- a/modules/atom-ide-debugger-java/__tests__/vscode-java-debugger-test.js +++ b/modules/atom-ide-debugger-java/__tests__/vscode-java-debugger-test.js @@ -1,3 +1,71 @@ +"use strict"; + +function _log4js() { + const data = require("log4js"); + + _log4js = function () { + return data; + }; + + return data; +} + +function DebugProtocol() { + const data = _interopRequireWildcard(require("vscode-debugprotocol")); + + DebugProtocol = function () { + return data; + }; + + return data; +} + +var fs = _interopRequireWildcard(require("fs")); + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _process() { + const data = require("../../nuclide-commons/process"); + + _process = function () { + return data; + }; + + return data; +} + +function _VsDebugSession() { + const data = _interopRequireDefault(require("../../nuclide-debugger-common/VsDebugSession")); + + _VsDebugSession = function () { + return data; + }; + + return data; +} + +function _JavaDebuggerHelpersService() { + const data = require("../JavaDebuggerHelpersService"); + + _JavaDebuggerHelpersService = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,42 +74,28 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format * @emails oncall+nuclide */ -import {getLogger} from 'log4js'; -import * as DebugProtocol from 'vscode-debugprotocol'; -import * as fs from 'fs'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {runCommand} from 'nuclide-commons/process'; -import VsDebugSession from 'nuclide-debugger-common/VsDebugSession'; -import {getJavaVSAdapterExecutableInfo} from '../JavaDebuggerHelpersService'; - -const logger = getLogger('vscode-java-debugger-spec'); -const JAVA_FIXTURES = nuclideUri.join( - __dirname, - '../__mocks__/fixtures', - 'java', -); +const logger = (0, _log4js().getLogger)('vscode-java-debugger-spec'); + +const JAVA_FIXTURES = _nuclideUri().default.join(__dirname, '../__mocks__/fixtures', 'java'); + const THREAD_ID = 1; -const JAVA_DEBUGGER_PKG = nuclideUri.join(__dirname, '..'); -function makeSource(name: string): DebugProtocol.Source { +const JAVA_DEBUGGER_PKG = _nuclideUri().default.join(__dirname, '..'); + +function makeSource(name) { return { name, - path: nuclideUri.join(JAVA_FIXTURES, name), + path: _nuclideUri().default.join(JAVA_FIXTURES, name) }; } -async function checkResponse( - responsePromise: Promise, - additionalValidation?: T => void, -): Promise { +async function checkResponse(responsePromise, additionalValidation) { const response = await responsePromise; - expect(response.success).toBeTruthy( - `Expected successful response, got ${JSON.stringify(response)}`, - ); + expect(response.success).toBeTruthy(`Expected successful response, got ${JSON.stringify(response)}`); if (additionalValidation != null) { additionalValidation(response); @@ -50,72 +104,43 @@ async function checkResponse( return response; } -async function checkLine( - session: VsDebugSession, - expectedLine: number, -): Promise { - await checkResponse(session.stackTrace({threadId: THREAD_ID}), response => { +async function checkLine(session, expectedLine) { + await checkResponse(session.stackTrace({ + threadId: THREAD_ID + }), response => { expect(response.body.stackFrames[0].line).toBe(expectedLine); }); } -async function withSessionLaunch( - className: string, - breakpoints?: DebugProtocol.SetBreakpointsArguments, - sessionContinuation: (VsDebugSession, any) => Promise, -): Promise { +async function withSessionLaunch(className, breakpoints, sessionContinuation) { let session = null; - try { - session = new VsDebugSession( - process.pid.toString(), - logger, - await getJavaVSAdapterExecutableInfo(false), - ); - await checkResponse( - session.initialize({ - adapterID: 'java', - clientID: 'Nuclide-Spec', - columnsStartAt1: true, - linesStartAt1: true, - pathFormat: 'path', - }), - ); - - await Promise.all([ - checkResponse( - session.launch({ - classPath: JAVA_FIXTURES, - entryPointClass: className, - }), - ), - session - .observeThreadEvents() - .take(4) - .toPromise(), - session - .observeInitializeEvents() - .take(1) - .toPromise(), - ]); - - await checkResponse(session.setExceptionBreakpoints({filters: []})); + try { + session = new (_VsDebugSession().default)(process.pid.toString(), logger, (await (0, _JavaDebuggerHelpersService().getJavaVSAdapterExecutableInfo)(false))); + await checkResponse(session.initialize({ + adapterID: 'java', + clientID: 'Nuclide-Spec', + columnsStartAt1: true, + linesStartAt1: true, + pathFormat: 'path' + })); + await Promise.all([checkResponse(session.launch({ + classPath: JAVA_FIXTURES, + entryPointClass: className + })), session.observeThreadEvents().take(4).toPromise(), session.observeInitializeEvents().take(1).toPromise()]); + await checkResponse(session.setExceptionBreakpoints({ + filters: [] + })); let unverifiedBreakpoints = []; + if (breakpoints != null) { await checkResponse(session.setBreakpoints(breakpoints), response => { - unverifiedBreakpoints = response.body.breakpoints.filter( - bp => !bp.verified, - ); + unverifiedBreakpoints = response.body.breakpoints.filter(bp => !bp.verified); }); } await checkResponse(session.configurationDone()); - - await session - .observeContinuedEvents() - .take(1) - .toPromise(); - + await session.observeContinuedEvents().take(1).toPromise(); await sessionContinuation(session, unverifiedBreakpoints); } catch (error) { logger.error('error in withSessionLaunch', error, error.stack); @@ -127,38 +152,21 @@ async function withSessionLaunch( } } -async function continueSession(session: VsDebugSession): Promise { - await Promise.all([ - session - .observeContinuedEvents() - .take(1) - .toPromise(), - checkResponse(session.continue({threadId: THREAD_ID})), - ]); +async function continueSession(session) { + await Promise.all([session.observeContinuedEvents().take(1).toPromise(), checkResponse(session.continue({ + threadId: THREAD_ID + }))]); } -async function verifyUnverifiedBreakpoints( - session: VsDebugSession, - unverifiedBreakpoints: any, -): Promise { +async function verifyUnverifiedBreakpoints(session, unverifiedBreakpoints) { if (unverifiedBreakpoints.length > 0) { let allBreakpointsVerified = false; - await session - .observeBreakpointEvents() - .take(unverifiedBreakpoints.length) - .toArray() - .toPromise() - .then(result => (allBreakpointsVerified = true)); - - expect(allBreakpointsVerified).toBeTruthy( - `The following breakpoints could not be set: ${JSON.stringify( - unverifiedBreakpoints, - )}`, - ); + await session.observeBreakpointEvents().take(unverifiedBreakpoints.length).toArray().toPromise().then(result => allBreakpointsVerified = true); + expect(allBreakpointsVerified).toBeTruthy(`The following breakpoints could not be set: ${JSON.stringify(unverifiedBreakpoints)}`); } -} +} // eslint-disable-next-line jasmine/no-disabled-tests + -// eslint-disable-next-line jasmine/no-disabled-tests xdescribe('vscode-java-debugger', () => { let hasDoneSetup = false; beforeEach(async () => { @@ -167,10 +175,9 @@ xdescribe('vscode-java-debugger', () => { return; } - await runCommand('env', ['-u', 'NO_BUCKD', './scripts/build'], { - cwd: JAVA_DEBUGGER_PKG, + await (0, _process().runCommand)('env', ['-u', 'NO_BUCKD', './scripts/build'], { + cwd: JAVA_DEBUGGER_PKG }).toPromise(); - const javaFiles = await new Promise((resolve, reject) => { fs.readdir(JAVA_FIXTURES, (err, files) => { if (err) { @@ -180,202 +187,133 @@ xdescribe('vscode-java-debugger', () => { resolve(files.filter(file => file.endsWith('.java'))); }); }); - - await Promise.all( - javaFiles.map(file => - runCommand('javac', ['-g', file], {cwd: JAVA_FIXTURES}).toPromise(), - ), - ); - + await Promise.all(javaFiles.map(file => (0, _process().runCommand)('javac', ['-g', file], { + cwd: JAVA_FIXTURES + }).toPromise())); hasDoneSetup = true; })(); }); - afterEach(() => { // The java debugger, when it launches a script, uses a port. We need to // wait between each test case to give the system a moment to realize // that the port has been free'd up. waits(2000); }); - it('launches and outputs console messages', async () => { - await withSessionLaunch( - 'SimpleClass', - { - source: makeSource('SimpleClass.java'), - breakpoints: [{line: 11}], - }, - async (session, unverifiedBreakpoints) => { - await session - .observeOutputEvents() - .filter(response => response.body.category === 'stdout') - .map(response => response.body.output) - .take(1) - .toPromise() - .then(output => { - expect(output).toEqual( - 'Name: Not Aman Agarwal with id: 1234567890\n', - ); - }); - }, - ); + await withSessionLaunch('SimpleClass', { + source: makeSource('SimpleClass.java'), + breakpoints: [{ + line: 11 + }] + }, async (session, unverifiedBreakpoints) => { + await session.observeOutputEvents().filter(response => response.body.category === 'stdout').map(response => response.body.output).take(1).toPromise().then(output => { + expect(output).toEqual('Name: Not Aman Agarwal with id: 1234567890\n'); + }); + }); }); - it('breaks at a breakpoint', async () => { - await withSessionLaunch( - 'SimpleClass', - { - source: makeSource('SimpleClass.java'), - breakpoints: [{line: 11}], - }, - async (session, unverifiedBreakpoints) => { - await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); - - await session - .observeStopEvents() - .take(1) - .toPromise(); - - await checkLine(session, 11); - }, - ); + await withSessionLaunch('SimpleClass', { + source: makeSource('SimpleClass.java'), + breakpoints: [{ + line: 11 + }] + }, async (session, unverifiedBreakpoints) => { + await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); + await session.observeStopEvents().take(1).toPromise(); + await checkLine(session, 11); + }); }); - it('sets multiple breakpoints', async () => { - await withSessionLaunch( - 'SimpleClass', - { - source: makeSource('SimpleClass.java'), - breakpoints: [{line: 8}, {line: 23}], - }, - async (session, unverifiedBreakpoints) => { - await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); - - await session - .observeStopEvents() - .take(1) - .toPromise(); - await checkLine(session, 8); - - await continueSession(session); - - await session - .observeStopEvents() - .take(1) - .toPromise(); - await checkLine(session, 23); - }, - ); + await withSessionLaunch('SimpleClass', { + source: makeSource('SimpleClass.java'), + breakpoints: [{ + line: 8 + }, { + line: 23 + }] + }, async (session, unverifiedBreakpoints) => { + await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); + await session.observeStopEvents().take(1).toPromise(); + await checkLine(session, 8); + await continueSession(session); + await session.observeStopEvents().take(1).toPromise(); + await checkLine(session, 23); + }); }); - it('supports step-over, step-in, and step-out', async () => { - await withSessionLaunch( - 'SimpleClass', - { - source: makeSource('SimpleClass.java'), - breakpoints: [{line: 11}], - }, - async (session, unverifiedBreakpoints) => { - await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); - - await session - .observeStopEvents() - .take(1) - .toPromise(); - await checkLine(session, 11); - - await checkResponse(session.next({threadId: THREAD_ID})); - await checkLine(session, 12); - - await checkResponse(session.stepIn({threadId: THREAD_ID})); - await checkLine(session, 22); - - await checkResponse(session.stepOut({threadId: THREAD_ID})); - await checkLine(session, 12); - }, - ); + await withSessionLaunch('SimpleClass', { + source: makeSource('SimpleClass.java'), + breakpoints: [{ + line: 11 + }] + }, async (session, unverifiedBreakpoints) => { + await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); + await session.observeStopEvents().take(1).toPromise(); + await checkLine(session, 11); + await checkResponse(session.next({ + threadId: THREAD_ID + })); + await checkLine(session, 12); + await checkResponse(session.stepIn({ + threadId: THREAD_ID + })); + await checkLine(session, 22); + await checkResponse(session.stepOut({ + threadId: THREAD_ID + })); + await checkLine(session, 12); + }); }); - it('evaluates expressions', async () => { - await withSessionLaunch( - 'SimpleClass', - { - source: makeSource('SimpleClass.java'), - breakpoints: [{line: 11}], - }, - async (session, unverifiedBreakpoints) => { - await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); - - await session - .observeStopEvents() - .take(1) - .toPromise(); - await checkLine(session, 11); - - const frameId = (await checkResponse( - session.stackTrace({threadId: THREAD_ID}), - )).body.stackFrames[0].id; - await checkResponse( - session.evaluate({expression: 'tc', frameId}), - response => { - // we do not check the exact id of the class because any changes made in the class - // preparation code causes this id to change, I may add the id back into the test - // once the Java debugger codebase has stabilized - expect( - response.body.result.includes( - 'class SimpleClass (loaded by instance of sun.misc.Launcher$AppClassLoader(id=', - ), - ).toBeTruthy(); - }, - ); - }, - ); + await withSessionLaunch('SimpleClass', { + source: makeSource('SimpleClass.java'), + breakpoints: [{ + line: 11 + }] + }, async (session, unverifiedBreakpoints) => { + await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); + await session.observeStopEvents().take(1).toPromise(); + await checkLine(session, 11); + const frameId = (await checkResponse(session.stackTrace({ + threadId: THREAD_ID + }))).body.stackFrames[0].id; + await checkResponse(session.evaluate({ + expression: 'tc', + frameId + }), response => { + // we do not check the exact id of the class because any changes made in the class + // preparation code causes this id to change, I may add the id back into the test + // once the Java debugger codebase has stabilized + expect(response.body.result.includes('class SimpleClass (loaded by instance of sun.misc.Launcher$AppClassLoader(id=')).toBeTruthy(); + }); + }); }); - it('checks threads', async () => { await (async () => { - await withSessionLaunch( - 'SimpleClass', - { - source: makeSource('SimpleClass.java'), - breakpoints: [{line: 11}], - }, - async (session, unverifiedBreakpoints) => { - await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); - - await session - .observeStopEvents() - .take(1) - .toPromise(); - - await checkLine(session, 11); - - await checkResponse(session.threads(), response => { - const {threads} = response.body; - expect(threads.length).toEqual(4); - const threadNames = new Set(threads.map(t => t.name)); - const THREAD_NAMES = [ - 'Signal Dispatcher', - 'Finalizer', - 'Reference Handler', - 'main', - ]; - expect( - THREAD_NAMES.every(name => { - const foundThread = threadNames.has(name); - expect(foundThread).toBeTruthy( - 'Could not find thread with name: ' + name, - ); - return foundThread; - }), - ).toBeTruthy('We are missing some threads'); - expect( - threads.filter(t => t.name === 'main' && t.id === 1).length, - ).toBe(1, 'Main thread not found with correct id'); - }); - }, - ); + await withSessionLaunch('SimpleClass', { + source: makeSource('SimpleClass.java'), + breakpoints: [{ + line: 11 + }] + }, async (session, unverifiedBreakpoints) => { + await verifyUnverifiedBreakpoints(session, unverifiedBreakpoints); + await session.observeStopEvents().take(1).toPromise(); + await checkLine(session, 11); + await checkResponse(session.threads(), response => { + const { + threads + } = response.body; + expect(threads.length).toEqual(4); + const threadNames = new Set(threads.map(t => t.name)); + const THREAD_NAMES = ['Signal Dispatcher', 'Finalizer', 'Reference Handler', 'main']; + expect(THREAD_NAMES.every(name => { + const foundThread = threadNames.has(name); + expect(foundThread).toBeTruthy('Could not find thread with name: ' + name); + return foundThread; + })).toBeTruthy('We are missing some threads'); + expect(threads.filter(t => t.name === 'main' && t.id === 1).length).toBe(1, 'Main thread not found with correct id'); + }); + }); })(); - }); - // end -}); + }); // end +}); \ No newline at end of file diff --git a/modules/atom-ide-debugger-java/main.js b/modules/atom-ide-debugger-java/main.js index df7fbfa272..3650b55bb8 100644 --- a/modules/atom-ide-debugger-java/main.js +++ b/modules/atom-ide-debugger-java/main.js @@ -1,3 +1,47 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +function _AutoGenLaunchAttachProvider() { + const data = require("../nuclide-debugger-common/AutoGenLaunchAttachProvider"); + + _AutoGenLaunchAttachProvider = function () { + return data; + }; + + return data; +} + +function _utils() { + const data = require("./utils"); + + _utils = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,59 +50,38 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type { - NuclideDebuggerProvider, - DebuggerConfigurationProvider, -} from 'nuclide-debugger-common/types'; -import type {DebuggerSourcePathsService} from 'nuclide-debugger-common/types'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import {VsAdapterTypes, VsAdapterNames} from 'nuclide-debugger-common'; -import {AutoGenLaunchAttachProvider} from 'nuclide-debugger-common/AutoGenLaunchAttachProvider'; -import { - getJavaConfig, - setRpcService, - resolveConfiguration, - setSourcePathsService, -} from './utils'; - class Activation { constructor() {} + dispose() {} - createDebuggerProvider(): NuclideDebuggerProvider { + createDebuggerProvider() { return { - type: VsAdapterTypes.JAVA, + type: _nuclideDebuggerCommon().VsAdapterTypes.JAVA, getLaunchAttachProvider: connection => { - return new AutoGenLaunchAttachProvider( - VsAdapterNames.JAVA, - connection, - getJavaConfig(), - ); - }, + return new (_AutoGenLaunchAttachProvider().AutoGenLaunchAttachProvider)(_nuclideDebuggerCommon().VsAdapterNames.JAVA, connection, (0, _utils().getJavaConfig)()); + } }; } - createDebuggerConfigurator(): Array { - return [ - { - resolveConfiguration, - adapterType: VsAdapterTypes.JAVA, - }, - ]; + createDebuggerConfigurator() { + return [{ + resolveConfiguration: _utils().resolveConfiguration, + adapterType: _nuclideDebuggerCommon().VsAdapterTypes.JAVA + }]; } - consumeRpcService(rpcService: nuclide$RpcService): IDisposable { - return setRpcService(rpcService); + consumeRpcService(rpcService) { + return (0, _utils().setRpcService)(rpcService); } - consumeSourcePathsService(sourcePathsService: DebuggerSourcePathsService) { - return setSourcePathsService(sourcePathsService); + consumeSourcePathsService(sourcePathsService) { + return (0, _utils().setSourcePathsService)(sourcePathsService); } + } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-debugger-java/types.js b/modules/atom-ide-debugger-java/types.js index d83be8b297..9a390c31f7 100644 --- a/modules/atom-ide-debugger-java/types.js +++ b/modules/atom-ide-debugger-java/types.js @@ -1,47 +1 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; -import type {IProcessConfig} from 'nuclide-debugger-common/types'; - -export type SuggestedProjectPath = { - projectPath: NuclideUri, - suggested: boolean, - hostLabel: string, -}; - -export interface DebuggerSourcePathsService { - addKnownJavaSubdirectoryPaths( - remote: boolean, - translatedPath: string, - searchPaths: Array, - ): void; - observeSuggestedAndroidProjectPaths( - callback: (Array) => void, - ): IDisposable; -} - -export type IJavaLaunchProcessConfig = {| - ...IProcessConfig, - +config: {| - classPath: string, - entryPointClass: string, - runArgs?: string[], - |}, -|}; - -export type IJavaAttachProcessConfig = {| - ...IProcessConfig, - +config: {| - javaJdwpPort: number, - |}, -|}; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-debugger-java/utils.js b/modules/atom-ide-debugger-java/utils.js index b2ee3ae184..0349dbd877 100644 --- a/modules/atom-ide-debugger-java/utils.js +++ b/modules/atom-ide-debugger-java/utils.js @@ -1,3 +1,124 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getJavaConfig = getJavaConfig; +exports.getCustomControlButtonsForJavaSourcePaths = getCustomControlButtonsForJavaSourcePaths; +exports.getDefaultSourceSearchPaths = getDefaultSourceSearchPaths; +exports.getSavedPathsFromConfig = getSavedPathsFromConfig; +exports.persistSourcePathsToConfig = persistSourcePathsToConfig; +exports.getDialogValues = getDialogValues; +exports.getSourcePathString = getSourcePathString; +exports.getSourcePathClickSubscriptionsOnVspInstance = getSourcePathClickSubscriptionsOnVspInstance; +exports.getSourcePathClickSubscriptions = getSourcePathClickSubscriptions; +exports.resolveConfiguration = resolveConfiguration; +exports.setSourcePathsService = setSourcePathsService; +exports.setRpcService = setRpcService; +exports.getJavaDebuggerHelpersServiceByNuclideUri = getJavaDebuggerHelpersServiceByNuclideUri; +exports.createJavaAttachConfig = createJavaAttachConfig; +exports.NUCLIDE_DEBUGGER_DEV_GK = void 0; + +var _assert = _interopRequireDefault(require("assert")); + +function _featureConfig() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/feature-config")); + + _featureConfig = function () { + return data; + }; + + return data; +} + +function _showModal() { + const data = _interopRequireDefault(require("../nuclide-commons-ui/showModal")); + + _showModal = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +var React = _interopRequireWildcard(require("react")); + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _constants() { + const data = require("../nuclide-debugger-common/constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function JavaDebuggerHelpersServiceLocal() { + const data = _interopRequireWildcard(require("./JavaDebuggerHelpersService")); + + JavaDebuggerHelpersServiceLocal = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _SourceFilePathsModal() { + const data = require("./SourceFilePathsModal"); + + _SourceFilePathsModal = function () { + return data; + }; + + return data; +} + +function _analytics() { + const data = require("../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,181 +127,137 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ +let _sourcePathsService; + +let _rpcService = null; +const NUCLIDE_DEBUGGER_DEV_GK = 'nuclide_debugger_dev'; +exports.NUCLIDE_DEBUGGER_DEV_GK = NUCLIDE_DEBUGGER_DEV_GK; -import type {AnyTeardown} from 'nuclide-commons/UniversalDisposable'; -import type { - AutoGenConfig, - IProcessConfig, - ControlButtonSpecification, - IVspInstance, -} from 'nuclide-debugger-common/types'; -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; -import type {DebuggerSourcePathsService} from 'nuclide-debugger-common/types'; -import type {IJavaAttachProcessConfig} from './types'; - -import typeof * as JavaDebuggerHelpersService from './JavaDebuggerHelpersService'; - -import assert from 'assert'; -import featureConfig from 'nuclide-commons-atom/feature-config'; -import showModal from 'nuclide-commons-ui/showModal'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {Subject, Observable} from 'rxjs'; -import * as React from 'react'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {VsAdapterTypes} from 'nuclide-debugger-common/constants'; -import * as JavaDebuggerHelpersServiceLocal from './JavaDebuggerHelpersService'; -import nullthrows from 'nullthrows'; -import {SourceFilePathsModal} from './SourceFilePathsModal'; -import {track} from 'nuclide-commons/analytics'; - -let _sourcePathsService: ?DebuggerSourcePathsService; -let _rpcService: ?nuclide$RpcService = null; - -export const NUCLIDE_DEBUGGER_DEV_GK = 'nuclide_debugger_dev'; - -export function getJavaConfig(): AutoGenConfig { +function getJavaConfig() { const entryPointClass = { name: 'entryPointClass', type: 'string', description: 'Input the Java entry point name you want to launch', required: true, - visible: true, + visible: true }; const classPath = { name: 'classPath', type: 'string', description: 'Java class path', required: true, - visible: true, + visible: true }; const consoleEnum = { name: 'console', type: 'enum', enums: ['internalConsole', 'integratedTerminal'], - description: - 'Integrated Terminal means that it will run in a terminal that can interact with standard input and output.', + description: 'Integrated Terminal means that it will run in a terminal that can interact with standard input and output.', defaultValue: 'internalConsole', required: true, - visible: true, + visible: true }; - const javaJdwpPort = { name: 'javaJdwpPort', type: 'number', description: 'Java debugger port', required: true, - visible: true, + visible: true }; return { launch: { launch: true, - vsAdapterType: VsAdapterTypes.JAVA, + vsAdapterType: _constants().VsAdapterTypes.JAVA, properties: [entryPointClass, classPath, consoleEnum], cwdPropertyName: 'cwd', header: null, + getProcessName(values) { return values.entryPointClass; - }, + } + }, attach: { launch: false, - vsAdapterType: VsAdapterTypes.JAVA, + vsAdapterType: _constants().VsAdapterTypes.JAVA, properties: [javaJdwpPort], header: null, + getProcessName(values) { return 'Port: ' + values.javaJdwpPort; - }, - }, + } + + } }; } -export function getCustomControlButtonsForJavaSourcePaths( - clickEvents: rxjs$Subject, -): ControlButtonSpecification[] { - return [ - { - icon: 'file-code', - title: 'Set Source Path', - onClick: () => clickEvents.next(), - }, - ]; +function getCustomControlButtonsForJavaSourcePaths(clickEvents) { + return [{ + icon: 'file-code', + title: 'Set Source Path', + onClick: () => clickEvents.next() + }]; } -export function getDefaultSourceSearchPaths( - targetUri: NuclideUri, -): Array { - const searchPaths: Array = []; - const remote = nuclideUri.isRemote(targetUri); +function getDefaultSourceSearchPaths(targetUri) { + const searchPaths = []; - // Add all the project root paths as potential source locations the Java + const remote = _nuclideUri().default.isRemote(targetUri); // Add all the project root paths as potential source locations the Java // debugger server should check for resolving source. // NOTE: the Java debug server will just ignore any directory path that doesn't exist. + + atom.project.getPaths().forEach(path => { - if ( - (remote && nuclideUri.isRemote(path)) || - (!remote && nuclideUri.isLocal(path)) - ) { - const translatedPath = remote ? nuclideUri.getPath(path) : path; + if (remote && _nuclideUri().default.isRemote(path) || !remote && _nuclideUri().default.isLocal(path)) { + const translatedPath = remote ? _nuclideUri().default.getPath(path) : path; searchPaths.push(translatedPath); if (_sourcePathsService != null) { - _sourcePathsService.addKnownJavaSubdirectoryPaths( - remote, - translatedPath, - searchPaths, - ); + _sourcePathsService.addKnownJavaSubdirectoryPaths(remote, translatedPath, searchPaths); } } }); - return searchPaths; } -export function getSavedPathsFromConfig(): Array { - const paths = featureConfig.get('nuclide-debugger-java.sourceFilePaths'); - // flowlint-next-line sketchy-null-mixed:off +function getSavedPathsFromConfig() { + const paths = _featureConfig().default.get('nuclide-debugger-java.sourceFilePaths'); // flowlint-next-line sketchy-null-mixed:off + + if (paths && typeof paths === 'string') { - return (paths: string).split(';'); + return paths.split(';'); } else { - featureConfig.set('nuclide-debugger-java.sourceFilePaths', ''); + _featureConfig().default.set('nuclide-debugger-java.sourceFilePaths', ''); } + return []; } -export function persistSourcePathsToConfig( - newSourcePaths: Array, -): void { - featureConfig.set( - 'nuclide-debugger-java.sourceFilePaths', - newSourcePaths.join(';'), - ); +function persistSourcePathsToConfig(newSourcePaths) { + _featureConfig().default.set('nuclide-debugger-java.sourceFilePaths', newSourcePaths.join(';')); } -export function getDialogValues( - clickEvents: rxjs$Subject, -): rxjs$Observable> { +function getDialogValues(clickEvents) { let userSourcePaths = getSavedPathsFromConfig(); return clickEvents.switchMap(() => { - return Observable.create(observer => { - const modalDisposable = showModal( - ({dismiss}) => ( - ) => { - userSourcePaths = newPaths; - persistSourcePathsToConfig(newPaths); - observer.next(newPaths); - }} - onClosed={dismiss} - /> - ), - {className: 'sourcepath-modal-container'}, - ); - - track('fb-java-debugger-source-dialog-shown'); + return _rxjsCompatUmdMin.Observable.create(observer => { + const modalDisposable = (0, _showModal().default)(({ + dismiss + }) => React.createElement(_SourceFilePathsModal().SourceFilePathsModal, { + initialSourcePaths: userSourcePaths, + sourcePathsChanged: newPaths => { + userSourcePaths = newPaths; + persistSourcePathsToConfig(newPaths); + observer.next(newPaths); + }, + onClosed: dismiss + }), { + className: 'sourcepath-modal-container' + }); + (0, _analytics().track)('fb-java-debugger-source-dialog-shown'); return () => { modalDisposable.dispose(); }; @@ -188,120 +265,78 @@ export function getDialogValues( }); } -export function getSourcePathString(searchPaths: Array): string { +function getSourcePathString(searchPaths) { return searchPaths.join(';'); } -export function getSourcePathClickSubscriptionsOnVspInstance( - targetUri: NuclideUri, - vspInstance: IVspInstance, - clickEvents: rxjs$Subject, -): Array { +function getSourcePathClickSubscriptionsOnVspInstance(targetUri, vspInstance, clickEvents) { const defaultValues = getDefaultSourceSearchPaths(targetUri); - return [ - getDialogValues(clickEvents) - .startWith(getSavedPathsFromConfig()) - .subscribe(userValues => { - vspInstance.customRequest('setSourcePath', { - sourcePath: getSourcePathString(defaultValues.concat(userValues)), - }); - }), - clickEvents, - ]; + return [getDialogValues(clickEvents).startWith(getSavedPathsFromConfig()).subscribe(userValues => { + vspInstance.customRequest('setSourcePath', { + sourcePath: getSourcePathString(defaultValues.concat(userValues)) + }); + }), clickEvents]; } -export function getSourcePathClickSubscriptions( - targetUri: NuclideUri, - instance: IVspInstance, - clickEvents: rxjs$Subject, - additionalSourcePaths?: Array = [], -): Array { - const defaultValues = getDefaultSourceSearchPaths(targetUri).concat( - additionalSourcePaths, - ); - return [ - getDialogValues(clickEvents) - .startWith(getSavedPathsFromConfig()) - .subscribe(userValues => { - instance.customRequest('setSourcePath', { - sourcePath: getSourcePathString(defaultValues.concat(userValues)), - }); - }), - clickEvents, - ]; +function getSourcePathClickSubscriptions(targetUri, instance, clickEvents, additionalSourcePaths = []) { + const defaultValues = getDefaultSourceSearchPaths(targetUri).concat(additionalSourcePaths); + return [getDialogValues(clickEvents).startWith(getSavedPathsFromConfig()).subscribe(userValues => { + instance.customRequest('setSourcePath', { + sourcePath: getSourcePathString(defaultValues.concat(userValues)) + }); + }), clickEvents]; } -export async function resolveConfiguration( - configuration: IProcessConfig, -): Promise { - const {targetUri} = configuration; - - // If the incomming configuration already has a starting callback, +async function resolveConfiguration(configuration) { + const { + targetUri + } = configuration; // If the incomming configuration already has a starting callback, // we'd need to combine them. Guard against this bug being introduced // in the future. - assert(configuration.onDebugStartingCallback == null); - const clickEvents = new Subject(); - const javaAdapterExecutable = await getJavaDebuggerHelpersServiceByNuclideUri( - targetUri, - ).getJavaVSAdapterExecutableInfo(false); - return { - ...configuration, - customControlButtons: getCustomControlButtonsForJavaSourcePaths( - clickEvents, - ), + (0, _assert.default)(configuration.onDebugStartingCallback == null); + const clickEvents = new _rxjsCompatUmdMin.Subject(); + const javaAdapterExecutable = await getJavaDebuggerHelpersServiceByNuclideUri(targetUri).getJavaVSAdapterExecutableInfo(false); + return Object.assign({}, configuration, { + customControlButtons: getCustomControlButtonsForJavaSourcePaths(clickEvents), servicedFileExtensions: ['java'], adapterExecutable: javaAdapterExecutable, - onDebugStartingCallback: (instance: IVspInstance) => { - return new UniversalDisposable( - ...getSourcePathClickSubscriptions(targetUri, instance, clickEvents), - ); - }, - }; + onDebugStartingCallback: instance => { + return new (_UniversalDisposable().default)(...getSourcePathClickSubscriptions(targetUri, instance, clickEvents)); + } + }); } -export function setSourcePathsService( - sourcePathsService: DebuggerSourcePathsService, -) { +function setSourcePathsService(sourcePathsService) { _sourcePathsService = sourcePathsService; } -export function setRpcService(rpcService: nuclide$RpcService): IDisposable { +function setRpcService(rpcService) { _rpcService = rpcService; - return new UniversalDisposable(() => { + return new (_UniversalDisposable().default)(() => { _rpcService = null; }); } -export function getJavaDebuggerHelpersServiceByNuclideUri( - uri: NuclideUri, -): JavaDebuggerHelpersService { - if (_rpcService == null && !nuclideUri.isRemote(uri)) { - return JavaDebuggerHelpersServiceLocal; +function getJavaDebuggerHelpersServiceByNuclideUri(uri) { + if (_rpcService == null && !_nuclideUri().default.isRemote(uri)) { + return JavaDebuggerHelpersServiceLocal(); } - return nullthrows(_rpcService).getServiceByNuclideUri( - 'JavaDebuggerHelpersService', - uri, - ); + return (0, _nullthrows().default)(_rpcService).getServiceByNuclideUri('JavaDebuggerHelpersService', uri); } -export function createJavaAttachConfig( - targetUri: NuclideUri, - attachPort: number, - processName?: string, -): IJavaAttachProcessConfig { +function createJavaAttachConfig(targetUri, attachPort, processName) { const debuggerConfig = { - javaJdwpPort: attachPort, + javaJdwpPort: attachPort }; const processConfig = { targetUri, debugMode: 'attach', - adapterType: VsAdapterTypes.JAVA, + adapterType: _constants().VsAdapterTypes.JAVA, config: debuggerConfig, - processName: - processName != null ? processName : 'JDWP: ' + attachPort + ' (Java)', - isRestartable: false, + processName: processName != null ? processName : 'JDWP: ' + attachPort + ' (Java)', + isRestartable: false }; return processConfig; -} +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/DEVELOPMENT b/modules/atom-ide-debugger-native-gdb/DEVELOPMENT deleted file mode 100644 index e27a0b58b0..0000000000 --- a/modules/atom-ide-debugger-native-gdb/DEVELOPMENT +++ /dev/null @@ -1,3 +0,0 @@ -This file exists to indicate that the source should be transpiled. - -During publishing, all files are pre-transpiled and this file is ignored. diff --git a/modules/atom-ide-debugger-native-gdb/lib/Breakpoints.js b/modules/atom-ide-debugger-native-gdb/lib/Breakpoints.js index 512270a769..33237016a0 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/Breakpoints.js +++ b/modules/atom-ide-debugger-native-gdb/lib/Breakpoints.js @@ -1,3 +1,22 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.Breakpoint = void 0; + +function _HandleMap() { + const data = _interopRequireDefault(require("./HandleMap")); + + _HandleMap = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,26 +25,11 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import HandleMap from './HandleMap'; - -export class Breakpoint { - _id: ?number; - _source: ?string; - _line: ?number; - _condition: ?string; - _verified: boolean; - - constructor( - id: ?number, - source: ?string, - line: ?number, - condition: ?string, - verified: boolean, - ) { +class Breakpoint { + constructor(id, source, line, condition, verified) { this._id = id; this._source = source; this._line = line; @@ -33,63 +37,67 @@ export class Breakpoint { this._verified = verified; } - get id(): ?number { + get id() { return this._id; } - setId(n: number): void { + setId(n) { this._id = n; } - get source(): ?string { + get source() { return this._source; } - get line(): ?number { + get line() { return this._line; } - get condition(): ?string { + get condition() { return this._condition; } - get verified(): boolean { + get verified() { return this._verified; } - setVerified(): void { + setVerified() { this._verified = true; } + } -export default class Breakpoints { - _breakpoints: HandleMap; +exports.Breakpoint = Breakpoint; +class Breakpoints { constructor() { - this._breakpoints = new HandleMap(); + this._breakpoints = new (_HandleMap().default)(); } - addBreakpoint(bkpt: Breakpoint): number { + addBreakpoint(bkpt) { return this._breakpoints.put(bkpt); } - removeBreakpoint(bkpt: Breakpoint): void { + removeBreakpoint(bkpt) { this._breakpoints.removeObject(bkpt); } - handleForBreakpoint(bkpt: Breakpoint): ?number { + handleForBreakpoint(bkpt) { return this._breakpoints.getHandleByObject(bkpt); } - breakpointByHandle(handle: number): ?Breakpoint { + breakpointByHandle(handle) { return this._breakpoints.getObjectByHandle(handle); } - breakpointByDebuggerId(id: number): ?Breakpoint { + breakpointByDebuggerId(id) { return this._breakpoints.allObjects.find(_ => id === _.id); } - breakpointsWithNoDebuggerId(): Array { + breakpointsWithNoDebuggerId() { return this._breakpoints.allObjects.filter(_ => _.id == null); } + } + +exports.default = Breakpoints; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/DebugSymbolsSize.js b/modules/atom-ide-debugger-native-gdb/lib/DebugSymbolsSize.js index f7b66f6d0b..2078c74bb0 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/DebugSymbolsSize.js +++ b/modules/atom-ide-debugger-native-gdb/lib/DebugSymbolsSize.js @@ -1,3 +1,35 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.debugSymSizeByProcess = debugSymSizeByProcess; +exports.debugSymSizeByBinary = debugSymSizeByBinary; + +function _fsPromise() { + const data = _interopRequireDefault(require("../../nuclide-commons/fsPromise")); + + _fsPromise = function () { + return data; + }; + + return data; +} + +function _process() { + const data = require("../../nuclide-commons/process"); + + _process = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,32 +38,28 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import fsPromise from 'nuclide-commons/fsPromise'; -import {runCommand} from 'nuclide-commons/process'; -import {Observable} from 'rxjs'; - -export async function debugSymSizeByProcess(pid: number): Promise { +async function debugSymSizeByProcess(pid) { // Only support Linux for now. readelf is part of binutils and should be // on every Linux distro that has any dev tools installed. if (process.platform !== 'linux') { return null; - } + } // If we have the /proc file system, we can get the executable trivially + - // If we have the /proc file system, we can get the executable trivially const procExe = `/proc/${pid}/exe`; - if (await fsPromise.exists(procExe)) { + + if (await _fsPromise().default.exists(procExe)) { return debugSymSizeByBinary(procExe); - } + } // If /proc isn't available, we could do some ugly parsing of ps here. + - // If /proc isn't available, we could do some ugly parsing of ps here. return null; } -export async function debugSymSizeByBinary(binary: string): Promise { +async function debugSymSizeByBinary(binary) { // this pipeline parses the output of readelf to find debug sections. // readelf -WS lists the various sections in the format // [Nr] Name Type Address Off Size ES Flg Lk Inf Al @@ -45,27 +73,12 @@ export async function debugSymSizeByBinary(binary: string): Promise { return new Promise((resolve, reject) => { try { // eslint-disable-next-line nuclide-internal/unused-subscription - runCommand('readelf', ['-WS', binary]) - .catch(_ => Observable.of('')) - .map(stdout => - stdout - .split(/\n/) - // filter out just the section lines on [##] - .filter(line => /\[\s*\d+\]/.test(line)) - // Remove spaces from the single-digit section indices, so we can - // safely split on spaces (i.e. '[ 1]' becomes '[1]') - .map(line => - line - .replace(/\[\s*(\d+)\]/, '[$1]') - .trim() - .split(/\s+/), - ) - .filter(tuple => /(debug|stab)/.test(tuple[NAME_COLUMN])) - .reduce((sum, tuple) => sum + parseInt(tuple[SIZE_COLUMN], 16), 0), - ) - .subscribe(value => resolve(value)); + (0, _process().runCommand)('readelf', ['-WS', binary]).catch(_ => _rxjsCompatUmdMin.Observable.of('')).map(stdout => stdout.split(/\n/) // filter out just the section lines on [##] + .filter(line => /\[\s*\d+\]/.test(line)) // Remove spaces from the single-digit section indices, so we can + // safely split on spaces (i.e. '[ 1]' becomes '[1]') + .map(line => line.replace(/\[\s*(\d+)\]/, '[$1]').trim().split(/\s+/)).filter(tuple => /(debug|stab)/.test(tuple[NAME_COLUMN])).reduce((sum, tuple) => sum + parseInt(tuple[SIZE_COLUMN], 16), 0)).subscribe(value => resolve(value)); } catch (ex) { reject(ex); } }); -} +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/Disassemble.js b/modules/atom-ide-debugger-native-gdb/lib/Disassemble.js index 98f18e1bb5..99dc7127cb 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/Disassemble.js +++ b/modules/atom-ide-debugger-native-gdb/lib/Disassemble.js @@ -1,3 +1,62 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _bigInteger() { + const data = _interopRequireDefault(require("big-integer")); + + _bigInteger = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _HandleMap() { + const data = _interopRequireDefault(require("./HandleMap")); + + _HandleMap = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _StackFrames() { + const data = _interopRequireDefault(require("./StackFrames")); + + _StackFrames = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,109 +65,87 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import bigInt from 'big-integer'; -import {dataDisassembleResult} from './MITypes'; -import HandleMap from './HandleMap'; -import MIProxy from './MIProxy'; -import StackFrames from './StackFrames'; - -type SourceRef = { - stackFrameHandle: number, - startingPoint: ?string, -}; - -export default class Disassemble { - _client: MIProxy; - _stackFrames: StackFrames; - _handleMap: HandleMap; - _sourceRefByStackFrameHandle: Map; - - constructor(client: MIProxy, stackFrames: StackFrames) { +class Disassemble { + constructor(client, stackFrames) { this._client = client; this._stackFrames = stackFrames; - this._handleMap = new HandleMap(); + this._handleMap = new (_HandleMap().default)(); this._sourceRefByStackFrameHandle = new Map(); } - sourceReferenceForStackFrame(stackFrameHandle: number): number { + sourceReferenceForStackFrame(stackFrameHandle) { let handle = this._sourceRefByStackFrameHandle.get(stackFrameHandle); + if (handle == null) { - const sourceRef = {stackFrameHandle, startingPoint: undefined}; + const sourceRef = { + stackFrameHandle, + startingPoint: undefined + }; handle = this._handleMap.put(sourceRef); + this._sourceRefByStackFrameHandle.set(stackFrameHandle, handle); } return handle; } - async getDisassembly(sourceRef: number): Promise { + async getDisassembly(sourceRef) { const source = this._handleMap.getObjectByHandle(sourceRef); + if (source == null) { throw new Error(`Invalid source reference ${sourceRef}`); } let startingAddress = source.startingPoint; + if (startingAddress == null) { - source.startingPoint = await this._getFrameAddress( - source.stackFrameHandle, - ); + source.startingPoint = await this._getFrameAddress(source.stackFrameHandle); startingAddress = source.startingPoint; } const hexPattern = /^0x([0-9a-fA-F]+)$/; const match = startingAddress.match(hexPattern); + if (match == null) { - throw new Error( - `Failed to disassemble because value ${startingAddress} is not a valid hex address`, - ); + throw new Error(`Failed to disassemble because value ${startingAddress} is not a valid hex address`); } - const start = bigInt(match[1], 16); - - // $TODO find a good balance between useful and performant. For now + const start = (0, _bigInteger().default)(match[1], 16); // $TODO find a good balance between useful and performant. For now // just disassemble 4k worth of code, which is a fair bit but still comes // back quickly - const end = start.add(4096); - - const command = `data-disassemble -s 0x${start.toString( - 16, - )} -e 0x${end.toString(16)} -- 0`; + const end = start.add(4096); + const command = `data-disassemble -s 0x${start.toString(16)} -e 0x${end.toString(16)} -- 0`; const response = await this._client.sendCommand(command); + if (!response.done) { throw new Error(`Failed to disassemble for source handle ${sourceRef}`); } - const instructions = dataDisassembleResult(response); - + const instructions = (0, _MITypes().dataDisassembleResult)(response); return instructions.asm_insns.map(_ => `${_.address} ${_.inst}`).join('\n'); } - async _getFrameAddress(stackFrameHandle: number): Promise { + async _getFrameAddress(stackFrameHandle) { const frameRef = this._stackFrames.stackFrameByHandle(stackFrameHandle); + if (frameRef == null) { - throw new Error( - `Could not discover stack frame handle ${stackFrameHandle} for disassembly`, - ); + throw new Error(`Could not discover stack frame handle ${stackFrameHandle} for disassembly`); } - const frames = await this._stackFrames.stackFramesForThread( - frameRef.threadId, - frameRef.frameIndex, - 1, - ); - + const frames = await this._stackFrames.stackFramesForThread(frameRef.threadId, frameRef.frameIndex, 1); const frame = frames.stackFrames[0]; + if (frame == null || frame.addr == null) { - throw new Error( - `Could not retrieve stack frame for handle ${stackFrameHandle} for disassembly`, - ); + throw new Error(`Could not retrieve stack frame for handle ${stackFrameHandle} for disassembly`); } return frame.addr; } + } + +exports.default = Disassemble; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/ExceptionBreakpoints.js b/modules/atom-ide-debugger-native-gdb/lib/ExceptionBreakpoints.js index 916b4232ea..d753da89c5 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/ExceptionBreakpoints.js +++ b/modules/atom-ide-debugger-native-gdb/lib/ExceptionBreakpoints.js @@ -1,3 +1,32 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,66 +35,55 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {MIStoppedEventResult, StopReason} from './MITypes'; - -import invariant from 'assert'; -import MIProxy from './MIProxy'; -import {breakInsertResult, toCommandError} from './MITypes'; - -export default class ExceptionBreakpoints { - _throwHelper = '__cxa_throw'; - _client: MIProxy; - _throwBreakpoint: ?number; - _stopOnSignals: boolean; - - constructor(client: MIProxy) { +class ExceptionBreakpoints { + constructor(client) { + this._throwHelper = '__cxa_throw'; this._client = client; this._stopOnSignals = false; } - shouldIgnoreBreakpoint(result: MIStoppedEventResult): boolean { + shouldIgnoreBreakpoint(result) { if (this._isSignal(result) && !this._stopOnSignals) { return true; - } - - // it's impossible to get a thrown exception stop if they are disabled, + } // it's impossible to get a thrown exception stop if they are disabled, // so we don't need to check. + return false; } - stopEventReason(result: MIStoppedEventResult): ?StopReason { + stopEventReason(result) { if (this._isSignal(result)) { return { reason: 'exception', - description: 'Uncaught exception', + description: 'Uncaught exception' }; } if (this._isOurBreakpoint(result)) { return { reason: 'exception', - description: 'Thrown exception', + description: 'Thrown exception' }; } return null; } - _isSignal(result: MIStoppedEventResult): boolean { + _isSignal(result) { return result.reason === 'signal-received'; } - _isOurBreakpoint(result: MIStoppedEventResult): boolean { + _isOurBreakpoint(result) { if (result.reason !== 'breakpoint-hit') { return false; } const bpt = result.bkptno; + if (bpt == null) { return false; } @@ -73,7 +91,7 @@ export default class ExceptionBreakpoints { return parseInt(bpt, 10) === this._throwBreakpoint; } - async setExceptionBreakpointFilters(filters: Array): Promise { + async setExceptionBreakpointFilters(filters) { this._stopOnSignals = filters.includes('uncaught'); const enableThrown = filters.includes('thrown'); @@ -84,36 +102,31 @@ export default class ExceptionBreakpoints { } } - async _setBreakpoint(): Promise { - const result = await this._client.sendCommand( - `break-insert -f ${this._throwHelper}`, - ); + async _setBreakpoint() { + const result = await this._client.sendCommand(`break-insert -f ${this._throwHelper}`); + if (result.error) { - throw new Error( - `Error setting thrown exception breakpoint ${ - toCommandError(result).msg - }`, - ); + throw new Error(`Error setting thrown exception breakpoint ${(0, _MITypes().toCommandError)(result).msg}`); } - const bt = breakInsertResult(result); + const bt = (0, _MITypes().breakInsertResult)(result); this._throwBreakpoint = parseInt(bt.bkpt[0].number, 10); } - async _clearBreakpoint(): Promise { + async _clearBreakpoint() { const breakpointId = this._throwBreakpoint; - invariant(breakpointId != null); - const result = await this._client.sendCommand( - `break-delete ${breakpointId}`, - ); + if (!(breakpointId != null)) { + throw new Error("Invariant violation: \"breakpointId != null\""); + } + + const result = await this._client.sendCommand(`break-delete ${breakpointId}`); if (result.error) { - throw new Error( - `Error clearing thrown exception breakpoint ${ - toCommandError(result).msg - }`, - ); + throw new Error(`Error clearing thrown exception breakpoint ${(0, _MITypes().toCommandError)(result).msg}`); } } + } + +exports.default = ExceptionBreakpoints; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/ExpressionVariableReference.js b/modules/atom-ide-debugger-native-gdb/lib/ExpressionVariableReference.js index 3fe49f3a87..5da1253df9 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/ExpressionVariableReference.js +++ b/modules/atom-ide-debugger-native-gdb/lib/ExpressionVariableReference.js @@ -1,3 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _Logger() { + const data = require("./Logger"); + + _Logger = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _VariableReference() { + const data = _interopRequireDefault(require("./VariableReference")); + + _VariableReference = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,81 +45,65 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {Variable} from 'vscode-debugprotocol'; - -import {logVerbose} from './Logger'; -import MIProxy from './MIProxy'; -import VariableReference from './VariableReference'; - // An ExpressionVariableReference refers to a watch or hover expression rather // than a variable rooted in a stack frame scope. -export default class ExpressionVariableReference extends VariableReference { - constructor( - client: MIProxy, - variables: Variables, - threadId: ?number, - frameIndex: ?number, - expression: string, - ) { - super({client, variables, expression, threadId, frameIndex}); - } - - // Unlike variable enumeration, getVariables here can only return exactly +class ExpressionVariableReference extends _VariableReference().default { + constructor(client, variables, threadId, frameIndex, expression) { + super({ + client, + variables, + expression, + threadId, + frameIndex + }); + } // Unlike variable enumeration, getVariables here can only return exactly // one variable. - async getVariables(start: ?number, count: ?number): Promise> { + + + async getVariables(start, count) { const value = await this.getValue(); const typeClass = await this.getTypeClass(value); - const resolvedType = await this.getType(); - - logVerbose( - `eval name ${ - this._expression - } type ${resolvedType} value ${value} typeClass ${typeClass}`, - ); - - let variable: Variable = { + (0, _Logger().logVerbose)(`eval name ${this._expression} type ${resolvedType} value ${value} typeClass ${typeClass}`); + let variable = { name: this._expression, value, type: resolvedType, - variablesReference: 0, + variablesReference: 0 }; if (typeClass !== 'simple') { - const handle = this._variables.nestedVariableReference( - this, - this._expression, - await this._getVarName(), - ); + const handle = this._variables.nestedVariableReference(this, this._expression, (await this._getVarName())); + const childCount = await this.getChildCount(); if (typeClass === 'indexed') { - variable = { - ...variable, + variable = Object.assign({}, variable, { indexedVariables: childCount, - variablesReference: handle, - }; + variablesReference: handle + }); } else if (typeClass === 'named') { - variable = { - ...variable, + variable = Object.assign({}, variable, { namedVariables: childCount, - variablesReference: handle, - }; + variablesReference: handle + }); } } return [variable]; } - get needsDeletion(): boolean { + get needsDeletion() { return true; } - get qualifiedName(): string { + get qualifiedName() { return `eval.${this._expression}`; } + } + +exports.default = ExpressionVariableReference; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/FunctionBreakpoints.js b/modules/atom-ide-debugger-native-gdb/lib/FunctionBreakpoints.js index 69f306eb4c..83bb4af6d8 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/FunctionBreakpoints.js +++ b/modules/atom-ide-debugger-native-gdb/lib/FunctionBreakpoints.js @@ -1,3 +1,74 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function DebugProtocol() { + const data = _interopRequireWildcard(require("vscode-debugprotocol")); + + DebugProtocol = function () { + return data; + }; + + return data; +} + +function _Breakpoints() { + const data = _interopRequireWildcard(require("./Breakpoints")); + + _Breakpoints = function () { + return data; + }; + + return data; +} + +function _Logger() { + const data = require("./Logger"); + + _Logger = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MIRecord() { + const data = require("./MIRecord"); + + _MIRecord = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,58 +77,30 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import * as DebugProtocol from 'vscode-debugprotocol'; -import invariant from 'assert'; -import Breakpoints from './Breakpoints'; -import {Breakpoint} from './Breakpoints'; -import {logVerbose} from './Logger'; -import MIProxy from './MIProxy'; -import {MIResultRecord} from './MIRecord'; -import {breakInsertResult, toCommandError} from './MITypes'; - -class FunctionBreakpoint extends Breakpoint { - _functionName: string; - - constructor( - id: ?number, - source: ?string, - line: ?number, - functionName: string, - verified: boolean, - ) { +class FunctionBreakpoint extends _Breakpoints().Breakpoint { + constructor(id, source, line, functionName, verified) { super(id, source, line, null, verified); this._functionName = functionName; } - get functionName(): string { + get functionName() { return this._functionName; } -} - -type AddRemoveSets = { - addFunctions: Array, - removeBreakpoints: Array, -}; -export default class FunctionBreakpoints { - _client: MIProxy; - _breakpoints: Breakpoints; - _breakpointsByFunction: Map; +} - constructor(client: MIProxy, breakpoints: Breakpoints) { +class FunctionBreakpoints { + constructor(client, breakpoints) { this._client = client; this._breakpoints = breakpoints; this._breakpointsByFunction = new Map(); - } + } // Returns a an array of breakpoints in the same order as the source + - // Returns a an array of breakpoints in the same order as the source - async setFunctionBreakpoints( - functions: Array, - ): Promise> { + async setFunctionBreakpoints(functions) { const addRemove = this._computeAddRemoveSets(functions); if (!this._client.isConnected()) { @@ -66,70 +109,56 @@ export default class FunctionBreakpoints { await this._addRemoveBreakpointsViaProxy(addRemove); } - return [...this._breakpointsByFunction.values()].map(_ => - this._breakpointToProtocolBreakpoint(_), - ); + return [...this._breakpointsByFunction.values()].map(_ => this._breakpointToProtocolBreakpoint(_)); } - async setCachedBreakpoints(): Promise> { - const cachedBreakpoints = ((this._breakpoints.breakpointsWithNoDebuggerId(): any): Array< - FunctionBreakpoint, - >); - - const results = await Promise.all( - cachedBreakpoints.map(_ => { - return this._setBreakpoint(_.functionName); - }), - ); + async setCachedBreakpoints() { + const cachedBreakpoints = this._breakpoints.breakpointsWithNoDebuggerId(); + const results = await Promise.all(cachedBreakpoints.map(_ => { + return this._setBreakpoint(_.functionName); + })); results.forEach((response, index) => { if (response.done) { - const result = breakInsertResult(response); + const result = (0, _MITypes().breakInsertResult)(response); const bkpt = result.bkpt[0]; - logVerbose(`breakpoint ${JSON.stringify(bkpt)}`); + (0, _Logger().logVerbose)(`breakpoint ${JSON.stringify(bkpt)}`); cachedBreakpoints[index].setId(parseInt(bkpt.number, 10)); + if (bkpt.pending == null) { - logVerbose(`breakpoint ${index} is now verified`); + (0, _Logger().logVerbose)(`breakpoint ${index} is now verified`); cachedBreakpoints[index].setVerified(); } } }); - - return cachedBreakpoints - .filter(_ => _.verified) - .map(_ => this._breakpointToProtocolBreakpoint(_)); + return cachedBreakpoints.filter(_ => _.verified).map(_ => this._breakpointToProtocolBreakpoint(_)); } - getBreakpointByHandle(handle: number): ?Breakpoint { + getBreakpointByHandle(handle) { return this._breakpoints.breakpointByHandle(handle); - } - - // We are given the set of functions which should be set, not + } // We are given the set of functions which should be set, not // a delta from the current set. We must compute the delta manually // to update the MI debugger. // - _computeAddRemoveSets(functions: Array): AddRemoveSets { - const existingBreakpoints: Array = [ - ...this._breakpointsByFunction.values(), - ]; - const existingFunctions = existingBreakpoints.map(_ => _.functionName); - const removeBreakpoints = existingBreakpoints.filter( - _ => !functions.includes(_.functionName), - ); - const addFunctions: Array = functions.filter( - _ => !existingFunctions.includes(_), - ); + _computeAddRemoveSets(functions) { + const existingBreakpoints = [...this._breakpointsByFunction.values()]; + const existingFunctions = existingBreakpoints.map(_ => _.functionName); + const removeBreakpoints = existingBreakpoints.filter(_ => !functions.includes(_.functionName)); + const addFunctions = functions.filter(_ => !existingFunctions.includes(_)); + return { + addFunctions, + removeBreakpoints + }; + } // If we're called before the proxy is set up, we need to cache the breakpoints + // until gdb is launched - return {addFunctions, removeBreakpoints}; - } - // If we're called before the proxy is set up, we need to cache the breakpoints - // until gdb is launched - _cacheBreakpointsInConfiguration(addRemove: AddRemoveSets): void { + _cacheBreakpointsInConfiguration(addRemove) { for (const bpt of addRemove.removeBreakpoints) { this._breakpoints.removeBreakpoint(bpt); + this._breakpointsByFunction.delete(bpt.functionName); } @@ -137,17 +166,16 @@ export default class FunctionBreakpoints { const breakpoint = new FunctionBreakpoint(null, null, null, _, false); this._breakpoints.addBreakpoint(breakpoint); + this._breakpointsByFunction.set(breakpoint.functionName, breakpoint); }); } - async _addRemoveBreakpointsViaProxy(addRemove: AddRemoveSets): Promise { - const promises: Array> = []; + async _addRemoveBreakpointsViaProxy(addRemove) { + const promises = []; if (addRemove.removeBreakpoints.length !== 0) { - const removeCommand = `break-delete ${addRemove.removeBreakpoints - .map(_ => _.id) - .join(' ')}`; + const removeCommand = `break-delete ${addRemove.removeBreakpoints.map(_ => _.id).join(' ')}`; promises.push(this._client.sendCommand(removeCommand)); } @@ -159,83 +187,104 @@ export default class FunctionBreakpoints { if (addRemove.removeBreakpoints.length !== 0) { const removeResult = results.shift(); - invariant(removeResult != null); + + if (!(removeResult != null)) { + throw new Error("Invariant violation: \"removeResult != null\""); + } + if (removeResult.result.error) { // this means our internal state is out of sync with the debugger - throw new Error( - `Failed to remove breakpoints which should have existed (${ - toCommandError(removeResult).msg - })`, - ); + throw new Error(`Failed to remove breakpoints which should have existed (${(0, _MITypes().toCommandError)(removeResult).msg})`); } } for (const bpt of addRemove.removeBreakpoints) { this._breakpoints.removeBreakpoint(bpt); + this._breakpointsByFunction.delete(bpt.functionName); } const failure = results.find(_ => !_.done); + if (failure != null) { - throw new Error( - `Failed to add function breakpokints (${toCommandError(failure).msg})`, - ); + throw new Error(`Failed to add function breakpokints (${(0, _MITypes().toCommandError)(failure).msg})`); } results.forEach(_ => { - logVerbose(JSON.stringify(_)); - const result = breakInsertResult(_); - - // We may get back a list of multiple sub breakpoints, each with a source/line, + (0, _Logger().logVerbose)(JSON.stringify(_)); + const result = (0, _MITypes().breakInsertResult)(_); // We may get back a list of multiple sub breakpoints, each with a source/line, // but the protocol only supports one location right now. + const bkpt = result.bkpt[0]; - invariant(bkpt != null); + + if (!(bkpt != null)) { + throw new Error("Invariant violation: \"bkpt != null\""); + } + const location = bkpt['original-location']; - invariant(location != null); - // MI returns the location back as '-function functioname' + if (!(location != null)) { + throw new Error("Invariant violation: \"location != null\""); + } // MI returns the location back as '-function functioname' + + const funcMatch = location.match(/^-function (.*)$/); - invariant(funcMatch != null); + + if (!(funcMatch != null)) { + throw new Error("Invariant violation: \"funcMatch != null\""); + } + const functionName = funcMatch[1]; - invariant(functionName != null); - const verified = bkpt.pending == null; + if (!(functionName != null)) { + throw new Error("Invariant violation: \"functionName != null\""); + } - const breakpoint = new FunctionBreakpoint( - parseInt(bkpt.number, 10), - bkpt.file, - parseInt(bkpt.line, 10), - functionName, - verified, - ); + const verified = bkpt.pending == null; + const breakpoint = new FunctionBreakpoint(parseInt(bkpt.number, 10), bkpt.file, parseInt(bkpt.line, 10), functionName, verified); this._breakpoints.addBreakpoint(breakpoint); + this._breakpointsByFunction.set(breakpoint.functionName, breakpoint); }); } - async _setBreakpoint(functionName: string): Promise { + async _setBreakpoint(functionName) { // -f means insert unverified breakpoint rather than error if fn not found const cmd = `break-insert -f --function ${functionName}`; return this._client.sendCommand(cmd); } - _breakpointToProtocolBreakpoint( - breakpoint: FunctionBreakpoint, - ): DebugProtocol.Breakpoint { + _breakpointToProtocolBreakpoint(breakpoint) { const handle = this._breakpoints.handleForBreakpoint(breakpoint); - invariant(handle != null); + + if (!(handle != null)) { + throw new Error("Invariant violation: \"handle != null\""); + } + let bkpt = { id: handle, verified: breakpoint.verified, - source: {sourceReference: 0}, + source: { + sourceReference: 0 + } }; + if (breakpoint.source != null) { - bkpt.source = {...bkpt.source, path: breakpoint.source}; + bkpt.source = Object.assign({}, bkpt.source, { + path: breakpoint.source + }); } + if (breakpoint.line != null) { - bkpt = {...bkpt, line: breakpoint.line}; + bkpt = Object.assign({}, bkpt, { + line: breakpoint.line + }); } + return bkpt; } + } + +exports.default = FunctionBreakpoints; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/HandleMap.js b/modules/atom-ide-debugger-native-gdb/lib/HandleMap.js index db8d4e0345..7114fc79be 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/HandleMap.js +++ b/modules/atom-ide-debugger-native-gdb/lib/HandleMap.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,19 +13,12 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -export default class HandleMap { - DEFAULT_STARTING_HANDLE = 1000; - - _startingHandle: number; - _objectsByHandle: Map; - _handlesByObject: Map; - _nextHandle: number; - - constructor(nextHandle: ?number) { +class HandleMap { + constructor(nextHandle) { + this.DEFAULT_STARTING_HANDLE = 1000; this._startingHandle = nextHandle == null ? 1000 : nextHandle; this.clear(); } @@ -29,47 +29,57 @@ export default class HandleMap { this._handlesByObject = new Map(); } - get allObjects(): Array { + get allObjects() { return Array.from(this._objectsByHandle.values()); } - put(obj: T): number { + put(obj) { // maintain 1:1 mapping let handle = this._handlesByObject.get(obj); + if (handle == null) { handle = this._nextHandle++; + this._objectsByHandle.set(handle, obj); + this._handlesByObject.set(obj, handle); } return handle; } - getObjectByHandle(handle: number): ?T { + getObjectByHandle(handle) { return this._objectsByHandle.get(handle); } - getHandleByObject(obj: T): ?number { + getHandleByObject(obj) { return this._handlesByObject.get(obj); } - removeHandle(handle: number): void { + removeHandle(handle) { const obj = this._objectsByHandle.get(handle); + if (obj != null) { this._handlesByObject.delete(obj); + this._objectsByHandle.delete(handle); } } - removeObject(obj: T): void { + removeObject(obj) { const handle = this._handlesByObject.get(obj); + if (handle != null) { this._handlesByObject.delete(obj); + this._objectsByHandle.delete(handle); } } - toString(): string { + toString() { return JSON.stringify([...this._objectsByHandle]); } + } + +exports.default = HandleMap; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/Logger.js b/modules/atom-ide-debugger-native-gdb/lib/Logger.js index 8bb83633fc..da30927807 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/Logger.js +++ b/modules/atom-ide-debugger-native-gdb/lib/Logger.js @@ -1,3 +1,20 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.logVerbose = logVerbose; + +function _vscodeDebugadapter() { + const data = require("vscode-debugadapter"); + + _vscodeDebugadapter = function () { + return data; + }; + + return data; +} + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,23 +23,21 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import {logger} from 'vscode-debugadapter'; - -function timestamp(): string { - let ts = `${new Date().getTime()}`; - - // This code put seperators in the timestamp in groups of thousands +function timestamp() { + let ts = `${new Date().getTime()}`; // This code put seperators in the timestamp in groups of thousands // to make it easier to read, i.e. // 123456789 => 123_456_789 + let fmt = ''; + while (ts.length >= 3) { if (fmt !== '') { fmt = '_' + fmt; } + fmt = ts.substring(ts.length - 3) + fmt; ts = ts.substring(0, ts.length - 3); } @@ -31,12 +46,13 @@ function timestamp(): string { if (fmt !== '') { fmt = '_' + fmt; } + fmt = ts + fmt; } return fmt; } -export function logVerbose(line: string): void { - logger.verbose(`${timestamp()} ${line}`); -} +function logVerbose(line) { + _vscodeDebugadapter().logger.verbose(`${timestamp()} ${line}`); +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/MIDebugSession.js b/modules/atom-ide-debugger-native-gdb/lib/MIDebugSession.js index e1d4009f97..db67b0ebaf 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/MIDebugSession.js +++ b/modules/atom-ide-debugger-native-gdb/lib/MIDebugSession.js @@ -1,3 +1,171 @@ +"use strict"; + +function _vscodeDebugadapter() { + const data = require("vscode-debugadapter"); + + _vscodeDebugadapter = function () { + return data; + }; + + return data; +} + +function _Breakpoints() { + const data = _interopRequireDefault(require("./Breakpoints")); + + _Breakpoints = function () { + return data; + }; + + return data; +} + +function _SourceBreakpoints() { + const data = _interopRequireDefault(require("./SourceBreakpoints")); + + _SourceBreakpoints = function () { + return data; + }; + + return data; +} + +function DebugProtocol() { + const data = _interopRequireWildcard(require("vscode-debugprotocol")); + + DebugProtocol = function () { + return data; + }; + + return data; +} + +function _Disassemble() { + const data = _interopRequireDefault(require("./Disassemble")); + + _Disassemble = function () { + return data; + }; + + return data; +} + +function _ExceptionBreakpoints() { + const data = _interopRequireDefault(require("./ExceptionBreakpoints")); + + _ExceptionBreakpoints = function () { + return data; + }; + + return data; +} + +function _FunctionBreakpoints() { + const data = _interopRequireDefault(require("./FunctionBreakpoints")); + + _FunctionBreakpoints = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MIRecord() { + const data = require("./MIRecord"); + + _MIRecord = function () { + return data; + }; + + return data; +} + +function pty() { + const data = _interopRequireWildcard(require("nuclide-prebuilt-libs/pty")); + + pty = function () { + return data; + }; + + return data; +} + +var _os = _interopRequireDefault(require("os")); + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _StackFrames() { + const data = _interopRequireDefault(require("./StackFrames")); + + _StackFrames = function () { + return data; + }; + + return data; +} + +function _Variables() { + const data = _interopRequireDefault(require("./Variables")); + + _Variables = function () { + return data; + }; + + return data; +} + +function _DebugSymbolsSize() { + const data = require("./DebugSymbolsSize"); + + _DebugSymbolsSize = function () { + return data; + }; + + return data; +} + +function _Logger() { + const data = require("./Logger"); + + _Logger = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,312 +174,170 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {ITerminal} from 'nuclide-prebuilt-libs/pty'; -import type {MIStoppedEventResult} from './MITypes'; - -import { - BreakpointEvent, - logger, - Logger, - LoggingDebugSession, - InitializedEvent, - OutputEvent, - StoppedEvent, - TerminatedEvent, - ThreadEvent, -} from 'vscode-debugadapter'; -import Breakpoints from './Breakpoints'; -import SourceBreakpoints from './SourceBreakpoints'; -import * as DebugProtocol from 'vscode-debugprotocol'; -import Disassemble from './Disassemble'; -import ExceptionBreakpoints from './ExceptionBreakpoints'; -import FunctionBreakpoints from './FunctionBreakpoints'; -import invariant from 'assert'; -import MIProxy from './MIProxy'; -import {MIAsyncRecord, MIResultRecord, MIStreamRecord} from './MIRecord'; -import * as pty from 'nuclide-prebuilt-libs/pty'; -import os from 'os'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import { - breakpointModifiedEventResult, - stoppedEventResult, - toCommandError, - threadInfoResult, -} from './MITypes'; -import StackFrames from './StackFrames'; -import Variables from './Variables'; -import {debugSymSizeByProcess, debugSymSizeByBinary} from './DebugSymbolsSize'; -import {logVerbose} from './Logger'; - -// NB that trace is not actually exposed in package.json as it's only used for -// debugging the adapter itself -type LaunchRequestArguments = { - ...DebugProtocol.LaunchRequestArguments, - program: string, - cwd: ?string, - args: ?Array, - env: Array, - sourcePath: string, - sourcePaths: Array, - trace: ?boolean, -}; - -type AttachRequestArguments = { - ...DebugProtocol.AttachRequestArguments, - pid: number, - sourcePath: string, - sourcePaths: Array, - stopOnAttach: ?boolean, - trace: ?boolean, -}; - -class MIDebugSession extends LoggingDebugSession { - _hasTarget: boolean; - _configurationDone: boolean; - _client: MIProxy; - _breakpoints: Breakpoints; - _sourceBreakpoints: SourceBreakpoints; - _functionBreakpoints: FunctionBreakpoints; - _disassemble: Disassemble; - _exceptionBreakpoints: ExceptionBreakpoints; - _stackFrames: StackFrames; - _variables: Variables; - _targetIO: ?ITerminal; - _asyncHandlers: Map void>; - _attachPID: ?number; - _running: boolean; - _expectingPause: boolean; - _pauseQueue: Array<() => Promise>; - _continueOnAttach: boolean; - _stepping: boolean; - _steppingThread: number = 0; - _configurationDoneResponse: ?DebugProtocol.ConfigurationDoneResponse; - +class MIDebugSession extends _vscodeDebugadapter().LoggingDebugSession { constructor() { - const logfile = nuclideUri.join(os.tmpdir(), 'native-debugger-vsp.log'); + const logfile = _nuclideUri().default.join(_os.default.tmpdir(), 'native-debugger-vsp.log'); + super(logfile); + this._steppingThread = 0; this._hasTarget = false; this._configurationDone = false; - - const client = new MIProxy(); + const client = new (_MIProxy().default)(); this._client = client; - - this._breakpoints = new Breakpoints(); - this._sourceBreakpoints = new SourceBreakpoints(client, this._breakpoints); - this._functionBreakpoints = new FunctionBreakpoints( - client, - this._breakpoints, - ); - this._exceptionBreakpoints = new ExceptionBreakpoints(client); - this._stackFrames = new StackFrames(client); - this._disassemble = new Disassemble(client, this._stackFrames); - this._variables = new Variables(client, this._stackFrames); + this._breakpoints = new (_Breakpoints().default)(); + this._sourceBreakpoints = new (_SourceBreakpoints().default)(client, this._breakpoints); + this._functionBreakpoints = new (_FunctionBreakpoints().default)(client, this._breakpoints); + this._exceptionBreakpoints = new (_ExceptionBreakpoints().default)(client); + this._stackFrames = new (_StackFrames().default)(client); + this._disassemble = new (_Disassemble().default)(client, this._stackFrames); + this._variables = new (_Variables().default)(client, this._stackFrames); this._expectingPause = false; this._continueOnAttach = false; - client.on('error', err => { - logVerbose(`proxy has exited with error ${err}`); + (0, _Logger().logVerbose)(`proxy has exited with error ${err}`); this._hasTarget = false; this._configurationDone = false; }); - client.on('exit', () => { - logVerbose('proxy has exited cleanly'); + (0, _Logger().logVerbose)('proxy has exited cleanly'); this._hasTarget = false; this._configurationDone = false; }); - client.on('async', record => this._asyncRecord(record)); client.on('stream', record => this._streamRecord(record)); - - this._asyncHandlers = new Map([ - [ - 'stopped', - record => { - this._onAsyncStopped(record); - }, - ], - ['thread-created', record => this._onAsyncThread(record, true)], - ['thread-exited', record => this._onAsyncThread(record, false)], - ['breakpoint-modified', record => this._onBreakpointModified(record)], - ]); - + this._asyncHandlers = new Map([['stopped', record => { + this._onAsyncStopped(record); + }], ['thread-created', record => this._onAsyncThread(record, true)], ['thread-exited', record => this._onAsyncThread(record, false)], ['breakpoint-modified', record => this._onBreakpointModified(record)]]); this._pauseQueue = []; } - _asyncRecord(record: MIAsyncRecord): void { + _asyncRecord(record) { const handler = this._asyncHandlers.get(record.asyncClass); + if (handler != null) { handler(record); } } - _discardMessage(msg: string): boolean { + _discardMessage(msg) { // remove hint about fbload since it doesn't directly work from here if (msg.indexOf('fbload') !== -1) { return true; - } - - // remove messages about stopping, because (a) sometimes we stop and + } // remove messages about stopping, because (a) sometimes we stop and // resume silently and the user shouldn't care, and (b) debuggers // print there own stop messages // // Program received signal SIGINT, Interrupt. // 0x00007ffff7ad3550 in __nanosleep_nocancel () from /lib64/libc.so.6 - // '\nProgram' and ' received signal' come in as two separate events - if ( - msg === '\nProgram' || - msg.startsWith(' received signal') || - /^0x[0-9a-f]+ in.*from.*/.test(msg) - ) { + + + if (msg === '\nProgram' || msg.startsWith(' received signal') || /^0x[0-9a-f]+ in.*from.*/.test(msg)) { return true; } return false; } - _streamRecord(record: MIStreamRecord): void { + _streamRecord(record) { // NB we never get target output here, that's handled by the pty. The // output here is mainly from raw pass-through gdb commands. - if ( - (record.streamTarget === 'console' || record.streamTarget === 'log') && - !this._discardMessage(record.text) - ) { - const event = new OutputEvent(); + if ((record.streamTarget === 'console' || record.streamTarget === 'log') && !this._discardMessage(record.text)) { + const event = new (_vscodeDebugadapter().OutputEvent)(); event.body = { category: 'log', data: { - type: record.streamTarget === 'console' ? 'success' : 'log', + type: record.streamTarget === 'console' ? 'success' : 'log' }, - output: record.text, + output: record.text }; - this.sendEvent(event); } } - start(inStream: ReadableStream, outStream: WritableStream): void { + start(inStream, outStream) { super.start(inStream, outStream); - logVerbose(`using node ${process.version} at ${process.execPath}`); + (0, _Logger().logVerbose)(`using node ${process.version} at ${process.execPath}`); } - initializeRequest( - response: DebugProtocol.InitializeResponse, - args: DebugProtocol.InitializeRequestArguments, - ): void { + initializeRequest(response, args) { response.body = response.body || {}; response.body.supportsFunctionBreakpoints = true; response.body.supportsConfigurationDoneRequest = true; response.body.supportsSetVariable = true; response.body.supportsValueFormattingOptions = true; response.body.supportsBreakpointIdOnStop = true; - response.body.exceptionBreakpointFilters = [ - { - filter: 'uncaught', - label: 'Uncaught exceptions', - default: false, - }, - { - filter: 'thrown', - label: 'Thrown exceptions', - default: false, - }, - ]; - - this.sendResponse(response); - - // sequencing: after this, we will get breakpoint requests, eventually followed by a configurationDoneRequest. + response.body.exceptionBreakpointFilters = [{ + filter: 'uncaught', + label: 'Uncaught exceptions', + default: false + }, { + filter: 'thrown', + label: 'Thrown exceptions', + default: false + }]; + this.sendResponse(response); // sequencing: after this, we will get breakpoint requests, eventually followed by a configurationDoneRequest. // notably we will get a launchRequest *before* configuration done, and actually before the breakpoint // requests. so we have to be careful to bring up the debugger in the launch request, then set the // initial breakpoints, and not actually start the program until configuration done. - this.sendEvent(new InitializedEvent()); + + this.sendEvent(new (_vscodeDebugadapter().InitializedEvent)()); } - async launchRequest( - response: DebugProtocol.LaunchResponse, - args: LaunchRequestArguments, - ): Promise { - logger.setup( - args.trace === true ? Logger.LogLevel.Verbose : Logger.LogLevel.Error, - true, - ); + async launchRequest(response, args) { + _vscodeDebugadapter().logger.setup(args.trace === true ? _vscodeDebugadapter().Logger.LogLevel.Verbose : _vscodeDebugadapter().Logger.LogLevel.Error, true); let environment = {}; + if (args.env != null) { args.env.forEach(_ => { const equal = _.indexOf('='); + if (equal === -1) { throw new Error('Given environment is malformed.'); } + const key = _.substr(0, equal); + const value = _.substr(equal + 1); - environment = { - ...environment, - [key]: value, - }; + + environment = Object.assign({}, environment, { + [key]: value + }); }); } this._client.start('gdb', ['-q', '--interpreter=mi2'], environment); + if (!(await this._setSourcePaths(response, args))) { return; } - if ( - args.cwd != null && - args.cwd.trim() !== '' && - !(await this._sendWithFailureCheck( - response, - `environment-cd ${args.cwd}`, - )) - ) { + if (args.cwd != null && args.cwd.trim() !== '' && !(await this._sendWithFailureCheck(response, `environment-cd ${args.cwd}`))) { return; } - if ( - args.args != null && - !(await this._sendWithFailureCheck( - response, - `exec-arguments ${args.args.join(' ')}`, - )) - ) { + if (args.args != null && !(await this._sendWithFailureCheck(response, `exec-arguments ${args.args.join(' ')}`))) { return; } - this._showSymbolLoadingSizeWarning( - await debugSymSizeByBinary(args.program), - ); + this._showSymbolLoadingSizeWarning((await (0, _DebugSymbolsSize().debugSymSizeByBinary)(args.program))); - if ( - !(await this._sendWithFailureCheck( - response, - `file-exec-and-symbols ${args.program}`, - )) - ) { + if (!(await this._sendWithFailureCheck(response, `file-exec-and-symbols ${args.program}`))) { return; } await this._warnIfNoSymbols(args.program); - this._attachPID = null; - this._hasTarget = true; this.sendResponse(response); } - async attachRequest( - response: DebugProtocol.AttachResponse, - args: AttachRequestArguments, - ): Promise { - logger.setup( - args.trace === true ? Logger.LogLevel.Verbose : Logger.LogLevel.Error, - true, - ); + async attachRequest(response, args) { + _vscodeDebugadapter().logger.setup(args.trace === true ? _vscodeDebugadapter().Logger.LogLevel.Verbose : _vscodeDebugadapter().Logger.LogLevel.Error, true); this._client.start('gdb', ['-q', '--interpreter=mi2'], null); @@ -320,24 +346,18 @@ class MIDebugSession extends LoggingDebugSession { } if (args.pid == null) { - this._sendFailureResponse( - response, - 'to attach, process id must be given', - ); + this._sendFailureResponse(response, 'to attach, process id must be given'); } this._attachPID = args.pid; this._continueOnAttach = args.stopOnAttach !== true; - this._hasTarget = true; this.sendResponse(response); } - async _setSourcePaths( - response: DebugProtocol.Response, - args: LaunchRequestArguments | AttachRequestArguments, - ): Promise { - let sourcePaths: Array = []; + async _setSourcePaths(response, args) { + let sourcePaths = []; + if (args.sourcePaths != null) { sourcePaths = args.sourcePaths; } else if (args.sourcePath != null && args.sourcePath.trim() !== '') { @@ -347,7 +367,9 @@ class MIDebugSession extends LoggingDebugSession { if (sourcePaths.length !== 0) { const quotedPathList = sourcePaths.map(path => `"${path}"`).join(' '); const command = `environment-directory -r ${quotedPathList}`; + this._logToConsole(`Setting source paths with "${command}"\n`); + if (!(await this._sendWithFailureCheck(response, command))) { return false; } @@ -356,26 +378,22 @@ class MIDebugSession extends LoggingDebugSession { return true; } - async disconnectRequest( - response: DebugProtocol.DisconnectResponse, - request: DebugProtocol.DisconnectRequest, - ): Promise { + async disconnectRequest(response, request) { this._stepping = false; this._steppingThread = 0; + this._runWhenStopped(async () => { if (this._attachPID != null) { await this._client.sendCommand('target-detach'); this._attachPID = null; this._hasTarget = false; } + this.sendResponse(response); }); } - async configurationDoneRequest( - response: DebugProtocol.ConfigurationDoneResponse, - args: DebugProtocol.ConfigurationDoneArguments, - ): Promise { + async configurationDoneRequest(response, args) { this._configurationDone = true; if (!(await this._initializeTargetIO(response))) { @@ -383,100 +401,79 @@ class MIDebugSession extends LoggingDebugSession { } await this._sendCachedBreakpoints(); - this._running = true; - const pid = this._attachPID; + if (pid != null) { - this._showSymbolLoadingSizeWarning(await debugSymSizeByProcess(pid)); + this._showSymbolLoadingSizeWarning((await (0, _DebugSymbolsSize().debugSymSizeByProcess)(pid))); - if ( - !(await this._sendWithFailureCheck(response, `target-attach ${pid}`)) - ) { + if (!(await this._sendWithFailureCheck(response, `target-attach ${pid}`))) { return; } - await this._warnIfNoSymbols(`process ${pid.toString(10)}`); - - // target-attach returns done very quickly, but isn't really done until + await this._warnIfNoSymbols(`process ${pid.toString(10)}`); // target-attach returns done very quickly, but isn't really done until // the corresponding *stopped event happens. + this._configurationDoneResponse = response; } else { if (!(await this._sendWithFailureCheck(response, 'exec-run'))) { return; } + this.sendResponse(response); } } - async _showSymbolLoadingSizeWarning(size: ?number): Promise { + async _showSymbolLoadingSizeWarning(size) { if (size == null) { // generic "this operation can be slow" message since we don't know how // large they are. Since we're not sure if this is really an issue, // just log to console. - this._logToConsole( - 'Reading executable symbols (for huge executables, this can take up to 2-3 minutes).\n', - ); - return; - } + this._logToConsole('Reading executable symbols (for huge executables, this can take up to 2-3 minutes).\n'); - // Attempt to show an order of magnitude guess as to how long loading might + return; + } // Attempt to show an order of magnitude guess as to how long loading might // take. If we know for sure the symbols are big, show an actual warning dialog - // very rough estimate that 100M is where things start taking more than a // few seconds + + const ONE_MEG = 1024 * 1024; - const SYMBOL_SIZE_LIMIT = 100 * ONE_MEG; + const SYMBOL_SIZE_LIMIT = 100 * ONE_MEG; // over a gig you're going to be here a while - // over a gig you're going to be here a while const ONE_GIG = 1024 * 1024 * 1024; const HUGE_SYMBOL_SIZE_LIMIT = ONE_GIG; if (size > HUGE_SYMBOL_SIZE_LIMIT) { - return this._nuclideWarningDialog( - `The symbols for your executable are very large (${( - size / ONE_GIG - ).toFixed(2)}G). Loading them may take several minutes.`, - ); + return this._nuclideWarningDialog(`The symbols for your executable are very large (${(size / ONE_GIG).toFixed(2)}G). Loading them may take several minutes.`); } if (size > SYMBOL_SIZE_LIMIT) { - return this._nuclideWarningDialog( - `The symbols for your executable are fairly large (${( - size / ONE_MEG - ).toFixed(2)}M). It may take up to a minute to load them.`, - ); + return this._nuclideWarningDialog(`The symbols for your executable are fairly large (${(size / ONE_MEG).toFixed(2)}M). It may take up to a minute to load them.`); } } - async setBreakPointsRequest( - response: DebugProtocol.SetBreakpointsResponse, - args: DebugProtocol.SetBreakpointsArguments, - ): Promise { + async setBreakPointsRequest(response, args) { this._runWhenStopped(async () => { try { - const source = - args.source.path != null ? args.source.path : args.source.name; - invariant(source != null); + const source = args.source.path != null ? args.source.path : args.source.name; + + if (!(source != null)) { + throw new Error("Invariant violation: \"source != null\""); + } const breakpoints = args.breakpoints; + if (breakpoints == null) { - this._sendFailureResponse( - response, - 'No breakpoints specified in breakpoints request', - ); + this._sendFailureResponse(response, 'No breakpoints specified in breakpoints request'); + return; } - const protocolBreakpoints = await this._sourceBreakpoints.setSourceBreakpoints( - source, - breakpoints, - ); - + const protocolBreakpoints = await this._sourceBreakpoints.setSourceBreakpoints(source, breakpoints); response.body = { - breakpoints: protocolBreakpoints, + breakpoints: protocolBreakpoints }; - this.sendResponse(response); } catch (error) { this._sendFailureResponse(response, error.message); @@ -484,30 +481,22 @@ class MIDebugSession extends LoggingDebugSession { }); } - async setFunctionBreakPointsRequest( - response: DebugProtocol.SetFunctionBreakpointsResponse, - args: DebugProtocol.SetFunctionBreakpointsArguments, - ): Promise { + async setFunctionBreakPointsRequest(response, args) { this._runWhenStopped(async () => { try { const breakpoints = args.breakpoints; + if (breakpoints == null) { - this._sendFailureResponse( - response, - 'No breakpoints specified in breakpoints request', - ); + this._sendFailureResponse(response, 'No breakpoints specified in breakpoints request'); + return; } const functions = breakpoints.map(_ => _.name); - const breakpointsOut = await this._functionBreakpoints.setFunctionBreakpoints( - functions, - ); - + const breakpointsOut = await this._functionBreakpoints.setFunctionBreakpoints(functions); response.body = { - breakpoints: breakpointsOut, + breakpoints: breakpointsOut }; - this.sendResponse(response); } catch (error) { this._sendFailureResponse(response, error.message); @@ -515,61 +504,48 @@ class MIDebugSession extends LoggingDebugSession { }); } - async _sendCachedBreakpoints(): Promise { - logVerbose('_sendCachedBreakpoints'); - const changedBreakpoints = [ - ...(await this._sourceBreakpoints.setCachedBreakpoints()), - ...(await this._functionBreakpoints.setCachedBreakpoints()), - ]; - + async _sendCachedBreakpoints() { + (0, _Logger().logVerbose)('_sendCachedBreakpoints'); + const changedBreakpoints = [...(await this._sourceBreakpoints.setCachedBreakpoints()), ...(await this._functionBreakpoints.setCachedBreakpoints())]; changedBreakpoints.forEach(breakpoint => { - const event = new BreakpointEvent(); + const event = new (_vscodeDebugadapter().BreakpointEvent)(); event.body = { reason: 'changed', - breakpoint, + breakpoint }; - this.sendEvent(event); }); } - async setExceptionBreakPointsRequest( - response: DebugProtocol.SetExceptionBreakpointsResponse, - args: DebugProtocol.SetExceptionBreakpointsArguments, - ): Promise { + async setExceptionBreakPointsRequest(response, args) { try { - await this._exceptionBreakpoints.setExceptionBreakpointFilters( - args.filters, - ); + await this._exceptionBreakpoints.setExceptionBreakpointFilters(args.filters); this.sendResponse(response); } catch (error) { this._sendFailureResponse(response, error.message); } } - async threadsRequest(response: DebugProtocol.ThreadsResponse): Promise { + async threadsRequest(response) { this._runWhenStopped(async () => { - const threadRecord: MIResultRecord = await this._client.sendCommand( - 'thread-info', - ); + const threadRecord = await this._client.sendCommand('thread-info'); try { if (!threadRecord.done) { this._sendFailureResponse(response, 'Failed to retrieve threads'); + return; } - const threads = threadInfoResult(threadRecord).threads; - + const threads = (0, _MITypes().threadInfoResult)(threadRecord).threads; response.body = { threads: threads.map(_ => { return { id: parseInt(_.id, 10), - name: _['target-id'], + name: _['target-id'] }; - }), + }) }; - this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); @@ -577,119 +553,84 @@ class MIDebugSession extends LoggingDebugSession { }); } - async stackTraceRequest( - response: DebugProtocol.StackTraceResponse, - args: DebugProtocol.StackTraceArguments, - ): Promise { - await this._setOutputFormat( - args.format != null && args.format.hex != null && args.format.hex, - ); - - response.body = await this._stackFrames.stackFramesForThread( - args.threadId, - args.startFrame, - args.levels, - ); + async stackTraceRequest(response, args) { + await this._setOutputFormat(args.format != null && args.format.hex != null && args.format.hex); + response.body = await this._stackFrames.stackFramesForThread(args.threadId, args.startFrame, args.levels); try { - response.body.stackFrames = await Promise.all( - response.body.stackFrames.map(async frame => { - let source = frame.source; - if (source == null || source.path == null) { - source = { - sourceReference: await this._disassemble.sourceReferenceForStackFrame( - frame.id, - ), - }; - } - return { - ...frame, - source, + response.body.stackFrames = await Promise.all(response.body.stackFrames.map(async frame => { + let source = frame.source; + + if (source == null || source.path == null) { + source = { + sourceReference: await this._disassemble.sourceReferenceForStackFrame(frame.id) }; - }), - ); + } + return Object.assign({}, frame, { + source + }); + })); this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); } } - async sourceRequest( - response: DebugProtocol.SourceResponse, - args: DebugProtocol.SourceArguments, - ): Promise { + async sourceRequest(response, args) { try { - const content = await this._disassemble.getDisassembly( - args.sourceReference, - ); - response.body = {content}; + const content = await this._disassemble.getDisassembly(args.sourceReference); + response.body = { + content + }; this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); } } - async pauseRequest( - response: DebugProtocol.PauseResponse, - args: DebugProtocol.PauseArguments, - ): Promise { + async pauseRequest(response, args) { try { this._expectingPause = true; + this._client.pause(); + this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); } } - async continueRequest( - response: DebugProtocol.ContinueResponse, - args: DebugProtocol.ContinueRequest, - ): Promise { + async continueRequest(response, args) { return this._executeCommon('exec-continue', null, response); } - async nextRequest( - response: DebugProtocol.NextResponse, - args: DebugProtocol.NextArguments, - ): Promise { + async nextRequest(response, args) { this._stepping = true; this._steppingThread = args.threadId; return this._executeCommon('exec-next', args.threadId, response); } - async stepInRequest( - response: DebugProtocol.StepInResponse, - args: DebugProtocol.StepInArguments, - ): Promise { + async stepInRequest(response, args) { this._stepping = true; this._steppingThread = args.threadId; return this._executeCommon('exec-step', args.threadId, response); } - async stepOutRequest( - response: DebugProtocol.StepOutResponse, - args: DebugProtocol.StepOutArguments, - ): Promise { + async stepOutRequest(response, args) { this._stepping = true; this._steppingThread = args.threadId; return this._executeCommon('exec-finish', args.threadId, response); } - async _executeCommon( - execCommand: string, - threadId: ?number, - response: DebugProtocol.Response, - ): Promise { + async _executeCommon(execCommand, threadId, response) { try { const thread = threadId != null ? `--thread ${threadId}` : ''; const result = await this._client.sendCommand(`${execCommand} ${thread}`); + if (!result.running) { - this._sendFailureResponse( - response, - `Failed to ${execCommand} program ${toCommandError(result).msg}`, - ); + this._sendFailureResponse(response, `Failed to ${execCommand} program ${(0, _MITypes().toCommandError)(result).msg}`); + return; } @@ -700,84 +641,59 @@ class MIDebugSession extends LoggingDebugSession { } } - async scopesRequest( - response: DebugProtocol.ScopesResponse, - args: DebugProtocol.ScopesArguments, - ): Promise { + async scopesRequest(response, args) { try { - const varref = this._variables.variableReferenceForStackFrame( - args.frameId, - ); - - const scopes = [ - { - name: 'Locals', - variablesReference: varref, - expensive: false, - }, - ]; + const varref = this._variables.variableReferenceForStackFrame(args.frameId); + const scopes = [{ + name: 'Locals', + variablesReference: varref, + expensive: false + }]; const regVarref = await this._variables.registersVariableReference(); + if (regVarref != null) { scopes.push({ name: 'Registers', variablesReference: regVarref, - expensive: false, + expensive: false }); } - response.body = {scopes}; + response.body = { + scopes + }; this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); } } - async variablesRequest( - response: DebugProtocol.VariablesResponse, - args: DebugProtocol.VariablesArguments, - ): Promise { - await this._setOutputFormat( - args.format != null && args.format.hex != null && args.format.hex, - ); + async variablesRequest(response, args) { + await this._setOutputFormat(args.format != null && args.format.hex != null && args.format.hex); try { - const variables = await this._variables.getVariables( - args.variablesReference, - args.start, - args.count, - ); - - response.body = {variables}; - + const variables = await this._variables.getVariables(args.variablesReference, args.start, args.count); + response.body = { + variables + }; this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); } } - async setVariableRequest( - response: DebugProtocol.SetVariableResponse, - args: DebugProtocol.SetVariableArguments, - ): Promise { - await this._setOutputFormat( - args.format != null && args.format.hex != null && args.format.hex, - ); + async setVariableRequest(response, args) { + await this._setOutputFormat(args.format != null && args.format.hex != null && args.format.hex); try { - const varref = this._variables.getVariableReference( - args.variablesReference, - ); + const varref = this._variables.getVariableReference(args.variablesReference); + if (varref == null) { - throw new Error( - `setVariableRequest: invalid variable reference ${ - args.variablesReference - }`, - ); + throw new Error(`setVariableRequest: invalid variable reference ${args.variablesReference}`); } const varSet = await varref.setChildValue(args.name, args.value); - response.body = varSet; this.sendResponse(response); } catch (err) { @@ -785,137 +701,113 @@ class MIDebugSession extends LoggingDebugSession { } } - async evaluateRequest( - response: DebugProtocol.EvaluateResponse, - args: DebugProtocol.EvaluateArguments, - ): Promise { + async evaluateRequest(response, args) { // Hack to allow raw gdb commands from the console. if (args.expression.startsWith('`')) { return this._escapedCommandRequest(response, args.expression.substr(1)); } - await this._setOutputFormat( - args.format != null && args.format.hex != null && args.format.hex, - ); + await this._setOutputFormat(args.format != null && args.format.hex != null && args.format.hex); try { - let threadId: ?number; - let frameIndex: ?number; - + let threadId; + let frameIndex; const frameId = args.frameId; + if (frameId != null) { const stackFrame = this._stackFrames.stackFrameByHandle(frameId); + if (stackFrame == null) { throw new Error(`evaluateRequest passed invalid frameId ${frameId}`); } + threadId = stackFrame.threadId; frameIndex = stackFrame.frameIndex; } - const handle = this._variables.expressionVariableReference( - threadId, - frameIndex, - args.expression, - ); + const handle = this._variables.expressionVariableReference(threadId, frameIndex, args.expression); const variables = await this._variables.getVariables(handle); - invariant( - variables.length === 1, - 'call should return 1 element or throw on error', - ); - const variable = variables[0]; + if (!(variables.length === 1)) { + throw new Error('call should return 1 element or throw on error'); + } + + const variable = variables[0]; response.body = { result: variable.value, type: variable.type, variablesReference: variable.variablesReference, namedVariables: variable.namedVariables, - indexedVariables: variable.indexedVariables, + indexedVariables: variable.indexedVariables }; - this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); } } - async _escapedCommandRequest( - response: DebugProtocol.EvaluateResponse, - command: string, - ): Promise { + async _escapedCommandRequest(response, command) { try { if (this._running) { - this._logToConsole( - 'gdb commands may only be issued when the target is stopped.\n', - ); + this._logToConsole('gdb commands may only be issued when the target is stopped.\n'); + this._sendFailureResponse(response, 'failed'); + return; } await this._client.sendRawCommand(command); - response.body = { result: '', type: 'void', - variablesReference: 0, + variablesReference: 0 }; - this.sendResponse(response); } catch (err) { this._sendFailureResponse(response, err.message); } } - async _setOutputFormat(hex: boolean): Promise { + async _setOutputFormat(hex) { this._client.sendCommand(`gdb-set output-radix ${hex ? 16 : 10}`); } - async _initializeTargetIO( - response: DebugProtocol.ConfigurationDoneResponse, - ): Promise { + async _initializeTargetIO(response) { // $TODO Windows - // gdb uses a pty to pipe target (what it calls inferior) output separately from // MI traffic. set up a pty and handlers. - const targetIO = pty.open({}); + const targetIO = pty().open({}); this._targetIO = targetIO; - targetIO.on('data', line => this._onTargetIO(line)); + targetIO.on('data', line => this._onTargetIO(line)); // if the pty socket sends 'end' it means the target process has terminated. - // if the pty socket sends 'end' it means the target process has terminated. - targetIO.once('end', () => this._onTargetTerminated()); + targetIO.once('end', () => this._onTargetTerminated()); // if there's an error such as the actual debugger crashing, shut down cleanly - // if there's an error such as the actual debugger crashing, shut down cleanly targetIO.once('error', () => this._onTargetTerminated()); - if ( - !(await this._sendWithFailureCheck( - response, - `inferior-tty-set ${targetIO.ptyName}`, - )) - ) { + if (!(await this._sendWithFailureCheck(response, `inferior-tty-set ${targetIO.ptyName}`))) { return false; } return true; } - _onTargetIO(line: string): void { - const event = new OutputEvent(); + _onTargetIO(line) { + const event = new (_vscodeDebugadapter().OutputEvent)(); event.body = { category: 'stdout', - output: line, + output: line }; - this.sendEvent(event); } - _onTargetTerminated(): void { - this.sendEvent(new TerminatedEvent()); + _onTargetTerminated() { + this.sendEvent(new (_vscodeDebugadapter().TerminatedEvent)()); this._hasTarget = false; this._configurationDone = false; } - async _runWhenStopped(fn: () => Promise): Promise { + async _runWhenStopped(fn) { if (!this._running) { return fn(); } @@ -940,30 +832,34 @@ class MIDebugSession extends LoggingDebugSession { } } - async _processPauseQueue(): Promise { + async _processPauseQueue() { const fns = this._pauseQueue.slice(); + this._pauseQueue = []; await Promise.all(fns.map(fn => fn())); } - _pauseIfThereAreQueuedCommands(): void { + _pauseIfThereAreQueuedCommands() { if (this._pauseQueue.length !== 0) { this._client.pause(); } } - _breakpointIdFromStop(stop: MIStoppedEventResult): ?number { + _breakpointIdFromStop(stop) { const bkptno = stop.bkptno; + if (bkptno == null) { return null; } const bkptid = parseInt(bkptno, 10); + if (isNaN(bkptid)) { return null; } const bp = this._breakpoints.breakpointByDebuggerId(bkptid); + if (bp == null) { return null; } @@ -971,47 +867,40 @@ class MIDebugSession extends LoggingDebugSession { return this._breakpoints.handleForBreakpoint(bp); } - async _onAsyncStopped(record: MIAsyncRecord): Promise { - const stopped = stoppedEventResult(record); - - await this._processPauseQueue(); - - // if we're stepping and we get a signal in the stepping thread, then + async _onAsyncStopped(record) { + const stopped = (0, _MITypes().stoppedEventResult)(record); + await this._processPauseQueue(); // if we're stepping and we get a signal in the stepping thread, then // we shouldn't ignore the signal, even if exception breakpoints aren't // enabled - const signalWhileStepping = - this._stepping && - stopped.reason === 'signal-received' && - stopped['thread-id'] === this._steppingThread; - // A received signal means one of two things: SIGINT sent to gdb to drop + const signalWhileStepping = this._stepping && stopped.reason === 'signal-received' && stopped['thread-id'] === this._steppingThread; // A received signal means one of two things: SIGINT sent to gdb to drop // into command mode (pausing the target), or an unexpected signal which // is an exception to break on. - if ( - !this._expectingPause && - this._exceptionBreakpoints.shouldIgnoreBreakpoint(stopped) && - !signalWhileStepping - ) { + + if (!this._expectingPause && this._exceptionBreakpoints.shouldIgnoreBreakpoint(stopped) && !signalWhileStepping) { this._running = true; - await this._client.sendCommand('exec-continue'); - // we are really running again. if any commands came in from the UI during + await this._client.sendCommand('exec-continue'); // we are really running again. if any commands came in from the UI during // the await here, they will have been queued. if we don't check now, // we could drop them. pausing again will cause them to run. + this._pauseIfThereAreQueuedCommands(); + return; } this._running = false; + this._stackFrames.clearCachedFrames(); - this._variables.clearCachedVariables(); - // Values: 'step', 'breakpoint', 'exception', 'pause', 'entry', etc. + this._variables.clearCachedVariables(); // Values: 'step', 'breakpoint', 'exception', 'pause', 'entry', etc. + let reason = 'pause'; let description = 'Execution paused'; - let breakpointId: ?number = null; + let breakpointId = null; const exceptionReason = this._exceptionBreakpoints.stopEventReason(stopped); + if (exceptionReason != null) { reason = exceptionReason.reason; description = exceptionReason.description; @@ -1026,14 +915,13 @@ class MIDebugSession extends LoggingDebugSession { this._steppingThread = 0; } else if (stopped.reason === 'exited') { this._onTargetTerminated(); + return; } else if (stopped.reason === 'signal-received') { this._expectingPause = false; - } else if ( - stopped.reason === 'exited-normally' || - stopped.reason === 'exited-signalled' - ) { + } else if (stopped.reason === 'exited-normally' || stopped.reason === 'exited-signalled') { this._onTargetTerminated(); + return; } else if (stopped.reason == null) { // the stop reason is empty for attach start @@ -1050,122 +938,110 @@ class MIDebugSession extends LoggingDebugSession { } } - const event = new StoppedEvent(); + const event = new (_vscodeDebugadapter().StoppedEvent)(); event.body = { reason, description, breakpointId, threadId: parseInt(stopped['thread-id'], 10), preserveFocusHint: false, - allThreadsStopped: true, + allThreadsStopped: true }; - this.sendEvent(event); } - _onAsyncThread(record: MIAsyncRecord, started: boolean): void { + _onAsyncThread(record, started) { // NB that using a handle table is not needed for threads, because the MI // interface defines a thread id which is exactly the same thing. const id = record.result.id; - const event = new ThreadEvent(); - + const event = new (_vscodeDebugadapter().ThreadEvent)(); event.body = { reason: started ? 'started' : 'exited', - threadId: parseInt(id, 10), + threadId: parseInt(id, 10) }; - this.sendEvent(event); } - async _warnIfNoSymbols(program: string): Promise { + async _warnIfNoSymbols(program) { const result = await this._client.sendCommand('file-list-exec-source-file'); - if ( - result.error && - toCommandError(result).msg.startsWith('No symbol table') - ) { - return this._nuclideWarningDialog( - `Symbols were not found in ${program}. It will run, but breakpoints will not work. Please recompile your program with the proper flags to include debugging symbols (typically -g).`, - ); + + if (result.error && (0, _MITypes().toCommandError)(result).msg.startsWith('No symbol table')) { + return this._nuclideWarningDialog(`Symbols were not found in ${program}. It will run, but breakpoints will not work. Please recompile your program with the proper flags to include debugging symbols (typically -g).`); } } - async _sendWithFailureCheck( - response: DebugProtocol.Response, - command: string, - ): Promise { + async _sendWithFailureCheck(response, command) { const result = await this._client.sendCommand(command); + if (result.error) { - this._sendFailureResponse(response, toCommandError(result).msg); + this._sendFailureResponse(response, (0, _MITypes().toCommandError)(result).msg); + return false; } + return true; } - async _nuclideWarningDialog(output: string): Promise { - const event = new OutputEvent(); + async _nuclideWarningDialog(output) { + const event = new (_vscodeDebugadapter().OutputEvent)(); event.body = { category: 'nuclide_notification', data: { - type: 'warning', + type: 'warning' }, - output, + output }; - return this.sendEvent(event); } - async _logToConsole(output: string): Promise { - const event = new OutputEvent(); + async _logToConsole(output) { + const event = new (_vscodeDebugadapter().OutputEvent)(); event.body = { category: 'stdout', data: { - type: 'warning', + type: 'warning' }, - output, + output }; - return this.sendEvent(event); } - _onBreakpointModified(record: MIAsyncRecord): void { - const result = breakpointModifiedEventResult(record); - const breakpoint = this._breakpoints.breakpointByDebuggerId( - parseInt(result.bkpt[0].number, 10), - ); + _onBreakpointModified(record) { + const result = (0, _MITypes().breakpointModifiedEventResult)(record); + + const breakpoint = this._breakpoints.breakpointByDebuggerId(parseInt(result.bkpt[0].number, 10)); if (breakpoint != null && !breakpoint.verified) { const handle = this._breakpoints.handleForBreakpoint(breakpoint); - invariant(handle != null); - breakpoint.setVerified(); + if (!(handle != null)) { + throw new Error("Invariant violation: \"handle != null\""); + } + breakpoint.setVerified(); const protocolBreakpoint = { id: handle, verified: true, source: { - source: breakpoint.source, + source: breakpoint.source }, - line: breakpoint.line, + line: breakpoint.line }; - - const event = new BreakpointEvent(); + const event = new (_vscodeDebugadapter().BreakpointEvent)(); event.body = { reason: 'changed', - breakpoint: protocolBreakpoint, + breakpoint: protocolBreakpoint }; - this.sendEvent(event); } } - _sendFailureResponse( - response: DebugProtocol.Response, - message?: string, - ): void { + _sendFailureResponse(response, message) { response.success = false; response.message = message; this.sendResponse(response); } + } -LoggingDebugSession.run(MIDebugSession); +_vscodeDebugadapter().LoggingDebugSession.run(MIDebugSession); \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/MILineParser.js b/modules/atom-ide-debugger-native-gdb/lib/MILineParser.js index 2f2c092e83..12c7e28fa3 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/MILineParser.js +++ b/modules/atom-ide-debugger-native-gdb/lib/MILineParser.js @@ -1,3 +1,30 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _Logger() { + const data = require("./Logger"); + + _Logger = function () { + return data; + }; + + return data; +} + +function _MIRecord() { + const data = require("./MIRecord"); + + _MIRecord = function () { + return data; + }; + + return data; +} + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,7 +33,7 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ @@ -14,45 +41,23 @@ * A parser for MI output records. See the grammar at * https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Output-Syntax.html#GDB_002fMI-Output-Syntax */ +class MILineParser { + constructor() { + this._completeInput = ''; + this._line = ''; + this._lineParserDispatch = new Map([['~', token => this._parseStream('console', token)], ['@', token => this._parseStream('target', token)], ['&', token => this._parseStream('log', token)], ['^', token => this._parseResult(token)], ['*', token => this._parseAsyncOutput('async-exec', token)], ['+', token => this._parseAsyncOutput('async-status', token)], ['=', token => this._parseAsyncOutput('async-notify', token)]]); + this._cEncoded = new Map([['a', 'a'], ['b', '\b'], ['f', '\f'], ['n', '\n'], ['t', '\t'], ['v', '\v']]); + this._valueParsers = new Map([['"', () => this._parseCStringTail()], ['{', () => this._parseTuple()], ['[', () => this._parseList()]]); + } -import type { - AsyncRecordType, - MICommandResult, - ResultClass, - StreamTarget, - Value, -} from './MIRecord'; - -import {logVerbose} from './Logger'; -import { - MIAsyncRecord, - MIRecord, - MIResultRecord, - MIStreamRecord, -} from './MIRecord'; - -export default class MILineParser { - _completeInput: string = ''; - _line: string = ''; - - _lineParserDispatch: Map MIRecord> = new Map([ - ['~', (token: ?number) => this._parseStream('console', token)], - ['@', (token: ?number) => this._parseStream('target', token)], - ['&', (token: ?number) => this._parseStream('log', token)], - ['^', (token: ?number) => this._parseResult(token)], - ['*', (token: ?number) => this._parseAsyncOutput('async-exec', token)], - ['+', (token: ?number) => this._parseAsyncOutput('async-status', token)], - ['=', (token: ?number) => this._parseAsyncOutput('async-notify', token)], - ]); - - parseMILine(line: string): MIRecord { - this._completeInput = line; - - // gdb still sends the prompt, but it isn't significant, so just return an + parseMILine(line) { + this._completeInput = line; // gdb still sends the prompt, but it isn't significant, so just return an // empty record. + let trimmed = line.trim(); + if (trimmed.startsWith('(gdb)')) { - return new MIRecord(); + return new (_MIRecord().MIRecord)(); } let end = 0; @@ -65,61 +70,50 @@ export default class MILineParser { trimmed = trimmed.substr(end); const parser = this._lineParserDispatch.get(trimmed[0]); + trimmed = trimmed.substr(1); if (parser == null) { const error = `Line is not an MI record at: '${line}'`; - logVerbose(error); + (0, _Logger().logVerbose)(error); throw new Error(error); } this._line = trimmed; return parser(tokenValue); - } - - // console-stream-output -> "~" c-string nl + } // console-stream-output -> "~" c-string nl // target-stream-output -> "@" c-string nl // log-stream-output -> "&" c-string nl - _parseStream(target: StreamTarget, token: ?number): MIRecord { + + + _parseStream(target, token) { if (token != null) { - throw new Error( - `Token is not expected on stream record: '${this._completeInput}'`, - ); + throw new Error(`Token is not expected on stream record: '${this._completeInput}'`); } const text = this._parseCString(); - return new MIStreamRecord(target, text); - } - _cEncoded: Map = new Map([ - ['a', 'a'], - ['b', '\b'], - ['f', '\f'], - ['n', '\n'], - ['t', '\t'], - ['v', '\v'], - ]); + return new (_MIRecord().MIStreamRecord)(target, text); + } // parse a C string as returned by gdb - _parseCString(): string { + _parseCString() { const match = this._line.match(/^"(.*)/); + if (match == null) { throw new Error(`Value is not quoted as a C string at: ${this._line}`); } this._line = match[1]; return this._parseCStringTail(); - } - - // result-record -> [token] "^" result-class ( "," result )* nl + } // result-record -> [token] "^" result-class ( "," result )* nl // result-class -> "done" | "running" | "connected" | "error" | "exit" - _parseResult(token: ?number): MIRecord { + + + _parseResult(token) { let end = 0; - while ( - this._line[end] != null && - this._line[end] >= 'a' && - this._line[end] <= 'z' - ) { + + while (this._line[end] != null && this._line[end] >= 'a' && this._line[end] <= 'z') { end++; } @@ -128,29 +122,26 @@ export default class MILineParser { } const resultClass = this._ensureResultClass(this._line.substr(0, end)); + this._line = this._line.substr(end); const result = this._parseResultMap(); - return new MIResultRecord(token, result, resultClass); - } - - // exec-async-output -> [ token ] "*" async-output nl + return new (_MIRecord().MIResultRecord)(token, result, resultClass); + } // exec-async-output -> [ token ] "*" async-output nl // status-async-output -> [ token ] "+" async-output nl // notify-async-output -> [ token ] "=" async-output nl // async-output -> async-class ( "," result )* - // matches the header of an async record - _parseAsyncOutput(type: AsyncRecordType, token: ?number): MIRecord { + + + _parseAsyncOutput(type, token) { // NB the grammar doesn't precisely specify what characters may // constitute async-class, but throughout gdb the convention is // lower-case alphabetics so it's probably safe to assume that. let end = 0; - while ( - this._line[end] != null && - ((this._line[end] >= 'a' && this._line[end] <= 'z') || - this._line[end] === '-') - ) { + + while (this._line[end] != null && (this._line[end] >= 'a' && this._line[end] <= 'z' || this._line[end] === '-')) { end++; } @@ -159,20 +150,21 @@ export default class MILineParser { } const asyncClass = this._line.substr(0, end); - this._line = this._line.substr(end); + this._line = this._line.substr(end); let result = new Map(); + if (this._line !== '') { result = this._parseResultMap(); } - return new MIAsyncRecord(token, result, asyncClass, type); - } - - // at this point we have (, result)+ nl from multiple rules + return new (_MIRecord().MIAsyncRecord)(token, result, asyncClass, type); + } // at this point we have (, result)+ nl from multiple rules // - _parseResultMap(): MICommandResult { - const result: MICommandResult = {}; + + + _parseResultMap() { + const result = {}; while (this._line != null) { if (this._line[0] !== ',') { @@ -180,14 +172,14 @@ export default class MILineParser { } const equals = this._line.indexOf('=', 1); + if (equals === -1) { break; } const varname = this._line.substr(1, equals - 1); - this._line = this._line.substr(equals + 1); - // This is mega hacky. In C++ the idea of a function breakpoint matching + this._line = this._line.substr(equals + 1); // This is mega hacky. In C++ the idea of a function breakpoint matching // multiple source locations had to be introduced because of overloading. // A function breakpoint set returns a breakpoint id for the main // breakpoint, and then id.1, id.2, etc. for all the actual source/line @@ -204,27 +196,23 @@ export default class MILineParser { if (varname === 'bkpt' && this._line != null && this._line[0] === '{') { this._line = `[${this._line}]`; } + result[varname] = this._parseValue(); } return result; - } - - // value -> const | tuple | list + } // value -> const | tuple | list // const -> c-string // tuple -> "{}" | "{" result ( "," result )* "}" // list -> "[]" | "[" value ( "," value )* "]" | "[" result ( "," result )* "]" - // matches the leading part of a value - _valueParsers: Map any> = new Map([ - ['"', () => this._parseCStringTail()], - ['{', () => this._parseTuple()], - ['[', () => this._parseList()], - ]); - _parseValue(): Value { + + _parseValue() { this._line = this._line.trim(); - const handler: ?() => any = this._valueParsers.get(this._line[0]); + + const handler = this._valueParsers.get(this._line[0]); + this._line = this._line.substr(1); if (handler == null) { @@ -232,18 +220,19 @@ export default class MILineParser { } return handler(); - } - - // tuple -> "{}" | "{" result ( "," result )* "}" + } // tuple -> "{}" | "{" result ( "," result )* "}" // The leading { has already been removed - _parseTuple(endChar: string = '}'): Value { + + + _parseTuple(endChar = '}') { if (this._line[0] === endChar) { this._line = this._line.substr(1); return {}; - } + } // parseResultMap expects a leading comma + - // parseResultMap expects a leading comma this._line = ',' + this._line; + const result = this._parseResultMap(); let error = false; @@ -251,7 +240,6 @@ export default class MILineParser { if (this._line.length > 0) { const close = this._line[0]; this._line = this._line.substr(1); - error = close !== endChar; } else { error = true; @@ -262,15 +250,14 @@ export default class MILineParser { } return result; - } - - // list -> "[]" | "[" value ( "," value )* "]" | "[" result ( "," result )* "]" + } // list -> "[]" | "[" value ( "," value )* "]" | "[" result ( "," result )* "]" // the leading [ has already been stripped // - // matches a result (varname=value) - _parseList(): Value { - const result: Array = []; + + + _parseList() { + const result = []; if (this._line[0] === ']') { this._line = this._line.substr(1); @@ -279,22 +266,30 @@ export default class MILineParser { while (true) { this._line = this._line.trim(); + if (this._valueParsers.get(this._line[0]) != null) { result.push(this._parseValue()); } else { const equals = this._line.indexOf('='); + if (equals === -1) { throw new Error(`value or result expected at ${this._line}`); } const varname = this._line.substr(0, equals); + this._line = this._line.substr(equals + 1); + const value = this._parseValue(); - result.push({[varname]: value}); + + result.push({ + [varname]: value + }); } this._line = this._line.trim(); const close = this._line[0]; + if (close !== ']' && close !== ',') { throw new Error(`',' or ']' expected at: ${this._line}`); } @@ -309,32 +304,28 @@ export default class MILineParser { return result; } - _ensureResultClass(resultClass: string): ResultClass { - if ( - resultClass !== 'done' && - resultClass !== 'running' && - resultClass !== 'connected' && - resultClass !== 'error' && - resultClass !== 'exit' - ) { + _ensureResultClass(resultClass) { + if (resultClass !== 'done' && resultClass !== 'running' && resultClass !== 'connected' && resultClass !== 'error' && resultClass !== 'exit') { throw new Error(`Result class expected at '${this._line}'`); } return resultClass; - } - - // $TODO escapes that include values, e.g. "A\x42C" should be "ABC" + } // $TODO escapes that include values, e.g. "A\x42C" should be "ABC" // Parse a C string for which the leading quote has already been stripped - _parseCStringTail(): string { - let parsed: string = ''; - let ended: boolean = false; - let escaped: boolean = false; - let i: number; + + + _parseCStringTail() { + let parsed = ''; + let ended = false; + let escaped = false; + let i; for (i = 0; i < this._line.length && !ended; i++) { - const c: string = this._line[i]; + const c = this._line[i]; + if (escaped) { - const translated: ?string = this._cEncoded.get(c); + const translated = this._cEncoded.get(c); + parsed += translated != null ? translated : c; escaped = false; } else if (c === '\\') { @@ -353,4 +344,7 @@ export default class MILineParser { this._line = this._line.substr(i); return parsed; } + } + +exports.default = MILineParser; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/MIProxy.js b/modules/atom-ide-debugger-native-gdb/lib/MIProxy.js index 762b592b93..99c438c6c6 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/MIProxy.js +++ b/modules/atom-ide-debugger-native-gdb/lib/MIProxy.js @@ -1,3 +1,48 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var child_process = _interopRequireWildcard(require("child_process")); + +function _Logger() { + const data = require("./Logger"); + + _Logger = function () { + return data; + }; + + return data; +} + +function _MILineParser() { + const data = _interopRequireDefault(require("./MILineParser")); + + _MILineParser = function () { + return data; + }; + + return data; +} + +function _MIRecord() { + const data = require("./MIRecord"); + + _MIRecord = function () { + return data; + }; + + return data; +} + +var _events = _interopRequireDefault(require("events")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,78 +51,38 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import * as child_process from 'child_process'; - -import invariant from 'assert'; -import {logVerbose} from './Logger'; - -import MILineParser from './MILineParser'; -import { - MIAsyncRecord, - MIRecord, - MIResultRecord, - MIStreamRecord, -} from './MIRecord'; - -export type StreamTarget = 'console' | 'target' | 'log'; - -import EventEmitter from 'events'; - -type PendingCommand = { - command: string, - resolve: (result: MIResultRecord) => void, -}; - -export default class MIProxy extends EventEmitter { - _miServer: ?child_process$ChildProcess; - _parser: MILineParser; - _lastPartialString: string; - _nextToken: number; - _pendingCommands: Map; - - _pendingRawCommandResolve: ?() => void; - +class MIProxy extends _events.default { constructor() { super(); - - this._parser = new MILineParser(); + this._parser = new (_MILineParser().default)(); this._nextToken = 1; this._lastPartialString = ''; this._pendingCommands = new Map(); } - isConnected(): boolean { + isConnected() { return this._miServer != null; } - start( - executable: string, - args: Array, - env: ?{[string]: string}, - ): void { + start(executable, args, env) { if (this._miServer != null) { this.stop(); } let options = {}; + if (env != null) { - options = { - ...options, - env: { - ...process.env, - ...env, - }, - }; + options = Object.assign({}, options, { + env: Object.assign({}, process.env, env) + }); } const proc = child_process.spawn(executable, args, options); this._miServer = proc; - - proc.stdout.on('data', (buffer: Buffer) => this._onData(buffer)); + proc.stdout.on('data', buffer => this._onData(buffer)); proc.on('error', err => { this.emit('error', err); }); @@ -86,8 +91,9 @@ export default class MIProxy extends EventEmitter { }); } - pause(): void { + pause() { const server = this._miServer; + if (server == null) { return; } @@ -95,116 +101,121 @@ export default class MIProxy extends EventEmitter { server.kill('SIGINT'); } - stop(): void { + stop() { if (this._miServer != null) { this._miServer.disconnect(); + this._miServer = null; } } - async sendCommand(command: string): Promise { + async sendCommand(command) { return new Promise((resolve, reject) => { const dbg = this._miServer; + if (dbg == null) { - reject( - new Error('Attempt to send a command when no MI server connected'), - ); + reject(new Error('Attempt to send a command when no MI server connected')); return; } const token = this._nextToken++; - const pendingCommand: PendingCommand = { + const pendingCommand = { command, token, - resolve: (record: MIResultRecord) => {}, + resolve: record => {} }; pendingCommand.resolve = resolve; + this._pendingCommands.set(token, pendingCommand); + const tokenizedCommand = `${token}-${command}\n`; - logVerbose(`MIProxy sending command '${tokenizedCommand}' to server`); + (0, _Logger().logVerbose)(`MIProxy sending command '${tokenizedCommand}' to server`); dbg.stdin.write(tokenizedCommand); }); } - async sendRawCommand(command: string): Promise { + async sendRawCommand(command) { return new Promise((resolve, reject) => { const dbg = this._miServer; + if (dbg == null) { - reject( - new Error('Attempt to send a command when no MI server connected'), - ); + reject(new Error('Attempt to send a command when no MI server connected')); return; - } - - // We're making the assumption here that if we've stopped gdb at the prompt + } // We're making the assumption here that if we've stopped gdb at the prompt // and sent a real gdb (not MI) command, that it will execute synchronously // with no intermixed MI traffic. + + this._pendingRawCommandResolve = resolve; dbg.stdin.write(`${command}\n`); }); } - _onData(buffer: Buffer): void { + _onData(buffer) { // NB data coming back from gdb will be ASCII, and data from the target - // does not come over this channel. - const str: string = this._lastPartialString + buffer.toString('ASCII'); + const str = this._lastPartialString + buffer.toString('ASCII'); + const tailSplit = str.lastIndexOf('\n'); - const tailSplit: number = str.lastIndexOf('\n'); if (tailSplit === -1) { this._lastPartialString = str; return; } this._lastPartialString = str.substr(tailSplit + 1); - str - .substr(0, tailSplit) - .split('\n') - .forEach((line: string) => this._onLine(line.trim())); + str.substr(0, tailSplit).split('\n').forEach(line => this._onLine(line.trim())); } - _onLine(line: string): void { + _onLine(line) { if (line === '') { return; } - logVerbose(`proxy received line ${line}`); + (0, _Logger().logVerbose)(`proxy received line ${line}`); + const parsed = this._parser.parseMILine(line); + this._emitRecord(parsed, line); } - _emitRecord(record: MIRecord, line: string): void { - if (record instanceof MIResultRecord) { - const token = record.token; - // if we have a raw gdb command, it won't have an associated token + _emitRecord(record, line) { + if (record instanceof _MIRecord().MIResultRecord) { + const token = record.token; // if we have a raw gdb command, it won't have an associated token + const rawResolve = this._pendingRawCommandResolve; + if (token == null && rawResolve != null) { rawResolve(); this._pendingRawCommandResolve = null; return; } - invariant(token != null, 'token should always exist in a result record'); + if (!(token != null)) { + throw new Error('token should always exist in a result record'); + } + const pending = this._pendingCommands.get(token); + if (pending != null) { pending.resolve(record); + this._pendingCommands.delete(token); + return; } - logVerbose( - `Received response with token ${token} which matches no pending command`, - ); + + (0, _Logger().logVerbose)(`Received response with token ${token} which matches no pending command`); } - if (record instanceof MIAsyncRecord) { + if (record instanceof _MIRecord().MIAsyncRecord) { this.emit('async', record); - } else if (record instanceof MIStreamRecord) { + } else if (record instanceof _MIRecord().MIStreamRecord) { if (!this._hackForAttachPermissions(record)) { this.emit('stream', record); } } } - _hackForAttachPermissions(record: MIStreamRecord): boolean { + _hackForAttachPermissions(record) { if (record.streamTarget !== 'log') { return false; } @@ -213,17 +224,13 @@ export default class MIProxy extends EventEmitter { return false; } - const attach = [...this._pendingCommands].find( - _ => _[1].command.match(/target-attach/) != null, - ); + const attach = [...this._pendingCommands].find(_ => _[1].command.match(/target-attach/) != null); if (attach == null) { return false; } - const [token, command] = attach; - - // Modern versions of linux default to a locked down security model for + const [token, command] = attach; // Modern versions of linux default to a locked down security model for // ptrace where ptrace can only attach to a child process. A sysctl call // must be made in order to get the old behavior, which gdb target-attach // depends on, of being able to ptrace any process owned by the user. @@ -231,14 +238,17 @@ export default class MIProxy extends EventEmitter { // MI failure in this case; it prints a message to the log saying how // to fix the problem but the command never actually completes. Hence // this hack... - const failure = new MIResultRecord( - token, - {msg: record.text.replace('\n', ' ')}, - 'error', - ); + + const failure = new (_MIRecord().MIResultRecord)(token, { + msg: record.text.replace('\n', ' ') + }, 'error'); command.resolve(failure); + this._pendingCommands.delete(token); return true; } + } + +exports.default = MIProxy; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/MIRecord.js b/modules/atom-ide-debugger-native-gdb/lib/MIRecord.js index 95e3ecdc99..583043d8d4 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/MIRecord.js +++ b/modules/atom-ide-debugger-native-gdb/lib/MIRecord.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.MIResultRecord = exports.MIAsyncRecord = exports.MICommandResponseRecord = exports.MIStreamRecord = exports.MIRecord = void 0; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,121 +13,100 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +class MIRecord {} // A stream record represents output. It is not tied to a particular +// command sent by the client. -export type AsyncRecordType = 'async-exec' | 'async-status' | 'async-notify'; - -export type StreamTarget = 'console' | 'target' | 'log'; - -export type ResultClass = 'done' | 'running' | 'connected' | 'error' | 'exit'; - -export type Value = string | MICommandResult | Array; - -export type MICommandResult = {[string]: Value}; - -export class MIRecord {} -// A stream record represents output. It is not tied to a particular -// command sent by the client. -export class MIStreamRecord extends MIRecord { - _streamTarget: StreamTarget; - _text: string; +exports.MIRecord = MIRecord; - constructor(streamTarget: StreamTarget, text: string) { +class MIStreamRecord extends MIRecord { + constructor(streamTarget, text) { super(); - this._streamTarget = streamTarget; this._text = text; } - get streamTarget(): StreamTarget { + get streamTarget() { return this._streamTarget; } - get text(): string { + get text() { return this._text; } -} -// A command response record represents an event initiated by a command the +} // A command response record represents an event initiated by a command the // client issued, either directly or indirectly. Command responses optionally // have a numeric token specified by the client when the command was issued. -export class MICommandResponseRecord extends MIRecord { - _token: ?number; - _result: MICommandResult; - constructor(token: ?number, result: MICommandResult) { - super(); +exports.MIStreamRecord = MIStreamRecord; + +class MICommandResponseRecord extends MIRecord { + constructor(token, result) { + super(); this._token = token; this._result = result; } - get token(): ?number { + get token() { return this._token; } - get result(): MICommandResult { + get result() { return this._result; } -} -// An async record represents an event that happened as a side effect of +} // An async record represents an event that happened as a side effect of // a command, but is not the actual command result. -export class MIAsyncRecord extends MICommandResponseRecord { - _recordType: AsyncRecordType; - _asyncClass: string; - - constructor( - token: ?number, - result: MICommandResult, - asyncClass: string, - recordType: AsyncRecordType, - ) { - super(token, result); + +exports.MICommandResponseRecord = MICommandResponseRecord; + +class MIAsyncRecord extends MICommandResponseRecord { + constructor(token, result, asyncClass, recordType) { + super(token, result); this._asyncClass = asyncClass; this._recordType = recordType; } - get asyncClass(): string { + get asyncClass() { return this._asyncClass; } - get recordType(): AsyncRecordType { + get recordType() { return this._recordType; } -} -// A result record is the direct result of a command sent from the client -export class MIResultRecord extends MICommandResponseRecord { - _resultClass: ResultClass; +} // A result record is the direct result of a command sent from the client - constructor( - token: ?number, - result: MICommandResult, - resultClass: ResultClass, - ) { - super(token, result); +exports.MIAsyncRecord = MIAsyncRecord; + +class MIResultRecord extends MICommandResponseRecord { + constructor(token, result, resultClass) { + super(token, result); this._resultClass = resultClass; } - get resultClass(): ResultClass { + get resultClass() { return this._resultClass; } - get done(): boolean { + get done() { return this._resultClass === 'done'; } - get error(): boolean { + get error() { return this._resultClass === 'error'; } - get running(): boolean { + get running() { return this._resultClass === 'running'; } + } + +exports.MIResultRecord = MIResultRecord; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/MIRegisterValue.js b/modules/atom-ide-debugger-native-gdb/lib/MIRegisterValue.js index 4b0b12baba..9938ce2c1e 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/MIRegisterValue.js +++ b/modules/atom-ide-debugger-native-gdb/lib/MIRegisterValue.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.MIRegisterValueParser = exports.MIRegisterIndexedValues = exports.MIRegisterNamedValues = exports.MIRegisterSimpleValue = exports.MIRegisterValue = void 0; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,10 +13,9 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - // The MI documentation doesn't cover this, but gdb will return structured values // for registers which contain packed arrays of simple types (MMX et al.) // Furthermore, if the register can hold different widths of values, then @@ -21,164 +27,157 @@ // named_list => '{' identifer '=' value ( ',' identifier '=' value ) * '}' // indexed_list => '{' value ( ',' value ) * '}' // - -import invariant from 'assert'; - -export type MINamedRegisterValue = { - name: string, - expressionSuffix: string, - value: MIRegisterValue, -}; - -export class MIRegisterValue { - toString(): string { +class MIRegisterValue { + toString() { return ''; } - isContainer(): boolean { + isContainer() { return false; } - containedValues(): Array { + containedValues() { return []; } - get containerKeyIsString(): boolean { + get containerKeyIsString() { return false; } - get length(): number { + get length() { return 0; } - valueAt(index: string): ?MIRegisterValue { + valueAt(index) { return null; } + } -export class MIRegisterSimpleValue extends MIRegisterValue { - _value: string; +exports.MIRegisterValue = MIRegisterValue; - constructor(value: string) { +class MIRegisterSimpleValue extends MIRegisterValue { + constructor(value) { super(); this._value = value; } - get value(): string { + get value() { return this._value; } - toString(): string { + toString() { return this._value; } + } -export class MIRegisterNamedValues extends MIRegisterValue { - _values: Map; +exports.MIRegisterSimpleValue = MIRegisterSimpleValue; - constructor(values: Map) { +class MIRegisterNamedValues extends MIRegisterValue { + constructor(values) { super(); this._values = values; } - isContainer(): boolean { + isContainer() { return true; } - get names(): Array { + get names() { return [...this._values.keys()]; } - get containerKeyIsString(): boolean { + get containerKeyIsString() { return true; } - get length(): number { + get length() { return this._values.size; } - valueAt(index: string): ?MIRegisterValue { + valueAt(index) { return this._values.get(index); } - containedValues(): Array { + containedValues() { return [...this._values].map(entry => { return { name: entry[0], expressionSuffix: `.${entry[0]}`, - value: entry[1], + value: entry[1] }; }); } - toString(): string { - return `{${[...this._values] - .map(([k, v]) => `${k}:${v.toString()}`) - .join(',')}}`; + toString() { + return `{${[...this._values].map(([k, v]) => `${k}:${v.toString()}`).join(',')}}`; } + } -export class MIRegisterIndexedValues extends MIRegisterValue { - _values: Array; +exports.MIRegisterNamedValues = MIRegisterNamedValues; - constructor(values: Array) { +class MIRegisterIndexedValues extends MIRegisterValue { + constructor(values) { super(); this._values = values; } - isContainer(): boolean { + isContainer() { return true; } - get length(): number { + get length() { return this._values.length; } - valueAt(index: string): ?MIRegisterValue { + valueAt(index) { return this._values[parseInt(index, 10)]; } - get values(): Array { + get values() { return this._values; } - containedValues(): Array { + containedValues() { return this._values.map((entry, index) => { return { name: `${index}`, expressionSuffix: `[${index}]`, - value: entry, + value: entry }; }); } - toString(): string { + toString() { return `[${this._values.map(_ => _.toString()).join(',')}]`; } + } -export class MIRegisterValueParser { - _originalExpression: string; - _expression: string; +exports.MIRegisterIndexedValues = MIRegisterIndexedValues; +class MIRegisterValueParser { // matches name = something - _namePattern: RegExp = /^\s*([a-zA-Z_][a-zA-Z_0-9]*)\s*=(.*)/; - - constructor(expression: string) { + constructor(expression) { + this._namePattern = /^\s*([a-zA-Z_][a-zA-Z_0-9]*)\s*=(.*)/; this._originalExpression = expression; } - parse(): MIRegisterValue { + parse() { this._expression = this._originalExpression; const value = this._parse(); + if (this._expression !== '') { throw new Error('Extra characters at end of expression'); } + return value; } - _parse(): MIRegisterValue { + _parse() { this._expression = this._expression.trim(); if (this._expression === '') { @@ -188,18 +187,19 @@ export class MIRegisterValueParser { if (this._expression[0] !== '{') { // expression value goes until the next ',', '}', or end of string. const match = this._expression.match(/^([^,}]*)(.*)$/); - invariant(match != null); - const [, value, rest] = match; + if (!(match != null)) { + throw new Error("Invariant violation: \"match != null\""); + } + const [, value, rest] = match; this._expression = rest; return new MIRegisterSimpleValue(value.trim()); } - this._expression = this._expression.substr(1); - - // if we have "name = " then we have a named list; otherwise, an indexed + this._expression = this._expression.substr(1); // if we have "name = " then we have a named list; otherwise, an indexed // list. + if (this._expression.match(this._namePattern) != null) { return this._parseNamedList(); } @@ -207,8 +207,8 @@ export class MIRegisterValueParser { return this._parseIndexedList(); } - _parseIndexedList(): MIRegisterValue { - const values: Array = []; + _parseIndexedList() { + const values = []; while (true) { const value = this._parse(); @@ -216,30 +216,31 @@ export class MIRegisterValueParser { if (!this._expandArrayInto(value, values)) { values.push(value); } + if (this._checkEndOfList()) { break; } } return new MIRegisterIndexedValues(values); - } - - // gdb/MI will sometimes reformat an array if it contains multiple repeated + } // gdb/MI will sometimes reformat an array if it contains multiple repeated // values. This is great for saving space in displayable output, but we want // the expansion to be available to be expanded in tree display. - _expandArrayInto( - value: MIRegisterValue, - values: Array, - ): boolean { + + + _expandArrayInto(value, values) { if (value instanceof MIRegisterSimpleValue) { const repeatedValuePattern = /^(.*) $/; const match = value.value.match(repeatedValuePattern); + if (match != null) { const [, repeatedValue, countStr] = match; const count = parseInt(countStr, 10); + for (let i = 0; i < count; i++) { values.push(new MIRegisterSimpleValue(repeatedValue)); } + return true; } } @@ -247,14 +248,16 @@ export class MIRegisterValueParser { return false; } - _parseNamedList(): MIRegisterValue { - const values: Map = new Map(); + _parseNamedList() { + const values = new Map(); while (true) { const match = this._expression.match(this._namePattern); + if (match != null) { const [, name, rest] = match; this._expression = rest; + const value = this._parse(); values.set(name, value); @@ -269,8 +272,9 @@ export class MIRegisterValueParser { return new MIRegisterNamedValues(values); } - _checkEndOfList(): boolean { + _checkEndOfList() { this._expression = this._expression.trim(); + if (this._expression !== '') { const sepChar = this._expression[0]; this._expression = this._expression.substr(1); @@ -281,6 +285,10 @@ export class MIRegisterValueParser { return false; } } + throw new Error('Improperly formatted list in register value'); } + } + +exports.MIRegisterValueParser = MIRegisterValueParser; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/MITypes.js b/modules/atom-ide-debugger-native-gdb/lib/MITypes.js index b786a572d6..1325a3ef40 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/MITypes.js +++ b/modules/atom-ide-debugger-native-gdb/lib/MITypes.js @@ -1,3 +1,37 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.toCommandError = toCommandError; +exports.breakInsertResult = breakInsertResult; +exports.dataEvaluateExpressionResult = dataEvaluateExpressionResult; +exports.dataListRegisterNamesResult = dataListRegisterNamesResult; +exports.dataListRegisterValuesResult = dataListRegisterValuesResult; +exports.threadInfoResult = threadInfoResult; +exports.stackInfoDepthResult = stackInfoDepthResult; +exports.stackListFramesResult = stackListFramesResult; +exports.stackListVariablesResult = stackListVariablesResult; +exports.varCreateResult = varCreateResult; +exports.varListChildrenResult = varListChildrenResult; +exports.varInfoNumChildrenResult = varInfoNumChildrenResult; +exports.varInfoTypeResult = varInfoTypeResult; +exports.varEvaluateExpressionResult = varEvaluateExpressionResult; +exports.varAssignResult = varAssignResult; +exports.stoppedEventResult = stoppedEventResult; +exports.breakpointModifiedEventResult = breakpointModifiedEventResult; +exports.dataDisassembleResult = dataDisassembleResult; + +function _MIRecord() { + const data = require("./MIRecord"); + + _MIRecord = function () { + return data; + }; + + return data; +} + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,286 +40,166 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +function toCommandError(record) { + if (!record.error) { + throw new Error("Invariant violation: \"record.error\""); + } -import invariant from 'assert'; -import {MIAsyncRecord, MIResultRecord} from './MIRecord'; + return record.result; +} // break-insert -// Type conversions from a generic MI record to command-specfic results -// failure from any command where resultClass is 'error' -export type MICommandError = { - msg: string, -}; +function breakInsertResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -export function toCommandError(record: MIResultRecord): MICommandError { - invariant(record.error); - return ((record.result: any): MICommandError); -} + return record.result; +} // data-evaluate-expression -// break-insert -export type MIBreakpoint = { - number: string, - line?: string, - 'original-location'?: string, - file?: string, - fullname?: string, - pending?: string, -}; - -export type MIBreakInsertResult = { - bkpt: [MIBreakpoint], -}; - -export function breakInsertResult(record: MIResultRecord): MIBreakInsertResult { - invariant(!record.error); - return ((record.result: any): MIBreakInsertResult); -} -// data-evaluate-expression -export type MIDataEvaluateExpressionResult = { - value: string, -}; +function dataEvaluateExpressionResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -export function dataEvaluateExpressionResult( - record: MIResultRecord, -): MIDataEvaluateExpressionResult { - invariant(!record.error); - return ((record.result: any): MIDataEvaluateExpressionResult); -} + return record.result; +} // data-list-register-names -// data-list-register-names -export type MIDataListRegisterNamesResult = { - 'register-names': Array, -}; -export function dataListRegisterNamesResult( - record: MIResultRecord, -): MIDataListRegisterNamesResult { - invariant(!record.error); - return ((record.result: any): MIDataListRegisterNamesResult); -} +function dataListRegisterNamesResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -// data-list-register-values -export type MIDataListRegisterValuesResult = { - 'register-values': Array<{ - number: string, - value: string, - }>, -}; - -export function dataListRegisterValuesResult( - record: MIResultRecord, -): MIDataListRegisterValuesResult { - invariant(!record.error); - return ((record.result: any): MIDataListRegisterValuesResult); -} + return record.result; +} // data-list-register-values -// thread-info -export type MIThreadInfo = { - id: string, // this is a globally unique id for the thread - 'target-id': string, // this is an id that is only unique in the target the thread is running in - details?: string, - name?: string, - frame: MIStackFrame, - state: 'stopped' | 'running', - core?: string, -}; - -export type MIThreadInfoResult = { - threads: [MIThreadInfo], - 'current-thread-id': string, -}; - -export function threadInfoResult(record: MIResultRecord): MIThreadInfoResult { - invariant(!record.error); - return ((record.result: any): MIThreadInfoResult); -} -// stack-info-depth -export type MIStackInfoDepthResult = { - depth: string, -}; +function dataListRegisterValuesResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -export function stackInfoDepthResult( - record: MIResultRecord, -): MIStackInfoDepthResult { - invariant(!record.error); - return ((record.result: any): MIStackInfoDepthResult); -} + return record.result; +} // thread-info -// stack-list-frames -export type MIStackFrame = { - level: string, // a decimal integer, 0 is the most recent frame - addr: string, - func: string, - file?: string, - fullname?: string, - line?: string, - from?: string, -}; - -export type MIStackListFramesResult = { - stack: Array<{ - frame: MIStackFrame, - }>, -}; - -export function stackListFramesResult( - record: MIResultRecord, -): MIStackListFramesResult { - invariant(!record.error); - return ((record.result: any): MIStackListFramesResult); -} -// stack-list-variables -export type MIVariable = { - name: string, - arg?: string, // if present, flags if variable is a function argument - value?: string, // if missing, means this is a container (array, struct, etc.) -}; - -export type MIStackListVariablesResult = { - variables: Array, -}; - -export function stackListVariablesResult( - record: MIResultRecord, -): MIStackListVariablesResult { - invariant(!record.error); - return ((record.result: any): MIStackListVariablesResult); -} +function threadInfoResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -// var-create -export type MIVarCreateResult = { - name: string, - numchild: string, - value: string, - type: string, - 'thread-id': string, - has_more: string, -}; - -export function varCreateResult(record: MIResultRecord): MIVarCreateResult { - invariant(!record.error); - return ((record.result: any): MIVarCreateResult); -} + return record.result; +} // stack-info-depth -// var-list-children -export type MIVarChild = { - child: { - name: string, - exp: string, - numchild: string, - value?: string, - type: string, - 'thread-id': string, - }, -}; - -export type MIVarListChildrenResult = { - numchild: string, - children: Array, - has_more: string, -}; - -export function varListChildrenResult( - record: MIResultRecord, -): MIVarListChildrenResult { - invariant(!record.error); - return ((record.result: any): MIVarListChildrenResult); -} -// var-info-num-children -export type MIVarInfoNumChildrenResult = { - numchild: string, -}; +function stackInfoDepthResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -export function varInfoNumChildrenResult( - record: MIResultRecord, -): MIVarInfoNumChildrenResult { - invariant(!record.error); - return ((record.result: any): MIVarInfoNumChildrenResult); -} + return record.result; +} // stack-list-frames -// var-info-type -export type MIVarInfoTypeResult = { - type: string, -}; -export function varInfoTypeResult(record: MIResultRecord): MIVarInfoTypeResult { - invariant(!record.error); - return ((record.result: any): MIVarInfoTypeResult); -} +function stackListFramesResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -// var-evaluate-expression -export type MIVarEvaluateExpressionResult = { - value: string, -}; + return record.result; +} // stack-list-variables -export function varEvaluateExpressionResult( - record: MIResultRecord, -): MIVarEvaluateExpressionResult { - invariant(!record.error); - return ((record.result: any): MIVarEvaluateExpressionResult); -} -// var-assign -export type MIVarAssignResult = { - value: string, -}; +function stackListVariablesResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -export function varAssignResult(record: MIResultRecord): MIVarAssignResult { - invariant(!record.error); - return ((record.result: any): MIVarAssignResult); -} + return record.result; +} // var-create -// stopped async event -export type MIStoppedEventResult = { - reason: string, - bkptno: ?string, - 'thread-id': string, -}; - -export function stoppedEventResult( - record: MIAsyncRecord, -): MIStoppedEventResult { - invariant(record.asyncClass === 'stopped'); - return ((record.result: any): MIStoppedEventResult); -} -// breakpoint modified event -export type MIBreakpointModifiedEventResult = { - bkpt: [MIBreakpoint], -}; +function varCreateResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } -export function breakpointModifiedEventResult( - record: MIAsyncRecord, -): MIBreakpointModifiedEventResult { - invariant(record.asyncClass === 'breakpoint-modified'); - return ((record.result: any): MIBreakpointModifiedEventResult); -} + return record.result; +} // var-list-children -// data-disassemble result -export type MIDisassembleInstruction = { - address: string, - inst: string, -}; - -export type MIDataDisassembleResult = { - asm_insns: Array, -}; - -export function dataDisassembleResult( - record: MIResultRecord, -): MIDataDisassembleResult { - invariant(!record.error); - return ((record.result: any): MIDataDisassembleResult); -} -export type StopReason = { - reason: string, - description: string, -}; +function varListChildrenResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } + + return record.result; +} // var-info-num-children + + +function varInfoNumChildrenResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } + + return record.result; +} // var-info-type + + +function varInfoTypeResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } + + return record.result; +} // var-evaluate-expression + + +function varEvaluateExpressionResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } + + return record.result; +} // var-assign + + +function varAssignResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } + + return record.result; +} // stopped async event + + +function stoppedEventResult(record) { + if (!(record.asyncClass === 'stopped')) { + throw new Error("Invariant violation: \"record.asyncClass === 'stopped'\""); + } + + return record.result; +} // breakpoint modified event + + +function breakpointModifiedEventResult(record) { + if (!(record.asyncClass === 'breakpoint-modified')) { + throw new Error("Invariant violation: \"record.asyncClass === 'breakpoint-modified'\""); + } + + return record.result; +} // data-disassemble result + + +function dataDisassembleResult(record) { + if (!!record.error) { + throw new Error("Invariant violation: \"!record.error\""); + } + + return record.result; +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/NestedVariableReference.js b/modules/atom-ide-debugger-native-gdb/lib/NestedVariableReference.js index da043f2997..e9b8fb562a 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/NestedVariableReference.js +++ b/modules/atom-ide-debugger-native-gdb/lib/NestedVariableReference.js @@ -1,3 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _VariableReference() { + const data = _interopRequireDefault(require("./VariableReference")); + + _VariableReference = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,105 +45,86 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {Variable} from 'vscode-debugprotocol'; - -import invariant from 'assert'; -import MIProxy from './MIProxy'; -import {toCommandError, varListChildrenResult} from './MITypes'; -import VariableReference from './VariableReference'; - // A NestedVariableReference refers to a set of variables in another variable // (struct, union, etc.) -export default class NestedVariableReference extends VariableReference { - _type: ?string; - _qualifiedName: string; - _needsDeletion: boolean; - - constructor( - client: MIProxy, - variables: Variables, - container: VariableReference, - expression: string, // exp is the expression in the source language naming the variable - varName: ?string, // name is the internal gdb variable name, used to get the value - ) { +class NestedVariableReference extends _VariableReference().default { + constructor(client, variables, container, expression, // exp is the expression in the source language naming the variable + varName) // name is the internal gdb variable name, used to get the value + { super({ client, variables, expression, threadId: container.threadId, frameIndex: container.frameIndex, - varName, - }); - // We will lazily create the variable binding to MI, so we only + varName + }); // We will lazily create the variable binding to MI, so we only // have to do it for ones the user actually wants to drill into. - this._qualifiedName = container.qualifiedName + '.' + expression; - // if name is null, then we will lazily create a gdb varref which needs + this._qualifiedName = container.qualifiedName + '.' + expression; // if name is null, then we will lazily create a gdb varref which needs // to be cleaned up. if name is defined then the varref is already // created and whoever did that is responsible for deleting it. + this._needsDeletion = varName == null; } - async getVariables(start: ?number, count: ?number): Promise> { + async getVariables(start, count) { if (this._varName == null) { await this._createVariableBinding(this._expression); } const varName = this._varName; - invariant(varName != null); - // var-list-children -no-values name from to (zero-based, from 'from and up to and including 'to') + if (!(varName != null)) { + throw new Error("Invariant violation: \"varName != null\""); + } // var-list-children -no-values name from to (zero-based, from 'from and up to and including 'to') + + const command = `var-list-children --no-values ${varName}`; const result = await this._client.sendCommand(command); if (result.error) { - throw new Error( - `Error getting variable's children (${toCommandError(result).msg})`, - ); + throw new Error(`Error getting variable's children (${(0, _MITypes().toCommandError)(result).msg})`); } - const miVariables = varListChildrenResult(result).children; - + const miVariables = (0, _MITypes().varListChildrenResult)(result).children; const resolvedStart = start == null ? 0 : start; - const resolvedEnd = - count == null ? miVariables.length - resolvedStart : start + count; - - return Promise.all( - miVariables.slice(resolvedStart, resolvedEnd).map(async _ => { - const child = _.child; - - const handle = this._variables.nestedVariableReference( - this, - child.exp, - child.name, - ); - - return this.variableFromVarRefHandle(handle, child.exp, child.type); - }), - ); + const resolvedEnd = count == null ? miVariables.length - resolvedStart : start + count; + return Promise.all(miVariables.slice(resolvedStart, resolvedEnd).map(async _ => { + const child = _.child; + + const handle = this._variables.nestedVariableReference(this, child.exp, child.name); + + return this.variableFromVarRefHandle(handle, child.exp, child.type); + })); } - get needsDeletion(): boolean { + get needsDeletion() { return this._needsDeletion; } - async _getVarName(): Promise { + async _getVarName() { if (this._varName != null) { return this._varName; } await this._createVariableBinding(this._expression); const varName = this._varName; - invariant(varName != null); + + if (!(varName != null)) { + throw new Error("Invariant violation: \"varName != null\""); + } return varName; } - get qualifiedName(): string { + get qualifiedName() { return this._qualifiedName; } + } + +exports.default = NestedVariableReference; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/RegisterElementVariableReference.js b/modules/atom-ide-debugger-native-gdb/lib/RegisterElementVariableReference.js index 4debe4e6f0..d35e331864 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/RegisterElementVariableReference.js +++ b/modules/atom-ide-debugger-native-gdb/lib/RegisterElementVariableReference.js @@ -1,3 +1,62 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MIRegisterValue() { + const data = require("./MIRegisterValue"); + + _MIRegisterValue = function () { + return data; + }; + + return data; +} + +function _RegistersVariableReference() { + const data = _interopRequireDefault(require("./RegistersVariableReference")); + + _RegistersVariableReference = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _VariableReference() { + const data = _interopRequireDefault(require("./VariableReference")); + + _VariableReference = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,65 +65,31 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {MINamedRegisterValue} from './MIRegisterValue'; -import type {SetChildResponse} from './VariableReference'; -import type {Variable} from 'vscode-debugprotocol'; -import type {VariableTypeClass} from './VariableReference'; -import type {VariablesInterface} from './VariablesInterface'; - -import invariant from 'assert'; -import MIProxy from './MIProxy'; -import {MIRegisterValue} from './MIRegisterValue'; -import RegistersVariableReference from './RegistersVariableReference'; -import {toCommandError, dataEvaluateExpressionResult} from './MITypes'; -import VariableReference from './VariableReference'; - -export default class RegisterElementVariableReference extends VariableReference { - _value: MIRegisterValue; - _name: string; - _containedVariables: Array; - _childrenByName: Map; - - constructor( - client: MIProxy, - variables: VariablesInterface, - name: string, - expression: string, - value: MIRegisterValue, - ) { - super({client, variables, expression}); +class RegisterElementVariableReference extends _VariableReference().default { + constructor(client, variables, name, expression, value) { + super({ + client, + variables, + expression + }); this._value = value; this._name = name; - this._containedVariables = this._value.containedValues().map(v => { - return RegistersVariableReference.variableFromRegisterValue( - this._variables, - v.name, - `${this._expression}${v.expressionSuffix}`, - v.value, - ); + return _RegistersVariableReference().default.variableFromRegisterValue(this._variables, v.name, `${this._expression}${v.expressionSuffix}`, v.value); }); - - this._childrenByName = new Map( - this._value.containedValues().map(v => [v.name, v]), - ); + this._childrenByName = new Map(this._value.containedValues().map(v => [v.name, v])); } - async getVariables(start: ?number, count: ?number): Promise> { + async getVariables(start, count) { const resolvedStart = start == null ? 0 : start; const resolvedCount = count == null ? await this.getChildCount() : count; - - return this._containedVariables.slice( - resolvedStart, - resolvedStart + resolvedCount, - ); + return this._containedVariables.slice(resolvedStart, resolvedStart + resolvedCount); } - async getTypeClass(value: string): Promise { + async getTypeClass(value) { if (!this._value.isContainer()) { return 'simple'; } @@ -76,51 +101,50 @@ export default class RegisterElementVariableReference extends VariableReference return 'indexed'; } - async getType(): Promise { + async getType() { if (!this._value.isContainer()) { return 'int'; } + return '[]'; } - async getValue(): Promise { + async getValue() { return this._value.toString(); } - async getChildCount(): Promise { + async getChildCount() { return this._value.length; } - async setChildValue(name: string, value: string): Promise { + async setChildValue(name, value) { const nestedValue = this._childrenByName.get(name); - invariant(nestedValue != null); + + if (!(nestedValue != null)) { + throw new Error("Invariant violation: \"nestedValue != null\""); + } if (nestedValue.value.isContainer()) { - throw new Error( - 'Cannot edit aggregate value directly, please edit individual components.', - ); + throw new Error('Cannot edit aggregate value directly, please edit individual components.'); } - const result = await this._client.sendCommand( - `data-evaluate-expression ${this._expression}${ - nestedValue.expressionSuffix - }=${value}`, - ); + const result = await this._client.sendCommand(`data-evaluate-expression ${this._expression}${nestedValue.expressionSuffix}=${value}`); + if (result.error) { - throw new Error( - `Unable to change register value ${toCommandError(result).msg}`, - ); + throw new Error(`Unable to change register value ${(0, _MITypes().toCommandError)(result).msg}`); } - const newValue = dataEvaluateExpressionResult(result).value; - + const newValue = (0, _MITypes().dataEvaluateExpressionResult)(result).value; return { value: newValue, - type: await this.getType(), + type: await this.getType() }; } - get needsDeletion(): boolean { + get needsDeletion() { return false; } + } + +exports.default = RegisterElementVariableReference; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/RegistersVariableReference.js b/modules/atom-ide-debugger-native-gdb/lib/RegistersVariableReference.js index ab3c725585..0b88f93ef7 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/RegistersVariableReference.js +++ b/modules/atom-ide-debugger-native-gdb/lib/RegistersVariableReference.js @@ -1,3 +1,52 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MIRegisterValue() { + const data = require("./MIRegisterValue"); + + _MIRegisterValue = function () { + return data; + }; + + return data; +} + +function _VariableReference() { + const data = _interopRequireDefault(require("./VariableReference")); + + _VariableReference = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,186 +55,144 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {SetChildResponse} from './VariableReference'; -import type {Variable} from 'vscode-debugprotocol'; - -import invariant from 'assert'; -import { - toCommandError, - dataEvaluateExpressionResult, - dataListRegisterNamesResult, - dataListRegisterValuesResult, -} from './MITypes'; -import MIProxy from './MIProxy'; -import {MIRegisterValue, MIRegisterValueParser} from './MIRegisterValue'; -import VariableReference from './VariableReference'; - -export default class RegistersVariableReference extends VariableReference { - _registerIndices: Array; - _registerNames: Map; - - constructor(client: MIProxy, variables: Variables) { +class RegistersVariableReference extends _VariableReference().default { + constructor(client, variables) { super({ client, variables, expression: '', typeClass: 'named', - type: 'register-file', + type: 'register-file' }); } - async getVariables(start: ?number, count: ?number): Promise> { + async getVariables(start, count) { const resolvedStart = start == null ? 0 : start; const resolvedCount = count == null ? await this.getChildCount() : count; - await this._ensureRegisterIndicesExist(); - const indices = this._registerIndices.slice( - resolvedStart, - resolvedStart + resolvedCount, - ); - const result = await this._client.sendCommand( - `data-list-register-values --skip-unavailable x ${indices.join(' ')}`, - ); + const indices = this._registerIndices.slice(resolvedStart, resolvedStart + resolvedCount); + + const result = await this._client.sendCommand(`data-list-register-values --skip-unavailable x ${indices.join(' ')}`); if (result.error) { - throw new Error( - `Could not fetch register values ${toCommandError(result).msg}`, - ); + throw new Error(`Could not fetch register values ${(0, _MITypes().toCommandError)(result).msg}`); } - return dataListRegisterValuesResult(result)['register-values'].map(_ => { + return (0, _MITypes().dataListRegisterValuesResult)(result)['register-values'].map(_ => { const name = this._registerNames.get(parseInt(_.number, 10)); - invariant(name != null); - const value = new MIRegisterValueParser(_.value).parse(); + if (!(name != null)) { + throw new Error("Invariant violation: \"name != null\""); + } - return RegistersVariableReference.variableFromRegisterValue( - this._variables, - name, - `$${name}`, // registers are denoted $reg in gdb expressions - value, - ); + const value = new (_MIRegisterValue().MIRegisterValueParser)(_.value).parse(); + return RegistersVariableReference.variableFromRegisterValue(this._variables, name, `$${name}`, // registers are denoted $reg in gdb expressions + value); }); } - static variableFromRegisterValue( - variables: Variables, - name: string, - expression: string, - value: MIRegisterValue, - ): Variable { - let variable: Variable = { + static variableFromRegisterValue(variables, name, expression, value) { + let variable = { name, value: value.toString(), type: 'int', - variablesReference: 0, + variablesReference: 0 }; if (value.isContainer()) { - const varref = variables.registerElementVariableReference( - value, - name, - expression, - ); + const varref = variables.registerElementVariableReference(value, name, expression); if (value.containerKeyIsString) { - variable = { - ...variable, + variable = Object.assign({}, variable, { type: '{}', variablesReference: varref, namedVariables: value.length, presentationHint: { - kind: 'readOnly', - }, - }; + kind: 'readOnly' + } + }); } else { - variable = { - ...variable, + variable = Object.assign({}, variable, { type: '[]', variablesReference: varref, indexedVariables: value.length, presentationHint: { - kind: 'readOnly', - }, - }; + kind: 'readOnly' + } + }); } } return variable; } - async getType(): Promise { + async getType() { return '[]'; - } - - // The value of a container variable is a summary of the value + } // The value of a container variable is a summary of the value // of its contents. - async getValue(): Promise { + + + async getValue() { return '...'; } - async getChildCount(): Promise { + async getChildCount() { await this._ensureRegisterIndicesExist(); return this._registerIndices.length; } - async _ensureRegisterIndicesExist(): Promise { + async _ensureRegisterIndicesExist() { if (this._registerIndices != null) { return; - } - - // MI indexes registers, but the indices aren't contiguous so that the + } // MI indexes registers, but the indices aren't contiguous so that the // indices can match the target CPU's numbering scheme if there is one. // This is represented in the API by empty register names for unused // slots. + + this._registerNames = new Map(); this._registerIndices = []; - const result = await this._client.sendCommand('data-list-register-names'); + if (result.error) { - throw new Error( - `Failed to fetch register names ${toCommandError(result).msg}`, - ); + throw new Error(`Failed to fetch register names ${(0, _MITypes().toCommandError)(result).msg}`); } - dataListRegisterNamesResult(result)['register-names'].forEach( - (name, index) => { - if (name !== '') { - this._registerIndices.push(index); - this._registerNames.set(index, name); - } - }, - ); + (0, _MITypes().dataListRegisterNamesResult)(result)['register-names'].forEach((name, index) => { + if (name !== '') { + this._registerIndices.push(index); + + this._registerNames.set(index, name); + } + }); } - async setChildValue(name: string, value: string): Promise { - const result = await this._client.sendCommand( - `data-evaluate-expression $${name}=${value}`, - ); + async setChildValue(name, value) { + const result = await this._client.sendCommand(`data-evaluate-expression $${name}=${value}`); + if (result.error) { - throw new Error( - `Unable to change register value ${toCommandError(result).msg}`, - ); + throw new Error(`Unable to change register value ${(0, _MITypes().toCommandError)(result).msg}`); } - const newValue = dataEvaluateExpressionResult(result).value; - + const newValue = (0, _MITypes().dataEvaluateExpressionResult)(result).value; return { value: newValue, - type: await this.getType(), + type: await this.getType() }; } - get qualifiedName(): string { + get qualifiedName() { return 'registers'; } - get needsDeletion(): boolean { + get needsDeletion() { return false; } + } + +exports.default = RegistersVariableReference; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/RunTranspiledServer.js b/modules/atom-ide-debugger-native-gdb/lib/RunTranspiledServer.js index d68ab5a165..8ae0348c3f 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/RunTranspiledServer.js +++ b/modules/atom-ide-debugger-native-gdb/lib/RunTranspiledServer.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,19 +8,20 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ /* eslint nuclide-internal/no-commonjs: 0, */ - const fs = require('fs'); + const path = require('path'); + if (fs.existsSync(path.join(__dirname, '../DEVELOPMENT'))) { // eslint-disable-next-line nuclide-internal/modules-dependencies - require('nuclide-node-transpiler'); + require("../../nuclide-node-transpiler"); } -require('./MIDebugSession'); +require("./MIDebugSession"); \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/ScopeVariableReference.js b/modules/atom-ide-debugger-native-gdb/lib/ScopeVariableReference.js index 3f427a4905..74c7d0f954 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/ScopeVariableReference.js +++ b/modules/atom-ide-debugger-native-gdb/lib/ScopeVariableReference.js @@ -1,3 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _VariableReference() { + const data = _interopRequireDefault(require("./VariableReference")); + + _VariableReference = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,31 +45,12 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {SetChildResponse} from './VariableReference'; -import type {Variable} from 'vscode-debugprotocol'; - -import invariant from 'assert'; -import MIProxy from './MIProxy'; -import { - stackListVariablesResult, - toCommandError, - varAssignResult, - varCreateResult, -} from './MITypes'; -import VariableReference from './VariableReference'; - // a ScopeVariableReference refers to a set of variables in a stack frame -export default class ScopeVariableReference extends VariableReference { - constructor( - client: MIProxy, - variables: Variables, - threadId: number, - frameIndex: number, - ) { +class ScopeVariableReference extends _VariableReference().default { + constructor(client, variables, threadId, frameIndex) { super({ client, variables, @@ -38,83 +58,69 @@ export default class ScopeVariableReference extends VariableReference { threadId, frameIndex, typeClass: 'named', - type: 'scope', + type: 'scope' }); } - async getVariables(start: ?number, count: ?number): Promise> { + async getVariables(start, count) { // By definition, a scope variable must have a stack frame. - invariant(this.threadId != null); - invariant(this.frameIndex != null); + if (!(this.threadId != null)) { + throw new Error("Invariant violation: \"this.threadId != null\""); + } - const command = `stack-list-variables --thread ${this.threadId} --frame ${ - this.frameIndex - } --no-values`; + if (!(this.frameIndex != null)) { + throw new Error("Invariant violation: \"this.frameIndex != null\""); + } + + const command = `stack-list-variables --thread ${this.threadId} --frame ${this.frameIndex} --no-values`; const result = await this._client.sendCommand(command); + if (result.error) { - throw new Error( - `Error retrieving variables for stack frame (${ - toCommandError(result).msg - })`, - ); + throw new Error(`Error retrieving variables for stack frame (${(0, _MITypes().toCommandError)(result).msg})`); } - const miVariables = stackListVariablesResult(result).variables; - + const miVariables = (0, _MITypes().stackListVariablesResult)(result).variables; const resolvedStart = start == null ? 0 : start; - const resolvedEnd = - count == null ? miVariables.length - resolvedStart : start + count; - - return Promise.all( - miVariables.slice(resolvedStart, resolvedEnd).map(async _ => { - const handle = this._variables.nestedVariableReference(this, _.name); + const resolvedEnd = count == null ? miVariables.length - resolvedStart : start + count; + return Promise.all(miVariables.slice(resolvedStart, resolvedEnd).map(async _ => { + const handle = this._variables.nestedVariableReference(this, _.name); - return this.variableFromVarRefHandle(handle, _.name, null); - }), - ); + return this.variableFromVarRefHandle(handle, _.name, null); + })); } - async setChildValue(name: string, value: string): Promise { + async setChildValue(name, value) { const varResult = await this._client.sendCommand(`var-create - * ${name}`); + if (varResult.error) { - throw new Error( - `Could not get variable ${name} to set: ${ - toCommandError(varResult).msg - }`, - ); + throw new Error(`Could not get variable ${name} to set: ${(0, _MITypes().toCommandError)(varResult).msg}`); } - const varInfo = varCreateResult(varResult); + const varInfo = (0, _MITypes().varCreateResult)(varResult); + const assignResult = await this._client.sendCommand(`var-assign ${varInfo.name} ${value}`); - const assignResult = await this._client.sendCommand( - `var-assign ${varInfo.name} ${value}`, - ); if (assignResult.error) { - throw new Error( - `Unable to set ${name} to {value}: ${toCommandError(assignResult).msg}`, - ); + throw new Error(`Unable to set ${name} to {value}: ${(0, _MITypes().toCommandError)(assignResult).msg}`); } - const assign = varAssignResult(assignResult); - + const assign = (0, _MITypes().varAssignResult)(assignResult); await this._client.sendCommand(`var-delete ${varInfo.name}`); - return { value: assign.value, type: varInfo.type, - variablesReference: 0, + variablesReference: 0 }; } - async getValue(): Promise { + async getValue() { return ''; } - get qualifiedName(): string { + get qualifiedName() { return 'scope'; } - async getChildCount(): Promise { + async getChildCount() { if (this._childCount != null) { return this._childCount; } @@ -123,4 +129,7 @@ export default class ScopeVariableReference extends VariableReference { this._childCount = variables.length; return variables.length; } + } + +exports.default = ScopeVariableReference; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/SourceBreakpoints.js b/modules/atom-ide-debugger-native-gdb/lib/SourceBreakpoints.js index 7196223e9e..b9ca3299fe 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/SourceBreakpoints.js +++ b/modules/atom-ide-debugger-native-gdb/lib/SourceBreakpoints.js @@ -1,3 +1,64 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function DebugProtocol() { + const data = _interopRequireWildcard(require("vscode-debugprotocol")); + + DebugProtocol = function () { + return data; + }; + + return data; +} + +function _Breakpoints() { + const data = _interopRequireWildcard(require("./Breakpoints")); + + _Breakpoints = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _MIRecord() { + const data = require("./MIRecord"); + + _MIRecord = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,41 +67,19 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import * as DebugProtocol from 'vscode-debugprotocol'; -import invariant from 'assert'; -import {Breakpoint} from './Breakpoints'; -import Breakpoints from './Breakpoints'; -import MIProxy from './MIProxy'; -import {MIResultRecord} from './MIRecord'; -import {breakInsertResult, toCommandError} from './MITypes'; - -type AddRemoveSets = { - addBreakpoints: Array, - removeBreakpoints: Array, -}; - -export default class SourceBreakpoints { - _client: MIProxy; - _breakpoints: Breakpoints; - +class SourceBreakpoints { // by source and line - _reverseMap: Map>; - - constructor(client: MIProxy, breakpoints: Breakpoints) { + constructor(client, breakpoints) { this._client = client; this._breakpoints = breakpoints; this._reverseMap = new Map(); - } + } // Returns a map from the requested lines to the breakpoint handles - // Returns a map from the requested lines to the breakpoint handles - async setSourceBreakpoints( - path: string, - breakpoints: Array, - ): Promise> { + + async setSourceBreakpoints(path, breakpoints) { const addRemove = this._computeAddRemoveSets(path, breakpoints); if (!this._client.isConnected()) { @@ -49,116 +88,104 @@ export default class SourceBreakpoints { await this._addRemoveBreakpointsViaProxy(path, addRemove); } - return this._allBreakpointsForPath(path).map(bkpt => - this._breakpointToProtocolBreakpoint(bkpt), - ); - } + return this._allBreakpointsForPath(path).map(bkpt => this._breakpointToProtocolBreakpoint(bkpt)); + } // Set pre-configuration breakpoints + - // Set pre-configuration breakpoints - async setCachedBreakpoints(): Promise> { + async setCachedBreakpoints() { const cachedBreakpoints = this._breakpoints.breakpointsWithNoDebuggerId(); - const results = await Promise.all( - cachedBreakpoints.map(_ => { - const source = _.source; - const line = _.line; - invariant(source != null); - invariant(line != null); + const results = await Promise.all(cachedBreakpoints.map(_ => { + const source = _.source; + const line = _.line; + + if (!(source != null)) { + throw new Error("Invariant violation: \"source != null\""); + } - return this._setBreakpoint(source, line, _.condition); - }), - ); + if (!(line != null)) { + throw new Error("Invariant violation: \"line != null\""); + } + return this._setBreakpoint(source, line, _.condition); + })); results.forEach((response, index) => { if (response.done) { - const result = breakInsertResult(response); + const result = (0, _MITypes().breakInsertResult)(response); const bkpt = result.bkpt[0]; cachedBreakpoints[index].setId(parseInt(bkpt.number, 10)); + if (bkpt.pending == null) { cachedBreakpoints[index].setVerified(); } } }); - - return cachedBreakpoints - .filter(_ => _.verified) - .map(_ => this._breakpointToProtocolBreakpoint(_)); - } - - // We are given the set of lines which should be set for a file, not + return cachedBreakpoints.filter(_ => _.verified).map(_ => this._breakpointToProtocolBreakpoint(_)); + } // We are given the set of lines which should be set for a file, not // a delta from the current set. We must compute the delta manually // to update the MI debugger. // - _computeAddRemoveSets( - path: string, - breakpoints: Array, - ): AddRemoveSets { + + + _computeAddRemoveSets(path, breakpoints) { const existingBreakpoints = this._allBreakpointsForPath(path); - const existingLines: Array = existingBreakpoints.map(_ => { + + const existingLines = existingBreakpoints.map(_ => { const line = _.line; - invariant(line != null); + + if (!(line != null)) { + throw new Error("Invariant violation: \"line != null\""); + } + return line; }); - const lines = breakpoints.map(_ => _.line); + const removeBreakpoints = existingBreakpoints.filter(_ => !lines.includes(_.line)); + const addBreakpoints = breakpoints.filter(_ => !existingLines.includes(_.line)); + return { + addBreakpoints, + removeBreakpoints + }; + } // If we're called before the proxy is set up, we need to cache the breakpoints + // until gdb is launched - const removeBreakpoints = existingBreakpoints.filter( - _ => !lines.includes(_.line), - ); - - const addBreakpoints: Array< - DebugProtocol.SourceBreakpoint, - > = breakpoints.filter(_ => !existingLines.includes(_.line)); - - return {addBreakpoints, removeBreakpoints}; - } - // If we're called before the proxy is set up, we need to cache the breakpoints - // until gdb is launched - _cacheBreakpointsInConfiguration( - path: string, - addRemove: AddRemoveSets, - ): void { + _cacheBreakpointsInConfiguration(path, addRemove) { let forSource = this._reverseMap.get(path); + if (forSource == null) { forSource = new Map(); + this._reverseMap.set(path, forSource); } for (const bpt of addRemove.removeBreakpoints) { if (bpt.line != null) { forSource.delete(bpt.line); + this._breakpoints.removeBreakpoint(bpt); } } addRemove.addBreakpoints.forEach((breakpoint, index) => { const line = breakpoint.line; + const newBreakpoint = new (_Breakpoints().Breakpoint)(null, path, line, breakpoint.condition, false); - const newBreakpoint = new Breakpoint( - null, - path, - line, - breakpoint.condition, - false, - ); + if (!(forSource != null)) { + throw new Error("Invariant violation: \"forSource != null\""); + } - invariant(forSource != null); forSource.set(line, newBreakpoint); + this._breakpoints.addBreakpoint(newBreakpoint); }); } - async _addRemoveBreakpointsViaProxy( - path: string, - addRemove: AddRemoveSets, - ): Promise { - const promises: Array> = []; + async _addRemoveBreakpointsViaProxy(path, addRemove) { + const promises = []; if (addRemove.removeBreakpoints.length !== 0) { - const removeCommand = `break-delete ${addRemove.removeBreakpoints - .map(_ => _.id) - .join(' ')}`; + const removeCommand = `break-delete ${addRemove.removeBreakpoints.map(_ => _.id).join(' ')}`; promises.push(this._client.sendCommand(removeCommand)); } @@ -170,96 +197,104 @@ export default class SourceBreakpoints { if (addRemove.removeBreakpoints.length !== 0) { const removeResult = results.shift(); - invariant(removeResult != null); + + if (!(removeResult != null)) { + throw new Error("Invariant violation: \"removeResult != null\""); + } + if (removeResult.result.error) { // this means our internal state is out of sync with the debugger - throw new Error( - `Failed to remove breakpoints which should have existed (${ - toCommandError(removeResult).msg - })`, - ); + throw new Error(`Failed to remove breakpoints which should have existed (${(0, _MITypes().toCommandError)(removeResult).msg})`); } } let forSource = this._reverseMap.get(path); + if (forSource == null) { forSource = new Map(); + this._reverseMap.set(path, forSource); } for (const bpt of addRemove.removeBreakpoints) { if (bpt.line != null) { forSource.delete(bpt.line); + this._breakpoints.removeBreakpoint(bpt); } } const failure = results.find(_ => !_.done); + if (failure != null) { - throw new Error( - `Failed adding new source breakpoints ${toCommandError(failure).msg}`, - ); + throw new Error(`Failed adding new source breakpoints ${(0, _MITypes().toCommandError)(failure).msg}`); } results.forEach((response, index) => { - const result = breakInsertResult(response); + const result = (0, _MITypes().breakInsertResult)(response); const bkpt = result.bkpt[0]; - invariant(bkpt != null); - // NB gdb will not return the line number of a pending breakpoint, so + if (!(bkpt != null)) { + throw new Error("Invariant violation: \"bkpt != null\""); + } // NB gdb will not return the line number of a pending breakpoint, so // use the one we were given + + const line = addRemove.addBreakpoints[index].line; + const breakpoint = new (_Breakpoints().Breakpoint)(parseInt(bkpt.number, 10), path, line, addRemove.addBreakpoints[index].condition, bkpt.pending == null); - const breakpoint = new Breakpoint( - parseInt(bkpt.number, 10), - path, - line, - addRemove.addBreakpoints[index].condition, - bkpt.pending == null, - ); + if (!(forSource != null)) { + throw new Error("Invariant violation: \"forSource != null\""); + } - invariant(forSource != null); forSource.set(line, breakpoint); + this._breakpoints.addBreakpoint(breakpoint); }); } - async _setBreakpoint( - source: string, - line: number, - condition: ?string, - ): Promise { - const conditionFlag = - condition == null || condition.trim() === '' - ? '' - : `-c "${condition.replace('"', '\\"')}"`; - + async _setBreakpoint(source, line, condition) { + const conditionFlag = condition == null || condition.trim() === '' ? '' : `-c "${condition.replace('"', '\\"')}"`; const cmd = `break-insert -f --source ${source} --line ${line} ${conditionFlag}`; return this._client.sendCommand(cmd); } - _allBreakpointsForPath(path: string): Array { + _allBreakpointsForPath(path) { let forSource = this._reverseMap.get(path); + forSource = forSource != null ? [...forSource] : []; return forSource.map(_ => _[1]); } - _breakpointToProtocolBreakpoint(bkpt: Breakpoint): DebugProtocol.Breakpoint { + _breakpointToProtocolBreakpoint(bkpt) { const handle = this._breakpoints.handleForBreakpoint(bkpt); - invariant(handle != null, 'Could not find source breakpoint handle'); - invariant(bkpt.line != null); + + if (!(handle != null)) { + throw new Error('Could not find source breakpoint handle'); + } + + if (!(bkpt.line != null)) { + throw new Error("Invariant violation: \"bkpt.line != null\""); + } const bptRet = { id: handle, verified: bkpt.verified, source: { - sourceReference: 0, + sourceReference: 0 }, - line: bkpt.line, + line: bkpt.line }; + if (bkpt.source != null) { - bptRet.source = {...bptRet.source, path: bkpt.source}; + bptRet.source = Object.assign({}, bptRet.source, { + path: bkpt.source + }); } + return bptRet; } + } + +exports.default = SourceBreakpoints; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/StackFrames.js b/modules/atom-ide-debugger-native-gdb/lib/StackFrames.js index 7547de501e..be33514966 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/StackFrames.js +++ b/modules/atom-ide-debugger-native-gdb/lib/StackFrames.js @@ -1,3 +1,52 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _HandleMap() { + const data = _interopRequireDefault(require("./HandleMap")); + + _HandleMap = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _vscodeDebugadapter() { + const data = require("vscode-debugadapter"); + + _vscodeDebugadapter = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,129 +55,86 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import HandleMap from './HandleMap'; -import MIProxy from './MIProxy'; -import {StackFrame} from 'vscode-debugadapter'; -import { - stackInfoDepthResult, - stackListFramesResult, - toCommandError, -} from './MITypes'; - -export type CachedStackFrame = { - threadId: number, - frameIndex: number, -}; - -type StackTraceResponseBody = { - stackFrames: Array, - totalFrames?: number, -}; - -export default class StackFrames { - _client: MIProxy; - _frames: HandleMap; - _frameIdsByThreadAndLevel: Map>; - - constructor(client: MIProxy) { +class StackFrames { + constructor(client) { this._client = client; - this._frames = new HandleMap(); + this._frames = new (_HandleMap().default)(); this._frameIdsByThreadAndLevel = new Map(); } clearCachedFrames() { this._frames.clear(); + this._frameIdsByThreadAndLevel.clear(); } - stackFrameByHandle(handle: number): ?CachedStackFrame { + stackFrameByHandle(handle) { return this._frames.getObjectByHandle(handle); } - async stackFramesForThread( - threadId: number, - startFrame: ?number, - levels: ?number, - ): Promise { - const depthResult = await this._client.sendCommand( - `stack-info-depth --thread ${threadId}`, - ); + async stackFramesForThread(threadId, startFrame, levels) { + const depthResult = await this._client.sendCommand(`stack-info-depth --thread ${threadId}`); + if (!depthResult.done) { - throw new Error( - `Protocol error retrieving stack depth (${ - toCommandError(depthResult).msg - })`, - ); + throw new Error(`Protocol error retrieving stack depth (${(0, _MITypes().toCommandError)(depthResult).msg})`); } - const depth = parseInt(stackInfoDepthResult(depthResult).depth, 10); + const depth = parseInt((0, _MITypes().stackInfoDepthResult)(depthResult).depth, 10); const lowFrame = startFrame == null ? 0 : startFrame; if (lowFrame >= depth) { return { totalFrames: depth, - stackFrames: [], + stackFrames: [] }; } - const highFrame = - (levels == null ? lowFrame + depth : lowFrame + levels) - 1; + const highFrame = (levels == null ? lowFrame + depth : lowFrame + levels) - 1; const command = `stack-list-frames --thread ${threadId} --no-frame-filters ${lowFrame} ${highFrame}`; const frameResult = await this._client.sendCommand(command); if (!frameResult.done) { - throw new Error( - `Protocol error retrieving stack frames (${ - toCommandError(frameResult).msg - })`, - ); + throw new Error(`Protocol error retrieving stack frames (${(0, _MITypes().toCommandError)(frameResult).msg})`); } - const frames = stackListFramesResult(frameResult); - + const frames = (0, _MITypes().stackListFramesResult)(frameResult); return { totalFrames: depth, stackFrames: frames.stack.map(_ => { const level = parseInt(_.frame.level, 10); return { id: this._handleForFrame(threadId, level), - name: - _.frame.func != null - ? _.frame.func - : _.frame.from != null - ? _.frame.from - : _.frame.addr, - source: - _.frame.file == null && _.frame.fullname == null - ? undefined - : { - name: _.frame.file, - path: _.frame.fullname, - }, + name: _.frame.func != null ? _.frame.func : _.frame.from != null ? _.frame.from : _.frame.addr, + source: _.frame.file == null && _.frame.fullname == null ? undefined : { + name: _.frame.file, + path: _.frame.fullname + }, line: _.frame.line == null ? 0 : parseInt(_.frame.line, 10), column: 0, - addr: _.frame.addr, + addr: _.frame.addr }; - }), + }) }; } - _handleForFrame(threadId: number, frameIndex: number): number { + _handleForFrame(threadId, frameIndex) { let mapForThread = this._frameIdsByThreadAndLevel.get(threadId); + if (mapForThread == null) { mapForThread = new Map(); + this._frameIdsByThreadAndLevel.set(threadId, mapForThread); } let frame = mapForThread.get(frameIndex); + if (frame == null) { const cachedFrame = { threadId, - frameIndex, + frameIndex }; frame = this._frames.put(cachedFrame); mapForThread.set(frameIndex, frame); @@ -136,4 +142,7 @@ export default class StackFrames { return frame; } + } + +exports.default = StackFrames; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/VariableReference.js b/modules/atom-ide-debugger-native-gdb/lib/VariableReference.js index 8d763f44aa..882e3484dc 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/VariableReference.js +++ b/modules/atom-ide-debugger-native-gdb/lib/VariableReference.js @@ -1,3 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _Logger() { + const data = require("./Logger"); + + _Logger = function () { + return data; + }; + + return data; +} + +function _MITypes() { + const data = require("./MITypes"); + + _MITypes = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,58 +45,11 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {Variable} from 'vscode-debugprotocol'; - -import {logVerbose} from './Logger'; -import invariant from 'assert'; -import { - toCommandError, - varAssignResult, - varCreateResult, - varEvaluateExpressionResult, - varInfoNumChildrenResult, - varInfoTypeResult, - varListChildrenResult, -} from './MITypes'; -import MIProxy from './MIProxy'; - -export type VariableTypeClass = 'simple' | 'named' | 'indexed'; - -type VariableReferenceConstructorArgs = { - client: MIProxy, - variables: Variables, - expression: string, - threadId?: ?number, - frameIndex?: ?number, - typeClass?: ?VariableTypeClass, - type?: ?string, - varName?: ?string, -}; - -export type SetChildResponse = { - value: string, - type?: string, - variablesReference?: number, - namedVariables?: number, - indexedVariables?: number, -}; - -export default class VariableReference { - _client: MIProxy; - _variables: Variables; - _childCount: ?number; - _threadId: ?number; - _frameIndex: ?number; - _expression: string; - _varName: ?string; - _typeClass: ?VariableTypeClass; - _type: ?string; - - constructor(args: VariableReferenceConstructorArgs) { +class VariableReference { + constructor(args) { this._client = args.client; this._variables = args.variables; this._expression = args.expression; @@ -68,17 +60,15 @@ export default class VariableReference { this._varName = args.varName; } - async getVariables(start: ?number, count: ?number): Promise> { - throw new Error( - 'Base class VariableReference.getVariables called (abstract method)', - ); - } - - // typeClass describes what type of container the variable's type is + async getVariables(start, count) { + throw new Error('Base class VariableReference.getVariables called (abstract method)'); + } // typeClass describes what type of container the variable's type is // simple variables are not containers // named variables have named members: struct, union, class // indexed variables are native arrays and pointers - async getTypeClass(value: string): Promise { + + + async getTypeClass(value) { // it would seem to make sense to infer the type class from the actual // type. but that doesn't work, because the actual type may be a typedef, // and that's what MI will return. we can't recover the underlying type @@ -88,7 +78,7 @@ export default class VariableReference { return this._typeClass; } - let type: VariableTypeClass = 'simple'; + let type = 'simple'; if (value === '') { // For C++ code, gdb inserts an extra level of hierarchy that doesn't @@ -98,15 +88,15 @@ export default class VariableReference { type = 'named'; } else { const leading = value[0]; + if (leading === '[') { type = 'indexed'; } else if (leading === '{') { type = 'named'; } else { - const children = await this.getChildCount(); - - // if the value is not formatted as a struct or array, and children + const children = await this.getChildCount(); // if the value is not formatted as a struct or array, and children // are available, then it's a pointer (which we treat as an array) + if (children > 0) { type = 'indexed'; } @@ -117,225 +107,196 @@ export default class VariableReference { return type; } - async getType(): Promise { + async getType() { if (this._type != null) { return this._type; } const varName = await this._getVarName(); const result = await this._client.sendCommand(`var-info-type ${varName}`); + if (result.error) { - throw new Error( - `Error determining variable's type (${toCommandError(result).msg})`, - ); + throw new Error(`Error determining variable's type (${(0, _MITypes().toCommandError)(result).msg})`); } - this._type = varInfoTypeResult(result).type; + this._type = (0, _MITypes().varInfoTypeResult)(result).type; return this._type; - } - - // The value of a container variable is a summary of the value + } // The value of a container variable is a summary of the value // of its contents. - async getValue(): Promise { + + + async getValue() { const varName = await this._getVarName(); - const result = await this._client.sendCommand( - `var-evaluate-expression ${varName}`, - ); + const result = await this._client.sendCommand(`var-evaluate-expression ${varName}`); if (result.error) { - throw new Error( - `Error determining variable's value (${toCommandError(result).msg})`, - ); + throw new Error(`Error determining variable's value (${(0, _MITypes().toCommandError)(result).msg})`); } - return varEvaluateExpressionResult(result).value; + return (0, _MITypes().varEvaluateExpressionResult)(result).value; } - async getChildCount(): Promise { + async getChildCount() { if (this._childCount != null) { return this._childCount; } - const varName = await this._getVarName(); - - // If we had to create the var name, we will have gotten the child count + const varName = await this._getVarName(); // If we had to create the var name, we will have gotten the child count // as a side effect + if (this._childCount != null) { return this._childCount; - } + } // otherwise, we have to ask + + + const result = await this._client.sendCommand(`var-info-num-children ${varName}`); - // otherwise, we have to ask - const result = await this._client.sendCommand( - `var-info-num-children ${varName}`, - ); if (result.error) { - throw new Error( - `Error determining the number of children (${ - toCommandError(result).msg - })`, - ); + throw new Error(`Error determining the number of children (${(0, _MITypes().toCommandError)(result).msg})`); } - const childCountStr = varInfoNumChildrenResult(result).numchild; - invariant(childCountStr != null); + const childCountStr = (0, _MITypes().varInfoNumChildrenResult)(result).numchild; + + if (!(childCountStr != null)) { + throw new Error("Invariant violation: \"childCountStr != null\""); + } const childCount = parseInt(childCountStr, 10); this._childCount = childCount; - return childCount; } - async setChildValue(name: string, value: string): Promise { + async setChildValue(name, value) { const varname = await this._getVarName(); - const childrenResult = await this._client.sendCommand( - `var-list-children ${varname}`, - ); + const childrenResult = await this._client.sendCommand(`var-list-children ${varname}`); + if (childrenResult.error) { - throw new Error( - `Error getting the children of ${varname} ${ - toCommandError(childrenResult).msg - }`, - ); + throw new Error(`Error getting the children of ${varname} ${(0, _MITypes().toCommandError)(childrenResult).msg}`); } - const children = varListChildrenResult(childrenResult); + const children = (0, _MITypes().varListChildrenResult)(childrenResult); const child = children.children.find(_ => _.child.exp === name); + if (child == null) { throw new Error(`Cannot find variable ${name} to modify`); } - const assignResult = await this._client.sendCommand( - `var-assign ${child.child.name} ${value}`, - ); + const assignResult = await this._client.sendCommand(`var-assign ${child.child.name} ${value}`); + if (assignResult.error) { - throw new Error( - `Unable to set ${name} to {$value}: ${ - toCommandError(assignResult).msg - }`, - ); + throw new Error(`Unable to set ${name} to {$value}: ${(0, _MITypes().toCommandError)(assignResult).msg}`); } - const assign = varAssignResult(assignResult); - + const assign = (0, _MITypes().varAssignResult)(assignResult); return { value: assign.value, type: child.child.type, - variablesReference: 0, + variablesReference: 0 }; } - async deleteResources(): Promise { + async deleteResources() { if (this.needsDeletion && this._varName != null) { - const result = await this._client.sendCommand( - `var-delete ${this._varName}`, - ); + const result = await this._client.sendCommand(`var-delete ${this._varName}`); + if (result.error) { // don't throw here, because we can still continue safely, but log the error. - logVerbose(`Error deleting variable ${toCommandError(result).msg}`); + (0, _Logger().logVerbose)(`Error deleting variable ${(0, _MITypes().toCommandError)(result).msg}`); } } } - get qualifiedName(): string { - throw new Error( - 'Base class VariableReference.getQualifiedName called (abstract method)', - ); + get qualifiedName() { + throw new Error('Base class VariableReference.getQualifiedName called (abstract method)'); } - get needsDeletion(): boolean { + get needsDeletion() { return false; } - get threadId(): ?number { + get threadId() { return this._threadId; } - get frameIndex(): ?number { + get frameIndex() { return this._frameIndex; } - async variableFromVarRefHandle( - handle: number, - name: string, - type: ?string, - ): Promise { + async variableFromVarRefHandle(handle, name, type) { const varref = this._variables.getVariableReference(handle); - invariant(varref != null); + + if (!(varref != null)) { + throw new Error("Invariant violation: \"varref != null\""); + } const value = await varref.getValue(); const typeClass = await varref.getTypeClass(value); - const resolvedType = type == null ? await varref.getType() : type; - - logVerbose( - `name ${name} type ${resolvedType} value ${value} typeClass ${typeClass}`, - ); - - let variable: Variable = { + (0, _Logger().logVerbose)(`name ${name} type ${resolvedType} value ${value} typeClass ${typeClass}`); + let variable = { name, value, type: resolvedType, - variablesReference: 0, + variablesReference: 0 }; if (typeClass !== 'simple') { const childCount = await varref.getChildCount(); if (typeClass === 'indexed') { - variable = { - ...variable, + variable = Object.assign({}, variable, { indexedVariables: childCount, - variablesReference: handle, - }; + variablesReference: handle + }); } else if (typeClass === 'named') { - variable = { - ...variable, + variable = Object.assign({}, variable, { namedVariables: childCount, - variablesReference: handle, - }; + variablesReference: handle + }); } } return variable; } - async _createVariableBinding(expression: string): Promise { + async _createVariableBinding(expression) { // '-' means to let gdb create a unique name for the binding // '*' means use the current frame (which we specify via --thread/--frame) - // '@' means a floating variable which should be evaluatable anywhere + let command; - let command: string; if (this.threadId != null && this.frameIndex != null) { - command = `var-create --thread ${this.threadId} --frame ${ - this.frameIndex - } - * ${expression}`; + command = `var-create --thread ${this.threadId} --frame ${this.frameIndex} - * ${expression}`; } else { command = `var-create - @ ${expression}`; } const result = await this._client.sendCommand(command); + if (result.error) { - throw new Error( - `Error creating variable binding (${toCommandError(result).msg})`, - ); + throw new Error(`Error creating variable binding (${(0, _MITypes().toCommandError)(result).msg})`); } - const varResult = varCreateResult(result); + const varResult = (0, _MITypes().varCreateResult)(result); this._varName = varResult.name; this._childCount = parseInt(varResult.numchild, 10); - return varResult.name; } - async _getVarName(): Promise { + async _getVarName() { if (this._varName != null) { return this._varName; } await this._createVariableBinding(this._expression); const varName = this._varName; - invariant(varName != null); + + if (!(varName != null)) { + throw new Error("Invariant violation: \"varName != null\""); + } return varName; } + } + +exports.default = VariableReference; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/Variables.js b/modules/atom-ide-debugger-native-gdb/lib/Variables.js index f52da1bc07..50299a008a 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/Variables.js +++ b/modules/atom-ide-debugger-native-gdb/lib/Variables.js @@ -1,3 +1,112 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _HandleMap() { + const data = _interopRequireDefault(require("./HandleMap")); + + _HandleMap = function () { + return data; + }; + + return data; +} + +function _MIProxy() { + const data = _interopRequireDefault(require("./MIProxy")); + + _MIProxy = function () { + return data; + }; + + return data; +} + +function _ExpressionVariableReference() { + const data = _interopRequireDefault(require("./ExpressionVariableReference")); + + _ExpressionVariableReference = function () { + return data; + }; + + return data; +} + +function _MIRegisterValue() { + const data = require("./MIRegisterValue"); + + _MIRegisterValue = function () { + return data; + }; + + return data; +} + +function _NestedVariableReference() { + const data = _interopRequireDefault(require("./NestedVariableReference")); + + _NestedVariableReference = function () { + return data; + }; + + return data; +} + +function _RegisterElementVariableReference() { + const data = _interopRequireDefault(require("./RegisterElementVariableReference")); + + _RegisterElementVariableReference = function () { + return data; + }; + + return data; +} + +function _RegistersVariableReference() { + const data = _interopRequireDefault(require("./RegistersVariableReference")); + + _RegistersVariableReference = function () { + return data; + }; + + return data; +} + +function _ScopeVariableReference() { + const data = _interopRequireDefault(require("./ScopeVariableReference")); + + _ScopeVariableReference = function () { + return data; + }; + + return data; +} + +function _StackFrames() { + const data = _interopRequireDefault(require("./StackFrames")); + + _StackFrames = function () { + return data; + }; + + return data; +} + +function _VariableReference() { + const data = _interopRequireDefault(require("./VariableReference")); + + _VariableReference = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,79 +115,58 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {Variable} from 'vscode-debugprotocol'; -import type {VariablesInterface} from './VariablesInterface'; - -import HandleMap from './HandleMap'; -import MIProxy from './MIProxy'; -import ExpressionVariableReference from './ExpressionVariableReference'; -import {MIRegisterValue} from './MIRegisterValue'; -import NestedVariableReference from './NestedVariableReference'; -import RegisterElementVariableReference from './RegisterElementVariableReference'; -import RegistersVariableReference from './RegistersVariableReference'; -import ScopeVariableReference from './ScopeVariableReference'; -import StackFrames from './StackFrames'; -import VariableReference from './VariableReference'; - -export default class Variables implements VariablesInterface { - _client: MIProxy; - _frames: StackFrames; - _variables: HandleMap; - _scopeIndex: Map>; // by thread, then frame index - _nestedReferenceIndex: Map>>; // by thread, frame index, varname - _registerElementReferenceIndex: Map; // by register expression - _varsNeedingDeletion: Set; - _registersVariableReference: ?number; - - constructor(client: MIProxy, frames: StackFrames) { +class Variables { + // by thread, then frame index + // by thread, frame index, varname + // by register expression + constructor(client, frames) { this._client = client; this._frames = frames; - this._variables = new HandleMap(); + this._variables = new (_HandleMap().default)(); this._scopeIndex = new Map(); this._nestedReferenceIndex = new Map(); this._registerElementReferenceIndex = new Map(); this._varsNeedingDeletion = new Set(); } - async clearCachedVariables(): Promise { - await Promise.all( - [...this._varsNeedingDeletion].map(async _ => _.deleteResources()), - ); + async clearCachedVariables() { + await Promise.all([...this._varsNeedingDeletion].map(async _ => _.deleteResources())); this._varsNeedingDeletion.clear(); + this._variables.clear(); + this._scopeIndex.clear(); + this._nestedReferenceIndex.clear(); + this._registerElementReferenceIndex.clear(); + this._registersVariableReference = null; } - variableReferenceForStackFrame(frameId: number): number { + variableReferenceForStackFrame(frameId) { const frame = this._frames.stackFrameByHandle(frameId); + if (frame == null) { - throw new Error( - `Attempt to find or create varref for unknown stack frame ${frameId}`, - ); + throw new Error(`Attempt to find or create varref for unknown stack frame ${frameId}`); } let threadMap = this._scopeIndex.get(frame.threadId); + if (threadMap == null) { threadMap = new Map(); + this._scopeIndex.set(frame.threadId, threadMap); } let varref = threadMap.get(frame.frameIndex); + if (varref == null) { - const scopeVarRef = new ScopeVariableReference( - this._client, - this, - frame.threadId, - frame.frameIndex, - ); + const scopeVarRef = new (_ScopeVariableReference().default)(this._client, this, frame.threadId, frame.frameIndex); varref = this._variables.put(scopeVarRef); threadMap.set(frame.frameIndex, varref); } @@ -86,58 +174,41 @@ export default class Variables implements VariablesInterface { return varref; } - registersVariableReference(): ?number { + registersVariableReference() { if (this._registersVariableReference != null) { return this._registersVariableReference; } - const varref = this._variables.put( - new RegistersVariableReference(this._client, this), - ); + const varref = this._variables.put(new (_RegistersVariableReference().default)(this._client, this)); this._registersVariableReference = varref; return varref; } - registerElementVariableReference( - value: MIRegisterValue, - name: string, - expression: string, - ): number { + registerElementVariableReference(value, name, expression) { let varref = this._registerElementReferenceIndex.get(expression); if (varref == null) { - varref = this._variables.put( - new RegisterElementVariableReference( - this._client, - this, - name, - expression, - value, - ), - ); + varref = this._variables.put(new (_RegisterElementVariableReference().default)(this._client, this, name, expression, value)); } return varref; } - nestedVariableReference( - container: VariableReference, - exp: string, - name: ?string, - ): number { - const resolvedThreadId = - container.threadId == null ? -1 : container.threadId; - const resolvedFrameIndex = - container.frameIndex == null ? -1 : container.frameIndex; + nestedVariableReference(container, exp, name) { + const resolvedThreadId = container.threadId == null ? -1 : container.threadId; + const resolvedFrameIndex = container.frameIndex == null ? -1 : container.frameIndex; let threadMap = this._nestedReferenceIndex.get(resolvedThreadId); + if (threadMap == null) { threadMap = new Map(); + this._nestedReferenceIndex.set(resolvedThreadId, threadMap); } let frameMap = threadMap.get(resolvedFrameIndex); + if (frameMap == null) { frameMap = new Map(); threadMap.set(resolvedFrameIndex, frameMap); @@ -145,43 +216,36 @@ export default class Variables implements VariablesInterface { const key = `${container.qualifiedName}.${exp}`; let handle = frameMap.get(key); + if (handle != null) { return handle; } - const varref = new NestedVariableReference( - this._client, - this, - container, - exp, - name, - ); + const varref = new (_NestedVariableReference().default)(this._client, this, container, exp, name); if (varref.needsDeletion) { this._varsNeedingDeletion.add(varref); } handle = this._variables.put(varref); - frameMap.set(key, handle); return handle; } - expressionVariableReference( - threadId: ?number, - frameIndex: ?number, - expression: string, - ): number { + expressionVariableReference(threadId, frameIndex, expression) { const resolvedThreadId = threadId == null ? -1 : threadId; const resolvedFrameIndex = frameIndex == null ? -1 : frameIndex; let threadMap = this._nestedReferenceIndex.get(resolvedThreadId); + if (threadMap == null) { threadMap = new Map(); + this._nestedReferenceIndex.set(resolvedThreadId, threadMap); } let frameMap = threadMap.get(resolvedFrameIndex); + if (frameMap == null) { frameMap = new Map(); threadMap.set(resolvedFrameIndex, frameMap); @@ -189,42 +253,36 @@ export default class Variables implements VariablesInterface { const key = `eval.${expression}`; let handle = frameMap.get(key); + if (handle != null) { return handle; } - const varref = new ExpressionVariableReference( - this._client, - this, - threadId, - frameIndex, - expression, - ); + const varref = new (_ExpressionVariableReference().default)(this._client, this, threadId, frameIndex, expression); if (varref.needsDeletion) { this._varsNeedingDeletion.add(varref); } handle = this._variables.put(varref); - frameMap.set(key, handle); return handle; } - getVariableReference(handle: number): ?VariableReference { + getVariableReference(handle) { return this._variables.getObjectByHandle(handle); } - async getVariables( - varrefHandle: number, - start: ?number, - count: ?number, - ): Promise> { + async getVariables(varrefHandle, start, count) { const varref = this._variables.getObjectByHandle(varrefHandle); + if (varref == null) { throw new Error(`Attempt to access invalid varref ${varrefHandle}`); } return varref.getVariables(start, count); } + } + +exports.default = Variables; \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/lib/VariablesInterface.js b/modules/atom-ide-debugger-native-gdb/lib/VariablesInterface.js index 9c260baad1..c7801e5f0c 100644 --- a/modules/atom-ide-debugger-native-gdb/lib/VariablesInterface.js +++ b/modules/atom-ide-debugger-native-gdb/lib/VariablesInterface.js @@ -1,43 +1,23 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ +"use strict"; -import type {Variable} from 'vscode-debugprotocol'; +function _MIRegisterValue() { + const data = require("./MIRegisterValue"); -import {MIRegisterValue} from './MIRegisterValue'; -import VariableReference from './VariableReference'; + _MIRegisterValue = function () { + return data; + }; -export interface VariablesInterface { - clearCachedVariables(): Promise; - variableReferenceForStackFrame(frameId: number): number; - registersVariableReference(): ?number; - registerElementVariableReference( - value: MIRegisterValue, - name: string, - expression: string, - ): number; - nestedVariableReference( - container: VariableReference, - exp: string, - name: ?string, - ): number; - expressionVariableReference( - threadId: ?number, - frameIndex: ?number, - expression: string, - ): number; - getVariableReference(handle: number): ?VariableReference; - getVariables( - varrefHandle: number, - start: ?number, - count: ?number, - ): Promise>; + return data; } + +function _VariableReference() { + const data = _interopRequireDefault(require("./VariableReference")); + + _VariableReference = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/main.js b/modules/atom-ide-debugger-native-gdb/main.js index c0fa42e7ab..db3debd264 100644 --- a/modules/atom-ide-debugger-native-gdb/main.js +++ b/modules/atom-ide-debugger-native-gdb/main.js @@ -1,3 +1,57 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +function _autogenUtils() { + const data = require("../nuclide-debugger-common/autogen-utils"); + + _autogenUtils = function () { + return data; + }; + + return data; +} + +function _AutoGenLaunchAttachProvider() { + const data = require("../nuclide-debugger-common/AutoGenLaunchAttachProvider"); + + _AutoGenLaunchAttachProvider = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,40 +60,26 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {NuclideDebuggerProvider} from 'nuclide-debugger-common/types'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import {VsAdapterNames, VsAdapterTypes} from 'nuclide-debugger-common'; -import {getNativeAutoGenConfig} from 'nuclide-debugger-common/autogen-utils'; -import {AutoGenLaunchAttachProvider} from 'nuclide-debugger-common/AutoGenLaunchAttachProvider'; -import nuclideUri from 'nuclide-commons/nuclideUri'; - class Activation { constructor() {} + dispose() {} - createDebuggerProvider(): NuclideDebuggerProvider { + createDebuggerProvider() { return { - type: VsAdapterTypes.NATIVE_GDB, + type: _nuclideDebuggerCommon().VsAdapterTypes.NATIVE_GDB, getLaunchAttachProvider: connection => { - return new AutoGenLaunchAttachProvider( - VsAdapterNames.NATIVE_GDB, - connection, - getNativeAutoGenConfig(VsAdapterTypes.NATIVE_GDB), - async () => { - // GDB not available locally on Win32. - return Promise.resolve( - nuclideUri.isRemote(connection) || process.platform !== 'win32', - ); - }, - ); - }, + return new (_AutoGenLaunchAttachProvider().AutoGenLaunchAttachProvider)(_nuclideDebuggerCommon().VsAdapterNames.NATIVE_GDB, connection, (0, _autogenUtils().getNativeAutoGenConfig)(_nuclideDebuggerCommon().VsAdapterTypes.NATIVE_GDB), async () => { + // GDB not available locally on Win32. + return Promise.resolve(_nuclideUri().default.isRemote(connection) || process.platform !== 'win32'); + }); + } }; } + } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/spec/BreakpointsSpec.js b/modules/atom-ide-debugger-native-gdb/spec/BreakpointsSpec.js deleted file mode 100644 index 8b6477f9f5..0000000000 --- a/modules/atom-ide-debugger-native-gdb/spec/BreakpointsSpec.js +++ /dev/null @@ -1,299 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - * @format - */ - -import Breakpoints from '../lib/Breakpoints'; -import SourceBreakpoints from '../lib/SourceBreakpoints'; -import MIProxy from '../lib/MIProxy'; -import {MIResultRecord} from '../lib/MIRecord'; - -type Command = { - operation: 'insert' | 'delete' | 'invalid', - invalid: string, - ids: Array, - path: string, - line: number, -}; - -// The mock class emulates the MI behavior of break-insert and break-delete, -// including a mapping of ids on the debugger side for each breakpoint. -class MIProxyMock extends MIProxy { - _sentCommands: Array; - _nextId: number; - _idsByLine: Map; - - constructor() { - super(); - this._sentCommands = []; - this._nextId = 1; - this._idsByLine = new Map(); - } - - isConnected() { - return true; - } - - async sendCommand(command: string): Promise { - let parsedCommand = { - operation: 'invalid', - invalid: command, - ids: [], - path: '', - line: -1, - }; - - let result: MIResultRecord = new MIResultRecord(null, {}, 'error'); - - const match = command.match(/^([^ ]+) *(.*)$/); - - if (match != null) { - const [, op, args] = match; - - if (op === 'break-delete') { - const ids = args - .split(/ +/) - .filter(_ => _.length !== 0) - .map(_ => parseInt(_, 10)); - - this._idsByLine = new Map( - [...this._idsByLine].filter(_ => !ids.includes(_[1])), - ); - - parsedCommand = { - ...parsedCommand, - operation: 'delete', - ids, - }; - - result = new MIResultRecord(null, {}, 'done'); - } else if (op === 'break-insert') { - const insertArgs = args.match(/^-f --source (.*) --line ([0-9]+)\s*$/); - if (insertArgs != null) { - const [, path, lineStr] = insertArgs; - const line = parseInt(lineStr, 10); - parsedCommand = { - ...parsedCommand, - operation: 'insert', - path, - line, - }; - - const id = this._nextId++; - this._idsByLine.set(line, id); - - result = new MIResultRecord( - null, - { - bkpt: [ - { - number: `${id}`, - type: 'breakpoint', - disp: 'keep', - enabled: 'y', - addr: '0x0000000100000eff', - func: 'main', - file: path, - fullname: path, - line: `${line}`, - 'thread-groups': ['i1'], - times: '0', - 'original-location': `${path}:${line}`, - }, - ], - }, - 'done', - ); - } - } - } - - this.sentCommands.push(parsedCommand); - - return result; - } - - clearCommands(): void { - this._sentCommands = []; - } - - idForLine(line: number): ?number { - return this._idsByLine.get(line); - } - - get sentCommands(): Array { - return this._sentCommands; - } -} - -describe('Breakpoints', () => { - let proxy: MIProxyMock; - let breakpoints: SourceBreakpoints; - - beforeEach(() => { - proxy = new MIProxyMock(); - breakpoints = new SourceBreakpoints(proxy, new Breakpoints()); - }); - - it('should set a breakpoint', done => { - breakpoints.setSourceBreakpoints('foo.c', [{line: 42}]).then(bkptsOut => { - const invalid = proxy.sentCommands.filter(_ => _.operation === 'invalid'); - expect(invalid.length).toEqual( - 0, - `Should not have any invalid commands (${JSON.stringify(invalid)})`, - ); - - const deletes = proxy.sentCommands.filter(_ => _.operation === 'delete'); - expect(deletes.length).toEqual( - 0, - `Should not have any breakpoint delete commands (${JSON.stringify( - deletes, - )})`, - ); - - const inserts = proxy.sentCommands.filter(_ => _.operation === 'insert'); - expect(inserts.length).toEqual( - 1, - `Should have exactly one breakpoint insert command (${JSON.stringify( - inserts, - )})`, - ); - - const insert = inserts[0]; - expect(insert).toBeDefined(); - - expect(insert.path).toEqual('foo.c'); - expect(insert.line).toEqual(42); - - expect(bkptsOut.length).toEqual(1, 'Should return one breakpoint'); - - expect(bkptsOut[0].line).toEqual( - 42, - 'The returned breakpoint map should have our line in it', - ); - - done(); - }); - }); - - it('should send multiple inserts for multiple breakpoints', done => { - const lines = [4, 8, 15, 16, 23, 42]; - const breakpointsIn = lines.map(_ => { - return {line: _}; - }); - breakpoints - .setSourceBreakpoints('island.c', breakpointsIn) - .then(bkptsOut => { - const inserts = proxy.sentCommands.filter( - _ => _.operation === 'insert', - ); - expect(inserts.length).toEqual( - lines.length, - `Should have exactly ${ - lines.length - } breakpoint insert commands (${JSON.stringify(inserts)})`, - ); - - // we don't impose that the commands are done in any sort of order - inserts.sort((left, right) => left.line - right.line); - - for (let i = 0; i < lines.length; i++) { - expect(inserts[i]).toBeDefined( - 'There should be one insert command per line', - ); - expect(inserts[i].path).toEqual( - 'island.c', - 'The insert command should have the proper file', - ); - expect(inserts[i].line).toEqual( - lines[i], - 'The insert command should have the proper line', - ); - } - - expect(bkptsOut.length).toEqual( - lines.length, - 'The returned handle map should have all of the given lines', - ); - - for (const line of lines) { - const bkpt = bkptsOut.find(_ => _.line === line); - - expect(bkpt).toBeDefined( - 'Each given line should be in the returned array', - ); - } - - done(); - }); - }); - - it('should send one delete command for multiple breakpoints', done => { - const lines = [4, 8, 15, 16, 23, 42]; - const breakpointsIn = lines.map(_ => { - return {line: _}; - }); - breakpoints - .setSourceBreakpoints('island.c', breakpointsIn) - .then(bkptsOut => { - proxy.clearCommands(); - - for (const line of lines) { - const bkpt = bkptsOut.find(_ => _.line === line); - expect(bkpt).toBeDefined( - 'Each given line should be in the handle map', - ); - } - - const linesToRemove = [8, 42]; - const newLines = lines.filter(_ => !linesToRemove.includes(_)); - const idsToRemove = linesToRemove.map(_ => proxy.idForLine(_)); - - const newBreakpointsIn = newLines.map(_ => { - return {line: _}; - }); - breakpoints - .setSourceBreakpoints('island.c', newBreakpointsIn) - .then(newMap => { - expect(proxy.sentCommands.length).toEqual( - 1, - 'All deletions should be done by a single command', - ); - const command = proxy.sentCommands[0]; - expect(command).toBeDefined(); - expect(command.ids.length).toEqual( - lines.length - newLines.length, - 'The delete command should cover all removed lines', - ); - - for (const id of idsToRemove) { - expect(id).toBeDefined(); - expect(command.ids.includes(id)).toBeTruthy( - 'The gdb id of each removed breakpoint should be on the delete command', - ); - } - - expect(newMap.length).toEqual( - newLines.length, - 'The returned handle map should contain all remaining lines', - ); - - for (const line of newLines) { - const bkpt = newMap.find(_ => _.line === line); - expect(bkpt).toBeDefined( - 'All remaining lines should be returned', - ); - } - - done(); - }); - }); - }); -}); diff --git a/modules/atom-ide-debugger-native-gdb/spec/MILineParserSpec.js b/modules/atom-ide-debugger-native-gdb/spec/MILineParserSpec.js deleted file mode 100644 index 1cb280448d..0000000000 --- a/modules/atom-ide-debugger-native-gdb/spec/MILineParserSpec.js +++ /dev/null @@ -1,329 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import invariant from 'assert'; -import MILineParser from '../lib/MILineParser'; -import { - MIAsyncRecord, - MIRecord, - MIResultRecord, - MIStreamRecord, -} from '../lib/MIRecord'; - -describe('MILineParser', () => { - let parser; - - beforeEach(() => { - parser = new MILineParser(); - }); - - describe('when given invalid input', () => { - it('should throw an exception on invalid leading character', () => { - const corruptEvent = '!'; - let thrown = false; - - try { - parser.parseMILine(corruptEvent); - } catch (error) { - expect(error.message).toEqual("Line is not an MI record at: '!'"); - thrown = true; - } - expect(thrown).toBe(true); - }); - - it('should throw an exception on a badly formatted token', () => { - const corruptEvent = '3.14159~"a float is not a valid token"'; - let thrown = false; - - try { - parser.parseMILine(corruptEvent); - } catch (error) { - expect(error.message).toEqual( - 'Line is not an MI record at: \'3.14159~"a float is not a valid token"\'', - ); - thrown = true; - } - expect(thrown).toBe(true); - }); - }); - - describe('when given the debugger prompt', () => { - it('should return an empty record', () => { - const event = '(gdb) '; - const record = parser.parseMILine(event); - - expect(record.constructor).toBe(MIRecord.prototype.constructor); - }); - }); - - describe('when given stream output events', () => { - it('should parse console output properly', () => { - const consoleEvent = '~"some console text"'; - const record = parser.parseMILine(consoleEvent); - - expect(record instanceof MIStreamRecord).toBe(true); - invariant(record instanceof MIStreamRecord); - - expect(record.streamTarget).toEqual('console'); - expect(record.text).toEqual('some console text'); - }); - - it('should parse target output properly', () => { - const consoleEvent = '@"some target text"'; - const record = parser.parseMILine(consoleEvent); - - expect(record instanceof MIStreamRecord).toBe(true); - invariant(record instanceof MIStreamRecord); - - expect(record.streamTarget).toEqual('target'); - expect(record.text).toEqual('some target text'); - }); - - it('should parse log output properly', () => { - const consoleEvent = '&"some log text"'; - const record = parser.parseMILine(consoleEvent); - - expect(record instanceof MIStreamRecord).toBe(true); - invariant(record instanceof MIStreamRecord); - - expect(record.streamTarget).toEqual('log'); - expect(record.text).toEqual('some log text'); - }); - - it('should parse escaped characters in strings properly', () => { - const consoleEvent = '~"this string has \\"bel\\\'s\\" on \\b\\b\\b"'; - const record = parser.parseMILine(consoleEvent); - - expect(record instanceof MIStreamRecord).toBe(true); - invariant(record instanceof MIStreamRecord); - - expect(record.streamTarget).toEqual('console'); - expect(record.text).toEqual('this string has "bel\'s" on \b\b\b'); - }); - - it('should throw an exception on an unterminated string', () => { - const corruptEvent = '~"this string is not terminated'; - let thrown = false; - - try { - parser.parseMILine(corruptEvent); - } catch (error) { - expect(error.message).toEqual( - "End quote missing on string at: 'this string is not terminated'", - ); - thrown = true; - } - - expect(thrown).toBe(true); - }); - - it('should throw an exception if a stream event starts with a token', () => { - const corruptEvent = '4~"this string has a token."'; - let thrown = false; - - try { - parser.parseMILine(corruptEvent); - } catch (error) { - expect(error.message).toEqual( - 'Token is not expected on stream record: \'4~"this string has a token."\'', - ); - thrown = true; - } - - expect(thrown).toBe(true); - }); - }); - - describe('when given result output', () => { - it('should parse empty output properly', () => { - const output = '^done'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toBe(null); - expect(record.resultClass).toEqual('done'); - expect(record.result).toEqual({}); - } - }); - - it('should parse simple result output properly', () => { - const output = '42^done,one="1",two="2"'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toEqual(42); - expect(record.resultClass).toEqual('done'); - expect(record.result).toEqual({one: '1', two: '2'}); - } - }); - - it('should parse an empty tuple in result output properly', () => { - const output = '42^error,one={}'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toEqual(42); - expect(record.resultClass).toEqual('error'); - expect(record.result).toEqual({one: {}}); - } - }); - - it('should parse a tuple in result output properly', () => { - const output = '42^running,one={two="2",three="3"}'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toEqual(42); - expect(record.resultClass).toEqual('running'); - expect(record.result).toEqual({one: {two: '2', three: '3'}}); - } - }); - - it('should parse an empty list in result output properly', () => { - const output = '42^connected,one=[]'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toEqual(42); - expect(record.resultClass).toEqual('connected'); - expect(record.result).toEqual({one: []}); - } - }); - - it('should parse a value list in result output properly', () => { - const output = '42^exit,one=["2","3"]'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toEqual(42); - expect(record.resultClass).toEqual('exit'); - expect(record.result).toEqual({one: ['2', '3']}); - } - }); - - it('should parse a result list in result output properly', () => { - const output = '42^done,one=[two="2",three="3"]'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toEqual(42); - expect(record.resultClass).toEqual('done'); - expect(record.result).toEqual({one: [{two: '2'}, {three: '3'}]}); - } - }); - - it('should parse a compex result list in result output properly', () => { - const output = '42^done,one={two="2",inner={four="4",five=[]},three="3"}'; - const record = parser.parseMILine(output); - - expect(record instanceof MIResultRecord).toBe(true); - - if (record instanceof MIResultRecord) { - expect(record.token).toEqual(42); - expect(record.resultClass).toEqual('done'); - expect(record.result).toEqual({ - one: { - two: '2', - inner: {four: '4', five: []}, - three: '3', - }, - }); - } - }); - - it('should throw an exception on an invalid result class', () => { - const output = '42^invalid'; - - let thrown = false; - try { - parser.parseMILine(output); - } catch (error) { - expect(error.message).toEqual("Result class expected at 'invalid'"); - thrown = true; - } - - expect(thrown).toBe(true); - }); - }); - - describe('when given async output', () => { - it('should parse empty async exec output properly', () => { - const asyncOutput = '*stopped'; - const record = parser.parseMILine(asyncOutput); - - expect(record instanceof MIAsyncRecord).toBe(true); - - if (record instanceof MIAsyncRecord) { - expect(record.token).toBe(null); - expect(record.recordType).toEqual('async-exec'); - expect(record.asyncClass).toEqual('stopped'); - expect(record.result).toEqual({}); - } - }); - - it('should parse empty async status output properly', () => { - const asyncOutput = '1+stopped'; - const record = parser.parseMILine(asyncOutput); - - expect(record instanceof MIAsyncRecord).toBe(true); - - if (record instanceof MIAsyncRecord) { - expect(record.token).toBe(1); - expect(record.recordType).toEqual('async-status'); - expect(record.asyncClass).toEqual('stopped'); - expect(record.result).toEqual({}); - } - }); - - it('should parse empty async notify output properly', () => { - const asyncOutput = '2=stopped'; - const record = parser.parseMILine(asyncOutput); - - expect(record instanceof MIAsyncRecord).toBe(true); - - if (record instanceof MIAsyncRecord) { - expect(record.token).toBe(2); - expect(record.recordType).toEqual('async-notify'); - expect(record.asyncClass).toEqual('stopped'); - expect(record.result).toEqual({}); - } - }); - - it('should parse simple async notify output', () => { - const asyncOutput = '2=stopped,one={two="three"}'; - const record = parser.parseMILine(asyncOutput); - - expect(record instanceof MIAsyncRecord).toBe(true); - - if (record instanceof MIAsyncRecord) { - expect(record.token).toBe(2); - expect(record.recordType).toEqual('async-notify'); - expect(record.asyncClass).toEqual('stopped'); - expect(record.result).toEqual({one: {two: 'three'}}); - } - }); - }); -}); diff --git a/modules/atom-ide-debugger-native-gdb/spec/MIProxySpec.js b/modules/atom-ide-debugger-native-gdb/spec/MIProxySpec.js deleted file mode 100644 index 3ca7e09867..0000000000 --- a/modules/atom-ide-debugger-native-gdb/spec/MIProxySpec.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - * @format - */ - -import MIProxy from '../lib/MIProxy'; -import nuclideUri from 'nuclide-commons/nuclideUri'; - -describe('MIProxy', () => { - let proxy; - - beforeEach(() => { - proxy = new MIProxy(); - proxy.start('node', [ - nuclideUri.join(__dirname, '../test-support/RunMIMockServer.js'), - ]); - }); - - it('should talk to the MI server', done => { - proxy.sendCommand('foo').then(response => { - expect(response.resultClass).toEqual('error'); - done(); - }); - }); - - it('should send back results', done => { - proxy.sendCommand('list-features').then(response => { - expect(response.resultClass).toEqual('done'); - expect(response.result).toEqual({features: ['argle', 'bargle', 'blab']}); - done(); - }); - }); -}); diff --git a/modules/atom-ide-debugger-native-gdb/spec/MIRegisterValueSpec.js b/modules/atom-ide-debugger-native-gdb/spec/MIRegisterValueSpec.js deleted file mode 100644 index ec6cbb935f..0000000000 --- a/modules/atom-ide-debugger-native-gdb/spec/MIRegisterValueSpec.js +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import invariant from 'assert'; - -import { - MIRegisterSimpleValue, - MIRegisterIndexedValues, - MIRegisterNamedValues, - MIRegisterValueParser, -} from '../lib/MIRegisterValue'; - -describe('MIRegisterValue', () => { - it('should parse a simple value', () => { - const textValue = '0x7fff5fbff1d4'; - const parser = new MIRegisterValueParser(textValue); - const value = parser.parse(); - - expect(value instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value instanceof MIRegisterSimpleValue); - - expect(value.value).toBe('0x7fff5fbff1d4'); - }); - - it('should parse an indexed list', () => { - const textValue = '{0xc3, 0xf5}'; - const parser = new MIRegisterValueParser(textValue); - const value = parser.parse(); - - expect(value instanceof MIRegisterIndexedValues).toBeTruthy(); - invariant(value instanceof MIRegisterIndexedValues); - expect(value.length).toBe(2); - - const value0 = value.valueAt('0'); - expect(value0 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value0 instanceof MIRegisterSimpleValue); - expect(value0.value).toBe('0xc3'); - - const value1 = value.valueAt('1'); - expect(value1 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value1 instanceof MIRegisterSimpleValue); - expect(value1.value).toBe('0xf5'); - }); - - it('should parse an indexed list with compressed entries', () => { - const textValue = '{0xc3, 0xf5 }'; - const parser = new MIRegisterValueParser(textValue); - const value = parser.parse(); - - expect(value instanceof MIRegisterIndexedValues).toBeTruthy(); - invariant(value instanceof MIRegisterIndexedValues); - expect(value.length).toBe(3); - - const value0 = value.valueAt('0'); - expect(value0 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value0 instanceof MIRegisterSimpleValue); - expect(value0.value).toBe('0xc3'); - - const value1 = value.valueAt('1'); - expect(value1 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value1 instanceof MIRegisterSimpleValue); - expect(value1.value).toBe('0xf5'); - - const value2 = value.valueAt('2'); - expect(value2 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value2 instanceof MIRegisterSimpleValue); - expect(value2.value).toBe('0xf5'); - }); - - it('should parse a named list', () => { - const textValue = '{a = 0xc3, b = 0xf5}'; - const parser = new MIRegisterValueParser(textValue); - const value = parser.parse(); - - expect(value instanceof MIRegisterNamedValues).toBeTruthy(); - invariant(value instanceof MIRegisterNamedValues); - expect(value.names.length).toBe(2); - expect(value.names.includes('a')).toBeTruthy(); - expect(value.names.includes('b')).toBeTruthy(); - - const value0 = value.valueAt('a'); - expect(value0 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value0 instanceof MIRegisterSimpleValue); - expect(value0.value).toBe('0xc3'); - - const value1 = value.valueAt('b'); - expect(value1 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value1 instanceof MIRegisterSimpleValue); - expect(value1.value).toBe('0xf5'); - }); - - it('should parse a nested structure', () => { - const textValue = '{a = {0xc3, 0xf5}}'; - const parser = new MIRegisterValueParser(textValue); - const value = parser.parse(); - - expect(value instanceof MIRegisterNamedValues).toBeTruthy(); - invariant(value instanceof MIRegisterNamedValues); - expect(value.names.length).toBe(1); - expect(value.names.includes('a')).toBeTruthy(); - - const valuea = value.valueAt('a'); - expect(valuea instanceof MIRegisterIndexedValues).toBeTruthy(); - invariant(valuea instanceof MIRegisterIndexedValues); - expect(valuea.length).toBe(2); - - const value0 = valuea.valueAt('0'); - expect(value0 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value0 instanceof MIRegisterSimpleValue); - expect(value0.value).toBe('0xc3'); - - const value1 = valuea.valueAt('1'); - expect(value1 instanceof MIRegisterSimpleValue).toBeTruthy(); - invariant(value1 instanceof MIRegisterSimpleValue); - expect(value1.value).toBe('0xf5'); - }); -}); diff --git a/modules/atom-ide-debugger-native-gdb/spec/StackFramesSpec.js b/modules/atom-ide-debugger-native-gdb/spec/StackFramesSpec.js deleted file mode 100644 index f48c8eb787..0000000000 --- a/modules/atom-ide-debugger-native-gdb/spec/StackFramesSpec.js +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import type {Value} from '../lib/MIRecord'; - -import invariant from 'assert'; -import StackFrames from '../lib/StackFrames'; -import MIProxy from '../lib/MIProxy'; -import {MIResultRecord} from '../lib/MIRecord'; - -// The mock class emulates the MI behavior of stack-info-depth and stack-list-frames -class MIProxyMock extends MIProxy { - _fakeStackData: Map>; // thread-id -> stack data - - constructor() { - super(); - this._fakeStackData = new Map([ - [ - 1, - [ - { - // A frame that has symbols - frame: { - level: '0', - addr: '0x000000010000a042', - func: 'main', - file: 'ring_singleton.c', - fullname: '/home/sauron/git/ring_singleton.c', - line: '394', - }, - }, - { - // A frame that's in the runtime w/o symbols - frame: { - level: '1', - addr: '0x0000000100cf5617', - func: '??', - }, - }, - { - // A frame that's in the runtime w/o symbols - frame: { - level: '2', - addr: '0x0000000102cf5617', - func: '??', - from: 'libc.so', - }, - }, - ], - ], - [ - 2, - [ - { - // A frame that has symbols - frame: { - level: '0', - addr: '0x000000010000f00d', - func: 'main', - file: 'dwarf_ring.c', - fullname: '/home/sauron/git/dwarf_ring.c', - line: '79', - }, - }, - { - // A frame that has symbols - frame: { - level: '1', - addr: '0x00000001000ab5fc', - func: 'ring_timeslice', - file: 'ring_dispatch.c', - fullname: '/home/sauron/git/ring_dispatch.c', - line: '79', - }, - }, - { - // A frame that's in the runtime w/o symbols - frame: { - level: '2', - addr: '0x0000000100141593', - func: '??', - }, - }, - { - // A frame that's in the runtime w/o symbols - frame: { - level: '3', - addr: '0x0000000102fffffe', - func: '??', - from: 'libc.so', - }, - }, - ], - ], - ]); - } - - async sendCommand(command: string): Promise { - let result: MIResultRecord = new MIResultRecord( - null, - {msg: `Invalid command "${command}"`}, - 'error', - ); - - const match = command.match(/^([^ ]+) *(.*)$/); - - if (match != null) { - const [, op, args] = match; - - if (op === 'stack-info-depth') { - const depthArgs = args.match(/^--thread ([0-9]+)$/); - if (depthArgs != null) { - const [, thread] = depthArgs; - invariant(thread != null); - - const threadId = parseInt(thread, 10); - const stackData = this._fakeStackData.get(threadId); - if (stackData == null) { - result = new MIResultRecord( - null, - { - msg: `Invalid thread id: ${threadId}`, - }, - 'error', - ); - } else { - result = new MIResultRecord( - null, - { - depth: `${stackData.length}`, - }, - 'done', - ); - } - } - } else if (op === 'stack-list-frames') { - const listArgs = args.match( - /^--thread ([0-9]+) --no-frame-filters ([0-9]+) ([0-9]+)$/, - ); - if (listArgs != null) { - const [, thread, lowFrame, highFrame] = listArgs; - invariant(thread != null); - invariant(lowFrame != null); - invariant(highFrame != null); - - const threadId = parseInt(thread, 10); - const low = parseInt(lowFrame, 10); - const high = parseInt(highFrame, 10); - - const stackData = this._fakeStackData.get(threadId); - - if (stackData == null) { - result = new MIResultRecord( - null, - { - msg: `Invalid thread id: ${threadId}`, - }, - 'error', - ); - } else if (low >= stackData.length) { - result = new MIResultRecord( - null, - {msg: '-stack-list-frames: Not enough frames in stack.'}, - 'error', - ); - } else { - const stack = stackData.slice(low, high + 1); - result = new MIResultRecord(null, {stack}, 'done'); - } - } - } - } - - return result; - } -} - -describe('StackFrames', () => { - let proxy: MIProxyMock; - let stackFrames: StackFrames; - - beforeEach(() => { - proxy = new MIProxyMock(); - stackFrames = new StackFrames(proxy); - }); - - it('should return stack frames', done => { - stackFrames - .stackFramesForThread(1) - .then(body => { - expect(body.totalFrames).toBe(3); - expect(body.stackFrames.length).toBe(3); - - expect(body.stackFrames[0].id).toBeDefined(); - expect(body.stackFrames[0].name).toBe('main'); - expect(body.stackFrames[0].source).toBeDefined(); - expect(body.stackFrames[0].source.name).toBe('ring_singleton.c'); - expect(body.stackFrames[0].source.path).toBe( - '/home/sauron/git/ring_singleton.c', - ); - expect(body.stackFrames[0].line).toBe(394); - expect(body.stackFrames[0].column).toBe(0); - - expect(body.stackFrames[1].id).toBeDefined(); - expect(body.stackFrames[1].name).toBe('??'); - expect(body.stackFrames[1].source).toBeUndefined(); - expect(body.stackFrames[1].line).toBe(0); - expect(body.stackFrames[1].column).toBe(0); - - expect(body.stackFrames[2].id).toBeDefined(); - expect(body.stackFrames[2].name).toBe('??'); - expect(body.stackFrames[2].source).toBeUndefined(); - expect(body.stackFrames[2].line).toBe(0); - expect(body.stackFrames[2].column).toBe(0); - - done(); - }) - .catch(error => { - expect(true).toBe(false, error.message); - done(); - }); - }); - - it('should return selected stack frames', done => { - stackFrames - .stackFramesForThread(2, 1, 1) - .then(body => { - expect(body.totalFrames).toBe(4); - expect(body.stackFrames.length).toBe(1); - - expect(body.stackFrames[0].id).toBeDefined(); - expect(body.stackFrames[0].name).toBe('ring_timeslice'); - expect(body.stackFrames[0].source).toBeDefined(); - expect(body.stackFrames[0].source.name).toBe('ring_dispatch.c'); - expect(body.stackFrames[0].source.path).toBe( - '/home/sauron/git/ring_dispatch.c', - ); - expect(body.stackFrames[0].line).toBe(79); - expect(body.stackFrames[0].column).toBe(0); - - done(); - }) - .catch(error => { - expect(true).toBe(false, error.message); - done(); - }); - }); -}); diff --git a/modules/atom-ide-debugger-native-gdb/spec/VariablesSpec.js b/modules/atom-ide-debugger-native-gdb/spec/VariablesSpec.js deleted file mode 100644 index 64e1fc5cb2..0000000000 --- a/modules/atom-ide-debugger-native-gdb/spec/VariablesSpec.js +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import type {CachedStackFrame} from '../lib/StackFrames'; - -import MIProxy from '../lib/MIProxy'; -import {MIResultRecord} from '../lib/MIRecord'; -import StackFrames from '../lib/StackFrames'; -import Variables from '../lib/Variables'; - -class MockStackFrames extends StackFrames { - stackFrameByHandle(handle: number): ?CachedStackFrame { - return { - threadId: 1, - frameIndex: 0, - }; - } -} - -type StoredVar = { - value: string, - type: string, -}; - -// The mock class emulates the MI behavior of stack-list-variables -class MIProxyMock extends MIProxy { - _nextVar = 1; - _vars: Map = new Map(); - - constructor() { - super(); - } - - async sendCommand(command: string): Promise { - let result: MIResultRecord = new MIResultRecord( - null, - {msg: `Invalid command "${command}"`}, - 'error', - ); - - const match = command.match(/^([^ ]+) *(.*)$/); - - if (match != null) { - const [, op, args] = match; - - if (op === 'stack-list-variables') { - const listArgs = args.match( - /^--thread ([0-9]+) --frame ([0-9]+) --no-values$/, - ); - if (listArgs != null) { - const vars = { - variables: [ - {name: 'intval', value: '42', type: 'int'}, - {name: 'structval', type: 'mystruct'}, - ], - }; - - result = new MIResultRecord(null, vars, 'done'); - } - } else if (op === 'var-create') { - const varCreateArgs = args.match( - /^--thread ([0-9]+) --frame ([0-9]+) - [@*] (.*)$/, - ); - if (varCreateArgs != null) { - const [, thread, , exp] = varCreateArgs; - const name = `var${this._nextVar++}`; - const created = { - name, - numchild: '0', - value: exp === 'intval' ? '42' : '...', - type: exp === 'intval' ? 'int' : 'mystruct', - 'thread-id': thread, - has_more: '0', - }; - - this._vars.set(created.name, { - value: created.value, - type: created.type, - }); - - result = new MIResultRecord(null, created, 'done'); - } - } else if (op === 'var-evaluate-expression') { - const value = this._vars.get(args); - const body = { - value: value == null ? '??' : value.value, - }; - - result = new MIResultRecord(null, body, 'done'); - } else if (op === 'var-info-type') { - const value = this._vars.get(args); - const body = { - type: value == null ? '??' : value.type, - }; - - result = new MIResultRecord(null, body, 'done'); - } - } - - return result; - } -} - -describe('Variables', () => { - let proxy: MIProxyMock; - let stackFrames: MockStackFrames; - let variables: Variables; - - beforeEach(() => { - proxy = new MIProxyMock(); - stackFrames = new MockStackFrames(proxy); - variables = new Variables(proxy, stackFrames); - }); - - it('getVariables() should return variables', done => { - const varref = variables.variableReferenceForStackFrame(1000); - variables - .getVariables(varref) - .then(vars => { - expect(vars.length).toBe(2); - - expect(vars[0].name).toBe('intval'); - expect(vars[0].type).toBe('int'); - expect(vars[0].value).toBe('42'); - expect(vars[0].variablesReference).toBe(0); - - expect(vars[1].name).toBe('structval'); - expect(vars[1].type).toBe('mystruct'); - expect(vars[1].value).toBe('...'); - - // $$TODO when indexed variables are supported - // expect(vars[1].variablesReference !== 0).toBeTruthy(); - - done(); - }) - .catch(error => { - expect(true).toBe(false, error.message); - done(); - }); - }); -}); diff --git a/modules/atom-ide-debugger-native-gdb/test-support/MockMIServer.js b/modules/atom-ide-debugger-native-gdb/test-support/MockMIServer.js index dbd7cc9f6a..c204a23b31 100644 --- a/modules/atom-ide-debugger-native-gdb/test-support/MockMIServer.js +++ b/modules/atom-ide-debugger-native-gdb/test-support/MockMIServer.js @@ -1,3 +1,19 @@ +"use strict"; + +var _readline = _interopRequireDefault(require("readline")); + +function _yargs() { + const data = _interopRequireDefault(require("yargs")); + + _yargs = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,80 +22,58 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ /** * A simple app that pretends to be an MI server for tests */ -import readline from 'readline'; -import yargs from 'yargs'; - -const rl = readline.createInterface({ +const rl = _readline.default.createInterface({ input: process.stdin, - output: process.stdout, + output: process.stdout }); -type Handler = ( - positionals: Array, - args: Object, - token: number, -) => void; - -function writeResult(token: number, resultClass: string, result: string): void { +function writeResult(token, resultClass, result) { process.stdout.write(`${token}^${resultClass},${result}\n`); } -const handlers: Map = new Map([ - ['list-features', listFeatures], -]); +const handlers = new Map([['list-features', listFeatures]]); -function listFeatures( - positionals: Array, - args: Object, - token: number, -): void { +function listFeatures(positionals, args, token) { writeResult(token, 'done', 'features=["argle", "bargle", "blab"]'); } -function respondTo(line: string): void { +function respondTo(line) { process.stderr.write(`got line ${line}`); - const args = yargs.parse(line.split(/\s+/)); + const args = _yargs().default.parse(line.split(/\s+/)); + const positionals = args._; if (positionals.length === 0) { return; } - const first = positionals[0].toString(); + const first = positionals[0].toString(); // is it an MI command with a token? - // is it an MI command with a token? const commandPattern = /^(\d+)-(.*)$/; const match = first.match(commandPattern); + if (match == null) { // Untokenized commands come back as an error on the log stream process.stdout.write(`&"${first}\\n"\n`); - process.stdout.write( - `&"Undefined command: \\"${first}\\". Try \\"help\\"."\n`, - ); - - // ... as well as returning a real error - process.stdout.write( - `^error,msg="Undefined command: \\"${first}\\". Try \\"help\\"."\n`, - ); + process.stdout.write(`&"Undefined command: \\"${first}\\". Try \\"help\\"."\n`); // ... as well as returning a real error + + process.stdout.write(`^error,msg="Undefined command: \\"${first}\\". Try \\"help\\"."\n`); return; } const [, token, command] = match; const handler = handlers.get(command); + if (handler == null) { - writeResult( - token, - 'error', - 'msg="Undefined command: \\"${command}\\". Try \\"help\\"."', - ); + writeResult(token, 'error', 'msg="Undefined command: \\"${command}\\". Try \\"help\\"."'); return; } @@ -87,5 +81,4 @@ function respondTo(line: string): void { } process.stderr.write('mock server running\n'); - -rl.on('line', line => respondTo(line)).on('close', _ => process.exit(0)); +rl.on('line', line => respondTo(line)).on('close', _ => process.exit(0)); \ No newline at end of file diff --git a/modules/atom-ide-debugger-native-gdb/test-support/RunMIMockServer.js b/modules/atom-ide-debugger-native-gdb/test-support/RunMIMockServer.js index 43f228c7d8..853b5978a6 100644 --- a/modules/atom-ide-debugger-native-gdb/test-support/RunMIMockServer.js +++ b/modules/atom-ide-debugger-native-gdb/test-support/RunMIMockServer.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,14 +8,14 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ /* eslint nuclide-internal/no-commonjs: 0, */ - // eslint-disable-next-line nuclide-internal/modules-dependencies -require('nuclide-node-transpiler'); -require('./MockMIServer'); +require("../../nuclide-node-transpiler"); + +require("./MockMIServer"); \ No newline at end of file diff --git a/modules/atom-ide-debugger-node/main.js b/modules/atom-ide-debugger-node/main.js index 675d7fa811..5ae100e97a 100644 --- a/modules/atom-ide-debugger-node/main.js +++ b/modules/atom-ide-debugger-node/main.js @@ -1,3 +1,41 @@ +"use strict"; + +var React = _interopRequireWildcard(require("react")); + +function _createPackage() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _AutoGenLaunchAttachProvider() { + const data = require("../nuclide-debugger-common/AutoGenLaunchAttachProvider"); + + _AutoGenLaunchAttachProvider = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,53 +44,39 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type { - AutoGenConfig, - NuclideDebuggerProvider, -} from 'nuclide-debugger-common/types'; -import * as React from 'react'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import {AutoGenLaunchAttachProvider} from 'nuclide-debugger-common/AutoGenLaunchAttachProvider'; -import {VsAdapterTypes, VsAdapterNames} from 'nuclide-debugger-common'; - class Activation { constructor() {} + dispose() {} - createDebuggerProvider(): NuclideDebuggerProvider { + createDebuggerProvider() { return { - type: VsAdapterTypes.NODE, + type: _nuclideDebuggerCommon().VsAdapterTypes.NODE, getLaunchAttachProvider: connection => { - return new AutoGenLaunchAttachProvider( - VsAdapterNames.NODE, - connection, - getNodeConfig(), - ); - }, + return new (_AutoGenLaunchAttachProvider().AutoGenLaunchAttachProvider)(_nuclideDebuggerCommon().VsAdapterNames.NODE, connection, getNodeConfig()); + } }; } + } -function getNodeConfig(): AutoGenConfig { +function getNodeConfig() { const program = { name: 'program', type: 'string', description: 'Absolute path to the program.', required: true, - visible: true, + visible: true }; const cwd = { name: 'cwd', type: 'string', - description: - 'Absolute path to the working directory of the program being debugged.', + description: 'Absolute path to the working directory of the program being debugged.', required: true, - visible: true, + visible: true }; const stopOnEntry = { name: 'stopOnEntry', @@ -60,9 +84,8 @@ function getNodeConfig(): AutoGenConfig { description: 'Automatically stop program after launch.', defaultValue: false, required: false, - visible: true, + visible: true }; - const args = { name: 'args', type: 'array', @@ -70,34 +93,31 @@ function getNodeConfig(): AutoGenConfig { description: 'Command line arguments passed to the program.', defaultValue: [], required: false, - visible: true, + visible: true }; const runtimeExecutable = { name: 'runtimeExecutable', type: 'string', - description: - '(Optional) Runtime to use, an absolute path or the name of a runtime available on PATH', + description: '(Optional) Runtime to use, an absolute path or the name of a runtime available on PATH', required: false, - visible: true, + visible: true }; const env = { name: 'env', type: 'object', - description: - '(Optional) Environment variables (e.g. SHELL=/bin/bash PATH=/bin)', + description: '(Optional) Environment variables (e.g. SHELL=/bin/bash PATH=/bin)', defaultValue: {}, required: false, - visible: true, + visible: true }; const outFiles = { name: 'outFiles', type: 'array', itemType: 'string', - description: - '(Optional) When source maps are enabled, these glob patterns specify the generated JavaScript files', + description: '(Optional) When source maps are enabled, these glob patterns specify the generated JavaScript files', defaultValue: [], required: false, - visible: true, + visible: true }; const protocol = { name: 'protocol', @@ -105,72 +125,59 @@ function getNodeConfig(): AutoGenConfig { description: '', defaultValue: 'inspector', required: false, - visible: false, + visible: false }; - const consoleEnum = { name: 'console', type: 'enum', enums: ['internalConsole', 'integratedTerminal'], - description: - 'Integrated Terminal means that it will run in a terminal that can interact with standard input and output.', + description: 'Integrated Terminal means that it will run in a terminal that can interact with standard input and output.', defaultValue: 'internalConsole', required: true, - visible: true, + visible: true }; - const port = { name: 'port', type: 'number', description: 'Port', required: true, - visible: true, + visible: true }; - return { launch: { launch: true, - vsAdapterType: VsAdapterTypes.NODE, - properties: [ - program, - cwd, - stopOnEntry, - args, - runtimeExecutable, - env, - outFiles, - protocol, - consoleEnum, - ], + vsAdapterType: _nuclideDebuggerCommon().VsAdapterTypes.NODE, + properties: [program, cwd, stopOnEntry, args, runtimeExecutable, env, outFiles, protocol, consoleEnum], scriptPropertyName: 'program', cwdPropertyName: 'cwd', scriptExtension: '.js', - header: ( -

This is intended to debug node.js files (for node version 6.3+).

- ), + header: React.createElement("p", null, "This is intended to debug node.js files (for node version 6.3+)."), + getProcessName(values) { let processName = values.program; const lastSlash = processName.lastIndexOf('/'); + if (lastSlash >= 0) { - processName = processName.substring( - lastSlash + 1, - processName.length, - ); + processName = processName.substring(lastSlash + 1, processName.length); } + return processName + ' (Node)'; - }, + } + }, attach: { launch: false, - vsAdapterType: VsAdapterTypes.NODE, + vsAdapterType: _nuclideDebuggerCommon().VsAdapterTypes.NODE, properties: [port], scriptExtension: '.js', - header:

Attach to a running node.js process

, + header: React.createElement("p", null, "Attach to a running node.js process"), + getProcessName(values) { return 'Port: ' + values.port + ' (Node attach)'; - }, - }, + } + + } }; } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-debugger-ocaml/DEVELOPMENT b/modules/atom-ide-debugger-ocaml/DEVELOPMENT deleted file mode 100644 index e27a0b58b0..0000000000 --- a/modules/atom-ide-debugger-ocaml/DEVELOPMENT +++ /dev/null @@ -1,3 +0,0 @@ -This file exists to indicate that the source should be transpiled. - -During publishing, all files are pre-transpiled and this file is ignored. diff --git a/modules/atom-ide-debugger-ocaml/lib/OCamlDebugProxy.js b/modules/atom-ide-debugger-ocaml/lib/OCamlDebugProxy.js index 63572b81f8..8937d8d8cb 100644 --- a/modules/atom-ide-debugger-ocaml/lib/OCamlDebugProxy.js +++ b/modules/atom-ide-debugger-ocaml/lib/OCamlDebugProxy.js @@ -1,3 +1,24 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.OCamlDebugProxy = exports.PROMPT = void 0; + +var _child_process = _interopRequireDefault(require("child_process")); + +function _vscodeDebugadapter() { + const data = require("vscode-debugadapter"); + + _vscodeDebugadapter = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,64 +27,59 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +const PROMPT = '(ocd) '; +exports.PROMPT = PROMPT; -import child_process from 'child_process'; -import {logger} from 'vscode-debugadapter'; - -export const PROMPT = '(ocd) '; - -function stripPrompt(s: string): string { +function stripPrompt(s) { return s.substr(0, s.length - PROMPT.length); } -export type DebugFinishedResults = - | {kind: 'finished'} - | {kind: 'error', message: string}; - -export class OCamlDebugProxy { - _debuggerProcess: child_process$ChildProcess; - _programFinishedCallback: DebugFinishedResults => void; - - constructor( - command: string, - debuggerArguments: Array, - programFinishedCallback: DebugFinishedResults => void, - ) { +class OCamlDebugProxy { + constructor(command, debuggerArguments, programFinishedCallback) { this._programFinishedCallback = programFinishedCallback; - logger.verbose(`Running "${command} ${debuggerArguments.join(' ')}"`); - this._debuggerProcess = child_process.spawn(command, debuggerArguments); + _vscodeDebugadapter().logger.verbose(`Running "${command} ${debuggerArguments.join(' ')}"`); + + this._debuggerProcess = _child_process.default.spawn(command, debuggerArguments); this._debuggerProcess.stdout.on('data', data => { - logger.verbose(`STDOUT:${data.toString()}`); + _vscodeDebugadapter().logger.verbose(`STDOUT:${data.toString()}`); }); this._debuggerProcess.stderr.on('data', data => { const dataString = data.toString(); - logger.verbose(`STDERR:${dataString}`); + + _vscodeDebugadapter().logger.verbose(`STDERR:${dataString}`); + if (/^Program not found\.$/m.test(dataString)) { - logger.error(dataString); + _vscodeDebugadapter().logger.error(dataString); + this._programFinishedCallback({ kind: 'error', - message: `Invalid executable path ${command}`, + message: `Invalid executable path ${command}` }); } }); } - attachOnPromptListener(onBreak: (s: string) => void): () => void { + attachOnPromptListener(onBreak) { let buffer = ''; + const onData = data => { buffer += data; + if (buffer.endsWith(PROMPT)) { this._debuggerProcess.stdout.removeListener('data', onData); + onBreak(stripPrompt(buffer)); } }; + this._debuggerProcess.stdout.on('data', onData); + return () => { this._debuggerProcess.stdout.removeListener('data', onData); }; @@ -73,26 +89,31 @@ export class OCamlDebugProxy { this._debuggerProcess.kill(); } - async pause(): Promise { + async pause() { this._debuggerProcess.kill('SIGINT'); + await this.waitForPrompt(); } - async resume(): Promise { + async resume() { await this.send('run'); } - send(command: string): Promise { - logger.verbose(`STDIN:${command}`); + send(command) { + _vscodeDebugadapter().logger.verbose(`STDIN:${command}`); + this._debuggerProcess.stdin.write(`${command}\n`); + return this.waitForPrompt(); } - waitForPrompt(): Promise { + waitForPrompt() { return new Promise((resolve, reject) => { const dispose = this.attachOnPromptListener(data => { if (data.match(/Time: \d+\nProgram exit.\n?$/)) { - this._programFinishedCallback({kind: 'finished'}); + this._programFinishedCallback({ + kind: 'finished' + }); } dispose(); @@ -100,4 +121,7 @@ export class OCamlDebugProxy { }); }); } + } + +exports.OCamlDebugProxy = OCamlDebugProxy; \ No newline at end of file diff --git a/modules/atom-ide-debugger-ocaml/lib/OCamlDebugger.js b/modules/atom-ide-debugger-ocaml/lib/OCamlDebugger.js index f6e7d72249..0bdb7f3401 100644 --- a/modules/atom-ide-debugger-ocaml/lib/OCamlDebugger.js +++ b/modules/atom-ide-debugger-ocaml/lib/OCamlDebugger.js @@ -1,3 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.THREAD_ID = void 0; + +function _vscodeDebugadapter() { + const data = require("vscode-debugadapter"); + + _vscodeDebugadapter = function () { + return data; + }; + + return data; +} + +function DebugProtocol() { + const data = _interopRequireWildcard(require("vscode-debugprotocol")); + + DebugProtocol = function () { + return data; + }; + + return data; +} + +function _Session() { + const data = require("./Session"); + + _Session = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,160 +45,96 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +const THREAD_ID = 1; +exports.THREAD_ID = THREAD_ID; -import { - DebugSession, - InitializedEvent, - logger, - LoggingDebugSession, - OutputEvent, - TerminatedEvent, - Thread, - StoppedEvent, -} from 'vscode-debugadapter'; -import * as DebugProtocol from 'vscode-debugprotocol'; -import {Session} from './Session'; - -export const THREAD_ID = 1; - -export type OCamlDebugStartInfo = { - ocamldebugExecutable: string, - executablePath: string, - arguments: Array, - environmentVariables: Array, - workingDirectory: string, - includeDirectories: Array, - breakAfterStart: boolean, - logLevel: number, -}; - -export type LaunchRequestArguments = DebugProtocol.LaunchRequestArguments & - OCamlDebugStartInfo; - -class OCamlDebugSession extends LoggingDebugSession { - _session: Session; - _started = false; - _breakAfterStart: boolean; - +class OCamlDebugSession extends _vscodeDebugadapter().LoggingDebugSession { /** * Creates a new debug adapter that is used for one debug session. * We configure the default implementation of a debug adapter here. */ constructor() { - super('ocaml-debug'); + super('ocaml-debug'); // this debugger uses zero-based lines and columns - // this debugger uses zero-based lines and columns + this._started = false; this.setDebuggerLinesStartAt1(true); this.setDebuggerColumnsStartAt1(true); } - _catchAsyncRequestError( - response: ?DebugProtocol.base$Response, - fn: () => Promise, - ) { + _catchAsyncRequestError(response, fn) { fn().catch(error => { const errorMessage = error.stack || error.message || String(error); + if (response != null) { - response.success = false; - // $FlowIgnore: returning an ErrorResponse. + response.success = false; // $FlowIgnore: returning an ErrorResponse. + response.body = { error: { id: -1, - format: errorMessage, - }, + format: errorMessage + } }; this.sendResponse(response); } - this.sendEvent( - new OutputEvent( - `OCaml Debugger ran into an error:\n\`${errorMessage}\``, - 'nuclide_notification', - {type: 'error'}, - ), - ); - this.sendEvent(new TerminatedEvent()); + + this.sendEvent(new (_vscodeDebugadapter().OutputEvent)(`OCaml Debugger ran into an error:\n\`${errorMessage}\``, 'nuclide_notification', { + type: 'error' + })); + this.sendEvent(new (_vscodeDebugadapter().TerminatedEvent)()); }); } - /** * The 'initialize' request is the first request called by the frontend * to interrogate the features the debug adapter provides. */ - initializeRequest( - response: DebugProtocol.InitializeResponse, - args: DebugProtocol.InitializeRequestArguments, - ): void { + + + initializeRequest(response, args) { response.body = { supportsConfigurationDoneRequest: true, - supportsEvaluateForHovers: true, - // TODO: requires Nuclide UI support. + supportsEvaluateForHovers: true // TODO: requires Nuclide UI support. // supportsStepBack: true, + }; this.sendResponse(response); } - launchRequest( - response: DebugProtocol.LaunchResponse, - args: LaunchRequestArguments, - ): void { + launchRequest(response, args) { this._catchAsyncRequestError(response, async () => { - const config = { - ...args, - }; - - // make sure to 'Stop' the buffered logging if 'trace' is not set - logger.setup(config.logLevel, false); + const config = Object.assign({}, args); // make sure to 'Stop' the buffered logging if 'trace' is not set - this._session = await Session.start( - config, - breakPointId => this._handleBreakpointHitEvent(breakPointId), - error => this._handleProgramExitedEvent(error), - ); - this._breakAfterStart = config.breakAfterStart; + _vscodeDebugadapter().logger.setup(config.logLevel, false); - // Now send the initialized event as we're ready to process breakpoint requests - this.sendEvent(new InitializedEvent()); + this._session = await _Session().Session.start(config, breakPointId => this._handleBreakpointHitEvent(breakPointId), error => this._handleProgramExitedEvent(error)); + this._breakAfterStart = config.breakAfterStart; // Now send the initialized event as we're ready to process breakpoint requests + this.sendEvent(new (_vscodeDebugadapter().InitializedEvent)()); this.sendResponse(response); - this.sendEvent(new StoppedEvent('Program entry', THREAD_ID)); + this.sendEvent(new (_vscodeDebugadapter().StoppedEvent)('Program entry', THREAD_ID)); }); } - setBreakPointsRequest( - response: DebugProtocol.SetBreakpointsResponse, - args: DebugProtocol.SetBreakpointsArguments, - ): void { + setBreakPointsRequest(response, args) { this._catchAsyncRequestError(response, async () => { - const breakpoints = await this._session.setBreakpointsByUri( - args.breakpoints || [], - args.source.path, - args.source.name, - ); - + const breakpoints = await this._session.setBreakpointsByUri(args.breakpoints || [], args.source.path, args.source.name); response.body = { - breakpoints, + breakpoints }; this.sendResponse(response); }); } - setExceptionBreakPointsRequest( - response: DebugProtocol.SetExceptionBreakpointsResponse, - args: DebugProtocol.SetExceptionBreakpointsArguments, - ): void { + setExceptionBreakPointsRequest(response, args) { this.sendResponse(response); } - configurationDoneRequest( - response: DebugProtocol.ConfigurationDoneResponse, - args: DebugProtocol.ConfigurationDoneRequest, - ): void { + configurationDoneRequest(response, args) { this._catchAsyncRequestError(response, async () => { if (this._breakAfterStart) { - this.sendEvent(new StoppedEvent('Program start', THREAD_ID)); + this.sendEvent(new (_vscodeDebugadapter().StoppedEvent)('Program start', THREAD_ID)); } else { await this._session.resume(); } @@ -168,123 +143,93 @@ class OCamlDebugSession extends LoggingDebugSession { }); } - threadsRequest(response: DebugProtocol.ThreadsResponse): void { + threadsRequest(response) { response.body = { - threads: [new Thread(THREAD_ID, '')], + threads: [new (_vscodeDebugadapter().Thread)(THREAD_ID, '')] }; this.sendResponse(response); } - stackTraceRequest( - response: DebugProtocol.StackTraceResponse, - args: DebugProtocol.StackTraceArguments, - ): void { + stackTraceRequest(response, args) { this._catchAsyncRequestError(response, async () => { response.body = { - stackFrames: await this._session.getStack(), + stackFrames: await this._session.getStack() }; this.sendResponse(response); }); } - scopesRequest( - response: DebugProtocol.ScopesResponse, - args: DebugProtocol.ScopesArguments, - ): void { + scopesRequest(response, args) { this._catchAsyncRequestError(response, async () => { this.sendResponse(response); }); } - variablesRequest( - response: DebugProtocol.VariablesResponse, - args: DebugProtocol.VariablesArguments, - ): void { + variablesRequest(response, args) { this._catchAsyncRequestError(response, async () => { this.sendResponse(response); }); } - evaluateRequest( - response: DebugProtocol.EvaluateResponse, - args: DebugProtocol.EvaluateArguments, - ): void { + evaluateRequest(response, args) { this._catchAsyncRequestError(response, async () => { - const result = await this._session.evaluate( - args.frameId, - args.expression, - ); - + const result = await this._session.evaluate(args.frameId, args.expression); response.body = { result, - variablesReference: 0, + variablesReference: 0 }; this.sendResponse(response); }); } - continueRequest( - response: DebugProtocol.ContinueResponse, - args: DebugProtocol.ContinueArguments, - ): void { + continueRequest(response, args) { this._catchAsyncRequestError(response, async () => { await this._session.resume(); this.sendResponse(response); }); } - pauseRequest( - response: DebugProtocol.PauseResponse, - args: DebugProtocol.PauseArguments, - ): void { + pauseRequest(response, args) { this._catchAsyncRequestError(null, async () => { await this._session.pause(); this.sendResponse(response); }); } - nextRequest( - response: DebugProtocol.NextResponse, - args: DebugProtocol.NextArguments, - ): void { + nextRequest(response, args) { this._catchAsyncRequestError(null, async () => { await this._session.stepOver(); this.sendResponse(response); - this.sendEvent(new StoppedEvent('Stepped', THREAD_ID)); + this.sendEvent(new (_vscodeDebugadapter().StoppedEvent)('Stepped', THREAD_ID)); }); } - stepInRequest( - response: DebugProtocol.StepInResponse, - args: DebugProtocol.StepInArguments, - ): void { + stepInRequest(response, args) { this._catchAsyncRequestError(null, async () => { await this._session.stepInto(); this.sendResponse(response); - this.sendEvent(new StoppedEvent('Stepped', THREAD_ID)); + this.sendEvent(new (_vscodeDebugadapter().StoppedEvent)('Stepped', THREAD_ID)); }); } - stepOutRequest( - response: DebugProtocol.StepOutResponse, - args: DebugProtocol.StepOutArguments, - ): void { + stepOutRequest(response, args) { this._catchAsyncRequestError(null, async () => { await this._session.stepOut(); this.sendResponse(response); - this.sendEvent(new StoppedEvent('Stepped', THREAD_ID)); + this.sendEvent(new (_vscodeDebugadapter().StoppedEvent)('Stepped', THREAD_ID)); }); } - _handleBreakpointHitEvent(breakpointId: string): Promise { - this.sendEvent(new StoppedEvent('Breakpoint hit', THREAD_ID)); + _handleBreakpointHitEvent(breakpointId) { + this.sendEvent(new (_vscodeDebugadapter().StoppedEvent)('Breakpoint hit', THREAD_ID)); return Promise.resolve(); } - _handleProgramExitedEvent(error: ?string): Promise { - this.sendEvent(new TerminatedEvent()); + _handleProgramExitedEvent(error) { + this.sendEvent(new (_vscodeDebugadapter().TerminatedEvent)()); return Promise.resolve(); } + } -DebugSession.run(OCamlDebugSession); +_vscodeDebugadapter().DebugSession.run(OCamlDebugSession); \ No newline at end of file diff --git a/modules/atom-ide-debugger-ocaml/lib/Session.js b/modules/atom-ide-debugger-ocaml/lib/Session.js index 217a80ebac..88aff04ff5 100644 --- a/modules/atom-ide-debugger-ocaml/lib/Session.js +++ b/modules/atom-ide-debugger-ocaml/lib/Session.js @@ -1,3 +1,44 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Session = void 0; + +function _OCamlDebugProxy() { + const data = require("./OCamlDebugProxy"); + + _OCamlDebugProxy = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +var _url = _interopRequireDefault(require("url")); + +function _vscodeDebugadapter() { + const data = require("vscode-debugadapter"); + + _vscodeDebugadapter = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,110 +47,82 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +function uriToModuleName(uri) { + const pathname = uri.startsWith('file://') ? _url.default.parse(uri).pathname : uri; + + if (!(pathname != null && pathname !== '')) { + throw new Error("Invariant violation: \"pathname != null && pathname !== ''\""); + } + + const fileName = _nuclideUri().default.basename(pathname).replace(/\.[^.]+$/, ''); -import type { - Breakpoint, - StackFrame, - SourceBreakpoint, -} from 'vscode-debugprotocol'; -import type {OCamlDebugStartInfo} from './OCamlDebugger'; -import invariant from 'assert'; -import {OCamlDebugProxy} from './OCamlDebugProxy'; -import NuclideUri from 'nuclide-commons/nuclideUri'; -import url from 'url'; -import {logger} from 'vscode-debugadapter'; - -function uriToModuleName(uri: string) { - const pathname = uri.startsWith('file://') ? url.parse(uri).pathname : uri; - invariant(pathname != null && pathname !== ''); - const fileName = NuclideUri.basename(pathname).replace(/\.[^.]+$/, ''); return fileName.charAt(0).toUpperCase() + fileName.substr(1); } -function extractList( - text: string, - prefix: string, - keepLines: boolean, - empty: T, - f: (s: string[]) => T, -): T { +function extractList(text, prefix, keepLines, empty, f) { const i = text.indexOf(prefix); + if (i < 0) { return empty; } + const t = text.substr(i + prefix.length); - const parts = keepLines - ? t.split(/\r?\n/g) - : t.replace(/[\s\r\n]+/g, ' ').split(' '); + const parts = keepLines ? t.split(/\r?\n/g) : t.replace(/[\s\r\n]+/g, ' ').split(' '); const list = parts.map(s => s.trim()).filter(s => s.length > 0); return f(list); } class Lock { - _inner: Promise; - _expected: number; - constructor() { this._inner = Promise.resolve(0); this._expected = 0; } - async enter(): Promise<{exitLock(): void}> { + async enter() { const curCount = await this._inner; + if (curCount !== this._expected) { // Sometimes we get multiple Promises waiting on the same _inner, so if we // detect that we're stale start waiting again. return this.enter(); } - let e: () => void; + let e; this._inner = new Promise(resolve => { this._expected++; + e = () => resolve(this._expected); }); - return {exitLock: () => e()}; + return { + exitLock: () => e() + }; } + } -export class Session { - _debugProxy: OCamlDebugProxy; - _modules: Set; - _shortNamesToPaths: Map; - _breakpoints: Map>; - _lock: Lock; - _disposeOnBreakListener: ?() => void; - - _onBreakpointHit: (breakpointId: string) => Promise; - _onProgramExit: (errorText: ?string) => Promise; - - _paused: boolean; - - constructor( - debugProxy: OCamlDebugProxy, - modules: Set, - onBreakpointHit: (breakpointId: string) => Promise, - onProgramExit: (errorText: ?string) => Promise, - ) { +class Session { + constructor(debugProxy, modules, onBreakpointHit, onProgramExit) { this._debugProxy = debugProxy; this._modules = modules; this._onProgramExit = onProgramExit; this._onBreakpointHit = onBreakpointHit; - this._shortNamesToPaths = new Map(); this._breakpoints = new Map(); this._paused = true; this._lock = new Lock(); } - async getStack(): Promise { + async getStack() { const output = await this._send('backtrace'); return extractList(output, 'Backtrace:', true, [], lines => { const frames = []; + for (const line of lines) { const m = /#(\d+) ([^\s]+) ([^:]+):(\d+):(\d+)/.exec(line); + if (m) { // We generally have a result for _shortNamesToPaths when running // locally, and generally don't when running remotely. @@ -121,28 +134,29 @@ export class Session { line: Number(m[4]), column: Number(m[5]), source: { - path, - }, + path + } }); } } + return frames; }); } - stepOver(): Promise { + stepOver() { return this._step('next'); } - async stepOut(): Promise { + async stepOut() { return this._step('finish'); } - stepInto(): Promise { + stepInto() { return this._step('step 1'); } - async evaluate(frameId: ?number, expr: string): Promise { + async evaluate(frameId, expr) { return this._runWithLock(async () => { if (frameId != null) { await this._send(`frame ${frameId}`); @@ -154,77 +168,75 @@ export class Session { }); } - async _step(command: string): Promise { + async _step(command) { await this._send(command); } - async setBreakpointsByUri( - breakpoints: SourceBreakpoint[], - uri: ?string, - shortname: ?string, - ): Promise { + async setBreakpointsByUri(breakpoints, uri, shortname) { const mapFailedBreakpoint = bp => { return { line: bp.line, column: bp.column || 0, - verified: false, + verified: false }; - }; - - // The count of returned breakpoints must always equal the count of + }; // The count of returned breakpoints must always equal the count of // requested breakpoints, so instead of returning an empty list if something // goes wrong we just have to return a bunch of unverified breakpoints. + + if (uri == null || shortname == null) { - logger.error( - `Could not set breakpoint: ${JSON.stringify({uri, shortname})}.`, - ); + _vscodeDebugadapter().logger.error(`Could not set breakpoint: ${JSON.stringify({ + uri, + shortname + })}.`); + return breakpoints.map(mapFailedBreakpoint); } const moduleName = uriToModuleName(uri); + if (!this._modules.has(moduleName)) { - logger.error( - `Could not set breakpoint: ${moduleName} is not part of the executable.`, - ); + _vscodeDebugadapter().logger.error(`Could not set breakpoint: ${moduleName} is not part of the executable.`); + return breakpoints.map(mapFailedBreakpoint); } const existingBreakpoints = this._breakpoints.get(uri); + if (existingBreakpoints) { - await Promise.all( - existingBreakpoints.map(this.deleteBreakpoint.bind(this)), - ); + await Promise.all(existingBreakpoints.map(this.deleteBreakpoint.bind(this))); } this._shortNamesToPaths.set(shortname, uri); - const breakpointsPromise = breakpoints.map(async bp => - this._pauseAndLock(async () => { - const result = await this._send(`break @${moduleName} ${bp.line}`); - logger.verbose(result); - const m = /^Breakpoint (\d+) at \d+: file (.+), line (\d+), characters (\d+)-(\d+)$/m.exec( - result, - ); - if (m) { - return { - id: Number(m[1]), - line: Number(m[3]), - column: Number(m[4]), - verified: true, - }; - } - return mapFailedBreakpoint(bp); - }), - ); + const breakpointsPromise = breakpoints.map(async bp => this._pauseAndLock(async () => { + const result = await this._send(`break @${moduleName} ${bp.line}`); + + _vscodeDebugadapter().logger.verbose(result); + + const m = /^Breakpoint (\d+) at \d+: file (.+), line (\d+), characters (\d+)-(\d+)$/m.exec(result); + if (m) { + return { + id: Number(m[1]), + line: Number(m[3]), + column: Number(m[4]), + verified: true + }; + } + + return mapFailedBreakpoint(bp); + })); const breakpointsToReturn = await Promise.all(breakpointsPromise); + this._breakpoints.set(uri, breakpointsToReturn); return breakpointsToReturn; } - deleteBreakpoint(breakpoint: Breakpoint): Promise { + deleteBreakpoint(breakpoint) { const breakpointId = breakpoint.id; + if (breakpointId != null) { return this._pauseAndLock(async () => { await this._send(`delete ${breakpointId}`); @@ -234,64 +246,72 @@ export class Session { return Promise.resolve(); } - async pause(): Promise { + async pause() { if (this._paused) { return true; } + if (this._disposeOnBreakListener) { this._disposeOnBreakListener(); + this._disposeOnBreakListener = null; } + await this._debugProxy.pause(); this._paused = true; return false; } - resume(): void { + resume() { this._paused = false; - this._disposeOnBreakListener = this._debugProxy.attachOnPromptListener( - output => { - const lines = output - .replace(/\r?\n/g, '\n') - .split('\n') - .filter(l => l.length > 0) - .reverse(); - const handleEvent = (breakpointId: ?string, error?: string) => { - this._runWithLock(() => { - this._paused = true; - if (breakpointId != null) { - return this._onBreakpointHit(breakpointId); - } else { - return this._onProgramExit(error); - } - }); - }; - for (const line of lines) { - let m = /^Unhandled exception: (.+)$/.exec(line); - if (m) { - return handleEvent(undefined, m[1]); - } - if (line === 'Program end.') { - return handleEvent(undefined, undefined); - } - m = /^Breakpoint: (\d+)/.exec(line); - if (m) { - return handleEvent(m[1], undefined); + this._disposeOnBreakListener = this._debugProxy.attachOnPromptListener(output => { + const lines = output.replace(/\r?\n/g, '\n').split('\n').filter(l => l.length > 0).reverse(); + + const handleEvent = (breakpointId, error) => { + this._runWithLock(() => { + this._paused = true; + + if (breakpointId != null) { + return this._onBreakpointHit(breakpointId); + } else { + return this._onProgramExit(error); } + }); + }; + + for (const line of lines) { + let m = /^Unhandled exception: (.+)$/.exec(line); + + if (m) { + return handleEvent(undefined, m[1]); + } + + if (line === 'Program end.') { + return handleEvent(undefined, undefined); } - }, - ); + + m = /^Breakpoint: (\d+)/.exec(line); + + if (m) { + return handleEvent(m[1], undefined); + } + } + }); + this._debugProxy.resume(); } - dispose(): void { + dispose() { if (this._debugProxy) { this._debugProxy.kill(); } } - async _runWithLock(f: () => Promise): Promise { - const {exitLock} = await this._lock.enter(); + async _runWithLock(f) { + const { + exitLock + } = await this._lock.enter(); + try { return await f(); } finally { @@ -299,9 +319,10 @@ export class Session { } } - async _pauseAndLock(f: () => Promise): Promise { + async _pauseAndLock(f) { return this._runWithLock(async () => { const wasPaused = await this.pause(); + try { return await f(); } finally { @@ -312,73 +333,55 @@ export class Session { }); } - static async _startOcamlDebug( - startInfo: OCamlDebugStartInfo, - onProgramExit: (error: ?string) => Promise, - ): Promise { + static async _startOcamlDebug(startInfo, onProgramExit) { const debuggerArguments = []; + for (const includeDir of startInfo.includeDirectories) { debuggerArguments.push('-I', includeDir); } if (startInfo.workingDirectory) { debuggerArguments.push('-cd', startInfo.workingDirectory); - } - - // Path of the executable to debug is optional because there are some + } // Path of the executable to debug is optional because there are some // scripts in fbcode that execute ocamldebug with the correct arguments and // executable path, and we want to support executing those directly. + + if (startInfo.executablePath.trim().length > 0) { const executablePath = startInfo.executablePath; debuggerArguments.push(executablePath); } - const command = - startInfo.ocamldebugExecutable !== '' - ? startInfo.ocamldebugExecutable - : 'ocamldebug'; + const command = startInfo.ocamldebugExecutable !== '' ? startInfo.ocamldebugExecutable : 'ocamldebug'; debuggerArguments.push(...startInfo.arguments); - - const ocamlDebug = new OCamlDebugProxy( - command, - debuggerArguments, - result => { - onProgramExit(result.kind === 'finished' ? null : result.message); - }, - ); - + const ocamlDebug = new (_OCamlDebugProxy().OCamlDebugProxy)(command, debuggerArguments, result => { + onProgramExit(result.kind === 'finished' ? null : result.message); + }); await ocamlDebug.waitForPrompt(); await ocamlDebug.send('goto 0'); return ocamlDebug; } - static async start( - startInfo: OCamlDebugStartInfo, - onBreakpointHit: (breakpointId: string) => Promise, - onProgramExit: (error: ?string) => Promise, - ): Promise { + static async start(startInfo, onBreakpointHit, onProgramExit) { const ocamlDebug = await Session._startOcamlDebug(startInfo, onProgramExit); - const modulesText = await ocamlDebug.send('info modules'); - logger.verbose(`MODULES ${modulesText}`); - return new Session( - ocamlDebug, - Session._extractModules(modulesText), - onBreakpointHit, - onProgramExit, - ); + + _vscodeDebugadapter().logger.verbose(`MODULES ${modulesText}`); + + return new Session(ocamlDebug, Session._extractModules(modulesText), onBreakpointHit, onProgramExit); } - _send(command: string): Promise { + _send(command) { return this._debugProxy.send(command); } - static _extractModules(modulesText: string): Set { - return extractList(modulesText, 'Used modules:', false, new Set(), l => - l.reduce((acc, v) => { - acc.add(v); - return acc; - }, new Set()), - ); + static _extractModules(modulesText) { + return extractList(modulesText, 'Used modules:', false, new Set(), l => l.reduce((acc, v) => { + acc.add(v); + return acc; + }, new Set())); } + } + +exports.Session = Session; \ No newline at end of file diff --git a/modules/atom-ide-debugger-ocaml/lib/main.js b/modules/atom-ide-debugger-ocaml/lib/main.js index 244aaa79bf..368c6120cc 100644 --- a/modules/atom-ide-debugger-ocaml/lib/main.js +++ b/modules/atom-ide-debugger-ocaml/lib/main.js @@ -1,3 +1,47 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _AutoGenLaunchAttachProvider() { + const data = require("../../nuclide-debugger-common/AutoGenLaunchAttachProvider"); + + _AutoGenLaunchAttachProvider = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +function _vscodeDebugadapter() { + const data = require("vscode-debugadapter"); + + _vscodeDebugadapter = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,54 +50,39 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type { - AutoGenConfig, - AutoGenLaunchConfig, - NuclideDebuggerProvider, -} from 'nuclide-debugger-common/types'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import {AutoGenLaunchAttachProvider} from 'nuclide-debugger-common/AutoGenLaunchAttachProvider'; -import {VsAdapterNames, VsAdapterTypes} from 'nuclide-debugger-common'; -import {Logger} from 'vscode-debugadapter'; - class Activation { constructor() {} + dispose() {} - createDebuggerProvider(): NuclideDebuggerProvider { + createDebuggerProvider() { return { - type: VsAdapterTypes.OCAML, + type: _nuclideDebuggerCommon().VsAdapterTypes.OCAML, getLaunchAttachProvider: connection => { - return new AutoGenLaunchAttachProvider( - VsAdapterNames.OCAML, - connection, - getOCamlAutoGenConfig(), - ); - }, + return new (_AutoGenLaunchAttachProvider().AutoGenLaunchAttachProvider)(_nuclideDebuggerCommon().VsAdapterNames.OCAML, connection, getOCamlAutoGenConfig()); + } }; } + } -function getOCamlAutoGenConfig(): AutoGenConfig { +function getOCamlAutoGenConfig() { const debugExecutable = { name: 'ocamldebugExecutable', type: 'string', description: 'Path to ocamldebug or launch script', required: true, - visible: true, + visible: true }; const executablePath = { name: 'executablePath', type: 'string', - description: - 'Input the executable path you want to launch (leave blank if using an ocamldebug launch script)', + description: 'Input the executable path you want to launch (leave blank if using an ocamldebug launch script)', required: false, - visible: true, + visible: true }; const argumentsProperty = { name: 'arguments', @@ -62,7 +91,7 @@ function getOCamlAutoGenConfig(): AutoGenConfig { description: 'Arguments to the executable', required: false, defaultValue: [], - visible: true, + visible: true }; const environmentVariables = { name: 'environmentVariables', @@ -71,24 +100,23 @@ function getOCamlAutoGenConfig(): AutoGenConfig { description: 'Environment variables (e.g. SHELL=/bin/bash PATH=/bin)', required: false, defaultValue: [], - visible: true, + visible: true }; const workingDirectory = { name: 'workingDirectory', type: 'string', description: 'Working directory for the launched executable', required: true, - visible: true, + visible: true }; const additionalIncludeDirectories = { name: 'includeDirectories', type: 'array', itemType: 'string', - description: - 'Additional include directories that debugger will use to search for source code', + description: 'Additional include directories that debugger will use to search for source code', required: false, defaultValue: [], - visible: true, + visible: true }; const breakAfterStart = { name: 'breakAfterStart', @@ -96,41 +124,33 @@ function getOCamlAutoGenConfig(): AutoGenConfig { description: '', required: false, defaultValue: true, - visible: true, + visible: true }; const logLevel = { name: 'logLevel', type: 'string', description: '', required: false, - defaultValue: Logger.LogLevel.Verbose, - visible: false, + defaultValue: _vscodeDebugadapter().Logger.LogLevel.Verbose, + visible: false }; - - const autoGenLaunchConfig: AutoGenLaunchConfig = { + const autoGenLaunchConfig = { launch: true, - vsAdapterType: VsAdapterTypes.OCAML, - properties: [ - debugExecutable, - executablePath, - argumentsProperty, - environmentVariables, - workingDirectory, - additionalIncludeDirectories, - breakAfterStart, - logLevel, - ], + vsAdapterType: _nuclideDebuggerCommon().VsAdapterTypes.OCAML, + properties: [debugExecutable, executablePath, argumentsProperty, environmentVariables, workingDirectory, additionalIncludeDirectories, breakAfterStart, logLevel], scriptPropertyName: 'executable', cwdPropertyName: 'working directory', header: null, + getProcessName(values) { return values.debugExecutable + ' (OCaml)'; - }, + } + }; return { launch: autoGenLaunchConfig, - attach: null, + attach: null }; } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-debugger-ocaml/spec/fixtures/README.md b/modules/atom-ide-debugger-ocaml/spec/fixtures/README.md deleted file mode 100644 index 82afe3324b..0000000000 --- a/modules/atom-ide-debugger-ocaml/spec/fixtures/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# How to compile the test project -`ocamlc -g -o .byte .ml` - -Note that the `.cmi` and `.cmo` files are not necessary for the test to run and -do not need to be checked in. - -# How to debug the test project manually -`./ocamldebug .byte` diff --git a/modules/atom-ide-debugger-ocaml/spec/fixtures/infinite_loop.ml b/modules/atom-ide-debugger-ocaml/spec/fixtures/infinite_loop.ml deleted file mode 100644 index a9beb741a6..0000000000 --- a/modules/atom-ide-debugger-ocaml/spec/fixtures/infinite_loop.ml +++ /dev/null @@ -1,7 +0,0 @@ -let loop_forever () = -let rec loop_forever_helper num = - loop_forever_helper (num + 1) in -loop_forever_helper 0 - -let () = - loop_forever () diff --git a/modules/atom-ide-debugger-ocaml/spec/fixtures/simple.ml b/modules/atom-ide-debugger-ocaml/spec/fixtures/simple.ml deleted file mode 100644 index c656d3246d..0000000000 --- a/modules/atom-ide-debugger-ocaml/spec/fixtures/simple.ml +++ /dev/null @@ -1,32 +0,0 @@ -(** Add a lot of fields to make sure that the watch window/identifier hovering - don't truncate fields. *) -type t = { - name : string; - id : int; - field1: string; - field2: string; - field3: string; - field4: string; - field5: string; -} - -let print_t (my_t: t) = - Printf.printf "{name=\"%s\"; id=%d}\n" my_t.name my_t.id - -let main () = - let my_thing = { - name = "My t"; - id = 1349; - field1 = "Field 1"; - field2 = "Field 2"; - field3 = "Field 3"; - field4 = "Field 4"; - field5 = "Field 5" - } in ( - print_t my_thing; - print_t { my_thing with name = "My different t" }; - print_t { my_thing with name = "My very different t" }; - print_t { my_thing with name = "My extremely different t" }) - -let () = - main () diff --git a/modules/atom-ide-debugger-ocaml/spec/vscode-ocaml-spec.js b/modules/atom-ide-debugger-ocaml/spec/vscode-ocaml-spec.js deleted file mode 100644 index 66230374cb..0000000000 --- a/modules/atom-ide-debugger-ocaml/spec/vscode-ocaml-spec.js +++ /dev/null @@ -1,255 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - * @format - */ - -import * as DebugProtocol from 'vscode-debugprotocol'; -import * as fs from 'fs'; -import {getLogger} from 'log4js'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {runCommand} from 'nuclide-commons/process'; -import VsDebugSession from 'nuclide-debugger-common/VsDebugSession'; -import {Logger} from 'vscode-debugadapter'; -import {THREAD_ID} from '../lib/OCamlDebugger'; - -const logger = getLogger('ocaml-debugger-spec'); -const adapterInfo = { - command: 'node', - args: [nuclideUri.join(__dirname, '../lib/vscode-debugger-entry.js')], -}; -const OCAML_FIXTURES = nuclideUri.join(__dirname, 'fixtures'); - -function makeSource(name: string): DebugProtocol.Source { - return { - name, - path: nuclideUri.join(OCAML_FIXTURES, name), - }; -} - -async function checkResponse( - responsePromise: Promise, - additionalValidation?: T => void, -): Promise { - const response = await responsePromise; - expect(response.success).toBeTruthy( - `Expected successful response, got ${JSON.stringify(response)}`, - ); - - if (additionalValidation != null) { - additionalValidation(response); - } - - return response; -} - -async function withSession( - executableName: string, - breakpoints?: DebugProtocol.SetBreakpointsArguments, - sessionContinuation: VsDebugSession => Promise, -): Promise { - const session = new VsDebugSession( - process.pid.toString(), - logger, - adapterInfo, - ); - try { - await checkResponse( - session.initialize({adapterID: 'id', pathFormat: 'path'}), - ); - await checkResponse( - session.launch({ - ocamldebugExecutable: 'ocamldebug', - executablePath: nuclideUri.join(__dirname, 'fixtures', executableName), - arguments: [], - environmentVariables: [], - workingDirectory: OCAML_FIXTURES, - includeDirectories: [], - breakAfterStart: false, - logLevel: Logger.Verbose, - }), - ); - - if (breakpoints != null) { - await checkResponse(session.setBreakpoints(breakpoints), response => { - const unverifiedBreakpoints = response.body.breakpoints.filter( - bp => !bp.verified, - ); - expect(unverifiedBreakpoints.length).toBe( - 0, - `The following breakpoints could not be set: ${JSON.stringify( - unverifiedBreakpoints, - )}`, - ); - }); - } - - await checkResponse(session.configurationDone()); - - await sessionContinuation(session); - } finally { - session.dispose(); - } -} - -async function waitForEvent( - eventStream: rxjs$Observable, -): Promise { - await eventStream.take(1).toPromise(); -} - -const waitForBreak = (debugSession: VsDebugSession) => - waitForEvent(debugSession.observeStopEvents()); - -async function checkLine( - debugSession: VsDebugSession, - expectedLine: number, -): Promise { - await checkResponse( - debugSession.stackTrace({threadId: THREAD_ID}), - response => { - expect(response.body.stackFrames[0].line).toBe(expectedLine); - }, - ); -} - -describe('ocaml-debugger', () => { - if (process.env.SANDCASTLE == null) { - return; - } - - let hasDoneSetup = false; - beforeEach(() => { - waitsForPromise(async () => { - if (hasDoneSetup) { - return; - } - - jasmine.getEnv().defaultTimeoutInterval = 10000; - - const mlFiles = await new Promise((resolve, reject) => { - fs.readdir(OCAML_FIXTURES, (err, files) => { - if (err) { - reject(err); - } - - resolve(files.filter(file => file.endsWith('.ml'))); - }); - }); - - await Promise.all( - mlFiles.map(file => - runCommand( - 'ocamlc', - ['-g', '-o', file.replace(/(\S+)\.ml$/, '$1.byte'), file], - {cwd: OCAML_FIXTURES}, - ).toPromise(), - ), - ); - - hasDoneSetup = true; - }); - }); - - it('can print values', () => { - waitsForPromise(() => - withSession( - 'simple.byte', - { - source: makeSource('simple.ml'), - breakpoints: [{line: 14}], - }, - async debugSession => { - await waitForBreak(debugSession); - await checkResponse( - debugSession.evaluate({expression: 'my_t'}), - response => { - expect(response.body.result).toBe(`t = - {name = "My t"; id = 1349; field1 = "Field 1"; field2 = "Field 2"; - field3 = "Field 3"; field4 = "Field 4"; field5 = "Field 5"}`); - }, - ); - }, - ), - ); - }); - - it('can set multiple breakpoints', () => { - waitsForPromise(() => - withSession( - 'simple.byte', - { - source: makeSource('simple.ml'), - breakpoints: [{line: 14}, {line: 26}], - }, - async debugSession => { - const waitCheckAndContinue = async (expectedLine: number) => { - await waitForBreak(debugSession); - await checkLine(debugSession, expectedLine); - await checkResponse(debugSession.continue({threadId: THREAD_ID})); - }; - - // ocamldebug will hit breakpoint 14 as soon as it enters the - // function, but won't hit 26 as a pre-execution breakpoint, only a - // post-execution breakpoint. It's not the most predictable debugger - // for people used to other ones. - await waitCheckAndContinue(14); - await waitCheckAndContinue(26); - }, - ), - ); - }); - - it('supports step-over, step-in, and step-out', () => { - waitsForPromise(() => - withSession( - 'simple.byte', - { - source: makeSource('simple.ml'), - breakpoints: [{line: 26}], - }, - async debugSession => { - await waitForBreak(debugSession); - await checkLine(debugSession, 26); - - await checkResponse(debugSession.next({threadId: THREAD_ID})); - await checkLine(debugSession, 27); - - await checkResponse(debugSession.stepIn({threadId: THREAD_ID})); - await checkLine(debugSession, 14); - - await checkResponse(debugSession.stepOut({threadId: THREAD_ID})); - await checkLine(debugSession, 28); - - // OCaml *always* performs tail call optimization, so even if we - // wanted to we couldn't hit line 29, since it's the lst line in - // `main ()` so the function it calls is just directly inlined. - }, - ), - ); - }); - - it('can set breakpoints even whilst in an infinite loop', () => { - // This is important since ocamldebug is single threaded, so it can't - // respond to user input while it's currently executing the program. - waitsForPromise(() => - withSession('infinite_loop.byte', undefined, async debugSession => { - await checkResponse( - debugSession.setBreakpoints({ - source: makeSource('infinite_loop.byte'), - breakpoints: [{line: 3}], - }), - ); - - await waitForBreak(debugSession); - await debugSession.disconnect(); - }), - ); - }); -}); diff --git a/modules/atom-ide-debugger-python/RemoteDebuggerCommandService.js b/modules/atom-ide-debugger-python/RemoteDebuggerCommandService.js index fcb1460b16..59f66c5f3c 100644 --- a/modules/atom-ide-debugger-python/RemoteDebuggerCommandService.js +++ b/modules/atom-ide-debugger-python/RemoteDebuggerCommandService.js @@ -1,3 +1,39 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.observeRemoteDebugCommands = observeRemoteDebugCommands; +exports.observeAttachDebugTargets = observeAttachDebugTargets; + +var _http = _interopRequireDefault(require("http")); + +var _net = _interopRequireDefault(require("net")); + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _log4js() { + const data = require("log4js"); + + _log4js = function () { + return data; + }; + + return data; +} + +function _promise() { + const data = require("../nuclide-commons/promise"); + + _promise = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,83 +42,47 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {ConnectableObservable} from 'rxjs'; - -import http from 'http'; -import net from 'net'; -import {Observable, Subject} from 'rxjs'; -import {getLogger} from 'log4js'; -import {sleep} from 'nuclide-commons/promise'; - let isServerSetup = false; - -export type RemoteDebugCommandRequest = { - type: 'python', - command: 'attach', - target: PythonDebuggerAttachTarget, -}; - -export type PythonDebuggerAttachTarget = { - port: number, - localRoot: ?string, - remoteRoot: ?string, - debugOptions: ?Array, - id: ?string, -}; - -const debugRequests: Subject = new Subject(); -const attachReady: Map = new Map(); +const debugRequests = new _rxjsCompatUmdMin.Subject(); +const attachReady = new Map(); const DEBUGGER_REGISTRY_PORT = 9615; -export function observeRemoteDebugCommands(): ConnectableObservable< - RemoteDebugCommandRequest, -> { +function observeRemoteDebugCommands() { let setupStep; + if (!isServerSetup) { - setupStep = Observable.fromPromise(setupServer()).ignoreElements(); + setupStep = _rxjsCompatUmdMin.Observable.fromPromise(setupServer()).ignoreElements(); } else { - setupStep = Observable.empty(); + setupStep = _rxjsCompatUmdMin.Observable.empty(); } + return setupStep.concat(debugRequests).publish(); } -export function observeAttachDebugTargets(): ConnectableObservable< - Array, -> { +function observeAttachDebugTargets() { // Validate attach-ready values with the processes with used ports (ready to attach). // Note: we can't use process ids because we could be debugging processes inside containers // where the process ids don't map to the host running this code. - return Observable.interval(3000) - .startWith(0) - .switchMap(() => - Promise.all( - Array.from(attachReady.values()).map(async target => { - if (!(await isPortUsed(target.port))) { - attachReady.delete(target.port); - } - }), - ), - ) - .map(() => Array.from(attachReady.values())) - .publish(); + return _rxjsCompatUmdMin.Observable.interval(3000).startWith(0).switchMap(() => Promise.all(Array.from(attachReady.values()).map(async target => { + if (!(await isPortUsed(target.port))) { + attachReady.delete(target.port); + } + }))).map(() => Array.from(attachReady.values())).publish(); } -function isPortUsed(port: number): Promise { +function isPortUsed(port) { const tryConnectPromise = new Promise((resolve, reject) => { - const client = new net.Socket(); - client - .once('connect', () => { - cleanUp(); - resolve(true); - }) - .once('error', err => { - cleanUp(); - resolve(err.code !== 'ECONNREFUSED'); - }); + const client = new _net.default.Socket(); + client.once('connect', () => { + cleanUp(); + resolve(true); + }).once('error', err => { + cleanUp(); + resolve(err.code !== 'ECONNREFUSED'); + }); function cleanUp() { client.removeAllListeners('connect'); @@ -92,72 +92,90 @@ function isPortUsed(port: number): Promise { client.unref(); } - client.connect({port, host: '127.0.0.1'}); - }); - // Trying to connect can take multiple seconds, then times out (if the server is busy). + client.connect({ + port, + host: '127.0.0.1' + }); + }); // Trying to connect can take multiple seconds, then times out (if the server is busy). // Hence, we need to fallback to `true`. - const connectTimeoutPromise = sleep(1000).then(() => true); + + const connectTimeoutPromise = (0, _promise().sleep)(1000).then(() => true); return Promise.race([tryConnectPromise, connectTimeoutPromise]); } -function setupServer(): Promise { +function setupServer() { return new Promise((resolve, reject) => { - http - .createServer((req, res) => { - if (req.method !== 'POST') { - res.writeHead(500, {'Content-Type': 'text/html'}); - res.end('Invalid request'); - } else { - let body = ''; - req.on('data', data => { - body += data; - }); - req.on('end', () => { - handleJsonRequest(JSON.parse(body), res); - }); - } - }) - .on('error', reject) - .listen((DEBUGGER_REGISTRY_PORT: any), () => { - isServerSetup = true; - resolve(); - }); + _http.default.createServer((req, res) => { + if (req.method !== 'POST') { + res.writeHead(500, { + 'Content-Type': 'text/html' + }); + res.end('Invalid request'); + } else { + let body = ''; + req.on('data', data => { + body += data; + }); + req.on('end', () => { + handleJsonRequest(JSON.parse(body), res); + }); + } + }).on('error', reject).listen(DEBUGGER_REGISTRY_PORT, () => { + isServerSetup = true; + resolve(); + }); }); } function handleJsonRequest(body, res) { - res.writeHead(200, {'Content-Type': 'application/json'}); - const {domain, command, type} = body; + res.writeHead(200, { + 'Content-Type': 'application/json' + }); + const { + domain, + command, + type + } = body; let success = false; + if (domain !== 'debug' || type !== 'python') { - res.end(JSON.stringify({success})); + res.end(JSON.stringify({ + success + })); return; } + if (command === 'enable-attach') { const port = Number(body.port); - const {options} = body; + const { + options + } = body; const target = { port, id: options.id, localRoot: options.localRoot, remoteRoot: options.remoteRoot, - debugOptions: options.debugOptions, + debugOptions: options.debugOptions }; attachReady.set(port, target); - getLogger().info('Remote debug target is ready to attach', target); + (0, _log4js().getLogger)().info('Remote debug target is ready to attach', target); success = true; } else if (command === 'attach') { const port = Number(body.port); - getLogger().info('Remote debug target attach request', body); + (0, _log4js().getLogger)().info('Remote debug target attach request', body); const target = attachReady.get(port); + if (target != null) { debugRequests.next({ type, command, - target, + target }); success = true; } } - res.end(JSON.stringify({success})); -} + + res.end(JSON.stringify({ + success + })); +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-python/RemoteDebuggerCommandServiceProxy.js b/modules/atom-ide-debugger-python/RemoteDebuggerCommandServiceProxy.js new file mode 100644 index 0000000000..6b74036a9a --- /dev/null +++ b/modules/atom-ide-debugger-python/RemoteDebuggerCommandServiceProxy.js @@ -0,0 +1,234 @@ +"use strict"; + +module.exports = _client => { + const remoteModule = {}; + + remoteModule.observeRemoteDebugCommands = function () { + return _client.callRemoteFunction("RemoteDebuggerCommandService/observeRemoteDebugCommands", "observable", _client.marshalArguments(Array.from(arguments), [])).map(value => { + return _client.unmarshal(value, { + kind: "named", + name: "RemoteDebugCommandRequest" + }); + }).publish(); + }; + + remoteModule.observeAttachDebugTargets = function () { + return _client.callRemoteFunction("RemoteDebuggerCommandService/observeAttachDebugTargets", "observable", _client.marshalArguments(Array.from(arguments), [])).map(value => { + return _client.unmarshal(value, { + kind: "array", + type: { + kind: "named", + name: "PythonDebuggerAttachTarget" + } + }); + }).publish(); + }; + + return remoteModule; +}; + +Object.defineProperty(module.exports, "defs", { + value: { + Object: { + kind: "alias", + name: "Object", + location: { + type: "builtin" + } + }, + Date: { + kind: "alias", + name: "Date", + location: { + type: "builtin" + } + }, + RegExp: { + kind: "alias", + name: "RegExp", + location: { + type: "builtin" + } + }, + Buffer: { + kind: "alias", + name: "Buffer", + location: { + type: "builtin" + } + }, + "fs.Stats": { + kind: "alias", + name: "fs.Stats", + location: { + type: "builtin" + } + }, + NuclideUri: { + kind: "alias", + name: "NuclideUri", + location: { + type: "builtin" + } + }, + atom$Point: { + kind: "alias", + name: "atom$Point", + location: { + type: "builtin" + } + }, + atom$Range: { + kind: "alias", + name: "atom$Range", + location: { + type: "builtin" + } + }, + PythonDebuggerAttachTarget: { + kind: "alias", + location: { + type: "source", + fileName: "RemoteDebuggerCommandService.js", + line: 29 + }, + name: "PythonDebuggerAttachTarget", + definition: { + kind: "object", + fields: [{ + name: "port", + type: { + kind: "number" + }, + optional: false + }, { + name: "localRoot", + type: { + kind: "nullable", + type: { + kind: "string" + } + }, + optional: false + }, { + name: "remoteRoot", + type: { + kind: "nullable", + type: { + kind: "string" + } + }, + optional: false + }, { + name: "debugOptions", + type: { + kind: "nullable", + type: { + kind: "array", + type: { + kind: "string" + } + } + }, + optional: false + }, { + name: "id", + type: { + kind: "nullable", + type: { + kind: "string" + } + }, + optional: false + }] + } + }, + RemoteDebugCommandRequest: { + kind: "alias", + location: { + type: "source", + fileName: "RemoteDebuggerCommandService.js", + line: 23 + }, + name: "RemoteDebugCommandRequest", + definition: { + kind: "object", + fields: [{ + name: "type", + type: { + kind: "string-literal", + value: "python" + }, + optional: false + }, { + name: "command", + type: { + kind: "string-literal", + value: "attach" + }, + optional: false + }, { + name: "target", + type: { + kind: "named", + name: "PythonDebuggerAttachTarget" + }, + optional: false + }] + } + }, + observeRemoteDebugCommands: { + kind: "function", + name: "observeRemoteDebugCommands", + location: { + type: "source", + fileName: "RemoteDebuggerCommandService.js", + line: 41 + }, + type: { + location: { + type: "source", + fileName: "RemoteDebuggerCommandService.js", + line: 41 + }, + kind: "function", + argumentTypes: [], + returnType: { + kind: "observable", + type: { + kind: "named", + name: "RemoteDebugCommandRequest" + } + } + } + }, + observeAttachDebugTargets: { + kind: "function", + name: "observeAttachDebugTargets", + location: { + type: "source", + fileName: "RemoteDebuggerCommandService.js", + line: 53 + }, + type: { + location: { + type: "source", + fileName: "RemoteDebuggerCommandService.js", + line: 53 + }, + kind: "function", + argumentTypes: [], + returnType: { + kind: "observable", + type: { + kind: "array", + type: { + kind: "named", + name: "PythonDebuggerAttachTarget" + } + } + } + } + } + } +}); \ No newline at end of file diff --git a/modules/atom-ide-debugger-python/main.js b/modules/atom-ide-debugger-python/main.js index 378101bb16..afcee5b497 100644 --- a/modules/atom-ide-debugger-python/main.js +++ b/modules/atom-ide-debugger-python/main.js @@ -1,3 +1,67 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getPythonAutoGenConfig = getPythonAutoGenConfig; +exports.NUCLIDE_PYTHON_DEBUGGER_DEX_URI = void 0; + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _createPackage() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _AutoGenLaunchAttachProvider() { + const data = require("../nuclide-debugger-common/AutoGenLaunchAttachProvider"); + + _AutoGenLaunchAttachProvider = function () { + return data; + }; + + return data; +} + +function _utils() { + const data = require("./utils"); + + _utils = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,78 +70,57 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type { - AutoGenConfig, - NuclideDebuggerProvider, -} from 'nuclide-debugger-common/types'; - -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {VsAdapterNames, VsAdapterTypes} from 'nuclide-debugger-common'; -import * as React from 'react'; -import createPackage from 'nuclide-commons-atom/createPackage'; -import {AutoGenLaunchAttachProvider} from 'nuclide-debugger-common/AutoGenLaunchAttachProvider'; -import {listenToRemoteDebugCommands, setRpcService} from './utils'; - -export const NUCLIDE_PYTHON_DEBUGGER_DEX_URI = - 'https://our.intern.facebook.com/intern/dex/python-and-fbcode/debugging/#nuclide'; +const NUCLIDE_PYTHON_DEBUGGER_DEX_URI = 'https://our.intern.facebook.com/intern/dex/python-and-fbcode/debugging/#nuclide'; +exports.NUCLIDE_PYTHON_DEBUGGER_DEX_URI = NUCLIDE_PYTHON_DEBUGGER_DEX_URI; class Activation { - _subscriptions: UniversalDisposable; - constructor() { - this._subscriptions = new UniversalDisposable( - listenToRemoteDebugCommands(), - ); + this._subscriptions = new (_UniversalDisposable().default)((0, _utils().listenToRemoteDebugCommands)()); } dispose() { this._subscriptions.dispose(); } - consumeRpcService(rpcService: nuclide$RpcService): IDisposable { - return setRpcService(rpcService); + consumeRpcService(rpcService) { + return (0, _utils().setRpcService)(rpcService); } - createDebuggerProvider(): NuclideDebuggerProvider { + createDebuggerProvider() { return { - type: VsAdapterTypes.PYTHON, + type: _nuclideDebuggerCommon().VsAdapterTypes.PYTHON, getLaunchAttachProvider: connection => { - return new AutoGenLaunchAttachProvider( - VsAdapterNames.PYTHON, - connection, - getPythonAutoGenConfig(), - ); - }, + return new (_AutoGenLaunchAttachProvider().AutoGenLaunchAttachProvider)(_nuclideDebuggerCommon().VsAdapterNames.PYTHON, connection, getPythonAutoGenConfig()); + } }; } + } -export function getPythonAutoGenConfig(): AutoGenConfig { +function getPythonAutoGenConfig() { const program = { name: 'program', type: 'path', description: 'Absolute path to the program.', required: true, - visible: true, + visible: true }; const pythonPath = { name: 'pythonPath', type: 'path', description: 'Path to python executable.', required: true, - visible: true, + visible: true }; const cwd = { name: 'cwd', type: 'path', - description: - '(Optional) Absolute path to the working directory of the program being debugged. Default is the root directory of the file.', + description: '(Optional) Absolute path to the working directory of the program being debugged. Default is the root directory of the file.', required: true, - visible: true, + visible: true }; const args = { name: 'args', @@ -86,7 +129,7 @@ export function getPythonAutoGenConfig(): AutoGenConfig { description: 'Command line arguments passed to the program', defaultValue: [], required: false, - visible: true, + visible: true }; const stopOnEntry = { name: 'stopOnEntry', @@ -94,7 +137,7 @@ export function getPythonAutoGenConfig(): AutoGenConfig { description: 'Automatically stop after launch.', defaultValue: false, required: false, - visible: true, + visible: true }; const debugOptions = { name: 'debugOptions', @@ -103,16 +146,15 @@ export function getPythonAutoGenConfig(): AutoGenConfig { description: 'Advanced options, view read me for further details.', defaultValue: ['WaitOnAbnormalExit', 'WaitOnNormalExit', 'RedirectOutput'], required: false, - visible: false, + visible: false }; const env = { name: 'env', type: 'object', - description: - '(Optional) Environment variables (e.g. SHELL=/bin/bash PATH=/bin)', + description: '(Optional) Environment variables (e.g. SHELL=/bin/bash PATH=/bin)', defaultValue: {}, required: false, - visible: true, + visible: true }; const consoleEnum = { name: 'console', @@ -121,55 +163,39 @@ export function getPythonAutoGenConfig(): AutoGenConfig { description: '', defaultValue: 'internalConsole', required: true, - visible: true, + visible: true }; - return { launch: { launch: true, - vsAdapterType: VsAdapterTypes.PYTHON, - properties: [ - program, - pythonPath, - cwd, - args, - stopOnEntry, - debugOptions, - env, - consoleEnum, - ], + vsAdapterType: _nuclideDebuggerCommon().VsAdapterTypes.PYTHON, + properties: [program, pythonPath, cwd, args, stopOnEntry, debugOptions, env, consoleEnum], scriptPropertyName: 'program', scriptExtension: '.py', cwdPropertyName: 'cwd', - header: isNuclideEnvironment() ? ( -
- ) : null, + header: isNuclideEnvironment() ? React.createElement("p", null, "This is intended to debug python script files.", React.createElement("br", null), "To debug buck targets, you should", ' ', React.createElement("a", { + href: NUCLIDE_PYTHON_DEBUGGER_DEX_URI + }, "use the buck toolbar instead"), ".") : null, + getProcessName(values) { let processName = values.program; const lastSlash = processName.lastIndexOf('/'); + if (lastSlash >= 0) { - processName = processName.substring( - lastSlash + 1, - processName.length, - ); + processName = processName.substring(lastSlash + 1, processName.length); } + processName += ' (Python)'; return processName; - }, + } + }, - attach: null, + attach: null }; } -function isNuclideEnvironment(): boolean { +function isNuclideEnvironment() { return atom.packages.isPackageLoaded('nuclide'); } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-debugger-python/utils.js b/modules/atom-ide-debugger-python/utils.js index 92e402d8b3..2a40f9876f 100644 --- a/modules/atom-ide-debugger-python/utils.js +++ b/modules/atom-ide-debugger-python/utils.js @@ -1,3 +1,118 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.setRpcService = setRpcService; +exports.listenToRemoteDebugCommands = listenToRemoteDebugCommands; +exports.getRemoteDebuggerCommandServiceByNuclideUri = getRemoteDebuggerCommandServiceByNuclideUri; + +function _debugger() { + const data = require("../nuclide-commons-atom/debugger"); + + _debugger = function () { + return data; + }; + + return data; +} + +function _projects() { + const data = require("../nuclide-commons-atom/projects"); + + _projects = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _observable() { + const data = require("../nuclide-commons/observable"); + + _observable = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _analytics() { + const data = require("../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function RemoteDebuggerCommandServiceLocal() { + const data = _interopRequireWildcard(require("./RemoteDebuggerCommandService")); + + RemoteDebuggerCommandServiceLocal = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _log4js() { + const data = require("log4js"); + + _log4js = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,166 +121,119 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +let _rpcService = null; -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; -import type { - PythonDebuggerAttachTarget, - RemoteDebugCommandRequest, -} from './RemoteDebuggerCommandService'; -import type {IProcessConfig} from 'nuclide-debugger-common'; -import typeof * as RemoteDebuggerCommandService from './RemoteDebuggerCommandService'; - -import {getDebuggerService} from 'nuclide-commons-atom/debugger'; -import {observeAddedHostnames} from 'nuclide-commons-atom/projects'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {fastDebounce} from 'nuclide-commons/observable'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {VsAdapterTypes} from 'nuclide-debugger-common'; -import {Observable} from 'rxjs'; -import {track} from 'nuclide-commons/analytics'; -import * as RemoteDebuggerCommandServiceLocal from './RemoteDebuggerCommandService'; -import nullthrows from 'nullthrows'; -import {getLogger} from 'log4js'; - -let _rpcService: ?nuclide$RpcService = null; - -function getPythonAttachTargetProcessConfig( - targetRootUri: NuclideUri, - target: PythonDebuggerAttachTarget, -): IProcessConfig { +function getPythonAttachTargetProcessConfig(targetRootUri, target) { return { targetUri: targetRootUri, debugMode: 'attach', - adapterType: VsAdapterTypes.PYTHON, + adapterType: _nuclideDebuggerCommon().VsAdapterTypes.PYTHON, config: getPythonAttachTargetConfig(target), - servicedFileExtensions: ['py'], + servicedFileExtensions: ['py'] }; } -function getPythonAttachTargetConfig( - target: PythonDebuggerAttachTarget, -): Object { +function getPythonAttachTargetConfig(target) { return { localRoot: target.localRoot, remoteRoot: target.remoteRoot, port: target.port, - host: '127.0.0.1', + host: '127.0.0.1' }; } -export function setRpcService(rpcService: nuclide$RpcService): IDisposable { +function setRpcService(rpcService) { _rpcService = rpcService; - return new UniversalDisposable(() => { + return new (_UniversalDisposable().default)(() => { _rpcService = null; }); } -export function listenToRemoteDebugCommands(): IDisposable { - const addedHostnames = observeAddedHostnames().startWith('local'); - +function listenToRemoteDebugCommands() { + const addedHostnames = (0, _projects().observeAddedHostnames)().startWith('local'); const remoteDebuggerServices = addedHostnames.flatMap(hostname => { - const rootUri = - hostname === 'local' ? '' : nuclideUri.createRemoteUri(hostname, '/'); + const rootUri = hostname === 'local' ? '' : _nuclideUri().default.createRemoteUri(hostname, '/'); const service = getRemoteDebuggerCommandServiceByNuclideUri(rootUri); + if (service == null) { - getLogger().error('null remote command service for uri:', rootUri); - return Observable.empty(); + (0, _log4js().getLogger)().error('null remote command service for uri:', rootUri); + return _rxjsCompatUmdMin.Observable.empty(); } else { - return Observable.of({service, rootUri}); + return _rxjsCompatUmdMin.Observable.of({ + service, + rootUri + }); } }); - - return new UniversalDisposable( - remoteDebuggerServices - .flatMap(({service, rootUri}) => { - return service - .observeAttachDebugTargets() - .refCount() - .map(targets => findDuplicateAttachTargetIds(targets)); - }) - - .subscribe(duplicateTargetIds => - notifyDuplicateDebugTargets(duplicateTargetIds), - ), - remoteDebuggerServices - .flatMap(({service, rootUri}) => { - return service - .observeRemoteDebugCommands() - .refCount() - .catch(error => { - // eslint-disable-next-line no-console - console.warn( - 'Failed to listen to remote debug commands - ' + - 'You could be running locally with two Atom windows. ' + - `IsLocal: ${String(rootUri === '')}`, - ); - return Observable.empty(); - }) - .map((command: RemoteDebugCommandRequest) => ({rootUri, command})); - }) - .let(fastDebounce(500)) - .subscribe(async ({rootUri, command}) => { - const attachProcessConfig = getPythonAttachTargetProcessConfig( - rootUri, - command.target, - ); - const debuggerService = await getDebuggerService(); - track('fb-python-debugger-auto-attach'); - debuggerService.startVspDebugging(attachProcessConfig); - // Otherwise, we're already debugging that target. - }), - ); + return new (_UniversalDisposable().default)(remoteDebuggerServices.flatMap(({ + service, + rootUri + }) => { + return service.observeAttachDebugTargets().refCount().map(targets => findDuplicateAttachTargetIds(targets)); + }).subscribe(duplicateTargetIds => notifyDuplicateDebugTargets(duplicateTargetIds)), remoteDebuggerServices.flatMap(({ + service, + rootUri + }) => { + return service.observeRemoteDebugCommands().refCount().catch(error => { + // eslint-disable-next-line no-console + console.warn('Failed to listen to remote debug commands - ' + 'You could be running locally with two Atom windows. ' + `IsLocal: ${String(rootUri === '')}`); + return _rxjsCompatUmdMin.Observable.empty(); + }).map(command => ({ + rootUri, + command + })); + }).let((0, _observable().fastDebounce)(500)).subscribe(async ({ + rootUri, + command + }) => { + const attachProcessConfig = getPythonAttachTargetProcessConfig(rootUri, command.target); + const debuggerService = await (0, _debugger().getDebuggerService)(); + (0, _analytics().track)('fb-python-debugger-auto-attach'); + debuggerService.startVspDebugging(attachProcessConfig); // Otherwise, we're already debugging that target. + })); } let shouldNotifyDuplicateTargets = true; let duplicateTargetsNotification; -function notifyDuplicateDebugTargets(duplicateTargetIds: Set): void { - if ( - duplicateTargetIds.size > 0 && - shouldNotifyDuplicateTargets && - duplicateTargetsNotification == null - ) { +function notifyDuplicateDebugTargets(duplicateTargetIds) { + if (duplicateTargetIds.size > 0 && shouldNotifyDuplicateTargets && duplicateTargetsNotification == null) { const formattedIds = Array.from(duplicateTargetIds).join(', '); - duplicateTargetsNotification = atom.notifications.addInfo( - `Debugger: duplicate attach targets: \`${formattedIds}\``, - { - buttons: [ - { - onDidClick: () => { - shouldNotifyDuplicateTargets = false; - if (duplicateTargetsNotification != null) { - duplicateTargetsNotification.dismiss(); - } - }, - text: 'Ignore', - }, - ], - description: - `Nuclide debugger detected duplicate attach targets with ids (${formattedIds}) ` + - 'That could be instagram running multiple processes - check out https://our.intern.facebook.com/intern/dex/instagram-server/debugging-with-nuclide/', - dismissable: true, - }, - ); + duplicateTargetsNotification = atom.notifications.addInfo(`Debugger: duplicate attach targets: \`${formattedIds}\``, { + buttons: [{ + onDidClick: () => { + shouldNotifyDuplicateTargets = false; + + if (duplicateTargetsNotification != null) { + duplicateTargetsNotification.dismiss(); + } + }, + text: 'Ignore' + }], + description: `Nuclide debugger detected duplicate attach targets with ids (${formattedIds}) ` + 'That could be instagram running multiple processes - check out https://our.intern.facebook.com/intern/dex/instagram-server/debugging-with-nuclide/', + dismissable: true + }); duplicateTargetsNotification.onDidDismiss(() => { duplicateTargetsNotification = null; }); } } -function findDuplicateAttachTargetIds( - targets: Array, -): Set { +function findDuplicateAttachTargetIds(targets) { const targetIds = new Set(); const duplicateTargetIds = new Set(); targets.forEach(target => { - const {id} = target; + const { + id + } = target; + if (id == null) { return; } + if (targetIds.has(id)) { duplicateTargetIds.add(id); } else { @@ -175,15 +243,10 @@ function findDuplicateAttachTargetIds( return duplicateTargetIds; } -export function getRemoteDebuggerCommandServiceByNuclideUri( - uri: NuclideUri, -): RemoteDebuggerCommandService { - if (_rpcService == null && !nuclideUri.isRemote(uri)) { - return RemoteDebuggerCommandServiceLocal; +function getRemoteDebuggerCommandServiceByNuclideUri(uri) { + if (_rpcService == null && !_nuclideUri().default.isRemote(uri)) { + return RemoteDebuggerCommandServiceLocal(); } - return nullthrows(_rpcService).getServiceByNuclideUri( - 'RemoteDebuggerCommandService', - uri, - ); -} + return (0, _nullthrows().default)(_rpcService).getServiceByNuclideUri('RemoteDebuggerCommandService', uri); +} \ No newline at end of file diff --git a/modules/atom-ide-debugger-react-native/main.js b/modules/atom-ide-debugger-react-native/main.js index 35dbe85c6a..b653b83b4b 100644 --- a/modules/atom-ide-debugger-react-native/main.js +++ b/modules/atom-ide-debugger-react-native/main.js @@ -1,3 +1,62 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.resolveConfiguration = resolveConfiguration; + +function _createPackage() { + const data = _interopRequireDefault(require("../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _AutoGenLaunchAttachProvider() { + const data = require("../nuclide-debugger-common/AutoGenLaunchAttachProvider"); + + _AutoGenLaunchAttachProvider = function () { + return data; + }; + + return data; +} + +function _nuclideDebuggerCommon() { + const data = require("../nuclide-debugger-common"); + + _nuclideDebuggerCommon = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,115 +65,81 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type { - AutoGenConfig, - NuclideDebuggerProvider, - DebuggerConfigurationProvider, - AutoGenProperty, - IProcessConfig, -} from 'nuclide-debugger-common/types'; -import type {GatekeeperService} from 'nuclide-commons-atom/types'; - -import createPackage from 'nuclide-commons-atom/createPackage'; - -import nuclideUri from 'nuclide-commons/nuclideUri'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {AutoGenLaunchAttachProvider} from 'nuclide-debugger-common/AutoGenLaunchAttachProvider'; -import {VsAdapterNames, VsAdapterTypes} from 'nuclide-debugger-common'; - class Activation { - _gkService: ?GatekeeperService; - constructor() { this._gkService = null; } dispose() {} - createDebuggerProvider(): NuclideDebuggerProvider { + createDebuggerProvider() { return { - type: VsAdapterTypes.REACT_NATIVE, + type: _nuclideDebuggerCommon().VsAdapterTypes.REACT_NATIVE, getLaunchAttachProvider: connection => { - return new AutoGenLaunchAttachProvider( - VsAdapterNames.REACT_NATIVE, - connection, - getReactNativeConfig(), - async () => { - // This debugger is enabled for non-Facebook users, and Facebook - // users inside the Gatekeeper nuclide_debugger_reactnative - return this._gkService == null - ? Promise.resolve(true) - : this._gkService.passesGK('nuclide_debugger_reactnative'); - }, - ); - }, + return new (_AutoGenLaunchAttachProvider().AutoGenLaunchAttachProvider)(_nuclideDebuggerCommon().VsAdapterNames.REACT_NATIVE, connection, getReactNativeConfig(), async () => { + // This debugger is enabled for non-Facebook users, and Facebook + // users inside the Gatekeeper nuclide_debugger_reactnative + return this._gkService == null ? Promise.resolve(true) : this._gkService.passesGK('nuclide_debugger_reactnative'); + }); + } }; } - consumeGatekeeperService(service: GatekeeperService): IDisposable { + consumeGatekeeperService(service) { this._gkService = service; - return new UniversalDisposable(() => (this._gkService = null)); + return new (_UniversalDisposable().default)(() => this._gkService = null); } - createDebuggerConfigurator(): Array { - return [ - { - resolveConfiguration, - adapterType: VsAdapterTypes.REACT_NATIVE, - }, - ]; + createDebuggerConfigurator() { + return [{ + resolveConfiguration, + adapterType: _nuclideDebuggerCommon().VsAdapterTypes.REACT_NATIVE + }]; } + } -function _deriveProgramFromWorkspace(workspacePath: string): string { - return nuclideUri.getPath( - nuclideUri.join(workspacePath, '.vscode', 'launchReactNative.js'), - ); +function _deriveProgramFromWorkspace(workspacePath) { + return _nuclideUri().default.getPath(_nuclideUri().default.join(workspacePath, '.vscode', 'launchReactNative.js')); } -function _deriveOutDirFromWorkspace(workspacePath: string): string { - return nuclideUri.getPath( - nuclideUri.join(workspacePath, '.vscode', '.react'), - ); +function _deriveOutDirFromWorkspace(workspacePath) { + return _nuclideUri().default.getPath(_nuclideUri().default.join(workspacePath, '.vscode', '.react')); } -function getReactNativeConfig(): AutoGenConfig { +function getReactNativeConfig() { const workspace = { name: 'workspace', type: 'string', description: 'Absolute path containing package.json', required: true, - visible: true, + visible: true }; const sourceMaps = { name: 'sourceMaps', type: 'boolean', - description: - 'Whether to use JavaScript source maps to map the generated bundled code back to its original sources', + description: 'Whether to use JavaScript source maps to map the generated bundled code back to its original sources', defaultValue: false, required: false, - visible: true, + visible: true }; const outDir = { name: 'outDir', type: 'string', - description: - 'The location of the generated JavaScript code (the bundle file). Normally this should be "${workspaceRoot}/.vscode/.react"', + description: 'The location of the generated JavaScript code (the bundle file). Normally this should be "${workspaceRoot}/.vscode/.react"', required: false, - visible: true, + visible: true }; const sourceMapPathOverrides = { name: 'sourceMapPathOverrides', type: 'json', - description: - 'A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk. See README for details.', + description: 'A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk. See README for details.', defaultValue: {}, required: false, - visible: true, + visible: true }; const port = { name: 'port', @@ -122,17 +147,9 @@ function getReactNativeConfig(): AutoGenConfig { description: 'Debug port to attach to. Default is 8081.', defaultValue: 8081, required: false, - visible: true, + visible: true }; - - const attachProperties: AutoGenProperty[] = [ - workspace, - sourceMaps, - outDir, - sourceMapPathOverrides, - port, - ]; - + const attachProperties = [workspace, sourceMaps, outDir, sourceMapPathOverrides, port]; const platform = { name: 'platform', type: 'enum', @@ -140,7 +157,7 @@ function getReactNativeConfig(): AutoGenConfig { description: '', defaultValue: 'ios', required: true, - visible: true, + visible: true }; const target = { name: 'target', @@ -149,51 +166,54 @@ function getReactNativeConfig(): AutoGenConfig { description: '', defaultValue: 'simulator', required: true, - visible: true, + visible: true }; - const launchProperties = [platform, target].concat(attachProperties); - return { launch: { launch: true, - vsAdapterType: VsAdapterTypes.REACT_NATIVE, + vsAdapterType: _nuclideDebuggerCommon().VsAdapterTypes.REACT_NATIVE, properties: launchProperties, scriptPropertyName: null, cwdPropertyName: 'workspace', scriptExtension: '.js', header: null, + getProcessName(values) { return 'Port: ' + values.port + ' (React Native)'; - }, + } + }, attach: { launch: false, - vsAdapterType: VsAdapterTypes.REACT_NATIVE, + vsAdapterType: _nuclideDebuggerCommon().VsAdapterTypes.REACT_NATIVE, properties: attachProperties, cwdPropertyName: 'workspace', scriptExtension: '.js', header: null, + getProcessName(values) { return 'Port: ' + values.port + ' (React Native)'; - }, - }, + } + + } }; } -export async function resolveConfiguration( - configuration: IProcessConfig, -): Promise { - const {config} = configuration; +async function resolveConfiguration(configuration) { + const { + config + } = configuration; + if (config.outDir == null) { config.outDir = _deriveOutDirFromWorkspace(config.workspace); } + config.program = _deriveProgramFromWorkspace(config.workspace); delete config.workspace; - return { - ...configuration, - servicedFileExtensions: ['js'], - }; + return Object.assign({}, configuration, { + servicedFileExtensions: ['js'] + }); } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-ui/DEVELOPMENT b/modules/atom-ide-ui/DEVELOPMENT deleted file mode 100644 index e27a0b58b0..0000000000 --- a/modules/atom-ide-ui/DEVELOPMENT +++ /dev/null @@ -1,3 +0,0 @@ -This file exists to indicate that the source should be transpiled. - -During publishing, all files are pre-transpiled and this file is ignored. diff --git a/modules/atom-ide-ui/__atom_tests__/empty-test.js b/modules/atom-ide-ui/__atom_tests__/empty-test.js index 37a20fddbc..9015bd5c56 100644 --- a/modules/atom-ide-ui/__atom_tests__/empty-test.js +++ b/modules/atom-ide-ui/__atom_tests__/empty-test.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,10 +8,10 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ test('test', () => { expect(2).toMatchSnapshot(); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/__tests__/empty-test.js b/modules/atom-ide-ui/__tests__/empty-test.js index eef20c8011..e98d7389a4 100644 --- a/modules/atom-ide-ui/__tests__/empty-test.js +++ b/modules/atom-ide-ui/__tests__/empty-test.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,10 +8,10 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ test('test', () => { expect(1).toMatchSnapshot(); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/index.js b/modules/atom-ide-ui/index.js index 740ee51bb0..f66bb9189d 100644 --- a/modules/atom-ide-ui/index.js +++ b/modules/atom-ide-ui/index.js @@ -1,135 +1,21 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -export type { - BusySignalOptions, - BusySignalService, -} from './pkg/atom-ide-busy-signal/lib/types'; - -export type { - CodeAction, - CodeActionProvider, -} from './pkg/atom-ide-code-actions/lib/types'; - -export type { - CodeFormatProvider, - RangeCodeFormatProvider, - FileCodeFormatProvider, - OnTypeCodeFormatProvider, - OnSaveCodeFormatProvider, -} from './pkg/atom-ide-code-format/lib/types'; - -export type { - CodeHighlightProvider, -} from './pkg/atom-ide-code-highlight/lib/types'; - -export type { - Datatip, - DatatipProvider, - DatatipService, - MarkedString, - ModifierDatatipProvider, - ModifierKey, -} from './pkg/atom-ide-datatip/lib/types'; - -export type { - Definition, - DefinitionProvider, - DefinitionPreviewProvider, - DefinitionQueryResult, -} from './pkg/atom-ide-definitions/lib/types'; - -export type { - CallbackDiagnosticProvider, - DiagnosticFix, - DiagnosticInvalidationCallback, - DiagnosticInvalidationMessage, - DiagnosticMessage, - DiagnosticMessages, - DiagnosticMessageKind, - DiagnosticMessageType, - DiagnosticProvider, - DiagnosticProviderUpdate, - DiagnosticTrace, - DiagnosticUpdater, - DiagnosticUpdateCallback, - IndieLinterDelegate, - LinterMessage, - LinterMessageV1, - LinterMessageV2, - LinterProvider, - LinterTrace, - ObservableDiagnosticProvider, - RegisterIndieLinter, -} from './pkg/atom-ide-diagnostics/lib/types'; - -export type { - FindReferencesProvider, - FindReferencesReturn, - Reference, -} from './pkg/atom-ide-find-references/lib/types'; - -export type { - AvailableRefactoring, - RefactorResponse, - RefactorProvider, - RefactorRequest, - RenameReturn, - RenameData, - RenameError, -} from './pkg/atom-ide-refactor/lib/types'; - -export type { - Outline, - OutlineProvider, - OutlineTree, - ResultsStreamProvider, -} from './pkg/atom-ide-outline-view/lib/types'; - -export type { - Signature, - SignatureHelp, - SignatureHelpProvider, - SignatureHelpRegistry, - SignatureParameter, -} from './pkg/atom-ide-signature-help/lib/types'; - -export type { - HyperclickProvider, - HyperclickSuggestion, -} from './pkg/hyperclick/lib/types'; - -export type { - ConsoleService, - ConsoleApi, - Level as ConsoleLevel, - Message as ConsoleMessage, - SourceInfo as ConsoleSourceInfo, - ConsoleSourceStatus, -} from './pkg/atom-ide-console/lib/types'; - -// Deprecated console types. Exported only for legacy users. -export type {RegisterExecutorFunction} from './pkg/atom-ide-console/lib/types'; - -export { - RemoteDebuggerService as DebuggerService, -} from './pkg/atom-ide-debugger/lib/types'; - -export type { - TerminalInfo, - TerminalInstance, - TerminalApi, -} from './pkg/atom-ide-terminal/lib/types'; - -export type { - Command as TerminalCommand, -} from './pkg/atom-ide-terminal/lib/pty-service/rpc-types'; +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "DebuggerService", { + enumerable: true, + get: function () { + return _types().RemoteDebuggerService; + } +}); + +function _types() { + const data = require("./pkg/atom-ide-debugger/lib/types"); + + _types = function () { + return data; + }; + + return data; +} \ No newline at end of file diff --git a/modules/atom-ide-ui/jest.config.atom.js b/modules/atom-ide-ui/jest.config.atom.js index 6e7928cefa..7c614e9688 100644 --- a/modules/atom-ide-ui/jest.config.atom.js +++ b/modules/atom-ide-ui/jest.config.atom.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,17 +8,16 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ /* eslint-disable nuclide-internal/no-commonjs */ -/* eslint-disable nuclide-internal/modules-dependencies */ -const nodeConfig = require('../../jest/jest.config.atom'); +/* eslint-disable nuclide-internal/modules-dependencies */ +const nodeConfig = require("../../jest/jest.config.atom"); -module.exports = { - ...nodeConfig, +module.exports = Object.assign({}, nodeConfig, { rootDir: './', - roots: [''], -}; + roots: [''] +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/jest.config.js b/modules/atom-ide-ui/jest.config.js index 86dc8edbd4..a617a1a982 100644 --- a/modules/atom-ide-ui/jest.config.js +++ b/modules/atom-ide-ui/jest.config.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,14 +8,13 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ /* eslint-disable nuclide-internal/no-commonjs */ - module.exports = { rootDir: './', projects: ['/jest.config.atom.js', '/jest.config.node.js'], - testFailureExitCode: 0, -}; + testFailureExitCode: 0 +}; \ No newline at end of file diff --git a/modules/atom-ide-ui/jest.config.node.js b/modules/atom-ide-ui/jest.config.node.js index a49676e259..d8bb8d4dbc 100644 --- a/modules/atom-ide-ui/jest.config.node.js +++ b/modules/atom-ide-ui/jest.config.node.js @@ -1,3 +1,5 @@ +"use strict"; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,17 +8,16 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ /* eslint-disable nuclide-internal/no-commonjs */ -/* eslint-disable nuclide-internal/modules-dependencies */ -const nodeConfig = require('../../jest/jest.config.node'); +/* eslint-disable nuclide-internal/modules-dependencies */ +const nodeConfig = require("../../jest/jest.config.node"); -module.exports = { - ...nodeConfig, +module.exports = Object.assign({}, nodeConfig, { rootDir: './', - roots: [''], -}; + roots: [''] +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/__atom_tests__/BusySignalInstance-test.js b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/__atom_tests__/BusySignalInstance-test.js index 3f29ea0dd0..6d31219365 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/__atom_tests__/BusySignalInstance-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/__atom_tests__/BusySignalInstance-test.js @@ -1,3 +1,47 @@ +"use strict"; + +function _fsPromise() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/fsPromise")); + + _fsPromise = function () { + return data; + }; + + return data; +} + +function _MessageStore() { + const data = require("../lib/MessageStore"); + + _MessageStore = function () { + return data; + }; + + return data; +} + +function _BusySignalSingleton() { + const data = _interopRequireDefault(require("../lib/BusySignalSingleton")); + + _BusySignalSingleton = function () { + return data; + }; + + return data; +} + +function _waits_for() { + const data = _interopRequireDefault(require("../../../../../jest/waits_for")); + + _waits_for = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,144 +50,100 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format * @emails oncall+nuclide */ -import type {BusySignalOptions} from '../lib/types'; - -import fsPromise from 'nuclide-commons/fsPromise'; -import {MessageStore} from '../lib/MessageStore'; -import BusySignalSingleton from '../lib/BusySignalSingleton'; -import waitsFor from '../../../../../jest/waits_for'; - describe('BusySignalSingleton', () => { - let messageStore: MessageStore; - let singleton: BusySignalSingleton; - let messages: Array>; - const options: BusySignalOptions = {debounce: false}; - + let messageStore; + let singleton; + let messages; + const options = { + debounce: false + }; beforeEach(() => { - messageStore = new MessageStore(); - singleton = new BusySignalSingleton(messageStore); + messageStore = new (_MessageStore().MessageStore)(); + singleton = new (_BusySignalSingleton().default)(messageStore); messages = []; - messageStore - .getMessageStream() - .skip(1) - .subscribe(elements => { - const strings = [...elements].map(element => { - const titleElement = element.getTitleElement(); - const child = - titleElement != null && titleElement.childNodes.length >= 1 - ? titleElement.childNodes[0] - : {}; - return child.data != null && typeof child.data === 'string' - ? child.data - : ''; - }); - messages.push(strings); + messageStore.getMessageStream().skip(1).subscribe(elements => { + const strings = [...elements].map(element => { + const titleElement = element.getTitleElement(); + const child = titleElement != null && titleElement.childNodes.length >= 1 ? titleElement.childNodes[0] : {}; + return child.data != null && typeof child.data === 'string' ? child.data : ''; }); + messages.push(strings); + }); }); - it('should record messages before and after a call', async () => { expect(messages.length).toBe(0); singleton.reportBusyWhile('foo', () => Promise.resolve(5), options); expect(messages.length).toBe(1); - await waitsFor( - () => messages.length === 2, - 'It should publish a second message', - 100, - ); + await (0, _waits_for().default)(() => messages.length === 2, 'It should publish a second message', 100); }); - it("should send the 'done' message even if the promise rejects", async () => { - singleton - .reportBusyWhile('foo', () => Promise.reject(new Error()), options) - .catch(() => {}); + singleton.reportBusyWhile('foo', () => Promise.reject(new Error()), options).catch(() => {}); expect(messages.length).toBe(1); - await waitsFor( - () => messages.length === 2, - 'It should publish a second message', - 100, - ); + await (0, _waits_for().default)(() => messages.length === 2, 'It should publish a second message', 100); }); - it('should properly display duplicate messages', () => { const dispose1 = singleton.reportBusy('foo', options); expect(messages.length).toBe(1); expect(messages[0]).toEqual(['foo']); - const dispose2 = singleton.reportBusy('foo', options); expect(messages.length).toBe(2); expect(messages[1]).toEqual(['foo', 'foo']); - dispose2.dispose(); expect(messages.length).toBe(3); expect(messages[2]).toEqual(['foo']); - dispose1.dispose(); expect(messages.length).toBe(4); expect(messages[3]).toEqual([]); }); - describe('when onlyForFile is provided', () => { - let editor1: atom$TextEditor = (null: any); - let editor2: atom$TextEditor = (null: any); - let editor3: atom$TextEditor = (null: any); + let editor1 = null; + let editor2 = null; + let editor3 = null; let file2; - beforeEach(async () => { - editor1 = await atom.workspace.open(await fsPromise.tempfile()); - file2 = await fsPromise.tempfile(); + editor1 = await atom.workspace.open((await _fsPromise().default.tempfile())); + file2 = await _fsPromise().default.tempfile(); editor2 = await atom.workspace.open(file2); editor3 = await atom.workspace.open(); }); - afterEach(() => { [editor1, editor2, editor3].forEach(editor => editor.destroy()); }); - it('should only display for the proper text editor', () => { atom.workspace.getActivePane().activateItem(editor1); - - const disposable = singleton.reportBusy('foo', { - onlyForFile: file2, - ...options, - }); + const disposable = singleton.reportBusy('foo', Object.assign({ + onlyForFile: file2 + }, options)); expect(messages).toEqual([]); - atom.workspace.getActivePane().activateItem(editor2); expect(messages.length).toBe(1); expect(messages[0]).toEqual(['foo']); - atom.workspace.getActivePane().activateItem(editor3); expect(messages.length).toBe(2); expect(messages[1]).toEqual([]); - atom.workspace.getActivePane().activateItem(editor2); expect(messages.length).toBe(3); expect(messages[2]).toEqual(['foo']); - disposable.dispose(); expect(messages.length).toBe(4); expect(messages[3]).toEqual([]); }); }); - it('correctly sets revealTooltip when provided', async () => { function getCurrentMessages() { - return messageStore - .getMessageStream() - .take(1) - .toPromise(); + return messageStore.getMessageStream().take(1).toPromise(); } singleton.reportBusy('foo', { debounce: false, - revealTooltip: true, + revealTooltip: true }); const curMessages = await getCurrentMessages(); expect(curMessages.length).toBe(1); expect(curMessages[0].shouldRevealTooltip()).toBe(true); }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusyMessageInstance.js b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusyMessageInstance.js index cec5474a73..99be03e399 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusyMessageInstance.js +++ b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusyMessageInstance.js @@ -1,3 +1,22 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.BusyMessageInstance = void 0; + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,36 +25,18 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {BusyMessage} from './types'; - -import invariant from 'assert'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; - -export class BusyMessageInstance { +class BusyMessageInstance { // These things are set at construction-time: - _publishCallback: () => void; - _creationOrder: number; - _waitingFor: 'computer' | 'user'; - _onDidClick: ?() => void; - _disposables: UniversalDisposable; - _titleElement: HTMLElement = document.createElement('span'); // These things might be modified afterwards: - _currentTitle: ?string = null; - _isVisibleForDebounce: boolean = true; - _isVisibleForFile: boolean = true; - _revealTooltip: boolean = false; - - constructor( - publishCallback: () => void, - creationOrder: number, - waitingFor: 'computer' | 'user', - onDidClick: ?() => void, - disposables: UniversalDisposable, - ) { + constructor(publishCallback, creationOrder, waitingFor, onDidClick, disposables) { + this._titleElement = document.createElement('span'); + this._currentTitle = null; + this._isVisibleForDebounce = true; + this._isVisibleForFile = true; + this._revealTooltip = false; this._publishCallback = publishCallback; this._creationOrder = creationOrder; this._waitingFor = waitingFor; @@ -43,75 +44,94 @@ export class BusyMessageInstance { this._disposables = disposables; } - get waitingFor(): 'computer' | 'user' { + get waitingFor() { return this._waitingFor; } - setTitle(val: string): void { - invariant(!this._disposables.disposed); + setTitle(val) { + if (!!this._disposables.disposed) { + throw new Error("Invariant violation: \"!this._disposables.disposed\""); + } + if (this._currentTitle === val) { return; } + this._currentTitle = val; + while (this._titleElement.firstChild != null) { this._titleElement.removeChild(this._titleElement.firstChild); } + if (this._onDidClick == null) { this._titleElement.appendChild(document.createTextNode(val)); } else { const anchor = document.createElement('a'); anchor.onclick = this._onDidClick; anchor.appendChild(document.createTextNode(val)); + this._titleElement.appendChild(anchor); } + if (this.isVisible()) { this._publishCallback(); } } - getTitleElement(): ?HTMLElement { + getTitleElement() { return this._titleElement; } - setIsVisibleForDebounce(val: boolean): void { - invariant(!this._disposables.disposed); + setIsVisibleForDebounce(val) { + if (!!this._disposables.disposed) { + throw new Error("Invariant violation: \"!this._disposables.disposed\""); + } + this._isVisibleForDebounce = val; + this._publishCallback(); } - setIsVisibleForFile(val: boolean): void { - invariant(!this._disposables.disposed); + setIsVisibleForFile(val) { + if (!!this._disposables.disposed) { + throw new Error("Invariant violation: \"!this._disposables.disposed\""); + } + this._isVisibleForFile = val; + this._publishCallback(); } - isVisible(): boolean { - invariant(!this._disposables.disposed); - return ( - this._isVisibleForFile && - this._isVisibleForDebounce && - this._currentTitle != null - ); + isVisible() { + if (!!this._disposables.disposed) { + throw new Error("Invariant violation: \"!this._disposables.disposed\""); + } + + return this._isVisibleForFile && this._isVisibleForDebounce && this._currentTitle != null; } - setRevealTooltip(val: boolean): void { + setRevealTooltip(val) { this._revealTooltip = val; } - shouldRevealTooltip(): boolean { + shouldRevealTooltip() { return this._revealTooltip; } - compare(that: BusyMessageInstance): number { + compare(that) { return this._creationOrder - that._creationOrder; } - dispose(): void { + dispose() { this._disposables.dispose(); + this._currentTitle = null; + this._publishCallback(); } -} -// This is how we declare that a type fulfills an interface in Flow: -(((null: any): BusyMessageInstance): BusyMessage); +} // This is how we declare that a type fulfills an interface in Flow: + + +exports.BusyMessageInstance = BusyMessageInstance; +null; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusySignalSingleton.js b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusySignalSingleton.js index 8de7bfb64c..e6c937af2f 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusySignalSingleton.js +++ b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/BusySignalSingleton.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,26 +13,19 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {BusySignalOptions, BusyMessage} from './types'; -import type {MessageStore} from './MessageStore'; - -export default class BusySignalSingleton { - _messageStore: MessageStore; - - constructor(messageStore: MessageStore) { +class BusySignalSingleton { + constructor(messageStore) { this._messageStore = messageStore; } dispose() {} - reportBusy(title: string, options?: BusySignalOptions): BusyMessage { + reportBusy(title, options) { return this._messageStore.add(title, options || {}); } - /** * Publishes a 'busy' message with the given string. Marks it as done when the * promise returned by the given function is resolved or rejected. @@ -33,16 +33,18 @@ export default class BusySignalSingleton { * Used to indicate that some work is ongoing while the given asynchronous * function executes. */ - async reportBusyWhile( - title: string, - f: () => Promise, - options?: BusySignalOptions, - ): Promise { + + + async reportBusyWhile(title, f, options) { const busySignal = this.reportBusy(title, options); + try { return await f(); } finally { busySignal.dispose(); } } + } + +exports.default = BusySignalSingleton; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/MessageStore.js b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/MessageStore.js index 7a54f563c7..7ffde45b9f 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/MessageStore.js +++ b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/MessageStore.js @@ -1,3 +1,44 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.MessageStore = void 0; + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _collection() { + const data = require("../../../../nuclide-commons/collection"); + + _collection = function () { + return data; + }; + + return data; +} + +function _BusyMessageInstance() { + const data = require("./BusyMessageInstance"); + + _BusyMessageInstance = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,100 +47,92 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {BusyMessage, BusySignalOptions} from './types'; - -import invariant from 'assert'; -import {Observable, BehaviorSubject} from 'rxjs'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {arrayEqual} from 'nuclide-commons/collection'; -import {BusyMessageInstance} from './BusyMessageInstance'; - // The "busy debounce delay" is for busy messages that were created with the // 'debounce' option set to true. The icon and tooltip message won't appear // until this many milliseconds have elapsed; if the busy message gets disposed // before this time, then the user won't see anything. const BUSY_DEBOUNCE_DELAY = 300; -export class MessageStore { - _counter: number = 0; - _messages: Set = new Set(); - _currentVisibleMessages: Array = []; - _messageStream: BehaviorSubject< - Array, - > = new BehaviorSubject([]); +class MessageStore { + constructor() { + this._counter = 0; + this._messages = new Set(); + this._currentVisibleMessages = []; + this._messageStream = new _rxjsCompatUmdMin.BehaviorSubject([]); + } - getMessageStream(): Observable> { + getMessageStream() { return this._messageStream; } - dispose(): void { + dispose() { const messagesToDispose = [...this._messages]; + for (const message of messagesToDispose) { message.dispose(); } - invariant(this._messages.size === 0); + + if (!(this._messages.size === 0)) { + throw new Error("Invariant violation: \"this._messages.size === 0\""); + } + this._messageStream.complete(); } - _publish(): void { - const visibleMessages = [...this._messages] - .filter(m => m.isVisible()) - .sort((m1, m2) => m1.compare(m2)); - - // We only send out on messageStream when the list of visible + _publish() { + const visibleMessages = [...this._messages].filter(m => m.isVisible()).sort((m1, m2) => m1.compare(m2)); // We only send out on messageStream when the list of visible // BusyMessageInstance object identities has changed, e.g. when ones // are made visible or invisible or new ones are created. We don't send // out just on title change. - if (!arrayEqual(this._currentVisibleMessages, visibleMessages)) { + + if (!(0, _collection().arrayEqual)(this._currentVisibleMessages, visibleMessages)) { this._messageStream.next(visibleMessages); + this._currentVisibleMessages = visibleMessages; } } - add(title: string, options: BusySignalOptions): BusyMessage { + add(title, options) { this._counter++; - const creationOrder = this._counter; - const waitingFor = - options != null && options.waitingFor != null - ? options.waitingFor - : 'computer'; + const waitingFor = options != null && options.waitingFor != null ? options.waitingFor : 'computer'; const onDidClick = options == null ? null : options.onDidClick; - const messageDisposables = new UniversalDisposable(); - - const message = new BusyMessageInstance( - this._publish.bind(this), - creationOrder, - waitingFor, - onDidClick, - messageDisposables, - ); + const messageDisposables = new (_UniversalDisposable().default)(); + const message = new (_BusyMessageInstance().BusyMessageInstance)(this._publish.bind(this), creationOrder, waitingFor, onDidClick, messageDisposables); + this._messages.add(message); - messageDisposables.add(() => this._messages.delete(message)); - // debounce defaults 'true' for busy-signal, and 'false' for action-required - const debounceRaw: ?boolean = options == null ? null : options.debounce; - const debounce: boolean = - debounceRaw == null ? waitingFor === 'computer' : debounceRaw; + messageDisposables.add(() => this._messages.delete(message)); // debounce defaults 'true' for busy-signal, and 'false' for action-required + + const debounceRaw = options == null ? null : options.debounce; + const debounce = debounceRaw == null ? waitingFor === 'computer' : debounceRaw; + if (debounce) { - message.setIsVisibleForDebounce(false); - // After the debounce time, we'll check whether the messageId is still + message.setIsVisibleForDebounce(false); // After the debounce time, we'll check whether the messageId is still // around (i.e. hasn't yet been disposed), and if so we'll display it. - let timeoutId = ((0: any): TimeoutID); + + let timeoutId = 0; + const teardown = () => clearTimeout(timeoutId); + timeoutId = setTimeout(() => { - invariant(!messageDisposables.disposed); - invariant(this._messages.has(message)); - // If the message was disposed, then it should have already called + if (!!messageDisposables.disposed) { + throw new Error("Invariant violation: \"!messageDisposables.disposed\""); + } + + if (!this._messages.has(message)) { + throw new Error("Invariant violation: \"this._messages.has(message)\""); + } // If the message was disposed, then it should have already called // clearTimeout, so this timeout handler shouldn't have been invoked. // And also the message should have been removed from this._messages. // So both tests above should necessary fail. // If the messageStore was disposed, then every message in it should // already have been disposed, as per above. + + messageDisposables.remove(teardown); message.setIsVisibleForDebounce(true); }, BUSY_DEBOUNCE_DELAY); @@ -110,10 +143,7 @@ export class MessageStore { message.setIsVisibleForFile(false); const file = options.onlyForFile; const teardown = atom.workspace.observeActivePaneItem(item => { - const activePane = - item != null && typeof item.getPath === 'function' - ? String(item.getPath()) - : null; + const activePane = item != null && typeof item.getPath === 'function' ? String(item.getPath()) : null; const newVisible = activePane === file; message.setIsVisibleForFile(newVisible); }); @@ -124,12 +154,13 @@ export class MessageStore { message.setRevealTooltip(true); } - message.setTitle(title); - - // Quick note that there aren't races in the above code! 'message' will not + message.setTitle(title); // Quick note that there aren't races in the above code! 'message' will not // be displayed until it has a title. So we can set visibility all we like, // and then when the title is set, it will display or not as appropriate. return message; } + } + +exports.MessageStore = MessageStore; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/StatusBarTile.js b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/StatusBarTile.js index 553e662c36..a2ea9bc63c 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/StatusBarTile.js +++ b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/StatusBarTile.js @@ -1,3 +1,58 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var React = _interopRequireWildcard(require("react")); + +var _reactDom = _interopRequireDefault(require("react-dom")); + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _collection() { + const data = require("../../../../nuclide-commons/collection"); + + _collection = function () { + return data; + }; + + return data; +} + +function _Icon() { + const data = require("../../../../nuclide-commons-ui/Icon"); + + _Icon = function () { + return data; + }; + + return data; +} + +function _BusyMessageInstance() { + const data = require("./BusyMessageInstance"); + + _BusyMessageInstance = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,125 +61,104 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {Observable} from 'rxjs'; - -import invariant from 'assert'; -import * as React from 'react'; -import ReactDOM from 'react-dom'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {arrayCompact} from 'nuclide-commons/collection'; -import {Icon} from 'nuclide-commons-ui/Icon'; -import {BusyMessageInstance} from './BusyMessageInstance'; - // We want to be the furthest left on the right side of the status bar so as not to leave a // conspicuous gap (or cause jitter) when nothing is busy. const STATUS_BAR_PRIORITY = 1000; -type Props = { - waitingForComputer: boolean, - waitingForUser: boolean, - onDidClick: ?() => void, -}; - -function StatusBarTileComponent(props: Props) { +function StatusBarTileComponent(props) { let element; + if (props.waitingForUser) { - element = ; + element = React.createElement(_Icon().Icon, { + className: "busy-signal-status-bar", + icon: "unverified" + }); } else if (props.waitingForComputer) { - element =
; + element = React.createElement("div", { + className: "busy-signal-status-bar loading-spinner-tiny" + }); } else { element = null; } if (props.onDidClick != null) { - element = {element}; + element = React.createElement("a", { + onClick: props.onDidClick + }, element); } return element; } -export default class StatusBarTile { - _item: HTMLElement; - _tile: atom$StatusBarTile; - _tooltip: ?IDisposable; - _disposables: UniversalDisposable; - _messages: Array = []; - _isMouseOverItem: boolean = false; - _isMouseOverTooltip: number = 0; - _leaveTimeoutId: ?TimeoutID; - - constructor( - statusBar: atom$StatusBar, - messageStream: Observable>, - ) { +class StatusBarTile { + constructor(statusBar, messageStream) { + this._messages = []; + this._isMouseOverItem = false; + this._isMouseOverTooltip = 0; this._item = document.createElement('div'); this._tile = this._createTile(statusBar); - this._disposables = new UniversalDisposable( - messageStream.subscribe(messages => this._handleMessages(messages)), - ); + this._disposables = new (_UniversalDisposable().default)(messageStream.subscribe(messages => this._handleMessages(messages))); } - dispose(): void { - ReactDOM.unmountComponentAtNode(this._item); + dispose() { + _reactDom.default.unmountComponentAtNode(this._item); + this._tile.destroy(); + if (this._tooltip != null) { this._tooltip.dispose(); } + this._disposables.dispose(); } - _createTile(statusBar: atom$StatusBar): atom$StatusBarTile { + _createTile(statusBar) { const item = this._item; item.className = 'inline-block'; item.addEventListener('mouseenter', () => { this._isMouseOverItem = true; + this._stopLeaveTimeout(); + this._ensureTooltip(); }); item.addEventListener('mouseleave', () => { this._isMouseOverItem = false; + this._startLeaveTimeoutIfNecessary(); }); const tile = statusBar.addRightTile({ item, - priority: STATUS_BAR_PRIORITY, + priority: STATUS_BAR_PRIORITY }); return tile; } - _handleMessages(messages: Array): void { + _handleMessages(messages) { this._messages = messages; - - const onDidClicks = arrayCompact(messages.map(m => m._onDidClick)); - - const props: Props = { + const onDidClicks = (0, _collection().arrayCompact)(messages.map(m => m._onDidClick)); + const props = { waitingForComputer: messages.some(m => m.waitingFor === 'computer'), waitingForUser: messages.some(m => m.waitingFor === 'user'), - onDidClick: - onDidClicks.length > 0 - ? () => onDidClicks.forEach(callback => callback()) - : null, + onDidClick: onDidClicks.length > 0 ? () => onDidClicks.forEach(callback => callback()) : null }; - ReactDOM.render(, this._item); - const revealTooltip = messages.some(message => - message.shouldRevealTooltip(), - ); + _reactDom.default.render(React.createElement(StatusBarTileComponent, props), this._item); + + const revealTooltip = messages.some(message => message.shouldRevealTooltip()); + if (this._tooltip != null) { // If the user already had the tooltip up, then we'll either // refresh it or hide it. No matter what, we'll have to unmount it. - this._disposeTooltip(); - // There are two reasons to refresh the tooltip (bringing it back): + this._disposeTooltip(); // There are two reasons to refresh the tooltip (bringing it back): // 1) the mouse was previously over the tile or the tooltip // 2) one of the messages is marked with 'reveal tooltip' - if ( - messages.length > 0 && - (revealTooltip || this._isMouseOverItem || this._isMouseOverTooltip) - ) { + + + if (messages.length > 0 && (revealTooltip || this._isMouseOverItem || this._isMouseOverTooltip)) { this._ensureTooltip(); } else { this._isMouseOverItem = false; @@ -134,67 +168,78 @@ export default class StatusBarTile { } } - _disposeTooltip(): void { + _disposeTooltip() { if (this._tooltip != null) { this._tooltip.dispose(); + this._tooltip = null; this._isMouseOverTooltip = 0; } } - _ensureTooltip(): void { + _ensureTooltip() { if (this._tooltip != null) { return; } + const body = document.createElement('div'); + for (const message of this._messages) { if (body.childElementCount > 0) { body.appendChild(document.createElement('br')); } + const titleElement = message.getTitleElement(); - invariant(titleElement != null); + + if (!(titleElement != null)) { + throw new Error("Invariant violation: \"titleElement != null\""); + } + body.appendChild(titleElement); } this._tooltip = atom.tooltips.add(this._item, { item: body, delay: 0, - trigger: 'manual', + trigger: 'manual' }); const tooltipAtomObjects = atom.tooltips.tooltips.get(this._item); + if (tooltipAtomObjects != null) { for (const tooltipAtomObject of tooltipAtomObjects) { const div = tooltipAtomObject.getTooltipElement(); div.addEventListener('mouseenter', () => { this._isMouseOverTooltip++; + this._stopLeaveTimeout(); }); div.addEventListener('mouseleave', () => { this._isMouseOverTooltip--; + this._startLeaveTimeoutIfNecessary(); }); } } } - _startLeaveTimeoutIfNecessary(): void { - if ( - !this._isMouseOverItem && - this._isMouseOverTooltip === 0 && - this._leaveTimeoutId == null - ) { + _startLeaveTimeoutIfNecessary() { + if (!this._isMouseOverItem && this._isMouseOverTooltip === 0 && this._leaveTimeoutId == null) { this._leaveTimeoutId = setTimeout(() => { - this._disposeTooltip(); - // Currently visible messages should no longer reveal the tooltip again. + this._disposeTooltip(); // Currently visible messages should no longer reveal the tooltip again. + + this._messages.forEach(message => message.setRevealTooltip(false)); }, 200); } } - _stopLeaveTimeout(): void { + _stopLeaveTimeout() { if (this._leaveTimeoutId != null) { clearTimeout(this._leaveTimeoutId); this._leaveTimeoutId = null; } } + } + +exports.default = StatusBarTile; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/main.js b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/main.js index 698cadaff6..b3e838e01e 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/main.js +++ b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/main.js @@ -1,3 +1,57 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _BusySignalSingleton() { + const data = _interopRequireDefault(require("./BusySignalSingleton")); + + _BusySignalSingleton = function () { + return data; + }; + + return data; +} + +function _MessageStore() { + const data = require("./MessageStore"); + + _MessageStore = function () { + return data; + }; + + return data; +} + +function _StatusBarTile() { + const data = _interopRequireDefault(require("./StatusBarTile")); + + _StatusBarTile = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,45 +60,33 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {BusySignalService} from './types'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import BusySignalSingleton from './BusySignalSingleton'; -import {MessageStore} from './MessageStore'; -import StatusBarTile from './StatusBarTile'; - class Activation { - _disposables: UniversalDisposable; - _service: BusySignalService; - _messageStore: MessageStore; - constructor() { - this._messageStore = new MessageStore(); - this._service = new BusySignalSingleton(this._messageStore); - this._disposables = new UniversalDisposable(this._messageStore); + this._messageStore = new (_MessageStore().MessageStore)(); + this._service = new (_BusySignalSingleton().default)(this._messageStore); + this._disposables = new (_UniversalDisposable().default)(this._messageStore); } dispose() { this._disposables.dispose(); } - consumeStatusBar(statusBar: atom$StatusBar): IDisposable { + consumeStatusBar(statusBar) { // Avoid retaining StatusBarTile by wrapping it. - const disposable = new UniversalDisposable( - new StatusBarTile(statusBar, this._messageStore.getMessageStream()), - ); + const disposable = new (_UniversalDisposable().default)(new (_StatusBarTile().default)(statusBar, this._messageStore.getMessageStream())); + this._disposables.add(disposable); + return disposable; } - provideBusySignal(): BusySignalService { + provideBusySignal() { return this._service; } + } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/types.js b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/types.js index 38a0a1cda4..9a390c31f7 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/types.js +++ b/modules/atom-ide-ui/pkg/atom-ide-busy-signal/lib/types.js @@ -1,57 +1 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - * @format - */ - -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; - -export type BusySignalOptions = {| - // Can say that a busy signal will only appear when a given file is open. - // Default = null, meaning the busy signal applies to all files. - onlyForFile?: NuclideUri, - // Is user waiting for computer to finish a task? (traditional busy spinner) - // or is the computer waiting for user to finish a task? (action required) - // Default = spinner. - waitingFor?: 'computer' | 'user', - // Debounce it? default = true for busy-signal, and false for action-required. - debounce?: boolean, - // If onClick is set, then the tooltip will be clickable. Default = null. - onDidClick?: () => void, - // If set to true, the busy signal tooltip will be immediately revealed - // when it first becomes visible (without explicit mouse interaction). - revealTooltip?: boolean, -|}; - -export type BusySignalService = { - // Activates the busy signal with the given title and returns the promise - // from the provided callback. - // The busy signal automatically deactivates when the returned promise - // either resolves or rejects. - reportBusyWhile( - title: string, - f: () => Promise, - options?: BusySignalOptions, - ): Promise, - - // Activates the busy signal. Set the title in the returned BusySignal - // object (you can update the title multiple times) and dispose it when done. - reportBusy(title: string, options?: BusySignalOptions): BusyMessage, - - // This is a no-op. When someone consumes the busy service, they get back a - // reference to the single shared instance, so disposing of it would be wrong. - dispose(): void, -}; - -export type BusyMessage = { - // You can set/update the title. - setTitle(title: string): void, - // Dispose of the signal when done to make it go away. - dispose(): void, -}; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-actions/__atom_tests__/CodeActionManager-test.js b/modules/atom-ide-ui/pkg/atom-ide-code-actions/__atom_tests__/CodeActionManager-test.js index d0b8c2eff9..b7411d35e2 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-actions/__atom_tests__/CodeActionManager-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-actions/__atom_tests__/CodeActionManager-test.js @@ -1,3 +1,49 @@ +"use strict"; + +var _os = _interopRequireDefault(require("os")); + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _waits_for() { + const data = _interopRequireDefault(require("../../../../../jest/waits_for")); + + _waits_for = function () { + return data; + }; + + return data; +} + +function _promise() { + const data = require("../../../../nuclide-commons/promise"); + + _promise = function () { + return data; + }; + + return data; +} + +function _CodeActionManager() { + const data = require("../lib/CodeActionManager"); + + _CodeActionManager = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,73 +52,55 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format * @emails oncall+nuclide */ -import os from 'os'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import waitsFor from '../../../../../jest/waits_for'; -import {sleep} from 'nuclide-commons/promise'; - -import {CodeActionManager} from '../lib/CodeActionManager'; - describe('CodeActionManager', () => { let manager; let provider; let delegate; let editor; beforeEach(async () => { - editor = await atom.workspace.open( - nuclideUri.join(os.tmpdir(), 'test.txt'), - ); + editor = await atom.workspace.open(_nuclideUri().default.join(_os.default.tmpdir(), 'test.txt')); editor.setText('abc\ndef\nghi'); - - manager = new CodeActionManager(); + manager = new (_CodeActionManager().CodeActionManager)(); provider = { priority: 1, grammarScopes: ['text.plain.null-grammar'], + async getCodeActions(_e, _r, _d) { return []; - }, + } + }; delegate = { clearMessages: () => {}, - setAllMessages: _messages => {}, + setAllMessages: _messages => {} }; - manager._linterDelegate = (delegate: any); + manager._linterDelegate = delegate; manager.addProvider(provider); }); - it('finds code actions on highlight change and updates linter', async () => { - const actions = [ - { - apply() {}, - async getTitle() { - return 'Mock action'; - }, - dispose() {}, + const actions = [{ + apply() {}, + + async getTitle() { + return 'Mock action'; }, - ]; - const spyActions = jest - .spyOn(provider, 'getCodeActions') - .mockReturnValue(actions); - const spyLinter = jest.spyOn(delegate, 'setAllMessages'); - await sleep(1); // trigger debounce - editor.selectAll(); - await sleep(501); + dispose() {} - await waitsFor( - () => spyLinter.mock.calls.length > 0, - 'should have called setAllMessages', - ); + }]; + const spyActions = jest.spyOn(provider, 'getCodeActions').mockReturnValue(actions); + const spyLinter = jest.spyOn(delegate, 'setAllMessages'); + await (0, _promise().sleep)(1); // trigger debounce + editor.selectAll(); + await (0, _promise().sleep)(501); + await (0, _waits_for().default)(() => spyLinter.mock.calls.length > 0, 'should have called setAllMessages'); expect(spyActions).toHaveBeenCalled(); expect(spyLinter).toHaveBeenCalled(); - expect( - (spyLinter.mock.calls[spyLinter.mock.calls.length - 1]: any)[0][0] - .solutions.length, - ).toEqual(1); + expect(spyLinter.mock.calls[spyLinter.mock.calls.length - 1][0][0].solutions.length).toEqual(1); }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/CodeActionManager.js b/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/CodeActionManager.js index 5ed74eb49d..c0de4b5bab 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/CodeActionManager.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/CodeActionManager.js @@ -1,3 +1,74 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.CodeActionManager = void 0; + +function _debounced() { + const data = require("../../../../nuclide-commons-atom/debounced"); + + _debounced = function () { + return data; + }; + + return data; +} + +function _ProviderRegistry() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/ProviderRegistry")); + + _ProviderRegistry = function () { + return data; + }; + + return data; +} + +function _event() { + const data = require("../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _collection() { + const data = require("../../../../nuclide-commons/collection"); + + _collection = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _log4js() { + const data = require("log4js"); + + _log4js = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,201 +77,156 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import {observeActiveEditorsDebounced} from 'nuclide-commons-atom/debounced'; -import ProviderRegistry from 'nuclide-commons-atom/ProviderRegistry'; -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {arrayCompact, arrayFlatten} from 'nuclide-commons/collection'; -import {Observable} from 'rxjs'; -import {getLogger} from 'log4js'; - -import type { - RegisterIndieLinter, - IndieLinterDelegate, - LinterMessageV2, -} from '../../../index'; -import type { - DiagnosticMessage, - DiagnosticUpdater, -} from '../../atom-ide-diagnostics/lib/types'; -import type {CodeAction, CodeActionProvider, CodeActionFetcher} from './types'; - const TIP_DELAY_MS = 500; -async function actionsToMessage( - location: {file: string, position: atom$RangeLike}, - actions: Array, -): Promise { +async function actionsToMessage(location, actions) { const titles = await Promise.all(actions.map(r => r.getTitle())); const solutions = titles.map((title, i) => ({ title, position: location.position, - apply: actions[i].apply.bind(actions[i]), + apply: actions[i].apply.bind(actions[i]) })); return { location, solutions, excerpt: 'Select an action', severity: 'info', - kind: 'action', + kind: 'action' }; } -export class CodeActionManager { - _providerRegistry: ProviderRegistry; - _disposables: UniversalDisposable; - _linterDelegate: ?IndieLinterDelegate; - _diagnosticUpdater: ?DiagnosticUpdater; - +class CodeActionManager { constructor() { - this._providerRegistry = new ProviderRegistry(); - this._disposables = new UniversalDisposable(this._selectionSubscriber()); + this._providerRegistry = new (_ProviderRegistry().default)(); + this._disposables = new (_UniversalDisposable().default)(this._selectionSubscriber()); } dispose() { this._disposables.dispose(); } - addProvider(provider: CodeActionProvider): IDisposable { + addProvider(provider) { const disposable = this._providerRegistry.addProvider(provider); + this._disposables.add(disposable); + return disposable; } - consumeDiagnosticUpdates(diagnosticUpdater: DiagnosticUpdater): IDisposable { + consumeDiagnosticUpdates(diagnosticUpdater) { this._diagnosticUpdater = diagnosticUpdater; - return new UniversalDisposable(() => { + return new (_UniversalDisposable().default)(() => { this._diagnosticUpdater = null; }); } - consumeIndie(register: RegisterIndieLinter): IDisposable { + consumeIndie(register) { const linterDelegate = register({ name: 'Code Actions', - supportedMessageKinds: ['action'], + supportedMessageKinds: ['action'] }); + this._disposables.add(linterDelegate); + this._linterDelegate = linterDelegate; - return new UniversalDisposable(() => { + return new (_UniversalDisposable().default)(() => { this._disposables.remove(linterDelegate); + this._linterDelegate = null; }); } - async _genAllCodeActions( - editor: atom$TextEditor, - range: atom$Range, - diagnostics: Array, - ): Promise> { + async _genAllCodeActions(editor, range, diagnostics) { const codeActionRequests = []; - for (const provider of this._providerRegistry.getAllProvidersForEditor( - editor, - )) { - codeActionRequests.push( - provider.getCodeActions(editor, range, diagnostics), - ); + + for (const provider of this._providerRegistry.getAllProvidersForEditor(editor)) { + codeActionRequests.push(provider.getCodeActions(editor, range, diagnostics)); } - return arrayFlatten(arrayCompact(await Promise.all(codeActionRequests))); + + return (0, _collection().arrayFlatten)((0, _collection().arrayCompact)((await Promise.all(codeActionRequests)))); } - createCodeActionFetcher(): CodeActionFetcher { + createCodeActionFetcher() { return { getCodeActionForDiagnostic: (diagnostic, editor) => { if (diagnostic.range) { - const {range} = diagnostic; + const { + range + } = diagnostic; return this._genAllCodeActions(editor, range, [diagnostic]); } + return Promise.resolve([]); - }, + } }; - } - - // Listen to buffer range selection changes and trigger code action providers + } // Listen to buffer range selection changes and trigger code action providers // when ranges change. - _selectionSubscriber(): rxjs$Subscription { + + + _selectionSubscriber() { // Patterned after highlightEditors of CodeHighlightManager. - return observeActiveEditorsDebounced(0) - .switchMap( - // Get selections for the active editor. - editor => { - if (editor == null) { - return Observable.empty(); - } - const destroyEvents = observableFromSubscribeFunction( - editor.onDidDestroy.bind(editor), - ); - const selections = observableFromSubscribeFunction( - editor.onDidChangeSelectionRange.bind(editor), - ) - .switchMap( - event => - // Remove 0-character selections since it's just cursor movement. - event.newBufferRange.isEmpty() - ? Observable.of(null) - : Observable.of(event.newBufferRange) - .delay(TIP_DELAY_MS) // Delay the emission of the range. - .startWith(null), // null the range immediately when selection changes. - ) - .distinctUntilChanged() - .takeUntil(destroyEvents); - return selections.map( - range => (range == null ? null : {editor, range}), - ); - }, - ) - .switchMap( - // Get a message for the provided selection. - (selection: ?{editor: atom$TextEditor, range: atom$Range}) => { - if (selection == null) { - return Observable.of(null); - } - const {editor, range} = selection; - const file = editor.getBuffer().getPath(); - if (file == null) { - return Observable.empty(); - } - const diagnostics = - this._diagnosticUpdater == null - ? [] - : this._diagnosticUpdater - .getFileMessageUpdates(file) - .messages.filter( - message => - message.range && message.range.intersectsWith(range), - ); - return Observable.fromPromise( - this._genAllCodeActions(editor, range, diagnostics), - ).switchMap(actions => { - // Only produce a message if we have actions to display. - if (actions.length > 0) { - return actionsToMessage({file, position: range}, actions); - } else { - return Observable.empty(); - } - }); - }, - ) - .distinctUntilChanged() - .catch((e, caught) => { - getLogger('code-actions').error( - 'Error getting code actions on selection', - e, - ); - return caught; - }) - .subscribe(message => { - if (this._linterDelegate == null) { - return; - } - if (message == null) { - this._linterDelegate.clearMessages(); + return (0, _debounced().observeActiveEditorsDebounced)(0).switchMap( // Get selections for the active editor. + editor => { + if (editor == null) { + return _rxjsCompatUmdMin.Observable.empty(); + } + + const destroyEvents = (0, _event().observableFromSubscribeFunction)(editor.onDidDestroy.bind(editor)); + const selections = (0, _event().observableFromSubscribeFunction)(editor.onDidChangeSelectionRange.bind(editor)).switchMap(event => // Remove 0-character selections since it's just cursor movement. + event.newBufferRange.isEmpty() ? _rxjsCompatUmdMin.Observable.of(null) : _rxjsCompatUmdMin.Observable.of(event.newBufferRange).delay(TIP_DELAY_MS) // Delay the emission of the range. + .startWith(null) // null the range immediately when selection changes. + ).distinctUntilChanged().takeUntil(destroyEvents); + return selections.map(range => range == null ? null : { + editor, + range + }); + }).switchMap( // Get a message for the provided selection. + selection => { + if (selection == null) { + return _rxjsCompatUmdMin.Observable.of(null); + } + + const { + editor, + range + } = selection; + const file = editor.getBuffer().getPath(); + + if (file == null) { + return _rxjsCompatUmdMin.Observable.empty(); + } + + const diagnostics = this._diagnosticUpdater == null ? [] : this._diagnosticUpdater.getFileMessageUpdates(file).messages.filter(message => message.range && message.range.intersectsWith(range)); + return _rxjsCompatUmdMin.Observable.fromPromise(this._genAllCodeActions(editor, range, diagnostics)).switchMap(actions => { + // Only produce a message if we have actions to display. + if (actions.length > 0) { + return actionsToMessage({ + file, + position: range + }, actions); } else { - this._linterDelegate.setAllMessages([message]); + return _rxjsCompatUmdMin.Observable.empty(); } }); + }).distinctUntilChanged().catch((e, caught) => { + (0, _log4js().getLogger)('code-actions').error('Error getting code actions on selection', e); + return caught; + }).subscribe(message => { + if (this._linterDelegate == null) { + return; + } + + if (message == null) { + this._linterDelegate.clearMessages(); + } else { + this._linterDelegate.setAllMessages([message]); + } + }); } + } + +exports.CodeActionManager = CodeActionManager; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/main.js b/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/main.js index 483761bccf..58337881ec 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/main.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/main.js @@ -1,3 +1,27 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _CodeActionManager() { + const data = require("./CodeActionManager"); + + _CodeActionManager = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,43 +30,34 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import createPackage from 'nuclide-commons-atom/createPackage'; -import {CodeActionManager} from './CodeActionManager'; - -import type {RegisterIndieLinter} from '../../../index'; -import type {CodeActionProvider, CodeActionFetcher} from './types'; -import type {DiagnosticUpdater} from '../../atom-ide-diagnostics/lib/types'; - class Activation { - _codeActionManager: CodeActionManager; - constructor() { - this._codeActionManager = new CodeActionManager(); + this._codeActionManager = new (_CodeActionManager().CodeActionManager)(); } dispose() { this._codeActionManager.dispose(); } - consumeCodeActionProvider(provider: CodeActionProvider) { + consumeCodeActionProvider(provider) { return this._codeActionManager.addProvider(provider); } - consumeDiagnosticUpdates(diagnosticUpdater: DiagnosticUpdater) { + consumeDiagnosticUpdates(diagnosticUpdater) { return this._codeActionManager.consumeDiagnosticUpdates(diagnosticUpdater); } - provideCodeActionFetcher(): CodeActionFetcher { + provideCodeActionFetcher() { return this._codeActionManager.createCodeActionFetcher(); } - consumeIndie(register: RegisterIndieLinter) { + consumeIndie(register) { return this._codeActionManager.consumeIndie(register); } + } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/types.js b/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/types.js index 50d863cb8c..9a390c31f7 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/types.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-actions/lib/types.js @@ -1,42 +1 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import type {DiagnosticMessage} from '../../../pkg/atom-ide-diagnostics/lib/types'; - -export interface CodeAction { - apply(): Promise; - getTitle(): Promise; - dispose(): void; -} - -export type CodeActionProvider = { - +grammarScopes?: Array, - priority: number, - getCodeActions( - editor: atom$TextEditor, - range: atom$Range, - diagnostics: Array, - ): Promise>, -}; - -/** - * atom-ide-code-actions provides a CodeActionFetcher which offers an API to - * request CodeActions from all CodeAction providers. For now, CodeActionFetcher - * can only fetch CodeActions for a Diagnostic. In the future, this API can be - * extended to provide a stream of CodeActions based on the cursor position. - */ -export type CodeActionFetcher = { - getCodeActionForDiagnostic: ( - diagnostic: DiagnosticMessage, - editor: atom$TextEditor, - ) => Promise>, -}; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-format/__atom_tests__/CodeFormatManager-test.js b/modules/atom-ide-ui/pkg/atom-ide-code-format/__atom_tests__/CodeFormatManager-test.js index 5655740061..7bc8408680 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-format/__atom_tests__/CodeFormatManager-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-format/__atom_tests__/CodeFormatManager-test.js @@ -1,3 +1,71 @@ +"use strict"; + +var _atom = require("atom"); + +function _FileEventHandlers() { + const data = require("../../../../nuclide-commons-atom/FileEventHandlers"); + + _FileEventHandlers = function () { + return data; + }; + + return data; +} + +function _CodeFormatManager() { + const data = _interopRequireWildcard(require("../lib/CodeFormatManager")); + + _CodeFormatManager = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _temp() { + const data = _interopRequireDefault(require("temp")); + + _temp = function () { + return data; + }; + + return data; +} + +function config() { + const data = _interopRequireWildcard(require("../lib/config")); + + config = function () { + return data; + }; + + return data; +} + +function _waits_for() { + const data = _interopRequireDefault(require("../../../../../jest/waits_for")); + + _waits_for = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,19 +74,10 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format * @emails oncall+nuclide */ -import {Range} from 'atom'; -import {observeTextEditors} from 'nuclide-commons-atom/FileEventHandlers'; -import {SAVE_TIMEOUT} from '../lib/CodeFormatManager'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import temp from 'temp'; -import * as config from '../lib/config'; -import CodeFormatManager from '../lib/CodeFormatManager'; -import waitsFor from '../../../../../jest/waits_for'; - const sleep = n => new Promise(r => setTimeout(r, n)); describe('CodeFormatManager', () => { @@ -26,120 +85,97 @@ describe('CodeFormatManager', () => { let manager; let disposables; beforeEach(async () => { - manager = new CodeFormatManager(); - disposables = new UniversalDisposable(observeTextEditors()); - temp.track(); - const file = temp.openSync(); + manager = new (_CodeFormatManager().default)(); + disposables = new (_UniversalDisposable().default)((0, _FileEventHandlers().observeTextEditors)()); + + _temp().default.track(); + + const file = _temp().default.openSync(); + textEditor = await atom.workspace.open(file.path); }); - afterEach(async () => { manager.dispose(); disposables.dispose(); }); - it('formats an editor on request', async () => { manager.addRangeProvider({ grammarScopes: ['text.plain.null-grammar'], priority: 1, - formatCode: () => - Promise.resolve([ - { - oldRange: new Range([0, 0], [0, 3]), - oldText: 'abc', - newText: 'def', - }, - ]), + formatCode: () => Promise.resolve([{ + oldRange: new _atom.Range([0, 0], [0, 3]), + oldText: 'abc', + newText: 'def' + }]) }); - textEditor.setText('abc'); - atom.commands.dispatch( - atom.views.getView(textEditor), - 'code-format:format-code', - ); - await waitsFor(() => textEditor.getText() === 'def'); + atom.commands.dispatch(atom.views.getView(textEditor), 'code-format:format-code'); + await (0, _waits_for().default)(() => textEditor.getText() === 'def'); }); - it('format an editor using formatEntireFile', async () => { manager.addFileProvider({ grammarScopes: ['text.plain.null-grammar'], priority: 1, - formatEntireFile: () => Promise.resolve({formatted: 'ghi'}), + formatEntireFile: () => Promise.resolve({ + formatted: 'ghi' + }) }); - textEditor.setText('abc'); - atom.commands.dispatch( - atom.views.getView(textEditor), - 'code-format:format-code', - ); - await waitsFor(() => textEditor.getText() === 'ghi'); + atom.commands.dispatch(atom.views.getView(textEditor), 'code-format:format-code'); + await (0, _waits_for().default)(() => textEditor.getText() === 'ghi'); }); - it('formats an editor on type', async () => { - jest.spyOn(config, 'getFormatOnType').mockReturnValue(true); + jest.spyOn(config(), 'getFormatOnType').mockReturnValue(true); const provider = { grammarScopes: ['text.plain.null-grammar'], priority: 1, - formatAtPosition: () => - Promise.resolve([ - { - oldRange: new Range([0, 0], [0, 3]), - oldText: 'abc', - newText: 'def', - }, - ]), - keepCursorPosition: false, + formatAtPosition: () => Promise.resolve([{ + oldRange: new _atom.Range([0, 0], [0, 3]), + oldText: 'abc', + newText: 'def' + }]), + keepCursorPosition: false }; const spy = jest.spyOn(provider, 'formatAtPosition'); manager.addOnTypeProvider(provider); - textEditor.setText('a'); textEditor.setCursorBufferPosition([0, 1]); textEditor.insertText('b'); textEditor.insertText('c'); + await (0, _waits_for().default)(() => textEditor.getText() === 'def'); // Debouncing should ensure only one format call. - await waitsFor(() => textEditor.getText() === 'def'); - // Debouncing should ensure only one format call. expect(spy.mock.calls.length).toBe(1); }); - it('formats an editor on save', async () => { - jest.spyOn(config, 'getFormatOnSave').mockReturnValue(true); + jest.spyOn(config(), 'getFormatOnSave').mockReturnValue(true); manager.addOnSaveProvider({ grammarScopes: ['text.plain.null-grammar'], priority: 1, - formatOnSave: () => - Promise.resolve([ - { - oldRange: new Range([0, 0], [0, 3]), - oldText: 'abc', - newText: 'def', - }, - ]), + formatOnSave: () => Promise.resolve([{ + oldRange: new _atom.Range([0, 0], [0, 3]), + oldText: 'abc', + newText: 'def' + }]) }); - textEditor.setText('abc'); await textEditor.save(); expect(textEditor.getText()).toBe('def'); }); - it('should still save on timeout', async () => { - jest.spyOn(config, 'getFormatOnSave').mockReturnValue(true); + jest.spyOn(config(), 'getFormatOnSave').mockReturnValue(true); manager.addRangeProvider({ grammarScopes: ['text.plain.null-grammar'], priority: 1, formatCode: async () => { - await sleep(SAVE_TIMEOUT + 1000); + await sleep(_CodeFormatManager().SAVE_TIMEOUT + 1000); return []; - }, + } }); - const spy = jest.spyOn(textEditor.getBuffer(), 'save'); - textEditor.save(); - - // Wait until the buffer has been saved and verify it has been saved exactly + textEditor.save(); // Wait until the buffer has been saved and verify it has been saved exactly // once. - await waitsFor(() => spy.mock.calls.length > 0); + + await (0, _waits_for().default)(() => spy.mock.calls.length > 0); expect(spy.mock.calls.length).toBe(1); }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/CodeFormatManager.js b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/CodeFormatManager.js index ad6cb5250f..bd2ba58278 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/CodeFormatManager.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/CodeFormatManager.js @@ -1,3 +1,126 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.SAVE_TIMEOUT = void 0; + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _FileEventHandlers() { + const data = require("../../../../nuclide-commons-atom/FileEventHandlers"); + + _FileEventHandlers = function () { + return data; + }; + + return data; +} + +function _config() { + const data = require("./config"); + + _config = function () { + return data; + }; + + return data; +} + +var _atom = require("atom"); + +function _log4js() { + const data = require("log4js"); + + _log4js = function () { + return data; + }; + + return data; +} + +function _ProviderRegistry() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/ProviderRegistry")); + + _ProviderRegistry = function () { + return data; + }; + + return data; +} + +function _textEdit() { + const data = require("../../../../nuclide-commons-atom/text-edit"); + + _textEdit = function () { + return data; + }; + + return data; +} + +function _textEditor() { + const data = require("../../../../nuclide-commons-atom/text-editor"); + + _textEditor = function () { + return data; + }; + + return data; +} + +function _event() { + const data = require("../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _observable() { + const data = require("../../../../nuclide-commons/observable"); + + _observable = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,191 +129,117 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {TextEdit} from 'nuclide-commons-atom/text-edit'; -import type {BusySignalService} from '../../atom-ide-busy-signal/lib/types'; -import type { - FileCodeFormatProvider, - OnSaveCodeFormatProvider, - OnTypeCodeFormatProvider, - RangeCodeFormatProvider, -} from './types'; - -import nullthrows from 'nullthrows'; -import {registerOnWillSave} from 'nuclide-commons-atom/FileEventHandlers'; -import {getFormatOnSave, getFormatOnType} from './config'; -import {Range} from 'atom'; -import {getLogger} from 'log4js'; -import ProviderRegistry from 'nuclide-commons-atom/ProviderRegistry'; -import {applyTextEditsToBuffer} from 'nuclide-commons-atom/text-edit'; -import {observeEditorDestroy} from 'nuclide-commons-atom/text-editor'; -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {completingSwitchMap, microtask} from 'nuclide-commons/observable'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {Observable} from 'rxjs'; - // Save events are critical, so don't allow providers to block them. -export const SAVE_TIMEOUT = 2500; - -type FormatEvent = - | { - type: 'command' | 'save' | 'new-save', - editor: atom$TextEditor, - } - | { - type: 'type', - editor: atom$TextEditor, - edit: atom$AggregatedTextEditEvent, - }; - -export default class CodeFormatManager { - _subscriptions: UniversalDisposable; - _rangeProviders: ProviderRegistry; - _fileProviders: ProviderRegistry; - _onTypeProviders: ProviderRegistry; - _onSaveProviders: ProviderRegistry; - _busySignalService: ?BusySignalService; +const SAVE_TIMEOUT = 2500; +exports.SAVE_TIMEOUT = SAVE_TIMEOUT; +class CodeFormatManager { constructor() { - this._subscriptions = new UniversalDisposable( - this._subscribeToEvents(), - registerOnWillSave(this._onWillSaveProvider()), - ); - this._rangeProviders = new ProviderRegistry(); - this._fileProviders = new ProviderRegistry(); - this._onTypeProviders = new ProviderRegistry(); - this._onSaveProviders = new ProviderRegistry(); + this._subscriptions = new (_UniversalDisposable().default)(this._subscribeToEvents(), (0, _FileEventHandlers().registerOnWillSave)(this._onWillSaveProvider())); + this._rangeProviders = new (_ProviderRegistry().default)(); + this._fileProviders = new (_ProviderRegistry().default)(); + this._onTypeProviders = new (_ProviderRegistry().default)(); + this._onSaveProviders = new (_ProviderRegistry().default)(); } - /** * Subscribe to all formatting events (commands, saves, edits) and dispatch * formatters as necessary. * By handling all events in a central location, we ensure that no buffer * runs into race conditions with simultaneous formatters. */ - _subscribeToEvents(): rxjs$Subscription { + + + _subscribeToEvents() { // Events from the explicit Atom command. - const commandEvents = observableFromSubscribeFunction(callback => - atom.commands.add( - 'atom-text-editor', - 'code-format:format-code', - callback, - ), - ).switchMap(() => { + const commandEvents = (0, _event().observableFromSubscribeFunction)(callback => atom.commands.add('atom-text-editor', 'code-format:format-code', callback)).switchMap(() => { const editor = atom.workspace.getActiveTextEditor(); + if (!editor) { - return Observable.empty(); + return _rxjsCompatUmdMin.Observable.empty(); } - return Observable.of({type: 'command', editor}); - }); - // Events from editor actions (saving, typing). - const editorEvents = observableFromSubscribeFunction(cb => - atom.workspace.observeTextEditors(cb), - ).mergeMap(editor => this._getEditorEventStream(editor)); - - return ( - Observable.merge(commandEvents, editorEvents) - // Group events by buffer to prevent simultaneous formatting operations. - .groupBy( - event => event.editor.getBuffer(), - event => event, - grouped => - observableFromSubscribeFunction(callback => - grouped.key.onDidDestroy(callback), - ), - ) - .mergeMap(events => - // Make sure we halt everything when the editor gets destroyed. - events.let(completingSwitchMap(event => this._handleEvent(event))), - ) - .subscribe() - ); - } + return _rxjsCompatUmdMin.Observable.of({ + type: 'command', + editor + }); + }); // Events from editor actions (saving, typing). + const editorEvents = (0, _event().observableFromSubscribeFunction)(cb => atom.workspace.observeTextEditors(cb)).mergeMap(editor => this._getEditorEventStream(editor)); + return _rxjsCompatUmdMin.Observable.merge(commandEvents, editorEvents) // Group events by buffer to prevent simultaneous formatting operations. + .groupBy(event => event.editor.getBuffer(), event => event, grouped => (0, _event().observableFromSubscribeFunction)(callback => grouped.key.onDidDestroy(callback))).mergeMap(events => // Make sure we halt everything when the editor gets destroyed. + events.let((0, _observable().completingSwitchMap)(event => this._handleEvent(event)))).subscribe(); + } /** * Returns a stream of all typing and saving operations from the editor. */ - _getEditorEventStream(editor: atom$TextEditor): Observable { - const changeEvents = observableFromSubscribeFunction(callback => - editor.getBuffer().onDidChangeText(callback), - ); - // We need to capture when editors are about to be destroyed in order to + + _getEditorEventStream(editor) { + const changeEvents = (0, _event().observableFromSubscribeFunction)(callback => editor.getBuffer().onDidChangeText(callback)); // We need to capture when editors are about to be destroyed in order to // interrupt any pending formatting operations. (Otherwise, we may end up // attempting to save a destroyed editor!) - const willDestroyEvents = observableFromSubscribeFunction(cb => - atom.workspace.onWillDestroyPaneItem(cb), - ).filter(event => event.item === editor); - - return Observable.merge( - changeEvents.map(edit => ({type: 'type', editor, edit})), - ).takeUntil( - Observable.merge(observeEditorDestroy(editor), willDestroyEvents), - ); + + const willDestroyEvents = (0, _event().observableFromSubscribeFunction)(cb => atom.workspace.onWillDestroyPaneItem(cb)).filter(event => event.item === editor); + return _rxjsCompatUmdMin.Observable.merge(changeEvents.map(edit => ({ + type: 'type', + editor, + edit + }))).takeUntil(_rxjsCompatUmdMin.Observable.merge((0, _textEditor().observeEditorDestroy)(editor), willDestroyEvents)); } - _handleEvent(event: FormatEvent): Observable { - const {editor} = event; + _handleEvent(event) { + const { + editor + } = event; + switch (event.type) { case 'command': - return this._formatCodeInTextEditor(editor) - .do(edits => { - applyTextEditsToBuffer(editor.getBuffer(), edits); - }) - .map(result => { - if (!result) { - throw new Error('No code formatting providers found!'); - } - }) - .catch(err => { - atom.notifications.addError( - `Failed to format code: ${err.message}`, - { - detail: err.detail, - }, - ); - return Observable.empty(); + return this._formatCodeInTextEditor(editor).do(edits => { + (0, _textEdit().applyTextEditsToBuffer)(editor.getBuffer(), edits); + }).map(result => { + if (!result) { + throw new Error('No code formatting providers found!'); + } + }).catch(err => { + atom.notifications.addError(`Failed to format code: ${err.message}`, { + detail: err.detail }); + return _rxjsCompatUmdMin.Observable.empty(); + }); + case 'type': - return this._formatCodeOnTypeInTextEditor(editor, event.edit).catch( - err => { - getLogger('code-format').warn( - 'Failed to format code on type:', - err, - ); - return Observable.empty(); - }, - ); + return this._formatCodeOnTypeInTextEditor(editor, event.edit).catch(err => { + (0, _log4js().getLogger)('code-format').warn('Failed to format code on type:', err); + return _rxjsCompatUmdMin.Observable.empty(); + }); + default: - return Observable.throw(`unknown event type ${event.type}`); + return _rxjsCompatUmdMin.Observable.throw(`unknown event type ${event.type}`); } - } - - // Checks whether contents are same in the buffer post-format, throwing if + } // Checks whether contents are same in the buffer post-format, throwing if // anything has changed. - _checkContentsAreSame(before: string, after: string): void { + + + _checkContentsAreSame(before, after) { if (before !== after) { - throw new Error( - 'The file contents were changed before formatting was complete.', - ); + throw new Error('The file contents were changed before formatting was complete.'); } - } + } // Return the text edits used to format code in the editor specified. + - // Return the text edits used to format code in the editor specified. - _formatCodeInTextEditor( - editor: atom$TextEditor, - range?: atom$Range, - ): Observable> { - return Observable.defer(() => { + _formatCodeInTextEditor(editor, range) { + return _rxjsCompatUmdMin.Observable.defer(() => { const buffer = editor.getBuffer(); const selectionRange = range || editor.getSelectedBufferRange(); - const {start: selectionStart, end: selectionEnd} = selectionRange; - let formatRange: atom$Range; + const { + start: selectionStart, + end: selectionEnd + } = selectionRange; + let formatRange; + if (selectionRange.isEmpty()) { // If no selection is done, then, the whole file is wanted to be formatted. formatRange = buffer.getRange(); @@ -202,96 +251,73 @@ export default class CodeFormatManager { // or (2) at the first column of the line AFTER their selection. In both cases // we snap the formatRange to end at the first column of the line after their // selection.) - formatRange = new Range( - [selectionStart.row, 0], - selectionEnd.column === 0 ? selectionEnd : [selectionEnd.row + 1, 0], - ); + formatRange = new _atom.Range([selectionStart.row, 0], selectionEnd.column === 0 ? selectionEnd : [selectionEnd.row + 1, 0]); } - const rangeProviders = [ - ...this._rangeProviders.getAllProvidersForEditor(editor), - ]; - const fileProviders = [ - ...this._fileProviders.getAllProvidersForEditor(editor), - ]; + + const rangeProviders = [...this._rangeProviders.getAllProvidersForEditor(editor)]; + const fileProviders = [...this._fileProviders.getAllProvidersForEditor(editor)]; const contents = editor.getText(); - const rangeEdits = Observable.defer(() => - this._reportBusy( - editor, - Promise.all( - rangeProviders.map(p => p.formatCode(editor, formatRange)), - ), - ), - ).switchMap(allEdits => { + + const rangeEdits = _rxjsCompatUmdMin.Observable.defer(() => this._reportBusy(editor, Promise.all(rangeProviders.map(p => p.formatCode(editor, formatRange))))).switchMap(allEdits => { const firstNonEmpty = allEdits.find(edits => edits.length > 0); + if (firstNonEmpty == null) { - return Observable.empty(); + return _rxjsCompatUmdMin.Observable.empty(); } else { - return Observable.of(firstNonEmpty); + return _rxjsCompatUmdMin.Observable.of(firstNonEmpty); } }); - const fileEdits = Observable.defer(() => - this._reportBusy( - editor, - Promise.all( - fileProviders.map(p => p.formatEntireFile(editor, formatRange)), - ), - ), - ) - .switchMap(allResults => { - const firstNonNull = allResults.find(result => result != null); - if (firstNonNull == null) { - return Observable.empty(); - } else { - return Observable.of(firstNonNull); - } - }) - .map(({_, formatted}) => { - return [ - { - oldRange: editor.getBuffer().getRange(), - newText: formatted, - oldText: contents, - }, - ]; - }); - // When formatting the entire file, prefer file-based providers. + + const fileEdits = _rxjsCompatUmdMin.Observable.defer(() => this._reportBusy(editor, Promise.all(fileProviders.map(p => p.formatEntireFile(editor, formatRange))))).switchMap(allResults => { + const firstNonNull = allResults.find(result => result != null); + + if (firstNonNull == null) { + return _rxjsCompatUmdMin.Observable.empty(); + } else { + return _rxjsCompatUmdMin.Observable.of(firstNonNull); + } + }).map(({ + _, + formatted + }) => { + return [{ + oldRange: editor.getBuffer().getRange(), + newText: formatted, + oldText: contents + }]; + }); // When formatting the entire file, prefer file-based providers. + + const preferFileEdits = formatRange.isEqual(buffer.getRange()); - const edits = preferFileEdits - ? fileEdits.concat(rangeEdits) - : rangeEdits.concat(fileEdits); + const edits = preferFileEdits ? fileEdits.concat(rangeEdits) : rangeEdits.concat(fileEdits); return edits.first(Boolean, []); }); } - _formatCodeOnTypeInTextEditor( - editor: atom$TextEditor, - aggregatedEvent: atom$AggregatedTextEditEvent, - ): Observable> { - return Observable.defer(() => { + _formatCodeOnTypeInTextEditor(editor, aggregatedEvent) { + return _rxjsCompatUmdMin.Observable.defer(() => { // Don't try to format changes with multiple cursors. if (aggregatedEvent.changes.length !== 1) { - return Observable.empty(); + return _rxjsCompatUmdMin.Observable.empty(); } - const event = aggregatedEvent.changes[0]; - // This also ensures the non-emptiness of event.newText for below. - if (!shouldFormatOnType(event) || !getFormatOnType()) { - return Observable.empty(); - } - // In the case of bracket-matching, we use the last character because that's + + const event = aggregatedEvent.changes[0]; // This also ensures the non-emptiness of event.newText for below. + + if (!shouldFormatOnType(event) || !(0, _config().getFormatOnType)()) { + return _rxjsCompatUmdMin.Observable.empty(); + } // In the case of bracket-matching, we use the last character because that's // the character that will usually cause a reformat (i.e. `}` instead of `{`). + + const character = event.newText[event.newText.length - 1]; + const providers = [...this._onTypeProviders.getAllProvidersForEditor(editor)]; - const providers = [ - ...this._onTypeProviders.getAllProvidersForEditor(editor), - ]; if (providers.length === 0) { - return Observable.empty(); + return _rxjsCompatUmdMin.Observable.empty(); } const contents = editor.getText(); - const cursorPosition = editor.getCursorBufferPosition().copy(); - - // The bracket-matching package basically overwrites + const cursorPosition = editor.getCursorBufferPosition().copy(); // The bracket-matching package basically overwrites // // editor.insertText('{'); // @@ -303,49 +329,42 @@ export default class CodeFormatManager { // We want to wait until the cursor has actually moved before we issue a // format request, so that we format at the right position (and potentially // also let any other event handlers have their go). - return microtask - .switchMap(() => - Promise.all( - providers.map(p => - p.formatAtPosition( - editor, - editor.getCursorBufferPosition(), - character, - ), - ), - ), - ) - .switchMap(allEdits => { - const firstNonEmptyIndex = allEdits.findIndex( - edits => edits.length > 0, - ); - if (firstNonEmptyIndex === -1) { - return Observable.empty(); - } else { - return Observable.of({ - edits: nullthrows(allEdits[firstNonEmptyIndex]), - provider: providers[firstNonEmptyIndex], - }); - } - }) - .do(({edits, provider}) => { - if (edits.length === 0) { - return; - } - this._checkContentsAreSame(contents, editor.getText()); - // Note that this modification is not in a transaction, so it applies as a - // separate editing event than the character typing. This means that you - // can undo just the formatting by attempting to undo once, and then undo - // your actual code by undoing again. - if (!applyTextEditsToBuffer(editor.getBuffer(), edits)) { - throw new Error('Could not apply edits to text buffer.'); - } - if (provider.keepCursorPosition) { - editor.setCursorBufferPosition(cursorPosition); - } - }) - .map(({edits}) => edits); + return _observable().microtask.switchMap(() => Promise.all(providers.map(p => p.formatAtPosition(editor, editor.getCursorBufferPosition(), character)))).switchMap(allEdits => { + const firstNonEmptyIndex = allEdits.findIndex(edits => edits.length > 0); + + if (firstNonEmptyIndex === -1) { + return _rxjsCompatUmdMin.Observable.empty(); + } else { + return _rxjsCompatUmdMin.Observable.of({ + edits: (0, _nullthrows().default)(allEdits[firstNonEmptyIndex]), + provider: providers[firstNonEmptyIndex] + }); + } + }).do(({ + edits, + provider + }) => { + if (edits.length === 0) { + return; + } + + this._checkContentsAreSame(contents, editor.getText()); // Note that this modification is not in a transaction, so it applies as a + // separate editing event than the character typing. This means that you + // can undo just the formatting by attempting to undo once, and then undo + // your actual code by undoing again. + + + if (!(0, _textEdit().applyTextEditsToBuffer)(editor.getBuffer(), edits)) { + throw new Error('Could not apply edits to text buffer.'); + } + + if (provider.keepCursorPosition) { + editor.setCursorBufferPosition(cursorPosition); + } + }).map(({ + edits + }) => edits); }); } @@ -353,78 +372,63 @@ export default class CodeFormatManager { return { priority: 0, timeout: SAVE_TIMEOUT, - callback: this._formatCodeOnSaveInTextEditor.bind(this), + callback: this._formatCodeOnSaveInTextEditor.bind(this) }; } - _formatCodeOnSaveInTextEditor(editor: atom$TextEditor): Observable { - const saveProviders = [ - ...this._onSaveProviders.getAllProvidersForEditor(editor), - ]; + _formatCodeOnSaveInTextEditor(editor) { + const saveProviders = [...this._onSaveProviders.getAllProvidersForEditor(editor)]; + if (saveProviders.length > 0) { - return Observable.defer(() => - this._reportBusy( - editor, - Promise.all(saveProviders.map(p => p.formatOnSave(editor))), - false, - ), - ) - .switchMap(allEdits => { - const firstNonEmpty = allEdits.find(edits => edits.length > 0); - if (firstNonEmpty == null) { - return Observable.empty(); - } else { - return Observable.of(firstNonEmpty); - } - }) - .flatMap(edits => Observable.of(...edits)); - } else if (getFormatOnSave(editor)) { - return this._formatCodeInTextEditor( - editor, - editor.getBuffer().getRange(), - ).flatMap(edits => Observable.of(...edits)); + return _rxjsCompatUmdMin.Observable.defer(() => this._reportBusy(editor, Promise.all(saveProviders.map(p => p.formatOnSave(editor))), false)).switchMap(allEdits => { + const firstNonEmpty = allEdits.find(edits => edits.length > 0); + + if (firstNonEmpty == null) { + return _rxjsCompatUmdMin.Observable.empty(); + } else { + return _rxjsCompatUmdMin.Observable.of(firstNonEmpty); + } + }).flatMap(edits => _rxjsCompatUmdMin.Observable.of(...edits)); + } else if ((0, _config().getFormatOnSave)(editor)) { + return this._formatCodeInTextEditor(editor, editor.getBuffer().getRange()).flatMap(edits => _rxjsCompatUmdMin.Observable.of(...edits)); } - return Observable.empty(); + + return _rxjsCompatUmdMin.Observable.empty(); } - _reportBusy( - editor: atom$TextEditor, - promise: Promise, - revealTooltip?: boolean = true, - ): Promise { + _reportBusy(editor, promise, revealTooltip = true) { const busySignalService = this._busySignalService; + if (busySignalService != null) { const path = editor.getPath(); - const displayPath = - path != null ? nuclideUri.basename(path) : ''; - return busySignalService.reportBusyWhile( - `Formatting code in ${displayPath}`, - () => promise, - {revealTooltip}, - ); + const displayPath = path != null ? _nuclideUri().default.basename(path) : ''; + return busySignalService.reportBusyWhile(`Formatting code in ${displayPath}`, () => promise, { + revealTooltip + }); } + return promise; } - addRangeProvider(provider: RangeCodeFormatProvider): IDisposable { + addRangeProvider(provider) { return this._rangeProviders.addProvider(provider); } - addFileProvider(provider: FileCodeFormatProvider): IDisposable { + addFileProvider(provider) { return this._fileProviders.addProvider(provider); } - addOnTypeProvider(provider: OnTypeCodeFormatProvider): IDisposable { + addOnTypeProvider(provider) { return this._onTypeProviders.addProvider(provider); } - addOnSaveProvider(provider: OnSaveCodeFormatProvider): IDisposable { + addOnSaveProvider(provider) { return this._onSaveProviders.addProvider(provider); } - consumeBusySignal(busySignalService: BusySignalService): IDisposable { + consumeBusySignal(busySignalService) { this._busySignalService = busySignalService; - return new UniversalDisposable(() => { + return new (_UniversalDisposable().default)(() => { this._busySignalService = null; }); } @@ -432,9 +436,12 @@ export default class CodeFormatManager { dispose() { this._subscriptions.dispose(); } + } -function shouldFormatOnType(event: atom$TextEditEvent): boolean { +exports.default = CodeFormatManager; + +function shouldFormatOnType(event) { // There's not a direct way to figure out what caused this edit event. There // are three cases that we want to pay attention to: // @@ -460,20 +467,21 @@ function shouldFormatOnType(event: atom$TextEditEvent): boolean { } else if (event.newText.length > 1 && !isBracketPair(event.newText)) { return false; } + return true; } - /** * We can't tell the difference between a paste and the bracket-matcher package * inserting an extra bracket, so we just assume that any pair of brackets that * bracket-matcher recognizes was a pair matched by the package. */ -function isBracketPair(typedText: string): boolean { + + +function isBracketPair(typedText) { if (atom.packages.getActivePackage('bracket-matcher') == null) { return false; } - const validBracketPairs: Array = (atom.config.get( - 'bracket-matcher.autocompleteCharacters', - ): any); + + const validBracketPairs = atom.config.get('bracket-matcher.autocompleteCharacters'); return validBracketPairs.indexOf(typedText) !== -1; -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/config.js b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/config.js index b80cc1e37f..158b0d1c4c 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/config.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/config.js @@ -1,3 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getFormatOnSave = getFormatOnSave; +exports.getFormatOnType = getFormatOnType; + +function _featureConfig() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/feature-config")); + + _featureConfig = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,22 +26,17 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +function getFormatOnSave(editor) { + const formatOnSave = _featureConfig().default.get('atom-ide-code-format.formatOnSave', { + scope: editor.getRootScopeDescriptor() + }); -import featureConfig from 'nuclide-commons-atom/feature-config'; - -export function getFormatOnSave(editor: atom$TextEditor): boolean { - const formatOnSave = (featureConfig.get('atom-ide-code-format.formatOnSave', { - scope: editor.getRootScopeDescriptor(), - }): any); return formatOnSave == null ? false : formatOnSave; } -export function getFormatOnType(): boolean { - return featureConfig.getWithDefaults( - 'atom-ide-code-format.formatOnType', - false, - ); -} +function getFormatOnType() { + return _featureConfig().default.getWithDefaults('atom-ide-code-format.formatOnType', false); +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/main.js b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/main.js index f5824a01cb..30a9ae683d 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/main.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/main.js @@ -1,3 +1,27 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _CodeFormatManager() { + const data = _interopRequireDefault(require("./CodeFormatManager")); + + _CodeFormatManager = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,43 +30,22 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {BusySignalService} from '../../atom-ide-busy-signal/lib/types'; -import type { - CodeFormatProvider, - RangeCodeFormatProvider, - FileCodeFormatProvider, - OnTypeCodeFormatProvider, - OnSaveCodeFormatProvider, -} from './types'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import CodeFormatManager from './CodeFormatManager'; - class Activation { - codeFormatManager: CodeFormatManager; - constructor() { - this.codeFormatManager = new CodeFormatManager(); + this.codeFormatManager = new (_CodeFormatManager().default)(); } - consumeLegacyProvider(provider: CodeFormatProvider): IDisposable { + consumeLegacyProvider(provider) { // Legacy providers used `selector` / `inclusionPriority`. // $FlowIgnore legacy API compatability. - provider.grammarScopes = - provider.grammarScopes || - // $FlowIgnore - (provider.selector != null ? provider.selector.split(', ') : null); - provider.priority = - provider.priority != null - ? provider.priority - : // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) - provider.inclusionPriority != null - ? provider.inclusionPriority - : 0; + provider.grammarScopes = provider.grammarScopes || ( // $FlowIgnore + provider.selector != null ? provider.selector.split(', ') : null); + provider.priority = provider.priority != null ? provider.priority : // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) + provider.inclusionPriority != null ? provider.inclusionPriority : 0; + if (provider.formatCode) { return this.consumeRangeProvider(provider); } else if (provider.formatEntireFile) { @@ -52,32 +55,34 @@ class Activation { } else if (provider.formatOnSave) { return this.consumeOnSaveProvider(provider); } + throw new Error('Invalid code format provider'); } - consumeRangeProvider(provider: RangeCodeFormatProvider): IDisposable { + consumeRangeProvider(provider) { return this.codeFormatManager.addRangeProvider(provider); } - consumeFileProvider(provider: FileCodeFormatProvider): IDisposable { + consumeFileProvider(provider) { return this.codeFormatManager.addFileProvider(provider); } - consumeOnTypeProvider(provider: OnTypeCodeFormatProvider): IDisposable { + consumeOnTypeProvider(provider) { return this.codeFormatManager.addOnTypeProvider(provider); } - consumeOnSaveProvider(provider: OnSaveCodeFormatProvider): IDisposable { + consumeOnSaveProvider(provider) { return this.codeFormatManager.addOnSaveProvider(provider); } - consumeBusySignal(busySignalService: BusySignalService): IDisposable { + consumeBusySignal(busySignalService) { return this.codeFormatManager.consumeBusySignal(busySignalService); } dispose() { this.codeFormatManager.dispose(); } + } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/types.js b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/types.js index 646d716526..9a390c31f7 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/types.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-format/lib/types.js @@ -1,97 +1 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict-local - * @format - */ - -import type {TextEdit} from 'nuclide-commons-atom/text-edit'; - -/** - * A brief overview of the different code formatting providers: - * - * == Range formatters == - * These accept a range to format and return a list of edits to apply. - * These will always be preferred over file formatters when a range is selected. - * - * == File formatters == - * These always return the result of formatting the entire file. - * To compensate, they can return a custom cursor position to avoid disruption. - * These will be preferred over range formatters for whole-file formatting. - * - * == onType formatters == - * These are run after every typing event in a selected editor. - * - * == onSave formatters == - * These are run whenever a selected editor is saved. - * If the global format-on-save option is enabled, then file/range formatters - * will be triggered on save (even if no save formatters are provided). - * Obviously, save formatters are preferred in this case. - */ - -/** - * Formats the range specified, and returns a list of text edits to apply. - * Text edits must be non-overlapping and preferably in reverse-sorted order. - */ -export type RangeCodeFormatProvider = {| - formatCode: ( - editor: atom$TextEditor, - range: atom$Range, - ) => Promise>, - priority: number, - +grammarScopes?: Array, -|}; - -/** - * Formats the range specified, but returns the entire file (along with the new cursor position). - * Useful for less-flexible providers like clang-format. - */ -export type FileCodeFormatProvider = {| - formatEntireFile: ( - editor: atom$TextEditor, - range: atom$Range, - ) => Promise, - priority: number, - +grammarScopes?: Array, -|}; - -/** - * Formats around the given position, and returns a list of text edits to - * apply, similar to `formatCode`. The provider determines the exact - * range to format based on what's at that position. - * - * This will automatically triggered after every typing event. - */ -export type OnTypeCodeFormatProvider = {| - formatAtPosition: ( - editor: atom$TextEditor, - position: atom$Point, - triggerCharacter: string, - ) => Promise>, - priority: number, - +grammarScopes?: Array, - keepCursorPosition: boolean, -|}; - -/** - * Formats files after save events. - */ -export type OnSaveCodeFormatProvider = {| - formatOnSave: (editor: atom$TextEditor) => Promise>, - priority: number, - +grammarScopes?: Array, -|}; - -export type CodeFormatProvider = - | RangeCodeFormatProvider - | FileCodeFormatProvider - | OnTypeCodeFormatProvider - | OnSaveCodeFormatProvider; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/__atom_tests__/CodeHighlightManager-test.js b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/__atom_tests__/CodeHighlightManager-test.js index 86446178e8..ce2e01574f 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/__atom_tests__/CodeHighlightManager-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/__atom_tests__/CodeHighlightManager-test.js @@ -1,3 +1,51 @@ +"use strict"; + +var _os = _interopRequireDefault(require("os")); + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +var _atom = require("atom"); + +function _waits_for() { + const data = _interopRequireDefault(require("../../../../../jest/waits_for")); + + _waits_for = function () { + return data; + }; + + return data; +} + +function _promise() { + const data = require("../../../../nuclide-commons/promise"); + + _promise = function () { + return data; + }; + + return data; +} + +function _CodeHighlightManager() { + const data = _interopRequireDefault(require("../lib/CodeHighlightManager")); + + _CodeHighlightManager = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,83 +54,63 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ -import os from 'os'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {Point, Range} from 'atom'; -import waitsFor from '../../../../../jest/waits_for'; -import {sleep} from 'nuclide-commons/promise'; - -import CodeHighlightManager from '../lib/CodeHighlightManager'; - describe('CodeHighlightManager', () => { let manager; let provider; let editor; beforeEach(async () => { jest.restoreAllMocks(); - editor = await atom.workspace.open( - nuclideUri.join(os.tmpdir(), 'test.txt'), - ); + editor = await atom.workspace.open(_nuclideUri().default.join(_os.default.tmpdir(), 'test.txt')); editor.setText('abc\ndef\nghi'); - - manager = new CodeHighlightManager(); + manager = new (_CodeHighlightManager().default)(); provider = { priority: 1, grammarScopes: ['text.plain.null-grammar'], - highlight: (_editor, position) => Promise.resolve([]), + highlight: (_editor, position) => Promise.resolve([]) }; manager.addProvider(provider); }); - it.skip('updates highlights on cursor move', async () => { - const ranges = [new Range([0, 0], [0, 3])]; - const spy = jest.spyOn(provider, 'highlight').mockReturnValue(ranges); + const ranges = [new _atom.Range([0, 0], [0, 3])]; + const spy = jest.spyOn(provider, 'highlight').mockReturnValue(ranges); // Just opening the editor should trigger highlights. - // Just opening the editor should trigger highlights. - await sleep(1); // editor debounce - expect(spy).toHaveBeenCalled(); + await (0, _promise().sleep)(1); // editor debounce - // (once the promise resolves). - await waitsFor(() => manager._markers.length === 1); + expect(spy).toHaveBeenCalled(); // (once the promise resolves). - ranges[0] = new Range([1, 0], [1, 3]); - editor.setCursorBufferPosition(new Point(1, 0)); - await sleep(300); // trigger debounce + await (0, _waits_for().default)(() => manager._markers.length === 1); + ranges[0] = new _atom.Range([1, 0], [1, 3]); + editor.setCursorBufferPosition(new _atom.Point(1, 0)); + await (0, _promise().sleep)(300); // trigger debounce // Old markers should be cleared immediately. + expect(manager._markers.length).toBe(0); expect(spy.mock.calls.length).toBe(2); + await (0, _waits_for().default)(() => manager._markers.length === 1); // If we're still inside the range, don't fire a new event. - await waitsFor(() => manager._markers.length === 1); - - // If we're still inside the range, don't fire a new event. - editor.setCursorBufferPosition(new Point(1, 1)); + editor.setCursorBufferPosition(new _atom.Point(1, 1)); expect(spy.mock.calls.length).toBe(2); + atom.workspace.open(_nuclideUri().default.join(_os.default.tmpdir(), 'test2.txt')); // Opening a new editor should clear out old markers. - atom.workspace.open(nuclideUri.join(os.tmpdir(), 'test2.txt')); - - // Opening a new editor should clear out old markers. - await sleep(1); + await (0, _promise().sleep)(1); expect(manager._markers.length).toBe(0); }); - it('updates highlights on change', async () => { - const ranges = [new Range([0, 0], [0, 1])]; + const ranges = [new _atom.Range([0, 0], [0, 1])]; const spy = jest.spyOn(provider, 'highlight').mockReturnValue(ranges); - - await sleep(1); + await (0, _promise().sleep)(1); editor.insertText('a'); - await sleep(3000); // trigger typing debounce - expect(spy).toHaveBeenCalled(); + await (0, _promise().sleep)(3000); // trigger typing debounce + + expect(spy).toHaveBeenCalled(); // Wait for the promise to resolve. - // Wait for the promise to resolve. - await waitsFor(() => manager._markers.length === 1); + await (0, _waits_for().default)(() => manager._markers.length === 1); + editor.insertText('b'); // Clear out immediately. - editor.insertText('b'); - // Clear out immediately. expect(manager._markers.length).toBe(0); }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/CodeHighlightManager.js b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/CodeHighlightManager.js index f3b10b27d6..64bbd4ec3e 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/CodeHighlightManager.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/CodeHighlightManager.js @@ -1,3 +1,74 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _log4js() { + const data = require("log4js"); + + _log4js = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _event() { + const data = require("../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +function _observable() { + const data = require("../../../../nuclide-commons/observable"); + + _observable = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _ProviderRegistry() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/ProviderRegistry")); + + _ProviderRegistry = function () { + return data; + }; + + return data; +} + +function _debounced() { + const data = require("../../../../nuclide-commons-atom/debounced"); + + _debounced = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,141 +77,96 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +const CURSOR_DELAY_MS = 250; // Apply a much higher debounce to text changes to avoid disrupting the typing experience. -import type {CodeHighlightProvider} from './types'; - -import {getLogger} from 'log4js'; -import {Observable} from 'rxjs'; -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import {fastDebounce, toggle} from 'nuclide-commons/observable'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import ProviderRegistry from 'nuclide-commons-atom/ProviderRegistry'; -import {observeActiveEditorsDebounced} from 'nuclide-commons-atom/debounced'; - -const CURSOR_DELAY_MS = 250; -// Apply a much higher debounce to text changes to avoid disrupting the typing experience. const CHANGE_TOGGLE_MS = 2500; -export default class CodeHighlightManager { - _subscriptions: UniversalDisposable; - _providers: ProviderRegistry; - _markers: Array; - +class CodeHighlightManager { constructor() { - this._providers = new ProviderRegistry(); + this._providers = new (_ProviderRegistry().default)(); this._markers = []; - this._subscriptions = new UniversalDisposable(this._highlightEditors()); + this._subscriptions = new (_UniversalDisposable().default)(this._highlightEditors()); } - _highlightEditors(): rxjs$Subscription { - return observeActiveEditorsDebounced(0) - .do(() => this._destroyMarkers()) - .switchMap(editor => { - if (editor == null) { - return Observable.empty(); - } - const cursorPositions = observableFromSubscribeFunction( - editor.onDidChangeCursorPosition.bind(editor), - ) - .filter( - // If we're moving around inside highlighted ranges, that's fine. - event => - !this._isPositionInHighlightedRanges( - editor, - event.newBufferPosition, - ), - ) - .do(() => this._destroyMarkers()) // Immediately clear previous markers. - .let(fastDebounce(CURSOR_DELAY_MS)) - .startWith((null: any)) // Immediately kick off a highlight event. - .map(() => editor.getCursorBufferPosition()); - - // Changing text triggers a CHANGE_TOGGLE_MS period in which cursor changes are ignored. - // We'll model this as one stream that emits 'false' and another that debounces 'true's. - const changeEvents = observableFromSubscribeFunction( - editor.onDidChange.bind(editor), - ) - .do(() => this._destroyMarkers()) - .share(); - - const changeToggles = Observable.merge( - Observable.of(true), - changeEvents.mapTo(false), - changeEvents.let(fastDebounce(CHANGE_TOGGLE_MS)).mapTo(true), - ); - - const destroyEvents = observableFromSubscribeFunction( - editor.onDidDestroy.bind(editor), - ); - - return cursorPositions - .let(toggle(changeToggles)) - .switchMap(async position => { - return { - editor, - ranges: await this._getHighlightedRanges(editor, position), - }; - }) - .takeUntil(destroyEvents); - }) - .subscribe(({editor, ranges}) => { - if (ranges != null) { - this._highlightRanges(editor, ranges); - } - }); + _highlightEditors() { + return (0, _debounced().observeActiveEditorsDebounced)(0).do(() => this._destroyMarkers()).switchMap(editor => { + if (editor == null) { + return _rxjsCompatUmdMin.Observable.empty(); + } + + const cursorPositions = (0, _event().observableFromSubscribeFunction)(editor.onDidChangeCursorPosition.bind(editor)).filter( // If we're moving around inside highlighted ranges, that's fine. + event => !this._isPositionInHighlightedRanges(editor, event.newBufferPosition)).do(() => this._destroyMarkers()) // Immediately clear previous markers. + .let((0, _observable().fastDebounce)(CURSOR_DELAY_MS)).startWith(null) // Immediately kick off a highlight event. + .map(() => editor.getCursorBufferPosition()); // Changing text triggers a CHANGE_TOGGLE_MS period in which cursor changes are ignored. + // We'll model this as one stream that emits 'false' and another that debounces 'true's. + + const changeEvents = (0, _event().observableFromSubscribeFunction)(editor.onDidChange.bind(editor)).do(() => this._destroyMarkers()).share(); + + const changeToggles = _rxjsCompatUmdMin.Observable.merge(_rxjsCompatUmdMin.Observable.of(true), changeEvents.mapTo(false), changeEvents.let((0, _observable().fastDebounce)(CHANGE_TOGGLE_MS)).mapTo(true)); + + const destroyEvents = (0, _event().observableFromSubscribeFunction)(editor.onDidDestroy.bind(editor)); + return cursorPositions.let((0, _observable().toggle)(changeToggles)).switchMap(async position => { + return { + editor, + ranges: await this._getHighlightedRanges(editor, position) + }; + }).takeUntil(destroyEvents); + }).subscribe(({ + editor, + ranges + }) => { + if (ranges != null) { + this._highlightRanges(editor, ranges); + } + }); } - async _getHighlightedRanges( - editor: atom$TextEditor, - position: atom$Point, - ): Promise> { - const providers = Array.from( - this._providers.getAllProvidersForEditor(editor), - ); + async _getHighlightedRanges(editor, position) { + const providers = Array.from(this._providers.getAllProvidersForEditor(editor)); + try { - const highlights = await Promise.all( - providers.map(p => p.highlight(editor, position)), - ); + const highlights = await Promise.all(providers.map(p => p.highlight(editor, position))); return highlights.find(h => h != null && h.length > 0); } catch (e) { - getLogger('code-highlight').error('Error getting code highlights', e); + (0, _log4js().getLogger)('code-highlight').error('Error getting code highlights', e); return null; } } - _highlightRanges(editor: atom$TextEditor, ranges: Array): void { + _highlightRanges(editor, ranges) { this._destroyMarkers(); + this._markers = ranges.map(range => editor.markBufferRange(range, {})); + this._markers.forEach(marker => { editor.decorateMarker(marker, { type: 'highlight', - class: 'code-highlight-marker', + class: 'code-highlight-marker' }); }); } - _isPositionInHighlightedRanges( - editor: atom$TextEditor, - position: atom$Point, - ): boolean { - return this._markers - .map(marker => marker.getBufferRange()) - .some(range => range.containsPoint(position)); + _isPositionInHighlightedRanges(editor, position) { + return this._markers.map(marker => marker.getBufferRange()).some(range => range.containsPoint(position)); } - _destroyMarkers(): void { + _destroyMarkers() { this._markers.splice(0).forEach(marker => marker.destroy()); } - addProvider(provider: CodeHighlightProvider): IDisposable { + addProvider(provider) { return this._providers.addProvider(provider); } dispose() { this._subscriptions.dispose(); + this._destroyMarkers(); } + } + +exports.default = CodeHighlightManager; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/main.js b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/main.js index 2444af619f..5db10c8cff 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/main.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/main.js @@ -1,3 +1,27 @@ +"use strict"; + +function _createPackage() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _CodeHighlightManager() { + const data = _interopRequireDefault(require("./CodeHighlightManager")); + + _CodeHighlightManager = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,29 +30,22 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {CodeHighlightProvider} from './types'; - -import createPackage from 'nuclide-commons-atom/createPackage'; -import CodeHighlightManager from './CodeHighlightManager'; - class Activation { - _codeHighlightManager: CodeHighlightManager; - constructor() { - this._codeHighlightManager = new CodeHighlightManager(); + this._codeHighlightManager = new (_CodeHighlightManager().default)(); } dispose() { this._codeHighlightManager.dispose(); } - addProvider(provider: CodeHighlightProvider): IDisposable { + addProvider(provider) { return this._codeHighlightManager.addProvider(provider); } + } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/types.js b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/types.js index dbe7e82b05..9a390c31f7 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/types.js +++ b/modules/atom-ide-ui/pkg/atom-ide-code-highlight/lib/types.js @@ -1,20 +1 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow strict - * @format - */ - -export type CodeHighlightProvider = { - highlight( - editor: atom$TextEditor, - bufferPosition: atom$Point, - ): Promise>, - priority: number, - +grammarScopes?: Array, -}; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/__atom_tests__/ConsoleView-test.js b/modules/atom-ide-ui/pkg/atom-ide-console/__atom_tests__/ConsoleView-test.js index 9a4ab72404..ad54fa969f 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/__atom_tests__/ConsoleView-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/__atom_tests__/ConsoleView-test.js @@ -1,3 +1,33 @@ +"use strict"; + +var React = _interopRequireWildcard(require("react")); + +var _reactDom = _interopRequireDefault(require("react-dom")); + +function _testUtils() { + const data = _interopRequireDefault(require("react-dom/test-utils")); + + _testUtils = function () { + return data; + }; + + return data; +} + +function _ConsoleView() { + const data = _interopRequireDefault(require("../lib/ui/ConsoleView")); + + _ConsoleView = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,61 +36,61 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format * @emails oncall+nuclide */ -import invariant from 'assert'; -import * as React from 'react'; -import ReactDom from 'react-dom'; -import TestUtils from 'react-dom/test-utils'; -import ConsoleView from '../lib/ui/ConsoleView'; - describe('ConsoleView', () => { it('focuses the filter when "/" is pressed inside the console-scroll-pane-wrapper div', () => { - const consoleView: ConsoleView = (TestUtils.renderIntoDocument( - {}} - createPaste={null} - currentExecutor={null} - records={[]} - enableRegExpFilter={true} - execute={() => {}} - executors={new Map()} - filterText={''} - filteredRecordCount={0} - fontSize={12} - getProvider={() => {}} - history={[]} - invalidFilterInput={false} - resetAllFilters={() => {}} - selectExecutor={() => {}} - selectSources={() => {}} - selectedSourceIds={[]} - sources={[]} - updateFilter={() => {}} - watchEditor={null} - selectedSeverities={new Set(['error', 'warning', 'info'])} - toggleSeverity={() => {}} - />, - ): any); + const consoleView = _testUtils().default.renderIntoDocument(React.createElement(_ConsoleView().default, { + clearRecords: () => {}, + createPaste: null, + currentExecutor: null, + records: [], + enableRegExpFilter: true, + execute: () => {}, + executors: new Map(), + filterText: '', + filteredRecordCount: 0, + fontSize: 12, + getProvider: () => {}, + history: [], + invalidFilterInput: false, + resetAllFilters: () => {}, + selectExecutor: () => {}, + selectSources: () => {}, + selectedSourceIds: [], + sources: [], + updateFilter: () => {}, + watchEditor: null, + selectedSeverities: new Set(['error', 'warning', 'info']), + toggleSeverity: () => {} + })); const workspaceEl = atom.views.getView(atom.workspace); - const consoleViewNode = ReactDom.findDOMNode(consoleView); - invariant(consoleViewNode != null); - workspaceEl.appendChild(consoleViewNode); + const consoleViewNode = _reactDom.default.findDOMNode(consoleView); + + if (!(consoleViewNode != null)) { + throw new Error("Invariant violation: \"consoleViewNode != null\""); + } + + workspaceEl.appendChild(consoleViewNode); const consoleHeaderComponent = consoleView._consoleHeaderComponent; - invariant(consoleHeaderComponent != null); + + if (!(consoleHeaderComponent != null)) { + throw new Error("Invariant violation: \"consoleHeaderComponent != null\""); + } + const filterFocusSpy = jest.spyOn(consoleHeaderComponent, 'focusFilter'); + const consoleScrollPaneTarget = workspaceEl.querySelector('.console-scroll-pane-wrapper'); - const consoleScrollPaneTarget = workspaceEl.querySelector( - '.console-scroll-pane-wrapper', - ); - invariant(consoleScrollPaneTarget != null); - atom.commands.dispatch(consoleScrollPaneTarget, 'atom-ide:filter'); + if (!(consoleScrollPaneTarget != null)) { + throw new Error("Invariant violation: \"consoleScrollPaneTarget != null\""); + } + atom.commands.dispatch(consoleScrollPaneTarget, 'atom-ide:filter'); expect(filterFocusSpy).toHaveBeenCalled(); workspaceEl.removeChild(consoleViewNode); }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Epics-test.js b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Epics-test.js index 45564eab4f..ab255807a6 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Epics-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Epics-test.js @@ -1,3 +1,39 @@ +"use strict"; + +function _reduxObservable() { + const data = require("../../../../nuclide-commons/redux-observable"); + + _reduxObservable = function () { + return data; + }; + + return data; +} + +function Actions() { + const data = _interopRequireWildcard(require("../lib/redux/Actions")); + + Actions = function () { + return data; + }; + + return data; +} + +function Epics() { + const data = _interopRequireWildcard(require("../lib/redux/Epics")); + + Epics = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,58 +42,53 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format * @emails oncall+nuclide */ -import type {AppState, ConsoleSourceStatus} from '../lib/types'; - -import {ActionsObservable} from 'nuclide-commons/redux-observable'; -import * as Actions from '../lib/redux/Actions'; -import * as Epics from '../lib/redux/Epics'; -import invariant from 'assert'; -import {Observable, Subject} from 'rxjs'; - describe('Epics', () => { describe('provideConsole (registerSourceEpic)', () => { it('observes the status', () => { const mockStore = { subscribe: () => () => {}, dispatch: () => {}, - getState: () => (({}: any): AppState), + getState: () => ({}) }; const id = 'test'; const provider = { id, name: id, - messages: Observable.never(), + messages: _rxjsCompatUmdMin.Observable.never(), start: () => {}, - stop: () => {}, + stop: () => {} }; - const actions = new ActionsObservable( - Observable.of(Actions.registerSource(provider)), - ); + const actions = new (_reduxObservable().ActionsObservable)(_rxjsCompatUmdMin.Observable.of(Actions().registerSource(provider))); let results = []; - Epics.registerRecordProviderEpic(actions, mockStore).subscribe( - results.push.bind(results), - ); - const statusSubject = new Subject(); - const setStatus = (status: ConsoleSourceStatus): void => { - statusSubject.next(Actions.updateStatus(id, status)); + Epics().registerRecordProviderEpic(actions, mockStore).subscribe(results.push.bind(results)); + const statusSubject = new _rxjsCompatUmdMin.Subject(); + + const setStatus = status => { + statusSubject.next(Actions().updateStatus(id, status)); }; + statusSubject.subscribe(results.push.bind(results)); - invariant(setStatus != null); + + if (!(setStatus != null)) { + throw new Error("Invariant violation: \"setStatus != null\""); + } + setStatus('running'); setStatus('stopped'); setStatus('running'); - results = results.filter(action => action.type === Actions.UPDATE_STATUS); + results = results.filter(action => action.type === Actions().UPDATE_STATUS); expect(results.length).toBe(3); - expect( - results.map(action => { - invariant(action.type === Actions.UPDATE_STATUS); - return action.payload.status; - }), - ).toEqual(['running', 'stopped', 'running']); + expect(results.map(action => { + if (!(action.type === Actions().UPDATE_STATUS)) { + throw new Error("Invariant violation: \"action.type === Actions.UPDATE_STATUS\""); + } + + return action.payload.status; + })).toEqual(['running', 'stopped', 'running']); }); }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Reducers-test.js b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Reducers-test.js index 787e0c4eb9..7e895aebbb 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Reducers-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Reducers-test.js @@ -1,3 +1,56 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.createDummyExecutor = createDummyExecutor; + +function Actions() { + const data = _interopRequireWildcard(require("../lib/redux/Actions")); + + Actions = function () { + return data; + }; + + return data; +} + +function _Reducers() { + const data = _interopRequireDefault(require("../lib/redux/Reducers")); + + _Reducers = function () { + return data; + }; + + return data; +} + +function Immutable() { + const data = _interopRequireWildcard(require("immutable")); + + Immutable = function () { + return data; + }; + + return data; +} + +function _uuid() { + const data = _interopRequireDefault(require("uuid")); + + _uuid = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,19 +59,10 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format * @emails oncall+nuclide */ -import type {Action, Executor, AppState} from '../lib/types'; - -import invariant from 'assert'; -import * as Actions from '../lib/redux/Actions'; -import Reducers from '../lib/redux/Reducers'; -import * as Immutable from 'immutable'; -import uuid from 'uuid'; -import {Observable} from 'rxjs'; - const emptyAppState = { createPasteFunction: null, currentExecutorId: null, @@ -26,151 +70,135 @@ const emptyAppState = { executors: new Map(), providers: new Map(), providerStatuses: new Map(), - records: Immutable.List(), - incompleteRecords: Immutable.List(), - history: [], + records: Immutable().List(), + incompleteRecords: Immutable().List(), + history: [] }; - describe('createStateStream', () => { describe('RECORD_RECEIVED', () => { let finalState; let initialRecords; - beforeEach(() => { - initialRecords = Immutable.List(); - const initialState: AppState = { - ...emptyAppState, + initialRecords = Immutable().List(); + const initialState = Object.assign({}, emptyAppState, { maxMessageCount: 2, - records: initialRecords, - }; + records: initialRecords + }); const actions = []; + for (let i = 0; i < 5; i++) { actions.push({ - type: Actions.RECORD_RECEIVED, + type: Actions().RECORD_RECEIVED, payload: { record: { level: 'info', - text: i.toString(), - }, - }, + text: i.toString() + } + } }); } - finalState = ((actions: any): Array).reduce( - Reducers, - initialState, - ); - }); + finalState = actions.reduce(_Reducers().default, initialState); + }); it('adds records', () => { expect(finalState.records.size).toBeGreaterThan(0); }); - it('truncates the record list using `maxMessageCount`', () => { expect(finalState.records.size).toBe(2); }); - it('truncates the least recent records', () => { - expect(finalState.records.map(record => record.text).toArray()).toEqual([ - '3', - '4', - ]); + expect(finalState.records.map(record => record.text).toArray()).toEqual(['3', '4']); }); - it("doesn't mutate the original records list", () => { expect(initialRecords.size).toBe(0); }); }); - describe('RECORD_UPDATED', () => { - let finalState: AppState; + let finalState; let initialRecords; - let messageIds: Array = []; - + let messageIds = []; beforeEach(() => { messageIds = []; - initialRecords = Immutable.List(); - const initialState = { - ...emptyAppState, + initialRecords = Immutable().List(); + const initialState = Object.assign({}, emptyAppState, { maxMessageCount: 2, - records: initialRecords, - }; + records: initialRecords + }); const actions = []; - for (let i = 0; i < 2; i++) { - messageIds[i] = uuid.v4(); + for (let i = 0; i < 2; i++) { + messageIds[i] = _uuid().default.v4(); actions.push({ - type: Actions.RECORD_RECEIVED, + type: Actions().RECORD_RECEIVED, payload: { record: { level: 'info', text: i.toString(), incomplete: true, - messageId: messageIds[i], - }, - }, + messageId: messageIds[i] + } + } }); - } - - // Check that appending updates the text on the correct record + } // Check that appending updates the text on the correct record // and doesn't modify others. + + actions.push({ - type: Actions.RECORD_UPDATED, + type: Actions().RECORD_UPDATED, payload: { messageId: messageIds[0], appendText: '!', overrideLevel: 'warning', - setComplete: false, - }, - }); + setComplete: false + } + }); // Appending twice updates the record correctly. - // Appending twice updates the record correctly. actions.push({ - type: Actions.RECORD_UPDATED, + type: Actions().RECORD_UPDATED, payload: { messageId: messageIds[0], appendText: '!', overrideLevel: 'warning', - setComplete: false, - }, + setComplete: false + } }); - - finalState = ((actions: any): Array).reduce( - Reducers, - initialState, - ); + finalState = actions.reduce(_Reducers().default, initialState); }); - it('Updates incomplete records test and level correctly', () => { expect(finalState.records.size).toBe(0); expect(finalState.incompleteRecords.size).toBe(2); const message0 = finalState.incompleteRecords.get(0); - invariant(message0 != null); + + if (!(message0 != null)) { + throw new Error("Invariant violation: \"message0 != null\""); + } + expect(message0.messageId).toBe(messageIds[0]); expect(message0.text).toBe('0!!'); expect(message0.level).toBe('warning'); - expect(message0.incomplete).toBe(true); + expect(message0.incomplete).toBe(true); // Message 1 was not mutated. - // Message 1 was not mutated. const message1 = finalState.incompleteRecords.get(1); - invariant(message1 != null); + + if (!(message1 != null)) { + throw new Error("Invariant violation: \"message1 != null\""); + } + expect(message1.messageId).toBe(messageIds[1]); expect(message1.text).toBe('1'); expect(message1.level).toBe('info'); expect(message1.incomplete).toBe(true); }); - it('Completes the records', () => { - let newState = ([ - { - type: Actions.RECORD_UPDATED, - payload: { - messageId: messageIds[0], - appendText: null, - overrideLevel: null, - setComplete: true, - }, - }, - ]: Array).reduce(Reducers, finalState); + let newState = [{ + type: Actions().RECORD_UPDATED, + payload: { + messageId: messageIds[0], + appendText: null, + overrideLevel: null, + setComplete: true + } + }].reduce(_Reducers().default, finalState); let message0 = newState.records.get(0); let message1 = newState.incompleteRecords.get(0); @@ -178,165 +206,144 @@ describe('createStateStream', () => { expect(newState.records.size).toBe(1); expect(newState.incompleteRecords.size).toBe(1); - invariant(message0 != null); + if (!(message0 != null)) { + throw new Error("Invariant violation: \"message0 != null\""); + } + expect(message0.messageId).toBe(messageIds[0]); expect(message0.text).toBe('0!!'); expect(message0.level).toBe('warning'); expect(message0.incomplete).toBe(false); - invariant(message1 != null); + if (!(message1 != null)) { + throw new Error("Invariant violation: \"message1 != null\""); + } + expect(message1.messageId).toBe(messageIds[1]); expect(message1.text).toBe('1'); expect(message1.level).toBe('info'); expect(message1.incomplete).toBe(true); }; - verify(); - - // Attempting to update a completed message throws and doesn't + verify(); // Attempting to update a completed message throws and doesn't // change the state. + let thrown = false; + try { - newState = ([ - { - type: Actions.RECORD_UPDATED, - payload: { - messageId: messageIds[0], - appendText: '!', - overrideLevel: null, - setComplete: true, - }, - }, - ]: Array).reduce(Reducers, newState); + newState = [{ + type: Actions().RECORD_UPDATED, + payload: { + messageId: messageIds[0], + appendText: '!', + overrideLevel: null, + setComplete: true + } + }].reduce(_Reducers().default, newState); } catch (_) { thrown = true; } + expect(thrown).toBe(true); message0 = newState.records.get(0); message1 = newState.incompleteRecords.get(0); verify(); }); }); - describe('REGISTER_SOURCE', () => { let initialProviders; let finalState; - beforeEach(() => { initialProviders = new Map(); - const initialState = { - ...emptyAppState, - providers: initialProviders, - }; - const actions = [ - { - type: Actions.REGISTER_SOURCE, - payload: { - source: { - id: 'test', - records: Observable.empty(), - }, - }, - }, - ]; - finalState = ((actions: any): Array).reduce( - Reducers, - initialState, - ); + const initialState = Object.assign({}, emptyAppState, { + providers: initialProviders + }); + const actions = [{ + type: Actions().REGISTER_SOURCE, + payload: { + source: { + id: 'test', + records: _rxjsCompatUmdMin.Observable.empty() + } + } + }]; + finalState = actions.reduce(_Reducers().default, initialState); }); - it('adds providers to the registry', () => { expect(finalState.providers.size).toBe(1); }); - it("doesn't mutate the original provider map", () => { expect(initialProviders.size).toBe(0); }); }); - describe('CLEAR_RECORDS', () => { let initialRecords; let finalState; - beforeEach(() => { - initialRecords = Immutable.List([ - { - kind: 'message', - sourceId: 'test-source', - sourceName: 'Test', - level: 'info', - text: 'test', - scopeName: null, - timestamp: new Date('2017-01-01T12:34:56.789Z'), - data: null, - repeatCount: 1, - incomplete: false, - }, - ]); - const initialState = { - ...emptyAppState, - records: initialRecords, - }; - const actions = [{type: Actions.CLEAR_RECORDS}]; - finalState = actions.reduce(Reducers, initialState); + initialRecords = Immutable().List([{ + kind: 'message', + sourceId: 'test-source', + sourceName: 'Test', + level: 'info', + text: 'test', + scopeName: null, + timestamp: new Date('2017-01-01T12:34:56.789Z'), + data: null, + repeatCount: 1, + incomplete: false + }]); + const initialState = Object.assign({}, emptyAppState, { + records: initialRecords + }); + const actions = [{ + type: Actions().CLEAR_RECORDS + }]; + finalState = actions.reduce(_Reducers().default, initialState); }); - it('clears the records', () => { expect(finalState.records.size).toBe(0); }); - it("doesn't mutate the original records list", () => { expect(initialRecords.size).toBe(1); }); }); - describe('executor registration', () => { let dummyExecutor; let initialExecutors; let initialState; let finalState; - beforeEach(() => { dummyExecutor = createDummyExecutor('a'); initialExecutors = new Map([['a', dummyExecutor]]); - initialState = { - ...emptyAppState, - executors: initialExecutors, - }; + initialState = Object.assign({}, emptyAppState, { + executors: initialExecutors + }); }); - describe('REGISTER_EXECUTOR', () => { beforeEach(() => { - const actions = [ - { - type: Actions.REGISTER_EXECUTOR, - payload: { - executor: createDummyExecutor('b'), - }, - }, - ]; - finalState = actions.reduce(Reducers, initialState); + const actions = [{ + type: Actions().REGISTER_EXECUTOR, + payload: { + executor: createDummyExecutor('b') + } + }]; + finalState = actions.reduce(_Reducers().default, initialState); }); - it('adds an executor', () => { expect(finalState.executors.size).toBe(2); }); - it("doesn't mutate the original executor map", () => { expect(initialExecutors.size).toBe(1); }); }); - describe('unregisterExecutor', () => { beforeEach(() => { - const actions = [Actions.unregisterExecutor(dummyExecutor)]; - finalState = actions.reduce(Reducers, initialState); + const actions = [Actions().unregisterExecutor(dummyExecutor)]; + finalState = actions.reduce(_Reducers().default, initialState); }); - it('removes an executor', () => { expect(finalState.executors.size).toBe(0); }); - it("doesn't mutate the original executor map", () => { expect(initialExecutors.size).toBe(1); }); @@ -344,12 +351,12 @@ describe('createStateStream', () => { }); }); -export function createDummyExecutor(id: string): Executor { +function createDummyExecutor(id) { return { id, name: id, scopeName: () => 'text.plain', - send: (code: string) => {}, - output: Observable.create(observer => {}), + send: code => {}, + output: _rxjsCompatUmdMin.Observable.create(observer => {}) }; -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Selectors-test.js b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Selectors-test.js index 61c56c3ba0..47d13abf05 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Selectors-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/Selectors-test.js @@ -1,3 +1,34 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.createDummyExecutor = createDummyExecutor; + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function Selectors() { + const data = _interopRequireWildcard(require("../lib/redux/Selectors")); + + Selectors = function () { + return data; + }; + + return data; +} + +function Immutable() { + const data = _interopRequireWildcard(require("immutable")); + + Immutable = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,22 +37,17 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ -import {Observable} from 'rxjs'; -import type {Executor} from '../lib/types'; -import * as Selectors from '../lib/redux/Selectors'; -import * as Immutable from 'immutable'; - -export function createDummyExecutor(id: string): Executor { +function createDummyExecutor(id) { return { id, name: id, scopeName: () => 'text.plain', - send: (code: string) => {}, - output: Observable.create(observer => {}), + send: code => {}, + output: _rxjsCompatUmdMin.Observable.create(observer => {}) }; } @@ -32,21 +58,18 @@ const baseAppState = { executors: new Map([['a', createDummyExecutor('a')]]), providers: new Map(), providerStatuses: new Map(), - records: Immutable.List(), - incompleteRecords: Immutable.List(), - history: [], + records: Immutable().List(), + incompleteRecords: Immutable().List(), + history: [] }; - describe('getCurrentExecutorId', () => { it('gets the current executor', () => { - expect(Selectors.getCurrentExecutorId(baseAppState)).toBe('a'); + expect(Selectors().getCurrentExecutorId(baseAppState)).toBe('a'); }); - it('returns an executor even if the current id is null', () => { - const appState = { - ...baseAppState, - currentExecutorId: null, - }; - expect(Selectors.getCurrentExecutorId(appState)).toBe('a'); + const appState = Object.assign({}, baseAppState, { + currentExecutorId: null + }); + expect(Selectors().getCurrentExecutorId(appState)).toBe('a'); }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/parseText-test.js b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/parseText-test.js index 1e774742d6..8155eb6aa8 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/parseText-test.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/__tests__/parseText-test.js @@ -1,3 +1,17 @@ +"use strict"; + +function _parseText() { + const data = _interopRequireDefault(require("../lib/parseText")); + + _parseText = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,19 +20,16 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format * @emails oncall+nuclide */ -import parseText from '../lib/parseText'; - describe('parseText', () => { it('parses url pattern', () => { - const chunks = parseText('Message: https://facebook.com'); + const chunks = (0, _parseText().default)('Message: https://facebook.com'); expect(chunks.length).toBe(3); expect(chunks[0]).toBe('Message: '); expect(chunks[2]).toBe(''); - const reactElement = chunks[1]; expect(typeof reactElement).toBe('object'); // type React.Element @@ -28,4 +39,4 @@ describe('parseText', () => { expect(reactElement.props.children).toBe('https://facebook.com'); } }); -}); +}); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/ConsoleServiceClient.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/ConsoleServiceClient.js index 370a78f6b8..e28e07550b 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/ConsoleServiceClient.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/ConsoleServiceClient.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = _default; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,40 +13,41 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {Observable} from 'rxjs'; -import type {Level} from './types'; - -type Send = (event: Object) => void; -type Events = Observable; - -export default function(send: Send, eventsFromService: Events) { +function _default(send, eventsFromService) { return { // TODO: Update these to be `(object: any, ...objects: Array): void` to allow for logging objects. - log(...args: Array): void { + log(...args) { send(createMessageEvent('log', args)); }, - error(...args: Array): void { + + error(...args) { send(createMessageEvent('error', args)); }, - warn(...args: Array): void { + + warn(...args) { send(createMessageEvent('warning', args)); }, - info(...args: Array): void { + + info(...args) { send(createMessageEvent('info', args)); }, - success(...args: Array): void { + + success(...args) { send(createMessageEvent('success', args)); - }, + } + }; } -function createMessageEvent(level: Level, args: Array) { +function createMessageEvent(level, args) { return { type: 'message', - data: {level, args}, + data: { + level, + args + } }; -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/main.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/main.js index 6d54f50df7..cc481537a9 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/main.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/main.js @@ -1,129 +1,211 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - * @format - */ - -import type { - AppState, - ConsolePersistedState, - ConsoleService, - SourceInfo, - Message, - ConsoleSourceStatus, - Record, - RecordToken, - RegisterExecutorFunction, - Store, - Level, - OpenEvent, -} from './types'; -import type {CreatePasteFunction} from './types'; - -import {List} from 'immutable'; -import createPackage from 'nuclide-commons-atom/createPackage'; -import {destroyItemWhere} from 'nuclide-commons-atom/destroyItemWhere'; -import {combineEpicsFromImports} from 'nuclide-commons/epicHelpers'; -import {Observable} from 'rxjs'; -import {createEpicMiddleware} from 'nuclide-commons/redux-observable'; -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import featureConfig from 'nuclide-commons-atom/feature-config'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import * as Actions from './redux/Actions'; -import * as Epics from './redux/Epics'; -import Reducers from './redux/Reducers'; -import {Console, WORKSPACE_VIEW_URI} from './ui/Console'; -import invariant from 'assert'; -import {applyMiddleware, createStore} from 'redux'; -import nullthrows from 'nullthrows'; -import uuid from 'uuid'; - -const MAXIMUM_SERIALIZED_MESSAGES_CONFIG = - 'atom-ide-console.maximumSerializedMessages'; -const MAXIMUM_SERIALIZED_HISTORY_CONFIG = - 'atom-ide-console.maximumSerializedHistory'; +"use strict"; -class Activation { - _disposables: UniversalDisposable; - _rawState: ?Object; - _store: Store; - _nextMessageId: number; +function _immutable() { + const data = require("immutable"); + + _immutable = function () { + return data; + }; + + return data; +} + +function _createPackage() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/createPackage")); + + _createPackage = function () { + return data; + }; + + return data; +} + +function _destroyItemWhere() { + const data = require("../../../../nuclide-commons-atom/destroyItemWhere"); + + _destroyItemWhere = function () { + return data; + }; + + return data; +} + +function _epicHelpers() { + const data = require("../../../../nuclide-commons/epicHelpers"); + + _epicHelpers = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _reduxObservable() { + const data = require("../../../../nuclide-commons/redux-observable"); - constructor(rawState: ?Object) { + _reduxObservable = function () { + return data; + }; + + return data; +} + +function _event() { + const data = require("../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +function _featureConfig() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/feature-config")); + + _featureConfig = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function Actions() { + const data = _interopRequireWildcard(require("./redux/Actions")); + + Actions = function () { + return data; + }; + + return data; +} + +function Epics() { + const data = _interopRequireWildcard(require("./redux/Epics")); + + Epics = function () { + return data; + }; + + return data; +} + +function _Reducers() { + const data = _interopRequireDefault(require("./redux/Reducers")); + + _Reducers = function () { + return data; + }; + + return data; +} + +function _Console() { + const data = require("./ui/Console"); + + _Console = function () { + return data; + }; + + return data; +} + +function _reduxMin() { + const data = require("redux/dist/redux.min.js"); + + _reduxMin = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _uuid() { + const data = _interopRequireDefault(require("uuid")); + + _uuid = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } + +const MAXIMUM_SERIALIZED_MESSAGES_CONFIG = 'atom-ide-console.maximumSerializedMessages'; +const MAXIMUM_SERIALIZED_HISTORY_CONFIG = 'atom-ide-console.maximumSerializedHistory'; + +class Activation { + constructor(rawState) { this._rawState = rawState; this._nextMessageId = 0; - this._disposables = new UniversalDisposable( - atom.contextMenu.add({ - '.console-record': [ - { - label: 'Copy Message', - command: 'console:copy-message', - }, - ], - }), - atom.commands.add('.console-record', 'console:copy-message', event => { - const el = event.target; - // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) - if (el == null || typeof el.innerText !== 'string') { - return; - } - atom.clipboard.write(el.innerText); - }), - atom.commands.add('atom-workspace', 'console:clear', () => - this._getStore().dispatch(Actions.clearRecords()), - ), - featureConfig.observe( - 'atom-ide-console.maximumMessageCount', - (maxMessageCount: any) => { - this._getStore().dispatch( - Actions.setMaxMessageCount(maxMessageCount), - ); - }, - ), - Observable.combineLatest( - observableFromSubscribeFunction(cb => - atom.config.observe('editor.fontSize', cb), - ), - featureConfig.observeAsStream('atom-ide-console.fontScale'), - (fontSize, fontScale) => fontSize * parseFloat(fontScale), - ) - .map(Actions.setFontSize) - .subscribe(this._store.dispatch), - this._registerCommandAndOpener(), - ); + this._disposables = new (_UniversalDisposable().default)(atom.contextMenu.add({ + '.console-record': [{ + label: 'Copy Message', + command: 'console:copy-message' + }] + }), atom.commands.add('.console-record', 'console:copy-message', event => { + const el = event.target; // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) + + if (el == null || typeof el.innerText !== 'string') { + return; + } + + atom.clipboard.write(el.innerText); + }), atom.commands.add('atom-workspace', 'console:clear', () => this._getStore().dispatch(Actions().clearRecords())), _featureConfig().default.observe('atom-ide-console.maximumMessageCount', maxMessageCount => { + this._getStore().dispatch(Actions().setMaxMessageCount(maxMessageCount)); + }), _rxjsCompatUmdMin.Observable.combineLatest((0, _event().observableFromSubscribeFunction)(cb => atom.config.observe('editor.fontSize', cb)), _featureConfig().default.observeAsStream('atom-ide-console.fontScale'), (fontSize, fontScale) => fontSize * parseFloat(fontScale)).map(Actions().setFontSize).subscribe(this._store.dispatch), this._registerCommandAndOpener()); } - async _open(event: OpenEvent): Promise { - const consoleAlreadyOpen = atom.workspace - .getPanes() - .some(pane => pane.getItems().some(item => item instanceof Console)); - // eslint-disable-next-line nuclide-internal/atom-apis - const consoleObject = await atom.workspace.open(WORKSPACE_VIEW_URI, { - searchAllPanes: true, - }); - invariant(consoleObject instanceof Console); - consoleObject.open({ - ...event, - consoleAlreadyOpen, + async _open(event) { + const consoleAlreadyOpen = atom.workspace.getPanes().some(pane => pane.getItems().some(item => item instanceof _Console().Console)); // eslint-disable-next-line nuclide-internal/atom-apis + + const consoleObject = await atom.workspace.open(_Console().WORKSPACE_VIEW_URI, { + searchAllPanes: true }); + + if (!(consoleObject instanceof _Console().Console)) { + throw new Error("Invariant violation: \"consoleObject instanceof Console\""); + } + + consoleObject.open(Object.assign({}, event, { + consoleAlreadyOpen + })); } - _getStore(): Store { + _getStore() { if (this._store == null) { const initialState = deserializeAppState(this._rawState); - const rootEpic = combineEpicsFromImports(Epics, 'atom-ide-ui'); - this._store = createStore( - Reducers, - initialState, - applyMiddleware(createEpicMiddleware(rootEpic)), - ); + const rootEpic = (0, _epicHelpers().combineEpicsFromImports)(Epics(), 'atom-ide-ui'); + this._store = (0, _reduxMin().createStore)(_Reducers().default, initialState, (0, _reduxMin().applyMiddleware)((0, _reduxObservable().createEpicMiddleware)(rootEpic))); } + return this._store; } @@ -131,84 +213,88 @@ class Activation { this._disposables.dispose(); } - consumeToolBar(getToolBar: toolbar$GetToolbar): void { + consumeToolBar(getToolBar) { const toolBar = getToolBar('nuclide-console'); toolBar.addButton({ icon: 'nuclicon-console', callback: 'console:toggle', tooltip: 'Toggle Console', - priority: 700, + priority: 700 }); + this._disposables.add(() => { toolBar.removeItems(); }); } - consumePasteProvider(provider: any): IDisposable { - const createPaste: CreatePasteFunction = provider.createPaste; - this._getStore().dispatch(Actions.setCreatePasteFunction(createPaste)); - return new UniversalDisposable(() => { + consumePasteProvider(provider) { + const createPaste = provider.createPaste; + + this._getStore().dispatch(Actions().setCreatePasteFunction(createPaste)); + + return new (_UniversalDisposable().default)(() => { if (this._getStore().getState().createPasteFunction === createPaste) { - this._getStore().dispatch(Actions.setCreatePasteFunction(null)); + this._getStore().dispatch(Actions().setCreatePasteFunction(null)); } }); } - consumeWatchEditor(watchEditor: atom$AutocompleteWatchEditor): IDisposable { - this._getStore().dispatch(Actions.setWatchEditor(watchEditor)); - return new UniversalDisposable(() => { + consumeWatchEditor(watchEditor) { + this._getStore().dispatch(Actions().setWatchEditor(watchEditor)); + + return new (_UniversalDisposable().default)(() => { if (this._getStore().getState().watchEditor === watchEditor) { - this._getStore().dispatch(Actions.setWatchEditor(null)); + this._getStore().dispatch(Actions().setWatchEditor(null)); } }); } - provideAutocomplete(): atom$AutocompleteProvider { + provideAutocomplete() { const activation = this; return { labels: ['nuclide-console'], selector: '*', // Copies Chrome devtools and puts history suggestions at the bottom. suggestionPriority: -1, + async getSuggestions(request) { // History provides suggestion only on exact match to current input. const prefix = request.editor.getText(); - const history = activation._getStore().getState().history; - // Use a set to remove duplicates. + + const history = activation._getStore().getState().history; // Use a set to remove duplicates. + + const seen = new Set(history); - return Array.from(seen) - .filter(text => text.startsWith(prefix)) - .map(text => ({text, replacementPrefix: prefix})); - }, + return Array.from(seen).filter(text => text.startsWith(prefix)).map(text => ({ + text, + replacementPrefix: prefix + })); + } + }; } - _registerCommandAndOpener(): UniversalDisposable { - return new UniversalDisposable( - atom.workspace.addOpener(uri => { - if (uri === WORKSPACE_VIEW_URI) { - return new Console({ - store: this._getStore(), - }); - } - }), - () => destroyItemWhere(item => item instanceof Console), - atom.commands.add('atom-workspace', 'console:toggle', () => { - atom.workspace.toggle(WORKSPACE_VIEW_URI); - }), - ); + _registerCommandAndOpener() { + return new (_UniversalDisposable().default)(atom.workspace.addOpener(uri => { + if (uri === _Console().WORKSPACE_VIEW_URI) { + return new (_Console().Console)({ + store: this._getStore() + }); + } + }), () => (0, _destroyItemWhere().destroyItemWhere)(item => item instanceof _Console().Console), atom.commands.add('atom-workspace', 'console:toggle', () => { + atom.workspace.toggle(_Console().WORKSPACE_VIEW_URI); + })); } - deserializeConsole(state: ConsolePersistedState): Console { - return new Console({ + deserializeConsole(state) { + return new (_Console().Console)({ store: this._getStore(), initialFilterText: state.filterText, initialEnableRegExpFilter: state.enableRegExpFilter, initialUnselectedSourceIds: state.unselectedSourceIds, - initialUnselectedSeverities: new Set(state.unselectedSeverities || []), + initialUnselectedSeverities: new Set(state.unselectedSeverities || []) }); } - /** * This service provides a factory for creating a console object tied to a particular source. If * the consumer wants to expose starting and stopping functionality through the Console UI (for @@ -220,25 +306,26 @@ class Activation { * package is disabled). This will remove the source from the Console UI's filter list (as long as * there aren't any remaining messages from the source). */ - provideConsole(): ConsoleService { + + + provideConsole() { // Create a local, nullable reference so that the service consumers don't keep the Activation // instance in memory. let activation = this; + this._disposables.add(() => { activation = null; - }); - - // Creates an objet with callbacks to request manipulations on the current + }); // Creates an objet with callbacks to request manipulations on the current // console message entry. - const createToken = (messageId: string) => { + + + const createToken = messageId => { const findMessage = () => { - invariant(activation != null); - return nullthrows( - activation - ._getStore() - .getState() - .incompleteRecords.find(r => r.messageId === messageId), - ); + if (!(activation != null)) { + throw new Error("Invariant violation: \"activation != null\""); + } + + return (0, _nullthrows().default)(activation._getStore().getState().incompleteRecords.find(r => r.messageId === messageId)); }; return Object.freeze({ @@ -253,63 +340,81 @@ class Activation { getCurrentLevel: () => { return findMessage().level; }, - setLevel: (newLevel: Level) => { + setLevel: newLevel => { return updateMessage(messageId, null, newLevel, false); }, - appendText: (text: string) => { + appendText: text => { return updateMessage(messageId, text, null, false); }, setComplete: () => { updateMessage(messageId, null, null, true); - }, + } }); }; - const updateMessage = ( - messageId: string, - appendText: ?string, - overrideLevel: ?Level, - setComplete: boolean, - ) => { - invariant(activation != null); - activation - ._getStore() - .dispatch( - Actions.recordUpdated( - messageId, - appendText, - overrideLevel, - setComplete, - ), - ); + const updateMessage = (messageId, appendText, overrideLevel, setComplete) => { + if (!(activation != null)) { + throw new Error("Invariant violation: \"activation != null\""); + } + + activation._getStore().dispatch(Actions().recordUpdated(messageId, appendText, overrideLevel, setComplete)); + return createToken(messageId); }; - return (sourceInfo: SourceInfo) => { - invariant(activation != null); + return sourceInfo => { + if (!(activation != null)) { + throw new Error("Invariant violation: \"activation != null\""); + } + let disposed; - activation._getStore().dispatch(Actions.registerSource(sourceInfo)); + + activation._getStore().dispatch(Actions().registerSource(sourceInfo)); + const console = { // TODO: Update these to be (object: any, ...objects: Array): void. - log(object: string): ?RecordToken { - return console.append({text: object, level: 'log'}); + log(object) { + return console.append({ + text: object, + level: 'log' + }); }, - warn(object: string): ?RecordToken { - return console.append({text: object, level: 'warning'}); + + warn(object) { + return console.append({ + text: object, + level: 'warning' + }); }, - error(object: string): ?RecordToken { - return console.append({text: object, level: 'error'}); + + error(object) { + return console.append({ + text: object, + level: 'error' + }); }, - info(object: string): ?RecordToken { - return console.append({text: object, level: 'info'}); + + info(object) { + return console.append({ + text: object, + level: 'info' + }); }, - success(object: string): ?RecordToken { - return console.append({text: object, level: 'success'}); + + success(object) { + return console.append({ + text: object, + level: 'success' + }); }, - append(message: Message): ?RecordToken { - invariant(activation != null && !disposed); + + append(message) { + if (!(activation != null && !disposed)) { + throw new Error("Invariant violation: \"activation != null && !disposed\""); + } + const incomplete = Boolean(message.incomplete); - const record: Record = { + const record = { // A unique message ID is not required for complete messages, // since they cannot be updated they don't need to be found later. text: message.text, @@ -321,144 +426,146 @@ class Activation { sourceId: sourceInfo.id, sourceName: sourceInfo.name, kind: message.kind || 'message', - timestamp: new Date(), // TODO: Allow this to come with the message? + timestamp: new Date(), + // TODO: Allow this to come with the message? repeatCount: 1, - incomplete, + incomplete }; - let token = null; + if (incomplete) { // An ID is only required for incomplete messages, which need // to be looked up for mutations. - record.messageId = uuid.v4(); + record.messageId = _uuid().default.v4(); token = createToken(record.messageId); } - activation._getStore().dispatch(Actions.recordReceived(record)); + activation._getStore().dispatch(Actions().recordReceived(record)); + return token; }, - setStatus(status: ConsoleSourceStatus): void { - invariant(activation != null && !disposed); - activation - ._getStore() - .dispatch(Actions.updateStatus(sourceInfo.id, status)); + + setStatus(status) { + if (!(activation != null && !disposed)) { + throw new Error("Invariant violation: \"activation != null && !disposed\""); + } + + activation._getStore().dispatch(Actions().updateStatus(sourceInfo.id, status)); }, - open(options?: {isolate: boolean}): Promise { - invariant(activation != null && !disposed); + + open(options) { + if (!(activation != null && !disposed)) { + throw new Error("Invariant violation: \"activation != null && !disposed\""); + } + return activation._open({ id: sourceInfo.id, - isolate: options != null ? options.isolate : false, + isolate: options != null ? options.isolate : false }); }, - dispose(): void { - invariant(activation != null); + + dispose() { + if (!(activation != null)) { + throw new Error("Invariant violation: \"activation != null\""); + } + if (!disposed) { disposed = true; - activation - ._getStore() - .dispatch(Actions.removeSource(sourceInfo.id)); + + activation._getStore().dispatch(Actions().removeSource(sourceInfo.id)); } - }, + } + }; return console; }; } - provideRegisterExecutor(): RegisterExecutorFunction { + provideRegisterExecutor() { // Create a local, nullable reference so that the service consumers don't keep the Activation // instance in memory. let activation = this; + this._disposables.add(() => { activation = null; }); return executor => { - invariant( - activation != null, - 'Executor registration attempted after deactivation', - ); - activation._getStore().dispatch(Actions.registerExecutor(executor)); - return new UniversalDisposable(() => { + if (!(activation != null)) { + throw new Error('Executor registration attempted after deactivation'); + } + + activation._getStore().dispatch(Actions().registerExecutor(executor)); + + return new (_UniversalDisposable().default)(() => { if (activation != null) { - activation._getStore().dispatch(Actions.unregisterExecutor(executor)); + activation._getStore().dispatch(Actions().unregisterExecutor(executor)); } }); }; } - serialize(): Object { + serialize() { if (this._store == null) { return {}; } - const maximumSerializedMessages: number = (featureConfig.get( - MAXIMUM_SERIALIZED_MESSAGES_CONFIG, - ): any); - const maximumSerializedHistory: number = (featureConfig.get( - MAXIMUM_SERIALIZED_HISTORY_CONFIG, - ): any); + + const maximumSerializedMessages = _featureConfig().default.get(MAXIMUM_SERIALIZED_MESSAGES_CONFIG); + + const maximumSerializedHistory = _featureConfig().default.get(MAXIMUM_SERIALIZED_HISTORY_CONFIG); + return { - records: this._store - .getState() - .records.slice(-maximumSerializedMessages) - .toArray() - .map(record => { - // `Executor` is not serializable. Make sure to remove it first. - const {executor, ...rest} = record; - return rest; - }), - history: this._store.getState().history.slice(-maximumSerializedHistory), + records: this._store.getState().records.slice(-maximumSerializedMessages).toArray().map(record => { + // `Executor` is not serializable. Make sure to remove it first. + const { + executor + } = record, + rest = _objectWithoutProperties(record, ["executor"]); + + return rest; + }), + history: this._store.getState().history.slice(-maximumSerializedHistory) }; } + } -function deserializeAppState(rawState: ?Object): AppState { +function deserializeAppState(rawState) { return { executors: new Map(), createPasteFunction: null, currentExecutorId: null, - records: - rawState && rawState.records - ? List(rawState.records.map(deserializeRecord)) - : List(), - incompleteRecords: - rawState && rawState.incompleteRecords - ? List(rawState.incompleteRecords.map(deserializeRecord)) - : List(), + records: rawState && rawState.records ? (0, _immutable().List)(rawState.records.map(deserializeRecord)) : (0, _immutable().List)(), + incompleteRecords: rawState && rawState.incompleteRecords ? (0, _immutable().List)(rawState.incompleteRecords.map(deserializeRecord)) : (0, _immutable().List)(), history: rawState && rawState.history ? rawState.history : [], providers: new Map(), providerStatuses: new Map(), - // This value will be replaced with the value form the config. We just use `POSITIVE_INFINITY` // here to conform to the AppState type defintion. - maxMessageCount: Number.POSITIVE_INFINITY, + maxMessageCount: Number.POSITIVE_INFINITY }; } -function deserializeRecord(record: Object): Record { - return { - ...record, +function deserializeRecord(record) { + return Object.assign({}, record, { timestamp: parseDate(record.timestamp) || new Date(0), // At one point in the time the messageId was a number, so the user might // have a number serialized. - messageId: - record == null || - record.messageId == null || - // Sigh. We (I, -jeldredge) had a bug at one point where we accidentally - // converted serialized values of `undefined` to the string `"undefiend"`. - // Those could then have been serialized back to disk. So, for a little - // while at least, we should ensure we fix these bad values. - record.messageId === 'undefined' - ? undefined - : String(record.messageId), - }; + messageId: record == null || record.messageId == null || // Sigh. We (I, -jeldredge) had a bug at one point where we accidentally + // converted serialized values of `undefined` to the string `"undefiend"`. + // Those could then have been serialized back to disk. So, for a little + // while at least, we should ensure we fix these bad values. + record.messageId === 'undefined' ? undefined : String(record.messageId) + }); } -function parseDate(raw: ?string): ?Date { +function parseDate(raw) { if (raw == null) { return null; } + const date = new Date(raw); return isNaN(date.getTime()) ? null : date; } -createPackage(module.exports, Activation); +(0, _createPackage().default)(module.exports, Activation); \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/parseText.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/parseText.js index ce1066e1ea..faf56a671f 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/parseText.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/parseText.js @@ -1,3 +1,36 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = parseText; + +var React = _interopRequireWildcard(require("react")); + +function _featureConfig() { + const data = _interopRequireDefault(require("../../../../nuclide-commons-atom/feature-config")); + + _featureConfig = function () { + return data; + }; + + return data; +} + +function _string() { + const data = require("../../../../nuclide-commons/string"); + + _string = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,17 +39,11 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import * as React from 'react'; -import featureConfig from 'nuclide-commons-atom/feature-config'; - -import {URL_REGEX} from 'nuclide-commons/string'; const DIFF_PATTERN = '\\b[dD][1-9][0-9]{5,}\\b'; const TASK_PATTERN = '\\b[tT]\\d+\\b'; - /** * This does NOT contain a pattern to match file references. This is because file paths do not * contain sufficient information to locate a file. Consider `b/c/d.txt`. What is it relative to? @@ -26,56 +53,51 @@ const TASK_PATTERN = '\\b[tT]\\d+\\b'; * solution probably requires both standardization on remote path (e.g. NuclideUris) and some * mechanism for message creators to mark up their messages with this information (e.g. ``). */ -const CLICKABLE_PATTERNS = `(${DIFF_PATTERN})|(${TASK_PATTERN})|(${ - URL_REGEX.source -})`; + +const CLICKABLE_PATTERNS = `(${DIFF_PATTERN})|(${TASK_PATTERN})|(${_string().URL_REGEX.source})`; const CLICKABLE_RE = new RegExp(CLICKABLE_PATTERNS, 'g'); -function toString(value: mixed): string { +function toString(value) { return typeof value === 'string' ? value : ''; } - /** * Parse special entities into links. In the future, it would be great to add a service so that we * could add new clickable things and to allow providers to mark specific ranges as links to things * that only they can know (e.g. relative paths output in BUCK messages). For now, however, we'll * just use some pattern settings and hardcode the patterns we care about. */ -export default function parseText( - text: string, -): Array> { + + +function parseText(text) { const chunks = []; let lastIndex = 0; let index = 0; + while (true) { const match = CLICKABLE_RE.exec(text); + if (match == null) { break; } - const matchedText = match[0]; + const matchedText = match[0]; // Add all the text since our last match. - // Add all the text since our last match. - chunks.push( - text.slice(lastIndex, CLICKABLE_RE.lastIndex - matchedText.length), - ); + chunks.push(text.slice(lastIndex, CLICKABLE_RE.lastIndex - matchedText.length)); lastIndex = CLICKABLE_RE.lastIndex; - let href; let handleOnClick; + if (match[1] != null) { // It's a diff - const url = toString( - featureConfig.get('atom-ide-console.diffUrlPattern'), - ); + const url = toString(_featureConfig().default.get('atom-ide-console.diffUrlPattern')); + if (url !== '') { href = url.replace('%s', matchedText); } } else if (match[2] != null) { // It's a task - const url = toString( - featureConfig.get('atom-ide-console.taskUrlPattern'), - ); + const url = toString(_featureConfig().default.get('atom-ide-console.taskUrlPattern')); + if (url !== '') { href = url.replace('%s', matchedText.slice(1)); } @@ -84,26 +106,17 @@ export default function parseText( href = matchedText; } - chunks.push( - // flowlint-next-line sketchy-null-string:off - href ? ( - - {matchedText} - - ) : ( - matchedText - ), - ); - + chunks.push( // flowlint-next-line sketchy-null-string:off + href ? React.createElement("a", { + key: `r${index}`, + href: href, + target: "_blank", + onClick: handleOnClick + }, matchedText) : matchedText); index++; - } + } // Add any remaining text. - // Add any remaining text. - chunks.push(text.slice(lastIndex)); + chunks.push(text.slice(lastIndex)); return chunks; -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/recordsChanged.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/recordsChanged.js index 11a323b967..f091a3a31b 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/recordsChanged.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/recordsChanged.js @@ -1,3 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = recordsChanged; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,22 +13,16 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ -import type {Record} from './types'; - /** * Check to see if the records have changed. This is optimized to take advantage of the knowledge * knowledge that record lists are only ever appended. */ - -export default function recordsChanged( - a: Array, - b: Array, -): boolean { +function recordsChanged(a, b) { return a.length !== b.length || last(a) !== last(b); } -const last = arr => arr[arr.length - 1]; +const last = arr => arr[arr.length - 1]; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Actions.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Actions.js index 1d77a88ac5..fdfca9dda4 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Actions.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Actions.js @@ -1,3 +1,26 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.clearRecords = clearRecords; +exports.recordReceived = recordReceived; +exports.recordUpdated = recordUpdated; +exports.registerExecutor = registerExecutor; +exports.execute = execute; +exports.registerRecordProvider = registerRecordProvider; +exports.registerSource = registerSource; +exports.unregisterRecordProvider = unregisterRecordProvider; +exports.selectExecutor = selectExecutor; +exports.setMaxMessageCount = setMaxMessageCount; +exports.removeSource = removeSource; +exports.unregisterExecutor = unregisterExecutor; +exports.updateStatus = updateStatus; +exports.setCreatePasteFunction = setCreatePasteFunction; +exports.setWatchEditor = setWatchEditor; +exports.setFontSize = setFontSize; +exports.SET_FONT_SIZE = exports.UPDATE_STATUS = exports.REMOVE_SOURCE = exports.REGISTER_SOURCE = exports.RECORD_UPDATED = exports.RECORD_RECEIVED = exports.SET_MAX_MESSAGE_COUNT = exports.SELECT_EXECUTOR = exports.REGISTER_RECORD_PROVIDER = exports.EXECUTE = exports.REGISTER_EXECUTOR = exports.SET_WATCH_EDITOR_FUNCTION = exports.SET_CREATE_PASTE_FUNCTION = exports.CLEAR_RECORDS = void 0; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,150 +29,169 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type { - Action, - Executor, - ConsoleSourceStatus, - Record, - RecordProvider, - SourceInfo, - Level, -} from '../types'; - -import type {CreatePasteFunction} from '../types'; - -export const CLEAR_RECORDS = 'CLEAR_RECORDS'; -export const SET_CREATE_PASTE_FUNCTION = 'SET_CREATE_PASTE_FUNCTION'; -export const SET_WATCH_EDITOR_FUNCTION = 'SET_WATCH_EDITOR_FUNCTION'; -export const REGISTER_EXECUTOR = 'REGISTER_EXECUTOR'; -export const EXECUTE = 'EXECUTE'; -export const REGISTER_RECORD_PROVIDER = 'REGISTER_RECORD_PROVIDER'; -export const SELECT_EXECUTOR = 'SELECT_EXECUTOR'; -export const SET_MAX_MESSAGE_COUNT = 'SET_MAX_MESSAGE_COUNT'; -export const RECORD_RECEIVED = 'RECORD_RECEIVED'; -export const RECORD_UPDATED = 'RECORD_UPDATED'; -export const REGISTER_SOURCE = 'REGISTER_SOURCE'; -export const REMOVE_SOURCE = 'REMOVE_SOURCE'; -export const UPDATE_STATUS = 'UPDATE_STATUS'; -export const SET_FONT_SIZE = 'SET_FONT_SIZE'; - -export function clearRecords(): Action { - return {type: CLEAR_RECORDS}; +const CLEAR_RECORDS = 'CLEAR_RECORDS'; +exports.CLEAR_RECORDS = CLEAR_RECORDS; +const SET_CREATE_PASTE_FUNCTION = 'SET_CREATE_PASTE_FUNCTION'; +exports.SET_CREATE_PASTE_FUNCTION = SET_CREATE_PASTE_FUNCTION; +const SET_WATCH_EDITOR_FUNCTION = 'SET_WATCH_EDITOR_FUNCTION'; +exports.SET_WATCH_EDITOR_FUNCTION = SET_WATCH_EDITOR_FUNCTION; +const REGISTER_EXECUTOR = 'REGISTER_EXECUTOR'; +exports.REGISTER_EXECUTOR = REGISTER_EXECUTOR; +const EXECUTE = 'EXECUTE'; +exports.EXECUTE = EXECUTE; +const REGISTER_RECORD_PROVIDER = 'REGISTER_RECORD_PROVIDER'; +exports.REGISTER_RECORD_PROVIDER = REGISTER_RECORD_PROVIDER; +const SELECT_EXECUTOR = 'SELECT_EXECUTOR'; +exports.SELECT_EXECUTOR = SELECT_EXECUTOR; +const SET_MAX_MESSAGE_COUNT = 'SET_MAX_MESSAGE_COUNT'; +exports.SET_MAX_MESSAGE_COUNT = SET_MAX_MESSAGE_COUNT; +const RECORD_RECEIVED = 'RECORD_RECEIVED'; +exports.RECORD_RECEIVED = RECORD_RECEIVED; +const RECORD_UPDATED = 'RECORD_UPDATED'; +exports.RECORD_UPDATED = RECORD_UPDATED; +const REGISTER_SOURCE = 'REGISTER_SOURCE'; +exports.REGISTER_SOURCE = REGISTER_SOURCE; +const REMOVE_SOURCE = 'REMOVE_SOURCE'; +exports.REMOVE_SOURCE = REMOVE_SOURCE; +const UPDATE_STATUS = 'UPDATE_STATUS'; +exports.UPDATE_STATUS = UPDATE_STATUS; +const SET_FONT_SIZE = 'SET_FONT_SIZE'; +exports.SET_FONT_SIZE = SET_FONT_SIZE; + +function clearRecords() { + return { + type: CLEAR_RECORDS + }; } -export function recordReceived(record: Record): Action { +function recordReceived(record) { return { type: RECORD_RECEIVED, - payload: {record}, + payload: { + record + } }; } -export function recordUpdated( - messageId: string, - appendText: ?string, - overrideLevel: ?Level, - setComplete: boolean, -): Action { +function recordUpdated(messageId, appendText, overrideLevel, setComplete) { return { type: RECORD_UPDATED, - payload: {messageId, appendText, overrideLevel, setComplete}, + payload: { + messageId, + appendText, + overrideLevel, + setComplete + } }; } -export function registerExecutor(executor: Executor): Action { +function registerExecutor(executor) { return { type: REGISTER_EXECUTOR, - payload: {executor}, + payload: { + executor + } }; } -export function execute(code: string): Action { +function execute(code) { return { type: EXECUTE, - payload: {code}, + payload: { + code + } }; } -export function registerRecordProvider(recordProvider: RecordProvider): Action { +function registerRecordProvider(recordProvider) { return { type: REGISTER_RECORD_PROVIDER, - payload: {recordProvider}, + payload: { + recordProvider + } }; } -export function registerSource(source: SourceInfo): Action { +function registerSource(source) { return { type: REGISTER_SOURCE, - payload: {source}, + payload: { + source + } }; } -export function unregisterRecordProvider( - recordProvider: RecordProvider, -): Action { +function unregisterRecordProvider(recordProvider) { return removeSource(recordProvider.id); } -export function selectExecutor(executorId: string): Action { +function selectExecutor(executorId) { return { type: SELECT_EXECUTOR, - payload: {executorId}, + payload: { + executorId + } }; } -export function setMaxMessageCount(maxMessageCount: number): Action { +function setMaxMessageCount(maxMessageCount) { return { type: SET_MAX_MESSAGE_COUNT, - payload: {maxMessageCount}, + payload: { + maxMessageCount + } }; } -export function removeSource(sourceId: string): Action { +function removeSource(sourceId) { return { type: REMOVE_SOURCE, - payload: {sourceId}, + payload: { + sourceId + } }; } -export function unregisterExecutor(executor: Executor): Action { +function unregisterExecutor(executor) { return removeSource(executor.id); } -export function updateStatus( - providerId: string, - status: ConsoleSourceStatus, -): Action { +function updateStatus(providerId, status) { return { type: UPDATE_STATUS, - payload: {providerId, status}, + payload: { + providerId, + status + } }; } -export function setCreatePasteFunction( - createPasteFunction: ?CreatePasteFunction, -): Action { +function setCreatePasteFunction(createPasteFunction) { return { type: SET_CREATE_PASTE_FUNCTION, - payload: {createPasteFunction}, + payload: { + createPasteFunction + } }; } -export function setWatchEditor( - watchEditor: ?atom$AutocompleteWatchEditor, -): Action { +function setWatchEditor(watchEditor) { return { type: SET_WATCH_EDITOR_FUNCTION, - payload: {watchEditor}, + payload: { + watchEditor + } }; } -export function setFontSize(fontSize: number): Action { +function setFontSize(fontSize) { return { type: SET_FONT_SIZE, - payload: {fontSize}, + payload: { + fontSize + } }; -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Epics.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Epics.js index b893837c8d..51ffe2aad2 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Epics.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Epics.js @@ -1,3 +1,59 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.registerExecutorEpic = registerExecutorEpic; +exports.executeEpic = executeEpic; +exports.trackEpic = trackEpic; +exports.registerRecordProviderEpic = registerRecordProviderEpic; + +function _event() { + const data = require("../../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +function Actions() { + const data = _interopRequireWildcard(require("./Actions")); + + Actions = function () { + return data; + }; + + return data; +} + +function Selectors() { + const data = _interopRequireWildcard(require("./Selectors")); + + Selectors = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _analytics() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/analytics")); + + _analytics = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,135 +62,115 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ -import type {Action, Store} from '../types'; -import type {ActionsObservable} from 'nuclide-commons/redux-observable'; - -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import * as Actions from './Actions'; -import * as Selectors from './Selectors'; -import invariant from 'assert'; -import {Observable} from 'rxjs'; -import analytics from 'nuclide-commons/analytics'; - /** * Register a record provider for every executor. */ -export function registerExecutorEpic( - actions: ActionsObservable, - store: Store, -): Observable { - return actions.ofType(Actions.REGISTER_EXECUTOR).map(action => { - invariant(action.type === Actions.REGISTER_EXECUTOR); - const {executor} = action.payload; - return Actions.registerRecordProvider({ +function registerExecutorEpic(actions, store) { + return actions.ofType(Actions().REGISTER_EXECUTOR).map(action => { + if (!(action.type === Actions().REGISTER_EXECUTOR)) { + throw new Error("Invariant violation: \"action.type === Actions.REGISTER_EXECUTOR\""); + } + + const { + executor + } = action.payload; + return Actions().registerRecordProvider({ id: executor.id, // $FlowIssue: Flow is having some trouble with the spread here. - records: executor.output.map(message => ({ - ...message, + records: executor.output.map(message => Object.assign({}, message, { kind: 'response', sourceId: executor.id, - scopeName: null, // The output won't be in the language's grammar. + scopeName: null, + // The output won't be in the language's grammar. // Eventually, we'll want to allow providers to specify custom timestamps for records. timestamp: new Date(), - executor, - })), + executor + })) }); }); } - /** * Execute the provided code using the current executor. */ -export function executeEpic( - actions: ActionsObservable, - store: Store, -): Observable { - return actions.ofType(Actions.EXECUTE).flatMap(action => { - invariant(action.type === Actions.EXECUTE); - const {code} = action.payload; - const currentExecutorId = Selectors.getCurrentExecutorId(store.getState()); - // flowlint-next-line sketchy-null-string:off - invariant(currentExecutorId); + + +function executeEpic(actions, store) { + return actions.ofType(Actions().EXECUTE).flatMap(action => { + if (!(action.type === Actions().EXECUTE)) { + throw new Error("Invariant violation: \"action.type === Actions.EXECUTE\""); + } + + const { + code + } = action.payload; + const currentExecutorId = Selectors().getCurrentExecutorId(store.getState()); // flowlint-next-line sketchy-null-string:off + + if (!currentExecutorId) { + throw new Error("Invariant violation: \"currentExecutorId\""); + } const executor = store.getState().executors.get(currentExecutorId); - invariant(executor != null); - // TODO: Is this the best way to do this? Might want to go through nuclide-executors and have + if (!(executor != null)) { + throw new Error("Invariant violation: \"executor != null\""); + } // TODO: Is this the best way to do this? Might want to go through nuclide-executors and have // that register output sources? - return ( - Observable.of( - Actions.recordReceived({ - // Eventually, we'll want to allow providers to specify custom timestamps for records. - timestamp: new Date(), - sourceId: currentExecutorId, - sourceName: executor.name, - kind: 'request', - level: 'log', - text: code, - scopeName: executor.scopeName(), - data: null, - repeatCount: 1, - incomplete: false, - }), - ) - // Execute the code as a side-effect. - .finally(() => { - executor.send(code); - }) - ); + + + return _rxjsCompatUmdMin.Observable.of(Actions().recordReceived({ + // Eventually, we'll want to allow providers to specify custom timestamps for records. + timestamp: new Date(), + sourceId: currentExecutorId, + sourceName: executor.name, + kind: 'request', + level: 'log', + text: code, + scopeName: executor.scopeName(), + data: null, + repeatCount: 1, + incomplete: false + })) // Execute the code as a side-effect. + .finally(() => { + executor.send(code); + }); }); } -export function trackEpic( - actions: ActionsObservable, - store: Store, -): Observable { - return actions - .ofType(Actions.EXECUTE) - .map(action => ({type: 'console:execute'})) - .do(analytics.trackEvent) - .ignoreElements(); +function trackEpic(actions, store) { + return actions.ofType(Actions().EXECUTE).map(action => ({ + type: 'console:execute' + })).do(_analytics().default.trackEvent).ignoreElements(); } -export function registerRecordProviderEpic( - actions: ActionsObservable, - store: Store, -): Observable { - return actions.ofType(Actions.REGISTER_RECORD_PROVIDER).flatMap(action => { - invariant(action.type === Actions.REGISTER_RECORD_PROVIDER); - const {recordProvider} = action.payload; +function registerRecordProviderEpic(actions, store) { + return actions.ofType(Actions().REGISTER_RECORD_PROVIDER).flatMap(action => { + if (!(action.type === Actions().REGISTER_RECORD_PROVIDER)) { + throw new Error("Invariant violation: \"action.type === Actions.REGISTER_RECORD_PROVIDER\""); + } - // Transform the messages into actions and merge them into the action stream. + const { + recordProvider + } = action.payload; // Transform the messages into actions and merge them into the action stream. // TODO: Add enabling/disabling of registered source and only subscribe when enabled. That // way, we won't trigger cold observer side-effects when we don't need the results. - const messageActions = recordProvider.records.map(Actions.recordReceived); - - // TODO: Can this be delayed until sometime after registration? - const statusActions = - // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) - typeof recordProvider.observeStatus === 'function' - ? observableFromSubscribeFunction(recordProvider.observeStatus).map( - status => Actions.updateStatus(recordProvider.id, status), - ) - : Observable.empty(); - - const unregisteredEvents = actions - .ofType(Actions.REMOVE_SOURCE) - .filter(a => { - invariant(a.type === Actions.REMOVE_SOURCE); - return a.payload.sourceId === recordProvider.id; - }); - - return Observable.merge( - Observable.of( - Actions.registerSource({...recordProvider, name: recordProvider.id}), - ), - messageActions, - statusActions, - ).takeUntil(unregisteredEvents); + + const messageActions = recordProvider.records.map(Actions().recordReceived); // TODO: Can this be delayed until sometime after registration? + + const statusActions = // $FlowFixMe(>=0.68.0) Flow suppress (T27187857) + typeof recordProvider.observeStatus === 'function' ? (0, _event().observableFromSubscribeFunction)(recordProvider.observeStatus).map(status => Actions().updateStatus(recordProvider.id, status)) : _rxjsCompatUmdMin.Observable.empty(); + const unregisteredEvents = actions.ofType(Actions().REMOVE_SOURCE).filter(a => { + if (!(a.type === Actions().REMOVE_SOURCE)) { + throw new Error("Invariant violation: \"a.type === Actions.REMOVE_SOURCE\""); + } + + return a.payload.sourceId === recordProvider.id; + }); + return _rxjsCompatUmdMin.Observable.merge(_rxjsCompatUmdMin.Observable.of(Actions().registerSource(Object.assign({}, recordProvider, { + name: recordProvider.id + }))), messageActions, statusActions).takeUntil(unregisteredEvents); }); -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Reducers.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Reducers.js index 8b4f48d71f..ca672e5d2d 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Reducers.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Reducers.js @@ -1,3 +1,42 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = accumulateState; + +function _immutable() { + const data = require("immutable"); + + _immutable = function () { + return data; + }; + + return data; +} + +function _collection() { + const data = require("../../../../../nuclide-commons/collection"); + + _collection = function () { + return data; + }; + + return data; +} + +function Actions() { + const data = _interopRequireWildcard(require("./Actions")); + + Actions = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,254 +45,246 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ +const RECORD_PROPERTIES_TO_COMPARE = ['text', 'level', 'format', 'scopeName', 'sourceId', 'kind']; -import type {Action, AppState, Record} from '../types'; - -import {List} from 'immutable'; -import {arrayEqual} from 'nuclide-commons/collection'; -import * as Actions from './Actions'; - -const RECORD_PROPERTIES_TO_COMPARE = [ - 'text', - 'level', - 'format', - 'scopeName', - 'sourceId', - 'kind', -]; - -function shouldAccumulateRecordCount( - recordA: Record, - recordB: Record, -): boolean { - if ( - String(recordA.sourceId) - .toLowerCase() - .includes('debugger') || - String(recordB.sourceId) - .toLowerCase() - .includes('debugger') - ) { +function shouldAccumulateRecordCount(recordA, recordB) { + if (String(recordA.sourceId).toLowerCase().includes('debugger') || String(recordB.sourceId).toLowerCase().includes('debugger')) { return false; - } + } // Never merge incomplete records. + - // Never merge incomplete records. if (recordA.incomplete || recordB.incomplete) { return false; } - const areRelevantPropertiesEqual = RECORD_PROPERTIES_TO_COMPARE.every( - prop => recordA[prop] === recordB[prop], - ); + const areRelevantPropertiesEqual = RECORD_PROPERTIES_TO_COMPARE.every(prop => recordA[prop] === recordB[prop]); // if data exists, we should not accumulate this into the previous record - // if data exists, we should not accumulate this into the previous record const doesDataExist = recordA.data || recordB.data; - const recATags = recordA.tags; const recBTags = recordB.tags; - const areTagsEqual = - (!recATags && !recBTags) || - (recATags && recBTags && arrayEqual(recATags, recBTags)); - - return ( - areRelevantPropertiesEqual && - !Boolean(doesDataExist) && - Boolean(areTagsEqual) - ); + const areTagsEqual = !recATags && !recBTags || recATags && recBTags && (0, _collection().arrayEqual)(recATags, recBTags); + return areRelevantPropertiesEqual && !Boolean(doesDataExist) && Boolean(areTagsEqual); } -export default function accumulateState( - state: AppState, - action: Action, -): AppState { +function accumulateState(state, action) { switch (action.type) { - case Actions.RECORD_RECEIVED: { - const {record} = action.payload; - let {records, incompleteRecords} = state; - - if (record.incomplete) { - incompleteRecords = incompleteRecords.push(record); - } else { - // check if the message is exactly the same as the previous one, if so - // we add a count to it. - const lastRecord = records.last(); - if ( - lastRecord != null && - shouldAccumulateRecordCount(lastRecord, record) - ) { - // Update the last record. Don't use `splice()` because that's O(n) - const updatedRecord: Record = { - ...lastRecord, - repeatCount: lastRecord.repeatCount + 1, - timestamp: record.timestamp, - }; - records = records.pop().push(updatedRecord); + case Actions().RECORD_RECEIVED: + { + const { + record + } = action.payload; + let { + records, + incompleteRecords + } = state; + + if (record.incomplete) { + incompleteRecords = incompleteRecords.push(record); } else { - records = records.push(record); - } + // check if the message is exactly the same as the previous one, if so + // we add a count to it. + const lastRecord = records.last(); + + if (lastRecord != null && shouldAccumulateRecordCount(lastRecord, record)) { + // Update the last record. Don't use `splice()` because that's O(n) + const updatedRecord = Object.assign({}, lastRecord, { + repeatCount: lastRecord.repeatCount + 1, + timestamp: record.timestamp + }); + records = records.pop().push(updatedRecord); + } else { + records = records.push(record); + } - if (records.size > state.maxMessageCount) { - // We could only have gone over by one. - records = records.shift(); + if (records.size > state.maxMessageCount) { + // We could only have gone over by one. + records = records.shift(); + } } + + return Object.assign({}, state, { + records, + incompleteRecords + }); } - return { - ...state, - records, - incompleteRecords, - }; - } - case Actions.RECORD_UPDATED: { - let {records, incompleteRecords} = state; - const { - messageId, - appendText, - overrideLevel, - setComplete, - } = action.payload; - - let found = false; - for (let i = 0; i < incompleteRecords.size; i++) { - const record = incompleteRecords.get(i); - if (record != null && record.messageId === messageId) { - // Create a replacement message object with the new properties. - const newRecord = { - ...record, - text: appendText != null ? record.text + appendText : record.text, - level: overrideLevel != null ? overrideLevel : record.level, - incomplete: !setComplete, - }; - - if (setComplete) { - incompleteRecords = incompleteRecords.remove(i); - records = records.push(newRecord); - if (records.size > state.maxMessageCount) { - records = records.shift(); + case Actions().RECORD_UPDATED: + { + let { + records, + incompleteRecords + } = state; + const { + messageId, + appendText, + overrideLevel, + setComplete + } = action.payload; + let found = false; + + for (let i = 0; i < incompleteRecords.size; i++) { + const record = incompleteRecords.get(i); + + if (record != null && record.messageId === messageId) { + // Create a replacement message object with the new properties. + const newRecord = Object.assign({}, record, { + text: appendText != null ? record.text + appendText : record.text, + level: overrideLevel != null ? overrideLevel : record.level, + incomplete: !setComplete + }); + + if (setComplete) { + incompleteRecords = incompleteRecords.remove(i); + records = records.push(newRecord); + + if (records.size > state.maxMessageCount) { + records = records.shift(); + } + } else { + incompleteRecords = incompleteRecords.set(i, newRecord); } - } else { - incompleteRecords = incompleteRecords.set(i, newRecord); + + found = true; + break; } + } + + if (!found) { + throw new Error(`Expected incomplete console message with id ${messageId} not found`); + } + + return Object.assign({}, state, { + records, + incompleteRecords + }); + } + + case Actions().SET_MAX_MESSAGE_COUNT: + { + const { + maxMessageCount + } = action.payload; - found = true; - break; + if (maxMessageCount <= 0) { + return state; } + + return Object.assign({}, state, { + maxMessageCount, + records: state.records.slice(-maxMessageCount) + }); + } + + case Actions().REGISTER_SOURCE: + { + const { + source + } = action.payload; + return Object.assign({}, state, { + providers: new Map(state.providers).set(source.id, Object.assign({}, source, { + name: source.name || source.id + })) + }); + } + + case Actions().CLEAR_RECORDS: + { + return Object.assign({}, state, { + records: (0, _immutable().List)() + }); } - if (!found) { - throw new Error( - `Expected incomplete console message with id ${messageId} not found`, - ); + case Actions().REGISTER_EXECUTOR: + { + const { + executor + } = action.payload; + return Object.assign({}, state, { + executors: new Map(state.executors).set(executor.id, executor) + }); } - return { - ...state, - records, - incompleteRecords, - }; - } - case Actions.SET_MAX_MESSAGE_COUNT: { - const {maxMessageCount} = action.payload; - if (maxMessageCount <= 0) { - return state; + case Actions().SELECT_EXECUTOR: + { + const { + executorId + } = action.payload; + return Object.assign({}, state, { + currentExecutorId: executorId + }); } - return { - ...state, - maxMessageCount, - records: state.records.slice(-maxMessageCount), - }; - } - case Actions.REGISTER_SOURCE: { - const {source} = action.payload; - return { - ...state, - providers: new Map(state.providers).set(source.id, { - ...source, - name: source.name || source.id, - }), - }; - } - case Actions.CLEAR_RECORDS: { - return { - ...state, - records: List(), - }; - } - case Actions.REGISTER_EXECUTOR: { - const {executor} = action.payload; - return { - ...state, - executors: new Map(state.executors).set(executor.id, executor), - }; - } - case Actions.SELECT_EXECUTOR: { - const {executorId} = action.payload; - return { - ...state, - currentExecutorId: executorId, - }; - } - case Actions.REMOVE_SOURCE: { - const {sourceId} = action.payload; - const providers = new Map(state.providers); - const providerStatuses = new Map(state.providerStatuses); - const executors = new Map(state.executors); - providers.delete(sourceId); - providerStatuses.delete(sourceId); - executors.delete(sourceId); - return { - ...state, - providers, - providerStatuses, - executors, - }; - } - case Actions.UPDATE_STATUS: { - const {status, providerId} = action.payload; - return { - ...state, - providerStatuses: new Map(state.providerStatuses).set( - providerId, + + case Actions().REMOVE_SOURCE: + { + const { + sourceId + } = action.payload; + const providers = new Map(state.providers); + const providerStatuses = new Map(state.providerStatuses); + const executors = new Map(state.executors); + providers.delete(sourceId); + providerStatuses.delete(sourceId); + executors.delete(sourceId); + return Object.assign({}, state, { + providers, + providerStatuses, + executors + }); + } + + case Actions().UPDATE_STATUS: + { + const { status, - ), - }; - } - case Actions.EXECUTE: { - const command = action.payload.code; - const newHistory = - state.history[state.history.length - 1] === command - ? state.history - : state.history.concat(command); - return { - ...state, - history: newHistory.slice(-1000), - }; - } - case Actions.SET_CREATE_PASTE_FUNCTION: { - const {createPasteFunction} = action.payload; - return { - ...state, - createPasteFunction, - }; - } - case Actions.SET_WATCH_EDITOR_FUNCTION: { - const {watchEditor} = action.payload; - return { - ...state, - watchEditor, - }; - } - case Actions.SET_FONT_SIZE: { - const {fontSize} = action.payload; - return { - ...state, - fontSize, - }; - } + providerId + } = action.payload; + return Object.assign({}, state, { + providerStatuses: new Map(state.providerStatuses).set(providerId, status) + }); + } + + case Actions().EXECUTE: + { + const command = action.payload.code; + const newHistory = state.history[state.history.length - 1] === command ? state.history : state.history.concat(command); + return Object.assign({}, state, { + history: newHistory.slice(-1000) + }); + } + + case Actions().SET_CREATE_PASTE_FUNCTION: + { + const { + createPasteFunction + } = action.payload; + return Object.assign({}, state, { + createPasteFunction + }); + } + + case Actions().SET_WATCH_EDITOR_FUNCTION: + { + const { + watchEditor + } = action.payload; + return Object.assign({}, state, { + watchEditor + }); + } + + case Actions().SET_FONT_SIZE: + { + const { + fontSize + } = action.payload; + return Object.assign({}, state, { + fontSize + }); + } } return state; -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Selectors.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Selectors.js index 6d6486a171..7438def10e 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Selectors.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/redux/Selectors.js @@ -1,3 +1,11 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getAllRecords = getAllRecords; +exports.getCurrentExecutorId = getCurrentExecutorId; + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,23 +14,26 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {AppState, Record} from '../types'; -import type {List} from 'immutable'; - -export function getAllRecords(state: AppState): List { - const {records, incompleteRecords} = state; +function getAllRecords(state) { + const { + records, + incompleteRecords + } = state; return records.concat(incompleteRecords); } -export function getCurrentExecutorId(state: AppState): ?string { - let {currentExecutorId} = state; +function getCurrentExecutorId(state) { + let { + currentExecutorId + } = state; + if (currentExecutorId == null) { const firstExecutor = Array.from(state.executors.values())[0]; currentExecutorId = firstExecutor && firstExecutor.id; } + return currentExecutorId; -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/types.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/types.js index 197737897e..9a390c31f7 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/types.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/types.js @@ -1,311 +1 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @flow - * @format - */ - -import type {Observable} from 'rxjs'; -import type {List} from 'immutable'; -import type {EvaluationResult} from 'nuclide-commons-ui/TextRenderer'; -import type {ExpansionResult} from 'nuclide-commons-ui/LazyNestedValueComponent'; - -// The type of the object passed to your package's `consumeConsole()` function. -export type ConsoleService = (options: SourceInfo) => ConsoleApi; - -// The type of the open source event -export type OpenEvent = {| - +id: string, - +isolate: boolean, - +consoleAlreadyOpen?: boolean, -|}; - -// The console API. An object of this type is returned when you invoke the function provided by the -// console service. -export type ConsoleApi = { - // The primary means of interacting with the console. - // TODO: Update these to be `(object: any, ...objects: Array): void` to allow for logging objects. - log(object: string, _: void): ?RecordToken, - error(object: string, _: void): ?RecordToken, - warn(object: string, _: void): ?RecordToken, - info(object: string, _: void): ?RecordToken, - success(object: string, _: void): ?RecordToken, - - // A generic API for sending a message of any level (log, error, etc.). - append(message: Message): ?RecordToken, - - // Dispose of the console. Invoke this when your package is disabled. - dispose(): void, - - // Set the status of the source. See "Stoppable Sources" below. - setStatus(status: ConsoleSourceStatus): void, - - // Isolate this Source by putting it in its own Console - open(options?: {isolate: boolean}): Promise, -}; - -// A type representing the possible values for the `console.setStatus()` API. -export type ConsoleSourceStatus = 'starting' | 'running' | 'stopped'; - -// The shape of the argument to the `ConsoleService` function. -export type SourceInfo = { - id: string, // A unique identifier representing this source. - name: string, // A human-readable name for the source. This will be used in the UI. - - // `start()` and `stop()` functions can optionally be provided. See [User-Controllable Console - // Sources](https://github.com/facebook-atom/atom-ide-ui/blob/master/docs/console.md#user-controllable-console-sources) - // for more information. - start?: () => void, - stop?: () => void, - // `getProperties()` can be optionally provided for expandable messages. - getProperties?: (objectId: string) => Observable, -}; - -// Message levels. For use with the `console.append()` API. -export type Level = - | 'info' - | 'log' - | 'warning' - | 'error' - | 'debug' - | 'success' - | Color; -type Color = - | 'red' - | 'orange' - | 'yellow' - | 'green' - | 'blue' - | 'purple' - | 'violet' - | 'rainbow'; - -export type Severity = 'info' | 'warning' | 'error'; - -// A message object, for use with the `console.append()` API. -export type Message = { - text: string, - level: Level, - format?: MessageFormat, - - // Internally used properties. These are subject to change so don't use em! - data?: EvaluationResult, - tags?: ?Array, - kind?: ?MessageKind, - scopeName?: ?string, - incomplete?: boolean, -}; - -// -// -// The following types aren't part of public API but rather are used within the package. -// -// - -type MessageKind = 'message' | 'request' | 'response'; -type MessageFormat = 'ansi'; - -// A normalized type used internally to represent all possible kinds of messages. Responses and -// Messages are transformed into these. -// Make sure shouldAccumulateRecordCount in Reducers.js is up to date with these fields -export type Record = { - messageId?: string, - text: string, - level: Level, - incomplete: boolean, - format?: MessageFormat, - tags?: ?Array, - repeatCount: number, - - kind: MessageKind, - sourceId: string, - sourceName: string, - scopeName: ?string, - data?: ?EvaluationResult, - timestamp: Date, - - executor?: Executor, -}; - -export type RecordToken = {| - +getCurrentText: () => string, - +getCurrentLevel: () => Level, - setLevel: (level: Level) => RecordToken, - appendText: (text: string) => RecordToken, - setComplete: () => void, -|}; - -export type AppState = {| - createPasteFunction: ?CreatePasteFunction, - currentExecutorId: ?string, - executors: Map, - maxMessageCount: number, - // We use Immutable for the records list so that adding an item is O(1). However, rendering the - // items after the addition is O(n), so it's important that we schedule and throttle our renders - // or we'll lose the benefit of an O(1) insertion. - records: List, - incompleteRecords: List, - history: Array, - providers: Map, - providerStatuses: Map, - fontSize?: number, - watchEditor?: ?atom$AutocompleteWatchEditor, -|}; - -export type Source = { - id: string, - name: string, - status: ConsoleSourceStatus, - start?: () => void, - stop?: () => void, -}; - -type BasicRecordProvider = { - records: Observable, - id: string, - getProperties?: (objectId: string) => Observable, -}; - -type ControllableRecordProviderProps = { - observeStatus(callback: (status: ConsoleSourceStatus) => mixed): IDisposable, - start(): void, - stop(): void, -}; - -type ControllableRecordProvider = BasicRecordProvider & - ControllableRecordProviderProps; - -export type RecordProvider = BasicRecordProvider | ControllableRecordProvider; - -// Serialized state specific to each instance of the console view. For example, each instance has -// its own, distinct filter, so that's here. They don't, however, have distinct records, so they -// aren't. -export type ConsolePersistedState = {| - deserializer: 'nuclide.Console', - filterText?: string, - enableRegExpFilter?: boolean, - unselectedSourceIds?: Array, - unselectedSeverities?: Array, -|}; - -export type Executor = { - id: string, - name: string, - send(message: string): void, - output: Observable, - scopeName: () => string, - provideSymbols?: (prefix: string) => Array, - getProperties?: (objectId: string) => Observable, - onDidChangeScopeName?: (callback: () => void) => IDisposable, -}; - -export type RegisterExecutorFunction = (executor: Executor) => IDisposable; - -export type PasteOptions = { - language?: ?string, - title?: ?string, -}; - -export type CreatePasteFunction = ( - message: string, - options: PasteOptions, - source: string, -) => Promise; - -export type Store = { - getState(): AppState, - dispatch(action: Action): void, - subscribe(() => void): () => void, -}; - -export type Action = - | { - type: 'CLEAR_RECORDS', - } - | { - type: 'REGISTER_EXECUTOR', - payload: { - executor: Executor, - }, - } - | { - type: 'EXECUTE', - payload: { - code: string, - }, - } - | { - type: 'RECORD_RECEIVED', - payload: { - record: Record, - }, - } - | { - type: 'RECORD_UPDATED', - payload: { - messageId: string, - appendText: ?string, - overrideLevel: ?Level, - setComplete: boolean, - }, - } - | { - type: 'REGISTER_RECORD_PROVIDER', - payload: { - recordProvider: RecordProvider, - }, - } - | { - type: 'REGISTER_SOURCE', - payload: { - source: SourceInfo, - }, - } - | { - type: 'REMOVE_SOURCE', - payload: { - sourceId: string, - }, - } - | { - type: 'SELECT_EXECUTOR', - payload: { - executorId: string, - }, - } - | { - type: 'SET_CREATE_PASTE_FUNCTION', - payload: { - createPasteFunction: ?CreatePasteFunction, - }, - } - | { - type: 'SET_WATCH_EDITOR_FUNCTION', - payload: { - watchEditor: ?atom$AutocompleteWatchEditor, - }, - } - | { - type: 'SET_MAX_MESSAGE_COUNT', - payload: { - maxMessageCount: number, - }, - } - | { - type: 'UPDATE_STATUS', - payload: { - providerId: string, - status: ConsoleSourceStatus, - }, - } - | { - type: 'SET_FONT_SIZE', - payload: { - fontSize: number, - }, - }; +"use strict"; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/Console.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/Console.js index 6ff3740642..905b8af439 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/Console.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/Console.js @@ -1,3 +1,168 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Console = exports.WORKSPACE_VIEW_URI = void 0; + +function _observePaneItemVisibility() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-atom/observePaneItemVisibility")); + + _observePaneItemVisibility = function () { + return data; + }; + + return data; +} + +function _collection() { + const data = require("../../../../../nuclide-commons/collection"); + + _collection = function () { + return data; + }; + + return data; +} + +function _Model() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/Model")); + + _Model = function () { + return data; + }; + + return data; +} + +function _shallowequal() { + const data = _interopRequireDefault(require("shallowequal")); + + _shallowequal = function () { + return data; + }; + + return data; +} + +function _bindObservableAsProps() { + const data = require("../../../../../nuclide-commons-ui/bindObservableAsProps"); + + _bindObservableAsProps = function () { + return data; + }; + + return data; +} + +function _renderReactRoot() { + const data = require("../../../../../nuclide-commons-ui/renderReactRoot"); + + _renderReactRoot = function () { + return data; + }; + + return data; +} + +function _memoizeUntilChanged() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/memoizeUntilChanged")); + + _memoizeUntilChanged = function () { + return data; + }; + + return data; +} + +function _observable() { + const data = require("../../../../../nuclide-commons/observable"); + + _observable = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _observableFromReduxStore() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/observableFromReduxStore")); + + _observableFromReduxStore = function () { + return data; + }; + + return data; +} + +function _RegExpFilter() { + const data = require("../../../../../nuclide-commons-ui/RegExpFilter"); + + _RegExpFilter = function () { + return data; + }; + + return data; +} + +function Actions() { + const data = _interopRequireWildcard(require("../redux/Actions")); + + Actions = function () { + return data; + }; + + return data; +} + +function Selectors() { + const data = _interopRequireWildcard(require("../redux/Selectors")); + + Selectors = function () { + return data; + }; + + return data; +} + +function _ConsoleView() { + const data = _interopRequireDefault(require("./ConsoleView")); + + _ConsoleView = function () { + return data; + }; + + return data; +} + +function _immutable() { + const data = require("immutable"); + + _immutable = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,195 +171,173 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ /* eslint-env browser */ - -import type { - ConsolePersistedState, - ConsoleSourceStatus, - Record, - Source, - Store, - SourceInfo, - Severity, - Level, - AppState, - OpenEvent, -} from '../types'; -import type {CreatePasteFunction} from '../types'; -import type {RegExpFilterChange} from 'nuclide-commons-ui/RegExpFilter'; -import type {Executor} from '../types'; - -import invariant from 'assert'; -import observePaneItemVisibility from 'nuclide-commons-atom/observePaneItemVisibility'; -import {setDifference, areSetsEqual} from 'nuclide-commons/collection'; -import Model from 'nuclide-commons/Model'; -import shallowEqual from 'shallowequal'; -import {bindObservableAsProps} from 'nuclide-commons-ui/bindObservableAsProps'; -import {renderReactRoot} from 'nuclide-commons-ui/renderReactRoot'; -import memoizeUntilChanged from 'nuclide-commons/memoizeUntilChanged'; -import {toggle} from 'nuclide-commons/observable'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {nextAnimationFrame} from 'nuclide-commons/observable'; -import observableFromReduxStore from 'nuclide-commons/observableFromReduxStore'; -import {getFilterPattern} from 'nuclide-commons-ui/RegExpFilter'; -import * as Actions from '../redux/Actions'; -import * as Selectors from '../redux/Selectors'; -import ConsoleView from './ConsoleView'; -import {List} from 'immutable'; -import * as React from 'react'; -import {Observable, ReplaySubject} from 'rxjs'; - -type Options = {| - store: Store, - initialFilterText?: string, - initialEnableRegExpFilter?: boolean, - initialUnselectedSourceIds?: Array, - initialUnselectedSeverities?: Set, -|}; - -// -// State unique to this particular Console instance -// -type State = { - filterText: string, - enableRegExpFilter: boolean, - unselectedSourceIds: Array, - selectedSeverities: Set, -}; - -type BoundActionCreators = { - execute: (code: string) => void, - selectExecutor: (executorId: string) => void, - clearRecords: () => void, -}; - // Other Nuclide packages (which cannot import this) depend on this URI. If this // needs to be changed, grep for CONSOLE_VIEW_URI and ensure that the URIs match. -export const WORKSPACE_VIEW_URI = 'atom://nuclide/console'; - -const ERROR_TRANSCRIBING_MESSAGE = - "// Nuclide couldn't find the right text to display"; - +const WORKSPACE_VIEW_URI = 'atom://nuclide/console'; +exports.WORKSPACE_VIEW_URI = WORKSPACE_VIEW_URI; +const ERROR_TRANSCRIBING_MESSAGE = "// Nuclide couldn't find the right text to display"; const ALL_SEVERITIES = new Set(['error', 'warning', 'info']); - /** * An Atom "view model" for the console. This object is responsible for creating a stateful view * (via `getElement()`). That view is bound to both global state (from the store) and view-specific * state (from this instance's `_model`). */ -export class Console { - _actionCreators: BoundActionCreators; - _titleChanges: Observable; - _model: Model; - _store: Store; - _element: ?HTMLElement; - _destroyed: ReplaySubject; +class Console { + constructor(options) { + this._getSourcesMemoized = (0, _memoizeUntilChanged().default)(getSources, opts => opts, (a, b) => (0, _shallowequal().default)(a, b)); + + this._resetAllFilters = () => { + this._selectSources(this._getSources().map(s => s.id)); + + this._model.setState({ + filterText: '' + }); + }; + + this._createPaste = async () => { + const displayableRecords = Selectors().getAllRecords(this._store.getState()).toArray(); + + const createPasteImpl = this._store.getState().createPasteFunction; + + if (createPasteImpl == null) { + return; + } + + return createPaste(createPasteImpl, displayableRecords); + }; + + this._selectSources = selectedSourceIds => { + const sourceIds = this._getSources().map(source => source.id); + + const unselectedSourceIds = sourceIds.filter(sourceId => selectedSourceIds.indexOf(sourceId) === -1); + + this._model.setState({ + unselectedSourceIds + }); + }; + + this._updateFilter = change => { + const { + text, + isRegExp + } = change; + + this._model.setState({ + filterText: text, + enableRegExpFilter: isRegExp + }); + }; + + this._toggleSeverity = severity => { + const { + selectedSeverities + } = this._model.state; + const nextSelectedSeverities = new Set(selectedSeverities); + + if (nextSelectedSeverities.has(severity)) { + nextSelectedSeverities.delete(severity); + } else { + nextSelectedSeverities.add(severity); + } + + this._model.setState({ + selectedSeverities: nextSelectedSeverities + }); + }; - constructor(options: Options) { const { store, initialFilterText, initialEnableRegExpFilter, initialUnselectedSourceIds, - initialUnselectedSeverities, + initialUnselectedSeverities } = options; - this._model = new Model({ + this._model = new (_Model().default)({ displayableRecords: [], filterText: initialFilterText == null ? '' : initialFilterText, enableRegExpFilter: Boolean(initialEnableRegExpFilter), - unselectedSourceIds: - initialUnselectedSourceIds == null ? [] : initialUnselectedSourceIds, - selectedSeverities: - initialUnselectedSeverities == null - ? ALL_SEVERITIES - : setDifference(ALL_SEVERITIES, initialUnselectedSeverities), + unselectedSourceIds: initialUnselectedSourceIds == null ? [] : initialUnselectedSourceIds, + selectedSeverities: initialUnselectedSeverities == null ? ALL_SEVERITIES : (0, _collection().setDifference)(ALL_SEVERITIES, initialUnselectedSeverities) }); - this._store = store; - this._destroyed = new ReplaySubject(1); - - this._titleChanges = Observable.combineLatest( - this._model.toObservable(), - observableFromReduxStore(store), - ) - .takeUntil(this._destroyed) - .map(() => this.getTitle()) - .distinctUntilChanged() - .share(); + this._destroyed = new _rxjsCompatUmdMin.ReplaySubject(1); + this._titleChanges = _rxjsCompatUmdMin.Observable.combineLatest(this._model.toObservable(), (0, _observableFromReduxStore().default)(store)).takeUntil(this._destroyed).map(() => this.getTitle()).distinctUntilChanged().share(); } - open(event: OpenEvent): void { + open(event) { const unselectedSourceIds = new Set(this._model.state.unselectedSourceIds); - const currentlySelectedSources = this._getSources() - .map(s => s.id) - .filter(id => !unselectedSourceIds.has(id)); + + const currentlySelectedSources = this._getSources().map(s => s.id).filter(id => !unselectedSourceIds.has(id)); if (currentlySelectedSources.length === 0) { this._selectSources([event.id]); - } else if ( - currentlySelectedSources.length === 1 && - currentlySelectedSources[0] === event.id - ) { - // do nothing because source is already visible and isolated + } else if (currentlySelectedSources.length === 1 && currentlySelectedSources[0] === event.id) {// do nothing because source is already visible and isolated } else if (event.isolate) { - const consoleAlreadyOpen = event.consoleAlreadyOpen ?? true; + var _event$consoleAlready; + + const consoleAlreadyOpen = (_event$consoleAlready = event.consoleAlreadyOpen) !== null && _event$consoleAlready !== void 0 ? _event$consoleAlready : true; + if (consoleAlreadyOpen) { const allPanes = atom.workspace.getPanes(); - const panes = allPanes.filter( - p => - p.getItems().filter(item => item._element === this._element) - .length !== 0, - ); - invariant(panes.length === 1); + const panes = allPanes.filter(p => p.getItems().filter(item => item._element === this._element).length !== 0); + + if (!(panes.length === 1)) { + throw new Error("Invariant violation: \"panes.length === 1\""); + } + const consolePane = panes[0]; const consolePaneAllItems = consolePane.getItems(); - const consolePaneItems: Array = consolePaneAllItems.filter( - cp => cp === this, - ); - invariant(consolePaneItems.length === 1); - this._selectSources( - currentlySelectedSources.filter(id => id !== event.id), - ); + const consolePaneItems = consolePaneAllItems.filter(cp => cp === this); + + if (!(consolePaneItems.length === 1)) { + throw new Error("Invariant violation: \"consolePaneItems.length === 1\""); + } + + this._selectSources(currentlySelectedSources.filter(id => id !== event.id)); + const consoleObj = consolePaneItems[0]; const newConsoleObj = consoleObj.copy(); consolePane.addItem(newConsoleObj); } + this._selectSources([event.id]); - } else if (currentlySelectedSources.includes(event.id)) { - // do nothing because we do not need to isolate and this source is already visible + } else if (currentlySelectedSources.includes(event.id)) {// do nothing because we do not need to isolate and this source is already visible } else { this._selectSources(currentlySelectedSources.concat([event.id])); } } - getIconName(): string { + getIconName() { return 'nuclicon-console'; - } - - // Get the pane item's title. If there's only one source selected, we'll use that to make a more + } // Get the pane item's title. If there's only one source selected, we'll use that to make a more // descriptive title. - getTitle(): string { + + + getTitle() { const enabledProviderCount = this._store.getState().providers.size; - const {unselectedSourceIds} = this._model.state; - // Calling `_getSources()` is (currently) expensive because it needs to search all the records + const { + unselectedSourceIds + } = this._model.state; // Calling `_getSources()` is (currently) expensive because it needs to search all the records // for sources that have been disabled but still have records. We try to avoid calling it if we // already know that there's more than one selected source. + if (enabledProviderCount - unselectedSourceIds.length > 1) { return 'Console'; - } + } // If there's only one source selected, use its name in the tab title. + - // If there's only one source selected, use its name in the tab title. const sources = this._getSources(); + if (sources.length - unselectedSourceIds.length === 1) { - const selectedSource = sources.find( - source => unselectedSourceIds.indexOf(source.id) === -1, - ); + const selectedSource = sources.find(source => unselectedSourceIds.indexOf(source.id) === -1); + if (selectedSource) { return `Console: ${selectedSource.name}`; } @@ -203,273 +346,191 @@ export class Console { return 'Console'; } - getDefaultLocation(): string { + getDefaultLocation() { return 'bottom'; } - getURI(): string { + getURI() { return WORKSPACE_VIEW_URI; } - onDidChangeTitle(callback: (title: string) => mixed): IDisposable { - return new UniversalDisposable(this._titleChanges.subscribe(callback)); + onDidChangeTitle(callback) { + return new (_UniversalDisposable().default)(this._titleChanges.subscribe(callback)); } - _getSources(): Array { + _getSources() { const { providers, providerStatuses, records, - incompleteRecords, + incompleteRecords } = this._store.getState(); + return this._getSourcesMemoized({ providers, providerStatuses, records, - incompleteRecords, + incompleteRecords }); - } - - // Memoize `getSources()`. Unfortunately, since we look for unrepresented sources in the record + } // Memoize `getSources()`. Unfortunately, since we look for unrepresented sources in the record // list, this still needs to be called whenever the records change. // TODO: Consider removing records when their source is removed. This will likely require adding // the ability to enable and disable sources so, for example, when the debugger is no longer // active, it still remains in the source list. - _getSourcesMemoized = memoizeUntilChanged( - getSources, - opts => opts, - (a, b) => shallowEqual(a, b), - ); - destroy(): void { + + destroy() { this._destroyed.next(); } - copy(): Console { + copy() { return new Console({ store: this._store, initialFilterText: this._model.state.filterText, initialEnableRegExpFilter: this._model.state.enableRegExpFilter, initialUnselectedSourceIds: this._model.state.unselectedSourceIds, - initialUnselectedSeverities: setDifference( - ALL_SEVERITIES, - this._model.state.selectedSeverities, - ), + initialUnselectedSeverities: (0, _collection().setDifference)(ALL_SEVERITIES, this._model.state.selectedSeverities) }); } - _getBoundActionCreators(): BoundActionCreators { + _getBoundActionCreators() { if (this._actionCreators == null) { this._actionCreators = { execute: code => { - this._store.dispatch(Actions.execute(code)); + this._store.dispatch(Actions().execute(code)); }, selectExecutor: executorId => { - this._store.dispatch(Actions.selectExecutor(executorId)); + this._store.dispatch(Actions().selectExecutor(executorId)); }, clearRecords: () => { - this._store.dispatch(Actions.clearRecords()); - }, + this._store.dispatch(Actions().clearRecords()); + } }; } + return this._actionCreators; } - _resetAllFilters = (): void => { - this._selectSources(this._getSources().map(s => s.id)); - this._model.setState({filterText: ''}); - }; - - _createPaste = async (): Promise => { - const displayableRecords = Selectors.getAllRecords( - this._store.getState(), - ).toArray(); - const createPasteImpl = this._store.getState().createPasteFunction; - if (createPasteImpl == null) { - return; - } - return createPaste(createPasteImpl, displayableRecords); - }; + _getFilterInfo() { + const { + pattern, + invalid + } = (0, _RegExpFilter().getFilterPattern)(this._model.state.filterText, this._model.state.enableRegExpFilter); - _getFilterInfo(): { - invalid: boolean, - selectedSourceIds: Array, - filteredRecords: Array, - selectedSeverities: Set, - } { - const {pattern, invalid} = getFilterPattern( - this._model.state.filterText, - this._model.state.enableRegExpFilter, - ); const sources = this._getSources(); - const selectedSourceIds = sources - .map(source => source.id) - .filter( - sourceId => - this._model.state.unselectedSourceIds.indexOf(sourceId) === -1, - ); - - const {selectedSeverities} = this._model.state; - const filteredRecords = filterRecords( - Selectors.getAllRecords(this._store.getState()).toArray(), - selectedSourceIds, - selectedSeverities, - pattern, - sources.length !== selectedSourceIds.length, - ); + const selectedSourceIds = sources.map(source => source.id).filter(sourceId => this._model.state.unselectedSourceIds.indexOf(sourceId) === -1); + const { + selectedSeverities + } = this._model.state; + const filteredRecords = filterRecords(Selectors().getAllRecords(this._store.getState()).toArray(), selectedSourceIds, selectedSeverities, pattern, sources.length !== selectedSourceIds.length); return { invalid, selectedSourceIds, selectedSeverities, - filteredRecords, + filteredRecords }; } - getElement(): HTMLElement { + getElement() { if (this._element != null) { return this._element; } const actionCreators = this._getBoundActionCreators(); - const globalStates: Observable = observableFromReduxStore( - this._store, - ); - - const props = Observable.combineLatest( - this._model.toObservable(), - globalStates, - ) - // Don't re-render when the console isn't visible. - .let(toggle(observePaneItemVisibility(this))) - .audit(() => nextAnimationFrame) - .map(([localState, globalState]) => { - const { - invalid, - selectedSourceIds, - selectedSeverities, - filteredRecords, - } = this._getFilterInfo(); - - const currentExecutorId = Selectors.getCurrentExecutorId(globalState); - const currentExecutor = - currentExecutorId != null - ? globalState.executors.get(currentExecutorId) - : null; - - return { - invalidFilterInput: invalid, - execute: actionCreators.execute, - selectExecutor: actionCreators.selectExecutor, - clearRecords: actionCreators.clearRecords, - createPaste: - globalState.createPasteFunction == null ? null : this._createPaste, - watchEditor: globalState.watchEditor, - currentExecutor, - unselectedSourceIds: localState.unselectedSourceIds, - filterText: localState.filterText, - enableRegExpFilter: localState.enableRegExpFilter, - records: filteredRecords, - filteredRecordCount: - Selectors.getAllRecords(globalState).size - filteredRecords.length, - history: globalState.history, - sources: this._getSources(), - selectedSourceIds, - selectSources: this._selectSources, - executors: globalState.executors, - getProvider: id => globalState.providers.get(id), - updateFilter: this._updateFilter, - resetAllFilters: this._resetAllFilters, - fontSize: globalState.fontSize, - selectedSeverities, - toggleSeverity: this._toggleSeverity, - }; - }); - const StatefulConsoleView = bindObservableAsProps(props, ConsoleView); - return (this._element = renderReactRoot()); + const globalStates = (0, _observableFromReduxStore().default)(this._store); + + const props = _rxjsCompatUmdMin.Observable.combineLatest(this._model.toObservable(), globalStates) // Don't re-render when the console isn't visible. + .let((0, _observable().toggle)((0, _observePaneItemVisibility().default)(this))).audit(() => _observable().nextAnimationFrame).map(([localState, globalState]) => { + const { + invalid, + selectedSourceIds, + selectedSeverities, + filteredRecords + } = this._getFilterInfo(); + + const currentExecutorId = Selectors().getCurrentExecutorId(globalState); + const currentExecutor = currentExecutorId != null ? globalState.executors.get(currentExecutorId) : null; + return { + invalidFilterInput: invalid, + execute: actionCreators.execute, + selectExecutor: actionCreators.selectExecutor, + clearRecords: actionCreators.clearRecords, + createPaste: globalState.createPasteFunction == null ? null : this._createPaste, + watchEditor: globalState.watchEditor, + currentExecutor, + unselectedSourceIds: localState.unselectedSourceIds, + filterText: localState.filterText, + enableRegExpFilter: localState.enableRegExpFilter, + records: filteredRecords, + filteredRecordCount: Selectors().getAllRecords(globalState).size - filteredRecords.length, + history: globalState.history, + sources: this._getSources(), + selectedSourceIds, + selectSources: this._selectSources, + executors: globalState.executors, + getProvider: id => globalState.providers.get(id), + updateFilter: this._updateFilter, + resetAllFilters: this._resetAllFilters, + fontSize: globalState.fontSize, + selectedSeverities, + toggleSeverity: this._toggleSeverity + }; + }); + + const StatefulConsoleView = (0, _bindObservableAsProps().bindObservableAsProps)(props, _ConsoleView().default); + return this._element = (0, _renderReactRoot().renderReactRoot)(React.createElement(StatefulConsoleView, null)); } - serialize(): ConsolePersistedState { + serialize() { const { filterText, enableRegExpFilter, unselectedSourceIds, - selectedSeverities, + selectedSeverities } = this._model.state; return { deserializer: 'nuclide.Console', filterText, enableRegExpFilter, unselectedSourceIds, - unselectedSeverities: [ - ...setDifference(ALL_SEVERITIES, selectedSeverities), - ], + unselectedSeverities: [...(0, _collection().setDifference)(ALL_SEVERITIES, selectedSeverities)] }; } - _selectSources = (selectedSourceIds: Array): void => { - const sourceIds = this._getSources().map(source => source.id); - const unselectedSourceIds = sourceIds.filter( - sourceId => selectedSourceIds.indexOf(sourceId) === -1, - ); - this._model.setState({unselectedSourceIds}); - }; - /** Unselects the sources from the given IDs */ - unselectSources(ids: Array): void { - const newIds = ids.filter( - id => !this._model.state.unselectedSourceIds.includes(id), - ); - this._model.setState({ - unselectedSourceIds: this._model.state.unselectedSourceIds.concat(newIds), - }); - } + unselectSources(ids) { + const newIds = ids.filter(id => !this._model.state.unselectedSourceIds.includes(id)); - _updateFilter = (change: RegExpFilterChange): void => { - const {text, isRegExp} = change; this._model.setState({ - filterText: text, - enableRegExpFilter: isRegExp, + unselectedSourceIds: this._model.state.unselectedSourceIds.concat(newIds) }); - }; + } - _toggleSeverity = (severity: Severity): void => { - const {selectedSeverities} = this._model.state; - const nextSelectedSeverities = new Set(selectedSeverities); - if (nextSelectedSeverities.has(severity)) { - nextSelectedSeverities.delete(severity); - } else { - nextSelectedSeverities.add(severity); - } - this._model.setState({selectedSeverities: nextSelectedSeverities}); - }; } -function getSources(options: { - records: List, - providers: Map, - providerStatuses: Map, -}): Array { - const {providers, providerStatuses, records} = options; - - // Convert the providers to a map of sources. - const mapOfSources = new Map( - Array.from(providers.entries()).map(([k, provider]) => { - const source = { - id: provider.id, - name: provider.name, - status: providerStatuses.get(provider.id) || 'stopped', - start: - typeof provider.start === 'function' ? provider.start : undefined, - stop: typeof provider.stop === 'function' ? provider.stop : undefined, - }; - return [k, source]; - }), - ); - - // Some providers may have been unregistered, but still have records. Add sources for them too. +exports.Console = Console; + +function getSources(options) { + const { + providers, + providerStatuses, + records + } = options; // Convert the providers to a map of sources. + + const mapOfSources = new Map(Array.from(providers.entries()).map(([k, provider]) => { + const source = { + id: provider.id, + name: provider.name, + status: providerStatuses.get(provider.id) || 'stopped', + start: typeof provider.start === 'function' ? provider.start : undefined, + stop: typeof provider.stop === 'function' ? provider.stop : undefined + }; + return [k, source]; + })); // Some providers may have been unregistered, but still have records. Add sources for them too. // TODO: Iterating over all the records to get this every time we get a new record is inefficient. + records.forEach((record, i) => { if (!mapOfSources.has(record.sourceId)) { mapOfSources.set(record.sourceId, { @@ -477,26 +538,15 @@ function getSources(options: { name: record.sourceId, status: 'stopped', start: undefined, - stop: undefined, + stop: undefined }); } }); - return Array.from(mapOfSources.values()); } -function filterRecords( - records: Array, - selectedSourceIds: Array, - selectedSeverities: Set, - filterPattern: ?RegExp, - filterSources: boolean, -): Array { - if ( - !filterSources && - filterPattern == null && - areSetsEqual(ALL_SEVERITIES, selectedSeverities) - ) { +function filterRecords(records, selectedSourceIds, selectedSeverities, filterPattern, filterSources) { + if (!filterSources && filterPattern == null && (0, _collection().areSetsEqual)(ALL_SEVERITIES, selectedSeverities)) { return records; } @@ -511,37 +561,19 @@ function filterRecords( } const sourceMatches = selectedSourceIds.indexOf(record.sourceId) !== -1; - return ( - sourceMatches && - (filterPattern == null || filterPattern.test(record.text)) - ); + return sourceMatches && (filterPattern == null || filterPattern.test(record.text)); }); } -async function serializeRecordObject( - executor: Executor, - visited: Set, - data: { - objectId?: string, - description?: string, - value?: string, - }, - text: string, - level: number, -): Promise { +async function serializeRecordObject(executor, visited, data, text, level) { const getText = record => { let indent = ''; + for (let i = 0; i < level; i++) { indent += '\t'; } - return ( - indent + - (record.description != null - ? record.description - : record.value != null - ? record.value - : '') - ); + + return indent + (record.description != null ? record.description : record.value != null ? record.value : ''); }; if (data.objectId == null) { @@ -550,6 +582,7 @@ async function serializeRecordObject( } const id = data.objectId; + if (visited.has(id)) { // Guard against cycles. return text; @@ -563,114 +596,75 @@ async function serializeRecordObject( const childProperties = (await executor.getProperties(id).toPromise()) || []; const serializedProps = childProperties.map(childProp => { - return serializeRecordObject( - executor, - visited, - childProp.value, - '', - level + 1, - ); + return serializeRecordObject(executor, visited, childProp.value, '', level + 1); }); return getText(data) + '\n' + (await Promise.all(serializedProps)).join('\n'); } -async function createPaste( - createPasteImpl: CreatePasteFunction, - records: Array, -): Promise { - const linePromises = records - .filter( - record => - record.kind === 'message' || - record.kind === 'request' || - record.kind === 'response', - ) - .map(async record => { - const level = - record.level != null ? record.level.toString().toUpperCase() : 'LOG'; - const timestamp = record.timestamp.toLocaleString(); - let text = - record.text || - (record.data && record.data.value) || - ERROR_TRANSCRIBING_MESSAGE; - - if ( - record.kind === 'response' && - record.data != null && - record.data.objectId != null && - record.data.objectId !== '' - ) { - const executor = record.executor; - if (executor != null) { - // If the record has a data object, and the object has an ID, - // recursively expand the nodes of the object and serialize it - // for the paste. - text = await serializeRecordObject( - executor, - new Set(), - record.data, - '', - 0, - ); - } - } +async function createPaste(createPasteImpl, records) { + const linePromises = records.filter(record => record.kind === 'message' || record.kind === 'request' || record.kind === 'response').map(async record => { + const level = record.level != null ? record.level.toString().toUpperCase() : 'LOG'; + const timestamp = record.timestamp.toLocaleString(); + let text = record.text || record.data && record.data.value || ERROR_TRANSCRIBING_MESSAGE; - return `[${level}][${record.sourceId}][${timestamp}]\t ${text}`; - }); + if (record.kind === 'response' && record.data != null && record.data.objectId != null && record.data.objectId !== '') { + const executor = record.executor; + + if (executor != null) { + // If the record has a data object, and the object has an ID, + // recursively expand the nodes of the object and serialize it + // for the paste. + text = await serializeRecordObject(executor, new Set(), record.data, '', 0); + } + } + return `[${level}][${record.sourceId}][${timestamp}]\t ${text}`; + }); const lines = (await Promise.all(linePromises)).join('\n'); if (lines === '') { // Can't create an empty paste! - atom.notifications.addWarning( - 'There is nothing in your console to Paste! Check your console filters and try again.', - ); + atom.notifications.addWarning('There is nothing in your console to Paste! Check your console filters and try again.'); return; } atom.notifications.addInfo('Creating Paste...'); try { - const uri = await createPasteImpl( - lines, - { - title: 'Nuclide Console Paste', - }, - 'console paste', - ); + const uri = await createPasteImpl(lines, { + title: 'Nuclide Console Paste' + }, 'console paste'); atom.notifications.addSuccess(`Created Paste at ${uri}`); } catch (error) { if (error.stdout == null) { - atom.notifications.addError( - `Failed to create paste: ${String(error.message || error)}`, - ); + atom.notifications.addError(`Failed to create paste: ${String(error.message || error)}`); return; } - const errorMessages = error.stdout - .trim() - .split('\n') - .map(JSON.parse) - .map(e => e.message); + + const errorMessages = error.stdout.trim().split('\n').map(JSON.parse).map(e => e.message); atom.notifications.addError('Failed to create paste', { detail: errorMessages.join('\n'), - dismissable: true, + dismissable: true }); } } -function levelToSeverity(level: Level): Severity { +function levelToSeverity(level) { switch (level) { case 'error': return 'error'; + case 'warning': return 'warning'; + case 'log': case 'info': case 'debug': case 'success': return 'info'; + default: // All the colors are "info" return 'info'; } -} +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/ConsoleHeader.js b/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/ConsoleHeader.js index 779b74e021..78459cd3c1 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/ConsoleHeader.js +++ b/modules/atom-ide-ui/pkg/atom-ide-console/lib/ui/ConsoleHeader.js @@ -1,3 +1,106 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _ButtonGroup() { + const data = require("../../../../../nuclide-commons-ui/ButtonGroup"); + + _ButtonGroup = function () { + return data; + }; + + return data; +} + +function _LoadingSpinner() { + const data = require("../../../../../nuclide-commons-ui/LoadingSpinner"); + + _LoadingSpinner = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _ModalMultiSelect() { + const data = require("../../../../../nuclide-commons-ui/ModalMultiSelect"); + + _ModalMultiSelect = function () { + return data; + }; + + return data; +} + +function _RegExpFilter() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-ui/RegExpFilter")); + + _RegExpFilter = function () { + return data; + }; + + return data; +} + +function _Toolbar() { + const data = require("../../../../../nuclide-commons-ui/Toolbar"); + + _Toolbar = function () { + return data; + }; + + return data; +} + +function _ToolbarLeft() { + const data = require("../../../../../nuclide-commons-ui/ToolbarLeft"); + + _ToolbarLeft = function () { + return data; + }; + + return data; +} + +function _ToolbarRight() { + const data = require("../../../../../nuclide-commons-ui/ToolbarRight"); + + _ToolbarRight = function () { + return data; + }; + + return data; +} + +function _addTooltip() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-ui/addTooltip")); + + _addTooltip = function () { + return data; + }; + + return data; +} + +function _Button() { + const data = require("../../../../../nuclide-commons-ui/Button"); + + _Button = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,264 +109,204 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ +class ConsoleHeader extends React.Component { + constructor(...args) { + var _temp; -import type {Source, Severity} from '../types'; -import type {RegExpFilterChange} from 'nuclide-commons-ui/RegExpFilter'; - -import {ButtonGroup} from 'nuclide-commons-ui/ButtonGroup'; -import {LoadingSpinner} from 'nuclide-commons-ui/LoadingSpinner'; -import * as React from 'react'; -import {ModalMultiSelect} from 'nuclide-commons-ui/ModalMultiSelect'; -import RegExpFilter from 'nuclide-commons-ui/RegExpFilter'; -import {Toolbar} from 'nuclide-commons-ui/Toolbar'; -import {ToolbarLeft} from 'nuclide-commons-ui/ToolbarLeft'; -import {ToolbarRight} from 'nuclide-commons-ui/ToolbarRight'; -import addTooltip from 'nuclide-commons-ui/addTooltip'; - -import {Button, ButtonSizes} from 'nuclide-commons-ui/Button'; -import invariant from 'assert'; - -type Props = {| - clear: () => void, - createPaste: ?() => Promise, - invalidFilterInput: boolean, - enableRegExpFilter: boolean, - onFilterChange: (change: RegExpFilterChange) => void, - selectedSourceIds: Array, - sources: Array, - onSelectedSourcesChange: (sourceIds: Array) => void, - filterText: string, - selectedSeverities: Set, - toggleSeverity: (severity: Severity) => void, -|}; - -export default class ConsoleHeader extends React.Component { - _filterComponent: ?RegExpFilter; - - focusFilter = (): void => { - if (this._filterComponent != null) { - this._filterComponent.focus(); - } - }; - - _handleClearButtonClick = (event: SyntheticMouseEvent<>): void => { - this.props.clear(); - }; + return _temp = super(...args), this.focusFilter = () => { + if (this._filterComponent != null) { + this._filterComponent.focus(); + } + }, this._handleClearButtonClick = event => { + this.props.clear(); + }, this._handleCreatePasteButtonClick = event => { + if (this.props.createPaste != null) { + this.props.createPaste(); + } + }, this._handleFilterChange = value => { + this.props.onFilterChange(value); + }, this._renderOption = optionProps => { + const { + option + } = optionProps; + const source = this.props.sources.find(s => s.id === option.value); - _handleCreatePasteButtonClick = (event: SyntheticMouseEvent<>): void => { - if (this.props.createPaste != null) { - this.props.createPaste(); - } - }; + if (!(source != null)) { + throw new Error("Invariant violation: \"source != null\""); + } - _handleFilterChange = (value: RegExpFilterChange): void => { - this.props.onFilterChange(value); - }; + const startingSpinner = source.status !== 'starting' ? null : React.createElement(_LoadingSpinner().LoadingSpinner, { + className: "inline-block console-process-starting-spinner", + size: "EXTRA_SMALL" + }); + return React.createElement("span", null, option.label, startingSpinner, this._renderProcessControlButton(source)); + }, _temp; + } - _renderProcessControlButton(source: Source): ?React.Element { + _renderProcessControlButton(source) { let action; let label; let icon; + switch (source.status) { case 'starting': - case 'running': { - action = source.stop; - label = 'Stop Process'; - icon = 'primitive-square'; - break; - } - case 'stopped': { - action = source.start; - label = 'Start Process'; - icon = 'triangle-right'; - break; - } + case 'running': + { + action = source.stop; + label = 'Stop Process'; + icon = 'primitive-square'; + break; + } + + case 'stopped': + { + action = source.start; + label = 'Start Process'; + icon = 'triangle-right'; + break; + } } + if (action == null) { return; } + const clickHandler = event => { event.stopPropagation(); - invariant(action != null); + + if (!(action != null)) { + throw new Error("Invariant violation: \"action != null\""); + } + action(); }; - return ( - - ); - } - _renderOption = (optionProps: { - option: {label: string, value: string}, - }): React.Element => { - const {option} = optionProps; - const source = this.props.sources.find(s => s.id === option.value); - invariant(source != null); - const startingSpinner = - source.status !== 'starting' ? null : ( - - ); - return ( - - {option.label} - {startingSpinner} - {this._renderProcessControlButton(source)} - - ); - }; + return React.createElement(_Button().Button, { + className: "pull-right console-process-control-button", + icon: icon, + onClick: clickHandler + }, label); + } - render(): React.Node { - const options = this.props.sources - .slice() - .sort((a, b) => sortAlpha(a.name, b.name)) - .map(source => ({ - label: source.name, - value: source.id, - })); - - const sourceButton = - options.length === 0 ? null : ( - - ); - - const pasteButton = - this.props.createPaste == null ? null : ( - - ); - - return ( - - - {sourceButton} - - - - - - (this._filterComponent = component)} - value={{ - text: this.props.filterText, - isRegExp: this.props.enableRegExpFilter, - invalid: this.props.invalidFilterInput, - }} - onChange={this._handleFilterChange} - /> - - - {pasteButton} - - - - ); + render() { + const options = this.props.sources.slice().sort((a, b) => sortAlpha(a.name, b.name)).map(source => ({ + label: source.name, + value: source.id + })); + const sourceButton = options.length === 0 ? null : React.createElement(_ModalMultiSelect().ModalMultiSelect, { + labelComponent: MultiSelectLabel, + optionComponent: this._renderOption, + size: _Button().ButtonSizes.SMALL, + options: options, + value: this.props.selectedSourceIds, + onChange: this.props.onSelectedSourcesChange, + className: "inline-block" + }); + const pasteButton = this.props.createPaste == null ? null : React.createElement(_Button().Button, { + className: "inline-block", + size: _Button().ButtonSizes.SMALL, + onClick: this._handleCreatePasteButtonClick // eslint-disable-next-line nuclide-internal/jsx-simple-callback-refs + , + ref: (0, _addTooltip().default)({ + title: 'Creates a Paste from the current contents of the console' + }) + }, "Create Paste"); + return React.createElement(_Toolbar().Toolbar, { + location: "top" + }, React.createElement(_ToolbarLeft().ToolbarLeft, null, sourceButton, React.createElement(_ButtonGroup().ButtonGroup, { + className: "inline-block" + }, React.createElement(FilterButton, { + severity: "error", + selectedSeverities: this.props.selectedSeverities, + toggleSeverity: this.props.toggleSeverity + }), React.createElement(FilterButton, { + severity: "warning", + selectedSeverities: this.props.selectedSeverities, + toggleSeverity: this.props.toggleSeverity + }), React.createElement(FilterButton, { + severity: "info", + selectedSeverities: this.props.selectedSeverities, + toggleSeverity: this.props.toggleSeverity + })), React.createElement(_RegExpFilter().default, { + ref: component => this._filterComponent = component, + value: { + text: this.props.filterText, + isRegExp: this.props.enableRegExpFilter, + invalid: this.props.invalidFilterInput + }, + onChange: this._handleFilterChange + })), React.createElement(_ToolbarRight().ToolbarRight, null, pasteButton, React.createElement(_Button().Button, { + size: _Button().ButtonSizes.SMALL, + onClick: this._handleClearButtonClick + }, "Clear"))); } + } -function sortAlpha(a: string, b: string): number { +exports.default = ConsoleHeader; + +function sortAlpha(a, b) { const aLower = a.toLowerCase(); const bLower = b.toLowerCase(); + if (aLower < bLower) { return -1; } else if (aLower > bLower) { return 1; } + return 0; } -type LabelProps = { - selectedOptions: Array<{value: string, label: string}>, -}; - -function MultiSelectLabel(props: LabelProps): React.Element { - const {selectedOptions} = props; - const label = - selectedOptions.length === 1 - ? selectedOptions[0].label - : `${selectedOptions.length} Sources`; - return Showing: {label}; +function MultiSelectLabel(props) { + const { + selectedOptions + } = props; + const label = selectedOptions.length === 1 ? selectedOptions[0].label : `${selectedOptions.length} Sources`; + return React.createElement("span", null, "Showing: ", label); } -type FilterButtonProps = {| - severity: 'error' | 'warning' | 'info', - selectedSeverities: Set, - toggleSeverity: Severity => void, -|}; - -function FilterButton(props: FilterButtonProps): React.Element { - const {severity} = props; +function FilterButton(props) { + const { + severity + } = props; const selected = props.selectedSeverities.has(props.severity); let tooltipTitle = selected ? 'Hide ' : 'Show '; let icon; + switch (severity) { case 'error': tooltipTitle += 'Errors'; icon = 'nuclicon-error'; break; + case 'warning': tooltipTitle += 'Warnings'; icon = 'nuclicon-warning'; break; + case 'info': tooltipTitle += 'Info'; icon = 'info'; break; + default: - (severity: empty); + severity; throw new Error(`Invalid severity: ${severity}`); } - return ( - - - - - - - ); + render() { + return React.createElement(_Modal().Modal, { + onDismiss: this.props.onDismiss + }, React.createElement("div", { + className: "padded debugger-bp-dialog" + }, React.createElement("h1", { + className: "debugger-bp-config-header" + }, "Edit breakpoint"), React.createElement("div", { + className: "block" + }, React.createElement("label", null, "Breakpoint at ", _nuclideUri().default.basename(this.props.breakpoint.uri), ":", this.props.breakpoint.line)), React.createElement("div", { + className: "block" + }, React.createElement(_Checkbox().Checkbox, { + onChange: isChecked => { + (0, _analytics().track)(_constants().AnalyticsEvents.DEBUGGER_BREAKPOINT_TOGGLE_ENABLED, { + enabled: isChecked + }); + this.setState({ + enabledChecked: isChecked + }); + }, + checked: this.state.enabledChecked, + label: "Enable breakpoint" + })), React.createElement("div", { + className: "block" + }, React.createElement(_AtomInput().AtomInput, { + placeholderText: "Breakpoint hit condition...", + value: this.props.breakpoint.condition || '', + size: "sm", + ref: input => { + this._condition = input; + }, + autofocus: true + })), React.createElement("label", null, "This expression will be evaluated each time the corresponding line is hit, but the debugger will only break execution if the expression evaluates to true."), React.createElement("div", { + className: "debugger-bp-config-actions" + }, React.createElement(_ButtonGroup().ButtonGroup, null, React.createElement(_Button().Button, { + onClick: this.props.onDismiss + }, "Cancel"), React.createElement(_Button().Button, { + buttonType: _Button().ButtonTypes.PRIMARY, + onClick: this._updateBreakpoint.bind(this) + }, "Update"))))); } + } + +exports.default = BreakpointConfigComponent; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointListComponent.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointListComponent.js index 48c47cea2e..61a9cf0da9 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointListComponent.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointListComponent.js @@ -1,3 +1,136 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _Checkbox() { + const data = require("../../../../../nuclide-commons-ui/Checkbox"); + + _Checkbox = function () { + return data; + }; + + return data; +} + +function _analytics() { + const data = require("../../../../../nuclide-commons/analytics"); + + _analytics = function () { + return data; + }; + + return data; +} + +function _ListView() { + const data = require("../../../../../nuclide-commons-ui/ListView"); + + _ListView = function () { + return data; + }; + + return data; +} + +function _classnames() { + const data = _interopRequireDefault(require("classnames")); + + _classnames = function () { + return data; + }; + + return data; +} + +function _Icon() { + const data = require("../../../../../nuclide-commons-ui/Icon"); + + _Icon = function () { + return data; + }; + + return data; +} + +function _constants() { + const data = require("../constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _utils() { + const data = require("../utils"); + + _utils = function () { + return data; + }; + + return data; +} + +function _Section() { + const data = require("../../../../../nuclide-commons-ui/Section"); + + _Section = function () { + return data; + }; + + return data; +} + +function _featureConfig() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-atom/feature-config")); + + _featureConfig = function () { + return data; + }; + + return data; +} + +function _projects() { + const data = require("../../../../../nuclide-commons-atom/projects"); + + _projects = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,372 +139,268 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {IBreakpoint, IDebugService, IExceptionBreakpoint} from '../types'; -import type {NuclideUri} from 'nuclide-commons/nuclideUri'; - -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import invariant from 'assert'; -import * as React from 'react'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {Checkbox} from 'nuclide-commons-ui/Checkbox'; -import {track} from 'nuclide-commons/analytics'; -import {ListView, ListViewItem} from 'nuclide-commons-ui/ListView'; -import classnames from 'classnames'; -import {Icon} from 'nuclide-commons-ui/Icon'; -import {AnalyticsEvents} from '../constants'; -import {openSourceLocation} from '../utils'; -import {Section} from 'nuclide-commons-ui/Section'; -import featureConfig from 'nuclide-commons-atom/feature-config'; -import {observeProjectPathsAll} from 'nuclide-commons-atom/projects'; - -type Props = {| - service: IDebugService, -|}; - -type State = { - supportsConditionalBreakpoints: boolean, - breakpoints: IBreakpoint[], - exceptionBreakpoints: IExceptionBreakpoint[], - exceptionBreakpointsCollapsed: boolean, - unavailableBreakpointsCollapsed: boolean, - activeProjects: NuclideUri[], -}; - -export default class BreakpointListComponent extends React.Component< - Props, - State, -> { - _disposables: UniversalDisposable; - - constructor(props: Props) { +class BreakpointListComponent extends React.Component { + constructor(props) { super(props); + + this._handleBreakpointEnabledChange = (breakpoint, enabled) => { + this.props.service.enableOrDisableBreakpoints(enabled, breakpoint); + }; + + this._handleBreakpointClick = (breakpointIndex, breakpoint) => { + if (!(breakpoint != null)) { + throw new Error("Invariant violation: \"breakpoint != null\""); + } + + const { + uri, + line + } = breakpoint; // Debugger model is 1-based while Atom UI is zero-based. + + (0, _utils().openSourceLocation)(uri, line - 1); + }; + + this._setExceptionCollapsed = collapsed => { + _featureConfig().default.set('debugger-exceptionBreakpointsCollapsed', collapsed); + + this.setState({ + exceptionBreakpointsCollapsed: collapsed + }); + }; + + this._setUnavailableCollapsed = collapsed => { + this.setState({ + unavailableBreakpointsCollapsed: collapsed + }); + }; + this.state = this._computeState(); - this._disposables = new UniversalDisposable(); + this._disposables = new (_UniversalDisposable().default)(); } - _computeState(): State { - const {service} = this.props; - const {focusedProcess} = service.viewModel; + _computeState() { + const { + service + } = this.props; + const { + focusedProcess + } = service.viewModel; const model = service.getModel(); - - const exceptionBreakpointsCollapsed = Boolean( - featureConfig.get('debugger-exceptionBreakpointsCollapsed'), - ); - + const exceptionBreakpointsCollapsed = Boolean(_featureConfig().default.get('debugger-exceptionBreakpointsCollapsed')); let newActiveProjects = []; + if (this.state != null) { - const {activeProjects} = this.state; + const { + activeProjects + } = this.state; + if (activeProjects != null) { newActiveProjects = activeProjects; } } return { - supportsConditionalBreakpoints: - focusedProcess != null && - Boolean( - focusedProcess.session.capabilities.supportsConditionalBreakpoints, - ), + supportsConditionalBreakpoints: focusedProcess != null && Boolean(focusedProcess.session.capabilities.supportsConditionalBreakpoints), breakpoints: model.getBreakpoints(), exceptionBreakpoints: model.getExceptionBreakpoints(), exceptionBreakpointsCollapsed, unavailableBreakpointsCollapsed: true, - activeProjects: newActiveProjects, + activeProjects: newActiveProjects }; } - componentDidMount(): void { + componentDidMount() { const model = this.props.service.getModel(); - const {viewModel} = this.props.service; - this._disposables.add( - model.onDidChangeBreakpoints(() => { - this.setState(this._computeState()); - }), - // Exception breakpoint filters are different for different debuggers, - // so we must refresh when switching debugger focus. - viewModel.onDidChangeDebuggerFocus(() => { - this.setState(this._computeState()); - }), - observeProjectPathsAll(projectPaths => - this.setState({activeProjects: projectPaths}), - ), - ); + const { + viewModel + } = this.props.service; + + this._disposables.add(model.onDidChangeBreakpoints(() => { + this.setState(this._computeState()); + }), // Exception breakpoint filters are different for different debuggers, + // so we must refresh when switching debugger focus. + viewModel.onDidChangeDebuggerFocus(() => { + this.setState(this._computeState()); + }), (0, _projects().observeProjectPathsAll)(projectPaths => this.setState({ + activeProjects: projectPaths + }))); } - componentWillUnmount(): void { + componentWillUnmount() { if (this._disposables != null) { this._disposables.dispose(); } } - _handleBreakpointEnabledChange = ( - breakpoint: IBreakpoint, - enabled: boolean, - ): void => { - this.props.service.enableOrDisableBreakpoints(enabled, breakpoint); - }; - - _handleBreakpointClick = ( - breakpointIndex: number, - breakpoint: ?IBreakpoint, - ): void => { - invariant(breakpoint != null); - const {uri, line} = breakpoint; - // Debugger model is 1-based while Atom UI is zero-based. - openSourceLocation(uri, line - 1); - }; - - _setExceptionCollapsed = (collapsed: boolean): void => { - featureConfig.set('debugger-exceptionBreakpointsCollapsed', collapsed); - this.setState({exceptionBreakpointsCollapsed: collapsed}); - }; - - _setUnavailableCollapsed = (collapsed: boolean): void => { - this.setState({unavailableBreakpointsCollapsed: collapsed}); - }; - - _getHostnameTranslated(uri: NuclideUri): string { + _getHostnameTranslated(uri) { try { // $FlowFB - const {getBreakpointHostnameTranslated} = require('./fb-utils'); + const { + getBreakpointHostnameTranslated + } = require("./fb-utils"); + return getBreakpointHostnameTranslated(uri); } catch (_) {} - if (nuclideUri.isLocal(uri)) { + if (_nuclideUri().default.isLocal(uri)) { return 'local'; } else { - return nuclideUri.getHostname(uri); + return _nuclideUri().default.getHostname(uri); } } - render(): React.Node { + render() { const { exceptionBreakpoints, supportsConditionalBreakpoints, activeProjects, - breakpoints, - } = this.state; - const {service} = this.props; - const availableHosts = activeProjects - .filter(uri => nuclideUri.isRemote(uri)) - .map(uri => this._getHostnameTranslated(uri)); - const breakpointGroup = available => breakpoints - .filter(bp => { - const match = - nuclideUri.isLocal(bp.uri) || - availableHosts.some( - host => this._getHostnameTranslated(bp.uri) === host, - ); - return available ? match : !match; - }) - .sort((breakpointA, breakpointB) => { - const fileA = nuclideUri.basename(breakpointA.uri); - const fileB = nuclideUri.basename(breakpointB.uri); - if (fileA !== fileB) { - return fileA.localeCompare(fileB); - } - return breakpointA.line - breakpointB.line; - }) - .map((breakpoint, i) => { - const host = this._getHostnameTranslated(breakpoint.uri) || 'local'; - const basename = nuclideUri.basename(breakpoint.uri); - const {line, verified, uri: path} = breakpoint; - const enabled = breakpoint.enabled && available; - const bpId = breakpoint.getId(); - const label = `${basename}:${line}`; - const title = - (!enabled - ? 'Disabled breakpoint' - : !verified - ? 'Unresolved Breakpoint' - : `Breakpoint at ${label} (resolved)`) + - (available - ? '' - : ` - ${host}:${nuclideUri.getPath(breakpoint.uri)}`); - - const conditionElement = - supportsConditionalBreakpoints && breakpoint.condition != null ? ( -
{ - atom.commands.dispatch( - event.target, - 'debugger:edit-breakpoint', - ); - }}> - Condition: {breakpoint.condition} -
- ) : null; - - const hitcountElement = - breakpoint.hitCount != null && breakpoint.hitCount > 0 ? ( -
- Hit count: {breakpoint.hitCount} -
- ) : null; - const content = ( -
-
- ) => event.stopPropagation()} - title={title} - disabled={!available} - className={classnames( - verified ? '' : 'debugger-breakpoint-unresolved', - 'debugger-breakpoint-checkbox', - )} - /> - -
- { - track( - AnalyticsEvents.DEBUGGER_EDIT_BREAKPOINT_FROM_ICON, - ); - atom.commands.dispatch( - event.target, - 'debugger:edit-breakpoint', - ); - }} - /> - { - track( - AnalyticsEvents.DEBUGGER_DELETE_BREAKPOINT_FROM_ICON, - ); - atom.commands.dispatch( - event.target, - 'debugger:remove-breakpoint', - ); - event.stopPropagation(); - }} - /> -
- {label} -
- {conditionElement} - {hitcountElement} -
-
- ); - return ( - - {content} - - ); - }); + } = this.state; + const { + service + } = this.props; + const availableHosts = activeProjects.filter(uri => _nuclideUri().default.isRemote(uri)).map(uri => this._getHostnameTranslated(uri)); + + const breakpointGroup = available => breakpoints.filter(bp => { + const match = _nuclideUri().default.isLocal(bp.uri) || availableHosts.some(host => this._getHostnameTranslated(bp.uri) === host); + return available ? match : !match; + }).sort((breakpointA, breakpointB) => { + const fileA = _nuclideUri().default.basename(breakpointA.uri); + + const fileB = _nuclideUri().default.basename(breakpointB.uri); + + if (fileA !== fileB) { + return fileA.localeCompare(fileB); + } + + return breakpointA.line - breakpointB.line; + }).map((breakpoint, i) => { + const host = this._getHostnameTranslated(breakpoint.uri) || 'local'; + + const basename = _nuclideUri().default.basename(breakpoint.uri); + + const { + line, + verified, + uri: path + } = breakpoint; + const enabled = breakpoint.enabled && available; + const bpId = breakpoint.getId(); + const label = `${basename}:${line}`; + const title = (!enabled ? 'Disabled breakpoint' : !verified ? 'Unresolved Breakpoint' : `Breakpoint at ${label} (resolved)`) + (available ? '' : ` - ${host}:${_nuclideUri().default.getPath(breakpoint.uri)}`); + const conditionElement = supportsConditionalBreakpoints && breakpoint.condition != null ? React.createElement("div", { + className: "debugger-breakpoint-condition", + title: `Breakpoint condition: ${breakpoint.condition}`, + "data-path": path, + "data-line": line, + "data-bpid": bpId, + onClick: event => { + atom.commands.dispatch(event.target, 'debugger:edit-breakpoint'); + } + }, "Condition: ", breakpoint.condition) : null; + const hitcountElement = breakpoint.hitCount != null && breakpoint.hitCount > 0 ? React.createElement("div", { + className: "debugger-breakpoint-hitcount" + }, "Hit count: ", breakpoint.hitCount) : null; + const content = React.createElement("div", { + className: "inline-block" + }, React.createElement("div", { + className: (0, _classnames().default)({ + 'debugger-breakpoint-disabled': !enabled, + 'debugger-breakpoint-with-condition': Boolean(breakpoint.condition) + }), + key: i + }, React.createElement(_Checkbox().Checkbox, { + checked: enabled, + onChange: this._handleBreakpointEnabledChange.bind(this, breakpoint), + onClick: event => event.stopPropagation(), + title: title, + disabled: !available, + className: (0, _classnames().default)(verified ? '' : 'debugger-breakpoint-unresolved', 'debugger-breakpoint-checkbox') + }), React.createElement("span", { + title: title, + "data-path": path, + "data-bpid": bpId, + "data-line": line + }, React.createElement("div", { + className: "debugger-breakpoint-condition-controls" + }, React.createElement(_Icon().Icon, { + icon: "pencil", + className: "debugger-breakpoint-condition-control", + "data-path": path, + "data-bpid": bpId, + "data-line": line, + onClick: event => { + (0, _analytics().track)(_constants().AnalyticsEvents.DEBUGGER_EDIT_BREAKPOINT_FROM_ICON); + atom.commands.dispatch(event.target, 'debugger:edit-breakpoint'); + } + }), React.createElement(_Icon().Icon, { + icon: "x", + className: "debugger-breakpoint-condition-control", + "data-path": path, + "data-bpid": bpId, + "data-line": line, + onClick: event => { + (0, _analytics().track)(_constants().AnalyticsEvents.DEBUGGER_DELETE_BREAKPOINT_FROM_ICON); + atom.commands.dispatch(event.target, 'debugger:remove-breakpoint'); + event.stopPropagation(); + } + })), label), conditionElement, hitcountElement)); + return React.createElement(_ListView().ListViewItem, { + key: label, + index: i, + value: breakpoint, + "data-path": path, + "data-bpid": bpId, + "data-line": line, + title: title, + className: "debugger-breakpoint" + }, content); + }); + const availableBreakpoints = breakpointGroup(true); const unavailableBreakpoints = breakpointGroup(false); - return ( -
- - {availableBreakpoints} - - {breakpoints.length === 0 ? ( - - You currently have no source breakpoints set. - - ) : null} - {exceptionBreakpoints.length > 0 ? ( -
- {exceptionBreakpoints.map(exceptionBreakpoint => { - return ( -
- - service.enableOrDisableBreakpoints( - enabled, - exceptionBreakpoint, - ) - } - checked={exceptionBreakpoint.enabled} - /> - {exceptionBreakpoint.label || - `${exceptionBreakpoint.filter} exceptions`} -
- ); - })} -
- ) : null} - {unavailableBreakpoints.length > 0 ? ( -
- Unavailable breakpoints -
- } - collapsable={true} - onChange={this._setUnavailableCollapsed} - collapsed={this.state.unavailableBreakpointsCollapsed}> -
- These breakpoints are in files that are not currently available in - any project root. Add the corresponding local or remote project to - your file tree to enable these breakpoints. -
- - {unavailableBreakpoints} - - - ) : null} - - ); + return React.createElement("div", null, React.createElement(_ListView().ListView, { + alternateBackground: true, + onSelect: this._handleBreakpointClick, + selectable: true + }, availableBreakpoints), breakpoints.length === 0 ? React.createElement("span", { + className: "debugger-breakpoint" + }, "You currently have no source breakpoints set.") : null, exceptionBreakpoints.length > 0 ? React.createElement(_Section().Section, { + className: "debugger-breakpoint-section", + headline: "Exception breakpoints", + collapsable: true, + onChange: this._setExceptionCollapsed, + collapsed: this.state.exceptionBreakpointsCollapsed + }, exceptionBreakpoints.map(exceptionBreakpoint => { + return React.createElement("div", { + className: "debugger-breakpoint", + key: exceptionBreakpoint.getId() + }, React.createElement(_Checkbox().Checkbox, { + className: (0, _classnames().default)('debugger-breakpoint-checkbox', 'debugger-exception-checkbox'), + onChange: enabled => service.enableOrDisableBreakpoints(enabled, exceptionBreakpoint), + checked: exceptionBreakpoint.enabled + }), exceptionBreakpoint.label || `${exceptionBreakpoint.filter} exceptions`); + })) : null, unavailableBreakpoints.length > 0 ? React.createElement(_Section().Section, { + className: "debugger-breakpoint-section", + headline: React.createElement("div", { + className: "inline-block" + }, React.createElement(_Icon().Icon, { + icon: "nuclicon-warning" + }), " Unavailable breakpoints"), + collapsable: true, + onChange: this._setUnavailableCollapsed, + collapsed: this.state.unavailableBreakpointsCollapsed + }, React.createElement("div", { + className: "debugger-unavailable-breakpoint-help" + }, "These breakpoints are in files that are not currently available in any project root. Add the corresponding local or remote project to your file tree to enable these breakpoints."), React.createElement(_ListView().ListView, { + alternateBackground: true, + selectable: false + }, unavailableBreakpoints)) : null); } + } + +exports.default = BreakpointListComponent; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointsView.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointsView.js index 4ff6fd0891..a0ff81db80 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointsView.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/BreakpointsView.js @@ -1,3 +1,36 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _classnames() { + const data = _interopRequireDefault(require("classnames")); + + _classnames = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _BreakpointListComponent() { + const data = _interopRequireDefault(require("./BreakpointListComponent")); + + _BreakpointListComponent = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,34 +39,23 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {IDebugService} from '../types'; - -import classnames from 'classnames'; -import * as React from 'react'; -import BreakpointListComponent from './BreakpointListComponent'; - -type Props = { - service: IDebugService, -}; - -export default class BreakpointsView extends React.PureComponent { - render(): React.Node { - const {service} = this.props; - - return ( -
-
- -
-
- ); +class BreakpointsView extends React.PureComponent { + render() { + const { + service + } = this.props; + return React.createElement("div", { + className: (0, _classnames().default)('debugger-container-new', 'debugger-breakpoint-list') + }, React.createElement("div", { + className: "debugger-pane-content " + }, React.createElement(_BreakpointListComponent().default, { + service: service + }))); } + } + +exports.default = BreakpointsView; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerAddTargetButton.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerAddTargetButton.js index a280db9132..57032c823f 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerAddTargetButton.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerAddTargetButton.js @@ -1,3 +1,44 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.AddTargetButton = AddTargetButton; + +var React = _interopRequireWildcard(require("react")); + +function _ButtonGroup() { + const data = require("../../../../../nuclide-commons-ui/ButtonGroup"); + + _ButtonGroup = function () { + return data; + }; + + return data; +} + +function _Dropdown() { + const data = require("../../../../../nuclide-commons-ui/Dropdown"); + + _Dropdown = function () { + return data; + }; + + return data; +} + +function _goToLocation() { + const data = require("../../../../../nuclide-commons-atom/go-to-location"); + + _goToLocation = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,56 +47,56 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ +const DEVICE_PANEL_URL = 'atom://nuclide/devices'; -import * as React from 'react'; -import {ButtonGroup} from 'nuclide-commons-ui/ButtonGroup'; -import {Dropdown} from 'nuclide-commons-ui/Dropdown'; -import {goToLocation} from 'nuclide-commons-atom/go-to-location'; +function AddTargetButton(className) { + return React.createElement(_ButtonGroup().ButtonGroup, { + className: className + }, React.createElement(_Dropdown().Dropdown, { + className: "debugger-stepping-svg-button", + tooltip: { + title: 'Start debugging an additional debug target...' + }, + options: [{ + label: 'Add target...', + value: null, + hidden: true + }, { + label: 'Attach debugger...', + value: 'attach' + }, { + label: 'Launch debugger...', + value: 'launch' + }, { + label: 'Manage devices...', + value: 'devices' + }], + onChange: value => { + switch (value) { + case 'attach': + { + atom.commands.dispatch(atom.views.getView(atom.workspace), 'debugger:show-attach-dialog'); + break; + } -const DEVICE_PANEL_URL = 'atom://nuclide/devices'; + case 'launch': + { + atom.commands.dispatch(atom.views.getView(atom.workspace), 'debugger:show-launch-dialog'); + break; + } -export function AddTargetButton(className: string) { - return ( - - { - switch (value) { - case 'attach': { - atom.commands.dispatch( - atom.views.getView(atom.workspace), - 'debugger:show-attach-dialog', - ); - break; - } - case 'launch': { - atom.commands.dispatch( - atom.views.getView(atom.workspace), - 'debugger:show-launch-dialog', - ); - break; - } - case 'devices': { - goToLocation(DEVICE_PANEL_URL); - break; - } - default: - break; + case 'devices': + { + (0, _goToLocation().goToLocation)(DEVICE_PANEL_URL); + break; } - }} - /> - - ); -} + + default: + break; + } + } + })); +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControllerView.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControllerView.js index 817beb8fd9..79f613cd4d 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControllerView.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControllerView.js @@ -1,3 +1,58 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _event() { + const data = require("../../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _LoadingSpinner() { + const data = require("../../../../../nuclide-commons-ui/LoadingSpinner"); + + _LoadingSpinner = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _constants() { + const data = require("../constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,63 +61,44 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {IDebugService} from '../types'; - -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import * as React from 'react'; -import {LoadingSpinner} from 'nuclide-commons-ui/LoadingSpinner'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {Observable} from 'rxjs'; -import {DebuggerMode} from '../constants'; - -type Props = { - service: IDebugService, -}; - -export default class DebuggerControllerView extends React.Component { - _disposables: UniversalDisposable; - - constructor(props: Props) { +class DebuggerControllerView extends React.Component { + constructor(props) { super(props); - this._disposables = new UniversalDisposable(); + this._disposables = new (_UniversalDisposable().default)(); } componentDidMount() { - const {service} = this.props; - this._disposables.add( - Observable.merge( - observableFromSubscribeFunction( - service.viewModel.onDidChangeDebuggerFocus.bind(service.viewModel), - ), - observableFromSubscribeFunction( - service.onDidChangeProcessMode.bind(service), - ), - ).subscribe(mode => this.forceUpdate()), - ); + const { + service + } = this.props; + + this._disposables.add(_rxjsCompatUmdMin.Observable.merge((0, _event().observableFromSubscribeFunction)(service.viewModel.onDidChangeDebuggerFocus.bind(service.viewModel)), (0, _event().observableFromSubscribeFunction)(service.onDidChangeProcessMode.bind(service))).subscribe(mode => this.forceUpdate())); } - componentWillUnmount(): void { + componentWillUnmount() { this._disposables.dispose(); } - render(): React.Node { - if ( - this.props.service.viewModel.focusedProcess?.debuggerMode === - DebuggerMode.STARTING - ) { - return ( -
-
- Starting Debugger... - -
-
- ); + render() { + var _this$props$service$v; + + if (((_this$props$service$v = this.props.service.viewModel.focusedProcess) === null || _this$props$service$v === void 0 ? void 0 : _this$props$service$v.debuggerMode) === _constants().DebuggerMode.STARTING) { + return React.createElement("div", { + className: "debugger-starting-message" + }, React.createElement("div", null, React.createElement("span", { + className: "inline-block" + }, "Starting Debugger..."), React.createElement(_LoadingSpinner().LoadingSpinner, { + className: "inline-block", + size: "EXTRA_SMALL" + }))); } + return null; } + } + +exports.default = DebuggerControllerView; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControlsView.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControlsView.js index 0e744a63e1..b568d4a05d 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControlsView.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerControlsView.js @@ -1,3 +1,78 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _event() { + const data = require("../../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _DebuggerSteppingComponent() { + const data = _interopRequireDefault(require("./DebuggerSteppingComponent")); + + _DebuggerSteppingComponent = function () { + return data; + }; + + return data; +} + +function _constants() { + const data = require("../constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _DebuggerControllerView() { + const data = _interopRequireDefault(require("./DebuggerControllerView")); + + _DebuggerControllerView = function () { + return data; + }; + + return data; +} + +function _DebuggerAddTargetButton() { + const data = require("./DebuggerAddTargetButton"); + + _DebuggerAddTargetButton = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,118 +81,81 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {DebuggerModeType, IDebugService} from '../types'; - -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import * as React from 'react'; -import {Observable} from 'rxjs'; -import DebuggerSteppingComponent from './DebuggerSteppingComponent'; -import {DebuggerMode} from '../constants'; -import DebuggerControllerView from './DebuggerControllerView'; -import {AddTargetButton} from './DebuggerAddTargetButton'; - -type Props = { - service: IDebugService, -}; - -type State = { - mode: DebuggerModeType, -}; - -export default class DebuggerControlsView extends React.PureComponent< - Props, - State, -> { - _disposables: UniversalDisposable; - - constructor(props: Props) { +class DebuggerControlsView extends React.PureComponent { + constructor(props) { super(props); - - this._disposables = new UniversalDisposable(); + this._disposables = new (_UniversalDisposable().default)(); this.state = { - mode: DebuggerMode.STOPPED, + mode: _constants().DebuggerMode.STOPPED }; } - componentDidMount(): void { - const {service} = this.props; - this._disposables.add( - Observable.merge( - observableFromSubscribeFunction( - service.onDidChangeProcessMode.bind(service), - ), - observableFromSubscribeFunction( - service.viewModel.onDidChangeDebuggerFocus.bind(service.viewModel), - ), - ) - .startWith(null) - .subscribe(() => { - const {viewModel} = this.props.service; - const {focusedProcess} = viewModel; - this.setState({ - mode: - focusedProcess == null - ? DebuggerMode.STOPPED - : focusedProcess.debuggerMode, - }); - }), - ); + componentDidMount() { + const { + service + } = this.props; + + this._disposables.add(_rxjsCompatUmdMin.Observable.merge((0, _event().observableFromSubscribeFunction)(service.onDidChangeProcessMode.bind(service)), (0, _event().observableFromSubscribeFunction)(service.viewModel.onDidChangeDebuggerFocus.bind(service.viewModel))).startWith(null).subscribe(() => { + const { + viewModel + } = this.props.service; + const { + focusedProcess + } = viewModel; + this.setState({ + mode: focusedProcess == null ? _constants().DebuggerMode.STOPPED : focusedProcess.debuggerMode + }); + })); } - componentWillUnmount(): void { + componentWillUnmount() { this._dispose(); } - _dispose(): void { + _dispose() { this._disposables.dispose(); } - render(): React.Node { - const {service} = this.props; - const {mode} = this.state; - const debuggerStoppedNotice = - mode !== DebuggerMode.STOPPED ? null : ( -
-
- The debugger is not attached. -
-
- {AddTargetButton('debugger-buttongroup-center')} -
-
- ); - - const running = mode === DebuggerMode.RUNNING; - const paused = mode === DebuggerMode.PAUSED; - const debuggerRunningNotice = - !running && !paused ? null : ( -
-
- {(service.viewModel.focusedProcess == null || - service.viewModel.focusedProcess.configuration.processName == null - ? 'The debug target' - : service.viewModel.focusedProcess.configuration.processName) + - ` is ${running ? 'running' : 'paused'}.`} -
-
- ); - - return ( -
-
- -
-
- -
- {debuggerRunningNotice} - {debuggerStoppedNotice} -
- ); + render() { + const { + service + } = this.props; + const { + mode + } = this.state; + const debuggerStoppedNotice = mode !== _constants().DebuggerMode.STOPPED ? null : React.createElement("div", { + className: "debugger-pane-content" + }, React.createElement("div", { + className: "debugger-state-notice" + }, "The debugger is not attached."), React.createElement("div", { + className: "debugger-state-notice" + }, (0, _DebuggerAddTargetButton().AddTargetButton)('debugger-buttongroup-center'))); + + const running = mode === _constants().DebuggerMode.RUNNING; + + const paused = mode === _constants().DebuggerMode.PAUSED; + + const debuggerRunningNotice = !running && !paused ? null : React.createElement("div", { + className: "debugger-pane-content" + }, React.createElement("div", { + className: "debugger-state-notice" + }, (service.viewModel.focusedProcess == null || service.viewModel.focusedProcess.configuration.processName == null ? 'The debug target' : service.viewModel.focusedProcess.configuration.processName) + ` is ${running ? 'running' : 'paused'}.`)); + return React.createElement("div", { + className: "debugger-container-new" + }, React.createElement("div", { + className: "debugger-section-header" + }, React.createElement(_DebuggerControllerView().default, { + service: service + })), React.createElement("div", { + className: "debugger-section-header debugger-controls-section" + }, React.createElement(_DebuggerSteppingComponent().default, { + service: service + })), debuggerRunningNotice, debuggerStoppedNotice); } + } + +exports.default = DebuggerControlsView; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerDatatipComponent.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerDatatipComponent.js index 1f07e017a5..4c59950a86 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerDatatipComponent.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerDatatipComponent.js @@ -1,3 +1,56 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _LoadingSpinner() { + const data = require("../../../../../nuclide-commons-ui/LoadingSpinner"); + + _LoadingSpinner = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _LazyNestedValueComponent() { + const data = require("../../../../../nuclide-commons-ui/LazyNestedValueComponent"); + + _LazyNestedValueComponent = function () { + return data; + }; + + return data; +} + +function _SimpleValueComponent() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-ui/SimpleValueComponent")); + + _SimpleValueComponent = function () { + return data; + }; + + return data; +} + +function _utils() { + const data = require("../utils"); + + _utils = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,49 +59,43 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {EvaluationResult} from 'nuclide-commons-ui/TextRenderer'; - -import {LoadingSpinner} from 'nuclide-commons-ui/LoadingSpinner'; -import * as React from 'react'; -import {LazyNestedValueComponent} from 'nuclide-commons-ui/LazyNestedValueComponent'; -import SimpleValueComponent from 'nuclide-commons-ui/SimpleValueComponent'; -import {fetchChildrenForLazyComponent} from '../utils'; - -type Props = {| - +expression: string, - +evaluationResult: ?EvaluationResult, -|}; - -export default class DebuggerDatatipComponent extends React.Component { - render(): React.Node { - const {expression, evaluationResult} = this.props; +class DebuggerDatatipComponent extends React.Component { + render() { + const { + expression, + evaluationResult + } = this.props; let datatipElement; + if (evaluationResult == null) { - datatipElement = ; + datatipElement = React.createElement(_LoadingSpinner().LoadingSpinner, { + delay: 100, + size: "EXTRA_SMALL" + }); } else { - if ( - evaluationResult.value == null && - evaluationResult.description == null - ) { + if (evaluationResult.value == null && evaluationResult.description == null) { return null; } else { - datatipElement = ( - - - - ); + datatipElement = React.createElement("span", { + className: "debugger-datatip-value" + }, React.createElement(_LazyNestedValueComponent().LazyNestedValueComponent, { + evaluationResult: evaluationResult, + expression: expression, + fetchChildren: _utils().fetchChildrenForLazyComponent, + simpleValueComponent: _SimpleValueComponent().default, + expansionStateId: this + })); } } - return
{datatipElement}
; + + return React.createElement("div", { + className: "debugger-datatip" + }, datatipElement); } + } + +exports.default = DebuggerDatatipComponent; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLaunchAttachUI.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLaunchAttachUI.js index 096b66dcc0..92f533cc0e 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLaunchAttachUI.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLaunchAttachUI.js @@ -1,3 +1,88 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var React = _interopRequireWildcard(require("react")); + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _nuclideUri() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/nuclideUri")); + + _nuclideUri = function () { + return data; + }; + + return data; +} + +function _Button() { + const data = require("../../../../../nuclide-commons-ui/Button"); + + _Button = function () { + return data; + }; + + return data; +} + +function _ButtonGroup() { + const data = require("../../../../../nuclide-commons-ui/ButtonGroup"); + + _ButtonGroup = function () { + return data; + }; + + return data; +} + +function _Dropdown() { + const data = require("../../../../../nuclide-commons-ui/Dropdown"); + + _Dropdown = function () { + return data; + }; + + return data; +} + +function _Tabs() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-ui/Tabs")); + + _Tabs = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _AtomServiceContainer() { + const data = require("../AtomServiceContainer"); + + _AtomServiceContainer = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,166 +91,103 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ -/* global localStorage */ - -import type { - DebuggerConfigAction, - DebuggerLaunchAttachProvider, -} from 'nuclide-debugger-common'; -import type {Tab} from 'nuclide-commons-ui/Tabs'; - -import * as React from 'react'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import nuclideUri from 'nuclide-commons/nuclideUri'; -import {Button, ButtonTypes} from 'nuclide-commons-ui/Button'; -import {ButtonGroup} from 'nuclide-commons-ui/ButtonGroup'; -import {Dropdown} from 'nuclide-commons-ui/Dropdown'; -import Tabs from 'nuclide-commons-ui/Tabs'; -import {Observable} from 'rxjs'; -import invariant from 'assert'; -import {isNuclideEnvironment} from '../AtomServiceContainer'; - -type ConnectionOption = { - value: string, - label: string, -}; - -type EnabledProvider = {| - provider: DebuggerLaunchAttachProvider, - tabName: string, -|}; - -type Props = {| - +dialogMode: DebuggerConfigAction, - +initialSelectedTabName: ?string, - +initialProviderConfig: ?{[string]: mixed}, - +connection: string, - +connectionChanged: (newValue: ?string) => void, - // $FlowFixMe - +connectionOptions: Array, - +providers: Map>, - +dialogCloser: () => void, -|}; - -type State = { - selectedProviderTab: ?string, - configIsValid: boolean, - enabledProviders: Array, -}; +/* global localStorage */ // TODO those should be managed by the debugger store state -function setLastUsedDebugger( - host: string, - action: DebuggerConfigAction, - debuggerDisplayName: string, -): void { +function setLastUsedDebugger(host, action, debuggerDisplayName) { const key = 'DEBUGGER_LAST_USED_' + host + '_' + action; localStorage.setItem(key, debuggerDisplayName); } -function getLastUsedDebugger( - host: string, - action: DebuggerConfigAction, -): ?string { +function getLastUsedDebugger(host, action) { const key = 'DEBUGGER_LAST_USED_' + host + '_' + action; return localStorage.getItem(key); -} - -// Older published debugger packages did not provide `getTabName()`. +} // Older published debugger packages did not provide `getTabName()`. // TODO(most): Remove this once newer debugger versions get adoption. -function getTabName(provider: DebuggerLaunchAttachProvider): string { + + +function getTabName(provider) { + var _provider$_debuggingT; + if (typeof provider.getTabName === 'function') { return provider.getTabName(); } - return provider._debuggingTypeName ?? ''; -} -export default class DebuggerLaunchAttachUI extends React.Component< - Props, - State, -> { - props: Props; - state: State; - _disposables: UniversalDisposable; + return (_provider$_debuggingT = provider._debuggingTypeName) !== null && _provider$_debuggingT !== void 0 ? _provider$_debuggingT : ''; +} - constructor(props: Props) { +class DebuggerLaunchAttachUI extends React.Component { + constructor(props) { super(props); - this._disposables = new UniversalDisposable(); - this._disposables.add( - atom.commands.add('atom-workspace', { - 'core:confirm': () => { - if (this.state.configIsValid) { - this._rememberTab(); - - // Close the dialog, but do it on the next tick so that the child - // component gets to handle the event first (and start the debugger). - process.nextTick(this.props.dialogCloser); - } - }, - }), - atom.commands.add('atom-workspace', { - 'core:cancel': () => { - this._rememberTab(); - this.props.dialogCloser(); - }, - }), - ); + this._setConfigValid = valid => { + this.setState({ + configIsValid: valid + }); + }; + + this._disposables = new (_UniversalDisposable().default)(); + + this._disposables.add(atom.commands.add('atom-workspace', { + 'core:confirm': () => { + if (this.state.configIsValid) { + this._rememberTab(); // Close the dialog, but do it on the next tick so that the child + // component gets to handle the event first (and start the debugger). + + + process.nextTick(this.props.dialogCloser); + } + } + }), atom.commands.add('atom-workspace', { + 'core:cancel': () => { + this._rememberTab(); + + this.props.dialogCloser(); + } + })); this.state = { selectedProviderTab: null, configIsValid: false, - enabledProviders: [], + enabledProviders: [] }; } - _rememberTab(): void { + _rememberTab() { // Remember the last tab the user used for this connection when the "launch/attach" // button is clicked. - const host = nuclideUri.isRemote(this.props.connection) - ? nuclideUri.getHostname(this.props.connection) - : 'local'; + const host = _nuclideUri().default.isRemote(this.props.connection) ? _nuclideUri().default.getHostname(this.props.connection) : 'local'; + if (this.state.selectedProviderTab != null) { - setLastUsedDebugger( - host, - this.props.dialogMode, - this.state.selectedProviderTab || '', - ); + setLastUsedDebugger(host, this.props.dialogMode, this.state.selectedProviderTab || ''); } } UNSAFE_componentWillMount() { - const host = nuclideUri.isRemote(this.props.connection) - ? nuclideUri.getHostname(this.props.connection) - : 'local'; + const host = _nuclideUri().default.isRemote(this.props.connection) ? _nuclideUri().default.getHostname(this.props.connection) : 'local'; + const selectedProvider = (this.props.providers.get(host) || []).find(p => getTabName(p) === this.props.initialSelectedTabName); - const selectedProvider = (this.props.providers.get(host) || []).find( - p => getTabName(p) === this.props.initialSelectedTabName, - ); if (selectedProvider != null) { - setLastUsedDebugger( - host, - this.props.dialogMode, - getTabName(selectedProvider), - ); + setLastUsedDebugger(host, this.props.dialogMode, getTabName(selectedProvider)); } + this._filterProviders(host); + this.setState({ - selectedProviderTab: getLastUsedDebugger(host, this.props.dialogMode), + selectedProviderTab: getLastUsedDebugger(host, this.props.dialogMode) }); } - UNSAFE_componentWillReceiveProps(nextProps: Props) { - const host = nuclideUri.isRemote(nextProps.connection) - ? nuclideUri.getHostname(nextProps.connection) - : 'local'; + UNSAFE_componentWillReceiveProps(nextProps) { + const host = _nuclideUri().default.isRemote(nextProps.connection) ? _nuclideUri().default.getHostname(nextProps.connection) : 'local'; this._filterProviders(host); + this.setState({ - selectedProviderTab: getLastUsedDebugger(host, nextProps.dialogMode), + selectedProviderTab: getLastUsedDebugger(host, nextProps.dialogMode) }); } @@ -173,188 +195,127 @@ export default class DebuggerLaunchAttachUI extends React.Component< this._disposables.dispose(); } - async _getProviderIfEnabled( - provider: DebuggerLaunchAttachProvider, - ): Promise { - const enabled = await provider - .getCallbacksForAction(this.props.dialogMode) - .isEnabled(); + async _getProviderIfEnabled(provider) { + const enabled = await provider.getCallbacksForAction(this.props.dialogMode).isEnabled(); return enabled ? provider : null; } - _filterProviders(key: string): void { + _filterProviders(key) { this.setState({ - enabledProviders: [], - }); + enabledProviders: [] + }); // eslint-disable-next-line nuclide-internal/unused-subscription - // eslint-disable-next-line nuclide-internal/unused-subscription - Observable.merge( - ...(this.props.providers.get(key) || []).map(provider => - Observable.fromPromise(this._getProviderIfEnabled(provider)), - ), - ) - .filter(provider => provider != null) - .map(provider => { - invariant(provider != null); - const tabName = getTabName(provider); - return { - provider, - tabName, - }; - }) - .scan((arr, provider) => arr.concat(provider), []) - .subscribe(enabledProviders => { - this.setState({enabledProviders}); - }); - } + _rxjsCompatUmdMin.Observable.merge(...(this.props.providers.get(key) || []).map(provider => _rxjsCompatUmdMin.Observable.fromPromise(this._getProviderIfEnabled(provider)))).filter(provider => provider != null).map(provider => { + if (!(provider != null)) { + throw new Error("Invariant violation: \"provider != null\""); + } - _setConfigValid = (valid: boolean): void => { - this.setState({ - configIsValid: valid, + const tabName = getTabName(provider); + return { + provider, + tabName + }; + }).scan((arr, provider) => arr.concat(provider), []).subscribe(enabledProviders => { + this.setState({ + enabledProviders + }); }); - }; + } - _getTabsFromEnabledProviders(enabledProviders: EnabledProvider[]): Tab[] { - const tabs = this.state.enabledProviders - .map(debuggerType => ({ - name: debuggerType.tabName, - tabContent: ( - - {debuggerType.tabName} - - ), - })) - .sort((a, b) => a.name.localeCompare(b.name)); + _getTabsFromEnabledProviders(enabledProviders) { + const tabs = this.state.enabledProviders.map(debuggerType => ({ + name: debuggerType.tabName, + tabContent: React.createElement("span", { + title: debuggerType.tabName, + className: "debugger-provider-tab" + }, debuggerType.tabName) + })).sort((a, b) => a.name.localeCompare(b.name)); return tabs; } - setState( - partialState: $Shape | ((State, Props) => $Shape | void), - callback?: () => mixed, - ): void { + setState(partialState, callback) { if (typeof partialState === 'function') { super.setState(partialState, callback); } else { - const fullState = { - ...this.state, - ...partialState, - }; + const fullState = Object.assign({}, this.state, partialState); + if (fullState.selectedProviderTab == null) { - const tabs = this._getTabsFromEnabledProviders( - fullState.enabledProviders, - ); + const tabs = this._getTabsFromEnabledProviders(fullState.enabledProviders); + if (tabs.length > 0) { const firstTab = tabs[0]; fullState.selectedProviderTab = firstTab.name; } } + super.setState(fullState, callback); } } - render(): React.Node { + render() { const tabs = this._getTabsFromEnabledProviders(this.state.enabledProviders); + let providerContent = null; + if (tabs.length > 0) { - let selectedTab = - this.state.selectedProviderTab != null - ? this.state.selectedProviderTab - : this.state.enabledProviders[0].tabName; - let provider = this.state.enabledProviders.find( - p => p.tabName === selectedTab, - ); + let selectedTab = this.state.selectedProviderTab != null ? this.state.selectedProviderTab : this.state.enabledProviders[0].tabName; + let provider = this.state.enabledProviders.find(p => p.tabName === selectedTab); + if (provider == null) { provider = this.state.enabledProviders[0]; selectedTab = provider.tabName; } - const defaultConfig = - selectedTab != null && selectedTab === this.props.initialSelectedTabName - ? this.props.initialProviderConfig - : null; - - const debuggerConfigPage = provider.provider - .getCallbacksForAction(this.props.dialogMode) - .getComponent( - selectedTab, - valid => this._setConfigValid(valid), - defaultConfig, - ); - - providerContent = ( -
- { - this._setConfigValid(false); - this.setState({selectedProviderTab: newTab.name}); - }} - /> -
- {debuggerConfigPage} -
-
- ); + const defaultConfig = selectedTab != null && selectedTab === this.props.initialSelectedTabName ? this.props.initialProviderConfig : null; + const debuggerConfigPage = provider.provider.getCallbacksForAction(this.props.dialogMode).getComponent(selectedTab, valid => this._setConfigValid(valid), defaultConfig); + providerContent = React.createElement("div", null, React.createElement(_Tabs().default, { + className: "debugger-launch-attach-tabs", + tabs: tabs, + growable: true, + activeTabName: this.state.selectedProviderTab, + triggeringEvent: "onClick", + onActiveTabChange: newTab => { + this._setConfigValid(false); + + this.setState({ + selectedProviderTab: newTab.name + }); + } + }), React.createElement("div", { + className: "debugger-launch-attach-tabcontent" + }, debuggerConfigPage)); } else { // No debugging providers available. - providerContent = ( -
- No debuggers installed, look for available debuggers on{' '} - - atom.io/packages - -
- ); + providerContent = React.createElement("div", { + className: "debugger-launch-attach-tabcontent" + }, "No debuggers installed, look for available debuggers on", ' ', React.createElement("a", { + href: "https://atom.io/packages/search?q=atom-ide-debugger-" + }, "atom.io/packages")); } - return ( -
- {isNuclideEnvironment() ? ( -

- - {this.props.dialogMode === 'attach' - ? 'Attach debugger to ' - : 'Launch debugger on '} - - this.props.connectionChanged(value)} - size="xs" - value={this.props.connection} - /> -

- ) : null} - {providerContent} -
- - - - -
-
- ); + return React.createElement("div", { + className: "padded debugger-launch-attach-container" + }, (0, _AtomServiceContainer().isNuclideEnvironment)() ? React.createElement("h1", { + className: "debugger-launch-attach-header" + }, React.createElement("span", { + className: "padded" + }, this.props.dialogMode === 'attach' ? 'Attach debugger to ' : 'Launch debugger on '), React.createElement(_Dropdown().Dropdown, { + className: "inline", + options: this.props.connectionOptions, + onChange: value => this.props.connectionChanged(value), + size: "xs", + value: this.props.connection + })) : null, providerContent, React.createElement("div", { + className: "debugger-launch-attach-actions" + }, React.createElement(_ButtonGroup().ButtonGroup, null, React.createElement(_Button().Button, { + onClick: () => atom.commands.dispatch(atom.views.getView(atom.workspace), 'core:cancel') + }, "Cancel"), React.createElement(_Button().Button, { + buttonType: _Button().ButtonTypes.PRIMARY, + disabled: !this.state.configIsValid, + onClick: () => atom.commands.dispatch(atom.views.getView(atom.workspace), 'core:confirm') + }, this.props.dialogMode === 'attach' ? 'Attach' : 'Launch')))); } + } + +exports.default = DebuggerLaunchAttachUI; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLayoutManager.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLayoutManager.js index b8b50eeb17..4cbd29256d 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLayoutManager.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerLayoutManager.js @@ -1,3 +1,126 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var React = _interopRequireWildcard(require("react")); + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _DebuggerPaneViewModel() { + const data = _interopRequireDefault(require("./DebuggerPaneViewModel")); + + _DebuggerPaneViewModel = function () { + return data; + }; + + return data; +} + +function _DebuggerPaneContainerViewModel() { + const data = _interopRequireDefault(require("./DebuggerPaneContainerViewModel")); + + _DebuggerPaneContainerViewModel = function () { + return data; + }; + + return data; +} + +function _constants() { + const data = require("../constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _createPaneContainer() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-atom/create-pane-container")); + + _createPaneContainer = function () { + return data; + }; + + return data; +} + +function _destroyItemWhere() { + const data = require("../../../../../nuclide-commons-atom/destroyItemWhere"); + + _destroyItemWhere = function () { + return data; + }; + + return data; +} + +function _DebuggerControlsView() { + const data = _interopRequireDefault(require("./DebuggerControlsView")); + + _DebuggerControlsView = function () { + return data; + }; + + return data; +} + +function _DebuggerProcessTreeView() { + const data = _interopRequireDefault(require("./DebuggerProcessTreeView")); + + _DebuggerProcessTreeView = function () { + return data; + }; + + return data; +} + +function _BreakpointsView() { + const data = _interopRequireDefault(require("./BreakpointsView")); + + _BreakpointsView = function () { + return data; + }; + + return data; +} + +function _ScopesView() { + const data = _interopRequireDefault(require("./ScopesView")); + + _ScopesView = function () { + return data; + }; + + return data; +} + +function _WatchView() { + const data = _interopRequireDefault(require("./WatchView")); + + _WatchView = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,286 +129,188 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ -/* global localStorage */ - -import type {DebuggerModeType, IDebugService, SerializedState} from '../types'; - -import * as React from 'react'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import DebuggerPaneViewModel from './DebuggerPaneViewModel'; -import DebuggerPaneContainerViewModel from './DebuggerPaneContainerViewModel'; -import {DebuggerMode, DEBUGGER_PANELS_DEFAULT_LOCATION} from '../constants'; -import invariant from 'assert'; -import createPaneContainer from 'nuclide-commons-atom/create-pane-container'; -import {destroyItemWhere} from 'nuclide-commons-atom/destroyItemWhere'; +/* global localStorage */ // Debugger views -import DebuggerControlsView from './DebuggerControlsView'; -import DebuggerProcessTreeView from './DebuggerProcessTreeView'; -import BreakpointsView from './BreakpointsView'; -import ScopesView from './ScopesView'; -import WatchView from './WatchView'; - const CONSOLE_VIEW_URI = 'atom://nuclide/console'; const DEBUGGER_URI_BASE = 'atom://nuclide/debugger-'; -export type DebuggerPaneLocation = { - dock: string, - layoutIndex: number, - userHidden: boolean, - userCustomized?: boolean, -}; - -// Configuration that defines a debugger pane. This controls what gets added -// to the workspace when starting debugging. -export type DebuggerPaneConfig = { - // Each pane must provide a unique URI. - uri: string, - - // Function that returns the title for the pane. Some panes (like Threads) need - // to change their title depending on the debug target (ex "Threads" for C++ but - // "Requests" for PHP). - title: () => string, - - // Optional function that indicates if the pane is enabled for the current debug - // session. If not enabled, the pane won't be added to the workspace. - isEnabled?: () => boolean, - - // Boolean indicating if the debug session lifetime should be tied to this view. - // If true, the debug session will be terminated if this view is destroyed. - isLifetimeView: boolean, - - // Function that returns a view for Atom to use for the workspace pane. - createView: () => React.Element, - - // Optional filter function that lets panes specify that they should be shown - // or hidden depending on the debugger mode (ex don't show threads when stopped). - debuggerModeFilter?: (mode: DebuggerModeType) => boolean, - - // Structure to remember the pane's previous location if the user moved it around. - previousLocation?: ?DebuggerPaneLocation, - - // Location to use for layout if no user previous location is set. - defaultLocation: string, - - // Previous default location, used to track if the saved location was not - // explicitly chosen by the user. - previousDefaultLocation?: string, - - // Optional callback to be invoked when the pane is being resized (flex scale changed). - onPaneResize?: (pane: atom$Pane, newFlexScale: number) => boolean, -}; - -export default class DebuggerLayoutManager { - _disposables: UniversalDisposable; - _service: IDebugService; - _debuggerPanes: Array; - _previousDebuggerMode: DebuggerModeType; - _paneHiddenWarningShown: boolean; - _leftPaneContainerModel: ?DebuggerPaneContainerViewModel; - _rightPaneContainerModel: ?DebuggerPaneContainerViewModel; - _debuggerVisible: boolean; - - constructor(service: IDebugService, state: ?SerializedState) { - this._disposables = new UniversalDisposable(); +class DebuggerLayoutManager { + constructor(service, state) { + this._disposables = new (_UniversalDisposable().default)(); this._service = service; - this._previousDebuggerMode = DebuggerMode.STOPPED; + this._previousDebuggerMode = _constants().DebuggerMode.STOPPED; this._paneHiddenWarningShown = false; this._leftPaneContainerModel = null; this._rightPaneContainerModel = null; this._debuggerVisible = false; + this._initializeDebuggerPanes(); + this._reshowDebuggerPanes(state); this._disposables.add(() => { if (this._leftPaneContainerModel != null) { this._leftPaneContainerModel.dispose(); } + if (this._rightPaneContainerModel != null) { this._rightPaneContainerModel.dispose(); } }); } - dispose(): void { + dispose() { this._disposables.dispose(); } - registerContextMenus(): void { + registerContextMenus() { // Add context menus to let the user restore hidden panes. this._debuggerPanes.forEach(pane => { const command = `debugger:show-window-${pane.title().replace(/ /g, '-')}`; - this._disposables.add( - atom.commands.add('atom-workspace', { - [String(command)]: () => this.showHiddenDebuggerPane(pane.uri), - }), - ); - - this._disposables.add( - atom.contextMenu.add({ - '.debugger-container': [ - { - label: 'Debugger Views', - submenu: [ - { - label: `Show ${pane.title()} window`, - command, - shouldDisplay: event => { - const debuggerPane = this._debuggerPanes.find( - p => p.uri === pane.uri, - ); - if ( - debuggerPane != null && - (debuggerPane.isEnabled == null || - debuggerPane.isEnabled()) - ) { - return ( - debuggerPane.previousLocation != null && - debuggerPane.previousLocation.userHidden - ); - } - return false; - }, - }, - ], - }, - ], - }), - ); + + this._disposables.add(atom.commands.add('atom-workspace', { + [String(command)]: () => this.showHiddenDebuggerPane(pane.uri) + })); + + this._disposables.add(atom.contextMenu.add({ + '.debugger-container': [{ + label: 'Debugger Views', + submenu: [{ + label: `Show ${pane.title()} window`, + command, + shouldDisplay: event => { + const debuggerPane = this._debuggerPanes.find(p => p.uri === pane.uri); + + if (debuggerPane != null && (debuggerPane.isEnabled == null || debuggerPane.isEnabled())) { + return debuggerPane.previousLocation != null && debuggerPane.previousLocation.userHidden; + } + + return false; + } + }] + }] + })); }); } - _overridePaneInitialHeight( - dockPane: atom$Pane, - newFlexScale: number, - desiredHeight: number, - ): void { - invariant(dockPane.element != null); + _overridePaneInitialHeight(dockPane, newFlexScale, desiredHeight) { + if (!(dockPane.element != null)) { + throw new Error("Invariant violation: \"dockPane.element != null\""); + } if (newFlexScale === 1) { // newFlexScale === 1 when the pane is added the first time. // $FlowFixMe - dockPane.element.style['flex-grow'] = '0'; - // $FlowFixMe - dockPane.element.style['flex-basis'] = 'auto'; - // $FlowFixMe - dockPane.element.style['overflow-y'] = 'scroll'; - // $FlowFixMe + dockPane.element.style['flex-grow'] = '0'; // $FlowFixMe + + dockPane.element.style['flex-basis'] = 'auto'; // $FlowFixMe + + dockPane.element.style['overflow-y'] = 'scroll'; // $FlowFixMe + dockPane.element.style['min-height'] = String(desiredHeight) + 'px'; } else { // Otherwise, the user must have resized the pane. Remove the override styles // and let it behave normally, the user is in control of the layout now. // $FlowFixMe - dockPane.element.style['min-height'] = '0px'; - // $FlowFixMe + dockPane.element.style['min-height'] = '0px'; // $FlowFixMe + dockPane.element.style['flex-basis'] = ''; } } - _initializeDebuggerPanes(): void { + _initializeDebuggerPanes() { // This configures the debugger panes. By default, they'll appear below the stepping // controls from top to bottom in the order they're defined here. After that, the // user is free to move them around. - this._debuggerPanes = [ - { - uri: DEBUGGER_URI_BASE + 'controls', - isLifetimeView: true, - title: () => 'Debugger', - defaultLocation: DEBUGGER_PANELS_DEFAULT_LOCATION, - isEnabled: () => true, - createView: () => , - onPaneResize: (dockPane, newFlexScale) => { - this._overridePaneInitialHeight(dockPane, newFlexScale, 135); - - // If newFlexScale !== 1, that means the user must have resized this pane. - // Return true to unhook this callback and let the pane resize per Atom's - // default behavior. The user is now responsible for the pane's height. - return newFlexScale !== 1; - }, - }, - { - uri: DEBUGGER_URI_BASE + 'debuggertree', - isLifetimeView: false, - defaultLocation: DEBUGGER_PANELS_DEFAULT_LOCATION, - title: () => 'Processes', - isEnabled: () => true, - createView: () => , - debuggerModeFilter: (mode: DebuggerModeType) => - mode !== DebuggerMode.STOPPED, - }, - { - uri: DEBUGGER_URI_BASE + 'breakpoints', - isLifetimeView: false, - defaultLocation: DEBUGGER_PANELS_DEFAULT_LOCATION, - title: () => 'Breakpoints', - isEnabled: () => true, - createView: () => , - }, - { - uri: DEBUGGER_URI_BASE + 'scopes', - isLifetimeView: false, - defaultLocation: DEBUGGER_PANELS_DEFAULT_LOCATION, - title: () => 'Scopes', - isEnabled: () => true, - createView: () => , - debuggerModeFilter: (mode: DebuggerModeType) => - mode !== DebuggerMode.STOPPED, - }, - { - uri: DEBUGGER_URI_BASE + 'watch-expressions', - isLifetimeView: false, - defaultLocation: 'bottom', - previousDefaultLocation: DEBUGGER_PANELS_DEFAULT_LOCATION, - title: () => 'Watch Expressions', - isEnabled: () => true, - createView: () => , - }, - ]; - + this._debuggerPanes = [{ + uri: DEBUGGER_URI_BASE + 'controls', + isLifetimeView: true, + title: () => 'Debugger', + defaultLocation: _constants().DEBUGGER_PANELS_DEFAULT_LOCATION, + isEnabled: () => true, + createView: () => React.createElement(_DebuggerControlsView().default, { + service: this._service + }), + onPaneResize: (dockPane, newFlexScale) => { + this._overridePaneInitialHeight(dockPane, newFlexScale, 135); // If newFlexScale !== 1, that means the user must have resized this pane. + // Return true to unhook this callback and let the pane resize per Atom's + // default behavior. The user is now responsible for the pane's height. + + + return newFlexScale !== 1; + } + }, { + uri: DEBUGGER_URI_BASE + 'debuggertree', + isLifetimeView: false, + defaultLocation: _constants().DEBUGGER_PANELS_DEFAULT_LOCATION, + title: () => 'Processes', + isEnabled: () => true, + createView: () => React.createElement(_DebuggerProcessTreeView().default, { + service: this._service + }), + debuggerModeFilter: mode => mode !== _constants().DebuggerMode.STOPPED + }, { + uri: DEBUGGER_URI_BASE + 'breakpoints', + isLifetimeView: false, + defaultLocation: _constants().DEBUGGER_PANELS_DEFAULT_LOCATION, + title: () => 'Breakpoints', + isEnabled: () => true, + createView: () => React.createElement(_BreakpointsView().default, { + service: this._service + }) + }, { + uri: DEBUGGER_URI_BASE + 'scopes', + isLifetimeView: false, + defaultLocation: _constants().DEBUGGER_PANELS_DEFAULT_LOCATION, + title: () => 'Scopes', + isEnabled: () => true, + createView: () => React.createElement(_ScopesView().default, { + service: this._service + }), + debuggerModeFilter: mode => mode !== _constants().DebuggerMode.STOPPED + }, { + uri: DEBUGGER_URI_BASE + 'watch-expressions', + isLifetimeView: false, + defaultLocation: 'bottom', + previousDefaultLocation: _constants().DEBUGGER_PANELS_DEFAULT_LOCATION, + title: () => 'Watch Expressions', + isEnabled: () => true, + createView: () => React.createElement(_WatchView().default, { + service: this._service + }) + }]; this.registerContextMenus(); + this._restoreDebuggerPaneLocations(); } - _reshowDebuggerPanes(state: ?SerializedState): void { + _reshowDebuggerPanes(state) { if (state && state.showDebugger) { this.showDebuggerViews(); + this._getWorkspaceDocks().forEach((dock, index) => { - if ( - dock.dock.isVisible != null && - state.workspaceDocksVisibility != null && - !state.workspaceDocksVisibility[index] && - dock.dock.isVisible() && - dock.dock.hide != null - ) { + if (dock.dock.isVisible != null && state.workspaceDocksVisibility != null && !state.workspaceDocksVisibility[index] && dock.dock.isVisible() && dock.dock.hide != null) { dock.dock.hide(); } - }); - - // Hiding the docks might have changed the visibility of the debugger + }); // Hiding the docks might have changed the visibility of the debugger // if the only docks containing debugger panes are now hidden. + + this._updateDebuggerVisibility(); } } - _updateDebuggerVisibility(): void { - this._debuggerVisible = false; + _updateDebuggerVisibility() { + this._debuggerVisible = false; // See if any visible docks contain a pane that contains a debugger pane. - // See if any visible docks contain a pane that contains a debugger pane. this._getWorkspaceDocks().forEach(dock => { if (dock.dock.isVisible != null && dock.dock.isVisible()) { dock.dock.getPanes().forEach(pane => { - if ( - pane - .getItems() - .find( - item => - item instanceof DebuggerPaneViewModel || - item instanceof DebuggerPaneContainerViewModel, - ) != null - ) { + if (pane.getItems().find(item => item instanceof _DebuggerPaneViewModel().default || item instanceof _DebuggerPaneContainerViewModel().default) != null) { this._debuggerVisible = true; } }); @@ -293,8 +318,9 @@ export default class DebuggerLayoutManager { }); } - showHiddenDebuggerPane(uri: string): void { + showHiddenDebuggerPane(uri) { const pane = this._debuggerPanes.find(p => p.uri === uri); + if (pane != null && pane.previousLocation != null) { pane.previousLocation.userHidden = false; } @@ -302,94 +328,98 @@ export default class DebuggerLayoutManager { this.showDebuggerViews(); } - getModelForDebuggerUri(uri: string): any { + getModelForDebuggerUri(uri) { const config = this._debuggerPanes.find(pane => pane.uri === uri); + if (config != null) { - return new DebuggerPaneViewModel(config, config.isLifetimeView, pane => - this._paneDestroyed(pane), - ); + return new (_DebuggerPaneViewModel().default)(config, config.isLifetimeView, pane => this._paneDestroyed(pane)); } return null; } - _getWorkspaceDocks(): Array<{ - name: string, - dock: atom$AbstractPaneContainer, - orientation: string, - }> { + _getWorkspaceDocks() { const docks = new Array(4); - invariant(atom.workspace.getLeftDock != null); + if (!(atom.workspace.getLeftDock != null)) { + throw new Error("Invariant violation: \"atom.workspace.getLeftDock != null\""); + } + docks[0] = { name: 'left', dock: atom.workspace.getLeftDock(), - orientation: 'vertical', + orientation: 'vertical' }; - invariant(atom.workspace.getBottomDock != null); + if (!(atom.workspace.getBottomDock != null)) { + throw new Error("Invariant violation: \"atom.workspace.getBottomDock != null\""); + } + docks[1] = { name: 'bottom', dock: atom.workspace.getBottomDock(), - orientation: 'horizontal', + orientation: 'horizontal' }; - invariant(atom.workspace.getCenter != null); + if (!(atom.workspace.getCenter != null)) { + throw new Error("Invariant violation: \"atom.workspace.getCenter != null\""); + } + docks[2] = { name: 'center', dock: atom.workspace.getCenter(), - orientation: 'horizontal', + orientation: 'horizontal' }; - invariant(atom.workspace.getRightDock != null); + if (!(atom.workspace.getRightDock != null)) { + throw new Error("Invariant violation: \"atom.workspace.getRightDock != null\""); + } + docks[3] = { name: 'right', dock: atom.workspace.getRightDock(), - orientation: 'vertical', + orientation: 'vertical' }; - return docks; } - _isDockEmpty(dock: atom$AbstractPaneContainer): boolean { - const panes = dock.getPanes(); - - // A dock is empty for our purposes if it has nothing visible in it. If a dock + _isDockEmpty(dock) { + const panes = dock.getPanes(); // A dock is empty for our purposes if it has nothing visible in it. If a dock // with no items is left open, Atom implicitly adds a single pane with no items // in it, so check for no panes, or a single pane with no items. - return ( - panes.length === 0 || - (panes.length === 1 && panes[0].getItems().length === 0) - ); + + return panes.length === 0 || panes.length === 1 && panes[0].getItems().length === 0; } - _appendItemToDock( - paneConfig: ?DebuggerPaneConfig, - dock: atom$AbstractPaneContainer, - item: Object, - debuggerItemsPerDock: Map, - ): void { + _appendItemToDock(paneConfig, dock, item, debuggerItemsPerDock) { const panes = dock.getPanes(); - invariant(panes.length >= 1); + + if (!(panes.length >= 1)) { + throw new Error("Invariant violation: \"panes.length >= 1\""); + } const dockPane = panes[panes.length - 1]; + if (this._isDockEmpty(dock)) { dockPane.addItem(item); } else { let dockConfig = this._getWorkspaceDocks().find(d => d.dock === dock); + if (dockConfig == null) { // This item is being added to a nested PaneContainer rather than // directly to a dock. This is only done for vertical layouts. - dockConfig = {orientation: 'vertical'}; + dockConfig = { + orientation: 'vertical' + }; } if (dockConfig.orientation === 'horizontal') { // Add the item as a new tab in the existing pane to the right of the current active pane for the dock. dockPane.addItem(item); + try { dockPane.activateItem(item); - } catch (e) { - // During testing, I saw some cases where Atom threw trying to activate an item + } catch (e) {// During testing, I saw some cases where Atom threw trying to activate an item // that was still in progress of being added. This was tested on a Beta release // and may indicate a temporary bug. However, there is no reason to throw here // and stop laying out the debugger if an item could not be set as active. @@ -403,16 +433,16 @@ export default class DebuggerLayoutManager { dockPane.activateItem(item); } else { dockPane.splitDown({ - items: [item], + items: [item] }); } } - } - - // Keep track of which dock(s) we've appended debugger panes into. This + } // Keep track of which dock(s) we've appended debugger panes into. This // allows us to quickly check if the dock needs to be split to separate // debugger panes and pre-existing panes that have nothing to do with // the debugger. + + if (debuggerItemsPerDock.get(dock) == null) { debuggerItemsPerDock.set(dock, 1); } else { @@ -422,62 +452,66 @@ export default class DebuggerLayoutManager { if (dock.isVisible != null && dock.show != null && !dock.isVisible()) { dock.show(); - } + } // If the debugger pane config has a custom layout callback, hook it up now. + - // If the debugger pane config has a custom layout callback, hook it up now. if (paneConfig != null && paneConfig.onPaneResize != null) { - const disposables = new UniversalDisposable(); + const disposables = new (_UniversalDisposable().default)(); disposables.add(dockPane.onWillDestroy(() => disposables.dispose())); - disposables.add( - dockPane.onDidChangeFlexScale(newFlexScale => { - invariant(paneConfig.onPaneResize != null); - if (paneConfig.onPaneResize(dockPane, newFlexScale)) { - // The callback has requested to be unregistered. - disposables.dispose(); - } - }), - ); + disposables.add(dockPane.onDidChangeFlexScale(newFlexScale => { + if (!(paneConfig.onPaneResize != null)) { + throw new Error("Invariant violation: \"paneConfig.onPaneResize != null\""); + } + + if (paneConfig.onPaneResize(dockPane, newFlexScale)) { + // The callback has requested to be unregistered. + disposables.dispose(); + } + })); } } - resetLayout(): void { + resetLayout() { // Remove all debugger panes from the UI. - this.hideDebuggerViews(false); + this.hideDebuggerViews(false); // Forget all their previous locations. - // Forget all their previous locations. for (const debuggerPane of this._debuggerPanes) { debuggerPane.previousLocation = null; + const key = this._getPaneStorageKey(debuggerPane.uri); + localStorage.setItem(key, ''); - } + } // Forget all previous dock sizes; + - // Forget all previous dock sizes; for (const dockInfo of this._getWorkspaceDocks()) { - const {name} = dockInfo; + const { + name + } = dockInfo; + const key = this._getPaneStorageKey('dock-size' + name); + localStorage.removeItem(key); - } + } // Pop the debugger open with the default layout. + - // Pop the debugger open with the default layout. this._debuggerPanes = []; this._paneHiddenWarningShown = false; + this._initializeDebuggerPanes(); + this.showDebuggerViews(); } - _getPaneStorageKey(uri: string): string { + _getPaneStorageKey(uri) { return 'debugger-pane-location-' + uri; } - _deserializeSavedLocation(savedItem: string): ?DebuggerPaneLocation { + _deserializeSavedLocation(savedItem) { try { const obj = JSON.parse(savedItem); - if ( - obj != null && - obj.dock != null && - obj.layoutIndex != null && - obj.userHidden != null - ) { + + if (obj != null && obj.dock != null && obj.layoutIndex != null && obj.userHidden != null) { return obj; } } catch (e) {} @@ -485,43 +519,44 @@ export default class DebuggerLayoutManager { return null; } - _restoreDebuggerPaneLocations(): void { + _restoreDebuggerPaneLocations() { // See if there are saved previous locations for the debugger panes. for (const debuggerPane of this._debuggerPanes) { - const savedItem = localStorage.getItem( - this._getPaneStorageKey(debuggerPane.uri), - ); + const savedItem = localStorage.getItem(this._getPaneStorageKey(debuggerPane.uri)); + if (savedItem != null) { - debuggerPane.previousLocation = this._deserializeSavedLocation( - savedItem, - ); + debuggerPane.previousLocation = this._deserializeSavedLocation(savedItem); } } } - _saveDebuggerPaneLocations(): void { + _saveDebuggerPaneLocations() { for (const dockInfo of this._getWorkspaceDocks()) { - const {name, dock} = dockInfo; + const { + name, + dock + } = dockInfo; const panes = dock.getPanes(); let layoutIndex = 0; let dockContainsDebuggerItem = false; + for (const pane of panes) { for (const item of pane.getItems()) { const paneItems = []; - if (item instanceof DebuggerPaneContainerViewModel) { + + if (item instanceof _DebuggerPaneContainerViewModel().default) { paneItems.push(...item.getAllItems()); } else { paneItems.push(item); } for (const itemToSave of paneItems) { - if (itemToSave instanceof DebuggerPaneViewModel) { + if (itemToSave instanceof _DebuggerPaneViewModel().default) { const location = { dock: name, layoutIndex, - userHidden: false, + userHidden: false }; - dockContainsDebuggerItem = true; itemToSave.getConfig().previousLocation = location; layoutIndex++; @@ -531,6 +566,7 @@ export default class DebuggerLayoutManager { } const key = this._getPaneStorageKey('dock-size' + name); + if (dockContainsDebuggerItem && dock.state != null) { // Save the size of a dock only if it contains a debugger item. const sizeInfo = JSON.stringify(dock.state.size); @@ -538,67 +574,56 @@ export default class DebuggerLayoutManager { } else { localStorage.removeItem(key); } - } + } // Serialize to storage. - // Serialize to storage. - for (const debuggerPane of this._debuggerPanes) { - const key = this._getPaneStorageKey(debuggerPane.uri); - // If the location is the pane's default location, no need to store + for (const debuggerPane of this._debuggerPanes) { + const key = this._getPaneStorageKey(debuggerPane.uri); // If the location is the pane's default location, no need to store // it explicitly. This is also helpful if the default changes in the // future. - if ( - debuggerPane.previousLocation != null && - !debuggerPane.previousLocation.userHidden && - (debuggerPane.previousLocation.dock === debuggerPane.defaultLocation || - (debuggerPane.previousLocation.dock === - debuggerPane.previousDefaultLocation && - !debuggerPane.previousLocation.userCustomized)) - ) { + + + if (debuggerPane.previousLocation != null && !debuggerPane.previousLocation.userHidden && (debuggerPane.previousLocation.dock === debuggerPane.defaultLocation || debuggerPane.previousLocation.dock === debuggerPane.previousDefaultLocation && !debuggerPane.previousLocation.userCustomized)) { localStorage.removeItem(key); } else { if (debuggerPane.previousLocation != null) { debuggerPane.previousLocation.userCustomized = true; } + const loc = JSON.stringify(debuggerPane.previousLocation); localStorage.setItem(key, loc); } } } - _shouldDestroyPaneItem(mode: DebuggerModeType, item: atom$PaneItem): boolean { - if (item instanceof DebuggerPaneViewModel) { + _shouldDestroyPaneItem(mode, item) { + if (item instanceof _DebuggerPaneViewModel().default) { const config = item.getConfig(); - if ( - config.debuggerModeFilter != null && - !config.debuggerModeFilter(mode) - ) { + + if (config.debuggerModeFilter != null && !config.debuggerModeFilter(mode)) { item.setRemovedFromLayout(true); return true; } } + return false; } - debuggerModeChanged(): void { - const mode = this._getFocusedProcessMode(); - - // Most panes disappear when the debugger is stopped, only keep + debuggerModeChanged() { + const mode = this._getFocusedProcessMode(); // Most panes disappear when the debugger is stopped, only keep // the ones that should still be shown. - if ( - mode === DebuggerMode.STOPPING && - this._previousDebuggerMode !== DebuggerMode.STOPPED - ) { + + + if (mode === _constants().DebuggerMode.STOPPING && this._previousDebuggerMode !== _constants().DebuggerMode.STOPPED) { this._saveDebuggerPaneLocations(); - } else if (mode === DebuggerMode.STOPPED) { - destroyItemWhere(item => { - if (item instanceof DebuggerPaneContainerViewModel) { + } else if (mode === _constants().DebuggerMode.STOPPED) { + (0, _destroyItemWhere().destroyItemWhere)(item => { + if (item instanceof _DebuggerPaneContainerViewModel().default) { // Forward the destruction logic to the contianer. - item.destroyWhere(innerItem => - this._shouldDestroyPaneItem(mode, innerItem), - ); + item.destroyWhere(innerItem => this._shouldDestroyPaneItem(mode, innerItem)); this._destroyContainerIfEmpty(item); + return false; } @@ -609,44 +634,33 @@ export default class DebuggerLayoutManager { this._previousDebuggerMode = mode; } - _countPanesForTargetDock(dockName: string, defaultDockName: string): number { + _countPanesForTargetDock(dockName, defaultDockName) { const mode = this._getFocusedProcessMode(); - return this._debuggerPanes - .filter( - // Filter out any panes that the user has hidden or that aren't visible - // in the current debug mode. - debuggerPane => - (debuggerPane.previousLocation == null || - !debuggerPane.previousLocation.userHidden) && - (debuggerPane.debuggerModeFilter == null || - debuggerPane.debuggerModeFilter(mode)), - ) - .map(debuggerPane => { - // Map each debugger pane to the name of the dock it will belong to. - if (debuggerPane.previousLocation != null) { - const previousDock = this._getWorkspaceDocks().find( - d => - debuggerPane.previousLocation != null && - d.name === debuggerPane.previousLocation.dock, - ); - if (previousDock != null) { - return previousDock.name; - } + + return this._debuggerPanes.filter( // Filter out any panes that the user has hidden or that aren't visible + // in the current debug mode. + debuggerPane => (debuggerPane.previousLocation == null || !debuggerPane.previousLocation.userHidden) && (debuggerPane.debuggerModeFilter == null || debuggerPane.debuggerModeFilter(mode))).map(debuggerPane => { + // Map each debugger pane to the name of the dock it will belong to. + if (debuggerPane.previousLocation != null) { + const previousDock = this._getWorkspaceDocks().find(d => debuggerPane.previousLocation != null && d.name === debuggerPane.previousLocation.dock); + + if (previousDock != null) { + return previousDock.name; } - return defaultDockName; - }) - .filter(targetDockName => targetDockName === dockName).length; + } + + return defaultDockName; + }).filter(targetDockName => targetDockName === dockName).length; } - _getSavedDebuggerPaneSize(dock: { - name: string, - dock: atom$AbstractPaneContainer, - orientation: string, - }): ?number { + _getSavedDebuggerPaneSize(dock) { const key = this._getPaneStorageKey('dock-size' + dock.name); + const savedItem = localStorage.getItem(key); + if (savedItem != null) { const sizeInfo = JSON.parse(savedItem); + if (!Number.isNaN(sizeInfo)) { return sizeInfo; } @@ -655,149 +669,125 @@ export default class DebuggerLayoutManager { return null; } - showDebuggerViews(): void { + showDebuggerViews() { // Hide any debugger panes other than the controls so we have a known // starting point for preparing the layout. this.hideDebuggerViews(true); - const addedItemsByDock = new Map(); - const defaultDock = this._getWorkspaceDocks().find( - d => d.name === DEBUGGER_PANELS_DEFAULT_LOCATION, - ); - invariant(defaultDock != null); + + const defaultDock = this._getWorkspaceDocks().find(d => d.name === _constants().DEBUGGER_PANELS_DEFAULT_LOCATION); + + if (!(defaultDock != null)) { + throw new Error("Invariant violation: \"defaultDock != null\""); + } const leftDock = this._getWorkspaceDocks().find(d => d.name === 'left'); - invariant(leftDock != null); + + if (!(leftDock != null)) { + throw new Error("Invariant violation: \"leftDock != null\""); + } let leftPaneContainer = null; + if (this._countPanesForTargetDock(leftDock.name, defaultDock.name) > 0) { - leftPaneContainer = createPaneContainer(); + leftPaneContainer = (0, _createPaneContainer().default)(); + const size = this._getSavedDebuggerPaneSize(leftDock); - this._leftPaneContainerModel = this._addPaneContainerToWorkspace( - leftPaneContainer, - leftDock.dock, - addedItemsByDock, - size, - ); + + this._leftPaneContainerModel = this._addPaneContainerToWorkspace(leftPaneContainer, leftDock.dock, addedItemsByDock, size); } const rightDock = this._getWorkspaceDocks().find(d => d.name === 'right'); - invariant(rightDock != null); + + if (!(rightDock != null)) { + throw new Error("Invariant violation: \"rightDock != null\""); + } let rightPaneContainer = null; + if (this._countPanesForTargetDock(rightDock.name, defaultDock.name) > 0) { - rightPaneContainer = createPaneContainer(); + rightPaneContainer = (0, _createPaneContainer().default)(); + const size = this._getSavedDebuggerPaneSize(rightDock); - this._rightPaneContainerModel = this._addPaneContainerToWorkspace( - rightPaneContainer, - rightDock.dock, - addedItemsByDock, - size, - ); - } - // Lay out the remaining debugger panes according to their configurations. + this._rightPaneContainerModel = this._addPaneContainerToWorkspace(rightPaneContainer, rightDock.dock, addedItemsByDock, size); + } // Lay out the remaining debugger panes according to their configurations. // Sort the debugger panes by the index at which they appeared the last // time they were positioned, so we maintain the relative ordering of // debugger panes within the same dock. + + const mode = this._getFocusedProcessMode(); - this._debuggerPanes - .slice() - .sort((a, b) => { - const aPos = - a.previousLocation == null ? 0 : a.previousLocation.layoutIndex; - const bPos = - b.previousLocation == null ? 0 : b.previousLocation.layoutIndex; - return aPos - bPos; - }) - .filter( - debuggerPane => - (debuggerPane.isEnabled == null || debuggerPane.isEnabled()) && - (debuggerPane.previousLocation == null || - !debuggerPane.previousLocation.userHidden), - ) - .forEach(debuggerPane => { - let targetDock = defaultDock; - - // If this pane had a previous location, restore to the previous dock. - const loc = - debuggerPane.previousLocation != null - ? debuggerPane.previousLocation.dock - : debuggerPane.defaultLocation; - const previousDock = this._getWorkspaceDocks().find( - d => d.name === loc, - ); - if (previousDock != null) { - targetDock = previousDock; - } - // Render to a nested pane container for the two vertical docks - // rather than adding the item directly to the dock itself. - let targetContainer = targetDock.dock; - if (targetDock.name === 'left') { - targetContainer = leftPaneContainer; - } else if (targetDock.name === 'right') { - targetContainer = rightPaneContainer; - } + this._debuggerPanes.slice().sort((a, b) => { + const aPos = a.previousLocation == null ? 0 : a.previousLocation.layoutIndex; + const bPos = b.previousLocation == null ? 0 : b.previousLocation.layoutIndex; + return aPos - bPos; + }).filter(debuggerPane => (debuggerPane.isEnabled == null || debuggerPane.isEnabled()) && (debuggerPane.previousLocation == null || !debuggerPane.previousLocation.userHidden)).forEach(debuggerPane => { + let targetDock = defaultDock; // If this pane had a previous location, restore to the previous dock. + + const loc = debuggerPane.previousLocation != null ? debuggerPane.previousLocation.dock : debuggerPane.defaultLocation; + + const previousDock = this._getWorkspaceDocks().find(d => d.name === loc); + + if (previousDock != null) { + targetDock = previousDock; + } // Render to a nested pane container for the two vertical docks + // rather than adding the item directly to the dock itself. + + + let targetContainer = targetDock.dock; + + if (targetDock.name === 'left') { + targetContainer = leftPaneContainer; + } else if (targetDock.name === 'right') { + targetContainer = rightPaneContainer; + } - if ( - debuggerPane.debuggerModeFilter == null || - debuggerPane.debuggerModeFilter(mode) - ) { - invariant(targetContainer != null); - const size = this._getSavedDebuggerPaneSize(targetDock); - this._appendItemToDock( - debuggerPane, - targetContainer, - new DebuggerPaneViewModel( - debuggerPane, - debuggerPane.isLifetimeView, - pane => this._paneDestroyed(pane), - size, - ), - addedItemsByDock, - ); + if (debuggerPane.debuggerModeFilter == null || debuggerPane.debuggerModeFilter(mode)) { + if (!(targetContainer != null)) { + throw new Error("Invariant violation: \"targetContainer != null\""); } - }); - this._debuggerVisible = true; + const size = this._getSavedDebuggerPaneSize(targetDock); + + this._appendItemToDock(debuggerPane, targetContainer, new (_DebuggerPaneViewModel().default)(debuggerPane, debuggerPane.isLifetimeView, pane => this._paneDestroyed(pane), size), addedItemsByDock); + } + }); - // Re-focus the console pane after layout so that it remains visible + this._debuggerVisible = true; // Re-focus the console pane after layout so that it remains visible // even if we added debugger panes to the console's dock. // eslint-disable-next-line nuclide-internal/atom-apis - atom.workspace.open(CONSOLE_VIEW_URI, {searchAllPanes: true}); + + atom.workspace.open(CONSOLE_VIEW_URI, { + searchAllPanes: true + }); } - _addPaneContainerToWorkspace( - container: atom$PaneContainer, - dock: atom$AbstractPaneContainer, - addedItemsByDock: Map, - dockSize: ?number, - ): DebuggerPaneContainerViewModel { - const containerModel = new DebuggerPaneContainerViewModel( - container, - dockSize, - ); + _addPaneContainerToWorkspace(container, dock, addedItemsByDock, dockSize) { + const containerModel = new (_DebuggerPaneContainerViewModel().default)(container, dockSize); + this._appendItemToDock(null, dock, containerModel, addedItemsByDock); return containerModel; } - _getFocusedProcessMode(): DebuggerModeType { - const {viewModel} = this._service; - return viewModel.focusedProcess == null - ? DebuggerMode.STOPPED - : viewModel.focusedProcess.debuggerMode; + _getFocusedProcessMode() { + const { + viewModel + } = this._service; + return viewModel.focusedProcess == null ? _constants().DebuggerMode.STOPPED : viewModel.focusedProcess.debuggerMode; } - _paneDestroyed(pane: DebuggerPaneConfig): void { + _paneDestroyed(pane) { if (pane.isLifetimeView) { // Lifetime views are not hidden and remembered like the unimportant views. // This view being destroyed means the debugger is exiting completely, and // this view is never remembered as "hidden by the user" because it's reqiured // for running the debugger. const mode = this._getFocusedProcessMode(); - if (mode === DebuggerMode.RUNNING || mode === DebuggerMode.PAUSED) { + + if (mode === _constants().DebuggerMode.RUNNING || mode === _constants().DebuggerMode.PAUSED) { this._saveDebuggerPaneLocations(); } @@ -806,51 +796,54 @@ export default class DebuggerLayoutManager { for (const process of this._service.getModel().getProcesses()) { this._service.stopProcess(process); } - return; - } - // Views can be selectively hidden by the user while the debugger is + return; + } // Views can be selectively hidden by the user while the debugger is // running and that preference should be remembered. + + const config = this._debuggerPanes.find(p => p.uri === pane.uri); - invariant(config != null); + + if (!(config != null)) { + throw new Error("Invariant violation: \"config != null\""); + } if (config.previousLocation == null) { config.previousLocation = { dock: '', layoutIndex: 0, - userHidden: false, + userHidden: false }; } if (config.isEnabled == null || config.isEnabled()) { const mode = this._getFocusedProcessMode(); - if ( - config.debuggerModeFilter == null || - config.debuggerModeFilter(mode) - ) { - invariant(config.previousLocation != null); - config.previousLocation.userHidden = true; - - // Show a notification telling the user how to get the pane back + + if (config.debuggerModeFilter == null || config.debuggerModeFilter(mode)) { + if (!(config.previousLocation != null)) { + throw new Error("Invariant violation: \"config.previousLocation != null\""); + } + + config.previousLocation.userHidden = true; // Show a notification telling the user how to get the pane back // only once per session. + if (!this._paneHiddenWarningShown) { this._paneHiddenWarningShown = true; - - atom.notifications.addInfo( - `${config.title()} has been hidden. Right click any Debugger pane to bring it back.`, - ); + atom.notifications.addInfo(`${config.title()} has been hidden. Right click any Debugger pane to bring it back.`); } } - } + } // If hiding this view left an empty debugger pane container, destroy the container. + - // If hiding this view left an empty debugger pane container, destroy the container. this._destroyContainerIfEmpty(this._leftPaneContainerModel); + this._destroyContainerIfEmpty(this._rightPaneContainerModel); } - _destroyContainerIfEmpty(container: ?DebuggerPaneContainerViewModel): void { + _destroyContainerIfEmpty(container) { if (container != null && container.getAllItems().length === 0) { const parent = container.getParentPane(); + if (parent != null) { parent.removeItem(container); container.destroy(); @@ -858,69 +851,76 @@ export default class DebuggerLayoutManager { } } - hideDebuggerViews(performingLayout: boolean): void { + hideDebuggerViews(performingLayout) { // Docks do not toggle closed automatically when we remove all their items. // They can contain things other than the debugger items though, and could // have been left open and empty by the user. Toggle closed any docks that // end up empty only as a result of closing the debugger. const docks = this._getWorkspaceDocks(); - const previouslyEmpty = docks.map(dock => this._isDockEmpty(dock.dock)); - // Find and destroy all debugger items, and the panes that contained them. + const previouslyEmpty = docks.map(dock => this._isDockEmpty(dock.dock)); // Find and destroy all debugger items, and the panes that contained them. + atom.workspace.getPanes().forEach(pane => { pane.getItems().forEach(item => { - if ( - item instanceof DebuggerPaneViewModel || - item instanceof DebuggerPaneContainerViewModel - ) { + if (item instanceof _DebuggerPaneViewModel().default || item instanceof _DebuggerPaneContainerViewModel().default) { // Remove the view model. item.setRemovedFromLayout(true); - pane.destroyItem(item); + pane.destroyItem(item); // If removing the model left an empty pane, remove the pane. - // If removing the model left an empty pane, remove the pane. if (pane.getItems().length === 0) { pane.destroy(); } } }); - }); + }); // If any docks became empty as a result of closing those panes, hide the dock. - // If any docks became empty as a result of closing those panes, hide the dock. if (!performingLayout) { - docks - .map(dock => this._isDockEmpty(dock.dock)) - .forEach((empty, index) => { - if (empty && !previouslyEmpty[index]) { - docks[index].dock.hide(); - } - }); + docks.map(dock => this._isDockEmpty(dock.dock)).forEach((empty, index) => { + if (empty && !previouslyEmpty[index]) { + docks[index].dock.hide(); + } + }); } if (this._leftPaneContainerModel != null) { this._leftPaneContainerModel.setRemovedFromLayout(true); - invariant(this._leftPaneContainerModel != null); + + if (!(this._leftPaneContainerModel != null)) { + throw new Error("Invariant violation: \"this._leftPaneContainerModel != null\""); + } + this._leftPaneContainerModel.dispose(); + this._leftPaneContainerModel = null; } if (this._rightPaneContainerModel != null) { this._rightPaneContainerModel.setRemovedFromLayout(true); - invariant(this._rightPaneContainerModel != null); + + if (!(this._rightPaneContainerModel != null)) { + throw new Error("Invariant violation: \"this._rightPaneContainerModel != null\""); + } + this._rightPaneContainerModel.dispose(); + this._rightPaneContainerModel = null; } this._debuggerVisible = false; } - isDebuggerVisible(): boolean { + isDebuggerVisible() { return this._debuggerVisible; } - getWorkspaceDocksVisibility(): Array { + getWorkspaceDocksVisibility() { this._saveDebuggerPaneLocations(); + return this._getWorkspaceDocks().map(dock => { return dock.dock.isVisible != null && dock.dock.isVisible(); }); } + } + +exports.default = DebuggerLayoutManager; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneContainerViewModel.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneContainerViewModel.js index 8ef730200d..3b75570bd2 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneContainerViewModel.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneContainerViewModel.js @@ -1,3 +1,66 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _constants() { + const data = require("../constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _DebuggerPaneViewModel() { + const data = _interopRequireDefault(require("./DebuggerPaneViewModel")); + + _DebuggerPaneViewModel = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _tabBarView() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-ui/VendorLib/atom-tabs/lib/tab-bar-view")); + + _tabBarView = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _View() { + const data = require("../../../../../nuclide-commons-ui/View"); + + _View = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,32 +69,14 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import { - DEBUGGER_PANELS_DEFAULT_WIDTH_PX, - DEBUGGER_PANELS_DEFAULT_LOCATION, -} from '../constants'; -import DebuggerPaneViewModel from './DebuggerPaneViewModel'; -import invariant from 'assert'; -import * as React from 'react'; -import TabBarView from 'nuclide-commons-ui/VendorLib/atom-tabs/lib/tab-bar-view'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {View} from 'nuclide-commons-ui/View'; - const DEBUGGER_TAB_TITLE = 'Debugger'; -export default class DebuggerPaneContainerViewModel { - _container: atom$PaneContainer; - _disposables: UniversalDisposable; - _paneEvents: Map; - _removedFromLayout: boolean; - _preferredWidth: ?number; - - constructor(paneContainer: atom$PaneContainer, preferredWidth: ?number) { - this._disposables = new UniversalDisposable(); +class DebuggerPaneContainerViewModel { + constructor(paneContainer, preferredWidth) { + this._disposables = new (_UniversalDisposable().default)(); this._paneEvents = new Map(); this._removedFromLayout = false; this._container = paneContainer; @@ -39,118 +84,120 @@ export default class DebuggerPaneContainerViewModel { for (const pane of this._container.getPanes()) { this._deferredAddTabBarToEmptyPane(pane); + this._addManagedPane(pane); } - this._disposables.add( - () => { - this._forEachChildPaneItem((item: atom$PaneItem) => { - invariant( - item instanceof DebuggerPaneViewModel || - item instanceof DebuggerPaneContainerViewModel, - ); - item.setRemovedFromLayout(this._removedFromLayout); - item.destroy(); - }); - this._container.destroy(); - }, - paneContainer.onDidAddPane(event => { - const pane = event.pane; - - this._kickOutNonDebuggerItems(pane); - if (this._container.getPanes().indexOf(pane) < 0) { - return; + this._disposables.add(() => { + this._forEachChildPaneItem(item => { + if (!(item instanceof _DebuggerPaneViewModel().default || item instanceof DebuggerPaneContainerViewModel)) { + throw new Error("Invariant violation: \"item instanceof DebuggerPaneViewModel ||\\n item instanceof DebuggerPaneContainerViewModel\""); } - if (!this._conditionallyAddTabBarToPane(pane)) { - // Wait until the item(s) are added to the pane, and then add a tab bar - // above them if and only if the item's title is not the same as the - // container tabs title (we don't want duplicate tabs right beneath each other). - this._deferredAddTabBarToEmptyPane(pane); - } + item.setRemovedFromLayout(this._removedFromLayout); + item.destroy(); + }); - this._addManagedPane(pane); - }), - paneContainer.onWillDestroyPane(event => { - const disposables = this._paneEvents.get(event.pane); - if (disposables != null) { - disposables.dispose(); - this._paneEvents.delete(event.pane); - } - }), - paneContainer.onDidDestroyPane(event => { - // If this container is now empty, destroy it! - const panes = this._container.getPanes(); - if ( - panes.length === 0 || - (panes.length === 1 && panes[0].getItems().length === 0) - ) { - const parent = this.getParentPane(); - if (parent != null) { - parent.removeItem(this); - } + this._container.destroy(); + }, paneContainer.onDidAddPane(event => { + const pane = event.pane; + + this._kickOutNonDebuggerItems(pane); + + if (this._container.getPanes().indexOf(pane) < 0) { + return; + } + + if (!this._conditionallyAddTabBarToPane(pane)) { + // Wait until the item(s) are added to the pane, and then add a tab bar + // above them if and only if the item's title is not the same as the + // container tabs title (we don't want duplicate tabs right beneath each other). + this._deferredAddTabBarToEmptyPane(pane); + } + + this._addManagedPane(pane); + }), paneContainer.onWillDestroyPane(event => { + const disposables = this._paneEvents.get(event.pane); + + if (disposables != null) { + disposables.dispose(); + + this._paneEvents.delete(event.pane); + } + }), paneContainer.onDidDestroyPane(event => { + // If this container is now empty, destroy it! + const panes = this._container.getPanes(); + + if (panes.length === 0 || panes.length === 1 && panes[0].getItems().length === 0) { + const parent = this.getParentPane(); + + if (parent != null) { + parent.removeItem(this); } - }), - ); + } + })); } - _addManagedPane(pane: atom$Pane): void { + _addManagedPane(pane) { let disposables = this._paneEvents.get(pane); + if (disposables == null) { - disposables = new UniversalDisposable(); + disposables = new (_UniversalDisposable().default)(); + this._paneEvents.set(pane, disposables); } - disposables.add( - pane.onDidAddItem(event => { - this._kickOutNonDebuggerItems(pane); - }), - ); - - // Split operations on the child panes of this container are also being + disposables.add(pane.onDidAddItem(event => { + this._kickOutNonDebuggerItems(pane); + })); // Split operations on the child panes of this container are also being // executed on the parent pane that contains this container, which results // in very unexpected behavior. Prevent the parent pane from splitting. + const parent = this.getParentPane(); + if (parent != null) { // $FlowFixMe parent.split = () => {}; } - } - - // If a pane is initially empty, don't add the tab bar until the first item + } // If a pane is initially empty, don't add the tab bar until the first item // is added to the pane, otherwise we don't know what title to give the tab! - _deferredAddTabBarToEmptyPane(pane: atom$Pane): void { - const pendingAddTabDisposable = new UniversalDisposable(); - pendingAddTabDisposable.add( - pane.onDidAddItem(event => { - if (this._conditionallyAddTabBarToPane(pane)) { - this._disposables.remove(pendingAddTabDisposable); - pendingAddTabDisposable.dispose(); - } - }), - ); + + + _deferredAddTabBarToEmptyPane(pane) { + const pendingAddTabDisposable = new (_UniversalDisposable().default)(); + pendingAddTabDisposable.add(pane.onDidAddItem(event => { + if (this._conditionallyAddTabBarToPane(pane)) { + this._disposables.remove(pendingAddTabDisposable); + + pendingAddTabDisposable.dispose(); + } + })); + this._disposables.add(pendingAddTabDisposable); } - _conditionallyAddTabBarToPane(pane: atom$Pane): boolean { + _conditionallyAddTabBarToPane(pane) { const items = pane.getItems(); + if (items.length > 0) { const item = items[0]; - if (item instanceof DebuggerPaneViewModel) { + + if (item instanceof _DebuggerPaneViewModel().default) { if (item.getTitle() !== this.getTitle() || items.length > 1) { this._addTabBarToPane(pane); + return true; } } } return false; - } - - // Don't let the user add a non-debugger item to the debugger pane container. This is because + } // Don't let the user add a non-debugger item to the debugger pane container. This is because // the container will get destroyed by the debugger going away or redoing layout, and we wouldn't // be able to preserve the user's other items. - _kickOutNonDebuggerItems(pane: atom$Pane): void { + + + _kickOutNonDebuggerItems(pane) { for (const item of pane.getItems()) { if (item instanceof DebuggerPaneContainerViewModel) { if (item === this) { @@ -159,63 +206,65 @@ export default class DebuggerPaneContainerViewModel { // the debugger layout. // TODO: Better solution here. process.nextTick(() => { - atom.commands.dispatch( - atom.views.getView(atom.workspace), - 'debugger:show', - ); + atom.commands.dispatch(atom.views.getView(atom.workspace), 'debugger:show'); }); } else { // This is another debugger pane container, which contains other debugger // panes. Move all the other container's items to this container, and\ // then destroy the other container. const otherPanes = item._container.getPanes(); + for (const otherPane of otherPanes) { for (const otherItem of otherPane.getItems()) { const idx = pane.getItems().indexOf(item); otherPane.moveItemToPane(otherItem, pane, idx); otherPane.activateItemAtIndex(idx); } - } + } // Destroy the (now empty) other pane container. + - // Destroy the (now empty) other pane container. process.nextTick(() => { pane.destroyItem(item); }); } } else { // Kick the item out to the parent pane. - if (!(item instanceof DebuggerPaneViewModel)) { + if (!(item instanceof _DebuggerPaneViewModel().default)) { this._moveItemToParentPane(item, pane); } } } } - _moveItemToParentPane(item: atom$PaneItem, pane: atom$Pane): void { + _moveItemToParentPane(item, pane) { const parentPane = this.getParentPane(); - invariant(parentPane != null); - // Kick the item out to the parent pane, which must be done on next tick because the drag + if (!(parentPane != null)) { + throw new Error("Invariant violation: \"parentPane != null\""); + } // Kick the item out to the parent pane, which must be done on next tick because the drag // operation currently in progress needs the item not to be destroyed before the drag // completes. + + process.nextTick(() => { - invariant(parentPane != null); - pane.moveItemToPane( - item, - parentPane, - parentPane.getItems().indexOf(this) + 1, - ); - - // TODO: Atom bug? This is here because when setting this item active immediately after + if (!(parentPane != null)) { + throw new Error("Invariant violation: \"parentPane != null\""); + } + + pane.moveItemToPane(item, parentPane, parentPane.getItems().indexOf(this) + 1); // TODO: Atom bug? This is here because when setting this item active immediately after // moving, it sometimes (but not always) renders a blank pane... + process.nextTick(() => { - invariant(parentPane != null); + if (!(parentPane != null)) { + throw new Error("Invariant violation: \"parentPane != null\""); + } + parentPane.setActiveItem(item); }); }); } - getParentPane(): ?atom$Pane { + getParentPane() { for (const pane of atom.workspace.getPanes()) { for (const item of pane.getItems()) { if (item === this) { @@ -223,27 +272,26 @@ export default class DebuggerPaneContainerViewModel { } } } + return null; } - _addTabBarToPane(pane: atom$Pane): void { - const tabBarView = new TabBarView(pane); + _addTabBarToPane(pane) { + const tabBarView = new (_tabBarView().default)(pane); const paneElement = atom.views.getView(pane); - paneElement.insertBefore(tabBarView.element, paneElement.firstChild); - - // moveItemBetweenPanes conflicts with the parent tab's moveItemBetweenPanes. + paneElement.insertBefore(tabBarView.element, paneElement.firstChild); // moveItemBetweenPanes conflicts with the parent tab's moveItemBetweenPanes. // Empty it out to get the correct behavior. + tabBarView.moveItemBetweenPanes = () => {}; - tabBarView.element.classList.add( - 'nuclide-workspace-views-panel-location-tabs', - ); + + tabBarView.element.classList.add('nuclide-workspace-views-panel-location-tabs'); } - dispose(): void { + dispose() { this._disposables.dispose(); } - destroy(): void { + destroy() { if (!this._removedFromLayout) { // We need to differentiate between the case where destroying this pane hides one or more // non-essential debugger views, and where it means the user is closing the debugger. @@ -253,7 +301,7 @@ export default class DebuggerPaneContainerViewModel { // contained within this pane, which is accomplished by disposing this. for (const pane of this._container.getPanes()) { for (const item of pane.getItems()) { - if (item instanceof DebuggerPaneViewModel) { + if (item instanceof _DebuggerPaneViewModel().default) { if (item.isLifetimeView()) { item.destroy(); return; @@ -266,7 +314,7 @@ export default class DebuggerPaneContainerViewModel { this.dispose(); } - destroyWhere(callback: (item: atom$PaneItem) => mixed) { + destroyWhere(callback) { this._forEachChildPaneItem((innerItem, pane) => { if (callback(innerItem)) { pane.destroyItem(innerItem); @@ -274,46 +322,43 @@ export default class DebuggerPaneContainerViewModel { }); } - getTitle(): string { + getTitle() { return DEBUGGER_TAB_TITLE; } - getIconName(): string { + getIconName() { return 'nuclicon-debugger'; } - getDefaultLocation(): string { - return DEBUGGER_PANELS_DEFAULT_LOCATION; + getDefaultLocation() { + return _constants().DEBUGGER_PANELS_DEFAULT_LOCATION; } - getURI(): string { + getURI() { return 'atom://nuclide/debugger-container'; } - getPreferredWidth(): number { - return this._preferredWidth == null - ? DEBUGGER_PANELS_DEFAULT_WIDTH_PX - : this._preferredWidth; + getPreferredWidth() { + return this._preferredWidth == null ? _constants().DEBUGGER_PANELS_DEFAULT_WIDTH_PX : this._preferredWidth; } - createView(): React.Element { - return ; + createView() { + return React.createElement(_View().View, { + item: this._container + }); } - setRemovedFromLayout(removed: boolean): void { - this._removedFromLayout = removed; + setRemovedFromLayout(removed) { + this._removedFromLayout = removed; // Propagate this command to the children of the pane container. - // Propagate this command to the children of the pane container. this._forEachChildPaneItem(item => { - if (item instanceof DebuggerPaneViewModel) { + if (item instanceof _DebuggerPaneViewModel().default) { item.setRemovedFromLayout(removed); } }); } - _forEachChildPaneItem( - callback: (item: atom$PaneItem, pane: atom$Pane) => void, - ): void { + _forEachChildPaneItem(callback) { for (const pane of this._container.getPanes()) { pane.getItems().forEach(item => { callback(item, pane); @@ -321,8 +366,9 @@ export default class DebuggerPaneContainerViewModel { } } - getAllItems(): Array { + getAllItems() { const items = []; + this._forEachChildPaneItem(item => { items.push(item); }); @@ -330,11 +376,14 @@ export default class DebuggerPaneContainerViewModel { return items; } - serialize(): Object { + serialize() { return {}; } - copy(): boolean { + copy() { return false; } + } + +exports.default = DebuggerPaneContainerViewModel; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneViewModel.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneViewModel.js index e40184efd9..8009d1c31d 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneViewModel.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerPaneViewModel.js @@ -1,3 +1,24 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var React = _interopRequireWildcard(require("react")); + +function _constants() { + const data = require("../constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,35 +27,16 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {DebuggerPaneConfig} from './DebuggerLayoutManager'; -import * as React from 'react'; -import { - DEBUGGER_PANELS_DEFAULT_WIDTH_PX, - DEBUGGER_PANELS_DEFAULT_LOCATION, -} from '../constants'; - // A model that will serve as the view model for all debugger panes. We must provide // a unique instance of a view model for each pane, which Atom can destroy when the // pane that contains it is destroyed. We therefore cannot give it the actual debugger // model directly, since there is only one and its lifetime is tied to the lifetime // of the debugging session. -export default class DebuggerPaneViewModel { - _config: DebuggerPaneConfig; - _isLifetimeView: boolean; - _paneDestroyed: (pane: DebuggerPaneConfig) => void; - _removedFromLayout: boolean; - _preferredWidth: ?number; - - constructor( - config: DebuggerPaneConfig, - isLifetimeView: boolean, - paneDestroyed: (pane: DebuggerPaneConfig) => void, - preferredWidth: ?number, - ) { +class DebuggerPaneViewModel { + constructor(config, isLifetimeView, paneDestroyed, preferredWidth) { this._config = config; this._isLifetimeView = isLifetimeView; this._paneDestroyed = paneDestroyed; @@ -42,57 +44,59 @@ export default class DebuggerPaneViewModel { this._preferredWidth = preferredWidth; } - dispose(): void {} + dispose() {} - destroy(): void { + destroy() { if (!this._removedFromLayout) { this._paneDestroyed(this._config); } } - getTitle(): string { + getTitle() { return this._config.title(); } - getDefaultLocation(): string { - return DEBUGGER_PANELS_DEFAULT_LOCATION; + getDefaultLocation() { + return _constants().DEBUGGER_PANELS_DEFAULT_LOCATION; } - getURI(): string { + getURI() { return this._config.uri; } - getPreferredWidth(): number { - return this._preferredWidth == null - ? DEBUGGER_PANELS_DEFAULT_WIDTH_PX - : this._preferredWidth; + getPreferredWidth() { + return this._preferredWidth == null ? _constants().DEBUGGER_PANELS_DEFAULT_WIDTH_PX : this._preferredWidth; } - createView(): React.Element { + createView() { if (this._config.previousLocation != null) { this._config.previousLocation.userHidden = false; } + return this._config.createView(); } - getConfig(): DebuggerPaneConfig { + getConfig() { return this._config; } - isLifetimeView(): boolean { + isLifetimeView() { return this._isLifetimeView; } - setRemovedFromLayout(removed: boolean): void { + setRemovedFromLayout(removed) { this._removedFromLayout = removed; - } + } // Atom view needs to provide this, otherwise Atom throws an exception splitting panes for the view. - // Atom view needs to provide this, otherwise Atom throws an exception splitting panes for the view. - serialize(): Object { + + serialize() { return {}; } - copy(): boolean { + copy() { return false; } + } + +exports.default = DebuggerPaneViewModel; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessComponent.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessComponent.js index 898a77b643..a47ce25e7c 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessComponent.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessComponent.js @@ -1,3 +1,116 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _AtomInput() { + const data = require("../../../../../nuclide-commons-ui/AtomInput"); + + _AtomInput = function () { + return data; + }; + + return data; +} + +function _event() { + const data = require("../../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _Tree() { + const data = require("../../../../../nuclide-commons-ui/Tree"); + + _Tree = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _observable() { + const data = require("../../../../../nuclide-commons/observable"); + + _observable = function () { + return data; + }; + + return data; +} + +function _ProcessTreeNode() { + const data = _interopRequireDefault(require("./ProcessTreeNode")); + + _ProcessTreeNode = function () { + return data; + }; + + return data; +} + +function _Button() { + const data = require("../../../../../nuclide-commons-ui/Button"); + + _Button = function () { + return data; + }; + + return data; +} + +function _ButtonGroup() { + const data = require("../../../../../nuclide-commons-ui/ButtonGroup"); + + _ButtonGroup = function () { + return data; + }; + + return data; +} + +function _featureConfig() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons-atom/feature-config")); + + _featureConfig = function () { + return data; + }; + + return data; +} + +function _DebuggerAddTargetButton() { + const data = require("./DebuggerAddTargetButton"); + + _DebuggerAddTargetButton = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,150 +119,120 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import {AtomInput} from 'nuclide-commons-ui/AtomInput'; -import type {IDebugService, IProcess} from '../types'; - -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import * as React from 'react'; -import {TreeList} from 'nuclide-commons-ui/Tree'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import {fastDebounce} from 'nuclide-commons/observable'; -import ProcessTreeNode from './ProcessTreeNode'; -import {Button, ButtonSizes} from 'nuclide-commons-ui/Button'; -import {ButtonGroup} from 'nuclide-commons-ui/ButtonGroup'; -import featureConfig from 'nuclide-commons-atom/feature-config'; -import {AddTargetButton} from './DebuggerAddTargetButton'; - -type Props = { - service: IDebugService, -}; - -type State = { - processList: Array, - filter: ?string, - showPausedThreadsOnly: boolean, -}; - const SHOW_PAUSED_ONLY_KEY = 'debugger-show-paused-threads-only'; -export default class DebuggerProcessComponent extends React.PureComponent< - Props, - State, -> { - _disposables: UniversalDisposable; - - constructor(props: Props) { +class DebuggerProcessComponent extends React.PureComponent { + constructor(props) { super(props); - - this._disposables = new UniversalDisposable(); + this._disposables = new (_UniversalDisposable().default)(); this.state = { processList: this.props.service.getModel().getProcesses(), filter: null, - showPausedThreadsOnly: Boolean(featureConfig.get(SHOW_PAUSED_ONLY_KEY)), + showPausedThreadsOnly: Boolean(_featureConfig().default.get(SHOW_PAUSED_ONLY_KEY)) }; } - componentDidMount(): void { - const {service} = this.props; + componentDidMount() { + const { + service + } = this.props; const model = service.getModel(); - this._disposables.add( - observableFromSubscribeFunction(model.onDidChangeProcesses.bind(model)) - .let(fastDebounce(150)) - .subscribe(() => { - this.setState({ - processList: model.getProcesses(), - }); - }), - ); + + this._disposables.add((0, _event().observableFromSubscribeFunction)(model.onDidChangeProcesses.bind(model)).let((0, _observable().fastDebounce)(150)).subscribe(() => { + this.setState({ + processList: model.getProcesses() + }); + })); } - componentWillUnmount(): void { + componentWillUnmount() { this._disposables.dispose(); } - render(): React.Node { - const {processList, filter} = this.state; - const {service} = this.props; + render() { + const { + processList, + filter + } = this.state; + const { + service + } = this.props; let filterRegEx = null; + try { if (filter != null) { filterRegEx = new RegExp(filter, 'ig'); } } catch (_) {} + const processElements = processList.map((process, processIndex) => { - const {adapterType, processName} = process.configuration; - return process == null ? ( - 'No processes are currently being debugged' - ) : ( - - ); + const { + adapterType, + processName + } = process.configuration; + return process == null ? 'No processes are currently being debugged' : React.createElement(_ProcessTreeNode().default, { + title: processName != null ? processName : adapterType, + filter: filter, + filterRegEx: filterRegEx, + showPausedThreadsOnly: this.state.showPausedThreadsOnly, + key: process.getId(), + childItems: process.getAllThreads(), + process: process, + service: service + }); }); + return React.createElement("div", null, React.createElement("div", { + className: "debugger-thread-filter-row" + }, React.createElement(_AtomInput().AtomInput, { + className: "debugger-thread-filter-box", + placeholderText: "Filter threads...", + value: this.state.filter || '', + size: "sm", + onDidChange: text => { + this.setState({ + filter: text + }); + }, + autofocus: false + }), React.createElement(_ButtonGroup().ButtonGroup, { + className: "inline-block" + }, React.createElement(_Button().Button, { + icon: 'playback-pause', + size: _Button().ButtonSizes.SMALL, + selected: this.state.showPausedThreadsOnly, + onClick: () => { + _featureConfig().default.set(SHOW_PAUSED_ONLY_KEY, !this.state.showPausedThreadsOnly); + + this.setState(prevState => ({ + showPausedThreadsOnly: !prevState.showPausedThreadsOnly + })); + }, + tooltip: { + title: 'Show only paused threads' + } + }), React.createElement(_Button().Button, { + icon: 'x', + disabled: !this.state.showPausedThreadsOnly && (this.state.filter === '' || this.state.filter == null), + size: _Button().ButtonSizes.SMALL, + onClick: () => { + _featureConfig().default.set(SHOW_PAUSED_ONLY_KEY, false); - return ( -
-
- { - this.setState({ - filter: text, - }); - }} - autofocus={false} - /> - -
- {processElements} -
- ); + this.setState({ + showPausedThreadsOnly: false, + filter: '' + }); + }, + tooltip: { + title: 'Clear thread filters' + } + })), (0, _DebuggerAddTargetButton().AddTargetButton)('debugger-stepping-buttongroup')), React.createElement(_Tree().TreeList, { + showArrows: true + }, processElements)); } + } + +exports.default = DebuggerProcessComponent; \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessTreeView.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessTreeView.js index fabc84c970..b4a6fd3a4c 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessTreeView.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerProcessTreeView.js @@ -1,3 +1,46 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = DebuggerProcessTreeView; + +function _classnames() { + const data = _interopRequireDefault(require("classnames")); + + _classnames = function () { + return data; + }; + + return data; +} + +function _Block() { + const data = require("../../../../../nuclide-commons-ui/Block"); + + _Block = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _DebuggerProcessComponent() { + const data = _interopRequireDefault(require("./DebuggerProcessComponent")); + + _DebuggerProcessComponent = function () { + return data; + }; + + return data; +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,32 +49,15 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow strict-local + * strict-local * @format */ - -import type {IDebugService} from '../types'; - -import classnames from 'classnames'; -import {Block} from 'nuclide-commons-ui/Block'; -import * as React from 'react'; -import DebuggerProcessComponent from './DebuggerProcessComponent'; - -export default function DebuggerProcessTreeView(props: { - service: IDebugService, -}): React.Node { - return ( -
-
- - - -
-
- ); -} +function DebuggerProcessTreeView(props) { + return React.createElement("div", { + className: (0, _classnames().default)('debugger-container-new', 'debugger-breakpoint-list', 'debugger-tree') + }, React.createElement("div", { + className: "debugger-pane-content " + }, React.createElement(_Block().Block, null, React.createElement(_DebuggerProcessComponent().default, { + service: props.service + })))); +} \ No newline at end of file diff --git a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerSteppingComponent.js b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerSteppingComponent.js index a2dfc8b06d..bef92ea02c 100644 --- a/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerSteppingComponent.js +++ b/modules/atom-ide-ui/pkg/atom-ide-debugger/lib/ui/DebuggerSteppingComponent.js @@ -1,3 +1,108 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +function _LoadingSpinner() { + const data = require("../../../../../nuclide-commons-ui/LoadingSpinner"); + + _LoadingSpinner = function () { + return data; + }; + + return data; +} + +function _event() { + const data = require("../../../../../nuclide-commons/event"); + + _event = function () { + return data; + }; + + return data; +} + +function _observable() { + const data = require("../../../../../nuclide-commons/observable"); + + _observable = function () { + return data; + }; + + return data; +} + +var React = _interopRequireWildcard(require("react")); + +function _Button() { + const data = require("../../../../../nuclide-commons-ui/Button"); + + _Button = function () { + return data; + }; + + return data; +} + +function _ButtonGroup() { + const data = require("../../../../../nuclide-commons-ui/ButtonGroup"); + + _ButtonGroup = function () { + return data; + }; + + return data; +} + +var _rxjsCompatUmdMin = require("rxjs-compat/bundles/rxjs-compat.umd.min.js"); + +function _constants() { + const data = require("../constants"); + + _constants = function () { + return data; + }; + + return data; +} + +function _UniversalDisposable() { + const data = _interopRequireDefault(require("../../../../../nuclide-commons/UniversalDisposable")); + + _UniversalDisposable = function () { + return data; + }; + + return data; +} + +function _logger() { + const data = _interopRequireDefault(require("../logger")); + + _logger = function () { + return data; + }; + + return data; +} + +function _nullthrows() { + const data = _interopRequireDefault(require("nullthrows")); + + _nullthrows = function () { + return data; + }; + + return data; +} + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } + /** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. @@ -6,152 +111,119 @@ * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * - * @flow + * * @format */ - -import type {IDebugService, IThread, IProcess} from '../types'; -import { - LoadingSpinner, - LoadingSpinnerSizes, -} from 'nuclide-commons-ui/LoadingSpinner'; - -import {observableFromSubscribeFunction} from 'nuclide-commons/event'; -import {fastDebounce} from 'nuclide-commons/observable'; -import * as React from 'react'; -import {Button} from 'nuclide-commons-ui/Button'; -import {ButtonGroup} from 'nuclide-commons-ui/ButtonGroup'; -import {Observable} from 'rxjs'; -import {DebuggerMode} from '../constants'; -import UniversalDisposable from 'nuclide-commons/UniversalDisposable'; -import logger from '../logger'; -import nullthrows from 'nullthrows'; -import invariant from 'assert'; - -type DebuggerSteppingComponentProps = { - service: IDebugService, +const defaultTooltipOptions = { + placement: 'bottom' }; +const STEP_OVER_ICON = React.createElement("svg", { + viewBox: "0 0 100 100" +}, React.createElement("circle", { + cx: "46", + cy: "63", + r: "10" +}), React.createElement("path", { + d: 'M83.8,54.7c-6.5-16.6-20.7-28.1-37.2-28.1c-19.4,0-35.6,16-39.9,' + '37.3l11.6,2.9c3-16.2,14.5-28.2,28.2-28.2 c11,0,20.7,7.8,25.6,' + '19.3l-9.6,2.7l20.8,14.7L93.7,52L83.8,54.7z' +})); +const STEP_INTO_ICON = React.createElement("svg", { + viewBox: "0 0 100 100" +}, React.createElement("circle", { + cx: "50", + cy: "75", + r: "10" +}), React.createElement("polygon", { + points: "42,20 57,20 57,40 72,40 50,60 28,40 42,40" +})); +const STEP_OUT_ICON = React.createElement("svg", { + viewBox: "0 0 100 100" +}, React.createElement("circle", { + cx: "50", + cy: "75", + r: "10" +}), React.createElement("polygon", { + points: "42,20 57,20 57,40 72,40 50,60 28,40 42,40", + transform: "rotate(180, 50, 40)" +})); -type DebuggerSteppingComponentState = { - waitingForPause: boolean, - focusedProcess: ?IProcess, - focusedThread: ?IThread, -}; +function SVGButton(props) { + return React.createElement(_Button().Button, { + className: "debugger-stepping-svg-button", + onClick: props.onClick, + disabled: props.disabled, + tooltip: props.tooltip + }, React.createElement("div", null, props.icon)); +} -const defaultTooltipOptions = { - placement: 'bottom', -}; +class DebuggerSteppingComponent extends React.Component { + constructor(props) { + super(props); -const STEP_OVER_ICON = ( - - - { + const pausableThread = this._getPausableThread(); + + if (pausableThread == null) { + _logger().default.error('No thread to pause/resume'); + + return; } - /> - -); - -const STEP_INTO_ICON = ( - - - - -); - -const STEP_OUT_ICON = ( - - - - -); - -function SVGButton(props: { - onClick: () => mixed, - tooltip: atom$TooltipsAddOptions, - icon: React.Element, - disabled: boolean, -}): React.Element { - return ( - - ); -} -export default class DebuggerSteppingComponent extends React.Component< - DebuggerSteppingComponentProps, - DebuggerSteppingComponentState, -> { - _disposables: UniversalDisposable; + if (pausableThread.stopped) { + pausableThread.continue(); + } else { + this._setWaitingForPause(true); - constructor(props: DebuggerSteppingComponentProps) { - super(props); + pausableThread.pause(); + } + }; - this._disposables = new UniversalDisposable(); + this._disposables = new (_UniversalDisposable().default)(); this.state = { waitingForPause: false, focusedProcess: null, - focusedThread: null, + focusedThread: null }; } - componentDidMount(): void { - const {service} = this.props; + componentDidMount() { + const { + service + } = this.props; const model = service.getModel(); - this._disposables.add( - Observable.merge( - observableFromSubscribeFunction( - service.onDidChangeProcessMode.bind(service), - ), - observableFromSubscribeFunction(model.onDidChangeCallStack.bind(model)), - observableFromSubscribeFunction( - service.viewModel.onDidChangeDebuggerFocus.bind(service.viewModel), - ), - ) - .startWith(null) - .let(fastDebounce(10)) - .subscribe(() => { - const {viewModel} = this.props.service; - const {focusedProcess, focusedThread} = viewModel; - const debuggerMode = - focusedProcess == null - ? DebuggerMode.STOPPED - : focusedProcess.debuggerMode; - - this.setState(prevState => ({ - focusedProcess, - focusedThread, - waitingForPause: - prevState.waitingForPause && - debuggerMode === DebuggerMode.RUNNING, - })); - }), - ); + + this._disposables.add(_rxjsCompatUmdMin.Observable.merge((0, _event().observableFromSubscribeFunction)(service.onDidChangeProcessMode.bind(service)), (0, _event().observableFromSubscribeFunction)(model.onDidChangeCallStack.bind(model)), (0, _event().observableFromSubscribeFunction)(service.viewModel.onDidChangeDebuggerFocus.bind(service.viewModel))).startWith(null).let((0, _observable().fastDebounce)(10)).subscribe(() => { + const { + viewModel + } = this.props.service; + const { + focusedProcess, + focusedThread + } = viewModel; + const debuggerMode = focusedProcess == null ? _constants().DebuggerMode.STOPPED : focusedProcess.debuggerMode; + this.setState(prevState => ({ + focusedProcess, + focusedThread, + waitingForPause: prevState.waitingForPause && debuggerMode === _constants().DebuggerMode.RUNNING + })); + })); } - componentWillUnmount(): void { + componentWillUnmount() { this._disposables.dispose(); } - _setWaitingForPause(waiting: boolean): void { + _setWaitingForPause(waiting) { this.setState({ - waitingForPause: waiting, + waitingForPause: waiting }); } - _getPausableThread(): ?IThread { - const {focusedThread, focusedProcess} = this.props.service.viewModel; + _getPausableThread() { + const { + focusedThread, + focusedProcess + } = this.props.service.viewModel; + if (focusedThread != null) { return focusedThread; } else if (focusedProcess != null) { @@ -161,94 +233,62 @@ export default class DebuggerSteppingComponent extends React.Component< } } - _togglePauseState = () => { - const pausableThread = this._getPausableThread(); - if (pausableThread == null) { - logger.error('No thread to pause/resume'); - return; - } + render() { + const { + waitingForPause, + focusedProcess, + focusedThread + } = this.state; + const { + service + } = this.props; + const debuggerMode = focusedProcess == null ? _constants().DebuggerMode.STOPPED : focusedProcess.debuggerMode; + const readOnly = focusedProcess == null ? false : Boolean(focusedProcess.configuration.isReadOnly); + const customControlButtons = focusedProcess == null ? [] : focusedProcess.configuration.customControlButtons || []; - if (pausableThread.stopped) { - pausableThread.continue(); - } else { - this._setWaitingForPause(true); - pausableThread.pause(); - } - }; + const isPaused = debuggerMode === _constants().DebuggerMode.PAUSED; + + const isStopped = debuggerMode === _constants().DebuggerMode.STOPPED; + + const isPausing = debuggerMode === _constants().DebuggerMode.RUNNING && waitingForPause; + const playPauseIcon = isPausing ? null : React.createElement("span", { + className: isPaused ? 'icon-playback-play' : 'icon-playback-pause' + }); + const loadingIndicator = !isPausing ? null : React.createElement(_LoadingSpinner().LoadingSpinner, { + className: "debugger-stepping-playpause-button-loading", + size: _LoadingSpinner().LoadingSpinnerSizes.EXTRA_SMALL + }); + const restartDebuggerButton = debuggerMode !== _constants().DebuggerMode.STOPPED && service.canRestartProcess() ? React.createElement(_Button().Button, { + icon: "sync", + className: "debugger-stepping-button-separated", + disabled: isStopped || readOnly, + tooltip: Object.assign({}, defaultTooltipOptions, { + title: 'Restart the debugger using the same settings as the current debug session', + keyBindingCommand: 'debugger:restart-debugging' + }), + onClick: () => { + if (!(focusedProcess != null)) { + throw new Error("Invariant violation: \"focusedProcess != null\""); + } - render(): React.Node { - const {waitingForPause, focusedProcess, focusedThread} = this.state; - const {service} = this.props; - const debuggerMode = - focusedProcess == null - ? DebuggerMode.STOPPED - : focusedProcess.debuggerMode; - const readOnly = - focusedProcess == null - ? false - : Boolean(focusedProcess.configuration.isReadOnly); - const customControlButtons = - focusedProcess == null - ? [] - : focusedProcess.configuration.customControlButtons || []; - const isPaused = debuggerMode === DebuggerMode.PAUSED; - const isStopped = debuggerMode === DebuggerMode.STOPPED; - const isPausing = debuggerMode === DebuggerMode.RUNNING && waitingForPause; - const playPauseIcon = isPausing ? null : ( - - ); - - const loadingIndicator = !isPausing ? null : ( - - ); - - const restartDebuggerButton = - debuggerMode !== DebuggerMode.STOPPED && service.canRestartProcess() ? ( - - nullthrows(focusedThread).next()} - /> - nullthrows(focusedThread).stepIn()} - /> - nullthrows(focusedThread).stepOut()} - /> -

- This is intended to debug python script files. -
- To debug buck targets, you should{' '} -
- use the buck toolbar instead - . -