diff --git a/.eslintignore b/.eslintignore index 17ae690..5f710f4 100644 --- a/.eslintignore +++ b/.eslintignore @@ -5,3 +5,6 @@ dist !*.*js !*.*ts + +memoize-fs.js +# globbing.js diff --git a/.eslintrc.js b/.eslintrc.js index 53f15eb..45b3ed2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,10 @@ 'use strict'; module.exports = { + parser: 'babel-eslint', + parserOptions: { + ecmaVersion: 2020, + }, extends: [ '@tunnckocore/eslint-config', '@tunnckocore/eslint-config/mdx', @@ -9,4 +13,7 @@ module.exports = { '@tunnckocore/eslint-config/promise', '@tunnckocore/eslint-config/unicorn', ], + rules: { + 'import/no-unresolved': 'off', + }, }; diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index d650ee9..0acd9e2 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -46,8 +46,10 @@ jobs: - name: Installing dependencies if: steps.nodejs-cache.outputs.cache-hit != 'true' run: yarn run setup:ci - - name: Linting & Format codebase with ESLint and Prettier - run: yarn run lint && yarn run format + - name: Linting & Format with Hela ESLint + run: yarn run lint + - name: Format full codebase with Prettier + run: yarn run format test: if: "!contains(toJson(github.event.commits), '[skip ci]')" env: diff --git a/.hela.config.js b/.hela.config.js new file mode 100644 index 0000000..71c61ac --- /dev/null +++ b/.hela.config.js @@ -0,0 +1,6 @@ +'use strict'; + +const helaDev = require('@hela/dev'); + +Object.assign(exports, helaDev); +exports.eslint = require('@hela/eslint').helaCommand(); diff --git a/.lint.config.js b/.lint.config.js new file mode 100644 index 0000000..e877ecd --- /dev/null +++ b/.lint.config.js @@ -0,0 +1 @@ +module.exports = {"env":{"es6":true,"es2020":true,"jest":true,"node":true,"commonjs":true},"globals":{},"parser":"/home/charlike/github/hela/node_modules/babel-eslint/lib/index.js","parserOptions":{"ecmaVersion":2020,"sourceType":"module","ecmaFeatures":{"generators":false,"objectLiteralDuplicateProperties":false}},"plugins":["import","prettier","no-use-extend-native","node","promise","unicorn"],"rules":{"import/no-unresolved":["off",{"commonjs":true,"caseSensitive":true}],"unicorn/prevent-abbreviations":["off"],"prefer-destructuring":["error",{"object":true,"array":false}],"unicorn/no-unreadable-array-destructuring":["error"],"unicorn/no-unused-properties":["error"],"unicorn/no-unsafe-regex":["error"],"unicorn/import-index":["off"],"unicorn/custom-error-definition":["error"],"unicorn/filename-case":["off"],"unicorn/catch-error-name":["error",{"name":"err"}],"unicorn/prefer-add-event-listener":["off"],"unicorn/no-process-exit":["error"],"unicorn/consistent-function-scoping":["error"],"unicorn/error-message":["error"],"unicorn/escape-case":["error"],"unicorn/expiring-todo-comments":["error"],"unicorn/explicit-length-check":["error"],"unicorn/new-for-builtins":["error"],"unicorn/no-abusive-eslint-disable":["error"],"unicorn/no-array-instanceof":["error"],"unicorn/no-console-spaces":["error"],"unicorn/no-fn-reference-in-iterator":["off"],"unicorn/no-for-loop":["error"],"unicorn/no-hex-escape":["error"],"unicorn/no-keyword-prefix":["off"],"no-nested-ternary":["off"],"unicorn/no-nested-ternary":["error"],"unicorn/no-new-buffer":["error"],"unicorn/no-zero-fractions":["error"],"unicorn/number-literal-case":["error"],"unicorn/prefer-dataset":["error"],"unicorn/prefer-event-key":["error"],"unicorn/prefer-exponentiation-operator":["error"],"unicorn/prefer-flat-map":["error"],"unicorn/prefer-includes":["error"],"unicorn/prefer-modern-dom-apis":["error"],"unicorn/prefer-negative-index":["error"],"unicorn/prefer-node-append":["error"],"unicorn/prefer-node-remove":["error"],"unicorn/prefer-query-selector":["error"],"unicorn/prefer-reflect-apply":["error"],"unicorn/prefer-spread":["error"],"unicorn/prefer-starts-ends-with":["error"],"unicorn/prefer-string-slice":["error"],"unicorn/prefer-text-content":["error"],"unicorn/prefer-trim-start-end":["error"],"unicorn/prefer-type-error":["error"],"unicorn/regex-shorthand":["error"],"unicorn/throw-new-error":["error"],"promise/catch-or-return":["off"],"promise/always-return":["off"],"promise/no-native":["off"],"promise/no-nesting":["off"],"promise/no-promise-in-callback":["off"],"promise/no-callback-in-promise":["off"],"promise/avoid-new":["off"],"promise/prefer-await-to-then":["error"],"promise/prefer-await-to-callbacks":["error"],"promise/no-return-wrap":["error",{"allowReject":true}],"promise/param-names":["error"],"promise/no-new-statics":["error"],"promise/no-return-in-finally":["error"],"promise/valid-params":["error"],"node/no-deprecated-api":["error"],"node/no-exports-assign":["error"],"node/no-unpublished-bin":["error"],"node/no-unsupported-features/es-builtins":["error"],"node/no-unsupported-features/es-syntax":["off"],"node/no-unsupported-features/node-builtins":["error"],"no-process-exit":["off"],"node/process-exit-as-throw":["error"],"node/shebang":["error"],"node/exports-style":["off"],"node/file-extension-in-import":["error","never",{".css":"always",".scss":"always",".sass":"always",".less":"always",".json":"always"}],"node/prefer-global/buffer":["error"],"node/prefer-global/console":["error"],"node/prefer-global/process":["error"],"node/prefer-global/text-decoder":["error"],"node/prefer-global/text-encoder":["error"],"node/prefer-global/url-search-params":["error"],"node/prefer-global/url":["error"],"node/prefer-promises/dns":["error"],"node/prefer-promises/fs":["error"],"no-empty":["error",{"allowEmptyCatch":true}],"no-extend-native":["error"],"no-use-extend-native/no-use-extend-native":["error"],"strict":["off","global"],"func-names":["error","always"],"arrow-parens":["error","always",{"requireForBlockBody":true}],"prefer-arrow-callback":["error",{"allowNamedFunctions":true,"allowUnboundThis":true}],"max-params":["error",{"max":3}],"max-statements":["error",{"max":20}],"max-statements-per-line":["error",{"max":1}],"max-nested-callbacks":["error",{"max":4}],"max-depth":["error",{"max":4}],"arrow-body-style":["error","as-needed",{"requireReturnForObjectLiteral":false}],"no-use-before-define":["error",{"functions":false,"classes":true,"variables":true}],"no-param-reassign":["error",{"props":true,"ignorePropertyModificationsFor":["acc","accumulator","e","ctx","req","request","res","response","$scope","staticContext","err","x","_","opts","options","settings","config","cfg"]}],"no-unused-vars":["error",{"ignoreRestSiblings":true,"vars":"all","varsIgnorePattern":"^(?:$$|xx|_|__|[iI]gnor(?:e|ing|ed))","args":"after-used","argsIgnorePattern":"^(?:$$|xx|_|__|[iI]gnor(?:e|ing|ed))","caughtErrors":"none"}],"import/namespace":["error",{"allowComputed":true}],"import/no-absolute-path":["error"],"import/no-webpack-loader-syntax":["error"],"import/no-self-import":["error"],"import/no-amd":["error"],"import/no-duplicates":["error"],"import/no-extraneous-dependencies":["off",{"devDependencies":["test/**","tests/**","spec/**","**/__tests__/**","**/__mocks__/**","test.{js,jsx}","test-*.{js,jsx}","**/*{.,_}{test,spec}.{js,jsx}","**/jest.config.js","**/jest.setup.js","**/vue.config.js","**/webpack.config.js","**/webpack.config.*.js","**/rollup.config.js","**/rollup.config.*.js","**/gulpfile.js","**/gulpfile.*.js","**/Gruntfile{,.js}","**/protractor.conf.js","**/protractor.conf.*.js"],"optionalDependencies":false}],"import/no-mutable-exports":["error"],"import/no-named-as-default-member":["error"],"import/no-named-as-default":["error"],"import/order":["error",{"groups":[["builtin","external","internal"]]}],"import/no-unassigned-import":["error",{"allow":["@babel/polyfill","@babel/register"]}],"import/prefer-default-export":["off"],"import/extensions":["off","ignorePackages",{"js":"never","mjs":"never","jsx":"never"}],"import/exports-last":["off"],"import/no-unused-modules":["off",{"ignoreExports":[],"missingExports":true,"unusedExports":true}],"import/no-useless-path-segments":["error",{"noUselessIndex":false}],"prettier/prettier":["error"],"curly":[0,"multi-line"],"lines-around-comment":[0],"max-len":[0,100,2,{"ignoreUrls":true,"ignoreComments":false,"ignoreRegExpLiterals":true,"ignoreStrings":true,"ignoreTemplateLiterals":true}],"no-confusing-arrow":[0,{"allowParens":true}],"no-mixed-operators":[0,{"groups":[["%","**"],["%","+"],["%","-"],["%","*"],["%","/"],["/","*"],["&","|","<<",">>",">>>"],["==","!=","===","!=="],["&&","||"]],"allowSamePrecedence":false}],"no-tabs":[0],"no-unexpected-multiline":[0],"quotes":[0,"single",{"avoidEscape":true}],"array-bracket-newline":["off","consistent"],"array-bracket-spacing":["off","never"],"array-element-newline":["off",{"multiline":true,"minItems":3}],"arrow-spacing":["off",{"before":true,"after":true}],"block-spacing":["off","always"],"brace-style":["off","1tbs",{"allowSingleLine":true}],"comma-dangle":["off",{"arrays":"always-multiline","objects":"always-multiline","imports":"always-multiline","exports":"always-multiline","functions":"always-multiline"}],"comma-spacing":["off",{"before":false,"after":true}],"comma-style":["off","last",{"exceptions":{"ArrayExpression":false,"ArrayPattern":false,"ArrowFunctionExpression":false,"CallExpression":false,"FunctionDeclaration":false,"FunctionExpression":false,"ImportDeclaration":false,"ObjectExpression":false,"ObjectPattern":false,"VariableDeclaration":false,"NewExpression":false}}],"computed-property-spacing":["off","never"],"dot-location":["off","property"],"eol-last":["off","always"],"func-call-spacing":["off","never"],"function-call-argument-newline":["off"],"function-paren-newline":["off","consistent"],"generator-star":["off"],"generator-star-spacing":["off",{"before":false,"after":true}],"implicit-arrow-linebreak":["off","beside"],"indent":["off",2,{"SwitchCase":1,"VariableDeclarator":1,"outerIIFEBody":1,"FunctionDeclaration":{"parameters":1,"body":1},"FunctionExpression":{"parameters":1,"body":1},"CallExpression":{"arguments":1},"ArrayExpression":1,"ObjectExpression":1,"ImportDeclaration":1,"flatTernaryExpressions":false,"ignoredNodes":["JSXElement","JSXElement > *","JSXAttribute","JSXIdentifier","JSXNamespacedName","JSXMemberExpression","JSXSpreadAttribute","JSXExpressionContainer","JSXOpeningElement","JSXClosingElement","JSXText","JSXEmptyExpression","JSXSpreadChild"],"ignoreComments":false}],"jsx-quotes":["off","prefer-double"],"key-spacing":["off",{"beforeColon":false,"afterColon":true}],"keyword-spacing":["off",{"before":true,"after":true,"overrides":{"return":{"after":true},"throw":{"after":true},"case":{"after":true}}}],"linebreak-style":["off","unix"],"multiline-ternary":["off","never"],"newline-per-chained-call":["off",{"ignoreChainWithDepth":4}],"new-parens":["off"],"no-arrow-condition":["off"],"no-comma-dangle":["off"],"no-extra-parens":["off","all",{"conditionalAssign":true,"nestedBinaryExpressions":false,"returnAssign":false,"ignoreJSX":"all","enforceForArrowConditionals":false}],"no-extra-semi":["off"],"no-floating-decimal":["off"],"no-mixed-spaces-and-tabs":["off"],"no-multi-spaces":["off",{"ignoreEOLComments":false}],"no-multiple-empty-lines":["off",{"max":2,"maxBOF":1,"maxEOF":0}],"no-reserved-keys":["off"],"no-space-before-semi":["off"],"no-trailing-spaces":["off",{"skipBlankLines":false,"ignoreComments":false}],"no-whitespace-before-property":["off"],"no-wrap-func":["off"],"nonblock-statement-body-position":["off","beside",{"overrides":{}}],"object-curly-newline":["off",{"ObjectExpression":{"minProperties":4,"multiline":true,"consistent":true},"ObjectPattern":{"minProperties":4,"multiline":true,"consistent":true},"ImportDeclaration":{"minProperties":4,"multiline":true,"consistent":true},"ExportDeclaration":{"minProperties":4,"multiline":true,"consistent":true}}],"object-curly-spacing":["off","always"],"object-property-newline":["off",{"allowAllPropertiesOnSameLine":true,"allowMultiplePropertiesPerLine":false}],"one-var-declaration-per-line":["off","always"],"operator-linebreak":["off","before",{"overrides":{"=":"none"}}],"padded-blocks":["off",{"blocks":"never","classes":"never","switches":"never"},{"allowSingleLineBlocks":true}],"quote-props":["off","as-needed",{"keywords":false,"unnecessary":true,"numbers":false}],"rest-spread-spacing":["off","never"],"semi":["off","always"],"semi-spacing":["off",{"before":false,"after":true}],"semi-style":["off","last"],"space-after-function-name":["off"],"space-after-keywords":["off"],"space-before-blocks":["off"],"space-before-function-paren":["off",{"anonymous":"always","named":"never","asyncArrow":"always"}],"space-before-function-parentheses":["off"],"space-before-keywords":["off"],"space-in-brackets":["off"],"space-in-parens":["off","never"],"space-infix-ops":["off"],"space-return-throw-case":["off"],"space-unary-ops":["off",{"words":true,"nonwords":false,"overrides":{}}],"space-unary-word-ops":["off"],"switch-colon-spacing":["off",{"after":true,"before":false}],"template-curly-spacing":["off"],"template-tag-spacing":["off","never"],"unicode-bom":["off","never"],"wrap-iife":["off","outside",{"functionPrototypeMethods":false}],"wrap-regex":["off"],"yield-star-spacing":["off","after"],"indent-legacy":["off"],"no-spaced-func":["off"],"import/named":["error"],"import/default":["off"],"import/export":["error"],"import/no-deprecated":["off"],"import/no-commonjs":["off"],"import/no-nodejs-modules":["off"],"import/first":["error"],"import/imports-first":["off"],"import/no-namespace":["off"],"import/newline-after-import":["error"],"import/no-restricted-paths":["off"],"import/max-dependencies":["off",{"max":10}],"import/no-dynamic-require":["error"],"import/no-internal-modules":["off",{"allow":[]}],"import/unambiguous":["off"],"import/no-named-default":["error"],"import/no-anonymous-default-export":["off",{"allowArray":false,"allowArrowFunction":false,"allowAnonymousClass":false,"allowAnonymousFunction":false,"allowLiteral":false,"allowObject":false}],"import/group-exports":["off"],"import/no-default-export":["off"],"import/no-named-export":["off"],"import/no-cycle":["error",{"maxDepth":null}],"import/dynamic-import-chunkname":["off",{"importFunctions":[],"webpackChunknameFormat":"[0-9a-zA-Z-_/.]+"}],"import/no-relative-parent-imports":["off"],"constructor-super":["error"],"no-class-assign":["error"],"no-const-assign":["error"],"no-dupe-class-members":["error"],"no-duplicate-imports":["off"],"no-new-symbol":["error"],"no-restricted-imports":["off",{"paths":[],"patterns":[]}],"no-this-before-super":["error"],"no-useless-computed-key":["error"],"no-useless-constructor":["error"],"no-useless-rename":["error",{"ignoreDestructuring":false,"ignoreImport":false,"ignoreExport":false}],"no-var":["error"],"object-shorthand":["error","always",{"ignoreConstructors":false,"avoidQuotes":true}],"prefer-const":["error",{"destructuring":"any","ignoreReadBeforeAssign":true}],"prefer-numeric-literals":["error"],"prefer-reflect":["off"],"prefer-rest-params":["error"],"prefer-spread":["error"],"prefer-template":["error"],"require-yield":["error"],"sort-imports":["off",{"ignoreCase":false,"ignoreDeclarationSort":false,"ignoreMemberSort":false,"memberSyntaxSortOrder":["none","all","multiple","single"]}],"symbol-description":["error"],"init-declarations":["off"],"no-catch-shadow":["off"],"no-delete-var":["error"],"no-label-var":["error"],"no-restricted-globals":["error","isFinite","isNaN","addEventListener","blur","close","closed","confirm","defaultStatus","defaultstatus","event","external","find","focus","frameElement","frames","history","innerHeight","innerWidth","length","location","locationbar","menubar","moveBy","moveTo","name","onblur","onerror","onfocus","onload","onresize","onunload","open","opener","opera","outerHeight","outerWidth","pageXOffset","pageYOffset","parent","print","removeEventListener","resizeBy","resizeTo","screen","screenLeft","screenTop","screenX","screenY","scroll","scrollbars","scrollBy","scrollTo","scrollX","scrollY","self","status","statusbar","stop","toolbar","top"],"no-shadow":["error"],"no-shadow-restricted-names":["error"],"no-undef":["error"],"no-undef-init":["error"],"no-undefined":["off"],"camelcase":["error",{"properties":"never","ignoreDestructuring":false,"ignoreImports":false}],"capitalized-comments":["off","never",{"line":{"ignorePattern":".*","ignoreInlineComments":true,"ignoreConsecutiveComments":true},"block":{"ignorePattern":".*","ignoreInlineComments":true,"ignoreConsecutiveComments":true}}],"consistent-this":["off"],"func-name-matching":["off","always",{"includeCommonJSModuleExports":false,"considerPropertyDescriptor":true}],"func-style":["off","expression"],"id-blacklist":["off"],"id-length":["off"],"id-match":["off"],"line-comment-position":["off",{"position":"above","ignorePattern":"","applyDefaultPatterns":true}],"lines-between-class-members":["error","always",{"exceptAfterSingleLine":false}],"lines-around-directive":["error",{"before":"always","after":"always"}],"max-lines":["off",{"max":300,"skipBlankLines":true,"skipComments":true}],"max-lines-per-function":["off",{"max":50,"skipBlankLines":true,"skipComments":true,"IIFEs":true}],"multiline-comment-style":["off","starred-block"],"new-cap":["error",{"newIsCap":true,"newIsCapExceptions":[],"capIsNew":false,"capIsNewExceptions":["Immutable.Map","Immutable.Set","Immutable.List"],"properties":true}],"newline-after-var":["off"],"newline-before-return":["off"],"no-array-constructor":["error"],"no-bitwise":["error"],"no-continue":["error"],"no-inline-comments":["off"],"no-lonely-if":["error"],"no-multi-assign":["error"],"no-negated-condition":["off"],"no-new-object":["error"],"no-plusplus":["error"],"no-restricted-syntax":["error",{"selector":"ForInStatement","message":"for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array."},{"selector":"ForOfStatement","message":"iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations."},{"selector":"LabeledStatement","message":"Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand."},{"selector":"WithStatement","message":"`with` is disallowed in strict mode because it makes code impossible to predict and optimize."}],"no-ternary":["off"],"no-underscore-dangle":["error",{"allow":[],"allowAfterThis":false,"allowAfterSuper":false,"enforceInMethodNames":true,"allowAfterThisConstructor":false}],"no-unneeded-ternary":["error",{"defaultAssignment":false}],"one-var":["error","never"],"operator-assignment":["error","always"],"padding-line-between-statements":["off"],"prefer-object-spread":["error"],"require-jsdoc":["off"],"sort-keys":["off","asc",{"caseSensitive":false,"natural":true}],"sort-vars":["off"],"spaced-comment":["error","always",{"line":{"exceptions":["-","+"],"markers":["=","!"]},"block":{"exceptions":["-","+"],"markers":["=","!",":","::"],"balanced":true}}],"callback-return":["off"],"global-require":["error"],"handle-callback-err":["off"],"no-buffer-constructor":["error"],"no-mixed-requires":["off",false],"no-new-require":["error"],"no-path-concat":["error"],"no-process-env":["off"],"no-restricted-modules":["off"],"no-sync":["off"],"for-direction":["error"],"getter-return":["error",{"allowImplicit":true}],"no-async-promise-executor":["error"],"no-await-in-loop":["error"],"no-compare-neg-zero":["error"],"no-cond-assign":["error","always"],"no-console":["warn"],"no-constant-condition":["warn"],"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-ex-assign":["error"],"no-extra-boolean-cast":["error"],"no-func-assign":["error"],"no-inner-declarations":["error"],"no-invalid-regexp":["error"],"no-irregular-whitespace":["error"],"no-misleading-character-class":["error"],"no-obj-calls":["error"],"no-prototype-builtins":["error"],"no-regex-spaces":["error"],"no-sparse-arrays":["error"],"no-template-curly-in-string":["error"],"no-unreachable":["error"],"no-unsafe-finally":["error"],"no-unsafe-negation":["error"],"no-negated-in-lhs":["off"],"require-atomic-updates":["off"],"use-isnan":["error"],"valid-jsdoc":["off"],"valid-typeof":["error",{"requireStringLiterals":true}],"accessor-pairs":["off"],"array-callback-return":["error",{"allowImplicit":true}],"block-scoped-var":["error"],"complexity":["off",11],"class-methods-use-this":["error",{"exceptMethods":[]}],"consistent-return":["error"],"default-case":["error",{"commentPattern":"^no default$"}],"dot-notation":["error",{"allowKeywords":true,"allowPattern":""}],"eqeqeq":["error","always",{"null":"ignore"}],"guard-for-in":["error"],"max-classes-per-file":["error",1],"no-alert":["warn"],"no-caller":["error"],"no-case-declarations":["error"],"no-div-regex":["off"],"no-else-return":["error",{"allowElseIf":false}],"no-empty-function":["error",{"allow":["arrowFunctions","functions","methods"]}],"no-empty-pattern":["error"],"no-eq-null":["off"],"no-eval":["error"],"no-extra-bind":["error"],"no-extra-label":["error"],"no-fallthrough":["error"],"no-global-assign":["error",{"exceptions":[]}],"no-native-reassign":["off"],"no-implicit-coercion":["off",{"boolean":false,"number":true,"string":true,"allow":[]}],"no-implicit-globals":["off"],"no-implied-eval":["error"],"no-invalid-this":["off"],"no-iterator":["error"],"no-labels":["error",{"allowLoop":false,"allowSwitch":false}],"no-lone-blocks":["error"],"no-loop-func":["error"],"no-magic-numbers":["off",{"ignore":[],"ignoreArrayIndexes":true,"enforceConst":true,"detectObjects":false}],"no-multi-str":["error"],"no-new":["error"],"no-new-func":["error"],"no-new-wrappers":["error"],"no-octal":["error"],"no-octal-escape":["error"],"no-proto":["error"],"no-redeclare":["error"],"no-restricted-properties":["error",{"object":"arguments","property":"callee","message":"arguments.callee is deprecated"},{"object":"global","property":"isFinite","message":"Please use Number.isFinite instead"},{"object":"self","property":"isFinite","message":"Please use Number.isFinite instead"},{"object":"window","property":"isFinite","message":"Please use Number.isFinite instead"},{"object":"global","property":"isNaN","message":"Please use Number.isNaN instead"},{"object":"self","property":"isNaN","message":"Please use Number.isNaN instead"},{"object":"window","property":"isNaN","message":"Please use Number.isNaN instead"},{"property":"__defineGetter__","message":"Please use Object.defineProperty instead."},{"property":"__defineSetter__","message":"Please use Object.defineProperty instead."},{"object":"Math","property":"pow","message":"Use the exponentiation operator (**) instead."}],"no-return-assign":["error","always"],"no-return-await":["error"],"no-script-url":["error"],"no-self-assign":["error",{"props":true}],"no-self-compare":["error"],"no-sequences":["error"],"no-throw-literal":["error"],"no-unmodified-loop-condition":["off"],"no-unused-expressions":["error",{"allowShortCircuit":false,"allowTernary":false,"allowTaggedTemplates":false}],"no-unused-labels":["error"],"no-useless-call":["off"],"no-useless-catch":["error"],"no-useless-concat":["error"],"no-useless-escape":["error"],"no-useless-return":["error"],"no-void":["error"],"no-warning-comments":["off",{"terms":["todo","fixme","xxx"],"location":"start"}],"no-with":["error"],"prefer-promise-reject-errors":["error",{"allowEmptyReject":true}],"prefer-named-capture-group":["off"],"radix":["error"],"require-await":["off"],"require-unicode-regexp":["off"],"vars-on-top":["error"],"yoda":["error"]},"settings":{"node":{"allowModules":["@hela/build","@hela/check","@hela/commit","@hela/docs","@hela/format","@hela/lint","@hela/test","@hela/cli","@hela/core","@hela/yaro","@hela/eslint","hela","@hela/dev"],"tryExtensions":[".js",".mjs",".cjs",".jsx",".md",".mdx",".ts",".tsx",".json"]},"import/resolver":{"node":{"paths":["commands","modules","packages","presets"],"extensions":[".js",".mjs",".cjs",".jsx",".md",".mdx",".ts",".tsx",".json"],"tryExtensions":[".js",".mjs",".cjs",".jsx",".md",".mdx",".ts",".tsx",".json"],"moduleDirectory":["node_modules","commands","modules","packages","presets","/home/charlike/github/hela/commands/build/src","/home/charlike/github/hela/commands/check/src","/home/charlike/github/hela/commands/commit/src","/home/charlike/github/hela/commands/docs/src","/home/charlike/github/hela/commands/format/src","/home/charlike/github/hela/commands/lint/src","/home/charlike/github/hela/commands/test/src","/home/charlike/github/hela/modules/cli/src","/home/charlike/github/hela/modules/core/src","/home/charlike/github/hela/modules/yaro/src","/home/charlike/github/hela/packages/eslint/src","/home/charlike/github/hela/packages/hela/src","/home/charlike/github/hela/presets/dev/src"]},"alias":{"map":[["@hela/build","/home/charlike/github/hela/commands/build/src"],["@hela/check","/home/charlike/github/hela/commands/check/src"],["@hela/commit","/home/charlike/github/hela/commands/commit/src"],["@hela/docs","/home/charlike/github/hela/commands/docs/src"],["@hela/format","/home/charlike/github/hela/commands/format/src"],["@hela/lint","/home/charlike/github/hela/commands/lint/src"],["@hela/test","/home/charlike/github/hela/commands/test/src"],["@hela/cli","/home/charlike/github/hela/modules/cli/src"],["@hela/core","/home/charlike/github/hela/modules/core/src"],["@hela/yaro","/home/charlike/github/hela/modules/yaro/src"],["@hela/eslint","/home/charlike/github/hela/packages/eslint/src"],["hela","/home/charlike/github/hela/packages/hela/src"],["@hela/dev","/home/charlike/github/hela/presets/dev/src"]],"extensions":[".js",".mjs",".cjs",".jsx",".md",".mdx",".ts",".tsx",".json"]}},"import/extensions":[".js",".mjs",".cjs",".jsx",".md",".mdx",".ts",".tsx",".json"],"import/core-modules":["electron","atom"],"import/ignore":["node_modules","\\.(coffee|scss|css|less|hbs|svg|json)$"]},"ignorePatterns":["CHANGELOG.md","dist","!*.*js","!*.*ts","memoize-fs.js"]} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 94c5c31..7bcebcd 100644 --- a/.prettierignore +++ b/.prettierignore @@ -16,6 +16,7 @@ coverage *.jpeg *.jpg .now +.lint.config.js # !*.*js* # !*.*ts* diff --git a/commands/build/package.json b/commands/build/package.json index 087b5c5..26c8e07 100644 --- a/commands/build/package.json +++ b/commands/build/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/commands/check/package.json b/commands/check/package.json index 3abb6f9..eebd6a1 100644 --- a/commands/check/package.json +++ b/commands/check/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/commands/commit/package.json b/commands/commit/package.json index 3eb4c6f..66a29cb 100644 --- a/commands/commit/package.json +++ b/commands/commit/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/commands/docs/package.json b/commands/docs/package.json index 98f9136..667e75e 100644 --- a/commands/docs/package.json +++ b/commands/docs/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/commands/format/package.json b/commands/format/package.json index abd9720..71c0672 100644 --- a/commands/format/package.json +++ b/commands/format/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/commands/lint/package.json b/commands/lint/package.json index 5f9414b..6303e1f 100644 --- a/commands/lint/package.json +++ b/commands/lint/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/commands/test/package.json b/commands/test/package.json index 7ede570..b6341ae 100644 --- a/commands/test/package.json +++ b/commands/test/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/hela.js b/hela.js deleted file mode 100644 index 65f0ed8..0000000 --- a/hela.js +++ /dev/null @@ -1,5 +0,0 @@ -// 'use strict'; - -// const helaDev = require('@hela/dev'); - -// Object.assign(exports, helaDev); diff --git a/modules/cli/package.json b/modules/cli/package.json index 92a1c16..1c01f12 100644 --- a/modules/cli/package.json +++ b/modules/cli/package.json @@ -30,6 +30,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/modules/cli/src/index.js b/modules/cli/src/index.js index 1183171..a1380f9 100644 --- a/modules/cli/src/index.js +++ b/modules/cli/src/index.js @@ -29,7 +29,7 @@ prog module.exports = async function main() { const cfgPath = argv.c || argv.config; - const cfg = cfgPath ? await explorer.load(cfgPath) : await explorer.search(); + const cfg = await tryLoadConfig(cfgPath); if (!isValidConfig(cfg)) { throw new HelaError('No config found or invalid. Try "--config" flag.'); @@ -91,3 +91,27 @@ function isValidConfig(val) { function isObject(val) { return val && typeof val === 'object' && Array.isArray(val) === false; } + +async function tryLoadConfig(name) { + let mod = null; + + try { + mod = require(name); + if (mod) { + mod = { config: mod, filepath: name }; + } + } catch (err) { + if (name) { + try { + mod = await explorer.load(name); + } catch (e) { + try { + mod = await explorer.search(); + } catch (_) { + mod = null; + } + } + } + } + return mod || explorer.search(); +} diff --git a/modules/core/package.json b/modules/core/package.json index 5b0d1a9..f65320a 100644 --- a/modules/core/package.json +++ b/modules/core/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/modules/yaro/package.json b/modules/yaro/package.json index 7fb819c..344cc67 100644 --- a/modules/yaro/package.json +++ b/modules/yaro/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/modules/yaro/src/index.js b/modules/yaro/src/index.js index 5f43763..870202e 100644 --- a/modules/yaro/src/index.js +++ b/modules/yaro/src/index.js @@ -53,6 +53,18 @@ class Yaro { this.option('-v, --version', 'Display version'); } + // NOTE: use only when single command mode to define like `my-cmd [...files]` + // it is later use in `.command` (which in the case of singleMode is called from `.action`) + // instead of the `rawName`. + usage(str) { + // for now only in single command mode + if (this.settings.singleMode) { + this._usg = str ? str.trim() : ''; + } + + return this; + } + command(rawName, description, config) { if (this.settings.singleMode === true && !config.singleMode) { throw new Error('in single mode cannot add commands'); @@ -124,7 +136,9 @@ class Yaro { const fn = (...args) => handler.apply(this, args); if (!this.currentCommand && this.settings.singleMode === true) { - this.command('$$root', 'On single mode', { singleMode: true }); + const cmd = this._usg ? ` ${this._usg}` : ''; + + this.command(`$$root${cmd}`, 'On single mode', { singleMode: true }); } this.currentCommand.handler = fn; this.__updateCommandsList(); @@ -208,10 +222,11 @@ class Yaro { // it's general help, so include commands if (!commandName) { const cmdStr = this.settings.defaultCommand ? ' [command]' : ' '; + const usg = this.settings.singleMode ? `${this._usg} ` : ''; sections.push({ title: 'Usage', body: ` $ ${this.programName}${commands.length > 0 ? cmdStr : ''} ${ - this.flags.size > 0 ? '[options]' : '' + this.flags.size > 0 ? `${usg}[options]` : '' }`, }); @@ -536,13 +551,16 @@ class Yaro { }); const parsedArgv = { ...parsed }; - const rawArgs = parsed._; + const rawArgs = parsed._.slice(); delete parsed._; const flags = { ...parsed }; - const cmdName = rawArgs.slice(0, 1)[0]; - const args = rawArgs.slice(1); + const cmdName = this.settings.singleMode + ? '$$root' + : rawArgs.slice(0, 1)[0]; + + const args = this.settings.singleMode ? rawArgs : rawArgs.slice(1); const idx = args.findIndex((x) => x === '--'); const argsBefore = args.slice(0, idx - 1); const argsAfter = args.slice(idx - 1); diff --git a/package.json b/package.json index 9b1aa97..25c6ca6 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "bootstrap": "lerna bootstrap --since", "clean:fresh": "lerna clean -y && rm -rf node_modules yarn.lock", "format": "prettier '**/*.{js,md,json}' --write", - "lint": "eslint '{commands,modules,packages,presets}/*/{src,__tests__}/**/*.js' --fix --cache --quiet --format codeframe", + "lint": "hela eslint --fix", + "lint:fresh": "rm -rf .cache/hela-eslint-cache && hela eslint --fix", "release": "lerna version && lerna publish from-package", "presetup": "echo foo-bar", "setup": "yarn", @@ -22,11 +23,12 @@ "setup:full": "yarn audit && yarn run setup:locklint && yarn run bootstrap", "setup:locklint": "lockfile-lint --path yarn.lock --type yarn --validate-https", "test": "jest", - "test:ci": "jest --coverage" + "test:ci": "jest --coverage --onlyChanged" }, "dependencies": { "@tunnckocore/eslint-config": "^5.4.5", "@tunnckocore/prettier-config": "^1.3.4", + "babel-eslint": "^10.1.0", "eslint": "^6.8.0", "husky": "^4.2.3", "jest": "^25.1.0", @@ -35,12 +37,10 @@ "prettier": "^1.19.1", "prettier-plugin-pkgjson": "^0.2.4" }, + "hela": "./.hela.config.js", "renovate": { "extends": [ "@tunnckocore" ] - }, - "hela": { - "extends": "@hela/dev" } } diff --git a/packages/eslint/__tests__/index.js b/packages/eslint/__tests__/index.js index 8736215..2d59f95 100644 --- a/packages/eslint/__tests__/index.js +++ b/packages/eslint/__tests__/index.js @@ -3,6 +3,7 @@ const mod = require('../src/index'); test('todo test for mod', () => { + // const foo = 123;x expect(typeof mod).toStrictEqual('object'); expect(typeof mod.helaCommand).toStrictEqual('function'); }); diff --git a/packages/eslint/package.json b/packages/eslint/package.json index e61f5f7..be8dcc9 100644 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -29,10 +29,18 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, "scripts": {}, + "dependencies": { + "@hela/core": "^3.1.0", + "eslint": "^6.8.0", + "find-pkg": "^2.0.0", + "glob-cache": "^1.0.1", + "memoize-fs": "^2.1.0" + }, "keywords": [ "tunnckocorehq", "tunnckocore-oss", @@ -40,10 +48,5 @@ "development", "developer-experience", "dx" - ], - "dependencies": { - "@hela/core": "^3.1.0", - "eslint": "^6.8.0", - "glob-cache": "^0.3.5" - } + ] } diff --git a/packages/eslint/src/api.js b/packages/eslint/src/api.js new file mode 100644 index 0000000..a1fed55 --- /dev/null +++ b/packages/eslint/src/api.js @@ -0,0 +1,362 @@ +/* eslint-disable global-require */ +/* eslint-disable import/no-dynamic-require */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable max-statements */ + +'use strict'; + +const DEFAULT_IGNORE = [ + '**/node_modules/**', + '**/bower_components/**', + 'flow-typed/**', + 'coverage/**', + '**/*fixture*/**', + '{tmp,temp}/**', + '**/*.min.js', + '**/bundle.js', + '**/vendor/**', + '**/dist/**', +]; + +const OUR_CONFIG_FILENAME = '.lint.config.js'; +const DEFAULT_EXTENSIONS = ['js', 'jsx', 'cjs', 'mjs', 'ts', 'tsx']; +const DEFAULT_INPUTS = [ + `**/src/**/*.{${DEFAULT_EXTENSIONS.join(',')}}`, + `**/*test*/**/*.{${DEFAULT_EXTENSIONS.join(',')}}`, +]; + +const fs = require('fs'); +const path = require('path'); +const memoizeFs = require('memoize-fs'); +const codeframe = require('eslint/lib/cli-engine/formatters/codeframe'); +const globCache = require('glob-cache'); +const { CLIEngine, Linter } = require('eslint'); + +function resolveConfigSync(filePath, baseConfig, options) { + const { cwd, ...opt } = { /* cwd: process.cwd(), */ ...options }; + const doNotUseEslintRC = baseConfig && typeof baseConfig === 'object'; + + const settings = { + ...opt, + baseConfig, + cache: true, + useEslintrc: !doNotUseEslintRC, + cacheLocation: './.cache/custom-eslint-cache', + }; + settings.extensions = settings.extensions || DEFAULT_EXTENSIONS; + + const engine = new CLIEngine(settings); + + const config = engine.getConfigForFile(filePath); + + return config; +} + +async function resolveConfig(filePath, baseConfig, options) { + const opts = { ...options }; + const memoizer = memoizeFs({ + cachePath: path.join(process.cwd(), '.cache', 'eslint-resolve-config'), + }); + + const memoizedFn = await memoizer.fn( + opts.dirname + ? (_) => resolveConfigSync(filePath, baseConfig, options) + : resolveConfigSync, + ); + const cfg = await memoizedFn( + ...(opts.dirname ? [opts.dirname] : [filePath, baseConfig, options]), + ); + + return cfg; +} + +function formatCodeframe(rep, log) { + const res = codeframe(rep.results || rep); + return log ? console.log(res) : res; +} + +function injectIntoLinter(config, linter) { + if (!config) { + return linter; + } + + const linterInstance = linter || new Linter(); + + [] + .concat(config.plugins) + .filter(Boolean) + .forEach((pluginName) => { + let plugin = null; + + if (pluginName.startsWith('@')) { + plugin = require(pluginName); + } else { + plugin = require(`eslint-plugin-${pluginName}`); + } + + // note: defineRules is buggy + Object.keys(plugin.rules).forEach((ruleName) => { + linterInstance.defineRule( + `${pluginName}/${ruleName}`, + plugin.rules[ruleName], + ); + }); + + // note: otherwise this should work + // linterInstance.defineRules( + // Object.keys(plugin.rules).reduce((acc, ruleName) => { + // acc[`${pluginName}/${ruleName}`] = plugin.rules[ruleName]; + + // return acc; + // }, {}), + // ); + }); + + if (config.parser && config.parser.startsWith('/')) { + if (config.parser.includes('babel-eslint')) { + config.parser = 'babel-eslint'; + } else if (config.parser.includes('@typescript-eslint/parser')) { + config.parser = '@typescript-eslint/parser'; + } + // NOTE: more parsers + } + + // define only when we are passed with "raw" (not processed) config + if (config.parser && !config.parser.startsWith('/')) { + linterInstance.defineParser(config.parser, require(config.parser)); + } + + return linterInstance; +} + +async function* lintFiles(patterns, options) { + const opts = { dirs: [], cwd: process.cwd(), ...options }; + opts.exclude = opts.exclude || DEFAULT_IGNORE; + opts.extensions = opts.extensions || DEFAULT_EXTENSIONS; + opts.cacheLocation = + typeof opts.cacheLocation === 'string' + ? opts.cacheLocation + : path.join(opts.cwd, '.cache', 'hela-eslint-cache'); + + const iterable = await globCache(patterns, opts); + + let linter = opts.linter || new Linter(); + let eslintConfig = await tryLoadLintConfig(); + + linter = injectIntoLinter(eslintConfig, linter); + + // TODO use `cacache` for caching `options` and + // based on that force `ctx.changed` if it is `false` + + for await (const ctx of iterable) { + const meta = ctx.cacheFile && ctx.cacheFile.metadata; + + if (ctx.changed) { + const dirname = path.dirname(ctx.file.path); + if (opts.dirs.includes(dirname)) { + eslintConfig = await resolveConfig(ctx.file.path, 0, { + ...opts, + dirname, + }); + } + + const contents = ctx.file.contents.toString(); + const { source, messages } = lint({ + ...opts, + linter, + filename: ctx.file.path, + contents, + config: eslintConfig || (meta && meta.eslintConfig), + }); + + const res = createReportOrResult('messages', messages, { + filePath: ctx.file.path, + }); + + // const res = { + // filePath: ctx.file.path, + // messages, + // errorCount: calculateCount('error', messages), + // warningCount: calculateCount('warning', messages), + + // // todo calc these too? + // fixableErrorCount: 0, + // fixableWarningCount: 0, + // }; + const diff = JSON.stringify(res) !== JSON.stringify(meta && meta.report); + + // NOTE: `source` property seems deprecated but formatters need it so.. + yield { + ...ctx, + result: { ...res, source }, + eslintConfig: (meta && meta.eslintConfig) || eslintConfig, + }; + + if (diff) { + // todo update cache with cacache.put + await ctx.cacache.put(ctx.cacheLocation, ctx.file.path, source, { + metadata: { report: { ...res, source }, eslintConfig }, + }); + } + + // if (opts.report) { + // formatCodeframe([res]); + // } + } + + if (ctx.changed === false && ctx.notFound === false) { + yield { + ...ctx, + result: meta.report, + eslintConfig: meta.eslintConfig || eslintConfig, + }; + // if (opts.report) { + // formatCodeframe([meta.report]); + // } + } + } +} + +lintFiles.promise = async function lintFilesPromise(patterns, options) { + const opts = { ...options }; + const results = []; + const iterable = await lintFiles(patterns, opts); + + for await (const { result } of iterable) { + results.push(result); + } + + return createReportOrResult('results', results); +}; + +function lint(options) { + const opts = { ...options }; + const cfg = { ...opts.config, filename: opts.filename }; + const linter = opts.linter || new Linter(); + const filter = (x) => + opts.warnings ? true : !opts.warnings && x.severity === 2; + + if (!opts.contents && !opts.text) { + opts.contents = fs.readFileSync(cfg.filename, 'utf8'); + } + if (opts.text) { + cfg.filename = opts.filename || ''; + } + if (opts.fix) { + const { output, messages } = linter.verifyAndFix(opts.contents, cfg); + if (!opts.text) { + fs.writeFileSync(cfg.filename, output); + } + + return { source: output, messages: messages.filter(filter) }; + } + + const messages = linter.verify(opts.contents, cfg); + return { + source: opts.contents, + messages: messages.filter(filter), + }; +} + +async function lintText(contents, options) { + const opts = { ...options }; + let linter = opts.linter || new Linter(); + + const eslintConfig = opts.config || (await tryLoadLintConfig()); + + linter = injectIntoLinter(eslintConfig, linter); + const { source, messages } = lint({ + ...opts, + config: eslintConfig, + linter, + contents, + text: true, + }); + + const result = createReportOrResult('messages', messages, { + filePath: opts.filename || '', + source, + }); + const report = createReportOrResult('results', [result]); + + return { ...report, source }; +} + +function createReportOrResult(type, results, extra) { + const ret = { + ...extra, + errorCount: 0, + warningCount: 0, + fixableErrorCount: 0, + fixableWarningCount: 0, + }; + + ret[type] = []; + + if (type === 'messages') { + ret.errorCount = calculateCount('error', results); + ret.warningCount = calculateCount('warning', results); + } + + return results.reduce((acc, res) => { + ret[type].push(res); + + if (type === 'results') { + acc.errorCount += res.errorCount || 0; + acc.warningCount += res.warningCount || 0; + acc.fixableErrorCount += res.fixableErrorCount || 0; + acc.fixableWarningCount += res.fixableWarningCount || 0; + } + + return acc; + }, ret); +} + +async function tryLoadLintConfig() { + const rootDir = process.cwd(); + let cfg = null; + + try { + cfg = await require(path.join(rootDir, OUR_CONFIG_FILENAME)); + } catch (err) { + return null; + } + + return cfg; +} + +function calculateCount(type, items) { + return [] + .concat(items) + .filter(Boolean) + .filter((x) => (type === 'error' ? x.severity === 2 : x.severity === 1)) + .reduce((acc) => acc + 1, 0); +} + +module.exports = { + injectIntoLinter, + tryLoadLintConfig, + resolveConfigSync, + resolveConfig, + formatCodeframe, + calculateCount, + createReportOrResult, + lintFiles, + lintText, + lint, + + DEFAULT_IGNORE, + DEFAULT_INPUT: DEFAULT_INPUTS, + DEFAULT_INPUTS, + DEFAULT_EXTENSIONS, + OUR_CONFIG_FILENAME, +}; + +// (async () => { +// // const patterns = 'packages/eslint/src/**/*.js'; +// // const report = await lintFiles(patterns, { fix: true }); +// const report = await lintText('var foo = 123', { fix: true }); + +// formatCodeframe(report.results); +// console.log(report.source); // fixed source code text +// })(); diff --git a/packages/eslint/src/bin.js b/packages/eslint/src/bin.js index 74af595..a548183 100755 --- a/packages/eslint/src/bin.js +++ b/packages/eslint/src/bin.js @@ -1,3 +1,10 @@ #!/usr/bin/env node +'use strict'; + const { hela } = require('@hela/core'); +const { wrapper } = require('./index.js'); + +const prog = wrapper(hela('eslint', { singleMode: true }).usage('[...files]')); + +prog.parse(); diff --git a/packages/eslint/src/index.js b/packages/eslint/src/index.js index 85cd9b5..0ae216b 100644 --- a/packages/eslint/src/index.js +++ b/packages/eslint/src/index.js @@ -1,18 +1,117 @@ +/* eslint-disable global-require */ +/* eslint-disable import/no-dynamic-require */ +/* eslint-disable max-statements */ +/* eslint-disable no-restricted-syntax */ + 'use strict'; +const fs = require('fs'); +const path = require('path'); const { hela } = require('@hela/core'); +const { + DEFAULT_IGNORE, + DEFAULT_INPUTS, + OUR_CONFIG_FILENAME, + ...api +} = require('./api'); + +function wrapper(prog) { + return prog + .option('--init', 'Create lint config from fully resolved ESLint config') + .option('--fix', 'Automatically fix problems') + .option('--warnings', 'Shows warnings too', false) + .option('--reporter', 'Use a specific output format reporter') + .option('--include', 'Input files or glob patterns', DEFAULT_INPUTS) + .option('--exclude', 'Ignore patterns (multiple)', DEFAULT_IGNORE) + .action(async (...args) => { + const files = args.slice(0, -2); + const argv = args[args.length - 2]; + // const opts = args[args.length - 1]; + + if (argv.init) { + const rootLintConfigFile = path.join( + process.cwd(), + OUR_CONFIG_FILENAME, + ); + const loadConfigContents = `\nmodule.exports = require('@hela/eslint').resolveConfig(__filename);`; + + // write our config loading resolution + fs.writeFileSync(rootLintConfigFile, loadConfigContents); + + // import/require/load the resolved config + const config = await require(rootLintConfigFile); + + // re-write the `.js` config file + fs.writeFileSync( + `${rootLintConfigFile}`, + `module.exports = ${JSON.stringify(config)}`, + ); + + console.log('Done.'); + return; + } + + const include = [] + .concat(files.length > 0 ? files : argv.include || DEFAULT_INPUTS) + .reduce((acc, x) => acc.concat(x), []) + .filter(Boolean); + + let exclude = [] + .concat(argv.exclude) + .reduce((acc, x) => acc.concat(x), []) + .filter(Boolean); + exclude = exclude.length > 0 ? exclude : null; + + const report = { + errorCount: 0, + warningCount: 0, + filesCount: 0, + }; + + const iterable = await api.lintFiles(include, { ...argv, exclude }); + + for await (const { result } of iterable) { + report.filesCount += 1; + if (result.errorCount || result.warningCount) { + const resultReport = api.createReportOrResult('results', [result]); + + report.errorCount += resultReport.errorCount || 0; + report.warningCount += resultReport.warningCount || 0; + + const output = api + .formatCodeframe(resultReport.results) + .trim() + .split('\n') + .slice(0, -2) + .join('\n'); + + console.log(output); + } else { + // console.log('File:', report.filesCount, file.path); + } + } + + if (report.errorCount === 0 && report.warningCount === 0) { + console.log('No problems found.'); + return; + } + + const warnings = argv.warnings + ? `and ${report.warningCount} warning(s) ` + : ''; + + console.log(''); + console.log(`${report.errorCount} error(s) ${warnings}found.`); + // formatCodeframe(report, true); + }); +} + +function helaCommand() { + return wrapper(hela().command('eslint [...files]', 'Lint using ESLint')); +} -const helaCommand = hela() - .command('eslint [...files]', 'Lint using ESLint') - .option('--fix', 'Automatically fix problems') - .option('-f, --format', 'Use a specific output format reporter') - .option( - '-c, --config', - 'Use this configuration, overriding .eslintrc.* config options if present', - ) - .action((files) => { - // TODO use glob-cache here - console.log('files', files); - }); - -module.exports = { /* lintText, lintFiles, */ helaCommand }; +module.exports = { + ...api, + wrapper, + helaCommand, +}; diff --git a/packages/eslint/src/preset.js b/packages/eslint/src/preset.js new file mode 100644 index 0000000..a3a833b --- /dev/null +++ b/packages/eslint/src/preset.js @@ -0,0 +1,3 @@ +'use strict'; + +exports.eslint = require('./index').helaCommand(); diff --git a/packages/hela/package.json b/packages/hela/package.json index cdacda0..333be23 100644 --- a/packages/hela/package.json +++ b/packages/hela/package.json @@ -28,6 +28,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/presets/dev/package.json b/presets/dev/package.json index c83f82f..740ddc0 100644 --- a/presets/dev/package.json +++ b/presets/dev/package.json @@ -24,6 +24,7 @@ "node": ">= 10.13" }, "publishConfig": { + "registry": "https://registry.npmjs.com", "access": "public", "tag": "latest" }, diff --git a/yarn.lock b/yarn.lock index 665b45c..035ab00 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,17 +31,17 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.6.tgz#27d7df9258a45c2e686b6f18b6c659e563aa4636" - integrity sha512-Sheg7yEJD51YHAvLEV/7Uvw95AeWqYPL3Vk3zGujJKIhJ+8oLw2ALaf3hbucILhKsgSoADOvtKRJuNVdcJkOrg== + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.7.tgz#b69017d221ccdeb203145ae9da269d72cf102f3b" + integrity sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.6" + "@babel/generator" "^7.8.7" "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.6" + "@babel/parser" "^7.8.7" "@babel/template" "^7.8.6" "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/types" "^7.8.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -51,12 +51,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.8.4", "@babel/generator@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.6.tgz#57adf96d370c9a63c241cd719f9111468578537a" - integrity sha512-4bpOR5ZBz+wWcMeVtcf7FbjcFzCp+817z2/gHNncIRcM9MmKzUhtWCYAq27RAfUrAFwb+OCG1s9WEaVxfi6cjg== +"@babel/generator@^7.8.4", "@babel/generator@^7.8.6", "@babel/generator@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.7.tgz#870b3cf7984f5297998152af625c4f3e341400f7" + integrity sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew== dependencies: - "@babel/types" "^7.8.6" + "@babel/types" "^7.8.7" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -114,10 +114,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.7.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.4", "@babel/parser@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.6.tgz#ba5c9910cddb77685a008e3c587af8d27b67962c" - integrity sha512-trGNYSfwq5s0SgM1BMEB8hX3NDmO7EP2wsDGDexiaKMB92BaRpS+qZfpkMqUBhcsOTBwNy9B/jieo4ad/t/z2g== +"@babel/parser@^7.1.0", "@babel/parser@^7.7.0", "@babel/parser@^7.7.5", "@babel/parser@^7.8.4", "@babel/parser@^7.8.6", "@babel/parser@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.7.tgz#7b8facf95d25fef9534aad51c4ffecde1a61e26a" + integrity sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A== "@babel/plugin-proposal-object-rest-spread@7.8.3": version "7.8.3" @@ -149,11 +149,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308" - integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ== + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.7.tgz#8fefce9802db54881ba59f90bb28719b4996324d" + integrity sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg== dependencies: - regenerator-runtime "^0.13.2" + regenerator-runtime "^0.13.4" "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" @@ -179,10 +179,10 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.6.tgz#629ecc33c2557fcde7126e58053127afdb3e6d01" - integrity sha512-wqz7pgWMIrht3gquyEFPVXeXCti72Rm8ep9b5tQKz9Yg9LzJA3HxosF1SB3Kc81KD1A3XBkkVYtJvCKS2Z/QrA== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" + integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -202,9 +202,9 @@ minimist "^1.2.0" "@emotion/cache@^10.0.27": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.27.tgz#7895db204e2c1a991ae33d51262a3a44f6737303" - integrity sha512-Zp8BEpbMunFsTcqAK4D7YTm3MvCp1SekflSLJH8lze2fCcSZ/yMkXHo8kb3t1/1Tdd3hAqf3Fb7z9VZ+FMiC9w== + version "10.0.29" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0" + integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ== dependencies: "@emotion/sheet" "0.9.4" "@emotion/stylis" "0.8.5" @@ -232,10 +232,10 @@ "@emotion/utils" "0.11.3" babel-plugin-emotion "^10.0.27" -"@emotion/hash@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831" - integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A== +"@emotion/hash@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== "@emotion/is-prop-valid@0.8.7", "@emotion/is-prop-valid@^0.8.1": version "0.8.7" @@ -249,12 +249,12 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -"@emotion/serialize@^0.11.15": - version "0.11.15" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.15.tgz#9a0f5873fb458d87d4f23e034413c12ed60a705a" - integrity sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg== +"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": + version "0.11.16" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" + integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg== dependencies: - "@emotion/hash" "0.7.4" + "@emotion/hash" "0.8.0" "@emotion/memoize" "0.7.4" "@emotion/unitless" "0.7.5" "@emotion/utils" "0.11.3" @@ -1636,39 +1636,39 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^2.18.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.21.0.tgz#a34de84a0791cae0357c4dda805c5b4e8203b6c6" - integrity sha512-b5jjjDMxzcjh/Sbjuo7WyhrQmVJg0WipTHQgXh5Xwx10uYm6nPWqN1WGOsaNq4HR3Zh4wUx4IRQdDkCHwyewyw== + version "2.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.22.0.tgz#218ce6d4aa0244c6a40baba39ca1e021b26bb017" + integrity sha512-BvxRLaTDVQ3N+Qq8BivLiE9akQLAOUfxNHIEhedOcg8B2+jY8Rc4/D+iVprvuMX1AdezFYautuGDwr9QxqSxBQ== dependencies: - "@typescript-eslint/experimental-utils" "2.21.0" + "@typescript-eslint/experimental-utils" "2.22.0" eslint-utils "^1.4.3" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.21.0", "@typescript-eslint/experimental-utils@^2.5.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.21.0.tgz#71de390a3ec00b280b69138d80733406e6e86bfa" - integrity sha512-olKw9JP/XUkav4lq0I7S1mhGgONJF9rHNhKFn9wJlpfRVjNo3PPjSvybxEldvCXnvD+WAshSzqH5cEjPp9CsBA== +"@typescript-eslint/experimental-utils@2.22.0", "@typescript-eslint/experimental-utils@^2.5.0": + version "2.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.22.0.tgz#4d00c91fbaaa68e56e7869be284999a265707f85" + integrity sha512-sJt1GYBe6yC0dWOQzXlp+tiuGglNhJC9eXZeC8GBVH98Zv9jtatccuhz0OF5kC/DwChqsNfghHx7OlIDQjNYAQ== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.21.0" + "@typescript-eslint/typescript-estree" "2.22.0" eslint-scope "^5.0.0" "@typescript-eslint/parser@^2.18.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.21.0.tgz#4f200995517c3d5fc5ef51b17527bc948992e438" - integrity sha512-VrmbdrrrvvI6cPPOG7uOgGUFXNYTiSbnRq8ZMyuGa4+qmXJXVLEEz78hKuqupvkpwJQNk1Ucz1TenrRP90gmBg== + version "2.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.22.0.tgz#8eeb6cb6de873f655e64153397d4790898e149d0" + integrity sha512-FaZKC1X+nvD7qMPqKFUYHz3H0TAioSVFGvG29f796Nc5tBluoqfHgLbSFKsh7mKjRoeTm8J9WX2Wo9EyZWjG7w== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.21.0" - "@typescript-eslint/typescript-estree" "2.21.0" + "@typescript-eslint/experimental-utils" "2.22.0" + "@typescript-eslint/typescript-estree" "2.22.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.21.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.21.0.tgz#7e4be29f2e338195a2e8c818949ed0ff727cc943" - integrity sha512-NC/nogZNb9IK2MEFQqyDBAciOT8Lp8O3KgAfvHx2Skx6WBo+KmDqlU3R9KxHONaijfTIKtojRe3SZQyMjr3wBw== +"@typescript-eslint/typescript-estree@2.22.0": + version "2.22.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.22.0.tgz#a16ed45876abf743e1f5857e2f4a1c3199fd219e" + integrity sha512-2HFZW2FQc4MhIBB8WhDm9lVFaBDy6h9jGrJ4V2Uzxe/ON29HCHBTj3GkgcsgMWfsl2U5as+pTOr30Nibaw7qRQ== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -1718,7 +1718,7 @@ acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^5.1.0: +acorn-jsx@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== @@ -1734,9 +1734,9 @@ acorn@^6.0.1: integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== acorn@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== agent-base@4, agent-base@^4.3.0: version "4.3.0" @@ -1783,11 +1783,11 @@ ansi-escapes@^3.2.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== dependencies: - type-fest "^0.8.1" + type-fest "^0.11.0" ansi-regex@^2.0.0: version "2.1.1" @@ -2019,7 +2019,7 @@ axobject-query@^2.0.2: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ== -babel-eslint@^10.0.3: +babel-eslint@^10.0.3, babel-eslint@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== @@ -2045,14 +2045,14 @@ babel-jest@^25.1.0: slash "^3.0.0" babel-plugin-emotion@^10.0.27: - version "10.0.28" - resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.28.tgz#731133577795ea04e5b1d11aff247fa0ad3fd364" - integrity sha512-h25EMmPxYVNOgsEkGIjCv2Ok+HzW/e/b5lf2v2U17T9k6y6g0ku3TG9b+jy94ZrqMh+b/njRF4uOQrwVr28QfQ== + version "10.0.29" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.29.tgz#89d8e497091fcd3d10331f097f1471e4cc3f35b4" + integrity sha512-7Jpi1OCxjyz0k163lKtqP+LHMg5z3S6A7vMBfHnF06l2unmtsOmFDzZBpGf0CWo1G4m8UACfVcDJiSiRuu/cSw== dependencies: "@babel/helper-module-imports" "^7.0.0" - "@emotion/hash" "0.7.4" + "@emotion/hash" "0.8.0" "@emotion/memoize" "0.7.4" - "@emotion/serialize" "^0.11.15" + "@emotion/serialize" "^0.11.16" babel-plugin-macros "^2.0.0" babel-plugin-syntax-jsx "^6.18.0" convert-source-map "^1.5.0" @@ -2177,10 +2177,10 @@ braces@^3.0.1: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browser-resolve@^1.11.3: version "1.11.3" @@ -3346,9 +3346,9 @@ eslint-plugin-import@^2.20.0: resolve "^1.12.0" eslint-plugin-jest@^23.6.0: - version "23.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.0.tgz#c978f959fa8395801742d13c5a3125a986d2661e" - integrity sha512-DKXmLxguZ1Lru4u5YM12ko3WLq6gqo7dhV2b63K731+/PNyZ/Ff6NGONQsGUtPLG9zU3kdz/N+2LTbweNZifeg== + version "23.8.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz#6f28b41c67ef635f803ebd9e168f6b73858eb8d4" + integrity sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg== dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" @@ -3541,12 +3541,12 @@ eslint@^6.8.0: v8-compile-cache "^2.0.3" espree@^6.1.1, espree@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" - integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== + version "6.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.0.tgz#349fef01a202bbab047748300deb37fa44da79d7" + integrity sha512-Xs8airJ7RQolnDIbLtRutmfvSsAe0xqMMAantCN/GMoqf81TFbeI1T7Jpd56qYu1uuh32dOG5W/X9uO+ghPXzA== dependencies: acorn "^7.1.0" - acorn-jsx "^5.1.0" + acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" esprima@^4.0.0, esprima@^4.0.1: @@ -3650,6 +3650,13 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + expect@^25.1.0: version "25.1.0" resolved "https://registry.yarnpkg.com/expect/-/expect-25.1.0.tgz#7e8d7b06a53f7d66ec927278db3304254ee683ee" @@ -3816,6 +3823,20 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-file-up@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-2.0.1.tgz#4932dd81551af643893f8cda7453f221e3e28261" + integrity sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ== + dependencies: + resolve-dir "^1.0.1" + +find-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-2.0.0.tgz#3a7c35c704e11a6e5722c56e45bd7e587507735e" + integrity sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ== + dependencies: + find-file-up "^2.0.1" + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -4107,14 +4128,14 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -glob-cache@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/glob-cache/-/glob-cache-0.3.5.tgz#b467868235106fbe1a32973b3765faf90be78259" - integrity sha512-g5GOT/QIQ+kOmJBzMYab5GLfE9NWrupDoqLQdfd52N81vasW+fheOYpiFfNFbo4dR1TwvLfv+cz64mAInrfN4g== +glob-cache@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glob-cache/-/glob-cache-1.0.1.tgz#737133ca89c6a2acd54cb34b52613a291332a0ef" + integrity sha512-rBoeI8OLOCnvDtgmppqwY/j5eQnzlJxIbbLvb4NGTXJRHKsbjjaw91jIUForGfhlgVpT7SQ4/IzTBPhn0ujjaw== dependencies: - arr-diff "^4.0.0" cacache "^13.0.1" fast-glob "^3.1.1" + memoize-fs "^2.1.0" glob-parent@^3.1.0: version "3.1.0" @@ -4155,6 +4176,26 @@ global-dirs@^2.0.1: dependencies: ini "^1.3.5" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4287,10 +4328,17 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: - version "2.8.7" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.7.tgz#4d2e0d5248e1cfabc984b0f6a6d75fe36e679511" - integrity sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== html-encoding-sniffer@^1.0.2: version "1.0.2" @@ -4519,22 +4567,22 @@ inquirer@^6.2.0: through "^2.3.6" inquirer@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== + version "7.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.6.tgz#ee4ff0ea7ecda5324656fe665878790f66df7d0c" + integrity sha512-7SVO4h+QIdMq6XcqIqrNte3gS5MzCCKZdsq9DO4PJziBFNYzP3PGFbDjgadDb//MCahzgjCxvQ/O2wa7kx9o4w== dependencies: ansi-escapes "^4.2.1" - chalk "^2.4.2" + chalk "^3.0.0" cli-cursor "^3.1.0" cli-width "^2.0.0" external-editor "^3.0.3" figures "^3.0.0" lodash "^4.17.15" mute-stream "0.0.8" - run-async "^2.2.0" + run-async "^2.4.0" rxjs "^6.5.3" string-width "^4.1.0" - strip-ansi "^5.1.0" + strip-ansi "^6.0.0" through "^2.3.6" internal-slot@^1.0.2: @@ -4860,7 +4908,7 @@ is-whitespace-character@^1.0.0: resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== -is-windows@^1.0.0, is-windows@^1.0.2: +is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -5789,6 +5837,14 @@ mdast-util-compact@^1.0.0: dependencies: unist-util-visit "^1.1.0" +memoize-fs@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/memoize-fs/-/memoize-fs-2.1.0.tgz#a819ba8688cb9cb6b3223c068109dd3de6835a72" + integrity sha512-vn8tNMeUsu1IopbrjEZ5RFzKFLvRu5d7DI+qsrVQNE2Gv3szQgMB1N3tT8Mzv1wPrAjbN/Dg+pnZTyKLCLem5g== + dependencies: + fs-extra "^8.1.0" + meriyah "^1.9.7" + meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -5845,6 +5901,11 @@ merge2@^1.2.3, merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== +meriyah@^1.9.7: + version "1.9.8" + resolved "https://registry.yarnpkg.com/meriyah/-/meriyah-1.9.8.tgz#18aed48d285c16d190e9e6e55261c30ba3fc29b0" + integrity sha512-sYnSmnv7CXwxNCTp8Y4tfX0hvM/+OX7jaiMVVLt/+hst6+vjrzASTAPdKUFLmUG1Y83uLsttOc/hWold6HcS1g== + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -6629,6 +6690,11 @@ parse-json@^5.0.0: json-parse-better-errors "^1.0.1" lines-and-columns "^1.1.6" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + parse-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" @@ -7152,10 +7218,10 @@ reflexbox@^4.0.6: "@styled-system/should-forward-prop" "^5.0.0" styled-system "^5.0.0" -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz#e96bf612a3362d12bb69f7e8f74ffeab25c7ac91" + integrity sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g== regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -7341,6 +7407,14 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -7430,7 +7504,7 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.2.0: +run-async@^2.2.0, run-async@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== @@ -8325,6 +8399,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -8566,17 +8645,17 @@ vfile-location@^2.0.0: integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== vfile-message@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.2.tgz#75ba05090ec758fa8420f2c11ce049bcddd8cf3e" - integrity sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.3.tgz#0dd4f6879fb240a8099b22bd3755536c92e59ba5" + integrity sha512-qQg/2z8qnnBHL0psXyF72kCjb9YioIynvyltuNKFaUhRtqTIcIMP3xnBaPzirVZNuBrUe1qwFciSx2yApa4byw== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position "^2.0.0" vfile@^4.0.0, vfile@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.0.2.tgz#71af004d4a710b0e6be99c894655bc56126d5d56" - integrity sha512-yhoTU5cDMSsaeaMfJ5g0bUKYkYmZhAh9fn9TZicxqn+Cw4Z439il2v3oT9S0yjlpqlI74aFOQCt3nOV+pxzlkw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.0.3.tgz#1e50b824fb5e5affd718e225c7bb1af6d97d4408" + integrity sha512-lREgT5sF05TQk68LO6APy0In+TkFGnFEgKChK2+PHIaTrFQ9oHCKXznZ7VILwgYVBcl0gv4lGATFZBLhi2kVQg== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" @@ -8585,11 +8664,11 @@ vfile@^4.0.0, vfile@^4.0.2: vfile-message "^2.0.0" w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" w3c-xmlserializer@^1.1.2: version "1.1.2" @@ -8650,7 +8729,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.2.9, which@^1.3.1: +which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==