From 8d029f692cfe1166577e3cfe8b7111d6a2b08ff7 Mon Sep 17 00:00:00 2001 From: Artem Solovev Date: Sat, 6 Jun 2020 19:20:16 +0300 Subject: [PATCH 1/5] bugfix/#91 Fixed crush on empty token --- src/inject.ts | 4 +- src/modules/Popup/components/Body/Body.tsx | 53 ++++++++++------------ src/utils/requestLoc.ts | 16 ++++--- tsconfig.json | 2 +- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/inject.ts b/src/inject.ts index b5e85d9..bfd79f5 100644 --- a/src/inject.ts +++ b/src/inject.ts @@ -14,7 +14,7 @@ import { getLinksFromDom } from './utils/getLinksFromDom'; * - LOC - lines of code */ -let githubToken: string = ''; +let githubToken = ''; /** * Main @@ -29,7 +29,7 @@ let githubToken: string = ''; document.addEventListener('pjax:complete', () => { gloc(); - }) + }); }); })(); diff --git a/src/modules/Popup/components/Body/Body.tsx b/src/modules/Popup/components/Body/Body.tsx index 0df5543..c05bdcb 100644 --- a/src/modules/Popup/components/Body/Body.tsx +++ b/src/modules/Popup/components/Body/Body.tsx @@ -1,45 +1,40 @@ import * as React from 'react'; -import styled from 'styled-components'; import { - Container, - Row, - Column, + Container, + Row, + Column, } from '../../../Common/components/Layout/index'; import { Text } from '../../../Common/components/Text/index'; import { TextList, Type } from '../../../Common/components/TextList/index'; import { colors } from '../../../../theme/colors'; -const Wrapper = styled(Container)` - background-color: black; -`; - export default class Body extends React.PureComponent { render() { - const headerMsg = chrome.i18n.getMessage('indexCountsFrom'); - const list = [ - chrome.i18n.getMessage('indexProjectPage'), - chrome.i18n.getMessage('indexUserPage'), - chrome.i18n.getMessage('indexSearchPage'), - chrome.i18n.getMessage('indexTrandingPage'), - chrome.i18n.getMessage('indexEtc'), - ]; + const headerMsg = chrome.i18n.getMessage('indexCountsFrom'); + const list = [ + chrome.i18n.getMessage('indexProjectPage'), + chrome.i18n.getMessage('indexUserPage'), + chrome.i18n.getMessage('indexSearchPage'), + chrome.i18n.getMessage('indexTrandingPage'), + chrome.i18n.getMessage('indexEtc'), + ]; return ( - - - - {headerMsg} - + + + + {headerMsg} + - - - - - + + + + + ); } } diff --git a/src/utils/requestLoc.ts b/src/utils/requestLoc.ts index a8d18ee..0f3fc38 100644 --- a/src/utils/requestLoc.ts +++ b/src/utils/requestLoc.ts @@ -7,7 +7,8 @@ import { isEmpty } from './isEmpty'; /* Read more: - https://developer.github.com/v3/auth/#via-oauth-and-personal-access-tokens - - https://developer.github.com/changes/2019-11-05-deprecated-passwords-and-authorizations-api/#authenticating-using-query-parameters + - https://developer.github.com + /changes/2019-11-05-deprecated-passwords-and-authorizations-api/#authenticating-using-query-parameters */ export const requestLoc = (reponame: string, tries: number, token: string): Promise => { if (tries === 0) { @@ -15,13 +16,16 @@ export const requestLoc = (reponame: string, tries: number, token: string): Prom } const url = getApiUrl(reponame); - const options = { + const options: RequestInit | undefined = { method: 'GET', - headers: { - 'Authorization': `token ${token}` - }, }; + if (token) { + options.headers = { + Authorization: `token ${token}`, + }; + } + return fetch(url, options) .then(response => response.json()) .then((stat: CodeFrequency) => { @@ -31,7 +35,7 @@ export const requestLoc = (reponame: string, tries: number, token: string): Prom console.error(`Error by calculating LOC for ${reponame}. Incoming stat -->`, stat); - return null;; + return null; }) .catch((err: GithubError) => { if (err.message) { diff --git a/tsconfig.json b/tsconfig.json index 22602f0..f21750e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "baseUrl": "types", "typeRoots": ["types"], "allowJs": true, - "strict": true, + "strict": true, "types": ["chrome", "jquery", "node"], "lib": ["es2015.core", "dom", "es6"], "sourceMap": true, From b679ab111317a5d11b7fafbff6c5a30ffba59389 Mon Sep 17 00:00:00 2001 From: Artem Solovev Date: Sat, 6 Jun 2020 20:18:31 +0300 Subject: [PATCH 2/5] bugfix/#87 Fixing glitches on pages rendering --- src/configs/parametersToMap.ts | 154 ++++++++++++++++++--------------- src/inject.ts | 6 +- src/types.ts | 1 + src/utils/getLinksFromDom.ts | 4 +- src/utils/renderBadge.ts | 14 +-- src/utils/renderLocs.ts | 9 +- src/utils/scrapData.ts | 49 +++++++---- 7 files changed, 132 insertions(+), 105 deletions(-) diff --git a/src/configs/parametersToMap.ts b/src/configs/parametersToMap.ts index d8c97a9..60348d7 100644 --- a/src/configs/parametersToMap.ts +++ b/src/configs/parametersToMap.ts @@ -3,80 +3,92 @@ import { LOCATION } from '../types'; export type ExistenceChecker = (entity: HTMLAnchorElement[]) => boolean; export type Wrapper = (links: HTMLAnchorElement) => HTMLAnchorElement[]; -export type ParameterToMap = { - locationName: LOCATION, - selector: 'querySelectorAll' | 'querySelector' | void, - pathToSelect: string | void, - existenceChecker: ExistenceChecker | void, - wrapper: Wrapper | void, +export interface ParameterToMap { + locationName: LOCATION; + selector: 'querySelectorAll' | 'querySelector' | void; + pathToSelect: string | void; + pathToInsert?: string ; + existenceChecker: ExistenceChecker | void; + wrapper: Wrapper | void; } const currentUserLocation = window.location.pathname.replace('/', ''); export const parametersToMap: ParameterToMap[] = [ - { - locationName: LOCATION.USER, - selector: 'querySelectorAll', - pathToSelect: '.js-pinned-items-reorder-container ol li a.text-bold.flex-auto.min-width-0', - existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, - wrapper: (entity) => Array.prototype.slice.call(entity), - }, - { - locationName: LOCATION.ORGANIZATION, - selector: 'querySelectorAll', - pathToSelect: '.repo-list h3 a', - existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, - wrapper: (entity) => Array.prototype.slice.call(entity), - }, - { - locationName: LOCATION.SEARCH, - selector: 'querySelectorAll', - pathToSelect: '.codesearch-results ul li a.v-align-middle', - existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, - wrapper: (entity) => Array.prototype.slice.call(entity), - }, - { - locationName: LOCATION.SINGLE, - selector: 'querySelector', - pathToSelect: '.application-main h1 strong a', - existenceChecker: (entity: HTMLAnchorElement[]) => Boolean(entity), - wrapper: (entity: HTMLAnchorElement) => [entity], - }, - { - locationName: LOCATION.EXPLORE, - selector: 'querySelectorAll', - pathToSelect: 'article h1 a.text-bold', - existenceChecker: (entity: HTMLAnchorElement[]) => - currentUserLocation === LOCATION.EXPLORE.toLowerCase() && entity && entity.length > 0, - wrapper: (entity) => Array.prototype.slice.call(entity), - }, - { - locationName: LOCATION.TRENDING, - selector: 'querySelectorAll', - pathToSelect: 'article h1 a', - existenceChecker: (entity: HTMLAnchorElement[]) => - currentUserLocation === LOCATION.TRENDING.toLowerCase() && entity && entity.length > 0, - wrapper: (entity) => Array.prototype.slice.call(entity), - }, - { - locationName: LOCATION.PINNED_REPOS, - selector: 'querySelectorAll', - pathToSelect: '#user-repositories-list ul li h3 a', - existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, - wrapper: (entity) => Array.prototype.slice.call(entity), - }, - { - locationName: LOCATION.LIKED_REPOS, - selector: 'querySelectorAll', - pathToSelect: '.page-profile h3 a', - existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, - wrapper: (entity) => Array.prototype.slice.call(entity), - }, - { - locationName: LOCATION.UNKNOWN, - selector: undefined, - pathToSelect: undefined, - existenceChecker: undefined, - wrapper: undefined, - }, + { + /* + for example: https://github.com/artem-solovev?tab=repositories + */ + locationName: LOCATION.USER, + selector: 'querySelectorAll', + pathToSelect: '.js-pinned-items-reorder-container ol li a.text-bold.flex-auto.min-width-0', + pathToInsert: '.wb-break-all', + existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, + wrapper: (entity) => Array.prototype.slice.call(entity), + }, + { + locationName: LOCATION.ORGANIZATION, + selector: 'querySelectorAll', + pathToSelect: '.repo-list h3 a', + existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, + wrapper: (entity) => Array.prototype.slice.call(entity), + }, + { + locationName: LOCATION.SEARCH, + selector: 'querySelectorAll', + pathToSelect: '.codesearch-results ul li a.v-align-middle', + existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, + wrapper: (entity) => Array.prototype.slice.call(entity), + }, + { + locationName: LOCATION.SINGLE, + selector: 'querySelector', + pathToSelect: '.application-main h1 strong a', + /* + for example: https://github.com/artem-solovev/gloc + */ + pathToInsert: '.public', + existenceChecker: (entity: HTMLAnchorElement[]) => Boolean(entity), + wrapper: (entity: HTMLAnchorElement) => [entity], + }, + { + locationName: LOCATION.EXPLORE, + selector: 'querySelectorAll', + pathToSelect: 'article h1 a.text-bold', + existenceChecker: (entity: HTMLAnchorElement[]) => + currentUserLocation === LOCATION.EXPLORE.toLowerCase() && entity && entity.length > 0, + wrapper: (entity) => Array.prototype.slice.call(entity), + }, + { + locationName: LOCATION.TRENDING, + selector: 'querySelectorAll', + pathToSelect: 'article h1 a', + existenceChecker: (entity: HTMLAnchorElement[]) => + currentUserLocation === LOCATION.TRENDING.toLowerCase() && entity && entity.length > 0, + wrapper: (entity) => Array.prototype.slice.call(entity), + }, + { + /* + for example: https://github.com/artem-solovev + */ + locationName: LOCATION.PINNED_REPOS, + selector: 'querySelectorAll', + pathToSelect: '#user-repositories-list ul li h3 a', + existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, + wrapper: (entity) => Array.prototype.slice.call(entity), + }, + { + locationName: LOCATION.LIKED_REPOS, + selector: 'querySelectorAll', + pathToSelect: '.page-profile h3 a', + existenceChecker: (entity: HTMLAnchorElement[]) => entity && entity.length > 0, + wrapper: (entity) => Array.prototype.slice.call(entity), + }, + { + locationName: LOCATION.UNKNOWN, + selector: undefined, + pathToSelect: undefined, + existenceChecker: undefined, + wrapper: undefined, + }, ]; \ No newline at end of file diff --git a/src/inject.ts b/src/inject.ts index bfd79f5..034e0dc 100644 --- a/src/inject.ts +++ b/src/inject.ts @@ -35,10 +35,10 @@ let githubToken = ''; const gloc = (): void => { getLinksFromDom() - .then(links => { - renderLocs(links, githubToken); + .then(linksData => { + renderLocs(linksData, githubToken); - log('info', links); + log('info', linksData); }) .catch(err => log('err', err)); }; diff --git a/src/types.ts b/src/types.ts index c177e0c..fd816b8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,7 @@ export interface InitialData { location: LOCATION; links: HTMLAnchorElement[]; + linksToInsert: HTMLAnchorElement[]; } export enum LOCATION { diff --git a/src/utils/getLinksFromDom.ts b/src/utils/getLinksFromDom.ts index eb1246e..ba692fa 100644 --- a/src/utils/getLinksFromDom.ts +++ b/src/utils/getLinksFromDom.ts @@ -3,11 +3,11 @@ import { parametersToMap } from '../configs/parametersToMap'; import { scrapData } from './scrapData'; -export const getLinksFromDom = (): Promise => { +export const getLinksFromDom = (): Promise => { const data = scrapData(parametersToMap) as InitialData; if (data.location !== LOCATION.UNKNOWN && data.links.length > 0) { - return Promise.resolve(data.links); + return Promise.resolve(data); } else { return Promise.reject('Error: unknown location for counting LOC (lines of code)'); } diff --git a/src/utils/renderBadge.ts b/src/utils/renderBadge.ts index 8e548a8..4ec7e65 100644 --- a/src/utils/renderBadge.ts +++ b/src/utils/renderBadge.ts @@ -9,18 +9,18 @@ import { getBgColorForLoc } from './getBgColorForLoc'; * @return {html} */ export const renderBadge = (lines: string) => { - const defaultRadiusSize = '4px'; - const paddingSize = '2px 6px'; - const fontSize = '12px'; + const defaultRadiusSize = '4px'; + const paddingSize = '2px 6px'; + const fontSize = '12px'; - const commonStyles = ` + const commonStyles = ` padding: ${paddingSize}; font-size: ${fontSize}; font-weight: 500; `; - return ( - `
+ return ( + `
{ - links.map((anchor: HTMLAnchorElement) => { +export const renderLocs = (linksData: InitialData, token: string) => { + linksData.links.map((anchor: HTMLAnchorElement, index) => { const reponame = anchor.getAttribute('href'); + const placeToInsert = linksData.linksToInsert[index] || anchor; + if (reponame) { requestLoc(reponame, TRIES_DEFAULT, token) - .then(loc => renderLoc(anchor, formatOutput(loc))) + .then(loc => renderLoc(placeToInsert, formatOutput(loc))) .catch(err => console.error(`Error by setting LOC for ${reponame}`, err)); } }); diff --git a/src/utils/scrapData.ts b/src/utils/scrapData.ts index ebdcd85..41346c2 100644 --- a/src/utils/scrapData.ts +++ b/src/utils/scrapData.ts @@ -2,26 +2,37 @@ import { ParameterToMap, ExistenceChecker, Wrapper } from '../configs/parameters import { LOCATION, InitialData } from '../types'; export const scrapData = (parameters: ParameterToMap[]): InitialData | void => { - for (let i = 0; i < parameters.length; i++) { - const config = parameters[i]; + for (let i = 0; i < parameters.length; i++) { + const config = parameters[i]; - const { locationName, selector, pathToSelect, existenceChecker, wrapper } = config; + const { + locationName, + selector, + pathToSelect, + pathToInsert, + existenceChecker, + wrapper, + } = config; - if (locationName === LOCATION.UNKNOWN) { - return { - location: LOCATION.UNKNOWN, - links: [], - } - } + if (locationName === LOCATION.UNKNOWN) { + return { + location: LOCATION.UNKNOWN, + links: [], + linksToInsert: [], + }; + } - //@ts-ignore - const entity = document[selector](pathToSelect); + // @ts-ignore + const entity = document[selector](pathToSelect); + // @ts-ignore + const entityToInsert = document[selector](pathToInsert); - if ((existenceChecker as ExistenceChecker)(entity)) { - return { - location: locationName, - links: (wrapper as Wrapper)(entity) as HTMLAnchorElement[], - }; - } - } -} \ No newline at end of file + if ((existenceChecker as ExistenceChecker)(entity)) { + return { + location: locationName, + links: (wrapper as Wrapper)(entity) as HTMLAnchorElement[], + linksToInsert: (wrapper as Wrapper)(entityToInsert) as HTMLAnchorElement[], + }; + } + } +}; From c63529db9abaf0a29207fa005e856bd78b6bdb6c Mon Sep 17 00:00:00 2001 From: Artem Solovev Date: Sat, 6 Jun 2020 23:25:41 +0300 Subject: [PATCH 3/5] feature/NOTASK Up version script --- .env | 1 + README.md | 8 +- manifest.json | 86 ++-- package-lock.json | 395 ++++++++++++++++-- package.json | 59 +-- scripts/upAppVersion.js | 17 + src/modules/Common/helpers/appConfig.ts | 14 + .../Popup/components/Header/Header.tsx | 91 ++-- src/modules/Popup/index.tsx | 2 +- webpack.config.dev.js | 2 + webpack.config.prod.js | 2 + 11 files changed, 530 insertions(+), 147 deletions(-) create mode 100644 .env create mode 100644 scripts/upAppVersion.js create mode 100644 src/modules/Common/helpers/appConfig.ts diff --git a/.env b/.env new file mode 100644 index 0000000..5e9e47d --- /dev/null +++ b/.env @@ -0,0 +1 @@ +APP_VERSION=8.2.7 diff --git a/README.md b/README.md index 20ab826..f1d71d7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![Chrome Web Store](https://img.shields.io/chrome-web-store/d/kaodcnpebhdbpaeeemkiobcokcnegdki.svg?style=flat-square)]() -[![Chrome Web Store](https://img.shields.io/chrome-web-store/v/kaodcnpebhdbpaeeemkiobcokcnegdki.svg?style=flat-square)]() -[![Chrome Web Store](https://img.shields.io/chrome-web-store/rating-count/kaodcnpebhdbpaeeemkiobcokcnegdki.svg?style=flat-square)]() +![Chrome Web Store](https://img.shields.io/chrome-web-store/d/kaodcnpebhdbpaeeemkiobcokcnegdki.svg?style=flat-square) +![Chrome Web Store](https://img.shields.io/chrome-web-store/v/kaodcnpebhdbpaeeemkiobcokcnegdki.svg?style=flat-square) +![Chrome Web Store](https://img.shields.io/chrome-web-store/rating-count/kaodcnpebhdbpaeeemkiobcokcnegdki.svg?style=flat-square) ___ # Browser extension GLOC ( [Chrome](https://chrome.google.com/webstore/detail/gloc-github-counter-lines/kaodcnpebhdbpaeeemkiobcokcnegdki?utm_source=chrome-ntp-icon), [Opera](), [Firefox](https://addons.mozilla.org/en-US/firefox/addon/gloc/) ) @@ -10,7 +10,7 @@ ___ ## History ### Version: -- current: 8.2.5 ( 2020, 15 may ) +- current: 8.2.8 ( 2020, 6 june ) - initial: 2.0.1 ( 2017, 12 february ) I made this program in the Russian Army while I was on duty. I was coding as fast as i could ))) diff --git a/manifest.json b/manifest.json index a648d9f..018d063 100644 --- a/manifest.json +++ b/manifest.json @@ -1,44 +1,44 @@ { - "manifest_version": 2, - "default_locale": "en", - - "name": "__MSG_name__", - "short_name": "__MSG_shortName__", - "author": "__MSG_author__", - "description": "__MSG_description__", - "version": "8.2.5", - - "browser_action": { - "default_icon": "img/icon128.png", - "default_popup": "index.html", - "default_title": "Github Gloc" - }, - - "options_ui": { - "page": "options.html" - }, - - "options_page": "options.html", - - "content_scripts": [ - { - "matches": ["*://github.com/*"], - - "js": ["src/inject.js"] - } - ], - - "background": { - "scripts": ["src/background.js"], - "persistent": false - }, - - "permissions": ["storage", "*://*.github.com/*"], - - "icons": { - "16": "img/icon16.png", - "32": "img/icon32.png", - "64": "img/icon64.png", - "128": "img/icon128.png" - } -} + "manifest_version": 2, + "default_locale": "en", + "name": "__MSG_name__", + "short_name": "__MSG_shortName__", + "author": "__MSG_author__", + "description": "__MSG_description__", + "version": "8.2.7", + "browser_action": { + "default_icon": "img/icon128.png", + "default_popup": "index.html", + "default_title": "Github Gloc" + }, + "options_ui": { + "page": "options.html" + }, + "options_page": "options.html", + "content_scripts": [ + { + "matches": [ + "*://github.com/*" + ], + "js": [ + "src/inject.js" + ] + } + ], + "background": { + "scripts": [ + "src/background.js" + ], + "persistent": false + }, + "permissions": [ + "storage", + "*://*.github.com/*" + ], + "icons": { + "16": "img/icon16.png", + "32": "img/icon32.png", + "64": "img/icon64.png", + "128": "img/icon128.png" + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 712b908..ac3e884 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gloc", - "version": "8.2.5", + "version": "8.2.8", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2330,6 +2330,12 @@ "@types/filesystem": "*" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/filesystem": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.29.tgz", @@ -2359,6 +2365,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz", "integrity": "sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA==" }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", @@ -2723,6 +2735,7 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, + "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -2861,7 +2874,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "dev": true, + "optional": true }, "assign-symbols": { "version": "1.0.0", @@ -3607,6 +3621,12 @@ "tslib": "^1.9.0" } }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -3790,6 +3810,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, + "optional": true, "requires": { "delayed-stream": "~1.0.0" } @@ -3806,6 +3827,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -3855,7 +3882,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "constants-browserify": { "version": "1.0.0", @@ -4000,6 +4028,39 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "dependencies": { + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, "crc": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", @@ -4297,13 +4358,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "dev": true, + "optional": true }, "des.js": { "version": "1.0.0", @@ -4446,6 +4509,30 @@ "domelementtype": "1" } }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", + "dev": true + }, + "dotenv-defaults": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.1.1.tgz", + "integrity": "sha512-6fPRo9o/3MxKvmRZBD3oNFdxODdhJtIy1zcJeUSCs6HCy4tarUpd+G67UTU9tF6OWXeSPqsm4fPAB+2eY9Rt9Q==", + "dev": true, + "requires": { + "dotenv": "^6.2.0" + } + }, + "dotenv-webpack": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.8.0.tgz", + "integrity": "sha512-o8pq6NLBehtrqA8Jv8jFQNtG9nhRtVqmoD4yWbgUyoU3+9WBlPe+c2EAiaJok9RB28QvrWvdWLZGeTT5aATDMg==", + "dev": true, + "requires": { + "dotenv-defaults": "^1.0.2" + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -4516,6 +4603,12 @@ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", "dev": true }, + "envfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/envfile/-/envfile-6.2.0.tgz", + "integrity": "sha512-uBtjfjCuBa3HNHsMV3NB17/sZMNMLmdSWHczoGnvB9bAJanoZXjyKoWqEv30qN98Bk0F/sR3pFwOSjcxwnI6+w==", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -4983,7 +5076,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "dev": true, + "optional": true }, "fast-deep-equal": { "version": "1.1.0", @@ -5101,6 +5195,15 @@ "pinkie-promise": "^2.0.0" } }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, "findup-sync": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", @@ -5289,7 +5392,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5310,12 +5414,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5330,17 +5436,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5457,7 +5566,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5469,6 +5579,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5483,6 +5594,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5490,12 +5602,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5514,6 +5628,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5594,7 +5709,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5606,6 +5722,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5691,7 +5808,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5727,6 +5845,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5746,6 +5865,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5790,12 +5910,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -5829,6 +5951,7 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, + "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -5845,6 +5968,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5854,6 +5978,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5865,6 +5990,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6318,7 +6444,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "dev": true, + "optional": true }, "has-value": { "version": "1.0.0", @@ -6557,6 +6684,140 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", @@ -6594,6 +6855,24 @@ "prebuild-install": "^2.3.0" } }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -7050,11 +7329,6 @@ "dev": true, "optional": true }, - "jquery": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.0.tgz", - "integrity": "sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ==" - }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -7080,7 +7354,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "dev": true, + "optional": true }, "jsesc": { "version": "2.5.2", @@ -7224,6 +7499,12 @@ } } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -7518,13 +7799,15 @@ "version": "1.38.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true + "dev": true, + "optional": true }, "mime-types": { "version": "2.1.22", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, + "optional": true, "requires": { "mime-db": "~1.38.0" } @@ -7860,6 +8143,7 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, + "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -8291,6 +8575,12 @@ "mimic-fn": "^1.0.0" } }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -8412,6 +8702,23 @@ "no-case": "^2.2.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, "parse-asn1": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", @@ -8595,6 +8902,15 @@ } } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", @@ -9262,7 +9578,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "optional": true }, "scheduler": { "version": "0.18.0", @@ -9309,6 +9626,18 @@ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, "serialize-javascript": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", @@ -10610,6 +10939,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -10618,7 +10948,8 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "dev": true, + "optional": true }, "type-check": { "version": "0.3.2", @@ -11662,14 +11993,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true, - "optional": true + "dev": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "optional": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -11763,6 +12094,12 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", diff --git a/package.json b/package.json index adf895f..37ca0cf 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,47 @@ { "name": "gloc", - "version": "8.2.5", + "version": "8.2.8", "description": "Extension counts the number of lines of code in GitHub pages.", - "main": "index.js", - "scripts": { - "pack:dev": "webpack --config webpack.config.prod", - "pack:prod": "webpack --config webpack.config.dev", - "zip": "grunt", - "build:prod": "webpack --config webpack.config.prod && grunt", - "build:dev": "webpack --config webpack.config.dev && grunt" + "author": "Artem Solovev", + "license": "GPL-2.0", + "bugs": { + "url": "https://github.com/artem-solovev/gloc/issues" }, + "homepage": "https://github.com/artem-solovev/gloc#readme", "repository": { "type": "git", "url": "git+https://github.com/artem-solovev/gloc.git" }, "keywords": [ "code", - "counter" + "counter", + "github", + "sloc" ], - "author": "Artem Solovev", - "license": "GPL-2.0", - "bugs": { - "url": "https://github.com/artem-solovev/gloc/issues" + "main": "index.js", + "scripts": { + "pack:dev": "webpack --config webpack.config.prod", + "pack:prod": "webpack --config webpack.config.dev", + "zip": "grunt", + "build:prod": "webpack --config webpack.config.prod && grunt", + "build:dev": "webpack --config webpack.config.dev && grunt", + "version:up": "npm version patch --no-git-tag-version --force && git add package.json package-lock.json && node ./scripts/upAppVersion.js" + }, + "husky": { + "hooks": { + "pre-commit": "npm run version:up" + } + }, + "dependencies": { + "@types/node": "^12.12.14", + "@types/react": "^16.9.13", + "@types/react-dom": "^16.9.4", + "@types/styled-components": "^4.4.0", + "pjax": "^0.2.8", + "react": "^16.12.0", + "react-dom": "^16.12.0", + "styled-components": "^4.4.1" }, - "homepage": "https://github.com/artem-solovev/gloc#readme", "devDependencies": { "@babel/core": "^7.7.4", "@babel/preset-env": "^7.7.4", @@ -34,6 +52,8 @@ "babel-plugin-import": "^1.13.0", "copy-webpack-plugin": "^4.6.0", "cross-env": "^6.0.3", + "dotenv-webpack": "^1.8.0", + "envfile": "^6.2.0", "eslint": "^4.19.1", "eslint-config-google": "^0.9.1", "eslint-plugin-react": "^7.14.2", @@ -43,6 +63,7 @@ "grunt-contrib-compress": "^1.4.3", "html-loader": "^0.5.5", "html-webpack-plugin": "^3.2.0", + "husky": "^4.2.5", "node-json-minify": "^1.0.0", "react-iframe": "^1.8.0", "ts-loader": "^5.3.3", @@ -53,15 +74,5 @@ "url-loader": "^1.1.2", "webpack": "^4.29.0", "webpack-cli": "^3.3.0" - }, - "dependencies": { - "@types/node": "^12.12.14", - "@types/react": "^16.9.13", - "@types/react-dom": "^16.9.4", - "@types/styled-components": "^4.4.0", - "pjax": "^0.2.8", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "styled-components": "^4.4.1" } } diff --git a/scripts/upAppVersion.js b/scripts/upAppVersion.js new file mode 100644 index 0000000..5e0d18c --- /dev/null +++ b/scripts/upAppVersion.js @@ -0,0 +1,17 @@ +const fs = require('fs'); +const envfile = require('envfile'); + +const package = require('../package.json'); +const manifest = require('../manifest.json'); + +// update .env file +const sourcePath = '.env' +let parsedFile = envfile.parse(sourcePath); +parsedFile.APP_VERSION = package.version; +fs.writeFileSync('./.env', envfile.stringify(parsedFile)); + +// update manifest +manifest.version = package.version; +fs.writeFileSync('./manifest.json', JSON.stringify(manifest, null, 4)); + +// TODO update readme \ No newline at end of file diff --git a/src/modules/Common/helpers/appConfig.ts b/src/modules/Common/helpers/appConfig.ts new file mode 100644 index 0000000..0f1dec8 --- /dev/null +++ b/src/modules/Common/helpers/appConfig.ts @@ -0,0 +1,14 @@ +/* tslint:disable:indent */ + +interface AppConfig { + /** + * base url + */ + appVersion?: string; +} + +const appConfig: AppConfig = { + appVersion: process.env.APP_VERSION, +}; + +export default appConfig; \ No newline at end of file diff --git a/src/modules/Popup/components/Header/Header.tsx b/src/modules/Popup/components/Header/Header.tsx index 376d848..6575122 100644 --- a/src/modules/Popup/components/Header/Header.tsx +++ b/src/modules/Popup/components/Header/Header.tsx @@ -1,69 +1,68 @@ import * as React from 'react'; import { - Container, - Row, - Column, - Center, + Container, + Column, } from '../../../Common/components/Layout/index'; import { Text } from '../../../Common/components/Text/index'; import { Header, Type } from '../../../Common/components/Header/index'; import { colors } from '../../../../theme/colors'; +import appConfig from '../../../Common/helpers/appConfig'; // import { decorationProps } from './index'; export default class Footer extends React.PureComponent { - onSettingsClick() { - chrome.tabs.create({url: 'chrome://extensions/?options=' + chrome.runtime.id}); - } + onSettingsClick() { + chrome.tabs.create({ url: 'chrome://extensions/?options=' + chrome.runtime.id }); + } render() { - const gloc = chrome.i18n.getMessage('shortName'); - const github = chrome.i18n.getMessage('github'); + const gloc = chrome.i18n.getMessage('shortName'); + const github = chrome.i18n.getMessage('github'); return ( - -
- + +
+ - - {github} - + + {github} + - - {gloc} - + + {gloc} + -
- Version: 8.2.5 -
+
+ Version: {appConfig.appVersion} +
- -
- - - - -
-
-
+ +
+ + + + +
+
+ ); } } diff --git a/src/modules/Popup/index.tsx b/src/modules/Popup/index.tsx index 1e8a8e8..5c3ae16 100644 --- a/src/modules/Popup/index.tsx +++ b/src/modules/Popup/index.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { Header } from './components/Header/index'; import { Footer } from './components/Footer/index'; -import { Body } from './components/Body/index'; +// import { Body } from './components/Body/index'; export default class PopupPage extends React.PureComponent { render() { diff --git a/webpack.config.dev.js b/webpack.config.dev.js index 6b23aab..71ae2b1 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -4,6 +4,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const JSONMinifyPlugin = require('node-json-minify'); +const Dotenv = require('dotenv-webpack'); const JSconfig = { mode: 'development', @@ -51,6 +52,7 @@ const JSconfig = { }, sourceMap: true, }), + new Dotenv(), ], }; diff --git a/webpack.config.prod.js b/webpack.config.prod.js index 93b8b7a..56d81e1 100644 --- a/webpack.config.prod.js +++ b/webpack.config.prod.js @@ -4,6 +4,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const JSONMinifyPlugin = require('node-json-minify'); +const Dotenv = require('dotenv-webpack'); const JSconfig = { mode: 'production', @@ -51,6 +52,7 @@ const JSconfig = { }, sourceMap: false, }), + new Dotenv(), ], }; From 0a39a5d69020e33fea9720e61b39092fd40b5d1a Mon Sep 17 00:00:00 2001 From: Artem Solovev Date: Sat, 6 Jun 2020 23:57:11 +0300 Subject: [PATCH 4/5] feature/NOTASK Added funding knobs --- .env | 5 +- .github/FUNDING.yml | 1 + manifest.json | 2 +- package-lock.json | 2 +- package.json | 2 +- src/modules/Common/helpers/appConfig.ts | 14 ++- .../Popup/components/Footer/Footer.tsx | 105 +++++++++++------- 7 files changed, 84 insertions(+), 47 deletions(-) diff --git a/.env b/.env index 5e9e47d..a2267c6 100644 --- a/.env +++ b/.env @@ -1 +1,4 @@ -APP_VERSION=8.2.7 +APP_VERSION=8.2.8 + +PAYPAL_URL='https://www.paypal.me/ArtemSolovev' +OPENCOLLECTIVE_URL='https://opencollective.com/artem-solovev' diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 1b5455f..a2f638c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ custom: ["https://www.paypal.me/ArtemSolovev"] +open_collective: artem-solovev diff --git a/manifest.json b/manifest.json index 018d063..f234e42 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "short_name": "__MSG_shortName__", "author": "__MSG_author__", "description": "__MSG_description__", - "version": "8.2.7", + "version": "8.2.8", "browser_action": { "default_icon": "img/icon128.png", "default_popup": "index.html", diff --git a/package-lock.json b/package-lock.json index ac3e884..711a843 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gloc", - "version": "8.2.8", + "version": "8.2.9", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 37ca0cf..4849c76 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gloc", - "version": "8.2.8", + "version": "8.2.9", "description": "Extension counts the number of lines of code in GitHub pages.", "author": "Artem Solovev", "license": "GPL-2.0", diff --git a/src/modules/Common/helpers/appConfig.ts b/src/modules/Common/helpers/appConfig.ts index 0f1dec8..890ad68 100644 --- a/src/modules/Common/helpers/appConfig.ts +++ b/src/modules/Common/helpers/appConfig.ts @@ -2,13 +2,21 @@ interface AppConfig { /** - * base url + * base */ - appVersion?: string; + appVersion: string; + + /** + * payments + */ + paypalUrl: string; + opencollectiveUrl: string; } const appConfig: AppConfig = { - appVersion: process.env.APP_VERSION, + appVersion: process.env.APP_VERSION as string, + paypalUrl: process.env.PAYPAL_URL as string, + opencollectiveUrl: process.env.OPENCOLLECTIVE_URL as string, }; export default appConfig; \ No newline at end of file diff --git a/src/modules/Popup/components/Footer/Footer.tsx b/src/modules/Popup/components/Footer/Footer.tsx index 99f46d1..85a1e33 100644 --- a/src/modules/Popup/components/Footer/Footer.tsx +++ b/src/modules/Popup/components/Footer/Footer.tsx @@ -3,62 +3,87 @@ import Iframe from 'react-iframe'; import { colors } from '../../../../theme/colors'; import { - Container, - Row, - Column, - Center, + Container, + Row, + Column, + Center, } from '../../../Common/components/Layout/index'; import { Text } from '../../../Common/components/Text/index'; import { Anchor } from '../../../Common/components/Anchor/index'; +import appConfig from '../../../Common/helpers/appConfig'; import { decorationProps } from './index'; export default class Footer extends React.PureComponent { render() { - const linkMsg = chrome.i18n.getMessage('translateOurApp'); - // const titleMsg = chrome.i18n.getMessage('attentionPlease'); + const linkMsg = chrome.i18n.getMessage('translateOurApp'); + // const titleMsg = chrome.i18n.getMessage('attentionPlease'); return ( - - {/* -
-

- {titleMsg} -

-
-
*/} + + + + +
+