oauth login using api redirects (#76)

* login with api redirect

* fix scss imports

* login button styles

* keep original path after login

* no /cabana base path

* small redirect fix

* upgrade packages

* use github actions for building

* CI sass

* fix warnings

* fix build test
main
Joost Wooning 2021-10-04 18:57:54 +02:00 committed by GitHub
parent 9247ce8bbe
commit bb17a1a7d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 295 additions and 484 deletions

3
.dockerignore 100644
View File

@ -0,0 +1,3 @@
node_modules/
coverage/
build/

70
.github/workflows/build.yaml vendored 100644
View File

@ -0,0 +1,70 @@
name: build
on: [push]
jobs:
test:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: cache node modules
uses: actions/cache@v2
id: yarn-cache
with:
path: node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: yarn install
if: steps.yarn-cache.outputs.cache-hit != 'true'
run: yarn install
- name: yarn netlify-sass
run: yarn netlify-sass
- name: yarn build
run: yarn build
- name: run tests
run: yarn test-ci
- name: run puppeteer tests
run: yarn test-puppeteer-build
docker:
runs-on: ubuntu-20.04
needs: test
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout@v2
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: login to container registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: get tags
shell: bash
run: echo "##[set-output name=tags;]ghcr.io/commaai/cabana:$(echo ${GITHUB_REF#refs/heads/})$(if [ ${GITHUB_REF} = refs/heads/master ] ; then echo ,ghcr.io/commaai/cabana:latest; fi;)"
id: extract_tags
- name: Build and push
uses: docker/build-push-action@v2
with:
build-args: SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}
builder: ${{ steps.buildx.outputs.name }}
context: .
push: true
tags: ${{ steps.extract_tags.outputs.tags }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
mv /tmp/.buildx-cache-new /tmp/.buildx-cache

View File

@ -1,25 +0,0 @@
language: node_js
sudo: required
# install azure-cli 2.0, which is the preferred version. Switch to use this
# after azure accounts are handled.
before_install:
- echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ wheezy main" | sudo tee /etc/apt/sources.list.d/azure-cli.list
- sudo apt-key adv --keyserver packages.microsoft.com --recv-keys 52E16F86FEE04B979B07E28DB02C46DF417A0893
- sudo apt-get install apt-transport-https
- sudo apt-get update && sudo apt-get install azure-cli libudev-dev --allow-unauthenticated
# - yarn global add azure-cli@0.10.x
before_script: yarn netlify-sass
script:
- yarn test
- yarn build
deploy:
provider: script
script: scripts/travis-deploy.sh
skip_cleanup: true
on:
branch: master
tags: true

22
Dockerfile 100644
View File

@ -0,0 +1,22 @@
FROM node:10.24-buster
RUN apt-get update && apt-get install -y libusb-dev libudev-dev && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY package.json yarn.lock /app/
RUN yarn install --frozen-lockfile
COPY . /app/
ARG SENTRY_AUTH_TOKEN
RUN yarn netlify-sass
RUN yarn build
FROM nginx:1.21
COPY config.js.template /etc/nginx/templates/config.js.template
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=0 /app/build /usr/share/nginx/html
ENV NGINX_ENVSUBST_OUTPUT_DIR /usr/share/nginx/html

View File

@ -1,6 +1,6 @@
# Cabana
<img src="https://my.comma.ai/cabana/img/cabana.jpg" width="640" height="267" />
<img src="https://cabana.comma.ai/img/cabana.jpg" width="640" height="267" />
## Setup

View File

@ -1,21 +0,0 @@
trigger:
- master
pr:
- master
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '10.x'
displayName: 'Install Node.js'
- script: |
npm install yarn
yarn
yarn run test-ci
displayName: 'yarn test'

View File

@ -0,0 +1,4 @@
window.COMMA_URL_ROOT = '${COMMA_URL_ROOT}';
window.ATHENA_URL_ROOT = '${ATHENA_URL_ROOT}';
window.USERADMIN_URL_ROOT = '${USERADMIN_URL_ROOT}';
window.SENTRY_ENV = '${SENTRY_ENV}';

View File

@ -8,7 +8,7 @@ module.exports = function ({ env }) {
plugin: WorkerLoaderPlugin
}
];
if (env === 'production') {
if (process.env.NODE_ENV === 'production' && process.env.SENTRY_AUTH_TOKEN) {
plugins.push({
plugin: SentryPlugin
});

View File

13
nginx.conf 100644
View File

@ -0,0 +1,13 @@
server {
listen 80;
listen [::]:80;
server_name localhost;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.html;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}

View File

@ -2,12 +2,12 @@
"name": "can-explorer",
"version": "0.4.2",
"private": true,
"homepage": "https://community.comma.ai/cabana",
"homepage": "https://cabana.comma.ai/",
"dependencies": {
"@commaai/comma-api": "^1.7.0",
"@commaai/comma-api": "^2.1.2",
"@commaai/hls.js": "^0.12.7",
"@commaai/log_reader": "^0.5.5",
"@commaai/my-comma-auth": "^1.3.0",
"@commaai/my-comma-auth": "^1.4.1",
"@commaai/pandajs": "^0.3.4",
"@craco/craco": "^5.5.0",
"ap": "^0.2.0",
@ -42,6 +42,7 @@
"node-sass": "^4.12.0",
"prettier": "^1.9.2",
"prop-types": "^15.5.10",
"query-string": "^5.0.1",
"randomcolor": "^0.5.4",
"raven-js": "^3.16.0",
"react": "^16.2.0",
@ -62,7 +63,6 @@
"thyming": "^0.1.1",
"vega": "^5.3.4",
"vega-lite": "^3.0.0",
"query-string": "^5.0.1",
"vega-tooltip": "^0.4.0"
},
"devDependencies": {
@ -78,11 +78,11 @@
"detect-port": "1.1.0",
"dotenv": "2.0.0",
"env-cmd": "^8.0.2",
"expect-puppeteer": "^5.0.4",
"gh-pages": "^2.1.1",
"http-proxy-middleware": "0.17.3",
"json-loader": "0.5.4",
"expect-puppeteer": "^5.0.4",
"jest-puppeteer": "^5.0.4",
"json-loader": "0.5.4",
"puppeteer": "^9.1.0",
"rimraf": "^3.0.0",
"serve-handler": "^6.1.2",

View File

@ -1,41 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Single Page Apps for GitHub Pages</title>
<script type="text/javascript">
// Single Page Apps for GitHub Pages
// https://github.com/rafrex/spa-github-pages
// Copyright (c) 2016 Rafael Pedicini, licensed under the MIT License
// ----------------------------------------------------------------------
// This script takes the current url and converts the path and query
// string into just a query string, and then redirects the browser
// to the new url with only a query string and hash fragment,
// e.g. http://www.foo.tld/one/two?a=b&c=d#qwe, becomes
// http://www.foo.tld/?p=/one/two&q=a=b~and~c=d#qwe
// Note: this 404.html file must be at least 512 bytes for it to work
// with Internet Explorer (it is currently > 512 bytes)
// If you're creating a Project Pages site and NOT using a custom domain,
// then set segmentCount to 1 (enterprise users may need to set it to > 1).
// This way the code will only replace the route part of the path, and not
// the real directory in which the app resides, for example:
// https://username.github.io/repo-name/one/two?a=b&c=d#qwe becomes
// https://username.github.io/repo-name/?p=/one/two&q=a=b~and~c=d#qwe
// Otherwise, leave segmentCount as 0.
var segmentCount = 1;
var l = window.location;
l.replace(
l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') +
l.pathname.split('/').slice(0, 1 + segmentCount).join('/') + '/?p=/' +
l.pathname.slice(1).split('/').slice(segmentCount).join('/').replace(/&/g, '~and~') +
(l.search ? '&q=' + l.search.slice(1).replace(/&/g, '~and~') : '') +
l.hash
);
</script>
</head>
<body>
</body>
</html>

View File

@ -1,6 +0,0 @@
/ /index.html 200
/cabana/:slug /:slug 200
/cabana/* /:splat 200
/cabana/:a/:b /:a/:b 200
/cabana/:a/:b/:c /:a/:b/:c 200

3
public/config.js 100644
View File

@ -0,0 +1,3 @@
window.COMMA_URL_ROOT = 'https://api.comma.ai/';
window.ATHENA_URL_ROOT = 'https://athena.comma.ai/';
window.USERADMIN_URL_ROOT = 'https://useradmin.comma.ai/';

View File

@ -17,50 +17,9 @@
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<link rel="manifest" href="/manifest.json">
<link rel="shortcut icon" href="/favicon.ico">
<title>comma.ai cabana</title>
<!-- Start Single Page Apps for GitHub Pages -->
<script type="text/javascript">
// Single Page Apps for GitHub Pages
// https://github.com/rafrex/spa-github-pages
// Copyright (c) 2016 Rafael Pedicini, licensed under the MIT License
// ----------------------------------------------------------------------
// This script checks to see if a redirect is present in the query string
// and converts it back into the correct url and adds it to the
// browser's history using window.history.replaceState(...),
// which won't cause the browser to attempt to load the new url.
// When the single page app is loaded further down in this file,
// the correct url will be waiting in the browser's history for
// the single page app to route accordingly.
(function(l) {
if (l.search) {
var q = {};
l.search.slice(1).split('&').forEach(function(v) {
var a = v.split('=');
q[a[0]] = a.slice(1).join('=').replace(/~and~/g, '&');
});
if (q.p !== undefined) {
window.history.replaceState(null, null,
l.pathname.slice(0, -1) + (q.p || '') +
(q.q ? ('?' + q.q) : '') +
l.hash
);
}
}
}(window.location))
</script>
<!-- End Single Page Apps for GitHub Pages -->
</head>
<body>
<noscript>

View File

@ -4,14 +4,10 @@ const http = require('http');
const server = http.createServer((request, response) => {
// You pass two more arguments for config and middleware
// More details here: https://github.com/zeit/serve-handler#options
request.url = request.url.replace('/cabana', '');
handler(request, response, {
public: 'build',
redirects: [
{ source: 'cabana/:page', destination: '/:page' },
{ source: 'cabana/', destination: '/index.js' },
rewrites: [
{ source: '/', destination: '/index.html' },
]
});
});

View File

@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
import cx from 'classnames';
import { createWriteStream } from 'streamsaver';
import Panda from '@commaai/pandajs';
import CommaAuth, { storage as CommaAuthStorage } from '@commaai/my-comma-auth';
import CommaAuth, { storage as CommaAuthStorage, config as AuthConfig } from '@commaai/my-comma-auth';
import { raw as RawDataApi, drives as DrivesApi } from '@commaai/comma-api';
import { timeout, interval } from 'thyming';
import {
@ -31,7 +31,6 @@ import {
} from './api/localstorage';
import OpenDbc from './api/OpenDbc';
import UnloggerClient from './api/unlogger';
import * as ObjectUtils from './utils/object';
import { hash } from './utils/string';
import { modifyQueryParameters } from './utils/url';
import DbcUtils from './utils/dbc';
@ -255,8 +254,6 @@ export default class CanExplorer extends Component {
}
initCanData() {
const { route } = this.state;
this.spawnWorker(this.state.currentParts);
}
@ -398,22 +395,6 @@ export default class CanExplorer extends Component {
cancelWorker(workerHash) {
// actually don't...
return;
const currentWorkers = { ...this.state.currentWorkers };
const { worker, part } = currentWorkers[workerHash];
const loadingParts = this.state.loadingParts.filter((p) => p !== part);
const loadedParts = this.state.loadedParts.filter((p) => p !== part);
delete currentWorkers[workerHash];
console.log('Stoping worker', workerHash, 'for part', part);
worker.postMessage({
action: 'terminate'
});
this.setState({
currentWorkers,
loadingParts,
loadedParts
});
}
spawnWorker(options) {
@ -459,7 +440,6 @@ export default class CanExplorer extends Component {
const {
dbc,
dbcFilename,
route,
firstCanTime,
canFrameOffset
@ -946,6 +926,11 @@ export default class CanExplorer extends Component {
}
showOnboarding() {
if (!CommaAuth.isAuthenticated() && window.sessionStorage && window.location &&
window.location.pathname !== AuthConfig.AUTH_PATH)
{
window.sessionStorage.setItem('onboardingPath', window.location.href);
}
this.setState({ showOnboarding: true });
}
@ -1021,7 +1006,6 @@ export default class CanExplorer extends Component {
if (minPart === 0) {
maxPart = Math.min(route.proclog, 2);
}
const currentPartSpan = currentParts[1] - currentParts[0] + 1;
// update current parts
currentParts = [minPart, maxPart];
@ -1314,7 +1298,7 @@ export default class CanExplorer extends Component {
<LoadingBar isLoading={this.state.isLoading} />
) : null}
<div className="cabana-header">
<a className="cabana-header-logo" href="">
<a className="cabana-header-logo" href="/">
Comma Cabana
</a>
<div className="cabana-header-account">

View File

@ -126,7 +126,7 @@ export default class CanGraph extends Component {
return;
}
let bounds = null;
let bounds = null; // eslint-disable-line no-unused-vars
if (options && options.bounds) {
this.setState({ bounds: options.bounds });
bounds = options.bounds;

View File

@ -5,7 +5,7 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
.cabana-dbc-list {
&-header {

View File

@ -165,15 +165,6 @@ export default class Explorer extends Component {
nextMessage
);
const nextSeekMsgEntry = nextMessage.entries[nextProps.seekIndex];
let nextSeekTime;
if (nextSeekMsgEntry) {
nextSeekTime = nextSeekMsgEntry.relTime;
} else if (segment.length === 2) {
nextSeekTime = segment[0];
} else {
nextSeekTime = nextMessage.entries[0];
}
// console.log('componentWillReceiveProps', this.state.userSeekTime, '->', nextSeekTime);
this.setState({
segment,

View File

@ -5,7 +5,7 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
#cabana {
display: flex;

View File

@ -57,7 +57,7 @@ export default class GithubDbcList extends Component {
return (
<div className="cabana-dbc-list">
<div className="cabana-dbc-list-header">
<a href={`https://github.com/${this.props.repo}`} target="_blank">
<a href={`https://github.com/${this.props.repo}`} target="_blank" rel="noopener noreferrer">
<i className="fa fa-github" />
<span>{this.props.repo}</span>
</a>

View File

@ -55,7 +55,7 @@ export default class LoadDbcModal extends Component {
return (
<div className="cabana-tabs-navigation">
{this.state.tabs.map((tab) => (
<a
<button
className={cx({ 'is-active': this.state.tab === tab })}
onClick={() => {
this.setState({ tab });
@ -63,7 +63,7 @@ export default class LoadDbcModal extends Component {
key={tab}
>
<span>{tab}</span>
</a>
</button>
))}
</div>
);

View File

@ -5,7 +5,7 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
.cabana-meta {
background: $color-grey-20;

View File

@ -1,7 +1,5 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Moment from 'moment';
import _ from 'lodash';
import cx from 'classnames';
import qs from 'query-string';
import CommaAuth, { config as AuthConfig } from '@commaai/my-comma-auth';
@ -34,6 +32,26 @@ export default class OnboardingModal extends Component {
this.navigateToExplorer = this.navigateToExplorer.bind(this);
}
componentDidMount() {
const script = document.createElement("script");
document.body.appendChild(script);
script.onload = () => {
window.AppleID.auth.init({
clientId : AuthConfig.APPLE_CLIENT_ID,
scope : AuthConfig.APPLE_SCOPES,
redirectURI : AuthConfig.APPLE_REDIRECT_URI,
state : AuthConfig.APPLE_STATE,
});
};
script.src = "https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js";
script.async = true;
document.addEventListener('AppleIDSignInOnSuccess', (data) => {
const { code, state } = data.detail.authorization;
window.location = [AuthConfig.APPLE_REDIRECT_PATH, qs.stringify({ code, state })].join('?');
});
document.addEventListener('AppleIDSignInOnFailure', console.log);
}
attemptPandaConnection() {
if (!this.state.webUsbEnabled) {
return;
@ -62,9 +80,9 @@ export default class OnboardingModal extends Component {
return (
<p>
<i className="fa fa-exclamation-triangle" />
<a onClick={this.toggleUsbInstructions}>
<span onClick={this.toggleUsbInstructions}>
<span>WebUSB is not enabled in your Chrome settings</span>
</a>
</span>
</p>
);
}
@ -85,24 +103,25 @@ export default class OnboardingModal extends Component {
return (
<button onClick={this.navigateToExplorer} className="button--primary button--kiosk">
<i className="fa fa-video-camera" />
<strong>Find a drive in Explorer</strong>
<sup>Click "View CAN Data" while replaying a drive</sup>
<strong>Find a drive in connect</strong>
<sup>Click "View in cabana" while replaying a drive</sup>
</button>
);
} else {
let redirectOrigin = 'http://127.0.0.1';
if (document.location) {
redirectOrigin = document.location.origin;
}
const params = AuthConfig.GOOGLE_OAUTH_PARAMS;
params.redirect_uri = redirectOrigin + '/cabana' + AuthConfig.GOOGLE_REDIRECT_PATH;
const redirectLink = [AuthConfig.GOOGLE_AUTH_ENDPOINT, qs.stringify(params)].join('?')
return (
<a href={ redirectLink } className="button button--primary button--kiosk">
return <>
<a href={ AuthConfig.GOOGLE_REDIRECT_LINK } className="button button--primary button--icon">
<i className="fa fa-google" />
<strong>Sign in with Google</strong>
</a>
);
<button onClick={ () => window.AppleID.auth.signIn() } className="button button--primary button--icon">
<i className="fa fa-apple" />
<strong>Sign in with Apple</strong>
</button>
<a href={ AuthConfig.GITHUB_REDIRECT_LINK } className="button button--primary button--icon">
<i className="fa fa-github" />
<strong>Sign in with GitHub</strong>
</a>
</>;
}
}
@ -232,7 +251,7 @@ export default class OnboardingModal extends Component {
return (
<Modal
title="Welcome to Cabana"
subtitle="Get started by selecting a drive from Explorer or enabling live mode"
subtitle="Get started by selecting a drive from connect or enabling live mode"
footer={this.renderModalFooter()}
disableClose
variations={['wide', 'dark']}

View File

@ -5,7 +5,7 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
$cabana-modal-padding--wide: 76px;

View File

@ -1,7 +1,7 @@
// Onboarding Modal Styles
// ~~~~~~~~~~~~~~~~~~~~~~~
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
.cabana-onboarding-mode-chffr {
background: darken($color-grey-10, 2%);

View File

@ -163,12 +163,11 @@ export default class RouteSeeker extends Component {
}
let { videoLength, startTime } = this.props;
let { currentTime, duration } = videoElement;
let { currentTime } = videoElement;
currentTime = roundTime(currentTime);
startTime = roundTime(startTime);
videoLength = roundTime(videoLength);
duration = roundTime(duration);
let newRatio = (currentTime - startTime) / videoLength;

View File

@ -196,7 +196,6 @@ export default class RouteVideoSync extends Component {
} = this.state;
const {
userSeekTime,
url,
playSpeed,
playing,
onVideoClick,

View File

@ -161,7 +161,7 @@ export default class SaveDbcModal extends Component {
return (
<div className="cabana-tabs-navigation">
{this.state.tabs.map((tab) => (
<a
<button
className={cx({ 'is-active': this.state.tab === tab })}
onClick={() => {
this.setState({ tab });
@ -169,7 +169,7 @@ export default class SaveDbcModal extends Component {
key={tab}
>
<span>{tab}</span>
</a>
</button>
))}
</div>
);

View File

@ -5,7 +5,7 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
.cabana-explorer-signals-legend {
background: $color-grey-10;

View File

@ -6,7 +6,7 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
.signals-log-list {
color: $color-grey-80;

View File

@ -5,17 +5,20 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
.cabana-tabs-navigation {
border-top: 1px solid $color-grey-20;
border-bottom: 1px solid $color-grey-50;
padding: 0 3%;
a {
button {
border: none;
border-bottom: 3px solid transparent;
color: $color-grey-60;
cursor: pointer;
display: inline-block;
line-height: unset;
background-color: transparent;
font-size: 14px;
font-weight: 600;
padding: 11px 16px;

View File

@ -6,27 +6,27 @@
*/
// Globals
@import "./styles/base/base";
@import "./styles/base/grid";
@import "./styles/base/forms";
@import "./styles/base/lists";
@import "./styles/base/typography";
@import "./styles/base/utils";
@import "./styles/base/animations";
@import "./styles/base/insets";
@import "./styles/base/base.scss";
@import "./styles/base/grid.scss";
@import "./styles/base/forms.scss";
@import "./styles/base/lists.scss";
@import "./styles/base/typography.scss";
@import "./styles/base/utils.scss";
@import "./styles/base/animations.scss";
@import "./styles/base/insets.scss";
// Libraries
@import "./styles/lib/index";
@import "./styles/lib/font-awesome";
@import "./styles/lib/index.scss";
@import "./styles/lib/font-awesome.scss";
// Components
@import "./components/Meta/meta";
@import "./components/Explorer/explorer";
@import "./components/RouteSeeker/RouteSeeker";
@import "./components/SignalLegend/signalLegend";
@import "./components/SignalLog/signalLog";
@import "./components/PartSelector/partSelector";
@import "./components/Modals/modal";
@import "./components/Modals/onboardingModal";
@import "./components/Tabs/tabs";
@import "./components/DBCList/dbclist";
@import "./components/Meta/meta.scss";
@import "./components/Explorer/explorer.scss";
@import "./components/RouteSeeker/RouteSeeker.scss";
@import "./components/SignalLegend/signalLegend.scss";
@import "./components/SignalLog/signalLog.scss";
@import "./components/PartSelector/partSelector.scss";
@import "./components/Modals/modal.scss";
@import "./components/Modals/onboardingModal.scss";
@import "./components/Tabs/tabs.scss";
@import "./components/DBCList/dbclist.scss";

View File

@ -5,7 +5,6 @@ import CommaAuth, { config as AuthConfig, storage as AuthStorage } from '@commaa
import { auth as AuthApi, request as Request } from '@commaai/comma-api';
import Sentry from './logging/Sentry';
import CanExplorer from './CanExplorer';
import AcuraDbc from './acura-dbc';
import { getUrlParameter, modifyQueryParameters } from './utils/url';
import { GITHUB_AUTH_TOKEN_KEY } from './config';
import {
@ -16,13 +15,21 @@ import {
import { demoProps } from './demo';
async function authenticate() {
if (document.location && document.location.pathname === '/cabana' + AuthConfig.GOOGLE_REDIRECT_PATH) {
const redirect_uri = document.location.origin + '/cabana' + AuthConfig.GOOGLE_REDIRECT_PATH;
if (window.location && window.location.pathname === AuthConfig.AUTH_PATH) {
try {
const { code } = qs.parse(document.location.search);
const token = await AuthApi.refreshAccessToken(code, redirect_uri, 'google');
const { code, provider } = qs.parse(window.location.search);
const token = await AuthApi.refreshAccessToken(code, provider);
if (token) {
AuthStorage.setCommaAccessToken(token);
// reset stored path
if (window.sessionStorage) {
const onboardingPath = window.sessionStorage.getItem('onboardingPath');
if (onboardingPath) {
window.sessionStorage.removeItem('onboardingPath');
window.location = onboardingPath;
}
}
}
} catch (err) {
console.log(err);

View File

@ -1,4 +1,4 @@
// All Global Variables and Mixins
@import "colors";
@import "mixins";
@import "colors.scss";
@import "mixins.scss";
@import "../../../node_modules/font-awesome/scss/_variables";

View File

@ -1,7 +1,7 @@
// Base Style Resets
// ~~~~~~~~~~~~~~~~~
@import "../_global/all";
@import "../_global/all.scss";
html,
body {

View File

@ -5,7 +5,7 @@
*/
@import "../../styles/_global/all";
@import "../../styles/_global/all.scss";
$input-border-color: $color-grey-40;
$input-height: 42px;
@ -304,4 +304,34 @@ a.button {
font-weight: 500;
}
}
&.button--icon {
box-shadow: 0 1px 3px 0 rgba(105, 105, 105, 0.2);
height: 84px;
margin-bottom: 15px;
padding-left: 160px;
padding-top: 26px;
padding-bottom: 23px;
position: relative;
text-align: left;
width: 100%;
> i {
background: rgba(0, 0, 0, 0.2);
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 100%;
font-size: 36px;
line-height: 54px;
text-align: center;
left: 59px;
top: 13px;
opacity: 0.3;
position: absolute;
width: 54px;
}
strong {
display: block;
line-height: normal;
font-size: 26px;
letter-spacing: 0.0125em;
}
}
}

View File

@ -1,7 +1,7 @@
// Insets
// ~~~~~~
@import "../_global/all";
@import "../_global/all.scss";
.inset {
background: $color-grey-20;

View File

@ -1,7 +1,7 @@
// Lists
// ~~~~~
@import "../_global/all";
@import "../_global/all.scss";
$list-bubble-size: 25px;

View File

@ -5,7 +5,7 @@
*/
@import "../_global/all";
@import "../_global/all.scss";
body {
color: $color-grey-90;

272
yarn.lock
View File

@ -939,15 +939,14 @@
dependencies:
capnp-ts "0.2.4"
"@commaai/comma-api@^1.7.0":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@commaai/comma-api/-/comma-api-1.7.0.tgz#18701c7f057308d2652e13cec9dd3c9b73f11a3e"
integrity sha512-vvLFOe65hp7v/mOncZqhJa7MjbC2XORq+lekNEDWJEy5OkM6hmk+nBzdRUZhbgf2KXtpbMeOqozFxyCuqbThpw==
"@commaai/comma-api@^2.1.2":
version "2.1.2"
resolved "https://registry.yarnpkg.com/@commaai/comma-api/-/comma-api-2.1.2.tgz#f8581996c9d3c3f8b427dc88607294b36174f102"
integrity sha512-XPhZufFkmBgQ04tKB+/j8DYLYAt28lm73J2EdBs9+ybo2uLMRRHcyzmek5rGomOXhCUlSN/LhOFRMT2xkOjDUA==
dependencies:
babel-runtime "^6.26.0"
config-request "^0.5.1"
joi-browser "^13.4.0"
querystringify "^2.1.1"
query-string "^7.0.1"
"@commaai/hls.js@^0.12.7":
version "0.12.7"
@ -973,13 +972,12 @@
stream-selector "^0.4.0"
wasm-bz2 "^0.0.4"
"@commaai/my-comma-auth@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@commaai/my-comma-auth/-/my-comma-auth-1.3.0.tgz#2e5b1e56b4209f61519710f612157ae87aeb28b2"
integrity sha512-rKxzxTJDZ2k1s0vPkSTwOgjP7tIxp+JmPB9Jb++dKXRu6iYbUhNveink7c9NoVpxkxAmZeTHo2NaLsgM9sFMqA==
"@commaai/my-comma-auth@^1.4.1":
version "1.4.1"
resolved "https://registry.yarnpkg.com/@commaai/my-comma-auth/-/my-comma-auth-1.4.1.tgz#9c45cf18c5c42586c321aa3fb1bd4693a592487e"
integrity sha512-74hSXZ3Bp9YhGkhIK3WvXTDuK+rh9qWoUm2UkiMW4wNmDQWxStNkKU/vLOLsrwLueikDZ1NdY6Diw67DJVXqEA==
dependencies:
babel-runtime "^6.26.0"
global "^4.4.0"
localforage "^1.7.3"
querystringify "^2.1.1"
@ -2213,11 +2211,6 @@ assert-function@^1.0.0:
resolved "https://registry.yarnpkg.com/assert-function/-/assert-function-1.0.0.tgz#aeb2ad0fe00888b41254a8e3934a562968d77905"
integrity sha1-rrKtD+AIiLQSVKjjk0pWKWjXeQU=
assert-ok@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-ok/-/assert-ok-1.0.0.tgz#5b5cf795f9275c59c714d66c3a06d7de70e43ec8"
integrity sha1-W1z3lfknXFnHFNZsOgbX3nDkPsg=
assert-plus@1.0.0, assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
@ -2808,11 +2801,6 @@ buffer-indexof@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
buffer-to-arraybuffer@^0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=
buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@ -2840,11 +2828,6 @@ builtin-status-codes@^3.0.0:
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
builtin-status-codes@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad"
integrity sha1-MGN+4mKXisBxdOFtf4LwrQbgha0=
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@ -3412,22 +3395,6 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
config-request@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/config-request/-/config-request-0.5.1.tgz#cffc1288a681c46de1dafaeb2333d5500f6e12d8"
integrity sha1-z/wSiKaBxG3h2vrrIzPVUA9uEtg=
dependencies:
geval "^2.1.1"
http-status-error "^1.1.1"
is-error-code "^1.0.0"
is-function "^1.0.1"
is-obj "^1.0.1"
query-string-flatten "^1.0.0"
safe-json-parse "^4.0.0"
url-join "^1.1.0"
xhr-request "^1.0.1"
xtend "^4.0.1"
confusing-browser-globals@^1.0.7, confusing-browser-globals@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz#72bc13b483c0276801681871d4898516f8f54fdd"
@ -4196,13 +4163,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
dependencies:
mimic-response "^1.0.0"
decompress-response@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
@ -5613,6 +5573,11 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
filter-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b"
integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs=
finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
@ -5754,13 +5719,6 @@ font-awesome@^4.7.0:
resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=
for-each@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
dependencies:
is-callable "^1.1.3"
for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@ -6023,7 +5981,7 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
geval@^2.1.1, geval@^2.2.0, geval@~2.2.0:
geval@^2.2.0, geval@~2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/geval/-/geval-2.2.0.tgz#5622b10a28028284198afe351f6b417042c33dda"
integrity sha1-ViKxCigCgoQZiv41H2tBcELDPdo=
@ -6138,7 +6096,7 @@ global-prefix@^3.0.0:
kind-of "^6.0.2"
which "^1.3.1"
global@^4.3.2, global@^4.4.0:
global@^4.3.2:
version "4.4.0"
resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
@ -6146,14 +6104,6 @@ global@^4.3.2, global@^4.4.0:
min-document "^2.19.0"
process "^0.11.10"
global@~4.3.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
dependencies:
min-document "^2.19.0"
process "~0.5.1"
globals@^11.1.0, globals@^11.7.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@ -6555,15 +6505,6 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
http-status-error@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/http-status-error/-/http-status-error-1.1.1.tgz#16ab35efbb3aca9c17b0a262a6eceec7e0d394cc"
integrity sha1-Fqs177s6ypwXsKJipuzux+DTlMw=
dependencies:
assert-ok "~1.0.0"
builtin-status-codes "~1.0.0"
is-error-code "~1.0.0"
https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
@ -6750,11 +6691,6 @@ indexof@0.0.1:
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
individual@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=
infer-owner@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
@ -6945,7 +6881,7 @@ is-buffer@^2.0.2:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
is-callable@^1.1.3, is-callable@^1.1.4:
is-callable@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
@ -7037,11 +6973,6 @@ is-equal-shallow@^0.1.3:
dependencies:
is-primitive "^2.0.0"
is-error-code@^1.0.0, is-error-code@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-error-code/-/is-error-code-1.0.0.tgz#d27e3923434bbbd5149ce8d1ae316674851a8c25"
integrity sha1-0n45I0NLu9UUnOjRrjFmdIUajCU=
is-extendable@^0.1.0, is-extendable@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
@ -7083,11 +7014,6 @@ is-fullwidth-code-point@^2.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
is-function@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
is-generator-fn@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
@ -7189,7 +7115,7 @@ is-path-inside@^3.0.1:
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.1.tgz#7417049ed551d053ab82bba3fdd6baa6b3a81e89"
integrity sha512-CKstxrctq1kUesU6WhtZDbYKzzYBuRH0UYInAVrkc/EYdB9ltbfE0gOoayG9nhohG6447sOOVGhHqsdmBvkbNg==
is-plain-obj@^1.0.0, is-plain-obj@~1.1.0:
is-plain-obj@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
@ -7297,11 +7223,6 @@ is-wsl@^1.1.0:
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@ -7329,13 +7250,6 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
isobject@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.0.0.tgz#208de872bd7378c2a92af9428a3f56eb91a122c4"
integrity sha1-II3ocr1zeMKpKvlCij9W65GhIsQ=
dependencies:
isarray "0.0.1"
isomorphic-fetch@^2.1.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
@ -8505,7 +8419,7 @@ map-cache@^0.2.2:
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
map-obj@^1.0.0, map-obj@^1.0.1, map-obj@~1.0.1:
map-obj@^1.0.0, map-obj@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
@ -8740,11 +8654,6 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-response@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
mimic-response@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46"
@ -9303,18 +9212,6 @@ oauth-sign@~0.9.0:
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
obj-query@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/obj-query/-/obj-query-1.0.0.tgz#9447527491a243c9f72a7fec322402404a1f2e7c"
integrity sha1-lEdSdJGiQ8n3Kn/sMiQCQEofLnw=
dependencies:
is-plain-obj "~1.1.0"
map-obj "~1.0.1"
object-pair "~1.0.0"
object.reduce "~0.1.7"
print-value "~1.0.0"
xtend "~4.0.1"
object-assign@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.0.1.tgz#99504456c3598b5cad4fc59c26e8a9bb107fe0bd"
@ -9359,11 +9256,6 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
object-pair@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/object-pair/-/object-pair-1.0.0.tgz#253fb8070cb28bc9a349b8e606011cbd99f8bc25"
integrity sha1-JT+4Bwyyi8mjSbjmBgEcvZn4vCU=
object-path@0.11.4:
version "0.11.4"
resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949"
@ -9429,13 +9321,6 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
object.reduce@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-0.1.7.tgz#d180e84f72d218348af45352b55165246b95046d"
integrity sha1-0YDoT3LSGDSK9FNStVFlJGuVBG0=
dependencies:
for-own "^0.1.3"
object.values@^1.0.4, object.values@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9"
@ -9737,14 +9622,6 @@ parse-glob@^3.0.4:
is-extglob "^1.0.0"
is-glob "^2.0.0"
parse-headers@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==
dependencies:
for-each "^0.3.3"
string.prototype.trim "^1.1.2"
parse-json@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@ -10770,14 +10647,6 @@ pretty-format@^27.0.6:
ansi-styles "^5.0.0"
react-is "^17.0.1"
print-value@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/print-value/-/print-value-1.0.0.tgz#55b3a3a2ec4d0a6125257070700ca582c4b8eb7e"
integrity sha1-VbOjouxNCmElJXBwcAylgsS4634=
dependencies:
isobject "~2.0.0"
json-stringify-safe "~5.0.1"
private@^0.1.6:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@ -10793,11 +10662,6 @@ process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
process@~0.5.1:
version "0.5.2"
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
progress@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
@ -10979,15 +10843,6 @@ qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
query-string-flatten@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/query-string-flatten/-/query-string-flatten-1.0.0.tgz#33bb7b3b09d6a08cf2a887535761035900e69a8d"
integrity sha1-M7t7OwnWoIzyqIdTV2EDWQDmmo0=
dependencies:
obj-query "~1.0.0"
query-string "~3.0.0"
value-pipe "~1.0.0"
query-string@^4.1.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
@ -11005,12 +10860,15 @@ query-string@^5.0.1:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
query-string@~3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-3.0.3.tgz#ae2e14b4d05071d4e9b9eb4873c35b0dcd42e638"
integrity sha1-ri4UtNBQcdTpuetIc8NbDc1C5jg=
query-string@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.0.1.tgz#45bd149cf586aaa582dffc7ec7a8ad97dd02f75d"
integrity sha512-uIw3iRvHnk9to1blJCG3BTc+Ro56CBowJXKmNNAm3RulvPBzWLRqKSiiDk+IplJhsydwtuNMHi8UGQFcCLVfkA==
dependencies:
strict-uri-encode "^1.0.0"
decode-uri-component "^0.2.0"
filter-obj "^1.1.0"
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
querystring-es3@^0.2.0:
version "0.2.1"
@ -11795,13 +11653,6 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
rust-result@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=
dependencies:
individual "^2.0.0"
rw@1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
@ -11831,13 +11682,6 @@ safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1,
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
safe-json-parse@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=
dependencies:
rust-result "^1.0.0"
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@ -12129,15 +11973,6 @@ simple-concat@^1.0.0:
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
simple-get@^2.7.0:
version "2.8.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==
dependencies:
decompress-response "^3.3.0"
once "^1.3.1"
simple-concat "^1.0.0"
simple-get@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
@ -12401,6 +12236,11 @@ spdy@^4.0.0:
select-hose "^2.0.0"
spdy-transport "^3.0.0"
split-on-first@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
@ -12534,6 +12374,11 @@ strict-uri-encode@^1.0.0:
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
strict-uri-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
string-argv@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
@ -12933,11 +12778,6 @@ thyming@^0.1.1:
dependencies:
assert-function "^1.0.0"
timed-out@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
timers-browserify@^2.0.4:
version "2.0.11"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
@ -13280,11 +13120,6 @@ urix@^0.1.0:
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
url-join@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=
url-loader@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.1.0.tgz#bcc1ecabbd197e913eca23f5e0378e24b4412961"
@ -13302,11 +13137,6 @@ url-parse@^1.4.3:
querystringify "^2.1.1"
requires-port "^1.0.0"
url-set-query@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=
url-toolkit@^2.1.1, url-toolkit@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2"
@ -13401,11 +13231,6 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
value-pipe@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/value-pipe/-/value-pipe-1.0.1.tgz#c7f09dbb105a72a9f5bdbd7085b537f10e995492"
integrity sha512-ZLcuIPES51DfYuIl6+mj5BEB6GGuPGHHFJzmE5vxZn8ydR8LS+Y/uxWFT1x30mNPrjNbHRggV5KdJYSaWt/hbQ==
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@ -14522,29 +14347,6 @@ ws@~6.1.0:
dependencies:
async-limiter "~1.0.0"
xhr-request@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==
dependencies:
buffer-to-arraybuffer "^0.0.5"
object-assign "^4.1.1"
query-string "^5.0.1"
simple-get "^2.7.0"
timed-out "^4.0.1"
url-set-query "^1.0.0"
xhr "^2.0.4"
xhr@^2.0.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd"
integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==
dependencies:
global "~4.3.0"
is-function "^1.0.1"
parse-headers "^2.0.0"
xtend "^4.0.0"
xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"