From 0f73684324c5e3e486e3b1568bc700e0be6a5c4b Mon Sep 17 00:00:00 2001 From: Benjamin Lupton Date: Wed, 22 Mar 2017 17:24:47 +0800 Subject: [PATCH] updated base files, update deps, rm docs (autogen now) --- .editorconfig | 4 +- .eslintrc.js | 931 ++ .gitignore | 3 +- .travis.yml | 140 +- README.md | 21 +- docs/api.js | 26 - docs/assets/css/external-small.png | Bin 491 -> 0 bytes docs/assets/css/logo.png | Bin 7143 -> 0 bytes docs/assets/css/main.css | 783 - docs/assets/favicon.ico | Bin 5430 -> 0 bytes docs/assets/img/spinner.gif | Bin 2685 -> 0 bytes docs/assets/index.html | 10 - docs/assets/js/api-filter.js | 56 - docs/assets/js/api-list.js | 255 - docs/assets/js/api-search.js | 98 - docs/assets/js/apidocs.js | 376 - docs/assets/js/yui-prettify.js | 17 - docs/assets/vendor/prettify/CHANGES.html | 130 - docs/assets/vendor/prettify/COPYING | 202 - docs/assets/vendor/prettify/README.html | 203 - docs/assets/vendor/prettify/prettify-min.css | 1 - docs/assets/vendor/prettify/prettify-min.js | 1 - docs/classes/BasePlugin.html | 815 - docs/classes/Collection.html | 186 - docs/classes/Docpad.html | 13147 ---------------- docs/classes/DocumentModel.html | 5414 ------- docs/classes/ElementsCollection.html | 356 - docs/classes/Events.html | 186 - docs/classes/FileModel.html | 3280 ---- docs/classes/FilesCollection.html | 444 - docs/classes/MetaCollection.html | 353 - docs/classes/Model.html | 186 - docs/classes/PluginLoader.html | 903 -- docs/classes/PluginTester.html | 643 - docs/classes/QueryCollection.html | 186 - docs/classes/ScriptCollection.html | 356 - docs/classes/ServerTester.html | 553 - docs/classes/StylesCollection.html | 356 - docs/classes/docpadUtil.html | 1620 -- docs/classes/index.html | 10 - docs/data.json | 7336 --------- docs/elements/index.html | 10 - docs/files/index.html | 10 - docs/files/src_lib_base.coffee.html | 228 - .../src_lib_collections_elements.coffee.html | 198 - .../src_lib_collections_files.coffee.html | 210 - .../src_lib_collections_meta.coffee.html | 140 - .../src_lib_collections_scripts.coffee.html | 186 - .../src_lib_collections_styles.coffee.html | 182 - docs/files/src_lib_docpad.coffee.html | 6621 -------- .../src_lib_interfaces_console.coffee.html | 1027 -- .../files/src_lib_models_document.coffee.html | 969 -- docs/files/src_lib_models_file.coffee.html | 1522 -- docs/files/src_lib_plugin-loader.coffee.html | 468 - docs/files/src_lib_plugin.coffee.html | 371 - docs/files/src_lib_testers.coffee.html | 494 - docs/files/src_lib_util.coffee.html | 482 - docs/index.html | 131 - docs/modules/index.html | 10 - package.json | 48 +- 60 files changed, 1098 insertions(+), 51796 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 docs/api.js delete mode 100755 docs/assets/css/external-small.png delete mode 100755 docs/assets/css/logo.png delete mode 100755 docs/assets/css/main.css delete mode 100755 docs/assets/favicon.ico delete mode 100755 docs/assets/img/spinner.gif delete mode 100755 docs/assets/index.html delete mode 100755 docs/assets/js/api-filter.js delete mode 100755 docs/assets/js/api-list.js delete mode 100755 docs/assets/js/api-search.js delete mode 100755 docs/assets/js/apidocs.js delete mode 100755 docs/assets/js/yui-prettify.js delete mode 100755 docs/assets/vendor/prettify/CHANGES.html delete mode 100755 docs/assets/vendor/prettify/COPYING delete mode 100755 docs/assets/vendor/prettify/README.html delete mode 100755 docs/assets/vendor/prettify/prettify-min.css delete mode 100755 docs/assets/vendor/prettify/prettify-min.js delete mode 100644 docs/classes/BasePlugin.html delete mode 100644 docs/classes/Collection.html delete mode 100644 docs/classes/Docpad.html delete mode 100644 docs/classes/DocumentModel.html delete mode 100644 docs/classes/ElementsCollection.html delete mode 100644 docs/classes/Events.html delete mode 100644 docs/classes/FileModel.html delete mode 100644 docs/classes/FilesCollection.html delete mode 100644 docs/classes/MetaCollection.html delete mode 100644 docs/classes/Model.html delete mode 100644 docs/classes/PluginLoader.html delete mode 100644 docs/classes/PluginTester.html delete mode 100644 docs/classes/QueryCollection.html delete mode 100644 docs/classes/ScriptCollection.html delete mode 100644 docs/classes/ServerTester.html delete mode 100644 docs/classes/StylesCollection.html delete mode 100644 docs/classes/docpadUtil.html delete mode 100644 docs/classes/index.html delete mode 100644 docs/data.json delete mode 100644 docs/elements/index.html delete mode 100644 docs/files/index.html delete mode 100644 docs/files/src_lib_base.coffee.html delete mode 100644 docs/files/src_lib_collections_elements.coffee.html delete mode 100644 docs/files/src_lib_collections_files.coffee.html delete mode 100644 docs/files/src_lib_collections_meta.coffee.html delete mode 100644 docs/files/src_lib_collections_scripts.coffee.html delete mode 100644 docs/files/src_lib_collections_styles.coffee.html delete mode 100644 docs/files/src_lib_docpad.coffee.html delete mode 100644 docs/files/src_lib_interfaces_console.coffee.html delete mode 100644 docs/files/src_lib_models_document.coffee.html delete mode 100644 docs/files/src_lib_models_file.coffee.html delete mode 100644 docs/files/src_lib_plugin-loader.coffee.html delete mode 100644 docs/files/src_lib_plugin.coffee.html delete mode 100644 docs/files/src_lib_testers.coffee.html delete mode 100644 docs/files/src_lib_util.coffee.html delete mode 100644 docs/index.html delete mode 100644 docs/modules/index.html diff --git a/.editorconfig b/.editorconfig index 4423e0fd..29d11ece 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,4 @@ -# 2016 March 8 +# 2017 March 3 # https://github.com/bevry/base root = true @@ -6,7 +6,7 @@ root = true [*] end_of_line = lf charset = utf-8 -trim_trailing_whitespace = false +trim_trailing_whitespace = true insert_final_newline = false indent_style = tab diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..84ec1ee1 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,931 @@ +// 2017 February 22 +// https://github.com/bevry/base +// http://eslint.org +// This code must be able to run on Node 0.10 +/* eslint no-warning-comments: 0 */ +'use strict' + +const IGNORE = 0, WARN = 1, ERROR = 2, MAX_PARAMS = 4 + +const config = { + extends: ['eslint:recommended'], + plugins: [], + parserOptions: {ecmaFeatures: {}}, + env: {}, + rules: { + // ---------------------------- + // Problems with these rules + // If we can figure out how to enable the following, that would be great + + // Two spaces after one line if or else: + // if ( blah ) return + // Insead of one space: + // if ( blah ) return + + // No spaces on embedded function: + // .forEach(function(key, value){ + // instead of: + // .forEach(function (key, value) { + + // Else and catch statements on the same line as closing brace: + // } else { + // } catch (e) { + // instead of: + // } + // else { + + + // -------------------------------------- + // Possible Errors + // The following rules point out areas where you might have made mistakes. + + // Don't allow assignments in conditional statements (if, while, etc.) + 'no-cond-assign': [ERROR, 'always'], + + // Warn but don't error about console statements + 'no-console': WARN, + + // Sometimes useful for debugging + // Allow while(true) loops + 'no-constant-condition': WARN, + + // Seems like a good idea to error about this + 'no-control-regex': ERROR, + + // Warn but don't error about console statements + 'no-debugger': WARN, + + // Don't allow duplicate arguments in a function, they can cause errors + 'no-dupe-args': ERROR, + + // Disallow duplicate keys in an object, they can cause errors + 'no-dupe-keys': ERROR, + + // Disallow duplicate case statements in a switch + 'no-duplicate-case': ERROR, + + // Allow empty block statements, they are useful for clarity + 'no-empty': IGNORE, + + // Disallow empty [] in regular expressions as they cause unexpected behaviour + 'no-empty-character-class': ERROR, + + // Overwriting the exception argument in a catch statement can cause memory leaks in some browsers + 'no-ex-assign': ERROR, + + // Disallow superflous boolean casts, they offer no value + 'no-extra-boolean-cast': ERROR, + + // Allow superflous parenthesis as they offer clarity in some cases + 'no-extra-parens': IGNORE, + + // Disallow superflous semicolons, they offer no value + 'no-extra-semi': ERROR, + + // Seems like a good idea to error about this + 'no-func-assign': ERROR, + + // Seems like a good idea to error about this + 'no-inner-declarations': ERROR, + + // Seems like a good idea to error about this + 'no-invalid-regexp': ERROR, + + // Seems like a good idea to error about this + 'no-irregular-whitespace': ERROR, + + // Seems like a good idea to error about this + 'no-obj-calls': ERROR, + + // Not enough justification to change our existing use + 'no-prototype-builtins': IGNORE, + + // Seems like a good idea to error about this + // Instead of / / used / {ERROR}/ instead + 'no-regex-spaces': ERROR, + + // Seems like a good idea to error about this + 'no-sparse-arrays': ERROR, + + // Probably an error on our part, so warn + 'no-template-curly-in-string': WARN, + + // Seems like a good idea to error about this + 'no-unexpected-multiline': ERROR, + + // Seems like a good idea to error about this + 'no-unreachable': ERROR, + + // Seems like a good idea to error about this + 'no-unsafe-finally': ERROR, + + // Seems like a good idea to error about this + 'no-unsafe-negation': ERROR, + + // Seems like a good idea to error about this + 'use-isnan': ERROR, + + // We use JSDoc again + 'valid-jsdoc': [ERROR, { + requireParamDescription: false, + requireReturnDescription: false + }], + + // Seems like a good idea to error about this + 'valid-typeof': ERROR, + + + // -------------------------------------- + // Best Practices + // These are rules designed to prevent you from making mistakes. They either prescribe a better way of doing something or help you avoid footguns. + + // Often we only need one, setting both doesn't make sense + // Enforces getter/setter pairs in objects + 'accessor-pairs': IGNORE, + + // Seems sensible + // Enforces return statements in callbacks of array's methods + 'array-callback-return': ERROR, + + // This rule seems buggy + 'block-scoped-var': IGNORE, + + // Seems interesting, lets give it a go + 'class-methods-use-this': WARN, + + // Disable complexity checks, they are annoying and not that useful in detecting actual complexity + 'complexity': IGNORE, + + // We use blank returns for break statements and for returning void + 'consistent-return': IGNORE, + + // Always require curly braces unless the statement is all on a single line + 'curly': [ERROR, 'multi-line'], + + // If we don't have a default cause, it probably means we should throw an error + 'default-case': ERROR, + + // Dots should be on the newlines + // chainableThingy + // .doSomething() + // .doSomethingElse() + 'dot-location': [ERROR, 'property'], + + // Use dot notation where possible + 'dot-notation': ERROR, + + // Unless you are doing == null, then force === to avoid truthy/falsey mistakes + 'eqeqeq': [ERROR, 'allow-null'], + + // Always use hasOwnProperty when doing for in + 'guard-for-in': ERROR, + + // Warn about alert statements in our code + // Use one of the suggested alternatives instead + // Reasoning is they could be mistaken for left over debugging statements + 'no-alert': WARN, + + // They are very slow + 'no-caller': ERROR, + + // Wow... + 'no-case-declarations': ERROR, + + // Seems like a good idea to error about this + 'no-div-regex': ERROR, + + // Returns in else statements offer code clarity, so disable this rule + 'no-else-return': IGNORE, + + // Up to developer sensibility + // disallow use of empty functions + 'no-empty-function': IGNORE, + + // Seems sensible + 'no-empty-pattern': ERROR, + + // We know that == null is a null and undefined check + 'no-eq-null': IGNORE, + + // Eval is slow and unsafe, use vm's instead + 'no-eval': ERROR, + + // There is never a good reason for this + 'no-extend-native': ERROR, + + // Don't allow useless binds + 'no-extra-bind': ERROR, + + // Seems sensible + 'no-extra-label': ERROR, + + // Don't allow switch case statements to follow through, use continue keyword instead + 'no-fallthrough': ERROR, + + // Use zero when doing decimals, otherwise it is confusing + 'no-floating-decimal': ERROR, + + // Seems sensible + 'no-global-assign': ERROR, + + // Cleverness is unclear + 'no-implicit-coercion': ERROR, + + // Seems sensible providing detection works correctly + 'no-implicit-globals': ERROR, + + // A sneaky way to do evals + 'no-implied-eval': ERROR, + + // This throws for a lot of senseless things, like chainy functions + 'no-invalid-this': IGNORE, + + // Use proper iterators instead + 'no-iterator': ERROR, + + // We never use this, it seems silly to allow this + 'no-labels': ERROR, + + // We never use this, it seems silly to allow this + 'no-lone-blocks': ERROR, + + // Loop functions always cause problems, as the scope isn't clear through iterations + 'no-loop-func': ERROR, + + // Far too annoying + 'no-magic-numbers': IGNORE, + + // We like multi spaces for clarity + // E.g. We like + // if ( blah ) return foo + // Instead of: + // if ( blah ) return foo + // @TODO would be great to enforce the above + 'no-multi-spaces': IGNORE, + + // Use ES6 template strings instead + 'no-multi-str': ERROR, + + // We never use this, it seems silly to allow this + 'no-new-func': ERROR, + + // We never use this, it seems silly to allow this + 'no-new-wrappers': ERROR, + + // We never use this, it seems silly to allow this + 'no-new': ERROR, + + // We never use this, it seems silly to allow this + 'no-octal-escape': ERROR, + + // We never use this, it seems silly to allow this + 'no-octal': ERROR, + + // We got to be pretty silly if we don't realise we are doing this + // As such, take any usage as intentional and aware + 'no-param-reassign': IGNORE, + + // We never use this, it seems silly to allow this + 'no-proto': ERROR, + + // We never use this, it seems silly to allow this + 'no-redeclare': ERROR, + + // No defaults for this that are useful + 'no-restricted-properties': IGNORE, + + // We never use this, it seems silly to allow this + 'no-return-assign': ERROR, + + // We never use this, it seems silly to allow this + 'no-script-url': ERROR, + + // Seems sensible + 'no-self-assign': ERROR, + + // We never use this, it seems silly to allow this + 'no-self-compare': ERROR, + + // We never use this, it seems silly to allow this + 'no-sequences': ERROR, + + // We always want proper error objects as they have stack traces and respond to instanceof Error checks + 'no-throw-literal': ERROR, + + // Could be a getter, so warn + 'no-unmodified-loop-condition': WARN, + + // We never use this, it seems silly to allow this + 'no-unused-expressions': ERROR, + + // Seems sensible + 'no-unused-labels': ERROR, + + // Seems sensible + 'no-useless-call': ERROR, + + // Seems sensible + 'no-useless-concat': ERROR, + + // Seems sensible + 'no-useless-escape': ERROR, + + // We never use this, it seems silly to allow this + 'no-void': ERROR, + + // Warn about todos + 'no-warning-comments': [WARN, { terms: ['todo', 'fixme'], location: 'anywhere' }], + + // We never use this, it seems silly to allow this + 'no-with': ERROR, + + // Always specify a radix to avoid errors + 'radix': ERROR, + + // We appreciate the clarity late defines offer + 'vars-on-top': IGNORE, + + // Wrap instant called functions in parenthesis for clearer intent + 'wrap-iife': ERROR, + + // Because we force === and never allow assignments in conditions + // we have no need for yoda statements, so disable them + 'yoda': [ERROR, 'never'], + + + // -------------------------------------- + // Strict Mode + // These rules relate to using strict mode. + + // Ensure that use strict is specified to prevent the runtime erorr: + // SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode + 'strict': [ERROR, 'global'], + + + // -------------------------------------- + // Variables + // These rules have to do with variable declarations. + + // We don't care + 'init-declarations': IGNORE, + + // Don't allow the catch method to shadow objects as browsers handle this differently + // Update: We don't care for IE8 + 'no-catch-shadow': IGNORE, + + // Don't use delete, it disables optimisations + 'no-delete-var': ERROR, + + // We never use this, it seems silly to allow this + 'no-label-var': ERROR, + + // No useful defaults + 'no-restricted-globals': IGNORE, + + // We never use this, it seems silly to allow this + 'no-shadow-restricted-names': ERROR, + + // We use shadowing + 'no-shadow': IGNORE, + + // Makes sense + 'no-undef-init': ERROR, + + // Error when an undefined variable is used + 'no-undef': ERROR, + + // typeof blah === 'undefined' should always be used + 'no-undefined': ERROR, + + // Warn us when we don't use something + 'no-unused-vars': WARN, + + // Error when we try and use something before it is defined + 'no-use-before-define': ERROR, + + + // -------------------------------------- + // Node.js and CommonJS + // These rules are specific to JavaScript running on Node.js or using CommonJS in the browser. + + // Seems to difficult to enforce + 'callback-return': IGNORE, + + // We use require where it is appropriate to use it + 'global-require': IGNORE, + + // Force handling of callback errors + 'handle-callback-err': ERROR, + + // @TODO decide if this is good or not + 'no-mixed-requires': ERROR, + + // Disallow error prone syntax + 'no-new-require': ERROR, + + // Always use path.join for windows support + 'no-path-concat': ERROR, + + // We use process.env wisely + 'no-process-env': IGNORE, + + // We know what we are doing + 'no-process-exit': IGNORE, + + // No need to disallow any modules + 'no-restricted-modules': IGNORE, + + // Sometimes sync methods are useful, so warn but don't error + 'no-sync': WARN, + + + // -------------------------------------- + // Stylistic + // These rules are purely matters of style and are quite subjective. + + // We don't use spaces with brackets + 'array-bracket-spacing': [ERROR, 'never'], + + // Disallow or enforce spaces inside of single line blocks + 'block-spacing': [ERROR, 'always'], + + // Opening brace on same line, closing brace on its own line, except when statement is a single line + 'brace-style': [ERROR, 'stroustrup', { allowSingleLine: true }], + + // Use camel case + 'camelcase': ERROR, + + // ES6 supports dangling commas + 'comma-dangle': [ERROR, 'never'], + + // Require a comma after always + 'comma-spacing': [ERROR, { before: false, after: true }], + + // Commas go last, we have tooling to detect if we forget a comma + 'comma-style': [ERROR, 'last'], + + // Require or disallow padding inside computed properties + 'computed-property-spacing': [ERROR, 'never'], + + // Enabling this was incredibly annoying when doing layers of nesting + 'consistent-this': IGNORE, + + // Enable to make UNIX people's lives easier + 'eol-last': ERROR, + + // We never use this, it seems silly to allow this + 'func-call-spacing': [ERROR, 'never'], + + // This rule is not currently useful + 'func-name-matching': IGNORE, + + // We like anonymous functions + 'func-names': IGNORE, + + // Prefer to define functions via variables + 'func-style': [WARN, 'declaration'], + + // Nothing we want to blacklist + // blacklist certain identifiers to prevent them being used + 'id-blacklist': IGNORE, + + // Sometimes short names are appropriate + 'id-length': IGNORE, + + // Camel case handles this for us + 'id-match': IGNORE, + + // Use tabs and indent case blocks + 'indent': [ERROR, 'tab', { + SwitchCase: 1, + VariableDeclarator: 0, + outerIIFEBody: 1, + MemberExpression: 1, + FunctionDeclaration: { + body: 1, + parameters: 0 + }, + FunctionExpression: { + body: 1, + parameters: 0 + } + }], + // ^ broken before, let us try again + + // Prefer double qoutes for JSX properties: , + 'jsx-quotes': [ERROR, 'prefer-double'], + + // Space after the colon + 'key-spacing': [ERROR, { + beforeColon: false, + afterColon: true + }], + + // Always force a space before and after a keyword + 'keyword-spacing': [ERROR], + + // we use both + 'line-comment-position': IGNORE, + + // Enforce unix line breaks + 'linebreak-style': [ERROR, 'unix'], + + // Enforce new lines before block comments + 'lines-around-comment': [ERROR, { + beforeBlockComment: true, + allowBlockStart: true + }], + + // Enforce directives with no line above but a line below + 'lines-around-directive': [ERROR, { + before: 'never', + after: 'always' + }], + + // Disabled to ensure consistency with complexity option + 'max-depth': IGNORE, + + // We use soft wrap + 'max-len': IGNORE, + + // Perhaps in the future we can set this to 300 or so + // but for now it is not useful for the things we write and maintain + 'max-lines': IGNORE, + + // We are smart enough to know if this is bad or not + 'max-nested-callbacks': IGNORE, + + // Sometimes we have no control over this for compat reasons, so just warn + 'max-params': [WARN, MAX_PARAMS], + + // Let's give this a go and see what is appropriate for our usage + 'max-statements-per-line': [WARN, {max: 1}], + + // We should be able to use whatever feels right + 'max-statements': IGNORE, + + // Current options are not useful + 'multiline-ternary': IGNORE, + + // Constructors should be CamelCase + 'new-cap': ERROR, + + // Always use parens when instantiating a class + 'new-parens': ERROR, + + // Too difficult to enforce correctly as too many edge-cases + // require or disallow an empty newline after variable declarations + 'newline-after-var': IGNORE, + + // Let the author decide + // enforce newline after each call when chaining the calls + 'newline-per-chained-call': IGNORE, + + // Don't use the array constructor when it is not needed + 'no-array-constructor': ERROR, + + // We never use bitwise, they are too clever + 'no-bitwise': ERROR, + + // We use continue + 'no-continue': IGNORE, + + // We like inline comments + 'no-inline-comments': IGNORE, + + // The code could be optimised if this error occurs + 'no-lonely-if': ERROR, + + // Seems sensible, let's see how we go with this + 'no-mixed-operators': ERROR, + + // Don't mix spaces and tabs + // Maybe [ERROR, 'smart-tabs'] will be better, we will see + 'no-mixed-spaces-and-tabs': ERROR, + + // We use multiple empty lines for styling + 'no-multiple-empty-lines': IGNORE, + + // Sometimes it is more understandable with a negated condition + 'no-negated-condition': IGNORE, + + // Sometimes these are useful + 'no-nested-ternary': IGNORE, + + // Use {} instead of new Object() + 'no-new-object': ERROR, + + // We use plus plus + 'no-plusplus': IGNORE, + + // Handled by other rules + 'no-restricted-syntax': IGNORE, + + // We use tabs + 'no-tabs': IGNORE, + + // Sometimes ternaries are useful + 'no-ternary': IGNORE, + + // Disallow trailing spaces + 'no-trailing-spaces': ERROR, + + // Sometimes this is useful when avoiding shadowing + 'no-underscore-dangle': IGNORE, + + // Sensible + 'no-unneeded-ternary': ERROR, + + // Seems sensible + 'no-whitespace-before-property': ERROR, + + // Object indentation should be consistent within the object + // Ignore until https://github.com/eslint/eslint/issues/7434 is done + 'object-curly-newline': [IGNORE, {multiline: true}], + + // Desirable, but too many edge cases it turns out where it is actually preferred + 'object-curly-spacing': IGNORE, + + // We like multiple var statements + 'one-var': IGNORE, + 'one-var-declaration-per-line': IGNORE, + + // Force use of shorthands when available + 'operator-assignment': [ERROR, 'always'], + + // Should be before, but not with =, *=, /=, += lines + // @TODO figure out how to enforce + 'operator-linebreak': IGNORE, + + // This rule doesn't appear to work correclty + 'padded-blocks': IGNORE, + + // Seems like a good idea to error about this + // was broken before, but lets give a go again + 'quote-props': [ERROR, 'consistent-as-needed'], + + // Use single quotes where escaping isn't needed + 'quotes': [ERROR, 'single', 'avoid-escape'], + + // We use YUIdoc + 'require-jsdoc': IGNORE, + + // If semi's are used, then add spacing after + 'semi-spacing': [ERROR, { before: false, after: true }], + + // Never use semicolons + 'semi': [ERROR, 'never'], + + // Importance makes more sense than alphabetical + 'sort-keys': IGNORE, + + // Importance makes more sense than alphabetical + 'sort-vars': IGNORE, + + // Always force a space before a { + 'space-before-blocks': [ERROR, 'always'], + + // function () {, get blah () { + 'space-before-function-paren': [ERROR, 'always'], + + // This is for spacing between (), so doSomething( WARN, ERROR, 3 ) or if ( WARN === 3 ) + // which we want for ifs, but don't want for calls + 'space-in-parens': IGNORE, + + // We use this + 'space-infix-ops': ERROR, + + // We use this + 'space-unary-ops': ERROR, + + // We use this + // 'spaced-line-comment': ERROR, + 'spaced-comment': ERROR, + + // When would we ever do this? Makes no sense + 'unicode-bom': [ERROR, 'never'], + + // We do this, seems to work well + 'wrap-regex': ERROR, + + + // -------------------------------------- + // ECMAScript 6 / ES6 + + // Sensible to create more informed and clear code + 'arrow-body-style': [ERROR, 'as-needed'], + + // We do this, no reason why, just what we do + 'arrow-parens': [ERROR, 'always'], + + // Require consistent spacing for arrow functions + 'arrow-spacing': ERROR, + + // Makes sense as otherwise runtime error will occur + 'constructor-super': ERROR, + + // Seems the most consistent location for it + 'generator-star-spacing': [ERROR, 'before'], + + // Makes sense + 'no-class-assign': ERROR, + + // Makes sense + 'no-confusing-arrow': ERROR, + + // Of course + 'no-const-assign': ERROR, + + // Of course + 'no-dupe-class-members': ERROR, + + // Seems sensible, may be times when we want this + 'no-duplicate-imports': WARN, + + // Seems sensible + 'no-new-symbol': ERROR, + + // No need to disallow any imports + 'no-restricted-imports': IGNORE, + + // Makes sense as otherwise runtime error will occur + 'no-this-before-super': ERROR, + + // Seems sensible + 'no-useless-computed-key': ERROR, + + // Seems sensible + 'no-useless-constructor': ERROR, + + // Seems sensible + 'no-useless-rename': ERROR, + + // Of course + // However, would be good to have this adjusted per environment + 'no-var': WARN, + + // Enforce ES6 object shorthand + 'object-shorthand': ERROR, + + // Better performance when running native + // but horrible performance if not running native as could fallback to bind + // https://travis-ci.org/bevry/es6-benchmarks + 'prefer-arrow-callback': IGNORE, + + // Of course + 'prefer-const': ERROR, + + // Makes sense + 'prefer-numeric-literals': ERROR, + + // Controversial change, but makes sense to move towards to reduce the risk of bad people overwriting apply and call + // https://github.com/eslint/eslint/issues/ERROR939 + // Ignoring because node does not yet support it, so we don't want to get the performance hit of using the compiled ES5 version + 'prefer-reflect': IGNORE, + + // Makes sense to enforce, exceptions should be opted out of on case by case + 'prefer-rest-params': ERROR, + + // Sure, why not + 'prefer-spread': ERROR, + + // Too annoying to enforce + 'prefer-template': IGNORE, + + // Makes sense + 'require-yield': ERROR, + + // Makes sense + 'rest-spread-spacing': [ERROR, 'never'], + + // Importance makes more sense than alphabetical + 'sort-imports': IGNORE, + + // Makes sense + 'symbol-description': ERROR, + + // Makes sense + 'template-curly-spacing': [ERROR, 'never'], + + // Our preference + 'yield-star-spacing': [ERROR, 'both'], + + + // -------------------------------------- + // Plugins + + // Not sure why, but okay + 'babel/no-await-in-loop': WARN, + 'flow-vars/define-flow-type': WARN, + 'flow-vars/use-flow-type': WARN + } +} + +// ------------------------------------ +// Enhancements + +// Load data.json file if it exists +const rules = Object.keys(config.rules) +let data = {}, devDeps = [] +try { + data = require('./package.json') || {} + devDeps = Object.keys(data.devDependencies || {}) +} +catch ( err ) {} + +// Set the parser options depending on our editions +if ( data.editions ) { + const sourceEdition = data.editions[0] + for ( let syntaxIndex = 0; syntaxIndex < sourceEdition.syntaxes.length; ++syntaxIndex ) { + const syntax = sourceEdition.syntaxes[syntaxIndex] + if ( syntax === 'esnext' ) { + config.parserOptions.ecmaVersion = 8 + break + } + else if ( syntax.indexOf('es') === 0 ) { + config.parserOptions.ecmaVersion = Number(syntax.substr(2)) + break + } + } + config.parserOptions.ecmaFeatures.sourceType = sourceEdition.syntaxes.indexOf('import') !== -1 ? 'module' : 'script' + config.parserOptions.ecmaFeatures.jsx = sourceEdition.syntaxes.indexOf('jsx') !== -1 +} +else { + // node version + const node = data.engines && data.engines.node && data.engines.node.replace('>=', '').replace(/ /g, '').replace(/\..+$/, '') + config.parserOptions.ecmaVersion = node >= 6 ? 6 : 5 +} + +// Set the environments depending on whether we need them or not +config.env.es6 = Boolean(config.parserOptions.ecmaVersion && config.parserOptions.ecmaVersion >= 6) +config.env.node = Boolean(data.engines && data.engines.node) +config.env.browser = Boolean(data.browser) +if ( config.env.browser ) { + config.env.commonjs = true + if ( config.env.node ) { + config.env['shared-node-browser'] = true + } +} + +// If not on legacy javascript, disable esnext rules +if ( config.parserOptions.ecmaVersion && config.parserOptions.ecmaVersion <= 5 ) { + config.rules['no-var'] = IGNORE + config.rules['object-shorthand'] = [ERROR, 'never'] +} + +// Add babel parsing if installed +if ( devDeps.indexOf('babel-eslint') !== -1 ) { + config.parser = 'babel-eslint' +} + +// Add react linting if installed +if ( devDeps.indexOf('eslint-plugin-react') !== -1 ) { + config.extends.push('plugin:react/recommended') + config.plugins.push('react') +} + +if ( devDeps.indexOf('eslint-plugin-babel') !== -1 ) { + // Remove rules that babel rules replace + config.plugins.push('babel') + const replacements = [ + 'array-bracket-spacing', + 'new-cap', + 'object-curly-spacing', + 'arrow-parens', + 'generator-star-spacing', + 'object-shorthand' + ] + replacements.forEach(function (key) { + if ( rules.indexOf(key) !== -1 ) { + config.rules['babel/' + key] = config.rules[key] + config.rules[key] = IGNORE + } + }) +} +else { + // Remove babel rules if not using babel + rules.forEach(function (key) { + if ( key.indexOf('babel/') === 0 ) { + delete config.rules[key] + } + }) +} + +if ( devDeps.indexOf('eslint-plugin-flow-vars') !== -1 ) { + // Add flow plugin if installed + config.plugins.push('flow-vars') +} +else { + // Remove flow rules if plugin not installed + rules.forEach(function (key) { + if ( key.indexOf('flow-vars/') === 0 ) { + delete config.rules[key] + } + }) +} + + +// ------------------------------------ +// Export + +module.exports = config diff --git a/.gitignore b/.gitignore index 3afd533b..ca68e21a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# 2016 October 17 +# 2017 January 27 # https://github.com/bevry/base # Temp Files @@ -21,6 +21,7 @@ coffee/ es5/ es2015/ esnext/ +docs/ # Editor Caches .c9/ diff --git a/.travis.yml b/.travis.yml index 7aee9b45..97b853fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,32 +1,140 @@ -# 2016 April 27 +# 2017 March 22 # https://github.com/bevry/base # Use the latest travis infrastructure sudo: false -# We use node +# Complete Node.js Version Matrix +# https://github.com/balupton/awesome-travis#complete-nodejs-version-matrix language: node_js node_js: - - "0.12" - - "4" - - "5" - - "6" + - "0.8" # end of life + - "0.10" # end of life + - "0.12" # maintenance + - "4" # lts + - "6" # lts + - "7" # stable +matrix: + fast_finish: true + allow_failures: + - node_js: "0.8" + - node_js: "0.10" cache: directories: - - node_modules + - $HOME/.npm # npm's cache -# Prepare our tests -# Ensure the project is setup correctly and compiled -install: "npm run-script setup" -before_script: "npm run-script compile" +install: | + # Ensure NPM is latest + # https://github.com/balupton/awesome-travis#ensure-npm-is-latest + export CURRENT_NPM_VERSION="$(npm --version)" || exit -1 + export LATEST_NPM_VERSION="$(npm view npm version)" || exit -1 + if test "$CURRENT_NPM_VERSION" != "$LATEST_NPM_VERSION"; then + echo "running an old npm version $CURRENT_NPM_VERSION, upgrading npm to $LATEST_NPM_VERSION..." + npm install npm --global --cache-min=Infinity || exit -1 + echo "...npm upgrade complete" + fi + # Ensure dependencies install with a LTS node version + # https://github.com/balupton/awesome-travis#use-lts-node-version-for-preparation + export CURRENT_NODE_VERSION="$(node --version)" || exit -1 + export LTS_NODE_VERSIONS="$(nvm ls-remote --lts)" || exit -1 + if echo "$LTS_NODE_VERSIONS" | grep "$CURRENT_NODE_VERSION"; then + echo "running on a LTS node version, completing setup..." + npm run our:setup || exit -1 + echo "...setup complete with current LTS version" + else + echo "running on a non-LTS node version, completing setup on a LTS node version..." + nvm install --lts + export LTS_NODE_INSTALLED_VERSION="$(node --version)" || exit -1 + npm run our:setup || exit -1 + nvm use "$TRAVIS_NODE_VERSION" || exit -1 + echo "...setup complete with LTS" + fi +before_script: | + # Ensure compilation and linting occur on a LTS node version + # https://github.com/balupton/awesome-travis#use-lts-node-version-for-preparation + if test "$LTS_NODE_INSTALLED_VERSION"; then + echo "running on a non-LTS node version, compiling with LTS, skipping linting..." + nvm use "$LTS_NODE_INSTALLED_VERSION" || exit -1 + npm run our:compile || exit -1 + nvm use "$TRAVIS_NODE_VERSION" || exit -1 + echo "...compiled" + else + echo "running on a LTS node version, compiling and linting..." + npm run our:compile && npm run our:verify || exit -1 + echo "...compiled and linted" + fi +after_success: | + # Release to Surge + # https://github.com/balupton/awesome-travis#release-to-surge + export CURRENT_NODE_VERSION="$(node --version)" || exit -1 + export LTS_NODE_LATEST_VERSION="$(nvm version-remote --lts)" || exit -1 + if test "$CURRENT_NODE_VERSION" = "$LTS_NODE_LATEST_VERSION"; then + echo "running on latest LTS node version, performing release to surge..." + echo "preparing release" + npm run our:meta || exit -1 + echo "installing surge" + npm install surge || exit -1 + echo "performing deploy" + export SURGE_SLUG="$(echo $TRAVIS_REPO_SLUG | sed 's/^\(.*\)\/\(.*\)/\2.\1/')" || exit -1 + if test "$TRAVIS_BRANCH"; then + echo "deploying branch..." + surge --project $SURGE_PROJECT --domain "$TRAVIS_BRANCH.$SURGE_SLUG.surge.sh" || exit -1 + fi + if test "$TRAVIS_TAG"; then + echo "deploying tag..." + surge --project $SURGE_PROJECT --domain "$TRAVIS_TAG.$SURGE_SLUG.surge.sh" || exit -1 + fi + if test "$TRAVIS_COMMIT"; then + echo "deploying commit..." + surge --project $SURGE_PROJECT --domain "$TRAVIS_COMMIT.$SURGE_SLUG.surge.sh" || exit -1 + fi + echo "...released to surge" + else + echo "running on non-latest LTS node version, skipping release to surge" + fi + # Release to NPM + # https://github.com/balupton/awesome-travis#release-to-npm + export CURRENT_NODE_VERSION="$(node --version)" || exit -1 + export LTS_NODE_LATEST_VERSION="$(nvm version-remote --lts)" || exit -1 + if test "$CURRENT_NODE_VERSION" = "$LTS_NODE_LATEST_VERSION"; then + if test "$TRAVIS_TAG"; then + echo "logging in..." + echo -e "$NPM_USERNAME\n$NPM_PASSWORD\n$NPM_EMAIL" | npm login || exit -1 + echo "publishing..." + npm publish || exit -1 + echo "...released to npm" + else + echo "non-tag, no need for release" + fi + else + echo "running on non-latest LTS node version, skipping release to npm" + fi -# Run our tests -script: "npm test" +# ======================================== +# Custom Configuration +# https://github.com/bevry/base#configuration -# Custom notifications +env: + global: + # Release to NPM + # https://github.com/balupton/awesome-travis#release-to-npm + - secure: WeIfuQhk2MgqXySloBoW1Th6dh7GTp7FbE/KHP/v7WKh/wFwxN6dIp7+zl3oMi/uVIWkiZ18EX82v6CUJq+u01vzd/Rk4Sj4p3L1lNi4wwElniXSblCnTakKivZfP/VaFO2ka2nwiIN7lSFBLoHojAecH2g5vxU8Q6mEW6mOVP4= + - secure: gcR6X6qf1XC2zu/oN8/fIiCMpEg7dFlzWPPkZ+8wqH7Dan77FsPIhisDw1W1seneMvms3Ku3gV07QU/kSrpbNTNfRrIusCl/Bh/imUPMElfQxxEcykQcUaHSzmWHa/SaLwRJWPp6ii5hu6Z1F3pwgyl1TpheRQrMcjmRr5I/SkU= + - secure: B5IlZLjgldcR5+ypZ0oiurUsybmpu0ZDD2mIu22fcP6eBzrGcVUPeUBBT2qC8DUFkYYJqi8gbQfJ/pJBngWktXxbyj5jJkV9bBdMzf7eupz8vcjcq1kr9piLTF+66qB7+djS+1Gm9uxVP1cM5BjOO44eWoKGfxl8oNVlPaRqmQE= + # Release to Surge + # https://github.com/balupton/awesome-travis#release-to-surge + - SURGE_PROJECT='.' # ths is the path that you want to deploy to surge + - secure: fHn9nZBNewevxuVLmzHrWGniwWBs8pz7ejy8QHLFvv1910w8fT7ZowzstyfQPWaidP5+/z76rAKvSp05qF0WMM2XBcpKJzbMHyrp1zxnboah9cDNz87Tx8tULhB2eo6/Cb1BUD9jlOyEwkbS3PzhiLNgy9gnF9+rijnA2tf0QYE= + - secure: OMTu9+wWFGKD5CCIadP8WZXFxY2DRx/21qKes5WUpjipnho2GyxcjfDK0MFloThLzSayDWIbjxNH3WmMUb3c4uLsqhEm9wj5vWllUsJ+ELgyeK/9Q1M6vkIAS2vrkjnc4peltCd6t85SQF0SE/DwToj8sGajNwRzsikLEULSCMQ= + # Custom Configuration for this repository + +# https://github.com/balupton/awesome-travis#slack +# https://github.com/balupton/awesome-travis#email +env: + global: notifications: slack: - secure: hYTEHwzc03LIgAC08QvXU5yvhMwDM00rUtk7r0j5Qr1aD04PaKFVTRlBcvvy8YkNoMrtUWizPqmSZ4RamliXt+kioI6A/Phf6r6V3/tupEVBcvVzTi8LamzUomj3vYXOwJNN4IVWjdoCf0kZTB8Sz7xwXsvGnEkAlhRJD7ZEG2s= + secure: TV6bx7xKGz4dVbcmnp1Oy8zXhyvkOeg3xOga7PxIlE+Grof2+a7oNJk8kk8ti0Wmnx3KznmJnKw7qHauijfMFOvJJaMvDLx499L07jjA/x9D93U0tUvpcy8hCIGwWHaoyr3UFjopFKt7RdUBVW2MtXWtvLwVuQmnwoFKwHbN970= email: recipients: - secure: jvtlCYaUCPzvE985LlJpEGIIgVzhkEUi/ImAa4fLxyGKAmTG1JsykDznwquggN5UbTFlOYS+i+rFmPLm4hLJf9bGUtl/yk90KN0NlHZfZ+x7EE/nTIpr6iaK8TqdrmaMNnwuj87/6zBdl9iKjzU/1lrBnz1hanUABU96kbWFFJE= + secure: lCRwaxvOAOnv6FHwATCeufywriNoksNnexTMYX3lIGTcTfVJN1n3EZoicaZ5KiwG0cHdFX7Na2lBjCELpOtL9ZOOYf1zg+9/ily8Kc2InQvnv9dsySa7HAXPto12pprwajFqlbULCWVP8HJiMv8U5QRGnc39+K83Ev35YEHZLkk= diff --git a/README.md b/README.md index 828dd33d..18e74510 100755 --- a/README.md +++ b/README.md @@ -15,13 +15,15 @@ Dependency Status Dev Dependency Status
-Slack community badge -Patreon donate button +Patreon donate button +Open Collective donate button Gratipay donate button -Flattr donate button -PayPal donate button +Flattr donate button +PayPal donate button Bitcoin donate button Wishlist browse button +
+Slack community badge @@ -145,10 +147,11 @@ These amazing people have contributed finances to this project: Become a sponsor! -Patreon donate button +Patreon donate button +Open Collective donate button Gratipay donate button -Flattr donate button -PayPal donate button +Flattr donate button +PayPal donate button Bitcoin donate button Wishlist browse button @@ -171,7 +174,7 @@ These amazing people have contributed code to this project:
  • Chase Colmanview contributions
  • Lukasz Gornickiview contributions
  • eldiosview contributions
  • -
  • Shih-Yung Leeview contributions
  • +
  • syleeview contributions
  • Eduardo Lavaqueview contributions
  • Homme Zwaagstraview contributions
  • JT Turner
  • @@ -202,7 +205,7 @@ These amazing people have contributed code to this project:
  • vsopvsopview contributions
  • Zearinview contributions
  • Firedeview contributions
  • -
  • JT Turnerview contributions
  • +
  • JT Turnerview contributions
  • Anton Wilhelmview contributions
  • Bahtiar Gadimovview contributions
  • Ke Zhuview contributions
  • diff --git a/docs/api.js b/docs/api.js deleted file mode 100644 index 49ce4e9b..00000000 --- a/docs/api.js +++ /dev/null @@ -1,26 +0,0 @@ -YUI.add("yuidoc-meta", function(Y) { - Y.YUIDoc = { meta: { - "classes": [ - "BasePlugin", - "Collection", - "Docpad", - "DocumentModel", - "ElementsCollection", - "Events", - "FileModel", - "FilesCollection", - "MetaCollection", - "Model", - "PluginLoader", - "PluginTester", - "QueryCollection", - "ScriptCollection", - "ServerTester", - "StylesCollection", - "docpadUtil" - ], - "modules": [], - "allModules": [], - "elements": [] -} }; -}); \ No newline at end of file diff --git a/docs/assets/css/external-small.png b/docs/assets/css/external-small.png deleted file mode 100755 index 759a1cdcb5b1697e5be290d98b830e279cd71f3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmVDs{zR1^XE?tfB*h@ASKHAa7wwn{MEbP z7_^nS7{V*>+A}bS;P%45fB%Ai|Neasi2rl3{=EO;!w318%8Ovl7jArHc=P5Brfr~D z0AYimtss2w$hlYlfd>7*aO3TNzw875LBK0xAD9Np|A(oEVYnB*eE9~V6wP%78SXuL z&#-X)Er#`zY#Ce)^8hM>B_8 diff --git a/docs/assets/css/logo.png b/docs/assets/css/logo.png deleted file mode 100755 index c82444af95895d38bea6fe96cc5354a7419f770c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7143 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