<commit_before>/**
 * These rule settings are a broad, general recommendation for a good default configuration.
 * This file is exported in the npm/nuget package as ./tslint.json.
 */
module.exports = {
    "rules": {

        /**
         * Security Rules. The following rules should be turned on because they find security issues
         * or are recommended in the Microsoft Secure Development Lifecycle (SDL)
         */
        "insecure-random": true,
        "no-banned-terms": true,
        "no-cookies": true,
        "no-delete-expression": true,
        "no-disable-auto-sanitization": true,
        "no-document-domain": true,
        "no-document-write": true,
        "no-eval": true,
        "no-exec-script": true,
        "no-function-constructor-with-string-args": true,
        "no-http-string": [true, "http://www.example.com/?.*", "http://localhost:?.*"],
        "no-inner-html": true,
        "no-octal-literal": true,
        "no-reserved-keywords": true,
        "no-string-based-set-immediate": true,
        "no-string-based-set-interval": true,
        "no-string-based-set-timeout": true,
        "non-literal-require": true,
        "possible-timing-attack": true,
        "react-anchor-blank-noopener": true,
        "react-iframe-missing-sandbox": true,
        "react-no-dangerous-html": true,

        /**
         * Common Bugs and Correctness. The following rules should be turned on because they find
         * common bug patterns in the code or enforce type safety.
         */
        "await-promise": true,
        "forin": true,
        "jquery-deferred-must-complete": true,
        "label-position": true,
        "match-default-export-name": true,
        "mocha-avoid-only": true,
        "mocha-no-side-effect-code": true,
        "no-any": true,
        "no-arg": true,
        "no-backbone-get-set-outside-model": true,
        "no-bitwise": true,
        "no-conditional-assignment": true,
        "no-console": [true, "debug", "info", "error", "log", "time", "timeEnd", "trace"],
        "no-constant-condition": true,
        "no-control-regex": true,
        "no-debugger": true,
        "no-duplicate-super": true,
        "no-duplicate-switch-case": true,
        "no-duplicate-variable": true,
        "no-empty": true,
        "no-floating-promises": true,
        "no-for-in-array": true,
        "no-implicit-dependencies": true,
        "no-import-side-effect": true,
        "no-increment-decrement": true,
        "no-invalid-regexp": true,
        "no-invalid-template-strings": true,
        "no-invalid-this": true,
        "no-jquery-raw-elements": true,
        "no-misused-new": true,
        "no-non-null-assertion": true,
        "no-object-literal-type-assertion": true,
        "no-parameter-reassignment": true,
        "no-reference-import": true,
        "no-regex-spaces": true,
        "no-sparse-arrays": true,
        "no-string-literal": true,
        "no-string-throw": true,
        "no-submodule-imports": true,
        "no-unnecessary-bind": true,
        "no-unnecessary-callback-wrapper": true,
        "no-unnecessary-initializer": true,
        "no-unnecessary-override": true,
        "no-unsafe-any": true,
        "no-unsafe-finally": true,
        "no-unused-expression": true,
        "no-use-before-declare": true,
        "no-with-statement": true,
        "promise-function-async": true,
        "promise-must-complete": true,
        "radix": true,
        "react-this-binding-issue": true,
        "react-unused-props-and-state": true,
        "restrict-plus-operands": true, // the plus operand should really only be used for strings and numbers
        "strict-boolean-expressions": true,
        "switch-default": true,
        "switch-final-break": true,
        "triple-equals": [true, "allow-null-check"],
        "use-isnan": true,
        "use-named-parameter": true,

        /**
         * Code Clarity. The following rules should be turned on because they make the code
         * generally more clear to the reader.
         */
        "adjacent-overload-signatures": true,
        "array-type": [true, "array"],
        "arrow-parens": false, // for simple functions the parens on arrow functions are not needed
        "ban-comma-operator": true, // possibly controversial
        "binary-expression-operand-order": true,
        "callable-types": true,
        "chai-prefer-contains-to-index-of": true,
        "chai-vague-errors": true,
        "class-name": true,
        "comment-format": true,
        "completed-docs": [true, "classes"],
        "export-name": true,
        "file-name-casing": true,
        "function-name": true,
        "import-name": true,
        "interface-name": true,
        "jsdoc-format": true,
        "max-classes-per-file": [true, 3],  // we generally recommend making one public class per file
        "max-file-line-count": true,
        "max-func-body-length": [true, 100, {"ignore-parameters-to-function-regex": "^describe$"}],
        "max-line-length": [true, 140],
        "member-access": true,
        "member-ordering": [true, { "order": "fields-first" }],
        "missing-jsdoc": true,
        "mocha-unneeded-done": true,
        "new-parens": true,
        "newline-per-chained-call": true,
        "no-construct": true,
        "no-default-export": true,
        "no-duplicate-imports": true,
        "no-dynamic-delete": true,
        "no-empty-interface": true,
        "no-for-in": true,
        "no-function-expression": true,
        "no-inferrable-types": false, // turn no-inferrable-types off in order to make the code consistent in its use of type decorations
        "no-multiline-string": false,
        "no-null-keyword": false, // turn no-null-keyword off and use undefined to mean not initialized and null to mean without a value
        "no-parameter-properties": true,
        "no-redundant-jsdoc": true,
        "no-relative-imports": true,
        "no-require-imports": true,
        "no-return-await": true,
        "no-shadowed-variable": true,
        "no-suspicious-comment": true,
        "no-this-assignment": true,
        "no-typeof-undefined": true,
        "no-unnecessary-class": true,
        "no-unnecessary-field-initialization": true,
        "no-unnecessary-local-variable": true,
        "no-unnecessary-qualifier": true,
        "no-unnecessary-type-assertion": true,
        "no-unsupported-browser-code": true,
        "no-useless-files": true,
        "no-var-keyword": true,
        "no-var-requires": true,
        "no-void-expression": true,
        "number-literal-format": true,
        "object-literal-sort-keys": false, // turn object-literal-sort-keys off and sort keys in a meaningful manner
        "one-variable-per-declaration": true,
        "only-arrow-functions": false,  // there are many valid reasons to declare a function
        "ordered-imports": true,
        "prefer-array-literal": true,
        "prefer-const": true,
        "prefer-for-of": true,
        "prefer-method-signature": true,
        "prefer-object-spread": true,
        "prefer-readonly": true,
        "prefer-template": true,
        "prefer-while": true,
        "type-literal-delimiter": true,
        "typedef": [true, "call-signature", "arrow-call-signature", "parameter", "arrow-parameter", "property-declaration", "variable-declaration", "member-variable-declaration"],
        "underscore-consistent-invocation": true,
        "unified-signatures": true,
        "use-default-type-parameter": true,
        "variable-name": true,

        /**
         * Accessibility. The following rules should be turned on to guarantee the best user
         * experience for keyboard and screen reader users.
         */
        "react-a11y-anchors": true,
        "react-a11y-aria-unsupported-elements": true,
        "react-a11y-event-has-role": true,
        "react-a11y-image-button-has-alt": true,
        "react-a11y-img-has-alt": true,
        "react-a11y-lang": true,
        "react-a11y-meta": true,
        "react-a11y-props": true,
        "react-a11y-proptypes": true,
        "react-a11y-role": true,
        "react-a11y-role-has-required-aria-props": true,
        "react-a11y-role-supports-aria-props": true,
        "react-a11y-tabindex-no-positive": true,
        "react-a11y-titles": true,

        /**
         * Whitespace related rules. The only recommended whitespace strategy is to pick a single format and
         * be consistent.
         */
        "align": [true, "parameters", "arguments", "statements"],
        "curly": true,
        "encoding": true,
        "eofline": true,
        "import-spacing": true,
        "indent": [true, "spaces"],
        "linebreak-style": true,
        "newline-before-return": true,
        "no-consecutive-blank-lines": true,
        "no-empty-line-after-opening-brace": false,
        "no-irregular-whitespace": true,
        "no-single-line-block-comment": true,
        "no-trailing-whitespace": true,
        "no-unnecessary-semicolons": true,
        "object-literal-key-quotes": [true, "as-needed"],
        "one-line": [true, "check-open-brace", "check-catch", "check-else", "check-whitespace"],
        "quotemark": [true, "single"],
        "semicolon": [true, "always"],
        "space-within-parens": true,
        "trailing-comma": [true, {"singleline": "never", "multiline": "never"}], // forcing trailing commas for multi-line
                    // lists results in lists that are easier to reorder and version control diffs that are more clear.
                    // Many teams like to have multiline be 'always'. There is no clear consensus on this rule but the
                    // internal MS JavaScript coding standard does discourage it.
        "typedef-whitespace": false,
        "whitespace": [true, "check-branch", "check-decl", "check-operator", "check-separator", "check-type"],

        /**
         * Controversial/Configurable rules.
         */
        "ban": false,                // only enable this if you have some code pattern that you want to ban
        "ban-types": true,
        "cyclomatic-complexity": true,
        "deprecation": false, // deprecated APIs are sometimes unavoidable
        "file-header": false,  // enable this rule only if you are legally required to add a file header
        "import-blacklist": false,  // enable and configure this as you desire
        "interface-over-type-literal": false,  // there are plenty of reasons to prefer interfaces
        "no-angle-bracket-type-assertion": false,  // pick either type-cast format and use it consistently
        "no-inferred-empty-object-type": false,  // if the compiler is satisfied then this is probably not an issue
        "no-internal-module": false, // only enable this if you are not using internal modules
        "no-magic-numbers": false,  // by default it will find too many false positives
        "no-mergeable-namespace": false,  // your project may require mergeable namespaces
        "no-namespace": false,       // only enable this if you are not using modules/namespaces
        "no-reference": true,        // in general you should use a module system and not /// reference imports
        "no-unexternalized-strings": false, // the VS Code team has a specific localization process that this rule enforces
        "object-literal-shorthand": false,  // object-literal-shorthand offers an abbreviation not an abstraction
        "prefer-conditional-expression": false, // unnecessarily strict
        "prefer-switch": false, // more of a style preference
        "prefer-type-cast": true,   // pick either type-cast format and use it consistently
        "return-undefined": false, // this actually affect the readability of the code
        "space-before-function-paren": false,   // turn this on if this is really your coding standard

        /**
         * Deprecated rules.  The following rules are deprecated for various reasons.
         */
        "missing-optional-annotation": false,  // now supported by TypeScript compiler
        "no-duplicate-case": false,
        "no-duplicate-parameter-names": false, // now supported by TypeScript compiler
        "no-empty-interfaces": false, // use tslint no-empty-interface rule instead
        "no-missing-visibility-modifiers": false, // use tslint member-access rule instead
        "no-multiple-var-decl": false,         // use tslint one-variable-per-declaration rule instead
        "no-stateless-class": false,
        "no-switch-case-fall-through": false,  // now supported by TypeScript compiler
        "no-var-self": false,
        "react-tsx-curly-spacing": false,
        "typeof-compare": false,               // the valid-typeof rule is currently superior to this version
        "valid-typeof": false,
    }
};

