From e2d478d65be11489372faac5b051d4602c3227ec Mon Sep 17 00:00:00 2001 From: Priscila Oliveira Date: Sun, 3 Feb 2019 11:23:33 +0100 Subject: [PATCH] initial commit --- .babelrc | 3 + .editorconfig | 12 + .eslintignore | 7 + .eslintrc | 128 + .flowconfig | 25 + .gitignore | 24 + .prettierrc | 12 + .stylelintrc | 40 + README.md | 1 + package.json | 197 + src/.eslintrc | 30 + src/app.js | 186 + src/app.scss | 16 + src/components/Author/index.js | 51 + src/components/AutoComplete/index.js | 129 + src/components/AutoComplete/styles.js | 52 + src/components/AutoComplete/types.js | 29 + src/components/CopyToClipBoard/index.js | 33 + src/components/CopyToClipBoard/styles.js | 26 + src/components/CopyToClipBoard/types.js | 8 + src/components/Dependencies/index.js | 108 + src/components/Dependencies/styles.js | 42 + src/components/Dependencies/types.js | 12 + src/components/DetailContainer/index.js | 67 + src/components/DetailContainer/styles.js | 12 + src/components/DetailContainer/types.js | 12 + src/components/DetailSidebar/index.js | 102 + src/components/DetailSidebar/styles.js | 14 + src/components/DetailSidebar/types.js | 12 + src/components/Developers/index.js | 67 + src/components/Developers/styles.js | 46 + src/components/Footer/index.js | 75 + src/components/Footer/styles.js | 107 + src/components/Header/index.js | 269 + src/components/Header/styles.js | 106 + src/components/Header/types.js | 22 + src/components/Help/index.js | 51 + src/components/Help/styles.js | 21 + src/components/Icon/img/austria.svg | 1 + src/components/Icon/img/brazil.svg | 1 + src/components/Icon/img/china.svg | 1 + src/components/Icon/img/earth.svg | 1 + src/components/Icon/img/india.svg | 1 + src/components/Icon/img/license.svg | 1 + src/components/Icon/img/nicaragua.svg | 1 + src/components/Icon/img/pakistan.svg | 1 + src/components/Icon/img/spain.svg | 1 + src/components/Icon/img/time.svg | 1 + src/components/Icon/img/verdaccio.svg | 1 + src/components/Icon/index.js | 54 + src/components/Icon/styles.js | 55 + src/components/Icon/types.js | 32 + src/components/Install/index.js | 46 + src/components/Label/index.js | 27 + src/components/Label/types.js | 12 + src/components/Layout/index.js | 31 + src/components/License/index.js | 51 + src/components/Link/index.js | 16 + src/components/Link/types.js | 12 + src/components/Loading/index.js | 23 + src/components/Loading/styles.js | 24 + src/components/Login/index.js | 240 + src/components/Login/login.scss | 22 + src/components/Logo/img/logo.svg | 1 + src/components/Logo/index.js | 29 + src/components/NoItems/index.js | 16 + src/components/NoItems/styles.js | 12 + src/components/NoItems/types.js | 8 + src/components/NotFound/img/package.svg | 1 + src/components/NotFound/index.js | 53 + src/components/NotFound/styles.js | 46 + src/components/Package/index.js | 105 + src/components/Package/styles.js | 199 + src/components/Package/types.js | 20 + src/components/PackageDetail/index.js | 31 + .../PackageDetail/packageDetail.scss | 16 + src/components/PackageList/index.js | 52 + src/components/PackageList/packageList.scss | 12 + .../PackageSidebar/Module/index.jsx | 25 + .../PackageSidebar/Module/style.scss | 24 + .../ModuleContentPlaceholder/index.jsx | 11 + .../ModuleContentPlaceholder/style.scss | 8 + src/components/PackageSidebar/index.jsx | 104 + .../modules/Dependencies/index.jsx | 50 + .../modules/Dependencies/style.scss | 13 + .../PackageSidebar/modules/DistTags/index.jsx | 50 + .../modules/DistTags/style.scss | 13 + .../PackageSidebar/modules/Infos/index.jsx | 40 + .../PackageSidebar/modules/Infos/style.scss | 21 + .../PackageSidebar/modules/LastSync/index.jsx | 43 + .../modules/LastSync/style.scss | 13 + .../Maintainers/MaintainerInfo/index.jsx | 22 + .../Maintainers/MaintainerInfo/style.scss | 26 + .../modules/Maintainers/index.jsx | 122 + .../modules/Maintainers/style.scss | 13 + .../modules/PeerDependencies/index.jsx | 18 + src/components/Readme/index.js | 13 + src/components/Readme/types.js | 8 + src/components/RegistryInfoContent/index.js | 90 + src/components/RegistryInfoContent/styles.js | 7 + src/components/RegistryInfoContent/types.js | 13 + src/components/RegistryInfoDialog/index.js | 28 + src/components/RegistryInfoDialog/styles.js | 24 + src/components/RegistryInfoDialog/types.js | 12 + src/components/Repository/index.js | 64 + src/components/Repository/styles.js | 13 + src/components/Search/index.js | 186 + src/components/Search/types.js | 23 + src/components/Spinner/index.js | 18 + src/components/Spinner/styles.js | 30 + src/components/Spinner/types.js | 9 + src/components/Tag/index.js | 14 + src/components/Tag/styles.js | 20 + src/components/Tag/types.js | 9 + src/components/TextField/index.js | 19 + src/components/UpLinks/index.js | 50 + src/components/UpLinks/styles.js | 25 + src/components/UpLinks/types.js | 6 + src/components/Versions/index.js | 61 + src/components/Versions/styles.js | 25 + src/components/Versions/types.js | 6 + src/history.js | 15 + src/icons/GitHub.js | 16 + src/index.js | 24 + src/pages/detail/detail.scss | 25 + src/pages/detail/index.jsx | 87 + src/pages/home/home.scss | 16 + src/pages/home/index.js | 22 + src/pages/version/index.js | 135 + src/pages/version/styles.js | 17 + src/pages/version/types.js | 0 src/router.js | 98 + src/styles/core.scss | 22 + src/styles/global.scss | 47 + src/styles/main.scss | 2 + src/styles/mixins.scss | 45 + src/styles/typeface-roboto.scss | 1 + src/styles/variables.scss | 65 + src/template/favicon.ico | Bin 0 -> 15086 bytes src/template/index.html | 22 + src/utils/__setPublicPath__.js | 3 + src/utils/api.js | 62 + src/utils/asyncComponent.js | 28 + src/utils/calls.js | 12 + src/utils/cli-utils.js | 33 + src/utils/constants.js | 9 + src/utils/login.js | 76 + src/utils/package.js | 118 + src/utils/sec-utils.js | 12 + src/utils/storage.js | 12 + src/utils/styles/colors.js | 34 + src/utils/styles/global.js | 27 + src/utils/styles/media.js | 29 + src/utils/styles/mixings.js | 45 + src/utils/styles/sizes.js | 23 + src/utils/styles/spacings.js | 6 + src/utils/url.js | 12 + src/utils/windows.js | 3 + tools/dev.server.js | 49 + tools/webpack.config.js | 99 + tools/webpack.dev.config.babel.js | 55 + tools/webpack.prod.config.babel.js | 59 + yarn.lock | 13660 ++++++++++++++++ 163 files changed, 19925 insertions(+) create mode 100644 .babelrc create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .flowconfig create mode 100755 .gitignore create mode 100644 .prettierrc create mode 100644 .stylelintrc create mode 100755 README.md create mode 100644 package.json create mode 100644 src/.eslintrc create mode 100644 src/app.js create mode 100644 src/app.scss create mode 100644 src/components/Author/index.js create mode 100644 src/components/AutoComplete/index.js create mode 100644 src/components/AutoComplete/styles.js create mode 100644 src/components/AutoComplete/types.js create mode 100644 src/components/CopyToClipBoard/index.js create mode 100644 src/components/CopyToClipBoard/styles.js create mode 100644 src/components/CopyToClipBoard/types.js create mode 100644 src/components/Dependencies/index.js create mode 100644 src/components/Dependencies/styles.js create mode 100644 src/components/Dependencies/types.js create mode 100644 src/components/DetailContainer/index.js create mode 100644 src/components/DetailContainer/styles.js create mode 100644 src/components/DetailContainer/types.js create mode 100644 src/components/DetailSidebar/index.js create mode 100644 src/components/DetailSidebar/styles.js create mode 100644 src/components/DetailSidebar/types.js create mode 100644 src/components/Developers/index.js create mode 100644 src/components/Developers/styles.js create mode 100644 src/components/Footer/index.js create mode 100644 src/components/Footer/styles.js create mode 100644 src/components/Header/index.js create mode 100644 src/components/Header/styles.js create mode 100644 src/components/Header/types.js create mode 100644 src/components/Help/index.js create mode 100644 src/components/Help/styles.js create mode 100644 src/components/Icon/img/austria.svg create mode 100644 src/components/Icon/img/brazil.svg create mode 100644 src/components/Icon/img/china.svg create mode 100644 src/components/Icon/img/earth.svg create mode 100644 src/components/Icon/img/india.svg create mode 100644 src/components/Icon/img/license.svg create mode 100644 src/components/Icon/img/nicaragua.svg create mode 100644 src/components/Icon/img/pakistan.svg create mode 100644 src/components/Icon/img/spain.svg create mode 100644 src/components/Icon/img/time.svg create mode 100644 src/components/Icon/img/verdaccio.svg create mode 100644 src/components/Icon/index.js create mode 100644 src/components/Icon/styles.js create mode 100644 src/components/Icon/types.js create mode 100644 src/components/Install/index.js create mode 100644 src/components/Label/index.js create mode 100644 src/components/Label/types.js create mode 100644 src/components/Layout/index.js create mode 100644 src/components/License/index.js create mode 100644 src/components/Link/index.js create mode 100644 src/components/Link/types.js create mode 100644 src/components/Loading/index.js create mode 100644 src/components/Loading/styles.js create mode 100644 src/components/Login/index.js create mode 100644 src/components/Login/login.scss create mode 100644 src/components/Logo/img/logo.svg create mode 100644 src/components/Logo/index.js create mode 100644 src/components/NoItems/index.js create mode 100644 src/components/NoItems/styles.js create mode 100644 src/components/NoItems/types.js create mode 100644 src/components/NotFound/img/package.svg create mode 100644 src/components/NotFound/index.js create mode 100644 src/components/NotFound/styles.js create mode 100644 src/components/Package/index.js create mode 100644 src/components/Package/styles.js create mode 100644 src/components/Package/types.js create mode 100644 src/components/PackageDetail/index.js create mode 100644 src/components/PackageDetail/packageDetail.scss create mode 100644 src/components/PackageList/index.js create mode 100644 src/components/PackageList/packageList.scss create mode 100644 src/components/PackageSidebar/Module/index.jsx create mode 100644 src/components/PackageSidebar/Module/style.scss create mode 100644 src/components/PackageSidebar/ModuleContentPlaceholder/index.jsx create mode 100644 src/components/PackageSidebar/ModuleContentPlaceholder/style.scss create mode 100644 src/components/PackageSidebar/index.jsx create mode 100644 src/components/PackageSidebar/modules/Dependencies/index.jsx create mode 100644 src/components/PackageSidebar/modules/Dependencies/style.scss create mode 100644 src/components/PackageSidebar/modules/DistTags/index.jsx create mode 100644 src/components/PackageSidebar/modules/DistTags/style.scss create mode 100644 src/components/PackageSidebar/modules/Infos/index.jsx create mode 100644 src/components/PackageSidebar/modules/Infos/style.scss create mode 100644 src/components/PackageSidebar/modules/LastSync/index.jsx create mode 100644 src/components/PackageSidebar/modules/LastSync/style.scss create mode 100644 src/components/PackageSidebar/modules/Maintainers/MaintainerInfo/index.jsx create mode 100644 src/components/PackageSidebar/modules/Maintainers/MaintainerInfo/style.scss create mode 100644 src/components/PackageSidebar/modules/Maintainers/index.jsx create mode 100644 src/components/PackageSidebar/modules/Maintainers/style.scss create mode 100644 src/components/PackageSidebar/modules/PeerDependencies/index.jsx create mode 100644 src/components/Readme/index.js create mode 100644 src/components/Readme/types.js create mode 100644 src/components/RegistryInfoContent/index.js create mode 100644 src/components/RegistryInfoContent/styles.js create mode 100644 src/components/RegistryInfoContent/types.js create mode 100644 src/components/RegistryInfoDialog/index.js create mode 100644 src/components/RegistryInfoDialog/styles.js create mode 100644 src/components/RegistryInfoDialog/types.js create mode 100644 src/components/Repository/index.js create mode 100644 src/components/Repository/styles.js create mode 100644 src/components/Search/index.js create mode 100644 src/components/Search/types.js create mode 100644 src/components/Spinner/index.js create mode 100644 src/components/Spinner/styles.js create mode 100644 src/components/Spinner/types.js create mode 100644 src/components/Tag/index.js create mode 100644 src/components/Tag/styles.js create mode 100644 src/components/Tag/types.js create mode 100644 src/components/TextField/index.js create mode 100644 src/components/UpLinks/index.js create mode 100644 src/components/UpLinks/styles.js create mode 100644 src/components/UpLinks/types.js create mode 100644 src/components/Versions/index.js create mode 100644 src/components/Versions/styles.js create mode 100644 src/components/Versions/types.js create mode 100644 src/history.js create mode 100644 src/icons/GitHub.js create mode 100644 src/index.js create mode 100644 src/pages/detail/detail.scss create mode 100644 src/pages/detail/index.jsx create mode 100644 src/pages/home/home.scss create mode 100644 src/pages/home/index.js create mode 100644 src/pages/version/index.js create mode 100644 src/pages/version/styles.js create mode 100644 src/pages/version/types.js create mode 100644 src/router.js create mode 100644 src/styles/core.scss create mode 100644 src/styles/global.scss create mode 100644 src/styles/main.scss create mode 100644 src/styles/mixins.scss create mode 100644 src/styles/typeface-roboto.scss create mode 100644 src/styles/variables.scss create mode 100644 src/template/favicon.ico create mode 100644 src/template/index.html create mode 100644 src/utils/__setPublicPath__.js create mode 100644 src/utils/api.js create mode 100644 src/utils/asyncComponent.js create mode 100644 src/utils/calls.js create mode 100644 src/utils/cli-utils.js create mode 100644 src/utils/constants.js create mode 100644 src/utils/login.js create mode 100644 src/utils/package.js create mode 100644 src/utils/sec-utils.js create mode 100644 src/utils/storage.js create mode 100644 src/utils/styles/colors.js create mode 100644 src/utils/styles/global.js create mode 100644 src/utils/styles/media.js create mode 100644 src/utils/styles/mixings.js create mode 100644 src/utils/styles/sizes.js create mode 100644 src/utils/styles/spacings.js create mode 100644 src/utils/url.js create mode 100644 src/utils/windows.js create mode 100644 tools/dev.server.js create mode 100644 tools/webpack.config.js create mode 100644 tools/webpack.dev.config.babel.js create mode 100644 tools/webpack.prod.config.babel.js create mode 100644 yarn.lock diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..dfb8d74 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": [["@verdaccio", { "flow": true }]] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..42bfe7a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true + +# 2 space indentation +[{.,}*.{js,jsx,yml,yaml}] +indent_style = space +indent_size = 2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e757e5a --- /dev/null +++ b/.eslintignore @@ -0,0 +1,7 @@ +node_modules +coverage/ +wiki/ +static/ +flow-typed/ +website/ +build/ diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..74398c1 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,128 @@ +{ + "plugins": [ + "babel", + "react", + "flowtype", + "jest", + "verdaccio", + "jsx-a11y" + ], + "extends": [ + "eslint:recommended", + "google", + "plugin:flowtype/recommended", + "plugin:jest/recommended", + "plugin:prettier/recommended", + "plugin:react/recommended", + "plugin:verdaccio/recommended", + "plugin:jsx-a11y/recommended" + ], + "settings": { + "react": { + "pragma": "React", + "version": "16.4.2", + "flowVersion": "0.81.0" + } + }, + "parser": "babel-eslint", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 7, + "ecmaFeatures": { + "impliedStrict": true, + "jsx": true + } + }, + "env": { + "browser": true, + "node": true, + "es6": true, + "jest": true + }, + "globals": { + "__APP_VERSION__": true + }, + "rules": { + "babel/no-invalid-this": 1, + "prettier/prettier": ["error", null, "@prettier"], + "react/no-deprecated": 1, + "react/jsx-no-target-blank": 1, + "react/destructuring-assignment": ["error", "always"], + "react/forbid-component-props": ["warn", { "forbid": ["style"] }], + "react/no-this-in-sfc": ["warn"], + "react/no-unsafe": ["warn"], + "react/sort-comp": ["warn", { + "order": [ + "static-methods", + "lifecycle", + "render", + "everything-else", + "/^on.+$/", + "/^render.+$/" + ] + }], + "react/void-dom-elements-no-children": ["warn"], + "react/no-did-mount-set-state": ["error", "disallow-in-func"], + "react/jsx-wrap-multilines": ["error",{ + "declaration": "parens", + "assignment": "parens", + "return": "parens", + "arrow": "parens", + "condition": "parens", + "logical": "parens", + "prop": "parens" + }], + "react/jsx-boolean-value": ["error", "always"], + "react/jsx-closing-tag-location": ["error"], + "react/jsx-curly-spacing": ["error", "never"], + "react/jsx-equals-spacing": ["error", "never"], + "react/jsx-first-prop-new-line": ["error", "multiline-multiprop"], + "react/jsx-handler-names": ["warn"], + "react/jsx-indent": ["error", 2], + "react/jsx-indent-props": ["error", 2], + "react/jsx-key": ["error"], + "react/jsx-max-depth": ["error", { "max": 2}], + "react/jsx-max-props-per-line": ["error", {"maximum": 3, "when": "multiline" }], + "react/jsx-no-bind": ["error"], + "react/jsx-no-comment-textnodes": ["error"], + "react/jsx-no-duplicate-props": ["error"], + "react/jsx-no-literals": ["error"], + "react/jsx-no-undef": ["error"], + "react/jsx-one-expression-per-line": ["error", {"allow": "single-child"}], + "react/jsx-curly-brace-presence": ["error", { "props": "always", "children": "ignore" }], + "react/jsx-pascal-case": ["error"], + "react/jsx-props-no-multi-spaces": ["error"], + "react/jsx-sort-default-props": ["error"], + "react/jsx-sort-props": ["error"], + "react/no-string-refs": ["error"], + "react/no-danger-with-children": ["error"], + "react/jsx-tag-spacing": ["error", { + "closingSlash": "never", + "beforeSelfClosing": "always", + "afterOpening": "allow-multiline", + "beforeClosing": "allow" + }], + "react/prefer-es6-class": [ + 2, + "always" + ], + "semi": ["error"], + "comma-dangle": ["error"], + "camelcase": 0, + "no-useless-escape": ["error"], + "no-invalid-this": 0, + "handle-callback-err": ["error"], + "no-fallthrough": ["error"], + "no-new-require": ["error"], + "max-len": ["error", 160], + "require-jsdoc": 0, + "valid-jsdoc": 0, + "prefer-spread": 1, + "prefer-rest-params": 1, + "linebreak-style": 0, + "quote-props":["error", "as-needed"], + "verdaccio/jsx-no-style": ["warn"], + "verdaccio/jsx-spread": ["warn"], + "jest/expect-expect": 0 + } +} diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..20e1ceb --- /dev/null +++ b/.flowconfig @@ -0,0 +1,25 @@ +[ignore] +.*/node_modules/.* +.*/test/**/*.json +.*/static/.* +.*/test/unit/partials/.* +.*/.nyc_output/.* +.*/coverage/.* +.*/.vscode/.* +.*/build/.* +.*/docs/.* +.*/scripts/.* +.*/assets/.* +.*/bin/.* +.*/systemd/.* +.*/website/.* +.*/wiki/.* +.*/docs/.* +.*/tools/.* + +[libs] +node_modules/@verdaccio/types/lib/ + +[options] +suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe +module.ignore_non_literal_requires=true diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..df43e6d --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# Compiled script +/static +/dist + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..f235af8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "useTabs": false, + "printWidth": 160, + "tabWidth": 2, + "singleQuote": true, + "requirePragma": true, + "bracketSpacing": true, + "jsxBracketSameLine": true, + "trailingComma": "es5", + "semi": true, + "parser": "flow" +} diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 0000000..095b2b0 --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,40 @@ +{ + "processors": ["stylelint-processor-styled-components"], + "extends": [ + "stylelint-config-recommended" + ], + "rules": { + "at-rule-no-unknown": true, + "block-no-empty": true, + "color-named": "always-where-possible", + "comment-no-empty": true, + "declaration-block-no-duplicate-properties": [ + true, + { + ignore: ["consecutive-duplicates-with-different-values"] + } + ], + "declaration-block-no-shorthand-property-overrides": true, + "font-family-no-duplicate-names": true, + "color-no-invalid-hex": true, + "font-family-no-missing-generic-family-keyword": true, + "function-calc-no-unspaced-operator": true, + "function-linear-gradient-no-nonstandard-direction": true, + "keyframe-declaration-no-important": true, + "property-no-vendor-prefix": true, + "media-feature-name-no-unknown": true, + "no-descending-specificity": [true, { "severity": "warning" }], + "no-duplicate-at-import-rules": true, + "no-duplicate-selectors": true, + "no-empty-source": true, + "no-extra-semicolons": true, + "no-invalid-double-slash-comments": true, + "property-no-unknown": true, + "selector-pseudo-class-no-unknown": true, + "selector-pseudo-element-no-unknown": true, + "selector-type-no-unknown": [true, { "severity": "warning" }], + "string-no-newline": true, + "unit-no-unknown": true + } + +} diff --git a/README.md b/README.md new file mode 100755 index 0000000..5195e51 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +under construction... diff --git a/package.json b/package.json new file mode 100644 index 0000000..f7a31c3 --- /dev/null +++ b/package.json @@ -0,0 +1,197 @@ +{ + "name": "ui", + "version": "1.0.0", + "description": "Verdaccio User Interface", + "author": { + "name": "Verdaccio Core Team" + }, + "repository": { + "type": "git", + "url": "git://github.com/verdaccio/io" + }, + "main": "build/index.js", + "dependencies": { + "@verdaccio/file-locking": "0.0.7", + "@verdaccio/local-storage": "2.0.0-beta.1", + "@verdaccio/streams": "2.0.0-beta.0", + "JSONStream": "1.3.4", + "async": "2.6.1", + "body-parser": "1.18.3", + "bunyan": "1.8.12", + "chalk": "2.4.1", + "commander": "2.18.0", + "compression": "1.7.3", + "cookies": "0.7.2", + "cors": "2.8.4", + "date-fns": "1.29.0", + "express": "4.16.3", + "global": "4.3.2", + "handlebars": "4.0.12", + "http-errors": "1.7.1", + "js-base64": "2.4.9", + "js-string-escape": "1.0.1", + "js-yaml": "3.12.0", + "jsonwebtoken": "8.3.0", + "lockfile": "1.0.4", + "lodash": "4.17.11", + "lunr-mutable-indexes": "2.3.1", + "marked": "0.5.1", + "mime": "2.3.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "mv": "2.1.1", + "pkginfo": "0.4.1", + "request": "2.88.0", + "semver": "5.5.1", + "verdaccio-audit": "1.1.0", + "verdaccio-htpasswd": "1.0.1", + "verror": "1.10.0" + }, + "devDependencies": { + "@commitlint/cli": "7.2.1", + "@commitlint/config-conventional": "7.1.2", + "@material-ui/core": "3.1.0", + "@material-ui/icons": "3.0.1", + "@verdaccio/babel-preset": "0.0.3", + "@verdaccio/types": "4.1.4", + "autosuggest-highlight": "3.1.1", + "bundlesize": "0.17.0", + "codecov": "3.1.0", + "cross-env": "5.2.0", + "css-loader": "0.28.10", + "emotion": "9.2.12", + "enzyme": "3.6.0", + "enzyme-adapter-react-16": "1.5.0", + "eslint": "5.10.0", + "eslint-config-google": "0.11.0", + "eslint-config-prettier": "3.3.0", + "eslint-loader": "2.1.1", + "eslint-plugin-babel": "5.3.0", + "eslint-plugin-flowtype": "3.2.0", + "eslint-plugin-import": "2.14.0", + "eslint-plugin-jest": "22.1.2", + "eslint-plugin-jsx-a11y": "6.1.2", + "eslint-plugin-prettier": "3.0.0", + "eslint-plugin-react": "7.11.1", + "eslint-plugin-verdaccio": "0.0.5", + "file-loader": "2.0.0", + "flow-bin": "0.81.0", + "flow-runtime": "0.17.0", + "friendly-errors-webpack-plugin": "1.7.0", + "github-markdown-css": "2.10.0", + "html-webpack-plugin": "3.2.0", + "husky": "0.15.0-rc.8", + "identity-obj-proxy": "3.0.0", + "in-publish": "2.0.0", + "jest": "23.6.0", + "jest-environment-jsdom": "23.4.0", + "jest-environment-jsdom-global": "1.1.0", + "jest-environment-node": "23.4.0", + "lint-staged": "7.3.0", + "localstorage-memory": "1.0.2", + "mini-css-extract-plugin": "0.4.3", + "node-mocks-http": "1.7.0", + "node-sass": "4.9.3", + "normalize.css": "8.0.0", + "optimize-css-assets-webpack-plugin": "5.0.1", + "ora": "1.4.0", + "prettier": "1.14.3", + "prop-types": "15.6.2", + "puppeteer": "1.8.0", + "react": "16.4.2", + "react-autosuggest": "9.4.2", + "react-dom": "16.4.2", + "react-emotion": "9.2.12", + "react-hot-loader": "4.2.0", + "react-router": "4.3.1", + "react-router-dom": "4.2.2", + "resolve-url-loader": "3.0.0", + "rimraf": "2.6.2", + "sass-loader": "7.1.0", + "source-map-loader": "0.2.4", + "standard-version": "4.4.0", + "style-loader": "0.23.0", + "stylelint": "9.9.0", + "stylelint-config-recommended": "2.1.0", + "stylelint-config-recommended-scss": "3.2.0", + "stylelint-config-styled-components": "0.1.1", + "stylelint-processor-styled-components": "1.5.1", + "stylelint-scss": "3.3.1", + "stylelint-webpack-plugin": "0.10.5", + "supertest": "3.3.0", + "typeface-roboto": "0.0.54", + "url-loader": "1.1.1", + "verdaccio-auth-memory": "0.0.4", + "verdaccio-memory": "2.0.0-beta.0", + "webpack": "4.20.2", + "webpack-bundle-analyzer": "3.0.2", + "webpack-cli": "3.1.1", + "webpack-dev-server": "3.1.14", + "webpack-merge": "4.1.4", + "whatwg-fetch": "3.0.0" + }, + "keywords": [ + "verdaccio", + "verdaccio-ui" + ], + "scripts": { + "flow": "flow check", + "pretest": "npm run code:build", + "test": "npm run test:unit", + "test:clean": "npx jest --clearCache", + "test:unit": "cross-env NODE_ENV=test BABEL_ENV=test TZ=UTC FORCE_COLOR=1 jest --config ./jest.config.js --maxWorkers 2 --passWithNoTests", + "test:functional": "cross-env NODE_ENV=test jest --config ./test/jest.config.functional.js --testPathPattern ./test/functional/index* --passWithNoTests", + "test:e2e": "cross-env BABEL_ENV=test jest --config ./test/jest.config.e2e.js", + "test:size": "bundlesize", + "test:all": "npm run build:webui && npm run test && npm run test:functional && npm run test:e2e && npm run test:size", + "pre:ci": "npm run lint && npm run build:webui", + "coverage:publish": "codecov", + "lint": "npm run flow && npm run lint:js && npm run lint:css", + "lint:js": "eslint .", + "lint:css": "stylelint 'src/webui/**/styles.js'", + "dev:start": "cross-env BABEL_ENV=registry babel-node src/lib/cli", + "code:build": "cross-env BABEL_ENV=registry babel src/ --out-dir build/ --ignore src/webui/ --copy-files", + "code:docker-build": "cross-env BABEL_ENV=registry-docker babel src/ --out-dir build/ --ignore src/webui/ --copy-files", + "pre:webpack": "rimraf static/*", + "dev:webui": "cross-env BABEL_ENV=ui babel-node tools/dev.server.js", + "build:webui": "npm run pre:webpack && cross-env BABEL_ENV=ui webpack --config tools/webpack.prod.config.babel.js", + "build:docker": "docker build -t verdaccio . --no-cache", + "build:docker:rpi": "docker build -f Dockerfile.rpi -t verdaccio:rpi ." + }, + "engines": { + "node": ">=6.12.0", + "npm": ">=3" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged && commitlint -e $GIT_PARAMS" + } + }, + "lint-staged": { + "linters": { + "*.yaml": [ + "prettier --parser yaml --no-config --single-quote --write", + "git add" + ], + "*": [ + "eslint .", + "prettier --write", + "git add" + ] + }, + "ignore": [ + "*.json" + ] + }, + "license": "MIT", + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "collective": { + "type": "opencollective", + "url": "https://opencollective.com/verdaccio", + "logo": "https://opencollective.com/verdaccio/logo.txt" + } +} diff --git a/src/.eslintrc b/src/.eslintrc new file mode 100644 index 0000000..507caf8 --- /dev/null +++ b/src/.eslintrc @@ -0,0 +1,30 @@ +{ + "env": { + "browser": true, + "node": true, + "jest": true, + "es6": true + }, + "globals": { + "__DEBUG__": true + }, + "rules": { + "require-jsdoc": 0, + "camelcase": ["error"], + "no-console": [ + 1, + { + "allow": [ + "log" + ] + } + ], + "no-unused-vars": [ + 2, + { + "vars": "all", + "args": "all" + } + ] + } +} diff --git a/src/app.js b/src/app.js new file mode 100644 index 0000000..8888930 --- /dev/null +++ b/src/app.js @@ -0,0 +1,186 @@ +import React, {Component, Fragment} from 'react'; +import isNil from 'lodash/isNil'; + +import storage from './utils/storage'; +import {makeLogin, isTokenExpire} from './utils/login'; + +import Loading from './components/Loading'; +import LoginModal from './components/Login'; +import Header from './components/Header'; +import {Container, Content} from './components/Layout'; +import RouterApp from './router'; +import API from './utils/api'; +import './styles/typeface-roboto.scss'; +import './styles/main.scss'; +import 'normalize.css'; +import Footer from './components/Footer'; + +export const AppContext = React.createContext(); + +export const AppContextProvider = AppContext.Provider; +export const AppContextConsumer = AppContext.Consumer; + +export default class App extends Component { + state = { + error: {}, + logoUrl: window.VERDACCIO_LOGO, + user: {}, + scope: window.VERDACCIO_SCOPE ? `${window.VERDACCIO_SCOPE}:` : '', + showLoginModal: false, + isUserLoggedIn: false, + packages: [], + isLoading: true, + }; + + componentDidMount() { + this.isUserAlreadyLoggedIn(); + this.loadOnHandler(); + } + + // eslint-disable-next-line no-unused-vars + componentDidUpdate(_, prevState) { + const {isUserLoggedIn} = this.state; + if (prevState.isUserLoggedIn !== isUserLoggedIn) { + this.loadOnHandler(); + } + } + + isUserAlreadyLoggedIn = () => { + // checks for token validity + const token = storage.getItem('token'); + const username = storage.getItem('username'); + if (isTokenExpire(token) || isNil(username)) { + this.handleLogout(); + } else { + this.setState({ + user: {username, token}, + isUserLoggedIn: true, + }); + } + }; + + loadOnHandler = async () => { + try { + this.req = await API.request('packages', 'GET'); + this.setState({ + packages: this.req, + isLoading: false, + }); + } catch (error) { + // FIXME: add dialog + console.error({ + title: 'Warning', + message: `Unable to load package list: ${error.message}`, + }); + this.setLoading(false); + } + }; + + setLoading = (isLoading) => + this.setState({ + isLoading, + }); + + /** + * Toggles the login modal + * Required by:
+ */ + handleToggleLoginModal = () => { + this.setState((prevState) => ({ + showLoginModal: !prevState.showLoginModal, + error: {}, + })); + }; + + /** + * handles login + * Required by:
+ */ + handleDoLogin = async (usernameValue, passwordValue) => { + const {username, token, error} = await makeLogin(usernameValue, passwordValue); + + if (username && token) { + this.setLoggedUser(username, token); + storage.setItem('username', username); + storage.setItem('token', token); + } + + if (error) { + this.setState({ + user: {}, + error, + }); + } + }; + + setLoggedUser = (username, token) => { + this.setState({ + user: { + username, + token, + }, + isUserLoggedIn: true, // close login modal after successful login + showLoginModal: false, // set isUserLoggedIn to true + }); + }; + /** + * Logouts user + * Required by:
+ */ + handleLogout = () => { + storage.removeItem('username'); + storage.removeItem('token'); + this.setState({ + user: {}, + isUserLoggedIn: false, + }); + }; + + render() { + const {isLoading, isUserLoggedIn, packages, logoUrl, user, scope} = this.state; + return ( + + {isLoading ? ( + + ) : ( + + {this.renderContent()} + + )} + {this.renderLoginModal()} + + ); + } + + renderLoginModal = () => { + const {error, showLoginModal} = this.state; + return ( + + ); + }; + + renderContent = () => { + return ( + + + + {this.renderHeader()} + + +