diff --git a/.babelrc b/.babelrc index cba4a1b6..2292052e 100644 --- a/.babelrc +++ b/.babelrc @@ -1,34 +1,3 @@ { - "presets": [ - [ - "env", { - "targets": { - "ie": 9, - "chrome": 27, - "firefox": 30, - "safari": 5, - "opera": 23 - }, - "modules": false - } - ] - ], - - "plugins": [ - [ "transform-flow-strip-types", { "loose": true } ], - [ "transform-object-rest-spread", { "loose": true } ], - [ "syntax-object-rest-spread", { "loose": true } ], - [ "transform-es3-property-literals", { "loose": true } ], - [ "transform-es3-member-expression-literals", { "loose": true } ], - [ "transform-es2015-for-of", { "loose": true } ] - ], - - "env": { - "test": { - "plugins": [ - [ "flow-runtime", { "assert": true, "annotate": true } ], - [ "istanbul", { "only": "./src" } ] - ] - } - } + "extends": "grumbler-scripts/config/.babelrc" } \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index ac33394c..4aee388a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,473 +1,5 @@ /* @flow */ module.exports = { - - 'parser': 'babel-eslint', - - 'plugins': [ - 'flowtype', - 'compat', - 'unicorn', - 'eslint-comments', - 'promise', - 'security', - 'import', - 'const-immutable', - 'react' - ], - - 'env': { - 'browser': true, - 'node': true, - 'amd': false, - 'mocha': true, - 'es6': true - }, - - 'settings': { - 'import/extensions': [ '.js', '.jsx' ], - 'import/resolver': { - 'node': { - 'extensions': [ '.js', '.jsx' ] - } - } - }, - - 'parserOptions': { - 'ecmaVersion': 2017, - 'sourceType': 'module' - }, - - 'globals': { - 'window': true, - 'document': true, - 'Promise': false, - 'performance': true, - 'assert': true, - '__TEST__': true - }, - - 'rules': { - // possible errors - 'comma-dangle': 'error', - 'no-cond-assign': 'error', - 'no-console': 'error', - 'no-constant-condition': 'error', - 'no-control-regex': 'error', - 'no-debugger': 'error', - 'no-dupe-args': 'error', - 'no-dupe-keys': 'error', - 'no-duplicate-case': 'error', - 'no-empty-character-class': 'error', - 'no-empty': 'error', - 'no-ex-assign': 'error', - 'no-extra-boolean-cast': 'error', - 'no-extra-parens': 'off', - 'no-extra-semi': 'error', - 'no-func-assign': 'error', - 'no-inner-declarations': [ 'error', 'functions' ], - 'no-invalid-regexp': 'error', - 'no-irregular-whitespace': 'error', - 'no-negated-in-lhs': 'error', - 'no-obj-calls': 'error', - 'no-regex-spaces': 'error', - 'no-sparse-arrays': 'error', - 'no-unexpected-multiline': 'error', - 'no-unreachable': 'error', - 'quote-props': [ 'error', 'consistent' ], - 'use-isnan': 'error', - 'valid-jsdoc': 'off', - 'valid-typeof': 'error', - - // best practices - 'accessor-pairs': 'off', - 'array-callback-return': 'error', - 'block-scoped-var': 'error', - 'complexity': [ 'error', 20], - 'consistent-return': 'off', - 'curly': [ 'error', 'all' ], - 'default-case': 'error', - 'dot-location': 'off', - 'dot-notation': 'error', - 'eqeqeq': 'error', - 'guard-for-in': 'error', - 'no-alert': 'error', - 'no-caller': 'error', - 'no-case-declarations': 'error', - 'no-div-regex': 'error', - 'no-else-return': 'off', - 'no-empty-function': 'error', - 'no-empty-pattern': 'error', - 'no-eq-null': 'error', - 'no-eval': 'error', - 'no-extend-native': 'error', - 'no-extra-bind': 'error', - 'no-extra-label': 'error', - 'no-fallthrough': 'error', - 'no-floating-decimal': 'error', - 'no-implicit-coercion': 'error', - 'no-implicit-globals': 'error', - 'no-implied-eval': 'error', - 'no-invalid-this': 'off', - 'no-iterator': 'error', - 'no-labels': 'error', - 'no-lone-blocks': 'error', - 'no-loop-func': 'off', - 'no-magic-numbers': 'off', - 'no-multi-spaces': 'off', - 'no-multi-str': 'error', - 'no-native-reassign': 'error', - 'no-new-func': 'error', - 'no-new-wrappers': 'error', - 'no-new': 'error', - 'no-octal-escape': 'error', - 'no-octal': 'error', - 'no-param-reassign': 'off', - 'no-process-env': 'error', - 'no-proto': 'error', - 'no-redeclare': 'error', - 'no-return-assign': 'error', - 'no-script-url': 'error', - 'no-self-assign': 'error', - 'no-self-compare': 'error', - 'no-sequences': 'error', - 'no-throw-literal': 'error', - 'no-unmodified-loop-condition': 'error', - 'no-unused-expressions': 'error', - 'no-unused-labels': 'error', - 'no-useless-call': 'error', - 'no-useless-concat': 'error', - 'no-void': 'error', - 'no-warning-comments': 'error', - 'no-with': 'error', - 'radix': 'error', - 'vars-on-top': 'off', - 'wrap-iife': 'error', - 'yoda': 'error', - - // strict - 'strict': [ 'error', 'global' ], - - // variables - 'init-declarations': 'off', - 'no-catch-shadow': 'error', - 'no-delete-var': 'error', - 'no-label-var': 'error', - 'no-restricted-globals': [ 'error', 'Promise', 'atob', 'btoa' ], - 'no-shadow-restricted-names': 'error', - 'no-shadow': 'error', - 'no-undef-init': 'error', - 'no-undef': 'error', - 'no-undefined': 'off', - 'no-unused-vars': 'error', - 'no-use-before-define': 'error', - - // node.js - 'callback-return': 'off', - 'global-require': 'off', - 'handle-callback-err': 'error', - 'no-mixed-requires': 'error', - 'no-new-require': 'error', - 'no-path-concat': 'error', - 'no-process-exit': 'error', - 'no-restricted-modules': 'off', - 'no-sync': 'error', - - // stylistic issues - 'array-bracket-spacing': [ 'error', 'always' ], - 'block-spacing': 'error', - 'brace-style': 'off', - 'camelcase': 'off', - 'comma-spacing': [ 'error', { 'before': false, 'after': true } ], - 'comma-style': [ 'error', 'last' ], - 'computed-property-spacing': 'off', - 'consistent-this': [ 'error', 'self' ], - 'eol-last': 'error', - 'func-names': [ 'error', 'as-needed' ], - 'func-style': [ 'off', 'declaration' ], - 'id-blacklist': 'off', - 'id-length': 'off', - 'id-match': 'off', - 'indent': [ 'error', 4], - 'jsx-quotes': 'off', - 'key-spacing': [ 'error', { 'afterColon': true, 'mode': 'minimum', 'align': { 'beforeColon': false, 'afterColon': true, 'on': 'value', 'mode': 'minimum' } } ], - 'keyword-spacing': 'error', - 'linebreak-style': [ 'error', 'unix' ], - 'lines-around-comment': 'off', - 'max-depth': [ 'error', 5 ], - 'max-len': [ 'off', 120, 4], - 'max-nested-callbacks': [ 'error', 4], - 'max-params': [1, 5], - 'max-statements': 'off', - 'new-cap': 'error', - 'new-parens': 'error', - 'newline-after-var': 'off', - 'newline-before-return': 'off', - 'newline-per-chained-call': 'off', - 'no-array-constructor': 'error', - 'no-bitwise': 'error', - 'no-continue': 'off', - 'no-inline-comments': 'off', - 'no-lonely-if': 'off', - 'no-mixed-spaces-and-tabs': [ 'error', true], - 'no-multiple-empty-lines': 'error', - 'no-negated-condition': 'off', - 'no-nested-ternary': 'error', - 'no-new-object': 'error', - 'no-plusplus': [ 'error', { 'allowForLoopAfterthoughts': true } ], - 'no-restricted-syntax': 'off', - 'no-spaced-func': 'error', - 'no-ternary': 'off', - 'no-trailing-spaces': [ 'error', { 'skipBlankLines': true } ], - 'no-underscore-dangle': 'off', - 'no-unneeded-ternary': 'off', - 'no-whitespace-before-property': 'error', - 'object-curly-spacing': [ 'error', 'always' ], - 'one-var': 'off', - 'one-var-declaration-per-line': [ 'error', 'always' ], - 'operator-assignment': [ 'error', 'always' ], - 'operator-linebreak': 'off', - 'padded-blocks': 'off', - 'quotes': [ 'error', 'single', { 'allowTemplateLiterals': true } ], - 'require-jsdoc': 'off', - 'semi-spacing': 'error', - 'semi': 'error', - 'sort-imports': 'off', - 'sort-vars': 'off', - 'space-before-blocks': [ 'error', 'always' ], - 'space-before-function-paren': 'off', - 'space-in-parens': [ 'error', 'never' ], - 'space-infix-ops': 'error', - 'space-unary-ops': [ 'error', { 'words': true, 'nonwords': false } ], - 'spaced-comment': 'error', - 'wrap-regex': 'error', - - // ES6 - - // require braces in arrow function body - 'arrow-body-style': 'off', - // require parens in arrow function arguments - 'arrow-parens': 'off', - // require space before/after arrow functions arrow - 'arrow-spacing': 'error', - // verify super() callings in constructors - 'constructor-super': 'error', - // enforce the spacing around the * in generator functions - 'generator-star-spacing': 'off', - // disallow modifying variables of class declarations - 'no-class-assign': 'error', - 'no-confusing-arrow': 'error', - // disallow modifying variables that are declared using const - 'no-const-assign': 'error', - // disallow duplicate name in class members - 'no-dupe-class-members': 'error', - 'no-new-symbol': 'error', - 'no-restricted-imports': 'off', - // disallow to use this/super before super() calling in constructors. - 'no-this-before-super': 'error', - 'no-useless-constructor': 'error', - // require let or const instead of var - 'no-var': 1, - // require method and property shorthand syntax for object literals - 'object-shorthand': 1, - // suggest using arrow functions as callbacks - 'prefer-arrow-callback': 'error', - // suggest using of const declaration for variables that are never modified after declared - 'prefer-const': 'off', - 'prefer-rest-params': 'off', - // suggest using Reflect methods where applicable - 'prefer-reflect': 'off', - // suggest using the spread operator instead of .apply() - 'prefer-spread': 'off', - // suggest using template literals instead of strings concatenation - 'prefer-template': 'error', - // disallow generator functions that do not have yield - 'require-yield': 'error', - 'template-curly-spacing': [ 'error', 'always' ], - 'yield-star-spacing': 'off', - - 'flowtype/boolean-style': [ 'error', 'boolean' ], - 'flowtype/define-flow-type': 'error', - 'flowtype/delimiter-dangle': [ 'error', 'never' ], - 'flowtype/generic-spacing': [ 'error', 'never' ], - 'flowtype/no-primitive-constructor-types': 'error', - 'flowtype/no-weak-types': [ 'error', { 'any': true, 'Object': false, 'Function': false } ], - 'flowtype/object-type-delimiter': [ 'error', 'comma' ], - 'flowtype/require-parameter-type': [ 'off', { 'excludeArrowFunctions': true } ], - 'flowtype/require-return-type': [ 'error', 'always', { 'annotateUndefined': 'never', 'excludeArrowFunctions': true } ], - 'flowtype/require-valid-file-annotation': [ 'error', 'always', { 'annotationStyle': 'block' } ], - 'flowtype/semi': [ 'error', 'always' ], - 'flowtype/space-after-type-colon': [ 'error', 'always', { 'allowLineBreak': true } ], - 'flowtype/space-before-generic-bracket': [ 'error', 'never' ], - 'flowtype/space-before-type-colon': [ 'error', 'always' ], - 'flowtype/type-id-match': [ 'off', '^([A-Z][a-z0-9]+)+$' ], - 'flowtype/union-intersection-spacing': [ 'error', 'always' ], - 'flowtype/use-flow-type': 'error', - 'flowtype/valid-syntax': 'error', - 'flowtype/no-dupe-keys': 'error', - 'flowtype/no-types-missing-file-annotation': 'error', - 'flowtype/require-variable-type': 'off', - 'flowtype/sort-keys': 'off', - - 'compat/compat': 'error', - - 'unicorn/catch-error-name': [ 'error', { 'name': 'err' } ], - 'unicorn/explicit-length-check': 'off', - 'unicorn/filename-case': [ 'error', { 'case': 'camelCase' } ], - 'unicorn/no-abusive-eslint-disable': 'error', - 'unicorn/no-process-exit': 'error', - 'unicorn/throw-new-error': 'error', - 'unicorn/number-literal-case': 'error', - 'unicorn/escape-case': 'error', - 'unicorn/no-array-instanceof': 'error', - 'unicorn/no-new-buffer': 'error', - 'unicorn/no-hex-escape': 'error', - 'unicorn/custom-error-definition': 'error', - 'unicorn/prefer-starts-ends-with': 'off', - 'unicorn/prefer-type-error': 'error', - 'unicorn/no-fn-reference-in-iterator': 'off', - 'unicorn/import-index': 'off', - 'unicorn/new-for-builtins': 'off', - 'unicorn/regex-shorthand': 'off', - - 'eslint-comments/disable-enable-pair': 'error', - 'eslint-comments/no-duplicate-disable': 'error', - 'eslint-comments/no-unlimited-disable': 'error', - 'eslint-comments/no-unused-disable': 'error', - 'eslint-comments/no-unused-enable': 'error', - 'eslint-comments/no-use': 'off', - - 'promise/always-return': 'off', - 'promise/no-return-wrap': 'error', - 'promise/param-names': 'error', - 'promise/catch-or-return': 'error', - 'promise/no-native': 'error', - 'promise/no-nesting': 'off', - 'promise/no-promise-in-callback': 'error', - 'promise/no-callback-in-promise': 'off', - 'promise/avoid-new': 'off', - 'promise/prefer-await-to-callbacks': 'off', - 'promise/prefer-await-to-then': 'off', - - 'security/detect-unsafe-regex': 'error', - 'security/detect-non-literal-regexp': 'error', - 'security/detect-non-literal-require': 'error', - 'security/detect-non-literal-fs-filename': 'off', - 'security/detect-eval-with-expression': 'error', - 'security/detect-pseudoRandomBytes': 'error', - 'security/detect-possible-timing-attacks': 'off', - 'security/detect-no-csrf-before-method-override': 'error', - 'security/detect-buffer-noassert': 'error', - 'security/detect-child-process': 'error', - 'security/detect-disable-mustache-escape': 'error', - 'security/detect-object-injection': 'off', - 'security/detect-new-buffer': 'error', - - 'import/default': 'error', - 'import/export': 'error', - 'import/extensions': 'error', - 'import/first': 'error', - 'import/max-dependencies': 'off', - 'import/named': 'error', - 'import/namespace': 'error', - 'import/newline-after-import': 'error', - 'import/no-absolute-path': 'error', - 'import/no-amd': 'error', - 'import/no-anonymous-default-export': 'off', - 'import/no-commonjs': 'error', - 'import/no-deprecated': 'error', - 'import/no-duplicates': 'error', - 'import/no-dynamic-require': 'error', - 'import/no-extraneous-dependencies': 'error', - 'import/no-internal-modules': 'off', - 'import/no-mutable-exports': 'off', - 'import/no-named-as-default': 'error', - 'import/no-named-as-default-member': 'error', - 'import/no-named-default': 'error', - 'import/no-namespace': 'error', - 'import/no-nodejs-modules': 'error', - 'import/no-restricted-paths': 'error', - 'import/no-unassigned-import': [ 'error', { 'allow': [ 'test/**' ] } ], - 'import/no-unresolved': 'error', - 'import/no-webpack-loader-syntax': 'error', - 'import/order': [ 'error', { 'newlines-between': 'always' } ], - 'import/prefer-default-export': 'off', - 'import/unambiguous': 'off', - - 'const-immutable/no-mutation': 'error', - - 'react/jsx-boolean-value': 'off', - 'react/jsx-closing-bracket-location': [ 'error', 'after-props' ], - 'react/jsx-closing-tag-location': 'error', - 'react/jsx-curly-spacing': [ 'error', { 'when': 'always', 'allowMultiline': false } ], - 'react/jsx-equals-spacing': [ 'error', 'never' ], - 'react/jsx-filename-extension': 'error', - 'react/jsx-first-prop-new-line': [ 'error', 'multiline-multiprop' ], - 'react/jsx-handler-names': 'off', - 'react/jsx-indent': [ 'error', 4 ], - 'react/jsx-indent-props': [ 'error', 4 ], - 'react/jsx-key': 'off', - 'react/jsx-max-props-per-line': 'off', - 'react/jsx-no-bind': 'off', - 'react/jsx-no-comment-textnodes': 'error', - 'react/jsx-no-duplicate-props': 'error', - 'react/jsx-no-literals': 'off', - 'react/jsx-no-target-blank': 'off', - 'react/jsx-no-undef': 'error', - 'react/jsx-curly-brace-presence': 'off', - 'react/jsx-pascal-case': 'off', - 'react/jsx-sort-props': 'off', - 'react/jsx-tag-spacing': 'error', - 'react/jsx-uses-react': 'off', - 'react/jsx-uses-vars': 'error', - 'react/jsx-wrap-multilines': 'error', - - 'array-bracket-newline': 'off', - 'array-element-newline': 'off', - 'capitalized-comments': 'off', - 'class-methods-use-this': 'off', - - 'for-direction': 'off', - 'func-call-spacing': 'off', - 'func-name-matching': 'off', - 'getter-return': 'off', - 'line-comment-position': 'off', - 'max-lines': [ 'error', 500 ], - 'max-statements-per-line': [ 'error', { 'max': 1 } ], - 'multiline-ternary': 'off', - 'no-await-in-loop': 'off', - 'no-buffer-constructor': 'off', - 'no-compare-neg-zero': 'error', - 'no-duplicate-imports': 'error', - 'no-global-assign': 'error', - 'no-mixed-operators': 'error', - 'no-multi-assign': 'off', - 'no-prototype-builtins': 'off', - 'no-restricted-properties': 'off', - 'no-return-await': 'off', - 'no-tabs': 'error', - 'no-template-curly-in-string': 'error', - 'no-unsafe-finally': 'error', - 'no-unsafe-negation': 'error', - 'no-useless-computed-key': 'error', - 'no-useless-escape': 'error', - 'no-useless-rename': 'error', - 'no-useless-return': 'error', - 'nonblock-statement-body-position': 'error', - 'object-curly-newline': 'off', - 'object-property-newline': 'off', - 'padding-line-between-statements': 'off', - 'prefer-destructuring': 'off', - 'prefer-numeric-literals': 'error', - 'prefer-promise-reject-errors': 'error', - 'require-await': 'error', - 'rest-spread-spacing': 'error', - 'semi-style': 'error', - 'sort-keys': 'off', - 'switch-colon-spacing': 'off', - 'symbol-description': 'off', - 'template-tag-spacing': 'off', - 'unicode-bom': 'off' - } - -} + 'extends': './node_modules/grumbler-scripts/config/.eslintrc.js' +}; \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 0c598266..2273e6ca 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,149 +1,15 @@ /* @flow */ -import { argv } from 'yargs'; +import { getKarmaConfig } from 'grumbler-scripts/config/karma.conf'; import { WEBPACK_CONFIG_TEST } from './webpack.config'; -export default function configKarma(config : Object) { - - let debug = Boolean(argv.debug); - let quick = Boolean(argv.quick); - let captureConsole = Boolean(argv.console); - let keepOpen = Boolean(argv['keep-open']) || debug; - let autoWatch = Boolean(keepOpen); - let coverage = !argv['no-coverage'] && !quick; - let logLevel = argv['log-level'] || argv.loglevel || (keepOpen ? 'info' : ''); - let headless = !keepOpen; - - // $FlowFixMe - let browsers: string = argv.browser; - - let karmaConfig : Object = { - - files: [ - { - pattern: 'node_modules/babel-polyfill/dist/polyfill.js', - included: true, - served: true - }, - - { - pattern: 'test/test.js', - included: true, - served: true - } - ], - - preprocessors: { - 'test/test.js': [ 'webpack', 'sourcemap' ], - 'test/windows/**/*.js': [ 'webpack', 'sourcemap' ], - 'src/**/*.js': [ 'coverage', 'sourcemap' ] - }, - - customLaunchers: { - - xChrome: { - base: 'Chrome', - flags: [ - '--no-sandbox', - '--disable-gpu', - '--remote-debugging-port=9222', - '--remote-debugging-address=0.0.0.0', - // '--auto-open-devtools-for-tabs', - '--enable-precise-memory-info', - '--js-flags="--expose-gc"' - ], - debug - }, - - xPhantom: { - base: 'PhantomJS', - flags: [ - '--load-images=true', - '--disk-cache=true', - '--disk-cache-path=node_modules/.cache/phantomjs', - '--max-disk-cache-size=1000000' - ], - debug - } - - }, - - webpack: WEBPACK_CONFIG_TEST, - - reporters: [ - quick ? 'progress' : 'spec' - ], - - autoWatch, - logLevel: debug ? config.LOG_DEBUG : logLevel || config.LOG_WARN, +export default function configKarma(karma : Object) { + let karmaConfig = getKarmaConfig(karma, { basePath: __dirname, + webpack: WEBPACK_CONFIG_TEST + }); - frameworks: [ - 'mocha', - 'sinon-chai' - ], - - client: { - captureConsole - }, - - port: 9876, - - colors: true, - - webpackMiddleware: { - noInfo: !debug, - stats: !debug - }, - - browserNoActivityTimeout: 60 * 60 * 1000, - browserDisconnectTimeout: 30 * 1000, - browserDisconnectTolerance: 2, - captureTimeout: 120000, - reportSlowerThan: 10000, - - browserConsoleLogOptions: { - level: debug ? 'debug' : 'error', - format: '%b %T: %m', - terminal: true - }, - - singleRun: !keepOpen - }; - - if (browsers) { - karmaConfig.browsers = browsers.split(','); - } else { - karmaConfig.browsers = [ 'xChrome' ]; - } - - if (coverage) { - karmaConfig.reporters.push('coverage'); - - karmaConfig.coverageReporter = { - instrumenterOptions: { - istanbul: { - noCompact: true - } - }, - reporters: [ - { - type: 'text' - }, - { - type: 'html', - dir: 'coverage/', - subdir: '.' - } - ] - }; - } - - if (headless) { - karmaConfig.customLaunchers.xChrome.flags.push('--headless'); - } - - config.set(karmaConfig); + karma.set(karmaConfig); } diff --git a/package.json b/package.json index 736a8bba..db783fe7 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "release:major": "./publish.sh major", "clean": "rimraf dist coverage", "reinstall": "rimraf flow-typed && rimraf node_modules && npm install && flow-typed install", - "postinstall": "flow-typed install", "debug": "cross-env NODE_ENV=debug" }, "files": [ @@ -49,69 +48,6 @@ ], "readmeFilename": "README.md", "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.7.7", - "babel-eslint": "^8.0.1", - "babel-loader": "^7.0.0", - "babel-plugin-add-module-exports": "^0.2.1", - "babel-plugin-flow-runtime": "^0.11.1", - "babel-plugin-istanbul": "^4.1.4", - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "babel-plugin-transform-decorators": "^6.13.0", - "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-plugin-transform-es2015-for-of": "^6.8.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", - "babel-plugin-transform-es3-member-expression-literals": "^6.5.0", - "babel-plugin-transform-es3-property-literals": "^6.5.0", - "babel-plugin-transform-flow-strip-types": "^6.18.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-polyfill": "^6.23.0", - "babel-preset-env": "^1.6.0", - "chai": "^4.0.1", - "circular-dependency-plugin": "^4.2.0", - "cross-env": "^5.0.5", - "eslint": "^4", - "eslint-friendly-formatter": "^3.0.0", - "eslint-plugin-compat": "^2.0.1", - "eslint-plugin-const-immutable": "^2.0.0", - "eslint-plugin-eslint-comments": "^1.0.3", - "eslint-plugin-flowtype": "^2.30.0", - "eslint-plugin-import": "^2.7.0", - "eslint-plugin-promise": "^3.5.0", - "eslint-plugin-react": "^7.4.0", - "eslint-plugin-security": "^1.4.0", - "eslint-plugin-unicorn": "^2.1.2", - "flow-bin": "^0.57.2", - "flow-runtime": "^0.14.0", - "flow-typed": "^2.2.0", - "ifdef-loader": "^2.0.3", - "istanbul-instrumenter-loader": "^3.0.0", - "karma": "^1.7.0", - "karma-chrome-launcher": "^2.1.1", - "karma-commonjs": "^1.0.0", - "karma-coverage": "^1.0.0", - "karma-firefox-launcher": "^1.0.0", - "karma-ie-launcher": "^1.0.0", - "karma-mocha": "^1.0.1", - "karma-phantomjs-launcher": "^1.0.0", - "karma-safari-launcher": "^1.0.0", - "karma-sinon-chai": "^1.2.0", - "karma-sourcemap-loader": "^0.3.7", - "karma-spec-reporter": "0.0.31", - "karma-webpack": "^2.0.3", - "lolex": "^2.1.2", - "mocha": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7", - "querystring": "^0.2.0", - "raw-loader": "^0.5.1", - "sinon": "^4.0.1", - "sinon-chai": "^2.8.0", - "text-loader": "0.0.1", - "uglify-js": "3.1.3", - "uglifyjs-webpack-plugin": "^0.4.3", - "webpack": "^3.5.5", - "webpack-stream": "^4.0.0", - "yargs": "^9.0.1" - }, - "dependencies": {} + "grumbler-scripts": "^1.0.0" + } } diff --git a/webpack.config.js b/webpack.config.js index 01051c8d..28e789a8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,117 +1,11 @@ /* @flow */ /* eslint import/no-nodejs-modules: off */ -import path from 'path'; -import qs from 'querystring'; - -import webpack from 'webpack'; -import UglifyJSPlugin from 'uglifyjs-webpack-plugin'; -import CircularDependencyPlugin from 'circular-dependency-plugin'; +import { getWebpackConfig } from 'grumbler-scripts/config/webpack.config'; const FILE_NAME = 'mylibrary'; const MODULE_NAME = 'mylibrary'; -const DEFAULT_VARS = { - __TEST__: false, - __MIN__: false -}; - -type WebpackConfigOptions = { - filename : string, - modulename : string, - minify? : boolean, - options? : Object, - vars? : { [string] : mixed } -}; - -function getWebpackConfig({ filename, modulename, minify = false, options = {}, vars = {} } : WebpackConfigOptions) : Object { - - vars = { - ...DEFAULT_VARS, - ...vars - }; - - const PREPROCESSOR_OPTS = { - 'ifdef-triple-slash': 'false', - ...vars - }; - - return { - - entry: './src/index.js', - - output: { - path: path.resolve('./dist'), - filename, - libraryTarget: 'umd', - umdNamedDefine: true, - library: modulename, - pathinfo: false - }, - - resolve: { - modules: [ - __dirname, - 'node_modules' - ] - }, - - module: { - rules: [ - { - test: /\.js$/, - loader: `ifdef-loader?${ qs.encode(PREPROCESSOR_OPTS) }` - }, - { - test: /sinon\.js$/, - loader: 'imports?define=>false,require=>false' - }, - { - test: /\.js$/, - exclude: /(dist)/, - loader: 'babel-loader' - }, - { - test: /\.(html?|css|json)$/, - loader: 'raw-loader' - } - ] - }, - - bail: true, - - devtool: 'source-map', - - plugins: [ - new webpack.SourceMapDevToolPlugin({ - filename: '[file].map' - }), - new webpack.DefinePlugin({ - __TEST__: false, - ...vars - }), - new webpack.NamedModulesPlugin(), - new UglifyJSPlugin({ - test: /\.js$/, - beautify: !minify, - minimize: minify, - compress: { - warnings: false, - sequences: minify - }, - mangle: minify, - sourceMap: true - }), - new CircularDependencyPlugin({ - exclude: /node_modules/, - failOnError: true - }) - ], - - ...options - }; -} - export let WEBPACK_CONFIG = getWebpackConfig({ filename: `${ FILE_NAME }.js`, modulename: MODULE_NAME