<commit_msg>Disable newline-before-return in recommended preset (#497)<commit_after>/**
 * These rule settings are a broad, general recommendation for a good default configuration.
 * This file is exported in the npm/nuget package as ./tslint.json.
 */
module.exports = {
    "rules": {

        /**
         * Security Rules. The following rules should be turned on because they find security issues
         * or are recommended in the Microsoft Secure Development Lifecycle (SDL)
         */
        "insecure-random": true,
        "no-banned-terms": true,
        "no-cookies": true,
        "no-delete-expression": true,
        "no-disable-auto-sanitization": true,
        "no-document-domain": true,
        "no-document-write": true,
        "no-eval": true,
        "no-exec-script": true,
        "no-function-constructor-with-string-args": true,
        "no-http-string": [true, "http://www.example.com/?.*", "http://localhost:?.*"],
        "no-inner-html": true,
        "no-octal-literal": true,
        "no-reserved-keywords": true,
        "no-string-based-set-immediate": true,
        "no-string-based-set-interval": true,
        "no-string-based-set-timeout": true,
        "non-literal-require": true,
        "possible-timing-attack": true,
        "react-anchor-blank-noopener": true,
        "react-iframe-missing-sandbox": true,
        "react-no-dangerous-html": true,

        /**
         * Common Bugs and Correctness. The following rules should be turned on because they find
         * common bug patterns in the code or enforce type safety.
         */
        "await-promise": true,
        "forin": true,
        "jquery-deferred-must-complete": true,
        "label-position": true,
        "match-default-export-name": true,
        "mocha-avoid-only": true,
        "mocha-no-side-effect-code": true,
        "no-any": true,
        "no-arg": true,
        "no-backbone-get-set-outside-model": true,
        "no-bitwise": true,
        "no-conditional-assignment": true,
        "no-console": [true, "debug", "info", "error", "log", "time", "timeEnd", "trace"],
        "no-constant-condition": true,
        "no-control-regex": true,
        "no-debugger": true,
        "no-duplicate-super": true,
        "no-duplicate-switch-case": true,
        "no-duplicate-variable": true,
        "no-empty": true,
        "no-floating-promises": true,
        "no-for-in-array": true,
        "no-implicit-dependencies": true,
        "no-import-side-effect": true,
        "no-increment-decrement": true,
        "no-invalid-regexp": true,
        "no-invalid-template-strings": true,
        "no-invalid-this": true,
        "no-jquery-raw-elements": true,
        "no-misused-new": true,
        "no-non-null-assertion": true,
        "no-object-literal-type-assertion": true,
        "no-parameter-reassignment": true,
        "no-reference-import": true,
        "no-regex-spaces": true,
        "no-sparse-arrays": true,
        "no-string-literal": true,
        "no-string-throw": true,
        "no-submodule-imports": true,
        "no-unnecessary-bind": true,
        "no-unnecessary-callback-wrapper": true,
        "no-unnecessary-initializer": true,
        "no-unnecessary-override": true,
        "no-unsafe-any": true,
        "no-unsafe-finally": true,
        "no-unused-expression": true,
        "no-use-before-declare": true,
        "no-with-statement": true,
        "promise-function-async": true,
        "promise-must-complete": true,
        "radix": true,
        "react-this-binding-issue": true,
        "react-unused-props-and-state": true,
        "restrict-plus-operands": true, // the plus operand should really only be used for strings and numbers
        "strict-boolean-expressions": true,
        "switch-default": true,
        "switch-final-break": true,
        "triple-equals": [true, "allow-null-check"],
        "use-isnan": true,
        "use-named-parameter": true,

        /**
         * Code Clarity. The following rules should be turned on because they make the code
         * generally more clear to the reader.
         */
        "adjacent-overload-signatures": true,
        "array-type": [true, "array"],
        "arrow-parens": false, // for simple functions the parens on arrow functions are not needed
        "ban-comma-operator": true, // possibly controversial
        "binary-expression-operand-order": true,
        "callable-types": true,
        "chai-prefer-contains-to-index-of": true,
        "chai-vague-errors": true,
        "class-name": true,
        "comment-format": true,
        "completed-docs": [true, "classes"],
        "export-name": true,
        "file-name-casing": true,
        "function-name": true,
        "import-name": true,
        "interface-name": true,
        "jsdoc-format": true,
        "max-classes-per-file": [true, 3],  // we generally recommend making one public class per file
        "max-file-line-count": true,
        "max-func-body-length": [true, 100, {"ignore-parameters-to-function-regex": "^describe$"}],
        "max-line-length": [true, 140],
        "member-access": true,
        "member-ordering": [true, { "order": "fields-first" }],
        "missing-jsdoc": true,
        "mocha-unneeded-done": true,
        "new-parens": true,
        "newline-per-chained-call": true,
        "no-construct": true,
        "no-default-export": true,
        "no-duplicate-imports": true,
        "no-dynamic-delete": true,
        "no-empty-interface": true,
        "no-for-in": true,
        "no-function-expression": true,
        "no-inferrable-types": false, // turn no-inferrable-types off in order to make the code consistent in its use of type decorations
        "no-multiline-string": false,
        "no-null-keyword": false, // turn no-null-keyword off and use undefined to mean not initialized and null to mean without a value
        "no-parameter-properties": true,
        "no-redundant-jsdoc": true,
        "no-relative-imports": true,
        "no-require-imports": true,
        "no-return-await": true,
        "no-shadowed-variable": true,
        "no-suspicious-comment": true,
        "no-this-assignment": true,
        "no-typeof-undefined": true,
        "no-unnecessary-class": true,
        "no-unnecessary-field-initialization": true,
        "no-unnecessary-local-variable": true,
        "no-unnecessary-qualifier": true,
        "no-unnecessary-type-assertion": true,
        "no-unsupported-browser-code": true,
        "no-useless-files": true,
        "no-var-keyword": true,
        "no-var-requires": true,
        "no-void-expression": true,
        "number-literal-format": true,
        "object-literal-sort-keys": false, // turn object-literal-sort-keys off and sort keys in a meaningful manner
        "one-variable-per-declaration": true,
        "only-arrow-functions": false,  // there are many valid reasons to declare a function
        "ordered-imports": true,
        "prefer-array-literal": true,
        "prefer-const": true,
        "prefer-for-of": true,
        "prefer-method-signature": true,
        "prefer-object-spread": true,
        "prefer-readonly": true,
        "prefer-template": true,
        "prefer-while": true,
        "type-literal-delimiter": true,
        "typedef": [true, "call-signature", "arrow-call-signature", "parameter", "arrow-parameter", "property-declaration", "variable-declaration", "member-variable-declaration"],
        "underscore-consistent-invocation": true,
        "unified-signatures": true,
        "use-default-type-parameter": true,
        "variable-name": true,

        /**
         * Accessibility. The following rules should be turned on to guarantee the best user
         * experience for keyboard and screen reader users.
         */
        "react-a11y-anchors": true,
        "react-a11y-aria-unsupported-elements": true,
        "react-a11y-event-has-role": true,
        "react-a11y-image-button-has-alt": true,
        "react-a11y-img-has-alt": true,
        "react-a11y-lang": true,
        "react-a11y-meta": true,
        "react-a11y-props": true,
        "react-a11y-proptypes": true,
        "react-a11y-role": true,
        "react-a11y-role-has-required-aria-props": true,
        "react-a11y-role-supports-aria-props": true,
        "react-a11y-tabindex-no-positive": true,
        "react-a11y-titles": true,

        /**
         * Whitespace related rules. The only recommended whitespace strategy is to pick a single format and
         * be consistent.
         */
        "align": [true, "parameters", "arguments", "statements"],
        "curly": true,
        "encoding": true,
        "eofline": true,
        "import-spacing": true,
        "indent": [true, "spaces"],
        "linebreak-style": true,
        "newline-before-return": false,
        "no-consecutive-blank-lines": true,
        "no-empty-line-after-opening-brace": false,
        "no-irregular-whitespace": true,
        "no-single-line-block-comment": true,
        "no-trailing-whitespace": true,
        "no-unnecessary-semicolons": true,
        "object-literal-key-quotes": [true, "as-needed"],
        "one-line": [true, "check-open-brace", "check-catch", "check-else", "check-whitespace"],
        "quotemark": [true, "single"],
        "semicolon": [true, "always"],
        "space-within-parens": true,
        "trailing-comma": [true, {"singleline": "never", "multiline": "never"}], // forcing trailing commas for multi-line
                    // lists results in lists that are easier to reorder and version control diffs that are more clear.
                    // Many teams like to have multiline be 'always'. There is no clear consensus on this rule but the
                    // internal MS JavaScript coding standard does discourage it.
        "typedef-whitespace": false,
        "whitespace": [true, "check-branch", "check-decl", "check-operator", "check-separator", "check-type"],

        /**
         * Controversial/Configurable rules.
         */
        "ban": false,                // only enable this if you have some code pattern that you want to ban
        "ban-types": true,
        "cyclomatic-complexity": true,
        "deprecation": false, // deprecated APIs are sometimes unavoidable
        "file-header": false,  // enable this rule only if you are legally required to add a file header
        "import-blacklist": false,  // enable and configure this as you desire
        "interface-over-type-literal": false,  // there are plenty of reasons to prefer interfaces
        "no-angle-bracket-type-assertion": false,  // pick either type-cast format and use it consistently
        "no-inferred-empty-object-type": false,  // if the compiler is satisfied then this is probably not an issue
        "no-internal-module": false, // only enable this if you are not using internal modules
        "no-magic-numbers": false,  // by default it will find too many false positives
        "no-mergeable-namespace": false,  // your project may require mergeable namespaces
        "no-namespace": false,       // only enable this if you are not using modules/namespaces
        "no-reference": true,        // in general you should use a module system and not /// reference imports
        "no-unexternalized-strings": false, // the VS Code team has a specific localization process that this rule enforces
        "object-literal-shorthand": false,  // object-literal-shorthand offers an abbreviation not an abstraction
        "prefer-conditional-expression": false, // unnecessarily strict
        "prefer-switch": false, // more of a style preference
        "prefer-type-cast": true,   // pick either type-cast format and use it consistently
        "return-undefined": false, // this actually affect the readability of the code
        "space-before-function-paren": false,   // turn this on if this is really your coding standard

        /**
         * Deprecated rules.  The following rules are deprecated for various reasons.
         */
        "missing-optional-annotation": false,  // now supported by TypeScript compiler
        "no-duplicate-case": false,
        "no-duplicate-parameter-names": false, // now supported by TypeScript compiler
        "no-empty-interfaces": false, // use tslint no-empty-interface rule instead
        "no-missing-visibility-modifiers": false, // use tslint member-access rule instead
        "no-multiple-var-decl": false,         // use tslint one-variable-per-declaration rule instead
        "no-stateless-class": false,
        "no-switch-case-fall-through": false,  // now supported by TypeScript compiler
        "no-var-self": false,
        "react-tsx-curly-spacing": false,
        "typeof-compare": false,               // the valid-typeof rule is currently superior to this version
        "valid-typeof": false,
    }
};
<|endoftext|>


<commit_before>/**
 * These rule settings are a broad, general recommendation for a good default configuration.
 * This file is exported in the npm/nuget package as ./tslint.json.
 */
module.exports = {
    'rules': {
        /**
         * Security Rules. The following rules should be turned on because they find security issues
         * or are recommended in the Microsoft Secure Development Lifecycle (SDL)
         */
        'function-constructor': true,
        'insecure-random': true,
        'no-banned-terms': true,
        'no-cookies': true,
        'no-delete-expression': true,
        'no-disable-auto-sanitization': true,
        'no-document-domain': true,
        'no-document-write': true,
        'no-eval': true,
        'no-exec-script': true,
        'no-function-constructor-with-string-args': false, // use tslint function-constructor rule intsead
        'no-http-string': [true, 'http://www.example.com/?.*', 'http://localhost:?.*'],
        'no-inner-html': true,
        'no-octal-literal': true,
        'no-string-based-set-immediate': true,
        'no-string-based-set-interval': true,
        'no-string-based-set-timeout': true,
        'non-literal-fs-path': true,
        'non-literal-require': true,
        'possible-timing-attack': true,
        'react-anchor-blank-noopener': true,
        'react-iframe-missing-sandbox': true,
        'react-no-dangerous-html': true,

        /**
         * Common Bugs and Correctness. The following rules should be turned on because they find
         * common bug patterns in the code or enforce type safety.
         */
        'await-promise': true,
        'forin': true,
        'increment-decrement': true,
        'jquery-deferred-must-complete': true,
        'label-position': true,
        'match-default-export-name': true,
        'mocha-avoid-only': true,
        'mocha-no-side-effect-code': true,
        'no-any': true,
        'no-arg': true,
        'no-backbone-get-set-outside-model': true,
        'no-bitwise': true,
        'no-conditional-assignment': true,
        'no-console': [true, 'debug', 'info', 'error', 'log', 'time', 'timeEnd', 'trace'],
        'no-constant-condition': true,
        'no-control-regex': true,
        'no-debugger': true,
        'no-default-import': false,
        'no-duplicate-super': true,
        'no-duplicate-switch-case': true,
        'no-duplicate-variable': true,
        'no-empty': true,
        'no-floating-promises': true,
        'no-for-in-array': true,
        'no-implicit-dependencies': true,
        'no-import-side-effect': true,
        'no-increment-decrement': false, // use tslint increment-decrement rule instead
        'no-invalid-regexp': true,
        'no-invalid-template-strings': true,
        'no-invalid-this': true,
        'no-jquery-raw-elements': true,
        'no-misused-new': true,
        'no-non-null-assertion': true,
        'no-object-literal-type-assertion': true,
        'no-parameter-reassignment': true,
        'no-reference-import': true,
        'no-regex-spaces': true,
        'no-sparse-arrays': true,
        'no-string-literal': true,
        'no-string-throw': true,
        'no-submodule-imports': true,
        'no-unnecessary-bind': false, // use tslint unnecessary-bind rule instead
        'no-unnecessary-callback-wrapper': true,
        'no-unnecessary-initializer': true,
        'no-unnecessary-override': true,
        'no-unsafe-any': true,
        'no-unsafe-finally': true,
        'no-unused-expression': true,
        'no-use-before-declare': true,
        'no-with-statement': true,
        'promise-function-async': true,
        'promise-must-complete': true,
        'radix': true,
        'react-this-binding-issue': true,
        'react-unused-props-and-state': true,
        'restrict-plus-operands': true, // the plus operand should really only be used for strings and numbers
        'strict-boolean-expressions': true,
        'switch-default': true,
        'switch-final-break': true,
        'triple-equals': [true, 'allow-null-check'],
        'unnecessary-bind': true,
        'unnecessary-constructor': true,
        'use-isnan': true,
        'use-named-parameter': true,
        'use-simple-attributes': true,

        /**
         * Code Clarity. The following rules should be turned on because they make the code
         * generally more clear to the reader.
         */
        'adjacent-overload-signatures': true,
        'array-type': [true, 'array'],
        'arrow-parens': false, // for simple functions the parens on arrow functions are not needed
        'ban-comma-operator': true, // possibly controversial
        'binary-expression-operand-order': true,
        'callable-types': true,
        'chai-prefer-contains-to-index-of': true,
        'chai-vague-errors': true,
        'class-name': true,
        'comment-format': true,
        'comment-type': false,
        'completed-docs': [true, 'classes'],
        'export-name': true,
        'file-name-casing': true,
        'function-name': true,
        'import-name': true,
        'informative-docs': true,
        'interface-name': true,
        'jsdoc-format': true,
        'max-classes-per-file': [true, 3], // we generally recommend making one public class per file
        'max-file-line-count': true,
        'max-func-body-length': [true, 100, { 'ignore-parameters-to-function-regex': '^describe$' }],
        'max-line-length': [true, 140],
        'member-access': true,
        'member-ordering': [true, { 'order': 'fields-first' }],
        'mocha-unneeded-done': true,
        'new-parens': true,
        'newline-per-chained-call': true,
        'no-construct': true,
        'no-default-export': true,
        'no-duplicate-imports': true,
        'no-dynamic-delete': true,
        'no-empty-interface': true,
        'no-for-in': true,
        'no-function-expression': true,
        'no-inferrable-types': false, // turn no-inferrable-types off in order to make the code consistent in its use of type decorations
        'no-multiline-string': false,
        'no-null-keyword': true,
        'no-parameter-properties': true,
        'no-redundant-jsdoc': true,
        'no-relative-imports': true,
        'no-require-imports': true,
        'no-return-await': true,
        'no-shadowed-variable': true,
        'no-suspicious-comment': true,
        'no-this-assignment': true,
        'no-typeof-undefined': true,
        'no-unnecessary-field-initialization': true,
        'no-unnecessary-local-variable': true,
        'no-unnecessary-qualifier': true,
        'no-unnecessary-type-assertion': true,
        'no-unsupported-browser-code': true,
        'no-useless-files': true,
        'no-var-keyword': true,
        'no-var-requires': true,
        'no-void-expression': true,
        'number-literal-format': true,
        'object-literal-sort-keys': false, // turn object-literal-sort-keys off and sort keys in a meaningful manner
        'one-variable-per-declaration': true,
        'only-arrow-functions': false, // there are many valid reasons to declare a function
        'ordered-imports': true,
        'prefer-array-literal': true,
        'prefer-const': true,
        'prefer-for-of': true,
        'prefer-method-signature': true,
        'prefer-object-spread': true,
        'prefer-readonly': true,
        'prefer-template': true,
        'prefer-while': true,
        'type-literal-delimiter': true,
        'typedef': [true, 'call-signature', 'arrow-call-signature', 'parameter', 'arrow-parameter', 'property-declaration', 'variable-declaration', 'member-variable-declaration'],
        'underscore-consistent-invocation': true,
        'unified-signatures': true,
        'use-default-type-parameter': true,
        'variable-name': true,

        /**
         * Accessibility. The following rules should be turned on to guarantee the best user
         * experience for keyboard and screen reader users.
         */
        'react-a11y-anchors': true,
        'react-a11y-aria-unsupported-elements': true,
        'react-a11y-event-has-role': true,
        'react-a11y-image-button-has-alt': true,
        'react-a11y-img-has-alt': true,
        'react-a11y-input-elements': true,
        'react-a11y-lang': true,
        'react-a11y-meta': true,
        'react-a11y-no-onchange': true,
        'react-a11y-props': true,
        'react-a11y-proptypes': true,
        'react-a11y-required': true,
        'react-a11y-role': true,
        'react-a11y-role-has-required-aria-props': true,
        'react-a11y-role-supports-aria-props': true,
        'react-a11y-tabindex-no-positive': true,
        'react-a11y-titles': true,

        /**
         * Whitespace related rules. The only recommended whitespace strategy is to pick a single format and
         * be consistent.
         */
        'align': [true, 'parameters', 'arguments', 'statements'],
        'curly': true,
        'encoding': true,
        'eofline': true,
        'import-spacing': true,
        'indent': [true, 'spaces'],
        'linebreak-style': true,
        'newline-before-return': true,
        'no-consecutive-blank-lines': true,
        'no-empty-line-after-opening-brace': false,
        'no-irregular-whitespace': true,
        'no-single-line-block-comment': true,
        'no-trailing-whitespace': true,
        'no-unnecessary-semicolons': true,
        'object-literal-key-quotes': [true, 'as-needed'],
        'one-line': [true, 'check-open-brace', 'check-catch', 'check-else', 'check-whitespace'],
        'quotemark': [true, 'single'],
        'semicolon': [true, 'always'],
        'space-within-parens': true,
        'trailing-comma': [true, { 'singleline': 'never', 'multiline': 'never' }], // forcing trailing commas for multi-line
                    // lists results in lists that are easier to reorder and version control diffs that are more clear.
                    // Many teams like to have multiline be 'always'. There is no clear consensus on this rule but the
                    // internal MS JavaScript coding standard does discourage it.
        'typedef-whitespace': false,
        'whitespace': [true, 'check-branch', 'check-decl', 'check-operator', 'check-separator', 'check-type'],

        /**
         * Controversial/Configurable rules.
         */
        'ban': false, // only enable this if you have some code pattern that you want to ban
        'ban-ts-ignore': false,
        'ban-types': true,
        'cyclomatic-complexity': true,
        'deprecation': false, // deprecated APIs are sometimes unavoidable
        'file-header': false, // enable this rule only if you are legally required to add a file header
        'import-blacklist': false, // enable and configure this as you desire
        'interface-over-type-literal': false, // there are plenty of reasons to prefer interfaces
        'no-angle-bracket-type-assertion': false, // pick either type-cast format and use it consistently
        'no-inferred-empty-object-type': false, // if the compiler is satisfied then this is probably not an issue
        'no-internal-module': false, // only enable this if you are not using internal modules
        'no-magic-numbers': false, // by default it will find too many false positives
        'no-mergeable-namespace': false, // your project may require mergeable namespaces
        'no-namespace': false, // only enable this if you are not using modules/namespaces
        'no-reference': true, // in general you should use a module system and not /// reference imports
        'no-unexternalized-strings': false, // the VS Code team has a specific localization process that this rule enforces
        'object-literal-shorthand': false, // object-literal-shorthand offers an abbreviation not an abstraction
        'prefer-conditional-expression': false, // unnecessarily strict
        'prefer-switch': false, // more of a style preference
        'prefer-type-cast': true, // pick either type-cast format and use it consistently
        'return-undefined': false, // this actually affects the readability of the code
        'space-before-function-paren': false, // turn this on if this is really your coding standard

        /**
         * Deprecated rules.  The following rules are deprecated for various reasons.
         */
        'missing-jsdoc': false,
        'missing-optional-annotation': false, // now supported by TypeScript compiler
        'no-duplicate-case': false,
        'no-duplicate-parameter-names': false, // now supported by TypeScript compiler
        'no-empty-interfaces': false, // use tslint no-empty-interface rule instead
        'no-missing-visibility-modifiers': false, // use tslint member-access rule instead
        'no-multiple-var-decl': false, // use tslint one-variable-per-declaration rule instead
        'no-reserved-keywords': false,
        'no-stateless-class': false,
        'no-switch-case-fall-through': false, // now supported by TypeScript compiler
        'no-unnecessary-class': true,
        'no-var-self': false,
        'react-tsx-curly-spacing': false,
        'typeof-compare': false, // the valid-typeof rule is currently superior to this version
        'valid-typeof': false,
    }
};
<commit_msg>Added missing react-a11y-accessible-headings to recommended ruleset (#699)<commit_after>/**
 * These rule settings are a broad, general recommendation for a good default configuration.
 * This file is exported in the npm/nuget package as ./tslint.json.
 */
module.exports = {
    'rules': {
        /**
         * Security Rules. The following rules should be turned on because they find security issues
         * or are recommended in the Microsoft Secure Development Lifecycle (SDL)
         */
        'function-constructor': true,
        'insecure-random': true,
        'no-banned-terms': true,
        'no-cookies': true,
        'no-delete-expression': true,
        'no-disable-auto-sanitization': true,
        'no-document-domain': true,
        'no-document-write': true,
        'no-eval': true,
        'no-exec-script': true,
        'no-function-constructor-with-string-args': false, // use tslint function-constructor rule intsead
        'no-http-string': [true, 'http://www.example.com/?.*', 'http://localhost:?.*'],
        'no-inner-html': true,
        'no-octal-literal': true,
        'no-string-based-set-immediate': true,
        'no-string-based-set-interval': true,
        'no-string-based-set-timeout': true,
        'non-literal-fs-path': true,
        'non-literal-require': true,
        'possible-timing-attack': true,
        'react-anchor-blank-noopener': true,
        'react-iframe-missing-sandbox': true,
        'react-no-dangerous-html': true,

        /**
         * Common Bugs and Correctness. The following rules should be turned on because they find
         * common bug patterns in the code or enforce type safety.
         */
        'await-promise': true,
        'forin': true,
        'increment-decrement': true,
        'jquery-deferred-must-complete': true,
        'label-position': true,
        'match-default-export-name': true,
        'mocha-avoid-only': true,
        'mocha-no-side-effect-code': true,
        'no-any': true,
        'no-arg': true,
        'no-backbone-get-set-outside-model': true,
        'no-bitwise': true,
        'no-conditional-assignment': true,
        'no-console': [true, 'debug', 'info', 'error', 'log', 'time', 'timeEnd', 'trace'],
        'no-constant-condition': true,
        'no-control-regex': true,
        'no-debugger': true,
        'no-default-import': false,
        'no-duplicate-super': true,
        'no-duplicate-switch-case': true,
        'no-duplicate-variable': true,
        'no-empty': true,
        'no-floating-promises': true,
        'no-for-in-array': true,
        'no-implicit-dependencies': true,
        'no-import-side-effect': true,
        'no-increment-decrement': false, // use tslint increment-decrement rule instead
        'no-invalid-regexp': true,
        'no-invalid-template-strings': true,
        'no-invalid-this': true,
        'no-jquery-raw-elements': true,
        'no-misused-new': true,
        'no-non-null-assertion': true,
        'no-object-literal-type-assertion': true,
        'no-parameter-reassignment': true,
        'no-reference-import': true,
        'no-regex-spaces': true,
        'no-sparse-arrays': true,
        'no-string-literal': true,
        'no-string-throw': true,
        'no-submodule-imports': true,
        'no-unnecessary-bind': false, // use tslint unnecessary-bind rule instead
        'no-unnecessary-callback-wrapper': true,
        'no-unnecessary-initializer': true,
        'no-unnecessary-override': true,
        'no-unsafe-any': true,
        'no-unsafe-finally': true,
        'no-unused-expression': true,
        'no-use-before-declare': true,
        'no-with-statement': true,
        'promise-function-async': true,
        'promise-must-complete': true,
        'radix': true,
        'react-this-binding-issue': true,
        'react-unused-props-and-state': true,
        'restrict-plus-operands': true, // the plus operand should really only be used for strings and numbers
        'strict-boolean-expressions': true,
        'switch-default': true,
        'switch-final-break': true,
        'triple-equals': [true, 'allow-null-check'],
        'unnecessary-bind': true,
        'unnecessary-constructor': true,
        'use-isnan': true,
        'use-named-parameter': true,
        'use-simple-attributes': true,

        /**
         * Code Clarity. The following rules should be turned on because they make the code
         * generally more clear to the reader.
         */
        'adjacent-overload-signatures': true,
        'array-type': [true, 'array'],
        'arrow-parens': false, // for simple functions the parens on arrow functions are not needed
        'ban-comma-operator': true, // possibly controversial
        'binary-expression-operand-order': true,
        'callable-types': true,
        'chai-prefer-contains-to-index-of': true,
        'chai-vague-errors': true,
        'class-name': true,
        'comment-format': true,
        'comment-type': false,
        'completed-docs': [true, 'classes'],
        'export-name': true,
        'file-name-casing': true,
        'function-name': true,
        'import-name': true,
        'informative-docs': true,
        'interface-name': true,
        'jsdoc-format': true,
        'max-classes-per-file': [true, 3], // we generally recommend making one public class per file
        'max-file-line-count': true,
        'max-func-body-length': [true, 100, { 'ignore-parameters-to-function-regex': '^describe$' }],
        'max-line-length': [true, 140],
        'member-access': true,
        'member-ordering': [true, { 'order': 'fields-first' }],
        'mocha-unneeded-done': true,
        'new-parens': true,
        'newline-per-chained-call': true,
        'no-construct': true,
        'no-default-export': true,
        'no-duplicate-imports': true,
        'no-dynamic-delete': true,
        'no-empty-interface': true,
        'no-for-in': true,
        'no-function-expression': true,
        'no-inferrable-types': false, // turn no-inferrable-types off in order to make the code consistent in its use of type decorations
        'no-multiline-string': false,
        'no-null-keyword': true,
        'no-parameter-properties': true,
        'no-redundant-jsdoc': true,
        'no-relative-imports': true,
        'no-require-imports': true,
        'no-return-await': true,
        'no-shadowed-variable': true,
        'no-suspicious-comment': true,
        'no-this-assignment': true,
        'no-typeof-undefined': true,
        'no-unnecessary-field-initialization': true,
        'no-unnecessary-local-variable': true,
        'no-unnecessary-qualifier': true,
        'no-unnecessary-type-assertion': true,
        'no-unsupported-browser-code': true,
        'no-useless-files': true,
        'no-var-keyword': true,
        'no-var-requires': true,
        'no-void-expression': true,
        'number-literal-format': true,
        'object-literal-sort-keys': false, // turn object-literal-sort-keys off and sort keys in a meaningful manner
        'one-variable-per-declaration': true,
        'only-arrow-functions': false, // there are many valid reasons to declare a function
        'ordered-imports': true,
        'prefer-array-literal': true,
        'prefer-const': true,
        'prefer-for-of': true,
        'prefer-method-signature': true,
        'prefer-object-spread': true,
        'prefer-readonly': true,
        'prefer-template': true,
        'prefer-while': true,
        'type-literal-delimiter': true,
        'typedef': [true, 'call-signature', 'arrow-call-signature', 'parameter', 'arrow-parameter', 'property-declaration', 'variable-declaration', 'member-variable-declaration'],
        'underscore-consistent-invocation': true,
        'unified-signatures': true,
        'use-default-type-parameter': true,
        'variable-name': true,

        /**
         * Accessibility. The following rules should be turned on to guarantee the best user
         * experience for keyboard and screen reader users.
         */
        'react-a11y-accessible-headings': true,
        'react-a11y-anchors': true,
        'react-a11y-aria-unsupported-elements': true,
        'react-a11y-event-has-role': true,
        'react-a11y-image-button-has-alt': true,
        'react-a11y-img-has-alt': true,
        'react-a11y-input-elements': true,
        'react-a11y-lang': true,
        'react-a11y-meta': true,
        'react-a11y-no-onchange': true,
        'react-a11y-props': true,
        'react-a11y-proptypes': true,
        'react-a11y-required': true,
        'react-a11y-role': true,
        'react-a11y-role-has-required-aria-props': true,
        'react-a11y-role-supports-aria-props': true,
        'react-a11y-tabindex-no-positive': true,
        'react-a11y-titles': true,

        /**
         * Whitespace related rules. The only recommended whitespace strategy is to pick a single format and
         * be consistent.
         */
        'align': [true, 'parameters', 'arguments', 'statements'],
        'curly': true,
        'encoding': true,
        'eofline': true,
        'import-spacing': true,
        'indent': [true, 'spaces'],
        'linebreak-style': true,
        'newline-before-return': true,
        'no-consecutive-blank-lines': true,
        'no-empty-line-after-opening-brace': false,
        'no-irregular-whitespace': true,
        'no-single-line-block-comment': true,
        'no-trailing-whitespace': true,
        'no-unnecessary-semicolons': true,
        'object-literal-key-quotes': [true, 'as-needed'],
        'one-line': [true, 'check-open-brace', 'check-catch', 'check-else', 'check-whitespace'],
        'quotemark': [true, 'single'],
        'semicolon': [true, 'always'],
        'space-within-parens': true,
        'trailing-comma': [true, { 'singleline': 'never', 'multiline': 'never' }], // forcing trailing commas for multi-line
                    // lists results in lists that are easier to reorder and version control diffs that are more clear.
                    // Many teams like to have multiline be 'always'. There is no clear consensus on this rule but the
                    // internal MS JavaScript coding standard does discourage it.
        'typedef-whitespace': false,
        'whitespace': [true, 'check-branch', 'check-decl', 'check-operator', 'check-separator', 'check-type'],

        /**
         * Controversial/Configurable rules.
         */
        'ban': false, // only enable this if you have some code pattern that you want to ban
        'ban-ts-ignore': false,
        'ban-types': true,
        'cyclomatic-complexity': true,
        'deprecation': false, // deprecated APIs are sometimes unavoidable
        'file-header': false, // enable this rule only if you are legally required to add a file header
        'import-blacklist': false, // enable and configure this as you desire
        'interface-over-type-literal': false, // there are plenty of reasons to prefer interfaces
        'no-angle-bracket-type-assertion': false, // pick either type-cast format and use it consistently
        'no-inferred-empty-object-type': false, // if the compiler is satisfied then this is probably not an issue
        'no-internal-module': false, // only enable this if you are not using internal modules
        'no-magic-numbers': false, // by default it will find too many false positives
        'no-mergeable-namespace': false, // your project may require mergeable namespaces
        'no-namespace': false, // only enable this if you are not using modules/namespaces
        'no-reference': true, // in general you should use a module system and not /// reference imports
        'no-unexternalized-strings': false, // the VS Code team has a specific localization process that this rule enforces
        'object-literal-shorthand': false, // object-literal-shorthand offers an abbreviation not an abstraction
        'prefer-conditional-expression': false, // unnecessarily strict
        'prefer-switch': false, // more of a style preference
        'prefer-type-cast': true, // pick either type-cast format and use it consistently
        'return-undefined': false, // this actually affects the readability of the code
        'space-before-function-paren': false, // turn this on if this is really your coding standard

        /**
         * Deprecated rules.  The following rules are deprecated for various reasons.
         */
        'missing-jsdoc': false,
        'missing-optional-annotation': false, // now supported by TypeScript compiler
        'no-duplicate-case': false,
        'no-duplicate-parameter-names': false, // now supported by TypeScript compiler
        'no-empty-interfaces': false, // use tslint no-empty-interface rule instead
        'no-missing-visibility-modifiers': false, // use tslint member-access rule instead
        'no-multiple-var-decl': false, // use tslint one-variable-per-declaration rule instead
        'no-reserved-keywords': false,
        'no-stateless-class': false,
        'no-switch-case-fall-through': false, // now supported by TypeScript compiler
        'no-unnecessary-class': true,
        'no-var-self': false,
        'react-tsx-curly-spacing': false,
        'typeof-compare': false, // the valid-typeof rule is currently superior to this version
        'valid-typeof': false,
    }
};
<|endoftext|>


<commit_before>/**
 * A class that encapsulates the web services needed by the Node JS wrapper.
 */
var HttpHelper = require( './httpHelper' ).HttpHelper;

var httpHelper = null;
var deviceSecret = 'nodejs';
var apiSecret = '';
var applicationToken = '';

/**
 *
 * @param secret - A secret identifier for an application obtained by the user during the registration process.
 *                 Without this, the app will not have access to Thingdom.
 * @constructor
 */
exports.WebService = function ( secret ) {
    httpHelper = new HttpHelper();
    apiSecret = secret;
};

/**
 * Ping Thingdom.
 */
exports.WebService.prototype.pingServer = function ( callback ) {
    httpHelper.getData( 'ping', function ( result ) {
        callback( result );
    } );
};

/**
 * Authorize this application by sending the application secret to Thingdom.  If valid, Thingdom will send back a token
 * which must be used for subsequent communications.
 *
 * @param callback - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.getAuthorization = function( callback ) {
    //
    // Authorization request object.
    //
    var data = {
        api_secret: apiSecret,
        device_secret: deviceSecret
    };
    //
    // Post authorization request.  Save local copy of application token.
    //
    httpHelper.postData( 'token', data, function( result ) {
        applicationToken = result.application_token;
        callback( result );
    });
}

/**
 * Retrieve a thing, if it doesn't exist then add it.
 *
 * @param thing     - The thing to get/add.
 * @param callback  - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.addThing = function( thing, callback ) {
    //
    // Thing request object.
    //
    var data = {
        token       : applicationToken,
        name        : thing.name,
        display_name: thing.displayName
    };
    //
    // Only post product type if it exists.
    //
    if( thing.productType.length > 0 ) {
        data.product_type = thing.productType;
    }
    //
    // Post thing request.
    //
    httpHelper.postData( 'thing', data, function( result ) {
        callback( result );
    });
};

/**
 * Update a status variable associated with a Thing.
 *
 * @param thing         - The Thing for which status is being updated.
 * @param statusArray   - An array of status updates.
 * @param callback      - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.addStatus = function( thing, statusArray, callback ) {
    //
    // Status request object.
    //
    var data = {
        token       : applicationToken,
        thing_id    : thing.id,
        id          : null,
        status_array: statusArray
    };
    //
    // Post status request.
    //
    httpHelper.postData( 'status', data, function( result ) {
        callback( result );
    });
};

/**
 * Add a feed that is associated with a Thing.
 *
 * @param thing         - The Thing associated with the feed.
 * @param category      - The feed category which is defined during the registration process.
 * @param message       - A feed message.
 * @param feedOption    - (optional) An additional option/object to attach to the feed:  icon, image, or progress indicator.
 * @param callback      - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.addFeed = function( thing, category, message, feedOption, callback ) {
    //
    // Feed request object.
    //
    var data = {
        token        : applicationToken,
        thing_id     : thing.id,
        feed_category: category,
        message      : message,
        options      : feedOption
    };
    //
    // Post feed request.
    //
    httpHelper.postData( 'feed', data, function( result ) {
        callback( result );
    });

};<commit_msg>Standardizing device secret across all libraries.<commit_after>/**
 * A class that encapsulates the web services needed by the Node JS wrapper.
 */
var HttpHelper = require( './httpHelper' ).HttpHelper;

var httpHelper = null;
var deviceSecret = 'none';
var apiSecret = '';
var applicationToken = '';

/**
 *
 * @param secret - A secret identifier for an application obtained by the user during the registration process.
 *                 Without this, the app will not have access to Thingdom.
 * @constructor
 */
exports.WebService = function ( secret ) {
    httpHelper = new HttpHelper();
    apiSecret = secret;
};

/**
 * Ping Thingdom.
 */
exports.WebService.prototype.pingServer = function ( callback ) {
    httpHelper.getData( 'ping', function ( result ) {
        callback( result );
    } );
};

/**
 * Authorize this application by sending the application secret to Thingdom.  If valid, Thingdom will send back a token
 * which must be used for subsequent communications.
 *
 * @param callback - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.getAuthorization = function( callback ) {
    //
    // Authorization request object.
    //
    var data = {
        api_secret: apiSecret,
        device_secret: deviceSecret
    };
    //
    // Post authorization request.  Save local copy of application token.
    //
    httpHelper.postData( 'token', data, function( result ) {
        applicationToken = result.application_token;
        callback( result );
    });
}

/**
 * Retrieve a thing, if it doesn't exist then add it.
 *
 * @param thing     - The thing to get/add.
 * @param callback  - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.addThing = function( thing, callback ) {
    //
    // Thing request object.
    //
    var data = {
        token       : applicationToken,
        name        : thing.name,
        display_name: thing.displayName
    };
    //
    // Only post product type if it exists.
    //
    if( thing.productType.length > 0 ) {
        data.product_type = thing.productType;
    }
    //
    // Post thing request.
    //
    httpHelper.postData( 'thing', data, function( result ) {
        callback( result );
    });
};

/**
 * Update a status variable associated with a Thing.
 *
 * @param thing         - The Thing for which status is being updated.
 * @param statusArray   - An array of status updates.
 * @param callback      - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.addStatus = function( thing, statusArray, callback ) {
    //
    // Status request object.
    //
    var data = {
        token       : applicationToken,
        thing_id    : thing.id,
        id          : null,
        status_array: statusArray
    };
    //
    // Post status request.
    //
    httpHelper.postData( 'status', data, function( result ) {
        callback( result );
    });
};

/**
 * Add a feed that is associated with a Thing.
 *
 * @param thing         - The Thing associated with the feed.
 * @param category      - The feed category which is defined during the registration process.
 * @param message       - A feed message.
 * @param feedOption    - (optional) An additional option/object to attach to the feed:  icon, image, or progress indicator.
 * @param callback      - A callback function that gets invoked with the request results.
 */
exports.WebService.prototype.addFeed = function( thing, category, message, feedOption, callback ) {
    //
    // Feed request object.
    //
    var data = {
        token        : applicationToken,
        thing_id     : thing.id,
        feed_category: category,
        message      : message,
        options      : feedOption
    };
    //
    // Post feed request.
    //
    httpHelper.postData( 'feed', data, function( result ) {
        callback( result );
    });

};
<|endoftext|>


<commit_before>export const flatten = function(data) {
  var result = {};
  function recurse (cur, prop) {

    if (Object.prototype.toString.call(cur) !== "[object Object]") {
      result[prop] = cur;
    } else if (Array.isArray(cur)) {
      for(var i=0, l=cur.length; i<l; i++)
        recurse(cur[i], prop + "[" + i + "]");
      if (l == 0)
        result[prop] = [];
    } else {
      var isEmpty = true;
      for (var p in cur) {
        isEmpty = false;
        recurse(cur[p], prop ? prop+"."+p : p);
      }
      if (isEmpty && prop)
        result[prop] = {};
    }
  }
  recurse(data, "");
  return result;
}

export const editorHasContent = (content) => {
  console.log("editorHasContent is called", content)
  return (
      content &&
      content.length &&
      content[0] &&
      content[0].cells[0] &&
      content[0].cells[0].length &&
      content[0].cells[0].content &&
      content[0].cells[0].content.state &&
      content[0].cells[0].content.state.serialized &&
      content[0].cells[0].content.state.serialized.nodes &&
      content[0].cells[0].content.state.serialized.nodes.length &&
      content[0].cells[0].content.state.serialized.nodes[0] &&
      content[0].cells[0].content.state.serialized.nodes[0].length &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes.length &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes[0] &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes[0].text
      )
}

export const contentIsEmpty = (content) => {
  console.log("Content Is Empty called", content);
  return !(content && content.state && content.state.serialized && content.state.serialized.nodes && content.state.serialized.nodes.length == 1 && content.state.serialized.nodes[0].nodes && content.state.serialized.nodes[0].nodes.length == 1 && content.state.serialized.nodes[0].nodes[0].text !== "")
}

export const isEmpty = ({ cells, rows,
  layout: { plugin: { name: layout } = {} } = {},
  content: { plugin: { name: content } = {} } = {}
}) =>
  !(cells || []).filter(emptyFilter).length &&
  !(rows || []).filter(emptyFilter).length &&
  !content || contentIsEmpty(content) &&
  !(layout && (rows || []).filter(emptyFilter).length)

export const emptyFilter = (state) => !isEmpty(state)
<commit_msg>removed console log<commit_after>export const flatten = function(data) {
  var result = {};
  function recurse (cur, prop) {

    if (Object.prototype.toString.call(cur) !== "[object Object]") {
      result[prop] = cur;
    } else if (Array.isArray(cur)) {
      for(var i=0, l=cur.length; i<l; i++)
        recurse(cur[i], prop + "[" + i + "]");
      if (l == 0)
        result[prop] = [];
    } else {
      var isEmpty = true;
      for (var p in cur) {
        isEmpty = false;
        recurse(cur[p], prop ? prop+"."+p : p);
      }
      if (isEmpty && prop)
        result[prop] = {};
    }
  }
  recurse(data, "");
  return result;
}

export const editorHasContent = (content) => {
  return (
      content &&
      content.length &&
      content[0] &&
      content[0].cells[0] &&
      content[0].cells[0].length &&
      content[0].cells[0].content &&
      content[0].cells[0].content.state &&
      content[0].cells[0].content.state.serialized &&
      content[0].cells[0].content.state.serialized.nodes &&
      content[0].cells[0].content.state.serialized.nodes.length &&
      content[0].cells[0].content.state.serialized.nodes[0] &&
      content[0].cells[0].content.state.serialized.nodes[0].length &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes.length &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes[0] &&
      content[0].cells[0].content.state.serialized.nodes[0].nodes[0].text
      )
}

export const contentIsEmpty = (content) => {
  console.log("Content Is Empty called", content);
  return !(content && content.state && content.state.serialized && content.state.serialized.nodes && content.state.serialized.nodes.length == 1 && content.state.serialized.nodes[0].nodes && content.state.serialized.nodes[0].nodes.length == 1 && content.state.serialized.nodes[0].nodes[0].text !== "")
}

export const isEmpty = ({ cells, rows,
  layout: { plugin: { name: layout } = {} } = {},
  content: { plugin: { name: content } = {} } = {}
}) =>
  !(cells || []).filter(emptyFilter).length &&
  !(rows || []).filter(emptyFilter).length &&
  !content || contentIsEmpty(content) &&
  !(layout && (rows || []).filter(emptyFilter).length)

export const emptyFilter = (state) => !isEmpty(state)
<|endoftext|>


<commit_before>(function () {
  var pending_invalidate = [];
  var next_id = 1;

  var Context = function () {
    // Each context has a unique number. You can use this to avoid
    // storing multiple copies of the same context in your
    // invalidation list. The id is an integer >= 1.
    this.id = next_id++;
    this._callbacks = [];
    this._invalidated = false;
  };
  Context.current = null;

  _.extend(Context.prototype, {
    run: function (f) {
      var previous = Context.current;
      Context.current = this;
      try { var ret = f(); }
      finally { Context.current = previous; }
      return ret;
    },

    // we specifically guarantee that this doesn't call any
    // invalidation functions (before returning) -- it just marks the
    // context as invalidated.
    invalidate: function () {
      if (!this._invalidated) {
        this._invalidated = true;
        // If this is first invalidation, schedule a flush.
        // We may be inside a flush already, in which case this
        // is unnecessary but harmless.
        if (!pending_invalidate.length)
          setTimeout(Meteor.flush, 0);
        pending_invalidate.push(this);
      }
    },

    // calls f immediately if this context was already
    // invalidated. receives one argument, the context.
    on_invalidate: function (f) {
      if (this._invalidated)
        f(this);
      else
        this._callbacks.push(f);
    }
  });

  _.extend(Meteor, {
    // XXX specify what happens when flush calls flush. eg, flushing
    // causes a dom update, which causes onblur, which invokes an
    // event handler that calls flush. it's probably an exception --
    // no flushing from inside onblur. can also imagine routing onblur
    // through settimeout(0), which is probably what the user wants.
    // https://app.asana.com/0/159908330244/385138233856
    flush: function () {
      while (pending_invalidate.length) {
        var pending = pending_invalidate;
        pending_invalidate = [];

        _.each(pending, function (ctx) {
          _.each(ctx._callbacks, function (f) {
            f(ctx); // XXX wrap in try?
          });
          delete ctx._callbacks; // maybe help the GC
        });
      }
    },

    deps: {
      Context: Context
    }
  });
})();
<commit_msg>Simpler try/finally in deps<commit_after>(function () {
  var pending_invalidate = [];
  var next_id = 1;

  var Context = function () {
    // Each context has a unique number. You can use this to avoid
    // storing multiple copies of the same context in your
    // invalidation list. The id is an integer >= 1.
    this.id = next_id++;
    this._callbacks = [];
    this._invalidated = false;
  };
  Context.current = null;

  _.extend(Context.prototype, {
    run: function (f) {
      var previous = Context.current;
      Context.current = this;
      try { return f(); }
      finally { Context.current = previous; }
    },

    // we specifically guarantee that this doesn't call any
    // invalidation functions (before returning) -- it just marks the
    // context as invalidated.
    invalidate: function () {
      if (!this._invalidated) {
        this._invalidated = true;
        // If this is first invalidation, schedule a flush.
        // We may be inside a flush already, in which case this
        // is unnecessary but harmless.
        if (!pending_invalidate.length)
          setTimeout(Meteor.flush, 0);
        pending_invalidate.push(this);
      }
    },

    // calls f immediately if this context was already
    // invalidated. receives one argument, the context.
    on_invalidate: function (f) {
      if (this._invalidated)
        f(this);
      else
        this._callbacks.push(f);
    }
  });

  _.extend(Meteor, {
    // XXX specify what happens when flush calls flush. eg, flushing
    // causes a dom update, which causes onblur, which invokes an
    // event handler that calls flush. it's probably an exception --
    // no flushing from inside onblur. can also imagine routing onblur
    // through settimeout(0), which is probably what the user wants.
    // https://app.asana.com/0/159908330244/385138233856
    flush: function () {
      while (pending_invalidate.length) {
        var pending = pending_invalidate;
        pending_invalidate = [];

        _.each(pending, function (ctx) {
          _.each(ctx._callbacks, function (f) {
            f(ctx); // XXX wrap in try?
          });
          delete ctx._callbacks; // maybe help the GC
        });
      }
    },

    deps: {
      Context: Context
    }
  });
})();
<|endoftext|>


<commit_before>'use strict';

const slug = require('limax');
const linkifyHtml = require('linkifyjs/html');
const cdn = require('dumonda-me-server-lib').cdn;
const time = require('dumonda-me-server-lib').time;
const db = requireDb();

const PAGE_SIZE = 20;
const FOUR_WEEKS = 2419200;
const WEEK = 604800;

const getFeedResponse = async function (commitments) {
    for (let commitment of commitments) {
        commitment.commitmentSlug = slug(commitment.title);
        commitment.imageUrl = cdn.getPublicUrl(`commitment/${commitment.commitmentId}/460x460/title.jpg`);
        if (commitment.modified) {
            commitment.imageUrl = commitment.imageUrl + `?v=${commitment.modified}`
        }
        if (commitment.description) {
            commitment.descriptionHtml = linkifyHtml(commitment.description);
        }
        if (commitment.creator.privacyMode === 'public' ||
            (commitment.creator.privacyMode === 'publicEl' && userId !== null) ||
            (commitment.creator.privacyMode === 'onlyContact' && commitment.creatorTrustUser)) {
            commitment.user = {
                isAnonymous: false,
                userId: commitment.creator.userId,
                name: commitment.creator.name,
                slug: slug(commitment.creator.name),
                userImage: await cdn.getSignedUrl(`profileImage/${commitment.creator.userId}/thumbnail.jpg`),
                userImagePreview: await cdn.getSignedUrl(`profileImage/${commitment.creator.userId}/profilePreview.jpg`),
                isLoggedInUser: commitment.isLoggedInUser,
                isTrustUser: commitment.isTrustUser
            };
        } else {
            commitment.user = {
                isAnonymous: true,
                userImage: await cdn.getSignedUrl(`profileImage/default/thumbnail.jpg`),
                userImagePreview: await cdn.getSignedUrl(`profileImage/default/profilePreview.jpg`)
            };
        }
        delete commitment.creator;
        delete commitment.creatorTrustUser;
    }
    return commitments;
};

const getTrustCircleFilter = function (trustCircle) {
    let query = db.cypher().optionalMatch(`(commitment)<-[watches:WATCH]-(watcher:User)`);
    if (trustCircle) {
        query.with(`creator, commitment, watches, watcher`)
            .where(`(creator)<-[:IS_CONTACT]-(:User {userId: {userId}}) OR
                    (watcher)<-[:IS_CONTACT]-(:User {userId: {userId}})`);
    }
    return query.getCommandString();
};

const getTopicFilter = function (topics) {
    if (topics) {
        return db.cypher().optionalMatch(`(commitment)<-[:TOPIC]-(topic:Topic)`)
            .optionalMatch(`(topic)<-[:SUB_TOPIC*]-(nextTopic:Topic)`)
            .with(`creator, commitment, topic, collect(nextTopic) AS nextTopic`)
            .where(`topic.topicId IN {topics} OR ANY (t IN nextTopic WHERE t.topicId IN {topics})`)
            .getCommandString();
    }
    return ''
};

const getRegionFilter = function (regions) {
    if (regions) {
        return db.cypher().optionalMatch(`(commitment)-[:BELONGS_TO_REGION]->(region:Region)`)
            .optionalMatch(`(region)<-[:SUB_REGION*]-(nextRegion:Region)`)
            .with(`creator, commitment, region, collect(nextRegion) AS nextRegion, score`)
            .where(`region.regionId IN {regions} OR ANY (r IN nextRegion WHERE r.regionId IN {regions})`)
            .getCommandString();
    }
    return ''
};

const getPeriodOfTimeFilterQuery = function (periodOfTime) {
    return db.cypher().with(`creator, commitment, watches`)
        .where(`watches.created > {${periodOfTime}}`)
        .getCommandString();
};

const getPeriodOfTimeFilter = function (periodOfTime) {
    if (periodOfTime === 'week') {
        return getPeriodOfTimeFilterQuery('oneWeek');
    } else if (periodOfTime === 'month') {
        return getPeriodOfTimeFilterQuery('fourWeeks');
    }
    return '';
};

const getMostPopularQuery = function (trustCircle, topics, periodOfTime) {
    return db.cypher()
        .match(`(creator:User)-[:IS_CREATOR]->(commitment:Commitment)`)
        .where(`commitment.language IN {languages}`)
        .addCommand(getTopicFilter(topics))
        .addCommand(getTrustCircleFilter(trustCircle))
        .addCommand(getPeriodOfTimeFilter(periodOfTime))
        .with(`creator, commitment, count(DISTINCT watches) AS score`)
};

const getTrustCircleFilterForNewest = function (trustCircle) {
    if (trustCircle) {
        return `AND (creator)<-[:IS_CONTACT]-(:User {userId: {userId}})`
    }
    return '';
};

const getOrderByTimeQuery = function (trustCircle, topics) {
    return db.cypher()
        .match(`(creator:User)-[:IS_CREATOR]->(commitment:Commitment)`)
        .where(`commitment.language IN {languages}${getTrustCircleFilterForNewest(trustCircle)}`)
        .addCommand(getTopicFilter(topics))
        .with(`creator, commitment, 0 AS score`)
};

const getStartQuery = function (order, trustCircle, topics, periodOfTime) {
    if (order === 'mostPopular') {
        return getMostPopularQuery(trustCircle, topics, periodOfTime);
    } else if (order === 'noQuestionLink') {
        return getOrderByTimeQuery(trustCircle, topics)
            .where(`NOT (commitment)<-[:COMMITMENT]->(:CommitmentAnswer)<-[:ANSWER]-(:Question)`);
    }
    return getOrderByTimeQuery(trustCircle, topics);
};

const getFeed = async function (userId, page, timestamp, order, periodOfTime, guiLanguage, languages, trustCircle,
                                topics, regions) {
    page = page * PAGE_SIZE;

    let response = await getStartQuery(order, trustCircle, topics, periodOfTime)
        .addCommand(getRegionFilter(regions))
        .optionalMatch(`(commitment)<-[watches:WATCH]-(:User)`)
        .optionalMatch(`(commitment)-[:BELONGS_TO_REGION]->(region:Region)`)
        .return(`creator, commitment.commitmentId AS commitmentId, commitment.title AS title,
                 commitment.created AS created, commitment.modified AS modified, commitment.description AS description,
                 'Commitment' AS type, count(DISTINCT watches) AS numberOfWatches, score,
                 creator.userId = {userId} AS isLoggedInUser, collect(DISTINCT region.${guiLanguage}) AS regions,
                 EXISTS((creator)-[:IS_CONTACT]->(:User {userId: {userId}})) AS creatorTrustUser,
                 EXISTS((creator)<-[:IS_CONTACT]-(:User {userId: {userId}})) AS isTrustUser,
                 EXISTS((commitment)<-[:IS_ADMIN]-(:User {userId: {userId}})) AS isAdmin,
                 EXISTS((commitment)<-[:WATCH]-(:User {userId: {userId}})) AS isWatchedByUser`)
        .orderBy(`score DESC, created DESC`)
        .skip(`{page}`).limit(`${PAGE_SIZE}`)
        .end({
            languages, userId, page, topics, regions, fourWeeks: time.getNowUtcTimestamp() - FOUR_WEEKS,
            oneWeek: time.getNowUtcTimestamp() - WEEK
        }).send();

    return {
        feed: await getFeedResponse(response), timestamp
    };
};

module.exports = {
    getFeed
};
<commit_msg>Added missing userId.<commit_after>'use strict';

const slug = require('limax');
const linkifyHtml = require('linkifyjs/html');
const cdn = require('dumonda-me-server-lib').cdn;
const time = require('dumonda-me-server-lib').time;
const db = requireDb();

const PAGE_SIZE = 20;
const FOUR_WEEKS = 2419200;
const WEEK = 604800;

const getFeedResponse = async function (commitments, userId) {
    for (let commitment of commitments) {
        commitment.commitmentSlug = slug(commitment.title);
        commitment.imageUrl = cdn.getPublicUrl(`commitment/${commitment.commitmentId}/460x460/title.jpg`);
        if (commitment.modified) {
            commitment.imageUrl = commitment.imageUrl + `?v=${commitment.modified}`
        }
        if (commitment.description) {
            commitment.descriptionHtml = linkifyHtml(commitment.description);
        }
        if (commitment.creator.privacyMode === 'public' ||
            (commitment.creator.privacyMode === 'publicEl' && userId !== null) ||
            (commitment.creator.privacyMode === 'onlyContact' && commitment.creatorTrustUser)) {
            commitment.user = {
                isAnonymous: false,
                userId: commitment.creator.userId,
                name: commitment.creator.name,
                slug: slug(commitment.creator.name),
                userImage: await cdn.getSignedUrl(`profileImage/${commitment.creator.userId}/thumbnail.jpg`),
                userImagePreview: await cdn.getSignedUrl(`profileImage/${commitment.creator.userId}/profilePreview.jpg`),
                isLoggedInUser: commitment.isLoggedInUser,
                isTrustUser: commitment.isTrustUser
            };
        } else {
            commitment.user = {
                isAnonymous: true,
                userImage: await cdn.getSignedUrl(`profileImage/default/thumbnail.jpg`),
                userImagePreview: await cdn.getSignedUrl(`profileImage/default/profilePreview.jpg`)
            };
        }
        delete commitment.creator;
        delete commitment.creatorTrustUser;
    }
    return commitments;
};

const getTrustCircleFilter = function (trustCircle) {
    let query = db.cypher().optionalMatch(`(commitment)<-[watches:WATCH]-(watcher:User)`);
    if (trustCircle) {
        query.with(`creator, commitment, watches, watcher`)
            .where(`(creator)<-[:IS_CONTACT]-(:User {userId: {userId}}) OR
                    (watcher)<-[:IS_CONTACT]-(:User {userId: {userId}})`);
    }
    return query.getCommandString();
};

const getTopicFilter = function (topics) {
    if (topics) {
        return db.cypher().optionalMatch(`(commitment)<-[:TOPIC]-(topic:Topic)`)
            .optionalMatch(`(topic)<-[:SUB_TOPIC*]-(nextTopic:Topic)`)
            .with(`creator, commitment, topic, collect(nextTopic) AS nextTopic`)
            .where(`topic.topicId IN {topics} OR ANY (t IN nextTopic WHERE t.topicId IN {topics})`)
            .getCommandString();
    }
    return ''
};

const getRegionFilter = function (regions) {
    if (regions) {
        return db.cypher().optionalMatch(`(commitment)-[:BELONGS_TO_REGION]->(region:Region)`)
            .optionalMatch(`(region)<-[:SUB_REGION*]-(nextRegion:Region)`)
            .with(`creator, commitment, region, collect(nextRegion) AS nextRegion, score`)
            .where(`region.regionId IN {regions} OR ANY (r IN nextRegion WHERE r.regionId IN {regions})`)
            .getCommandString();
    }
    return ''
};

const getPeriodOfTimeFilterQuery = function (periodOfTime) {
    return db.cypher().with(`creator, commitment, watches`)
        .where(`watches.created > {${periodOfTime}}`)
        .getCommandString();
};

const getPeriodOfTimeFilter = function (periodOfTime) {
    if (periodOfTime === 'week') {
        return getPeriodOfTimeFilterQuery('oneWeek');
    } else if (periodOfTime === 'month') {
        return getPeriodOfTimeFilterQuery('fourWeeks');
    }
    return '';
};

const getMostPopularQuery = function (trustCircle, topics, periodOfTime) {
    return db.cypher()
        .match(`(creator:User)-[:IS_CREATOR]->(commitment:Commitment)`)
        .where(`commitment.language IN {languages}`)
        .addCommand(getTopicFilter(topics))
        .addCommand(getTrustCircleFilter(trustCircle))
        .addCommand(getPeriodOfTimeFilter(periodOfTime))
        .with(`creator, commitment, count(DISTINCT watches) AS score`)
};

const getTrustCircleFilterForNewest = function (trustCircle) {
    if (trustCircle) {
        return `AND (creator)<-[:IS_CONTACT]-(:User {userId: {userId}})`
    }
    return '';
};

const getOrderByTimeQuery = function (trustCircle, topics) {
    return db.cypher()
        .match(`(creator:User)-[:IS_CREATOR]->(commitment:Commitment)`)
        .where(`commitment.language IN {languages}${getTrustCircleFilterForNewest(trustCircle)}`)
        .addCommand(getTopicFilter(topics))
        .with(`creator, commitment, 0 AS score`)
};

const getStartQuery = function (order, trustCircle, topics, periodOfTime) {
    if (order === 'mostPopular') {
        return getMostPopularQuery(trustCircle, topics, periodOfTime);
    } else if (order === 'noQuestionLink') {
        return getOrderByTimeQuery(trustCircle, topics)
            .where(`NOT (commitment)<-[:COMMITMENT]->(:CommitmentAnswer)<-[:ANSWER]-(:Question)`);
    }
    return getOrderByTimeQuery(trustCircle, topics);
};

const getFeed = async function (userId, page, timestamp, order, periodOfTime, guiLanguage, languages, trustCircle,
                                topics, regions) {
    page = page * PAGE_SIZE;

    let response = await getStartQuery(order, trustCircle, topics, periodOfTime)
        .addCommand(getRegionFilter(regions))
        .optionalMatch(`(commitment)<-[watches:WATCH]-(:User)`)
        .optionalMatch(`(commitment)-[:BELONGS_TO_REGION]->(region:Region)`)
        .return(`creator, commitment.commitmentId AS commitmentId, commitment.title AS title,
                 commitment.created AS created, commitment.modified AS modified, commitment.description AS description,
                 'Commitment' AS type, count(DISTINCT watches) AS numberOfWatches, score,
                 creator.userId = {userId} AS isLoggedInUser, collect(DISTINCT region.${guiLanguage}) AS regions,
                 EXISTS((creator)-[:IS_CONTACT]->(:User {userId: {userId}})) AS creatorTrustUser,
                 EXISTS((creator)<-[:IS_CONTACT]-(:User {userId: {userId}})) AS isTrustUser,
                 EXISTS((commitment)<-[:IS_ADMIN]-(:User {userId: {userId}})) AS isAdmin,
                 EXISTS((commitment)<-[:WATCH]-(:User {userId: {userId}})) AS isWatchedByUser`)
        .orderBy(`score DESC, created DESC`)
        .skip(`{page}`).limit(`${PAGE_SIZE}`)
        .end({
            languages, userId, page, topics, regions, fourWeeks: time.getNowUtcTimestamp() - FOUR_WEEKS,
            oneWeek: time.getNowUtcTimestamp() - WEEK
        }).send();

    return {
        feed: await getFeedResponse(response, userId), timestamp
    };
};

module.exports = {
    getFeed
};
<|endoftext|>


<commit_before><commit_msg>night time bug<commit_after><|endoftext|>


<commit_before>jQuery.extend({
    createUploadIframe: function (id, uri) {
        //create frame
        var frameId = 'jUploadFrame' + id;

        if (window.ActiveXObject) {
            var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
            if (typeof uri == 'boolean') {
                io.src = 'javascript:false';
            }
            else if (typeof uri == 'string') {
                io.src = uri;
            }
        }
        else {
            var io = document.createElement('iframe');
            io.id = frameId;
            io.name = frameId;
        }
        io.style.position = 'absolute';
        io.style.top = '-1000px';
        io.style.left = '-1000px';

        document.body.appendChild(io);

        return io;
    },
    createUploadForm: function (id, fileElementId) {
        //create form
        var formId = 'jUploadForm' + id;
        var fileId = 'jUploadFile' + id;
        var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
        var oldElement = $('#' + fileElementId);
        var newElement = $(oldElement).clone();
        $(oldElement).attr('id', fileId);
        $(oldElement).before(newElement);
        $(oldElement).appendTo(form);
        //set attributes
        $(form).css('position', 'absolute');
        $(form).css('top', '-1200px');
        $(form).css('left', '-1200px');
        $(form).appendTo('body');
        return form;
    },

    ajaxFileUpload: function (s) {
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime();
        var form = jQuery.createUploadForm(id, s.fileElementId);
        var io = jQuery.createUploadIframe(id, s.secureuri);
        var frameId = 'jUploadFrame' + id;
        var formId = 'jUploadForm' + id;
        // Watch for a new set of requests
        if (s.global && !jQuery.active++) {
            jQuery.event.trigger("ajaxStart");
        }
        var requestDone = false;
        // Create the request object
        var xml = {};
        if (s.global)
            jQuery.event.trigger("ajaxSend", [xml, s]);
        // Wait for a response to come back
        var uploadCallback = function (isTimeout) {
            var io = document.getElementById(frameId);
            try {
                if (io.contentWindow) {
                    xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
                    xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;

                } else if (io.contentDocument) {
                    xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
                    xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
                }
            } catch (e) {
                jQuery.handleError(s, xml, null, e);
            }
            if (xml || isTimeout == "timeout") {
                requestDone = true;
                var status;
                try {
                    status = isTimeout != "timeout" ? "success" : "error";
                    // Make sure that the request was successful or notmodified
                    if (status != "error") {
                        // process the data (runs the xml through httpData regardless of callback)
                        var data = jQuery.uploadHttpData(xml, s.dataType);
                        // If a local callback was specified, fire it and pass it the data
                        if (s.success)
                            s.success(data, status);

                        // Fire the global callback
                        if (s.global)
                            jQuery.event.trigger("ajaxSuccess", [xml, s]);
                    } else
                        jQuery.handleError(s, xml, status);
                } catch (e) {
                    status = "error";
                    jQuery.handleError(s, xml, status, e);
                }

                // The request was completed
                if (s.global)
                    jQuery.event.trigger("ajaxComplete", [xml, s]);

                // Handle the global AJAX counter
                if (s.global && ! --jQuery.active)
                    jQuery.event.trigger("ajaxStop");

                // Process result
                if (s.complete)
                    s.complete(xml, status);

                jQuery(io).unbind();

                setTimeout(function () {
                    try {
                        $(io).remove();
                        $(form).remove();

                    } catch (e) {
                        jQuery.handleError(s, xml, null, e);
                    }

                }, 100);
                xml = null;
            }
        }; // Timeout checker
        if (s.timeout > 0) {
            setTimeout(function () {
                // Check to see if the request is still happening
                if (!requestDone) uploadCallback("timeout");
            }, s.timeout);
        }
        try {
            // var io = $('#' + frameId);
            var form = $('#' + formId);
            $(form).attr('action', s.url);
            $(form).attr('method', 'POST');
            $(form).attr('target', frameId);
            if (form.encoding) {
                form.encoding = 'multipart/form-data';
            }
            else {
                form.enctype = 'multipart/form-data';
            }
            $(form).submit();

        } catch (e) {
            jQuery.handleError(s, xml, null, e);
        }

        $("#" + frameId).load(uploadCallback);
        return { abort: function () { } };

    },

    uploadHttpData: function (r, type) {
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context
        if (type == "script")
            jQuery.globalEval(data);
        // Get the JavaScript object, if JSON is used.
        if (type == "json")
            eval("data = " + data);
        // evaluate scripts within html
        if (type == "html")
            jQuery("<div>").html(data).evalScripts();
        return data;
    }
})<commit_msg>File upload fix for IE9 and above<commit_after>jQuery.extend({
    createUploadIframe: function (id, uri) {
        //create frame
        var frameId = 'jUploadFrame' + id;

        if (window.ActiveXObject) {
            //var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
            var io = document.createElement("iframe");
            io.setAttribute("id", frameId);
            io.setAttribute("name", frameId);
            if (typeof uri == 'boolean') {
                io.src = 'javascript:false';
            }
            else if (typeof uri == 'string') {
                io.src = uri;
            }
        }
        else {
            var io = document.createElement('iframe');
            io.id = frameId;
            io.name = frameId;
        }
        io.style.position = 'absolute';
        io.style.top = '-1000px';
        io.style.left = '-1000px';

        document.body.appendChild(io);

        return io;
    },
    createUploadForm: function (id, fileElementId) {
        //create form
        var formId = 'jUploadForm' + id;
        var fileId = 'jUploadFile' + id;
        var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
        var oldElement = $('#' + fileElementId);
        var newElement = $(oldElement).clone();
        $(oldElement).attr('id', fileId);
        $(oldElement).before(newElement);
        $(oldElement).appendTo(form);
        //set attributes
        $(form).css('position', 'absolute');
        $(form).css('top', '-1200px');
        $(form).css('left', '-1200px');
        $(form).appendTo('body');
        return form;
    },

    ajaxFileUpload: function (s) {
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime();
        var form = jQuery.createUploadForm(id, s.fileElementId);
        var io = jQuery.createUploadIframe(id, s.secureuri);
        var frameId = 'jUploadFrame' + id;
        var formId = 'jUploadForm' + id;
        // Watch for a new set of requests
        if (s.global && !jQuery.active++) {
            jQuery.event.trigger("ajaxStart");
        }
        var requestDone = false;
        // Create the request object
        var xml = {};
        if (s.global)
            jQuery.event.trigger("ajaxSend", [xml, s]);
        // Wait for a response to come back
        var uploadCallback = function (isTimeout) {
            var io = document.getElementById(frameId);
            try {
                if (io.contentWindow) {
                    xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
                    xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;

                } else if (io.contentDocument) {
                    xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
                    xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
                }
            } catch (e) {
                jQuery.handleError(s, xml, null, e);
            }
            if (xml || isTimeout == "timeout") {
                requestDone = true;
                var status;
                try {
                    status = isTimeout != "timeout" ? "success" : "error";
                    // Make sure that the request was successful or notmodified
                    if (status != "error") {
                        // process the data (runs the xml through httpData regardless of callback)
                        var data = jQuery.uploadHttpData(xml, s.dataType);
                        // If a local callback was specified, fire it and pass it the data
                        if (s.success)
                            s.success(data, status);

                        // Fire the global callback
                        if (s.global)
                            jQuery.event.trigger("ajaxSuccess", [xml, s]);
                    } else
                        jQuery.handleError(s, xml, status);
                } catch (e) {
                    status = "error";
                    jQuery.handleError(s, xml, status, e);
                }

                // The request was completed
                if (s.global)
                    jQuery.event.trigger("ajaxComplete", [xml, s]);

                // Handle the global AJAX counter
                if (s.global && ! --jQuery.active)
                    jQuery.event.trigger("ajaxStop");

                // Process result
                if (s.complete)
                    s.complete(xml, status);

                jQuery(io).unbind();

                setTimeout(function () {
                    try {
                        $(io).remove();
                        $(form).remove();

                    } catch (e) {
                        jQuery.handleError(s, xml, null, e);
                    }

                }, 100);
                xml = null;
            }
        }; // Timeout checker
        if (s.timeout > 0) {
            setTimeout(function () {
                // Check to see if the request is still happening
                if (!requestDone) uploadCallback("timeout");
            }, s.timeout);
        }
        try {
            // var io = $('#' + frameId);
            var form = $('#' + formId);
            $(form).attr('action', s.url);
            $(form).attr('method', 'POST');
            $(form).attr('target', frameId);
            if (form.encoding) {
                form.encoding = 'multipart/form-data';
            }
            else {
                form.enctype = 'multipart/form-data';
            }
            $(form).submit();

        } catch (e) {
            jQuery.handleError(s, xml, null, e);
        }

        $("#" + frameId).load(uploadCallback);
        return { abort: function () { } };

    },

    uploadHttpData: function (r, type) {
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context
        if (type == "script")
            jQuery.globalEval(data);
        // Get the JavaScript object, if JSON is used.
        if (type == "json")
            eval("data = " + data);
        // evaluate scripts within html
        if (type == "html")
            jQuery("<div>").html(data).evalScripts();
        return data;
    }
})<|endoftext|>