From 6beaae1c85472ecaa0d1cdf53f9b9b9be76a27eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=EC=84=B1=20=28Kim=2C=20Jaesung=29?= <15705385+sundoufu@users.noreply.github.com> Date: Sun, 12 Sep 2021 18:43:29 +0900 Subject: [PATCH 1/6] hotfix: add required digestmod param of hmac init --- apps/session/sparcsssov2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/session/sparcsssov2.py b/apps/session/sparcsssov2.py index 989e5fe8c..3dfac8052 100644 --- a/apps/session/sparcsssov2.py +++ b/apps/session/sparcsssov2.py @@ -1,4 +1,5 @@ import hmac +import hashlib import time from secrets import token_hex from urllib.parse import urlencode @@ -52,7 +53,7 @@ def _sign_payload(self, payload, append_timestamp=True): payload.append(timestamp) msg = ''.join(list(map(str, payload))).encode() - sign = hmac.new(self.secret_key, msg).hexdigest() + sign = hmac.new(self.secret_key, msg, hashlib.md5).hexdigest() return sign, timestamp def _validate_sign(self, payload, timestamp, sign): From ed66a654c18dbfc258f08fc088326dc4018b5967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=EC=84=B1=20=28Kim=2C=20Jaesung=29?= <15705385+sundoufu@users.noreply.github.com> Date: Sun, 12 Sep 2021 18:45:59 +0900 Subject: [PATCH 2/6] (#827) add django-cors-headers dependency --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3ffc9d95f..8b5681e3d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ apiclient==1.0.4 Django==2.2.24 +django-cors-headers==3.8.0 httplib2==0.19.1 icalendar==4.0.7 mysqlclient==2.0.3 @@ -19,4 +20,4 @@ flake8==3.9.2 black==21.6b0 pytest==6.2.4 pytest-django==4.4.0 -pytest-cov==2.12.1 \ No newline at end of file +pytest-cov==2.12.1 From 39355d414ccdec0b9d4812a108ea53a4b4adb749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=EC=84=B1=20=28Kim=2C=20Jaesung=29?= <15705385+sundoufu@users.noreply.github.com> Date: Sun, 12 Sep 2021 18:47:52 +0900 Subject: [PATCH 3/6] (#827) fix error while importing settings_local --- otlplus/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/otlplus/settings.py b/otlplus/settings.py index 821bf1f7a..baaf88aee 100644 --- a/otlplus/settings.py +++ b/otlplus/settings.py @@ -148,6 +148,6 @@ def ugettext(s): VERSION = "3.2.3.0" try: - from settings_local import * # noqa: F401, F403 + from .settings_local import * # noqa: F401, F403 except ImportError: pass From 5cdb0d4ec2b825eaafd555f413e4386714258483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=EC=84=B1=20=28Kim=2C=20Jaesung=29?= <15705385+sundoufu@users.noreply.github.com> Date: Sun, 12 Sep 2021 18:48:44 +0900 Subject: [PATCH 4/6] (#827) configure cors, cross domain cookie options --- apps/session/views.py | 1 + otlplus/settings.py | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/apps/session/views.py b/apps/session/views.py index 94968c62a..a9f539160 100644 --- a/apps/session/views.py +++ b/apps/session/views.py @@ -81,6 +81,7 @@ def user_login(request): def login_callback(request): state_before = request.session.get("sso_state", None) state = request.GET.get("state", None) + # TODO: server host 를 유지한채로 행해지는 모든 리디렉트 응답에 대해 새로운 리액트 앱 호스트를 사용한다 if state_before is None or state_before != state: return HttpResponseRedirect("/error/invalid-login") diff --git a/otlplus/settings.py b/otlplus/settings.py index baaf88aee..b60761b62 100644 --- a/otlplus/settings.py +++ b/otlplus/settings.py @@ -29,6 +29,17 @@ ALLOWED_HOSTS = [] +CORS_ALLOW_CREDENTIALS = True +CORS_ALLOW_ALL_ORIGINS = DEBUG +CORS_ALLOWED_ORIGINS = [ + "https://otl.kaist.ac.kr", +] +CSRF_TRUSTED_ORIGINS = [ + "localhost:3000" if DEBUG else "otl.kaist.ac.kr", +] + +SESSION_COOKIE_SAMESITE = None + # Application definition INSTALLED_APPS = ( @@ -44,9 +55,11 @@ "apps.review.appss.ReviewConfig", "apps.subject.appss.SubjectConfig", "apps.timetable.appss.TimetableConfig", + "corsheaders", ) MIDDLEWARE = [ + "corsheaders.middleware.CorsMiddleware", "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.locale.LocaleMiddleware", From 848d1768c92f84437f3245df61066dea8d0fb28b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=EC=84=B1=20=28Kim=2C=20Jaesung=29?= <15705385+sundoufu@users.noreply.github.com> Date: Sun, 12 Sep 2021 18:53:56 +0900 Subject: [PATCH 5/6] (#827) make react app request to separate api host --- react/package.json | 3 +-- react/src/common/apiBaseUrl.js | 1 + react/src/common/guideline/components/Header.js | 3 ++- react/src/index.js | 4 +++- 4 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 react/src/common/apiBaseUrl.js diff --git a/react/package.json b/react/package.json index 39cb29609..582903d4d 100644 --- a/react/package.json +++ b/react/package.json @@ -49,6 +49,5 @@ "eslint-plugin-jsx-a11y": "^6.3.1", "eslint-plugin-no-loops": "^0.3.0", "eslint-plugin-react": "^7.20.6" - }, - "proxy": "http://localhost:8000" + } } diff --git a/react/src/common/apiBaseUrl.js b/react/src/common/apiBaseUrl.js new file mode 100644 index 000000000..51c1b254f --- /dev/null +++ b/react/src/common/apiBaseUrl.js @@ -0,0 +1 @@ +export default process.env.NODE_ENV === 'production' ? 'https://api.otl.kaist.ac.kr' : 'http://localhost:8000'; diff --git a/react/src/common/guideline/components/Header.js b/react/src/common/guideline/components/Header.js index 761209e10..d1405c5fe 100644 --- a/react/src/common/guideline/components/Header.js +++ b/react/src/common/guideline/components/Header.js @@ -5,6 +5,7 @@ import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import { guidelineBoundClassNames as classNames, appBoundClassNames } from '../../boundClassNames'; +import API_BASE_URL from '../../apiBaseUrl'; import userShape from '../../../shapes/UserShape'; @@ -167,7 +168,7 @@ class Header extends Component { ) : ( - + {t('ui.menu.signIn')} diff --git a/react/src/index.js b/react/src/index.js index aac7c8185..70c1e98b0 100644 --- a/react/src/index.js +++ b/react/src/index.js @@ -58,11 +58,13 @@ i18n import axios from 'axios'; import Qs from 'qs'; +import API_BASE_URL from './common/apiBaseUrl'; axios.defaults.xsrfHeaderName = 'X-CSRFToken'; axios.defaults.xsrfCookieName = 'csrftoken'; -axios.defaults.baseURL = '/'; +axios.defaults.baseURL = API_BASE_URL; +axios.defaults.withCredentials = true; axios.defaults.paramsSerializer = (params) => Qs.stringify(params, { arrayFormat: 'repeat' }); From d00788fd9af6bf52148a6778c22c1c7e52b2e80d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9E=AC=EC=84=B1=20=28Kim=2C=20Jaesung=29?= <15705385+sundoufu@users.noreply.github.com> Date: Thu, 25 Nov 2021 00:14:13 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=EA=B0=9C=EC=9D=B8=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EC=B7=A8=EA=B8=89=EB=B0=A9=EC=B9=A8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- react/PRIVACY.md | 120 ++++ react/package-lock.json | 672 ++++++++++++++++++ react/package.json | 2 + react/src/App.js | 2 + .../src/common/guideline/components/Footer.js | 5 + react/src/pages/PrivacyPage.js | 30 + react/src/styles/App.module.scss | 51 +- react/src/translations/translation.en.json | 3 +- react/src/translations/translation.ko.json | 3 +- 9 files changed, 878 insertions(+), 10 deletions(-) create mode 100755 react/PRIVACY.md create mode 100644 react/src/pages/PrivacyPage.js diff --git a/react/PRIVACY.md b/react/PRIVACY.md new file mode 100755 index 000000000..c3906fc2d --- /dev/null +++ b/react/PRIVACY.md @@ -0,0 +1,120 @@ +# 개인정보취급방침 + +KAIST 학부 총학생회 산하 자치단체 SPARCS 소속 OTL 개발팀(이하 "개발팀")는 개인정보 보호법 제30조에 따라 과목사전 및 모의시간표 서비스 OTL (이하 "서비스")을 이용하는 사용자(이하 "사용자")의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립 및 공개합니다. + +## 1. 개인정보의 처리 목적 + +"개발팀"은 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며, 이용 목적이 변경되는 경우에는 개인정보 보호법 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행해야 합니다. + +- **회원 가입 및 관리.** **[SPARCS SSO의 개인정보취급방침](https://sparcssso.kaist.ac.kr/privacy/)** 을 따릅니다. +- **서비스 제공.** "개발팀"은 서비스를 제공하는 데 필요한 개인 데이터를 +수집하며, 여기에는 서비스를 향상하기 위해, 감사나 데이터 분석 등의 내부 목적을 위해 또는 문제 해결을 위해 수집되는 개인 데이터가 포함될 수 있습니다. 과목 사전 및 후기, 모의 시간표 기능이 포함됩니다. +- **사용자와의 통신.** 통신 내용에 응답하거나, "사용자"의 "서비스" 이용 또는 계정에 대해 "사용자"에게 연락하거나, 문제 해결을 위한 정보 제공을 요청하거나 제품에 대한 피드백을 요청하기 위한 것입니다. +- **법률 준수.** 법률 등에 의해 수사기관의 적법한 요청에 대응하기 위함입니다. + +## 2. 개인정보의 처리 및 보유 기간 + +- "개발팀"은 법령에 따른 개인정보 보유/이용기간 또는 "사용자"로부터 개인정보를 수집 시에 동의 받은 개인정보 보유/이용기간 내에서 개인정보를 처리/보유합니다. +- 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다. + - 회원 가입 및 관리. **[SPARCS SSO의 개인정보취급방침](https://sparcssso.kaist.ac.kr/privacy/)** 을 따릅니다. + - 그 외 + - "서비스" 탈퇴 시까지 + - 관계 법령 위반에 따른 수사조사 등이 진행 중인 경우에는 해당 수사조사 종료 시까지 + +## 3. 개인정보의 제3자 제공 + +"개발팀"은 정보주체의 개인정보를 『1. 개인정보의 처리 목적』 에서 명시한 범위 내에서만 처리하며, 정보주체의 동의, 법률의 특별한 규정 등 개인정보 보호법 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다. "개발팀"은 다음과 같이 개인정보를 제3자에게 제공하되, 제한된 정보 만을 제공하여 실제로 제3자가 개인에 관해 식별이 불가능하도록 하였습니다. + +- Google LLC (인터넷 서비스 제공 업체) + - 개인정보를 제공받는 자: Google LLC + - 제공받는 자의 개인정보 이용목적: "개발팀"이 "서비스"의 기능 향상을 위해서 Google로부터 필요로 하는 비즈니스 데이터 분석 기능 (Google Analytics) 제공, "개발팀"이 "서비스"의 문제 해결을 위해서 Googl로부터 필요로 하는 오류 보고 솔루션(Firebase Crashlytics)의 데이터 제공 + - 제공하는 개인정보 항목: 후기에 대한 비식별화된 "좋아요" 및 "신고" 활동 기록, 비식별화된 "사용자"가 "서비스"에 대해 평가를 내렸는지 여부, 비식별화된 모의 시간표 및 위시리스트 수정 기록, 비식별화된 후기 작성 기록, 오류 발생 시 해당 로그를 전송하는 "사용자"의 비식별화된 고유번호, 기기 정보 및 앱 정보 + +## 4. 정보주체와 법정대리인의 권리, 의무 및 행사방법 + +- 정보주체는 "개발팀"에 대해 언제든지 개인정보 열람/정정/삭제/처리정지 요구 등의 권리를 행사할 수 있습니다. +- 위 사항에 따른 권리 행사는 "개발팀"에 대해 전자우편 (주소: otlplus@sparcs.org) 을 통해 하실 수 있으며, "개발팀"은 해당 요청을 전달 받았을 경우 가능한 범위 내에서 지체 없이 조치해야 합니다. +- 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다. 이 경우 "개인정보 처리 방법에 대한 고시(제2020-7호)" 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다. +- 개인정보 열람 및 처리정지 요구는 개인정보보호법 제35조 제4항, 제37조 제2항에 의하여 정보주체의 권리가 제한될 수 있습니다. +- 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다. +- "개발팀"은 정보주체 권리에 따른 열람의 요구, 정정/삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지 확인해야 합니다. +- 그 외 SPARCS SSO 서비스에 의해 관리되는 개인 정보의 권리 행사에 관해서는 **[SPARCS SSO의 개인정보취급방침](https://sparcssso.kaist.ac.kr/privacy/)** 을 따릅니다. + +## 5. 처리하는 개인정보 항목 + +"개발팀"은 다음의 개인정보 항목을 처리하고 있습니다. + +- 회원 가입 및 관리 + - 필수항목: 학번 + - 선택항목: 이메일, SNS 계정 식별자 + - 그 외 **[SPARCS SSO의 개인정보취급방침](https://sparcssso.kaist.ac.kr/privacy/)** 에 정의되어 있는 항목 +- 과목 사전 및 후기 기능 제공 + - 필수항목: 소속학과, 전공, 수강한 강의 + - 선택항목: 관심학과, 작성한 후기 목록, 좋아요한 후기 목록, 신고한 후기 목록, 열람한 강좌 목록 +- 모의 시간표 기능 제공 + - 필수항목: 수강한 강의 + - 선택항목: 모의 시간표에 추가한 과목 목록, 위시리스트에 추가한 과목 목록 +- 번역 기능 제공 + - 선택항목: 사용 언어 +- 서비스 개선 + - 선택항목: "서비스" 자체에 "사용자"가 내린 별점 평가, 각 기능의 사용 시점과 관련 매개변수 + - 선택항목: "서비스" 이용 중 오류가 발생한 "사용자"의 식별자, 기기 및 앱 정보 +- 인터넷 서비스 이용과정에서 아래 개인정보 항목이 자동으로 생성되어 수집될 수 있습니다. + - IP주소, 쿠키, MAC주소, 서비스 이용기록, 방문기록 + +## 6. 개인정보 파기 절차 및 방법 + +- "개발팀"은 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당 개인정보를 파기합니다. +- "사용자"로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 계속 보존할 수 있습니다. +- 개인정보 파기의 절차 및 방법은 다음과 같습니다. + - 파기절차 + "개발팀"은 파기 사유가 발생한 개인정보를 선정하고, "사용자"의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다. + - 파기방법 + "개발팀"은 전자적 파일 형태로 기록/저장된 개인정보는 기록을 재생할 수 없도록 파기합니다. + +## 7. 개인정보의 안전성 확보 조치 + +"개발팀"은 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다. + +- 관리적 조치: 제한된 관리자에게만 접근 권한 허용 +- 기술적 조치: 클라우드 서비스에서 제공하는 방화벽 등의 보안 기능 사용, 비밀번호 해쉬화 저장, 비정상적 접속 감지 및 기록, 인증 과정에서의 암호화, 그 외 **[SPARCS SSO의 개인정보취급방침](https://sparcssso.kaist.ac.kr/privacy/)** 에 언급된 사항 + +## 8. 개인정보 자동 수집 장치의 설치/운영 및 거부 + +- "개발팀"은 "사용자"에게 로그인 세션 유지 기능을 제공하기 위해 이용정보를 저장하고 수시로 불러오는 '쿠키(Cookie)'를 사용합니다. + - 거부 방법: 웹 브라우저 설정에서 쿠키 사용을 비활성화하여 거부할 수 있습니다. + - 쿠키 저장을 거부할 경우 기능 상에 문제가 발생할 수 있습니다. +- "개발팀"은 데이터 분석을 통한 서비스 개선을 위해 Google Analytics 를 사용하여 사용 기록을 수집합니다. + - 거부 방법(웹): [Google Analytics 차단 브라우저 확장 기능](https://support.google.com/analytics/answer/181881?hl=ko) 을 설치하여 웹사이트 활동 제공을 차단할 수 있습니다. + - 거부 방법(앱): 현재 Firebase Flutter SDK의 기능 미구현으로 인해 Google Analytics 비활성화가 불가능합니다. 거부하시려면 모바일 웹 버전을 사용하여 주십시오. +- "개발팀"은 "서비스"의 모바일 애플리케이션에 한하여 오류 분석을 위해 Firebase Crashlytics를 사용하여 자동으로 수집합니다. + - 거부 방법: 앱 설정에서 "오류 로그 전송"을 꺼주십시오. 오류 로그에 "사용자"의 식별자가 포함되는 것을 거부하려면 "익명으로 전송"을 켜주십시오. + +## 9. 개인정보 보호책임자 + +- "개발팀"은 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 "사용자"의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다. + - 성명: 한승현 + - 직책: OTL 프로젝트 매니저 + - 연락처: otlplus@sparcs.org (개발팀으로 연결됩니다) +- "사용자"는 "서비스"를 이용하면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항 개인정보 보호책임자 및 개발팀에 문의할 수 있습니다. "개발팀"은 "사용자"의 문의에 대해 가능한 범위 내에서 지체없이 답변 및 처리해야 합니다. + +## 10. 추가적인 이용/제공 판단 기준 + +"개발팀"은 『개인정보 보호법』 제15조제3항 및 제17조제4항에 따라 『개인정보 보호법 시행령』 제14조의2에 따른 사항을 고려하여 "사용자"의 동의 없이 개인정보를 추가적으로 이용/제공할 수 있습니다. + +이에 따라 "개발팀"은 "사용자"의 동의 없이 추가적인 이용/제공을 하기 위해 다음과 같은 사항을 고려해야 합니다. + +- 개인정보를 추가적으로 이용/제공하려는 목적이 당초 수집 목적과 관련성이 있는지 여부 +- 개인정보를 수집한 정황 또는 처리 관행에 비추어 볼 때 추가적인 이용/제공에 대한 예측 가능성이 있는지 여부 +- 개인정보의 추가적인 이용/제공이 "사용자"의 이익을 부당하게 침해하였는지 여부 +- 가명처리 또는 암호화 등 안전성 확보에 필요한 조치를 하였는지 여부 + +추가적인 이용/제공 시 고려사항에 대한 판단기준은 "개발팀" 스스로 자율적으로 판단하여 작성/공개해야 합니다. + +## 11. 개인정보 열람청구 + +"사용자"는 『개인정보 보호법』 제35조에 따른 개인정보의 열람 청구는 『9. 개인정보 보호책임자』 에 명시된 연락처를 통해 가능합니다. + +## 12. 개인정보 처리방침 변경 + +이 개인정보 처리방침은 2021년 10월 xx일에 마지막으로 수정되었으며, 2021년 10월 xx일부터 적용됩니다. diff --git a/react/package-lock.json b/react/package-lock.json index 960e79e3f..0cb8ec237 100644 --- a/react/package-lock.json +++ b/react/package-lock.json @@ -1354,12 +1354,51 @@ "loader-utils": "^1.1.0" } }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "requires": { + "@types/ms": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/mdurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", + "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "@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==" + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", @@ -1370,6 +1409,11 @@ "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz", "integrity": "sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ==" }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, "@webassemblyjs/ast": { "version": "1.7.11", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", @@ -2814,6 +2858,11 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -3331,6 +3380,11 @@ "supports-color": "^2.0.0" } }, + "character-entities": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.1.tgz", + "integrity": "sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ==" + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -3702,6 +3756,11 @@ "delayed-stream": "~1.0.0" } }, + "comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==" + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -4654,6 +4713,14 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decode-named-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.0.tgz", + "integrity": "sha512-KTiXDlRp9MMm/nlgI8rDGKoNNKiTJBl0RPjnBM680m2HlgJEA4JTASspK44lsvE4GQJildMRFp2HdEBiG+nqng==", + "requires": { + "character-entities": "^2.0.0" + } + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -4831,6 +4898,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -7749,6 +7821,11 @@ "minimalistic-assert": "^1.0.1" } }, + "hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==" + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -8480,6 +8557,11 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "inquirer": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", @@ -8651,6 +8733,11 @@ "binary-extensions": "^1.0.0" } }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-callable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", @@ -8801,6 +8888,11 @@ "path-is-inside": "^1.0.1" } }, + "is-plain-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.0.0.tgz", + "integrity": "sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw==" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -10328,6 +10420,11 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -10491,6 +10588,11 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -10738,11 +10840,78 @@ "safe-buffer": "^5.1.2" } }, + "mdast-util-definitions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz", + "integrity": "sha512-5hcR7FL2EuZ4q6lLMUK5w4lHT2H3vqL9quPvYZ/Ku5iifrirfMHiGdhxdXMUbUkDmz5I+TYMd7nbaxUhbQkfpQ==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^3.0.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", + "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^4.0.0" + } + } + } + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-hast": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-11.3.0.tgz", + "integrity": "sha512-4o3Cli3hXPmm1LhB+6rqhfsIUBjnKFlIUZvudaermXB+4/KONdd/W4saWWkC+LBLbPMqhFSSTSRgafHsT5fVJw==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/mdurl": "^1.0.0", + "mdast-util-definitions": "^5.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==" + }, "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -10829,6 +10998,233 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, + "micromark": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.9.tgz", + "integrity": "sha512-aWPjuXAqiFab4+oKLjH1vSNQm8S9GMnnf5sFNLrQaIggGYMBcQ9CS0Tt7+BJH6hbyv783zk3vgDhaORl3K33IQ==", + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "micromark-core-commonmark": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.5.tgz", + "integrity": "sha512-ZNtWumX94lpiyAu/lxvth6I5+XzxF+BLVUB7u60XzOBy4RojrbZqrx0mcRmbfqEMO6489vyvDfIQNv5hdulrPg==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-factory-destination": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-space": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "requires": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-encode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.0.tgz", + "integrity": "sha512-cJpFVM768h6zkd8qJ1LNRrITfY4gwFt+tziPcIf71Ui8yFzY9wG3snZQqiWVq93PG4Sw6YOtcNiKJfVIs9qfGg==" + }, + "micromark-util-html-tag-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz", + "integrity": "sha512-NenEKIshW2ZI/ERv9HtFNsrn3llSPZtY337LID/24WeLqMzeZhBEE6BQ0vS2ZBjshm5n40chKtJ3qjAbVV8S0g==" + }, + "micromark-util-normalize-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", + "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-util-symbol": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.0.tgz", + "integrity": "sha512-NZA01jHRNCt4KlOROn8/bGi6vvpEmlXld7EHcRH+aYWUfL3Wc8JLUNNlqUMKa0hhz6GrpUWsHtzPmKof57v0gQ==" + }, + "micromark-util-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==" + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -11018,6 +11414,11 @@ "run-queue": "^1.0.3" } }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -15949,6 +16350,11 @@ "react-is": "^16.8.1" } }, + "property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -16123,6 +16529,68 @@ } } }, + "raw.macro": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/raw.macro/-/raw.macro-0.4.2.tgz", + "integrity": "sha512-Z+zKtCweyJ3lGYdUNq/BQwfzqQE2wrXjz0RNEes5nDniPpjvBw64sKYFXStJSfmZUmiBxv4DsN1lto982UAhFQ==", + "requires": { + "babel-plugin-macros": "^2.8.0" + }, + "dependencies": { + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "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" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "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==" + }, + "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==" + } + } + }, "react": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", @@ -16381,6 +16849,34 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-markdown": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-7.1.0.tgz", + "integrity": "sha512-hL8cLLkTydyoKlZWZOjlU6TvMYIw9qKLh1CCzVfnhKt/R/SnKVAqiyugetXY61CkjhBqJl2C5FdU3OwHYo7SrQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^17.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^9.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.3.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + } + }, "react-redux": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.1.tgz", @@ -17155,6 +17651,27 @@ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "remark-rehype": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-9.1.0.tgz", + "integrity": "sha512-oLa6YmgAYg19zb0ZrBACh40hpBLteYROaPLhBXzLgjqyHQrN+gVP9N/FJvfzuNNuzCutktkroXEZBrxAxKhh7Q==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^11.0.0", + "unified": "^10.0.0" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -17388,6 +17905,14 @@ "tslib": "^1.9.0" } }, + "sade": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz", + "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==", + "requires": { + "mri": "^1.1.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -18300,6 +18825,11 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==" + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -18655,6 +19185,14 @@ "schema-utils": "^1.0.0" } }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", @@ -19108,6 +19646,11 @@ "hoek": "4.x.x" } }, + "totalist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz", + "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -19135,6 +19678,11 @@ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, + "trough": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.0.2.tgz", + "integrity": "sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w==" + }, "true-case-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", @@ -19272,6 +19820,20 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" }, + "unified": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.1.tgz", + "integrity": "sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w==", + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -19309,6 +19871,67 @@ "imurmurhash": "^0.1.4" } }, + "unist-builder": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", + "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-generated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", + "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==" + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" + }, + "unist-util-position": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.1.tgz", + "integrity": "sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA==" + }, + "unist-util-stringify-position": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz", + "integrity": "sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.0.tgz", + "integrity": "sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "dependencies": { + "unist-util-visit-parents": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz", + "integrity": "sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + } + } + }, + "unist-util-visit-parents": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", + "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -19469,6 +20092,30 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, + "uvu": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.2.tgz", + "integrity": "sha512-m2hLe7I2eROhh+tm3WE5cTo/Cv3WQA7Oc9f7JB6uWv+/zVKvfAm53bMyOoGOSZeQ7Ov2Fu9pLhFr7p07bnT20w==", + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3", + "totalist": "^2.0.0" + }, + "dependencies": { + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "kleur": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", + "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==" + } + } + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -19503,6 +20150,26 @@ "extsprintf": "^1.2.0" } }, + "vfile": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.2.0.tgz", + "integrity": "sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.0.2.tgz", + "integrity": "sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -20588,6 +21255,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", diff --git a/react/package.json b/react/package.json index 582903d4d..8f2e02a5d 100644 --- a/react/package.json +++ b/react/package.json @@ -17,10 +17,12 @@ "node-sass": "^4.14.1", "prop-types": "^15.7.2", "qs": "^6.9.4", + "raw.macro": "^0.4.2", "react": "^16.13.1", "react-dom": "^16.13.1", "react-ga": "^3.1.2", "react-i18next": "^11.7.2", + "react-markdown": "^7.1.0", "react-redux": "^7.2.1", "react-router": "^5.2.1", "react-router-dom": "^4.2.2", diff --git a/react/src/App.js b/react/src/App.js index 71f86d7bd..e9b4adb45 100644 --- a/react/src/App.js +++ b/react/src/App.js @@ -14,6 +14,7 @@ import MainPage from './pages/MainPage'; import AccountPage from './pages/AccountPage'; import CreditPage from './pages/CreditPage'; import LicensePage from './pages/LicensePage'; +import PrivacyPage from './pages/PrivacyPage'; import TestPage from './pages/TestPage'; import ErrorPage from './pages/ErrorPage'; @@ -155,6 +156,7 @@ class App extends Component { + {/* Temporary test page for axiom */} diff --git a/react/src/common/guideline/components/Footer.js b/react/src/common/guideline/components/Footer.js index 484c760b1..31cecd6e7 100644 --- a/react/src/common/guideline/components/Footer.js +++ b/react/src/common/guideline/components/Footer.js @@ -34,6 +34,11 @@ class Footer extends Component { {t('ui.menu.licences')} + + + {t('ui.menu.privacy')} + +
diff --git a/react/src/pages/PrivacyPage.js b/react/src/pages/PrivacyPage.js new file mode 100644 index 000000000..af3d2ee4c --- /dev/null +++ b/react/src/pages/PrivacyPage.js @@ -0,0 +1,30 @@ +import React, { Component } from 'react'; +import raw from 'raw.macro'; +import ReactMarkdown from 'react-markdown'; + +import { appBoundClassNames as classNames } from '../common/boundClassNames'; + +const privacyMarkdown = raw('../../PRIVACY.md'); + +const markdownComponents = { + h1: (props) =>
, + h2: (props) =>
, +}; + +class PrivacyPage extends Component { + render() { + return ( +
+
+
+
+ {privacyMarkdown} +
+
+
+
+ ); + } +} + +export default PrivacyPage; diff --git a/react/src/styles/App.module.scss b/react/src/styles/App.module.scss index 368cdea91..a4f270bb2 100644 --- a/react/src/styles/App.module.scss +++ b/react/src/styles/App.module.scss @@ -803,7 +803,7 @@ a { + (#{$line-height-normal} + 4px) + (#{$line-height-small} + 6px) + (#{$line-height-big} + 6px) - + + #{$section-padding} ) ) !important; @@ -818,7 +818,7 @@ a { + (#{$line-height-normal} + 4px) + (#{$line-height-small} + 6px) + (#{$line-height-big} + 6px) - + + (#{$section-padding} * 2 + 1px) + #{$line-height-normal} + #{$section-padding} @@ -1375,7 +1375,7 @@ a { @media #{$media-portrait} { width: 94px; } - + } } @@ -1386,7 +1386,7 @@ a { 55px + #{$section-padding} + (#{$line-height-big} + 10px) - + + #{$section-padding} + #{$section-margin-bottom} ) @@ -1399,7 +1399,7 @@ a { + #{$section-margin-top} + #{$section-padding} + (#{$line-height-big} + 10px) - + + #{$section-padding} + (#{$section-margin-bottom} * 2) ) @@ -1596,6 +1596,35 @@ a { line-height: $line-height-normal + 4px; } } + + &--privacy { + line-height: $line-height-big; + + a { + text-decoration: underline; + } + + ul { + padding-left: 8px; + list-style-position: inside; + } + + & > p, & > ul { + margin-bottom: 4px; + } + + & > ul { + list-style-type: disc; + + & > li > ul { + list-style-type: circle; + + & > li > ul { + list-style-type: square; + } + } + } + } } @@ -1653,11 +1682,11 @@ a { &.block--completed { &:not(.block--raised) { color: rgba($color-text-normal, 0.35); - + & i.icon { opacity: 0.45; } - + & .block--lecture-group__elem__texts__sub { color: rgba($color-text-lighter, 0.35); } @@ -2147,7 +2176,7 @@ a { } } - &__occupied-area { + &__occupied-area { background-color: #888; position: absolute; left: 0; @@ -2319,6 +2348,7 @@ a { } .section-content--license &, + .section-content--privacy &, .section-content--account & { text-align: center; margin-bottom: 10px; @@ -2436,6 +2466,11 @@ a { .section-content--license & { padding-bottom: 8px; } + + .section-content--privacy & { + padding: 0; + margin: 8px 0 4px; + } } diff --git a/react/src/translations/translation.en.json b/react/src/translations/translation.en.json index ae19a270e..d55f20f2d 100644 --- a/react/src/translations/translation.en.json +++ b/react/src/translations/translation.en.json @@ -289,7 +289,8 @@ "notifications": "Notifications", "signIn": "Sign In", "credit": "Credit", - "licences": "Licences" + "licences": "Licences", + "privacy": "Privacy (Korean only)" } } } diff --git a/react/src/translations/translation.ko.json b/react/src/translations/translation.ko.json index f1b897a1c..41cda03fd 100644 --- a/react/src/translations/translation.ko.json +++ b/react/src/translations/translation.ko.json @@ -283,7 +283,8 @@ "notifications": "알림", "signIn": "로그인", "credit": "만든 사람들", - "licences": "라이선스" + "licences": "라이선스", + "privacy": "개인정보취급방침" } } }