@@ -20,7 +20,6 @@ | |||
], | |||
"plugins": [ | |||
"transform-class-properties", | |||
// use built-in `Object.assign` | |||
["transform-object-rest-spread", { "useBuiltIns": true }], | |||
"lodash" | |||
], |
@@ -18,8 +18,9 @@ | |||
"babel-polyfill": "6.26.0", | |||
"classnames": "2.2.6", | |||
"lodash": "4.17.10", | |||
"react": "16.2.0", | |||
"react-dom": "16.2.0", | |||
"prop-types": "15.6.1", | |||
"react": "16.4.2", | |||
"react-dom": "16.4.2", | |||
"react-intl": "2.4.0", | |||
"styled-components": "3.3.3", | |||
"whatwg-fetch": "2.0.4" | |||
@@ -27,14 +28,14 @@ | |||
"devDependencies": { | |||
"@types/classnames": "2.2.4", | |||
"@types/enzyme": "3.1.11", | |||
"@types/jest": "23.1.5", | |||
"@types/jest": "23.3.1", | |||
"@types/lodash": "4.14.111", | |||
"@types/react": "16.0.29", | |||
"@types/react-dom": "16.0.3", | |||
"@types/react": "16.4.8", | |||
"@types/react-dom": "16.0.7", | |||
"@types/react-intl": "2.3.8", | |||
"autoprefixer": "7.1.6", | |||
"babel-core": "6.26.3", | |||
"babel-jest": "23.4.0", | |||
"babel-jest": "23.4.2", | |||
"babel-loader": "7.1.5", | |||
"babel-plugin-dynamic-import-node": "1.2.0", | |||
"babel-plugin-lodash": "3.3.4", | |||
@@ -62,20 +63,20 @@ | |||
"eslint-plugin-react": "7.7.0", | |||
"eslint-plugin-sonarjs": "0.1.0", | |||
"html-webpack-plugin": "3.0.6", | |||
"jest": "23.4.0", | |||
"jest": "23.4.2", | |||
"postcss-calc": "6.0.1", | |||
"postcss-custom-properties": "6.2.0", | |||
"postcss-loader": "2.1.6", | |||
"prettier": "1.13.7", | |||
"prettier": "1.14.0", | |||
"react-dev-utils": "5.0.1", | |||
"react-error-overlay": "1.0.7", | |||
"react-test-renderer": "16.2.0", | |||
"react-test-renderer": "16.4.2", | |||
"request": "2.87.0", | |||
"style-loader": "0.21.0", | |||
"ts-jest": "23.0.0", | |||
"ts-jest": "23.1.3", | |||
"ts-loader": "4.4.2", | |||
"typescript": "2.8.3", | |||
"typescript-eslint-parser": "15.0.0", | |||
"typescript": "3.0.1", | |||
"typescript-eslint-parser": "18.0.0", | |||
"webpack": "4.16.0", | |||
"webpack-bundle-analyzer": "2.13.1", | |||
"webpack-dev-server": "3.1.4" |
@@ -48,7 +48,8 @@ export default function ProjectCardHeader({ project }: Props) { | |||
<DateTimeFormatter date={project.analysisDate}> | |||
{formattedDate => ( | |||
<small className="project-card-analysis-date"> | |||
Last analysis:<br className="hidden-big" /> | |||
Last analysis: | |||
<br className="hidden-big" /> | |||
<span className="little-spacer-left">{formattedDate}</span> | |||
</small> | |||
)} |
@@ -61,7 +61,8 @@ export default class RepoWidgetNotConfigured extends React.PureComponent<{}, Sta | |||
</a> | |||
) : ( | |||
'repository settings' | |||
)}. | |||
)} | |||
. | |||
</> | |||
); | |||
} else { |
@@ -205,9 +205,9 @@ | |||
"@types/cheerio" "*" | |||
"@types/react" "*" | |||
"@types/jest@23.1.5": | |||
version "23.1.5" | |||
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.5.tgz#e31be003956e1fa8c860124d99bea9ae327ae37b" | |||
"@types/jest@23.3.1": | |||
version "23.3.1" | |||
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf" | |||
"@types/lodash@4.14.111": | |||
version "4.14.111" | |||
@@ -217,9 +217,15 @@ | |||
version "9.6.0" | |||
resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7" | |||
"@types/react-dom@16.0.3": | |||
version "16.0.3" | |||
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64" | |||
"@types/prop-types@*": | |||
version "15.5.5" | |||
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3" | |||
dependencies: | |||
"@types/react" "*" | |||
"@types/react-dom@16.0.7": | |||
version "16.0.7" | |||
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.7.tgz#54d0f867a76b90597e8432030d297982f25c20ba" | |||
dependencies: | |||
"@types/node" "*" | |||
"@types/react" "*" | |||
@@ -232,9 +238,12 @@ | |||
version "16.0.41" | |||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.41.tgz#72146737f4d439dc95a53315de4bfb43ac8542ca" | |||
"@types/react@16.0.29": | |||
version "16.0.29" | |||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.29.tgz#4eea6a8de9f40ca71d580ae7a9f3b4b77b368de8" | |||
"@types/react@16.4.8": | |||
version "16.4.8" | |||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.8.tgz#ff0440429783df0927bdcd430fa1225f7c08cf36" | |||
dependencies: | |||
"@types/prop-types" "*" | |||
csstype "^2.2.0" | |||
"@webassemblyjs/ast@1.5.13": | |||
version "1.5.13" | |||
@@ -508,13 +517,6 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: | |||
dependencies: | |||
color-convert "^1.9.0" | |||
anymatch@^1.3.0: | |||
version "1.3.2" | |||
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" | |||
dependencies: | |||
micromatch "^2.1.5" | |||
normalize-path "^2.0.0" | |||
anymatch@^2.0.0: | |||
version "2.0.0" | |||
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" | |||
@@ -921,9 +923,9 @@ babel-helpers@^6.24.1: | |||
babel-runtime "^6.22.0" | |||
babel-template "^6.24.1" | |||
babel-jest@23.4.0, babel-jest@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.0.tgz#22c34c392e2176f6a4c367992a7fcff69d2e8557" | |||
babel-jest@23.4.2, babel-jest@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.2.tgz#f276de67798a5d68f2d6e87ff518c2f6e1609877" | |||
dependencies: | |||
babel-plugin-istanbul "^4.1.6" | |||
babel-preset-jest "^23.2.0" | |||
@@ -1329,7 +1331,7 @@ babel-preset-env@1.6.1: | |||
invariant "^2.2.2" | |||
semver "^5.3.0" | |||
babel-preset-jest@^23.0.0, babel-preset-jest@^23.2.0: | |||
babel-preset-jest@^23.2.0: | |||
version "23.2.0" | |||
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" | |||
dependencies: | |||
@@ -1367,7 +1369,7 @@ babel-runtime@6.23.0: | |||
core-js "^2.4.0" | |||
regenerator-runtime "^0.10.0" | |||
babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: | |||
babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: | |||
version "6.26.0" | |||
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" | |||
dependencies: | |||
@@ -1829,21 +1831,6 @@ cheerio@^1.0.0-rc.2: | |||
lodash "^4.15.0" | |||
parse5 "^3.0.1" | |||
chokidar@^1.6.0: | |||
version "1.7.0" | |||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" | |||
dependencies: | |||
anymatch "^1.3.0" | |||
async-each "^1.0.0" | |||
glob-parent "^2.0.0" | |||
inherits "^2.0.1" | |||
is-binary-path "^1.0.0" | |||
is-glob "^2.0.0" | |||
path-is-absolute "^1.0.0" | |||
readdirp "^2.0.0" | |||
optionalDependencies: | |||
fsevents "^1.0.0" | |||
chokidar@^2.0.0, chokidar@^2.0.2: | |||
version "2.0.3" | |||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" | |||
@@ -1956,6 +1943,10 @@ clorox@^1.0.3: | |||
version "1.0.3" | |||
resolved "https://registry.yarnpkg.com/clorox/-/clorox-1.0.3.tgz#6fa63653f280c33d69f548fb14d239ddcfa1590d" | |||
closest-file-data@^0.1.4: | |||
version "0.1.4" | |||
resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a" | |||
co@^4.6.0: | |||
version "4.6.0" | |||
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" | |||
@@ -2169,22 +2160,6 @@ cosmiconfig@^4.0.0: | |||
parse-json "^4.0.0" | |||
require-from-string "^2.0.1" | |||
cpx@^1.5.0: | |||
version "1.5.0" | |||
resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" | |||
dependencies: | |||
babel-runtime "^6.9.2" | |||
chokidar "^1.6.0" | |||
duplexer "^0.1.1" | |||
glob "^7.0.5" | |||
glob2base "^0.0.12" | |||
minimatch "^3.0.2" | |||
mkdirp "^0.5.1" | |||
resolve "^1.1.7" | |||
safe-buffer "^5.0.1" | |||
shell-quote "^1.6.1" | |||
subarg "^1.0.0" | |||
create-ecdh@^4.0.0: | |||
version "4.0.0" | |||
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" | |||
@@ -2385,6 +2360,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": | |||
dependencies: | |||
cssom "0.3.x" | |||
csstype@^2.2.0: | |||
version "2.5.6" | |||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788" | |||
csstype@^2.5.2: | |||
version "2.5.5" | |||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.5.tgz#4125484a3d42189a863943f23b9e4b80fedfa106" | |||
@@ -2429,12 +2408,6 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: | |||
version "1.2.0" | |||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" | |||
decamelize@^2.0.0: | |||
version "2.0.0" | |||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" | |||
dependencies: | |||
xregexp "4.0.0" | |||
decode-uri-component@^0.2.0: | |||
version "0.2.0" | |||
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" | |||
@@ -3352,10 +3325,6 @@ find-cache-dir@^1.0.0: | |||
make-dir "^1.0.0" | |||
pkg-dir "^2.0.0" | |||
find-index@^0.1.1: | |||
version "0.1.1" | |||
resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" | |||
find-root@^1.1.0: | |||
version "1.1.0" | |||
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" | |||
@@ -3373,12 +3342,6 @@ find-up@^2.0.0, find-up@^2.1.0: | |||
dependencies: | |||
locate-path "^2.0.0" | |||
find-up@^3.0.0: | |||
version "3.0.0" | |||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" | |||
dependencies: | |||
locate-path "^3.0.0" | |||
flat-cache@^1.2.1: | |||
version "1.3.0" | |||
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" | |||
@@ -3485,7 +3448,7 @@ fs.realpath@^1.0.0: | |||
version "1.0.0" | |||
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" | |||
fsevents@^1.0.0, fsevents@^1.1.1, fsevents@^1.1.2: | |||
fsevents@^1.1.1, fsevents@^1.1.2: | |||
version "1.1.3" | |||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" | |||
dependencies: | |||
@@ -3580,12 +3543,6 @@ glob-parent@^3.1.0: | |||
is-glob "^3.1.0" | |||
path-dirname "^1.0.0" | |||
glob2base@^0.0.12: | |||
version "0.0.12" | |||
resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" | |||
dependencies: | |||
find-index "^0.1.1" | |||
glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: | |||
version "7.1.2" | |||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" | |||
@@ -4510,15 +4467,15 @@ istanbul-reports@^1.3.0: | |||
dependencies: | |||
handlebars "^4.0.3" | |||
jest-changed-files@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.0.tgz#f1b304f98c235af5d9a31ec524262c5e4de3c6ff" | |||
jest-changed-files@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" | |||
dependencies: | |||
throat "^4.0.0" | |||
jest-cli@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.0.tgz#d1fdd1dbc41d69ae8bd43d0070ce23988eacd86f" | |||
jest-cli@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.2.tgz#49d56bcfe6cf01871bfcc4a0494e08edaf2b61d0" | |||
dependencies: | |||
ansi-escapes "^3.0.0" | |||
chalk "^2.0.1" | |||
@@ -4531,17 +4488,17 @@ jest-cli@^23.4.0: | |||
istanbul-lib-coverage "^1.2.0" | |||
istanbul-lib-instrument "^1.10.1" | |||
istanbul-lib-source-maps "^1.2.4" | |||
jest-changed-files "^23.4.0" | |||
jest-config "^23.4.0" | |||
jest-changed-files "^23.4.2" | |||
jest-config "^23.4.2" | |||
jest-environment-jsdom "^23.4.0" | |||
jest-get-type "^22.1.0" | |||
jest-haste-map "^23.4.0" | |||
jest-haste-map "^23.4.1" | |||
jest-message-util "^23.4.0" | |||
jest-regex-util "^23.3.0" | |||
jest-resolve-dependencies "^23.4.0" | |||
jest-runner "^23.4.0" | |||
jest-runtime "^23.4.0" | |||
jest-snapshot "^23.4.0" | |||
jest-resolve-dependencies "^23.4.2" | |||
jest-runner "^23.4.2" | |||
jest-runtime "^23.4.2" | |||
jest-snapshot "^23.4.2" | |||
jest-util "^23.4.0" | |||
jest-validate "^23.4.0" | |||
jest-watcher "^23.4.0" | |||
@@ -4557,20 +4514,20 @@ jest-cli@^23.4.0: | |||
which "^1.2.12" | |||
yargs "^11.0.0" | |||
jest-config@^23.0.0, jest-config@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.0.tgz#79ccf8d68aa0e48f9e3beb81b83aa5875c63fa3f" | |||
jest-config@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.2.tgz#62a105e14b8266458f2bf4d32403b2c44418fa77" | |||
dependencies: | |||
babel-core "^6.0.0" | |||
babel-jest "^23.4.0" | |||
babel-jest "^23.4.2" | |||
chalk "^2.0.1" | |||
glob "^7.1.1" | |||
jest-environment-jsdom "^23.4.0" | |||
jest-environment-node "^23.4.0" | |||
jest-get-type "^22.1.0" | |||
jest-jasmine2 "^23.4.0" | |||
jest-jasmine2 "^23.4.2" | |||
jest-regex-util "^23.3.0" | |||
jest-resolve "^23.4.0" | |||
jest-resolve "^23.4.1" | |||
jest-util "^23.4.0" | |||
jest-validate "^23.4.0" | |||
pretty-format "^23.2.0" | |||
@@ -4616,9 +4573,9 @@ jest-get-type@^22.1.0: | |||
version "22.4.3" | |||
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" | |||
jest-haste-map@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.0.tgz#f2a0eaa41af766cd5101e6c291fdc6435c93ee1c" | |||
jest-haste-map@^23.4.1: | |||
version "23.4.1" | |||
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.1.tgz#43a174ba7ac079ae1dd74eaf5a5fe78989474dd2" | |||
dependencies: | |||
fb-watchman "^2.0.0" | |||
graceful-fs "^4.1.11" | |||
@@ -4628,10 +4585,11 @@ jest-haste-map@^23.4.0: | |||
micromatch "^2.3.11" | |||
sane "^2.0.0" | |||
jest-jasmine2@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.0.tgz#17ce539fe608ef898d6986518144acf270beca8f" | |||
jest-jasmine2@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.2.tgz#2fbf52f93e43ed4c5e7326a90bb1d785be4321ac" | |||
dependencies: | |||
babel-traverse "^6.0.0" | |||
chalk "^2.0.1" | |||
co "^4.6.0" | |||
expect "^23.4.0" | |||
@@ -4640,7 +4598,7 @@ jest-jasmine2@^23.4.0: | |||
jest-each "^23.4.0" | |||
jest-matcher-utils "^23.2.0" | |||
jest-message-util "^23.4.0" | |||
jest-snapshot "^23.4.0" | |||
jest-snapshot "^23.4.2" | |||
jest-util "^23.4.0" | |||
pretty-format "^23.2.0" | |||
@@ -4676,42 +4634,42 @@ jest-regex-util@^23.3.0: | |||
version "23.3.0" | |||
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" | |||
jest-resolve-dependencies@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.0.tgz#e73efce70262a6e2bf5263d0b23009a098678620" | |||
jest-resolve-dependencies@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.2.tgz#0675ba876a5b819deffc449ad72e9985c2592048" | |||
dependencies: | |||
jest-regex-util "^23.3.0" | |||
jest-snapshot "^23.4.0" | |||
jest-snapshot "^23.4.2" | |||
jest-resolve@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.0.tgz#b4061dbcd6391b5e445d5fd84c9dad5ff1ff5662" | |||
jest-resolve@^23.4.1: | |||
version "23.4.1" | |||
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.1.tgz#7f3c17104732a2c0c940a01256025ed745814982" | |||
dependencies: | |||
browser-resolve "^1.11.3" | |||
chalk "^2.0.1" | |||
realpath-native "^1.0.0" | |||
jest-runner@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.0.tgz#1859b211a264ea5a43b7a3022e1199067c4dfe57" | |||
jest-runner@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.2.tgz#579a88524ac52c846075b0129a21c7b483e75a7e" | |||
dependencies: | |||
exit "^0.1.2" | |||
graceful-fs "^4.1.11" | |||
jest-config "^23.4.0" | |||
jest-config "^23.4.2" | |||
jest-docblock "^23.2.0" | |||
jest-haste-map "^23.4.0" | |||
jest-jasmine2 "^23.4.0" | |||
jest-haste-map "^23.4.1" | |||
jest-jasmine2 "^23.4.2" | |||
jest-leak-detector "^23.2.0" | |||
jest-message-util "^23.4.0" | |||
jest-runtime "^23.4.0" | |||
jest-runtime "^23.4.2" | |||
jest-util "^23.4.0" | |||
jest-worker "^23.2.0" | |||
source-map-support "^0.5.6" | |||
throat "^4.0.0" | |||
jest-runtime@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.0.tgz#c30ef619def587b93bad4a4938da9accb9936b4d" | |||
jest-runtime@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.2.tgz#00c3bb8385253d401a394a27d1112d3615e5a65c" | |||
dependencies: | |||
babel-core "^6.0.0" | |||
babel-plugin-istanbul "^4.1.6" | |||
@@ -4720,12 +4678,12 @@ jest-runtime@^23.4.0: | |||
exit "^0.1.2" | |||
fast-json-stable-stringify "^2.0.0" | |||
graceful-fs "^4.1.11" | |||
jest-config "^23.4.0" | |||
jest-haste-map "^23.4.0" | |||
jest-config "^23.4.2" | |||
jest-haste-map "^23.4.1" | |||
jest-message-util "^23.4.0" | |||
jest-regex-util "^23.3.0" | |||
jest-resolve "^23.4.0" | |||
jest-snapshot "^23.4.0" | |||
jest-resolve "^23.4.1" | |||
jest-snapshot "^23.4.2" | |||
jest-util "^23.4.0" | |||
jest-validate "^23.4.0" | |||
micromatch "^2.3.11" | |||
@@ -4739,17 +4697,16 @@ jest-serializer@^23.0.1: | |||
version "23.0.1" | |||
resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" | |||
jest-snapshot@^23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.0.tgz#7463d0357cabdfe1c63994d5e32f707d1033d616" | |||
jest-snapshot@^23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.2.tgz#8fa6130feb5a527dac73e5fa80d86f29f7c42ab6" | |||
dependencies: | |||
babel-traverse "^6.0.0" | |||
babel-types "^6.0.0" | |||
chalk "^2.0.1" | |||
jest-diff "^23.2.0" | |||
jest-matcher-utils "^23.2.0" | |||
jest-message-util "^23.4.0" | |||
jest-resolve "^23.4.0" | |||
jest-resolve "^23.4.1" | |||
mkdirp "^0.5.1" | |||
natural-compare "^1.4.0" | |||
pretty-format "^23.2.0" | |||
@@ -4791,12 +4748,12 @@ jest-worker@^23.2.0: | |||
dependencies: | |||
merge-stream "^1.0.1" | |||
jest@23.4.0: | |||
version "23.4.0" | |||
resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.0.tgz#ebce63f6529c27c646d80c610866f0306f66dcbf" | |||
jest@23.4.2: | |||
version "23.4.2" | |||
resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.2.tgz#1fae3ed832192143070ae85156b25cea891a1260" | |||
dependencies: | |||
import-local "^1.0.0" | |||
jest-cli "^23.4.0" | |||
jest-cli "^23.4.2" | |||
js-base64@^2.1.9: | |||
version "2.4.3" | |||
@@ -5025,13 +4982,6 @@ locate-path@^2.0.0: | |||
p-locate "^2.0.0" | |||
path-exists "^3.0.0" | |||
locate-path@^3.0.0: | |||
version "3.0.0" | |||
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" | |||
dependencies: | |||
p-locate "^3.0.0" | |||
path-exists "^3.0.0" | |||
lodash.camelcase@^4.3.0: | |||
version "4.3.0" | |||
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" | |||
@@ -5213,7 +5163,7 @@ methods@~1.1.2: | |||
version "1.1.2" | |||
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" | |||
micromatch@^2.1.5, micromatch@^2.3.11: | |||
micromatch@^2.3.11: | |||
version "2.3.11" | |||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" | |||
dependencies: | |||
@@ -5302,7 +5252,7 @@ minimist@0.0.8: | |||
version "0.0.8" | |||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" | |||
minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: | |||
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: | |||
version "1.2.0" | |||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" | |||
@@ -5519,7 +5469,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: | |||
semver "2 || 3 || 4 || 5" | |||
validate-npm-package-license "^3.0.1" | |||
normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: | |||
normalize-path@^2.0.1, normalize-path@^2.1.1: | |||
version "2.1.1" | |||
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" | |||
dependencies: | |||
@@ -5761,24 +5711,12 @@ p-limit@^1.0.0, p-limit@^1.1.0: | |||
dependencies: | |||
p-try "^1.0.0" | |||
p-limit@^2.0.0: | |||
version "2.0.0" | |||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" | |||
dependencies: | |||
p-try "^2.0.0" | |||
p-locate@^2.0.0: | |||
version "2.0.0" | |||
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" | |||
dependencies: | |||
p-limit "^1.1.0" | |||
p-locate@^3.0.0: | |||
version "3.0.0" | |||
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" | |||
dependencies: | |||
p-limit "^2.0.0" | |||
p-map@^1.1.1: | |||
version "1.2.0" | |||
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" | |||
@@ -5787,10 +5725,6 @@ p-try@^1.0.0: | |||
version "1.0.0" | |||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" | |||
p-try@^2.0.0: | |||
version "2.0.0" | |||
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" | |||
pako@~1.0.5: | |||
version "1.0.6" | |||
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" | |||
@@ -5969,12 +5903,6 @@ pkg-dir@^2.0.0: | |||
dependencies: | |||
find-up "^2.1.0" | |||
pkg-dir@^3.0.0: | |||
version "3.0.0" | |||
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" | |||
dependencies: | |||
find-up "^3.0.0" | |||
pluralize@^7.0.0: | |||
version "7.0.0" | |||
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" | |||
@@ -6289,9 +6217,9 @@ preserve@^0.2.0: | |||
version "0.2.0" | |||
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" | |||
prettier@1.13.7: | |||
version "1.13.7" | |||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281" | |||
prettier@1.14.0: | |||
version "1.14.0" | |||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372" | |||
pretty-error@^2.0.2: | |||
version "2.1.1" | |||
@@ -6340,18 +6268,18 @@ prompts@^0.1.9: | |||
clorox "^1.0.3" | |||
sisteransi "^0.1.1" | |||
prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.6.1: | |||
version "15.6.2" | |||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" | |||
prop-types@15.6.1, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0: | |||
version "15.6.1" | |||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" | |||
dependencies: | |||
fbjs "^0.8.16" | |||
loose-envify "^1.3.1" | |||
object-assign "^4.1.1" | |||
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0: | |||
version "15.6.1" | |||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" | |||
prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.6.1: | |||
version "15.6.2" | |||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" | |||
dependencies: | |||
fbjs "^0.8.16" | |||
loose-envify "^1.3.1" | |||
object-assign "^4.1.1" | |||
@@ -6552,9 +6480,9 @@ react-dev-utils@^3.0.0: | |||
strip-ansi "3.0.1" | |||
text-table "0.2.0" | |||
react-dom@16.2.0: | |||
version "16.2.0" | |||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044" | |||
react-dom@16.4.2: | |||
version "16.4.2" | |||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4" | |||
dependencies: | |||
fbjs "^0.8.16" | |||
loose-envify "^1.1.0" | |||
@@ -6607,6 +6535,10 @@ react-is@^16.3.1: | |||
version "16.4.1" | |||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" | |||
react-is@^16.4.2: | |||
version "16.4.2" | |||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88" | |||
react-node-resolver@^1.0.1: | |||
version "1.0.1" | |||
resolved "https://registry.yarnpkg.com/react-node-resolver/-/react-node-resolver-1.0.1.tgz#1798a729c0e218bf2f0e8ddf79c550d4af61d83a" | |||
@@ -6655,7 +6587,16 @@ react-side-effect@^1.1.3: | |||
exenv "^1.2.1" | |||
shallowequal "^1.0.1" | |||
react-test-renderer@16.2.0, react-test-renderer@^16.0.0-0: | |||
react-test-renderer@16.4.2: | |||
version "16.4.2" | |||
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e" | |||
dependencies: | |||
fbjs "^0.8.16" | |||
object-assign "^4.1.1" | |||
prop-types "^15.6.0" | |||
react-is "^16.4.2" | |||
react-test-renderer@^16.0.0-0: | |||
version "16.2.0" | |||
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211" | |||
dependencies: | |||
@@ -6674,9 +6615,9 @@ react-transition-group@^2.2.1: | |||
prop-types "^15.5.8" | |||
warning "^3.0.0" | |||
react@16.2.0: | |||
version "16.2.0" | |||
resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" | |||
react@16.4.2: | |||
version "16.4.2" | |||
resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f" | |||
dependencies: | |||
fbjs "^0.8.16" | |||
loose-envify "^1.1.0" | |||
@@ -7023,7 +6964,7 @@ resolve@1.1.7: | |||
version "1.1.7" | |||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" | |||
resolve@^1.1.7, resolve@^1.5.0: | |||
resolve@^1.5.0: | |||
version "1.6.0" | |||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" | |||
dependencies: | |||
@@ -7249,7 +7190,7 @@ shebang-regex@^1.0.0: | |||
version "1.0.0" | |||
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" | |||
shell-quote@1.6.1, shell-quote@^1.6.1: | |||
shell-quote@1.6.1: | |||
version "1.6.1" | |||
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" | |||
dependencies: | |||
@@ -7630,12 +7571,6 @@ stylis@^3.5.0: | |||
version "3.5.1" | |||
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.1.tgz#fd341d59f57f9aeb412bc14c9d8a8670b438e03b" | |||
subarg@^1.0.0: | |||
version "1.0.0" | |||
resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" | |||
dependencies: | |||
minimist "^1.1.0" | |||
supports-color@^2.0.0: | |||
version "2.0.0" | |||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" | |||
@@ -7825,18 +7760,13 @@ tryer@^1.0.0: | |||
version "1.0.0" | |||
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.0.tgz#027b69fa823225e551cace3ef03b11f6ab37c1d7" | |||
ts-jest@23.0.0: | |||
version "23.0.0" | |||
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.0.0.tgz#3216310fb51e40789c6e4aa20bfe80198d250e9b" | |||
ts-jest@23.1.3: | |||
version "23.1.3" | |||
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.3.tgz#33e3187d3ef0d42adada6347acf2c3539ac56107" | |||
dependencies: | |||
babel-plugin-istanbul "^4.1.6" | |||
babel-preset-jest "^23.0.0" | |||
cpx "^1.5.0" | |||
closest-file-data "^0.1.4" | |||
fs-extra "6.0.1" | |||
jest-config "^23.0.0" | |||
lodash "^4.17.10" | |||
pkg-dir "^3.0.0" | |||
yargs "^12.0.1" | |||
ts-loader@4.4.2: | |||
version "4.4.2" | |||
@@ -7887,16 +7817,16 @@ typedarray@^0.0.6: | |||
version "0.0.6" | |||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" | |||
typescript-eslint-parser@15.0.0: | |||
version "15.0.0" | |||
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f" | |||
typescript-eslint-parser@18.0.0: | |||
version "18.0.0" | |||
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-18.0.0.tgz#3e5055a44980d69e4154350fc5d8b1ab4e2332a8" | |||
dependencies: | |||
lodash.unescape "4.0.1" | |||
semver "5.5.0" | |||
typescript@2.8.3: | |||
version "2.8.3" | |||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" | |||
typescript@3.0.1: | |||
version "3.0.1" | |||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb" | |||
ua-parser-js@^0.7.18: | |||
version "0.7.18" | |||
@@ -8381,10 +8311,6 @@ xml-name-validator@^3.0.0: | |||
version "3.0.0" | |||
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" | |||
xregexp@4.0.0: | |||
version "4.0.0" | |||
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" | |||
xtend@^4.0.0, xtend@~4.0.1: | |||
version "4.0.1" | |||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" | |||
@@ -8393,7 +8319,7 @@ y18n@^3.2.1: | |||
version "3.2.1" | |||
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" | |||
"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: | |||
y18n@^4.0.0: | |||
version "4.0.0" | |||
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" | |||
@@ -8401,12 +8327,6 @@ yallist@^2.1.2: | |||
version "2.1.2" | |||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" | |||
yargs-parser@^10.1.0: | |||
version "10.1.0" | |||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" | |||
dependencies: | |||
camelcase "^4.1.0" | |||
yargs-parser@^9.0.2: | |||
version "9.0.2" | |||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" | |||
@@ -8447,23 +8367,6 @@ yargs@^11.0.0: | |||
y18n "^3.2.1" | |||
yargs-parser "^9.0.2" | |||
yargs@^12.0.1: | |||
version "12.0.1" | |||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" | |||
dependencies: | |||
cliui "^4.0.0" | |||
decamelize "^2.0.0" | |||
find-up "^3.0.0" | |||
get-caller-file "^1.0.1" | |||
os-locale "^2.0.0" | |||
require-directory "^2.1.1" | |||
require-main-filename "^1.0.1" | |||
set-blocking "^2.0.0" | |||
string-width "^2.0.0" | |||
which-module "^2.0.0" | |||
y18n "^3.2.1 || ^4.0.0" | |||
yargs-parser "^10.1.0" | |||
yargs@~3.10.0: | |||
version "3.10.0" | |||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" |
@@ -20,7 +20,6 @@ | |||
], | |||
"plugins": [ | |||
"transform-class-properties", | |||
// use built-in `Object.assign` | |||
["transform-object-rest-spread", { "useBuiltIns": true }], | |||
"lodash" | |||
], |
@@ -9,20 +9,20 @@ | |||
"babel-polyfill": "6.26.0", | |||
"classnames": "2.2.5", | |||
"lodash": "4.17.4", | |||
"react": "16.2.0", | |||
"react-dom": "16.2.0", | |||
"react": "16.4.2", | |||
"react-dom": "16.4.2", | |||
"whatwg-fetch": "2.0.3" | |||
}, | |||
"devDependencies": { | |||
"@types/classnames": "2.2.3", | |||
"@types/enzyme": "3.1.10", | |||
"@types/jest": "22.2.3", | |||
"@types/jest": "23.3.1", | |||
"@types/lodash": "4.14.102", | |||
"@types/react": "16.0.29", | |||
"@types/react-dom": "16.0.3", | |||
"@types/react": "16.4.8", | |||
"@types/react-dom": "16.0.7", | |||
"autoprefixer": "7.1.6", | |||
"babel-core": "6.26.0", | |||
"babel-jest": "23.0.1", | |||
"babel-jest": "23.4.2", | |||
"babel-loader": "7.1.4", | |||
"babel-plugin-dynamic-import-node": "1.1.0", | |||
"babel-plugin-lodash": "3.3.2", | |||
@@ -50,19 +50,19 @@ | |||
"eslint-plugin-react": "7.7.0", | |||
"eslint-plugin-sonarjs": "0.1.0", | |||
"html-webpack-plugin": "3.0.6", | |||
"jest": "23.1.0", | |||
"jest": "23.4.2", | |||
"postcss-calc": "6.0.1", | |||
"postcss-custom-properties": "6.2.0", | |||
"postcss-loader": "2.1.1", | |||
"prettier": "1.11.1", | |||
"prettier": "1.14.0", | |||
"react-dev-utils": "5.0.0", | |||
"react-error-overlay": "1.0.7", | |||
"react-test-renderer": "16.2.0", | |||
"react-test-renderer": "16.4.2", | |||
"style-loader": "0.20.3", | |||
"ts-jest": "22.4.6", | |||
"ts-jest": "23.1.3", | |||
"ts-loader": "4.3.0", | |||
"typescript": "2.8.4", | |||
"typescript-eslint-parser": "15.0.0", | |||
"typescript": "3.0.1", | |||
"typescript-eslint-parser": "18.0.0", | |||
"webpack": "4.1.1", | |||
"webpack-bundle-analyzer": "2.11.1", | |||
"webpack-dev-server": "3.1.1" |
@@ -73,7 +73,6 @@ | |||
], | |||
"plugins": [ | |||
"transform-class-properties", | |||
// use built-in `Object.assign` | |||
["transform-object-rest-spread", { "useBuiltIns": true }], | |||
"lodash" | |||
], |
@@ -2,6 +2,7 @@ | |||
"extends": "sonarqube", | |||
"rules": { | |||
"import/extensions": ["error", "never", { "json": "always", "md": "always" }] | |||
"import/extensions": ["error", "never", { "json": "always", "md": "always" }], | |||
"jsx-a11y/accessible-emoji": "off" | |||
} | |||
} |
@@ -24,9 +24,9 @@ | |||
"lunr": "2.3.0", | |||
"mdast-util-toc": "2.0.1", | |||
"prop-types": "15.6.1", | |||
"react": "16.2.0", | |||
"react": "16.4.2", | |||
"react-day-picker": "7.1.8", | |||
"react-dom": "16.2.0", | |||
"react-dom": "16.4.2", | |||
"react-draggable": "3.0.5", | |||
"react-ga": "2.5.3", | |||
"react-helmet": "5.2.0", | |||
@@ -40,9 +40,9 @@ | |||
"redux-logger": "3.0.6", | |||
"redux-thunk": "2.2.0", | |||
"remark-custom-blocks": "2.2.0", | |||
"remark-slug": "5.0.0", | |||
"remark-toc": "5.0.0", | |||
"unist-util-visit": "1.3.1", | |||
"remark-slug": "5.0.0", | |||
"whatwg-fetch": "2.0.4" | |||
}, | |||
"devDependencies": { | |||
@@ -55,22 +55,22 @@ | |||
"@types/d3-shape": "1.2.2", | |||
"@types/d3-zoom": "1.7.1", | |||
"@types/enzyme": "3.1.10", | |||
"@types/jest": "22.2.3", | |||
"@types/jest": "23.3.1", | |||
"@types/keymaster": "1.6.28", | |||
"@types/lodash": "4.14.108", | |||
"@types/prop-types": "15.5.2", | |||
"@types/react": "16.0.29", | |||
"@types/react-dom": "16.0.3", | |||
"@types/prop-types": "15.5.4", | |||
"@types/react": "16.4.8", | |||
"@types/react-dom": "16.0.7", | |||
"@types/react-helmet": "5.0.6", | |||
"@types/react-intl": "2.3.8", | |||
"@types/react-modal": "3.1.2", | |||
"@types/react-redux": "5.0.12", | |||
"@types/react-redux": "6.0.6", | |||
"@types/react-router": "3.0.13", | |||
"@types/react-select": "1.2.6", | |||
"@types/react-virtualized": "9.18.3", | |||
"autoprefixer": "8.4.1", | |||
"babel-core": "6.26.3", | |||
"babel-jest": "23.0.1", | |||
"babel-jest": "23.4.2", | |||
"babel-loader": "7.1.4", | |||
"babel-plugin-dynamic-import-node": "1.2.0", | |||
"babel-plugin-lodash": "3.3.2", | |||
@@ -102,25 +102,25 @@ | |||
"glob": "7.1.2", | |||
"glob-promise": "3.4.0", | |||
"html-webpack-plugin": "3.2.0", | |||
"jest": "23.1.0", | |||
"jest": "23.4.2", | |||
"lint-staged": "4.3.0", | |||
"lodash-webpack-plugin": "0.11.5", | |||
"mini-css-extract-plugin": "0.4.0", | |||
"postcss-calc": "6.0.1", | |||
"postcss-custom-properties": "6.2.0", | |||
"postcss-loader": "2.1.5", | |||
"prettier": "1.11.1", | |||
"prettier": "1.14.0", | |||
"raw-loader": "0.5.1", | |||
"react-dev-utils": "5.0.1", | |||
"react-error-overlay": "1.0.7", | |||
"react-test-renderer": "16.2.0", | |||
"react-test-renderer": "16.4.2", | |||
"remark": "9.0.0", | |||
"remark-react": "4.0.3", | |||
"style-loader": "0.21.0", | |||
"ts-jest": "22.4.6", | |||
"ts-jest": "23.1.3", | |||
"ts-loader": "4.3.0", | |||
"typescript": "2.8.3", | |||
"typescript-eslint-parser": "15.0.0", | |||
"typescript": "3.0.1", | |||
"typescript-eslint-parser": "18.0.0", | |||
"webpack": "4.15.1", | |||
"webpack-bundle-analyzer": "2.11.2", | |||
"webpack-dev-server": "3.1.4" | |||
@@ -179,8 +179,8 @@ | |||
], | |||
"testRegex": "(/__tests__/.*|\\-test)\\.(ts|tsx|js)$", | |||
"transform": { | |||
"^.+\\.js$": "<rootDir>/node_modules/babel-jest", | |||
".(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js" | |||
"\\.js$": "babel-jest", | |||
"\\.(ts|tsx)$": "ts-jest" | |||
} | |||
}, | |||
"prettier": { |
@@ -104,6 +104,7 @@ const mapDispatchToProps: DispatchToProps = { | |||
setAdminPages | |||
}; | |||
export default connect<StateProps, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)( | |||
AdminContainer | |||
); | |||
export default connect<StateProps, DispatchToProps, OwnProps>( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(AdminContainer); |
@@ -100,4 +100,7 @@ const mapDispatchToProps = ({ | |||
fetchMyOrganizations | |||
} as any) as DispatchProps; | |||
export default connect(mapStateToProps, mapDispatchToProps)(App); | |||
export default connect( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(App); |
@@ -244,9 +244,15 @@ export class ComponentContainer extends React.PureComponent<Props, State> { | |||
return !task.branch && !task.pullRequest; | |||
}; | |||
handleComponentChange = (changes: {}) => { | |||
handleComponentChange = (changes: Partial<Component>) => { | |||
if (this.mounted) { | |||
this.setState(state => ({ component: { ...state.component, ...changes } })); | |||
this.setState(state => { | |||
if (state.component) { | |||
const newComponent: Component = { ...state.component, ...changes }; | |||
return { component: newComponent }; | |||
} | |||
return null; | |||
}); | |||
} | |||
}; | |||
@@ -309,4 +315,7 @@ export class ComponentContainer extends React.PureComponent<Props, State> { | |||
const mapDispatchToProps = { fetchOrganizations }; | |||
export default connect<any, any, any>(null, mapDispatchToProps)(ComponentContainer); | |||
export default connect<any, any, any>( | |||
null, | |||
mapDispatchToProps | |||
)(ComponentContainer); |
@@ -30,7 +30,8 @@ export default function GlobalFooterBranding() { | |||
but is <strong>not</strong> an official version provided by{' '} | |||
<a href="http://www.sonarsource.com" title="SonarSource SA"> | |||
SonarSource SA | |||
</a>. | |||
</a> | |||
. | |||
</div> | |||
); | |||
} |
@@ -22,10 +22,13 @@ import GlobalMessages from '../../components/controls/GlobalMessages'; | |||
import { getGlobalMessages } from '../../store/rootReducer'; | |||
import { closeGlobalMessage } from '../../store/globalMessages/duck'; | |||
const mapStateToProps = state => ({ | |||
const mapStateToProps = (state: any) => ({ | |||
messages: getGlobalMessages(state) | |||
}); | |||
const mapDispatchToProps = { closeGlobalMessage }; | |||
export default connect(mapStateToProps, mapDispatchToProps)(GlobalMessages); | |||
export default connect( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(GlobalMessages); |
@@ -54,8 +54,8 @@ export default function MarkdownHelp() { | |||
</tr> | |||
<tr> | |||
<td className="text-top"> | |||
* first item<br /> | |||
* second item | |||
* first item | |||
<br />* second item | |||
</td> | |||
<td className="markdown"> | |||
<ul> | |||
@@ -66,7 +66,8 @@ export default function MarkdownHelp() { | |||
</tr> | |||
<tr> | |||
<td className="text-top"> | |||
1. first item<br /> | |||
1. first item | |||
<br /> | |||
1. second item | |||
</td> | |||
<td className="markdown text-top"> | |||
@@ -102,11 +103,15 @@ export default function MarkdownHelp() { | |||
</tr> | |||
<tr> | |||
<td className="text-top"> | |||
``<br /> | |||
// code on multiple lines<br /> | |||
`` | |||
{/* eslint-disable-next-line react/jsx-no-comment-textnodes */} | |||
<br /> | |||
// code on multiple lines | |||
<br /> | |||
{'public void foo() {'} | |||
<br /> | |||
{'// do some logic here'} | |||
| |||
{'// do some logic here'} | |||
<br /> | |||
{'}'} | |||
<br /> | |||
@@ -120,15 +125,20 @@ export default function MarkdownHelp() { | |||
</tr> | |||
<tr> | |||
<td className="text-top"> | |||
Standard text<br /> | |||
> Blockquoted text<br /> | |||
> that spans multiple lines<br /> | |||
Standard text | |||
<br /> | |||
> Blockquoted text | |||
<br /> | |||
> that spans multiple lines | |||
<br /> | |||
</td> | |||
<td className="markdown text-top"> | |||
<p>Standard text</p> | |||
<blockquote> | |||
Blockquoted text<br /> | |||
that spans multiple lines<br /> | |||
Blockquoted text | |||
<br /> | |||
that spans multiple lines | |||
<br /> | |||
</blockquote> | |||
</td> | |||
</tr> |
@@ -106,7 +106,7 @@ export class StartupModal extends React.PureComponent<Props, State> { | |||
this.props.skipOnboardingAction(); | |||
return { automatic: false, modal: undefined }; | |||
} | |||
return undefined; | |||
return null; | |||
}); | |||
}; | |||
@@ -115,7 +115,7 @@ export class StartupModal extends React.PureComponent<Props, State> { | |||
if (state.modal === ModalKey.license) { | |||
return { automatic: false, modal: undefined }; | |||
} | |||
return undefined; | |||
return null; | |||
}); | |||
}; | |||
@@ -223,6 +223,7 @@ const mapStateToProps = (state: any): StateProps => ({ | |||
const mapDispatchToProps: DispatchProps = { skipOnboardingAction }; | |||
export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)( | |||
StartupModal | |||
); | |||
export default connect<StateProps, DispatchProps, OwnProps>( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(StartupModal); |
@@ -20,7 +20,7 @@ | |||
import * as React from 'react'; | |||
import * as PropTypes from 'prop-types'; | |||
// eslint-disable-next-line import/no-extraneous-dependencies | |||
import suggestionsJson from 'Docs/EmbedDocsSuggestions.json'; | |||
import * as suggestionsJson from 'Docs/EmbedDocsSuggestions.json'; | |||
import { SuggestionsContext } from './SuggestionsContext'; | |||
import { isSonarCloud } from '../../../helpers/system'; | |||
@@ -25,10 +25,8 @@ import { isSonarCloud } from '../../../../helpers/system'; | |||
jest.mock( | |||
'Docs/EmbedDocsSuggestions.json', | |||
() => ({ | |||
default: { | |||
pageA: [{ link: '/foo', text: 'Foo' }, { link: '/bar', text: 'Bar', scope: 'sonarcloud' }], | |||
pageB: [{ link: '/qux', text: 'Qux' }] | |||
} | |||
pageA: [{ link: '/foo', text: 'Foo' }, { link: '/bar', text: 'Bar', scope: 'sonarcloud' }], | |||
pageB: [{ link: '/qux', text: 'Qux' }] | |||
}), | |||
{ virtual: true } | |||
); |
@@ -28,4 +28,7 @@ const mapStateToProps = (state: any) => ({ | |||
const mapDispatchToProps = { onFail: addGlobalErrorMessage }; | |||
export default connect<any, any, any>(mapStateToProps, mapDispatchToProps)(Extension); | |||
export default connect<any, any, any>( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(Extension); |
@@ -80,6 +80,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps) => ({ | |||
const mapDispatchToProps = { fetchOrganization }; | |||
export default connect<StateToProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)( | |||
OrganizationPageExtension | |||
); | |||
export default connect<StateToProps, DispatchProps, OwnProps>( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(OrganizationPageExtension); |
@@ -54,4 +54,7 @@ function ProjectAdminPageExtension(props /*: Props */) { | |||
const mapDispatchToProps = { onFail: addGlobalErrorMessage }; | |||
export default connect(null, mapDispatchToProps)(ProjectAdminPageExtension); | |||
export default connect( | |||
null, | |||
mapDispatchToProps | |||
)(ProjectAdminPageExtension); |
@@ -109,7 +109,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li> | |||
<Link to={{ pathname: '/code', query: this.getQuery() }} activeClassName="active"> | |||
<Link activeClassName="active" to={{ pathname: '/code', query: this.getQuery() }}> | |||
{this.isPortfolio() || this.isApplication() | |||
? translate('view_projects.page') | |||
: translate('code.page')} | |||
@@ -128,8 +128,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li> | |||
<Link | |||
to={{ pathname: '/project/activity', query: this.getQuery() }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/activity', query: this.getQuery() }}> | |||
{translate('project_activity.page')} | |||
</Link> | |||
</li> | |||
@@ -161,8 +161,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li> | |||
<Link | |||
to={{ pathname: '/component_measures', query: this.getQuery() }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/component_measures', query: this.getQuery() }}> | |||
{translate('layout.measures')} | |||
</Link> | |||
</li> | |||
@@ -206,7 +206,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
<Dropdown overlay={this.renderSecurityReportsLink()} tagName="li"> | |||
{({ onToggleClick, open }) => ( | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className={classNames('dropdown-toggle', { active: isActive || open })} | |||
href="#" | |||
@@ -240,7 +240,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
tagName="li"> | |||
{({ onToggleClick, open }) => ( | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className={classNames('dropdown-toggle', { active: isSettingsActive || open })} | |||
href="#" | |||
@@ -278,8 +278,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="settings"> | |||
<Link | |||
to={{ pathname: '/project/settings', query: this.getQuery() }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/settings', query: this.getQuery() }}> | |||
{translate('project_settings.page')} | |||
</Link> | |||
</li> | |||
@@ -298,8 +298,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="branches"> | |||
<Link | |||
to={{ pathname: '/project/branches', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/branches', query: { id: this.props.component.key } }}> | |||
{translate('project_branches.page')} | |||
</Link> | |||
</li> | |||
@@ -313,8 +313,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="profiles"> | |||
<Link | |||
to={{ pathname: '/project/quality_profiles', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/quality_profiles', query: { id: this.props.component.key } }}> | |||
{translate('project_quality_profiles.page')} | |||
</Link> | |||
</li> | |||
@@ -328,8 +328,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="quality_gate"> | |||
<Link | |||
to={{ pathname: '/project/quality_gate', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/quality_gate', query: { id: this.props.component.key } }}> | |||
{translate('project_quality_gate.page')} | |||
</Link> | |||
</li> | |||
@@ -343,8 +343,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="custom_measures"> | |||
<Link | |||
to={{ pathname: '/custom_measures', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/custom_measures', query: { id: this.props.component.key } }}> | |||
{translate('custom_measures.page')} | |||
</Link> | |||
</li> | |||
@@ -358,8 +358,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="links"> | |||
<Link | |||
to={{ pathname: '/project/links', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/links', query: { id: this.props.component.key } }}> | |||
{translate('project_links.page')} | |||
</Link> | |||
</li> | |||
@@ -373,8 +373,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="permissions"> | |||
<Link | |||
to={{ pathname: '/project_roles', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project_roles', query: { id: this.props.component.key } }}> | |||
{translate('permissions.page')} | |||
</Link> | |||
</li> | |||
@@ -388,8 +388,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="background_tasks"> | |||
<Link | |||
to={{ pathname: '/project/background_tasks', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/background_tasks', query: { id: this.props.component.key } }}> | |||
{translate('background_tasks.page')} | |||
</Link> | |||
</li> | |||
@@ -403,8 +403,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="update_key"> | |||
<Link | |||
to={{ pathname: '/project/key', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/key', query: { id: this.props.component.key } }}> | |||
{translate('update_key.page')} | |||
</Link> | |||
</li> | |||
@@ -418,8 +418,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="webhooks"> | |||
<Link | |||
to={{ pathname: '/project/webhooks', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/webhooks', query: { id: this.props.component.key } }}> | |||
{translate('webhooks.page')} | |||
</Link> | |||
</li> | |||
@@ -440,8 +440,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
return ( | |||
<li key="project_delete"> | |||
<Link | |||
to={{ pathname: '/project/deletion', query: { id: this.props.component.key } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/project/deletion', query: { id: this.props.component.key } }}> | |||
{translate('deletion.page')} | |||
</Link> | |||
</li> | |||
@@ -481,7 +481,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> { | |||
tagName="li"> | |||
{({ onToggleClick, open }) => ( | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className={classNames('dropdown-toggle', { active: open })} | |||
href="#" |
@@ -163,7 +163,7 @@ export default class GlobalNavMenu extends React.PureComponent<Props> { | |||
tagName="li"> | |||
{({ onToggleClick, open }) => ( | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className={classNames('dropdown-toggle', { active: open })} | |||
href="#" |
@@ -84,7 +84,7 @@ export default class GlobalNavPlus extends React.PureComponent<Props, State> { | |||
{({ onToggleClick, open }) => ( | |||
<> | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className="navbar-plus" | |||
href="#" |
@@ -120,7 +120,7 @@ export default class SettingsNav extends React.PureComponent<Props> { | |||
tagName="li"> | |||
{({ onToggleClick, open }) => ( | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className={classNames('dropdown-toggle', { | |||
active: | |||
@@ -165,7 +165,7 @@ export default class SettingsNav extends React.PureComponent<Props> { | |||
tagName="li"> | |||
{({ onToggleClick, open }) => ( | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className={classNames('dropdown-toggle', { active: open || this.isProjectsActive() })} | |||
href="#" | |||
@@ -215,7 +215,7 @@ export default class SettingsNav extends React.PureComponent<Props> { | |||
tagName="li"> | |||
{({ onToggleClick, open }) => ( | |||
<a | |||
aria-expanded={String(open)} | |||
aria-expanded={open} | |||
aria-haspopup="true" | |||
className={classNames('dropdown-toggle', { active: open || this.isSecurityActive() })} | |||
href="#" |
@@ -54,7 +54,7 @@ export default class SearchShowMore extends React.PureComponent { | |||
const { loadingMore, qualifier, selected } = this.props; | |||
return ( | |||
<li key={`more-${qualifier}`} className={classNames('menu-footer', { active: selected })}> | |||
<li className={classNames('menu-footer', { active: selected })} key={`more-${qualifier}`}> | |||
<DeferredSpinner className="navbar-search-icon" loading={loadingMore === qualifier}> | |||
<a | |||
className={classNames({ 'cursor-not-allowed': !this.props.allowMore })} |
@@ -64,8 +64,8 @@ | |||
} | |||
.boxed-group-list { | |||
margin-top: - var(--gridSize); | |||
margin-bottom: - var(--gridSize); | |||
margin-top: -var(--gridSize); | |||
margin-bottom: -var(--gridSize); | |||
} | |||
.boxed-group-list > li { |
@@ -219,4 +219,7 @@ const mapStateToProps = state => ({ | |||
const mapDispatchToProps = { fetchAboutPageSettings }; | |||
export default connect(mapStateToProps, mapDispatchToProps)(AboutApp); | |||
export default connect( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(AboutApp); |
@@ -37,7 +37,7 @@ export default function AboutProjects({ count, loading } /*: Props */) { | |||
{!loading && ( | |||
<div> | |||
<div> | |||
<Link to="/projects" className="about-page-projects-link"> | |||
<Link className="about-page-projects-link" to="/projects"> | |||
{formatMeasure(count, 'INT')} | |||
</Link> | |||
</div> |
@@ -55,11 +55,11 @@ export default function AboutScanners() { | |||
<p className="about-page-text">{translate('about_page.scanners.text')}</p> | |||
<div className="about-page-analyzers"> | |||
{scanners.map(scanner => ( | |||
<a key={scanner.key} className="about-page-analyzer-box" href={scanner.link}> | |||
<a className="about-page-analyzer-box" href={scanner.link} key={scanner.key}> | |||
<img | |||
src={`${window.baseUrl}/images/scanner-logos/${scanner.key}.svg`} | |||
height={60} | |||
alt={translate('about_page.scanners', scanner.key)} | |||
height={60} | |||
src={`${window.baseUrl}/images/scanner-logos/${scanner.key}.svg`} | |||
/> | |||
</a> | |||
))} |
@@ -48,8 +48,8 @@ export default function EntryIssueTypes( | |||
<tr> | |||
<td className="about-page-issue-type-number"> | |||
<Link | |||
to={getIssuesUrl({ resolved: 'false', types: 'BUG', s: 'CREATION_DATE' })} | |||
className="about-page-issue-type-link"> | |||
className="about-page-issue-type-link" | |||
to={getIssuesUrl({ resolved: 'false', types: 'BUG', s: 'CREATION_DATE' })}> | |||
{formatMeasure(bugs, 'SHORT_INT')} | |||
</Link> | |||
</td> | |||
@@ -63,12 +63,12 @@ export default function EntryIssueTypes( | |||
<tr> | |||
<td className="about-page-issue-type-number"> | |||
<Link | |||
className="about-page-issue-type-link" | |||
to={getIssuesUrl({ | |||
resolved: 'false', | |||
types: 'VULNERABILITY', | |||
s: 'CREATION_DATE' | |||
})} | |||
className="about-page-issue-type-link"> | |||
})}> | |||
{formatMeasure(vulnerabilities, 'SHORT_INT')} | |||
</Link> | |||
</td> | |||
@@ -82,8 +82,8 @@ export default function EntryIssueTypes( | |||
<tr> | |||
<td className="about-page-issue-type-number"> | |||
<Link | |||
to={getIssuesUrl({ resolved: 'false', types: 'CODE_SMELL', s: 'CREATION_DATE' })} | |||
className="about-page-issue-type-link"> | |||
className="about-page-issue-type-link" | |||
to={getIssuesUrl({ resolved: 'false', types: 'CODE_SMELL', s: 'CREATION_DATE' })}> | |||
{formatMeasure(codeSmells, 'SHORT_INT')} | |||
</Link> | |||
</td> |
@@ -36,8 +36,8 @@ export default function AsAService() { | |||
<img alt="" height="34" src={`${getBaseUrl()}/images/sonarcloud/as-a-service.svg`} /> | |||
<h1 className="sc-child-title">As a Service</h1> | |||
<p className="sc-child-lead"> | |||
We fully operate the SonarQube base service, <br />which is hosted in Frankfurt, | |||
Germany. | |||
We fully operate the SonarQube base service, <br /> | |||
which is hosted in Frankfurt, Germany. | |||
</p> | |||
<img | |||
alt="" |
@@ -35,11 +35,12 @@ export default function BranchAnalysis() { | |||
<div className="sc-child-header"> | |||
<img alt="" height="34" src={`${getBaseUrl()}/images/sonarcloud/branch-analysis.svg`} /> | |||
<h1 className="sc-child-title"> | |||
Branch analysis & <br />pull request decoration | |||
Branch analysis & <br /> | |||
pull request decoration | |||
</h1> | |||
<p className="sc-child-lead"> | |||
SonarCloud comes with a built-in feature to automatically analyze <br />project | |||
branches and pull requests as soon as they get created. | |||
SonarCloud comes with a built-in feature to automatically analyze <br /> | |||
project branches and pull requests as soon as they get created. | |||
</p> | |||
</div> | |||
@@ -137,14 +137,16 @@ export default function Footer() { | |||
rel="noopener noreferrer" | |||
target="_blank"> | |||
SonarSource SA | |||
</a>. All rights reserved. SonarCloud is a service operated by{' '} | |||
</a> | |||
. All rights reserved. SonarCloud is a service operated by{' '} | |||
<a | |||
className="sc-footer-link sc-footer-copy-link" | |||
href="https://www.sonarsource.com" | |||
rel="noopener noreferrer" | |||
target="_blank"> | |||
SonarSource | |||
</a>, the company that develops and promotes open source{' '} | |||
</a> | |||
, the company that develops and promotes open source{' '} | |||
<a | |||
className="sc-footer-link sc-footer-copy-link" | |||
href="http://sonarqube.org" | |||
@@ -159,7 +161,8 @@ export default function Footer() { | |||
rel="noopener noreferrer" | |||
target="_blank"> | |||
SonarLint | |||
</a>. | |||
</a> | |||
. | |||
</div> | |||
</div> | |||
</footer> |
@@ -33,8 +33,8 @@ export default function Home() { | |||
<div className="page page-limited sc-page"> | |||
<h1 className="sc-page-title">Continuous Code Quality Online</h1> | |||
<p className="sc-page-subtitle"> | |||
Analyze the quality of your source code to detect bugs, vulnerabilities <br />and code | |||
smells throughout the development process. | |||
Analyze the quality of your source code to detect bugs, vulnerabilities <br /> | |||
and code smells throughout the development process. | |||
</p> | |||
<ul className="sc-features-list"> | |||
@@ -91,8 +91,8 @@ export default function Home() { | |||
<div className="sc-narrow-container text-center"> | |||
<h2 className="sc-feature-title">Explore open source projects on SonarCloud</h2> | |||
<p className="sc-feature-description"> | |||
SonarCloud offers free analysis for open source projects. <br />It is public and open | |||
to anyone who wants to browse the service. | |||
SonarCloud offers free analysis for open source projects. <br /> | |||
It is public and open to anyone who wants to browse the service. | |||
</p> | |||
</div> | |||
@@ -33,7 +33,8 @@ export default function Pricing() { | |||
<h3 className="sc-pricing-title">Private Projects</h3> | |||
<span className="sc-pricing-small">14 days free trial</span> | |||
<strong> | |||
From <span className="sc-pricing-price">10€</span>/mo | |||
From <span className="sc-pricing-price">10€</span> | |||
/mo | |||
</strong> | |||
<Link className="sc-news-link" to="/documentation/sonarcloud-pricing"> | |||
see prices |
@@ -52,12 +52,14 @@ function Jumbotron() { | |||
<div className="sc-sq-jumbotron"> | |||
<div className="sc-sq-jumbotron-left"> | |||
<h1 className="sc-sq-jumbotron-title"> | |||
Use SonarQube<br /> | |||
Use SonarQube | |||
<br /> | |||
<span className="sc-sq-jumbotron-title-orange">as a Service</span> | |||
</h1> | |||
<div className="sc-sq-jumbotron-login"> | |||
{'—'} | |||
<br />Log in or sign up with | |||
<br /> | |||
Log in or sign up with | |||
</div> | |||
<div> | |||
<a |
@@ -44,8 +44,8 @@ export default function SonarLintIntegration() { | |||
<a className="sc-child-lead-link" href="https://www.sonarlint.org/"> | |||
SonarLint | |||
</a>{' '} | |||
to provide developers maximum insight <br />in their IDEs on code quality and make | |||
sure they do not introduce new issues. | |||
to provide developers maximum insight <br /> | |||
in their IDEs on code quality and make sure they do not introduce new issues. | |||
</p> | |||
<img | |||
alt="" |
@@ -50,7 +50,7 @@ class Account extends React.PureComponent { | |||
<header className="account-header"> | |||
<div className="account-container clearfix"> | |||
<UserCard user={currentUser} /> | |||
<Nav user={currentUser} customOrganizations={this.props.customOrganizations} /> | |||
<Nav customOrganizations={this.props.customOrganizations} user={currentUser} /> | |||
</div> | |||
</header> | |||
@@ -34,30 +34,30 @@ export default function Nav({ customOrganizations } /*: Props */) { | |||
<nav className="account-nav"> | |||
<NavBarTabs> | |||
<li> | |||
<IndexLink to="/account/" activeClassName="active"> | |||
<IndexLink activeClassName="active" to="/account/"> | |||
{translate('my_account.profile')} | |||
</IndexLink> | |||
</li> | |||
<li> | |||
<Link to="/account/security/" activeClassName="active"> | |||
<Link activeClassName="active" to="/account/security/"> | |||
{translate('my_account.security')} | |||
</Link> | |||
</li> | |||
<li> | |||
<Link to="/account/notifications" activeClassName="active"> | |||
<Link activeClassName="active" to="/account/notifications"> | |||
{translate('my_account.notifications')} | |||
</Link> | |||
</li> | |||
{!customOrganizations && ( | |||
<li> | |||
<Link to="/account/projects/" activeClassName="active"> | |||
<Link activeClassName="active" to="/account/projects/"> | |||
{translate('my_account.projects')} | |||
</Link> | |||
</li> | |||
)} | |||
{customOrganizations && ( | |||
<li> | |||
<Link to="/account/organizations" activeClassName="active"> | |||
<Link activeClassName="active" to="/account/organizations"> | |||
{translate('my_account.organizations')} | |||
</Link> | |||
</li> |
@@ -31,10 +31,10 @@ export default class UserCard extends React.PureComponent { | |||
return ( | |||
<div className="account-user"> | |||
<div id="avatar" className="pull-left account-user-avatar"> | |||
<div className="pull-left account-user-avatar" id="avatar"> | |||
<Avatar hash={user.avatar} name={user.name} size={60} /> | |||
</div> | |||
<h1 id="name" className="pull-left"> | |||
<h1 className="pull-left" id="name"> | |||
{user.name} | |||
</h1> | |||
</div> |
@@ -23,4 +23,7 @@ import { fetchOrganizations } from '../../../store/rootActions'; | |||
const mapDispatchToProps = { fetchOrganizations } as Pick<Props, 'fetchOrganizations'>; | |||
export default connect(null, mapDispatchToProps)(Notifications); | |||
export default connect( | |||
null, | |||
mapDispatchToProps | |||
)(Notifications); |
@@ -246,4 +246,7 @@ class CreateOrganizationForm extends React.PureComponent<Props, State> { | |||
const mapDispatchToProps: DispatchProps = { createOrganization: createOrganization as any }; | |||
export default connect(null, mapDispatchToProps)(CreateOrganizationForm); | |||
export default connect( | |||
null, | |||
mapDispatchToProps | |||
)(CreateOrganizationForm); |
@@ -50,7 +50,7 @@ export default function OrganizationCard({ organization }: Props) { | |||
{!!organization.url && ( | |||
<div className="markdown spacer-top"> | |||
<a href={organization.url} title={organization.url} rel="nofollow"> | |||
<a href={organization.url} rel="nofollow" title={organization.url}> | |||
{organization.url} | |||
</a> | |||
</div> |
@@ -120,4 +120,7 @@ const mapDispatchToProps = { | |||
fetchIfAnyoneCanCreateOrganizations: fetchIfAnyoneCanCreateOrganizations as any | |||
} as DispatchProps; | |||
export default connect(mapStateToProps, mapDispatchToProps)(UserOrganizations); | |||
export default connect( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(UserOrganizations); |
@@ -52,7 +52,7 @@ function Profile(props /*: Props */) { | |||
{!user.local && | |||
user.externalProvider !== 'sonarqube' && ( | |||
<div id="identity-provider" className="spacer-bottom"> | |||
<div className="spacer-bottom" id="identity-provider"> | |||
<UserExternalIdentity user={user} /> | |||
</div> | |||
)} | |||
@@ -68,7 +68,7 @@ function Profile(props /*: Props */) { | |||
<hr /> | |||
<UserScmAccounts user={user} scmAccounts={user.scmAccounts} /> | |||
<UserScmAccounts scmAccounts={user.scmAccounts} user={user} /> | |||
</div> | |||
</div> | |||
); |
@@ -87,11 +87,11 @@ export default class UserExternalIdentity extends React.PureComponent { | |||
color: getTextColor(identityProvider.backgroundColor, theme.secondFontColor) | |||
}}> | |||
<img | |||
alt={identityProvider.name} | |||
className="little-spacer-right" | |||
height="14" | |||
src={window.baseUrl + identityProvider.iconPath} | |||
width="14" | |||
height="14" | |||
alt={identityProvider.name} | |||
/>{' '} | |||
{user.externalIdentity} | |||
</div> |
@@ -34,7 +34,7 @@ export default class UserGroups extends React.PureComponent { | |||
<h2 className="spacer-bottom">{translate('my_profile.groups')}</h2> | |||
<ul id="groups"> | |||
{groups.map(group => ( | |||
<li key={group} className="little-spacer-bottom" title={group}> | |||
<li className="little-spacer-bottom" key={group} title={group}> | |||
{group} | |||
</li> | |||
))} |
@@ -45,7 +45,7 @@ export default class UserScmAccounts extends React.PureComponent { | |||
)} | |||
{scmAccounts.map(scmAccount => ( | |||
<li key={scmAccount} className="little-spacer-bottom" title={scmAccount}> | |||
<li className="little-spacer-bottom" key={scmAccount} title={scmAccount}> | |||
{scmAccount} | |||
</li> | |||
))} |
@@ -81,21 +81,21 @@ describe('Stats', () => { | |||
describe('Pending', () => { | |||
it('should show zero pending', () => { | |||
const result = shallow( | |||
<Stats pendingCount={0} onCancelAllPending={stub} onShowFailing={stub} /> | |||
<Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={0} /> | |||
); | |||
expect(result.find('.js-pending-count').text()).toContain('0'); | |||
}); | |||
it('should show 5 pending', () => { | |||
const result = shallow( | |||
<Stats pendingCount={5} onCancelAllPending={stub} onShowFailing={stub} /> | |||
<Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={5} /> | |||
); | |||
expect(result.find('.js-pending-count').text()).toContain('5'); | |||
}); | |||
it('should not show cancel pending button', () => { | |||
const result = shallow( | |||
<Stats pendingCount={0} onCancelAllPending={stub} onShowFailing={stub} /> | |||
<Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={0} /> | |||
); | |||
expect(result.find('.js-cancel-pending').length).toBe(0); | |||
}); | |||
@@ -104,9 +104,9 @@ describe('Stats', () => { | |||
const result = shallow( | |||
<Stats | |||
isSystemAdmin={true} | |||
pendingCount={5} | |||
onCancelAllPending={stub} | |||
onShowFailing={stub} | |||
pendingCount={5} | |||
/> | |||
); | |||
expect(result.find('.js-cancel-pending').length).toBe(1); | |||
@@ -117,9 +117,9 @@ describe('Stats', () => { | |||
const result = shallow( | |||
<Stats | |||
isSystemAdmin={true} | |||
pendingCount={5} | |||
onCancelAllPending={spy} | |||
onShowFailing={stub} | |||
pendingCount={5} | |||
/> | |||
); | |||
expect(spy).not.toBeCalled(); |
@@ -270,4 +270,7 @@ class BackgroundTasksApp extends React.PureComponent { | |||
const mapDispatchToProps = { fetchOrganizations }; | |||
export default connect(null, mapDispatchToProps)(BackgroundTasksApp); | |||
export default connect( | |||
null, | |||
mapDispatchToProps | |||
)(BackgroundTasksApp); |
@@ -84,7 +84,7 @@ export default class ScannerContext extends React.PureComponent<Props, State> { | |||
</div> | |||
<div className="modal-foot"> | |||
<a href="#" className="js-modal-close" onClick={this.handleCloseClick}> | |||
<a className="js-modal-close" href="#" onClick={this.handleCloseClick}> | |||
{translate('close')} | |||
</a> | |||
</div> |
@@ -100,7 +100,7 @@ export default class Stacktrace extends React.PureComponent<Props, State> { | |||
</div> | |||
<div className="modal-foot"> | |||
<a href="#" className="js-modal-close" onClick={this.handleCloseClick}> | |||
<a className="js-modal-close" href="#" onClick={this.handleCloseClick}> | |||
{translate('close')} | |||
</a> | |||
</div> |
@@ -25,9 +25,9 @@ it('renders', () => { | |||
expect(shallow(<TaskDate />)).toMatchSnapshot(); | |||
expect(shallow(<TaskDate date="2017-01-01T00:00:00.000Z" />)).toMatchSnapshot(); | |||
expect( | |||
shallow(<TaskDate date="2017-01-01T00:00:00.000Z" baseDate="2017-01-01T00:00:00.000Z" />) | |||
shallow(<TaskDate baseDate="2017-01-01T00:00:00.000Z" date="2017-01-01T00:00:00.000Z" />) | |||
).toMatchSnapshot(); | |||
expect( | |||
shallow(<TaskDate date="2017-01-05T00:00:00.000Z" baseDate="2017-01-01T00:00:00.000Z" />) | |||
shallow(<TaskDate baseDate="2017-01-01T00:00:00.000Z" date="2017-01-05T00:00:00.000Z" />) | |||
).toMatchSnapshot(); | |||
}); |
@@ -24,13 +24,13 @@ import TaskDay from '../TaskDay'; | |||
it('renders', () => { | |||
expect( | |||
shallow( | |||
<TaskDay submittedAt="2017-01-02T00:00:00.000Z" prevSubmittedAt="2017-01-01T00:00:00.000Z" /> | |||
<TaskDay prevSubmittedAt="2017-01-01T00:00:00.000Z" submittedAt="2017-01-02T00:00:00.000Z" /> | |||
) | |||
).toMatchSnapshot(); | |||
expect( | |||
shallow( | |||
<TaskDay submittedAt="2017-01-01T00:00:00.000Z" prevSubmittedAt="2017-01-01T00:00:00.000Z" /> | |||
<TaskDay prevSubmittedAt="2017-01-01T00:00:00.000Z" submittedAt="2017-01-01T00:00:00.000Z" /> | |||
) | |||
).toMatchSnapshot(); | |||
}); |
@@ -239,7 +239,7 @@ export default class App extends React.PureComponent<Props, State> { | |||
{sourceViewer === undefined && | |||
components !== undefined && ( | |||
<ListFooter count={components.length} total={total} loadMore={this.handleLoadMore} /> | |||
<ListFooter count={components.length} loadMore={this.handleLoadMore} total={total} /> | |||
)} | |||
{sourceViewer !== undefined && ( |
@@ -176,7 +176,7 @@ export default class Search extends React.PureComponent<Props, State> { | |||
const isPortfolio = ['VW', 'SVW', 'APP'].includes(component.qualifier); | |||
return ( | |||
<div id="code-search" className={containerClassName}> | |||
<div className={containerClassName} id="code-search"> | |||
<SearchBox | |||
minLength={3} | |||
onChange={this.handleQueryChange} |
@@ -467,12 +467,14 @@ export class App extends React.PureComponent<Props, State> { | |||
}); | |||
handleRuleDeactivate = (profile: string, rule: string) => | |||
this.setState((state: State) => { | |||
this.setState(state => { | |||
const { actives } = state; | |||
if (actives && actives[rule]) { | |||
return { actives: { ...actives, [rule]: { ...actives[rule], [profile]: undefined } } }; | |||
const newRule = { ...actives[rule] }; | |||
delete newRule[profile]; | |||
return { actives: { ...actives, [rule]: newRule } }; | |||
} | |||
return {}; | |||
return null; | |||
}); | |||
handleSearch = (searchQuery: string) => this.handleFilterChange({ searchQuery }); |
@@ -131,13 +131,10 @@ export default class CustomRuleFormModal extends React.PureComponent<Props, Stat | |||
handleNameChange = (event: React.SyntheticEvent<HTMLInputElement>) => { | |||
const { value: name } = event.currentTarget; | |||
this.setState((state: State) => { | |||
const change: Partial<State> = { name }; | |||
if (!state.keyModifiedByUser) { | |||
change.key = latinize(name).replace(/[^A-Za-z0-9]/g, '_'); | |||
} | |||
return change; | |||
}); | |||
this.setState(state => ({ | |||
name, | |||
key: state.keyModifiedByUser ? state.key : latinize(name).replace(/[^A-Za-z0-9]/g, '_') | |||
})); | |||
}; | |||
handleKeyChange = (event: React.SyntheticEvent<HTMLInputElement>) => |
@@ -104,14 +104,19 @@ export default class RuleDetails extends React.PureComponent<Props, State> { | |||
handleTagsChange = (tags: string[]) => { | |||
// optimistic update | |||
const oldTags = this.state.ruleDetails && this.state.ruleDetails.tags; | |||
this.setState(state => ({ ruleDetails: { ...state.ruleDetails, tags } })); | |||
this.setState( | |||
state => (state.ruleDetails ? { ruleDetails: { ...state.ruleDetails, tags } } : null) | |||
); | |||
updateRule({ | |||
key: this.props.ruleKey, | |||
organization: this.props.organization, | |||
tags: tags.join() | |||
}).catch(() => { | |||
if (this.mounted) { | |||
this.setState(state => ({ ruleDetails: { ...state.ruleDetails, tags: oldTags } })); | |||
this.setState( | |||
state => | |||
state.ruleDetails ? { ruleDetails: { ...state.ruleDetails, tags: oldTags } } : null | |||
); | |||
} | |||
}); | |||
}; |
@@ -74,4 +74,7 @@ const fetchMeasures = ( | |||
const mapDispatchToProps = { fetchMeasures, fetchMetrics }; | |||
export default connect(mapStateToProps, mapDispatchToProps)(withRouter(App)); | |||
export default connect( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(withRouter(App)); |
@@ -104,11 +104,11 @@ export default class Breadcrumbs extends React.PureComponent { | |||
<div className={this.props.className}> | |||
{breadcrumbs.map(component => ( | |||
<Breadcrumb | |||
key={component.key} | |||
canBrowse={component.key !== lastItem.key} | |||
component={component} | |||
isLast={component.key === lastItem.key} | |||
handleSelect={this.props.handleSelect} | |||
isLast={component.key === lastItem.key} | |||
key={component.key} | |||
/> | |||
))} | |||
</div> |
@@ -306,15 +306,15 @@ export default class MeasureContent extends React.PureComponent { | |||
isLoggedIn && ( | |||
<MeasureFavoriteContainer | |||
branchLike={branchLike} | |||
component={component.key} | |||
className="measure-favorite spacer-right" | |||
component={component.key} | |||
/> | |||
)} | |||
{!isFile && ( | |||
<MeasureViewSelect | |||
className="measure-view-select" | |||
metric={metric} | |||
handleViewChange={this.props.updateView} | |||
metric={metric} | |||
view={view} | |||
/> | |||
)} |
@@ -134,8 +134,8 @@ export default class MeasureContentContainer extends React.PureComponent { | |||
className={this.props.className} | |||
component={this.state.component} | |||
currentUser={this.props.currentUser} | |||
loading={this.state.loading.measure || this.state.loading.components} | |||
leakPeriod={this.props.leakPeriod} | |||
loading={this.state.loading.measure || this.state.loading.components} | |||
measure={this.state.measure} | |||
metric={this.props.metric} | |||
metrics={this.props.metrics} |
@@ -97,4 +97,7 @@ const mapDispatchToProps = { | |||
} | |||
}; | |||
export default connect(mapStateToProps, mapDispatchToProps)(MeasureFavoriteContainer); | |||
export default connect( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(MeasureFavoriteContainer); |
@@ -89,11 +89,11 @@ export default class MeasureViewSelect extends React.PureComponent { | |||
autoBlur={true} | |||
className={this.props.className} | |||
clearable={false} | |||
onChange={this.handleChange} | |||
options={this.getOptions()} | |||
searchable={false} | |||
value={this.props.view} | |||
valueRenderer={this.renderValue} | |||
options={this.getOptions()} | |||
onChange={this.handleChange} | |||
/> | |||
); | |||
} |
@@ -31,8 +31,8 @@ it('should show the last element without clickable link', () => { | |||
name: 'Foo', | |||
qualifier: 'TRK' | |||
}} | |||
isLast={true} | |||
handleSelect={() => {}} | |||
isLast={true} | |||
/> | |||
) | |||
).toMatchSnapshot(); | |||
@@ -48,8 +48,8 @@ it('should correctly show a middle element', () => { | |||
name: 'Foo', | |||
qualifier: 'TRK' | |||
}} | |||
isLast={false} | |||
handleSelect={() => {}} | |||
isLast={false} | |||
/> | |||
) | |||
).toMatchSnapshot(); |
@@ -24,7 +24,7 @@ import MeasureViewSelect from '../MeasureViewSelect'; | |||
it('should display correctly with treemap option', () => { | |||
expect( | |||
shallow( | |||
<MeasureViewSelect metric={{ type: 'PERCENT' }} handleViewChange={() => {}} view="tree" /> | |||
<MeasureViewSelect handleViewChange={() => {}} metric={{ type: 'PERCENT' }} view="tree" /> | |||
) | |||
).toMatchSnapshot(); | |||
}); |
@@ -40,7 +40,7 @@ export default function MeasureCell({ component, measure, metric } /*: Props */) | |||
return ( | |||
<td className="thin nowrap text-right"> | |||
<span id={`component-measures-component-measure-${component.key}-${metric.key}`}> | |||
<Measure value={value} metricKey={metric.key} metricType={metric.type} /> | |||
<Measure metricKey={metric.key} metricType={metric.type} value={value} /> | |||
</span> | |||
</td> | |||
); |
@@ -162,8 +162,8 @@ export default class TreeMapView extends React.PureComponent { | |||
return ( | |||
<ColorGradientLegend | |||
className="measure-details-treemap-legend" | |||
colorScale={colorScale} | |||
colorNA={theme.secondFontColor} | |||
colorScale={colorScale} | |||
direction={metric.direction} | |||
height={20} | |||
width={200} |
@@ -27,23 +27,23 @@ export default function FacetMeasureValue({ measure } /*: { measure: MeasureEnha | |||
if (isDiffMetric(measure.metric.key)) { | |||
return ( | |||
<div | |||
id={`measure-${measure.metric.key}-leak`} | |||
className="domain-measures-value domain-measures-leak"> | |||
className="domain-measures-value domain-measures-leak" | |||
id={`measure-${measure.metric.key}-leak`}> | |||
<Measure | |||
value={measure.leak} | |||
metricKey={measure.metric.key} | |||
metricType={measure.metric.type} | |||
value={measure.leak} | |||
/> | |||
</div> | |||
); | |||
} | |||
return ( | |||
<div id={`measure-${measure.metric.key}-value`} className="domain-measures-value"> | |||
<div className="domain-measures-value" id={`measure-${measure.metric.key}-value`}> | |||
<Measure | |||
value={measure.value} | |||
metricKey={measure.metric.key} | |||
metricType={measure.metric.type} | |||
value={measure.value} | |||
/> | |||
</div> | |||
); |
@@ -31,21 +31,21 @@ interface Props { | |||
export default function Explore(props: Props) { | |||
return ( | |||
<div id="explore"> | |||
<ContextNavBar id="explore-navigation" height={theme.contextNavHeightRaw}> | |||
<ContextNavBar height={theme.contextNavHeightRaw} id="explore-navigation"> | |||
<header className="navbar-context-header"> | |||
<h1>{translate('explore')}</h1> | |||
</header> | |||
<NavBarTabs> | |||
<li> | |||
<Link to="/explore/projects" activeClassName="active"> | |||
<Link activeClassName="active" to="/explore/projects"> | |||
{translate('projects.page')} | |||
</Link> | |||
</li> | |||
<li> | |||
<Link | |||
to={{ pathname: '/explore/issues', query: { resolved: 'false' } }} | |||
activeClassName="active"> | |||
activeClassName="active" | |||
to={{ pathname: '/explore/issues', query: { resolved: 'false' } }}> | |||
{translate('issues.page')} | |||
</Link> | |||
</li> |
@@ -35,7 +35,7 @@ interface Props { | |||
export default function List(props: Props) { | |||
return ( | |||
<div className="boxed-group boxed-group-inner"> | |||
<table id="groups-list" className="data zebra zebra-hover"> | |||
<table className="data zebra zebra-hover" id="groups-list"> | |||
<thead> | |||
<tr> | |||
<th /> |
@@ -45,7 +45,7 @@ exports[`should edit members 1`] = ` | |||
"clipRule": "evenodd", | |||
"fillRule": "evenodd", | |||
"strokeLinejoin": "round", | |||
"strokeMiterlimit": "1.41421", | |||
"strokeMiterlimit": 1.41421, | |||
} | |||
} | |||
version="1.1" | |||
@@ -116,7 +116,7 @@ exports[`should edit members 2`] = ` | |||
"clipRule": "evenodd", | |||
"fillRule": "evenodd", | |||
"strokeLinejoin": "round", | |||
"strokeMiterlimit": "1.41421", | |||
"strokeMiterlimit": 1.41421, | |||
} | |||
} | |||
version="1.1" | |||
@@ -393,7 +393,7 @@ exports[`should edit members 2`] = ` | |||
"clipRule": "evenodd", | |||
"fillRule": "evenodd", | |||
"strokeLinejoin": "round", | |||
"strokeMiterlimit": "1.41421", | |||
"strokeMiterlimit": 1.41421, | |||
} | |||
} | |||
version="1.1" | |||
@@ -525,7 +525,7 @@ exports[`should edit members 3`] = ` | |||
"clipRule": "evenodd", | |||
"fillRule": "evenodd", | |||
"strokeLinejoin": "round", | |||
"strokeMiterlimit": "1.41421", | |||
"strokeMiterlimit": 1.41421, | |||
} | |||
} | |||
version="1.1" |
@@ -20,7 +20,7 @@ | |||
import { State } from './components/App'; | |||
import { allLocationsEmpty } from './utils'; | |||
export function enableLocationsNavigator(state: State): Partial<State> | undefined { | |||
export function enableLocationsNavigator(state: State) { | |||
const { openIssue, selectedLocationIndex } = state; | |||
if (openIssue && (openIssue.secondaryLocations.length > 0 || openIssue.flows.length > 0)) { | |||
const selectedFlowIndex = | |||
@@ -36,15 +36,15 @@ export function enableLocationsNavigator(state: State): Partial<State> | undefin | |||
}; | |||
} | |||
} | |||
return undefined; | |||
return null; | |||
} | |||
export function disableLocationsNavigator(): Partial<State> { | |||
export function disableLocationsNavigator() { | |||
return { locationsNavigator: false }; | |||
} | |||
export function selectLocation(nextIndex: number | undefined) { | |||
return (state: State): Partial<State> | undefined => { | |||
return (state: State) => { | |||
const { selectedLocationIndex: index, openIssue } = state; | |||
if (openIssue) { | |||
if (!state.locationsNavigator) { | |||
@@ -59,11 +59,11 @@ export function selectLocation(nextIndex: number | undefined) { | |||
}; | |||
} | |||
} | |||
return undefined; | |||
return null; | |||
}; | |||
} | |||
export function selectNextLocation(state: State): Partial<State> | undefined { | |||
export function selectNextLocation(state: State) { | |||
const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state; | |||
if (openIssue) { | |||
const locations = | |||
@@ -79,10 +79,10 @@ export function selectNextLocation(state: State): Partial<State> | undefined { | |||
selectedLocationIndex: index !== undefined && index < lastLocationIdx ? index + 1 : index | |||
}; | |||
} | |||
return undefined; | |||
return null; | |||
} | |||
export function selectPreviousLocation(state: State): Partial<State> | undefined { | |||
export function selectPreviousLocation(state: State) { | |||
const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state; | |||
if (openIssue) { | |||
if (index === -1) { | |||
@@ -95,16 +95,16 @@ export function selectPreviousLocation(state: State): Partial<State> | undefined | |||
} | |||
return { selectedLocationIndex: index !== undefined && index > 0 ? index - 1 : index }; | |||
} | |||
return undefined; | |||
return null; | |||
} | |||
export function selectFlow(nextIndex?: number) { | |||
return (): Partial<State> => { | |||
return () => { | |||
return { selectedFlowIndex: nextIndex, selectedLocationIndex: 0 }; | |||
}; | |||
} | |||
export function selectNextFlow(state: State): Partial<State> | undefined { | |||
export function selectNextFlow(state: State) { | |||
const { openIssue, selectedFlowIndex } = state; | |||
if ( | |||
openIssue && | |||
@@ -113,13 +113,13 @@ export function selectNextFlow(state: State): Partial<State> | undefined { | |||
) { | |||
return { selectedFlowIndex: selectedFlowIndex + 1, selectedLocationIndex: 0 }; | |||
} | |||
return undefined; | |||
return null; | |||
} | |||
export function selectPreviousFlow(state: State): Partial<State> | undefined { | |||
export function selectPreviousFlow(state: State) { | |||
const { openIssue, selectedFlowIndex } = state; | |||
if (openIssue && selectedFlowIndex !== undefined && selectedFlowIndex > 0) { | |||
return { selectedFlowIndex: selectedFlowIndex - 1, selectedLocationIndex: 0 }; | |||
} | |||
return undefined; | |||
return null; | |||
} |
@@ -93,6 +93,7 @@ interface OwnProps { | |||
myIssues?: boolean; | |||
} | |||
export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)( | |||
lazyLoad(() => import('./App')) | |||
); | |||
export default connect<StateProps, DispatchProps, OwnProps>( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(lazyLoad(() => import('./App'))); |
@@ -59,7 +59,9 @@ export default class ConciseIssueBox extends React.PureComponent<Props> { | |||
const locations = | |||
selectedFlowIndex !== undefined | |||
? flows[selectedFlowIndex] | |||
: flows.length > 0 ? flows[0] : secondaryLocations; | |||
: flows.length > 0 | |||
? flows[0] | |||
: secondaryLocations; | |||
if (!locations || locations.length < 15) { | |||
// if there are no locations, or there are just few |
@@ -71,7 +71,7 @@ export default function PluginAvailable({ plugin, readOnly, refreshPending, stat | |||
</td> | |||
{!readOnly && ( | |||
<PluginStatus plugin={plugin} status={status} refreshPending={refreshPending} /> | |||
<PluginStatus plugin={plugin} refreshPending={refreshPending} status={status} /> | |||
)} | |||
</tr> | |||
); |
@@ -59,7 +59,7 @@ export default function PluginInstalled({ plugin, readOnly, refreshPending, stat | |||
</td> | |||
{!readOnly && ( | |||
<PluginStatus plugin={plugin} status={status} refreshPending={refreshPending} /> | |||
<PluginStatus plugin={plugin} refreshPending={refreshPending} status={status} /> | |||
)} | |||
</tr> | |||
); |
@@ -52,7 +52,7 @@ export default class PluginUpdateItem extends React.PureComponent<Props, State> | |||
render() { | |||
const { release, update } = this.props; | |||
return ( | |||
<li key={release.version} className="display-flex-row little-spacer-bottom"> | |||
<li className="display-flex-row little-spacer-bottom" key={release.version}> | |||
<div className="pull-left spacer-right"> | |||
{update.status === 'COMPATIBLE' ? ( | |||
<span className="js-update-version badge badge-success">{release.version}</span> |
@@ -113,14 +113,17 @@ export function isPluginPending(plugin: Plugin): plugin is PluginPending { | |||
} | |||
export const DEFAULT_FILTER = 'all'; | |||
export const parseQuery = memoize((urlQuery: RawQuery): Query => ({ | |||
filter: parseAsString(urlQuery['filter']) || DEFAULT_FILTER, | |||
search: parseAsString(urlQuery['search']) | |||
})); | |||
export const serializeQuery = memoize((query: Query): RawQuery => | |||
cleanQuery({ | |||
filter: query.filter === DEFAULT_FILTER ? undefined : serializeString(query.filter), | |||
search: query.search ? serializeString(query.search) : undefined | |||
export const parseQuery = memoize( | |||
(urlQuery: RawQuery): Query => ({ | |||
filter: parseAsString(urlQuery['filter']) || DEFAULT_FILTER, | |||
search: parseAsString(urlQuery['search']) | |||
}) | |||
); | |||
export const serializeQuery = memoize( | |||
(query: Query): RawQuery => | |||
cleanQuery({ | |||
filter: query.filter === DEFAULT_FILTER ? undefined : serializeString(query.filter), | |||
search: query.search ? serializeString(query.search) : undefined | |||
}) | |||
); |
@@ -128,6 +128,7 @@ export class OrganizationDelete extends React.PureComponent<Props, State> { | |||
const mapDispatchToProps: DispatchToProps = { deleteOrganization: deleteOrganization as any }; | |||
export default connect<null, DispatchToProps, OwnProps>(null, mapDispatchToProps)( | |||
OrganizationDelete | |||
); | |||
export default connect<null, DispatchToProps, OwnProps>( | |||
null, | |||
mapDispatchToProps | |||
)(OrganizationDelete); |
@@ -197,4 +197,7 @@ export class OrganizationEdit extends React.PureComponent<Props, State> { | |||
const mapDispatchToProps = { updateOrganization: updateOrganization as any }; | |||
export default connect<{}, DispatchProps, OwnProps>(null, mapDispatchToProps)(OrganizationEdit); | |||
export default connect<{}, DispatchProps, OwnProps>( | |||
null, | |||
mapDispatchToProps | |||
)(OrganizationEdit); |
@@ -43,7 +43,7 @@ interface OwnProps { | |||
interface StateProps { | |||
memberLogins: string[]; | |||
members: OrganizationMember[]; | |||
organization?: Organization; | |||
organization: Organization; | |||
organizationGroups: Group[]; | |||
status: { loading?: boolean; total?: number; pageIndex?: number; query?: string }; | |||
} | |||
@@ -68,7 +68,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps): StateProps => { | |||
return { | |||
memberLogins, | |||
members: getUsersByLogins(state, memberLogins), | |||
organization: getOrganizationByKey(state, organizationKey), | |||
organization: getOrganizationByKey(state, organizationKey)!, | |||
organizationGroups: getOrganizationGroupsByKey(state, organizationKey), | |||
status: getOrganizationMembersState(state, organizationKey) | |||
}; | |||
@@ -83,6 +83,7 @@ const mapDispatchToProps = { | |||
updateOrganizationMemberGroups | |||
}; | |||
export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)( | |||
OrganizationMembers | |||
); | |||
export default connect<StateProps, DispatchProps, OwnProps>( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(OrganizationMembers); |
@@ -118,6 +118,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps) => ({ | |||
const mapDispatchToProps = { fetchOrganization: fetchOrganization as any }; | |||
export default connect<StateProps, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)( | |||
OrganizationPage | |||
); | |||
export default connect<StateProps, DispatchToProps, OwnProps>( | |||
mapStateToProps, | |||
mapDispatchToProps | |||
)(OrganizationPage); |
@@ -51,7 +51,9 @@ export default function Analysis({ analysis, ...props }: Props) { | |||
{sortedEvents.length > 0 ? ( | |||
<div className="overview-activity-events"> | |||
{sortedEvents.map(event => <Event event={event} key={event.key} />)} | |||
{sortedEvents.map(event => ( | |||
<Event event={event} key={event.key} /> | |||
))} | |||
</div> | |||
) : ( | |||
<span className="note">{translate('project_activity.analyzed', qualifier)}</span> |
@@ -31,7 +31,7 @@ export default function MetaKey({ componentKey, qualifier }: Props) { | |||
<> | |||
<h4 className="overview-meta-header">{translate('overview.project_key', qualifier)}</h4> | |||
<div className="display-flex-center"> | |||
<input className="overview-key" type="text" value={componentKey} readOnly={true} /> | |||
<input className="overview-key" readOnly={true} type="text" value={componentKey} /> | |||
<ClipboardButton className="little-spacer-left" copyValue={componentKey} /> | |||
</div> | |||
</> |
@@ -74,7 +74,9 @@ export default class MetaLinks extends React.PureComponent<Props, State> { | |||
<div className="overview-meta-card"> | |||
<h4 className="overview-meta-header">{translate('overview.external_links')}</h4> | |||
<ul className="overview-meta-list"> | |||
{orderedLinks.map(link => <MetaLink key={link.id} link={link} />)} | |||
{orderedLinks.map(link => ( | |||
<MetaLink key={link.id} link={link} /> | |||
))} | |||
</ul> | |||
</div> | |||
); |
@@ -30,7 +30,7 @@ export default function MetaOrganizationKey({ organization }: Props) { | |||
<> | |||
<h4 className="overview-meta-header big-spacer-top">{translate('organization_key')}</h4> | |||
<div className="display-flex-center"> | |||
<input className="overview-key" type="text" value={organization} readOnly={true} /> | |||
<input className="overview-key" readOnly={true} type="text" value={organization} /> | |||
<ClipboardButton className="little-spacer-left" copyValue={organization} /> | |||
</div> | |||
</> |
@@ -68,7 +68,7 @@ export default class MetaSize extends React.PureComponent<Props> { | |||
this.props.component.qualifier === 'TRK' ? 'overview-meta-size-lang-dist' : 'big-spacer-top'; | |||
return languageDistribution ? ( | |||
<div id="overview-language-distribution" className={className}> | |||
<div className={className} id="overview-language-distribution"> | |||
<LanguageDistributionContainer distribution={languageDistribution.value} width={160} /> | |||
</div> | |||
) : null; |
@@ -103,15 +103,13 @@ export default class ApplicationQualityGate extends React.PureComponent<Props, S | |||
<div | |||
className="overview-quality-gate-conditions-list clearfix" | |||
id="overview-quality-gate-conditions-list"> | |||
{projects | |||
.filter(project => project.status !== 'OK') | |||
.map(project => ( | |||
<ApplicationQualityGateProject | |||
key={project.key} | |||
metrics={metrics} | |||
project={project} | |||
/> | |||
))} | |||
{projects.filter(project => project.status !== 'OK').map(project => ( | |||
<ApplicationQualityGateProject | |||
key={project.key} | |||
metrics={metrics} | |||
project={project} | |||
/> | |||
))} | |||
</div> | |||
)} | |||
</div> |
@@ -114,7 +114,7 @@ export default class QualityGateCondition extends React.PureComponent { | |||
}; | |||
return RATING_METRICS_MAPPING[metricKey] ? ( | |||
<Link to={this.getUrlForType(...RATING_METRICS_MAPPING[metricKey])} className={className}> | |||
<Link className={className} to={this.getUrlForType(...RATING_METRICS_MAPPING[metricKey])}> | |||
{children} | |||
</Link> | |||
) : ( | |||
@@ -153,15 +153,15 @@ export default class QualityGateCondition extends React.PureComponent { | |||
<div className="overview-quality-gate-condition-value"> | |||
<Measure | |||
decimals={decimals} | |||
value={actual} | |||
metricKey={measure.metric.key} | |||
metricType={measure.metric.type} | |||
value={actual} | |||
/> | |||
</div> | |||
<div> | |||
<div className="overview-quality-gate-condition-metric"> | |||
<IssueTypeIcon query={metric.key} className="little-spacer-right" /> | |||
<IssueTypeIcon className="little-spacer-right" query={metric.key} /> | |||
{metric.name} | |||
</div> | |||
{!isDiff && |
@@ -80,8 +80,8 @@ export default class App extends React.PureComponent { | |||
return ( | |||
<Template | |||
organization={this.props.organization} | |||
template={template} | |||
refresh={this.requestPermissions} | |||
template={template} | |||
topQualifiers={this.props.topQualifiers} | |||
/> | |||
); | |||
@@ -91,11 +91,11 @@ export default class App extends React.PureComponent { | |||
return ( | |||
<Home | |||
organization={this.props.organization} | |||
topQualifiers={this.props.topQualifiers} | |||
permissions={this.state.permissions} | |||
permissionTemplates={this.state.permissionTemplates} | |||
ready={this.state.ready} | |||
refresh={this.requestPermissions} | |||
topQualifiers={this.props.topQualifiers} | |||
/> | |||
); | |||
} | |||
@@ -106,8 +106,8 @@ export default class App extends React.PureComponent { | |||
<div> | |||
<Suggestions suggestions="permission_templates" /> | |||
<OrganizationHelmet | |||
title={translate('permission_templates.page')} | |||
organization={this.props.organization} | |||
title={translate('permission_templates.page')} | |||
/> | |||
{id && this.renderTemplate(id)} |
@@ -47,10 +47,10 @@ export default class Home extends React.PureComponent { | |||
<List | |||
organization={this.props.organization} | |||
permissionTemplates={this.props.permissionTemplates} | |||
permissions={this.props.permissions} | |||
topQualifiers={this.props.topQualifiers} | |||
permissionTemplates={this.props.permissionTemplates} | |||
refresh={this.props.refresh} | |||
topQualifiers={this.props.topQualifiers} | |||
/> | |||
</div> | |||
); |
@@ -38,14 +38,14 @@ export default class List extends React.PureComponent { | |||
key={p.id} | |||
organization={this.props.organization} | |||
permissionTemplate={p} | |||
topQualifiers={this.props.topQualifiers} | |||
refresh={this.props.refresh} | |||
topQualifiers={this.props.topQualifiers} | |||
/> | |||
)); | |||
return ( | |||
<div className="boxed-group boxed-group-inner"> | |||
<table id="permission-templates" className="data zebra permissions-table"> | |||
<table className="data zebra permissions-table" id="permission-templates"> | |||
<ListHeader organization={this.props.organization} permissions={this.props.permissions} /> | |||
<tbody>{permissionTemplates}</tbody> | |||
</table> |
@@ -51,8 +51,8 @@ export default class ListItem extends React.PureComponent { | |||
<ActionsCell | |||
organization={this.props.organization} | |||
permissionTemplate={this.props.permissionTemplate} | |||
topQualifiers={this.props.topQualifiers} | |||
refresh={this.props.refresh} | |||
topQualifiers={this.props.topQualifiers} | |||
/> | |||
</td> | |||
</tr> |
@@ -45,8 +45,8 @@ export default class NameCell extends React.PureComponent { | |||
{t.defaultFor.length > 0 && ( | |||
<div className="spacer-top js-defaults"> | |||
<Defaults | |||
permissionTemplate={this.props.permissionTemplate} | |||
organization={organization} | |||
permissionTemplate={this.props.permissionTemplate} | |||
/> | |||
</div> | |||
)} |