Merge pull request #1040 from ONLYOFFICE/bugfix/login

Bugfix/login
This commit is contained in:
Alexey Safronov 2022-11-17 20:25:28 +03:00 committed by GitHub
commit 53fcee2b83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 231 additions and 312 deletions

View File

@ -171,15 +171,17 @@ RUN chown nginx:nginx /etc/nginx/* -R && \
FROM noderun as doceditor
WORKDIR ${BUILD_PATH}/products/ASC.Files/editor
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/editor/ .
ENTRYPOINT ["node", "server.js"]
CMD ["node", "server.js"]
## Login ##
FROM noderun as login
WORKDIR ${BUILD_PATH}/products/ASC.Login/login
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/login/ .
ENTRYPOINT ["node", "server.js"]
CMD ["node", "server.js"]
## ASC.Data.Backup.BackgroundTasks ##
FROM dotnetrun AS backup_background

View File

@ -8,7 +8,7 @@
"clean": "shx rm -rf dist",
"deploy": "shx --silent mkdir -p ../../build/deploy/client && shx cp -r dist/* ../../build/deploy/client",
"start": "NODE_OPTIONS=--openssl-legacy-provider webpack-cli serve",
"start-prod": "NODE_OPTIONS=--openssl-legacy-provider webpack --mode production && serve dist -p 5001"
"start-prod": "NODE_OPTIONS=--openssl-legacy-provider webpack --mode production && serve dist -s -p 5001"
},
"old-scripts": {
"build:test": "webpack --env minimize=false --mode production",
@ -71,7 +71,7 @@
"playwright": "^1.18.1",
"sass": "^1.39.2",
"sass-loader": "^12.1.0",
"serve": "12.0.1",
"serve": "14.1.1",
"shx": "^0.3.3",
"source-map-loader": "^3.0.0",
"style-loader": "3.2.1",

View File

@ -57,10 +57,6 @@ export const StyledBody = styled.div`
width: 100%;
}
.form-field {
height: 48px;
}
.password-field-wrapper {
width: 100%;
}

View File

@ -28,7 +28,7 @@ import {
} from "@docspace/common/utils";
import { providersData } from "@docspace/common/constants";
import withLoader from "../withLoader";
//import MoreLoginModal from "login/moreLogin";
import MoreLoginModal from "@docspace/common/components/MoreLoginModal";
import AppLoader from "@docspace/common/components/AppLoader";
import EmailInput from "@docspace/components/email-input";
import { hugeMobile, tablet } from "@docspace/components/utils/device";
@ -184,10 +184,6 @@ const RegisterContainer = styled.div`
margin-top: 32px;
width: 100%;
.form-field {
height: 48px;
}
@media (max-width: 768px) {
margin: 32px 0 0 0;
width: 100%;
@ -778,7 +774,7 @@ const Confirm = (props) => {
/>
</form>
{/* <MoreLoginModal
<MoreLoginModal
t={t}
visible={moreAuthVisible}
onClose={moreAuthClose}
@ -786,7 +782,7 @@ const Confirm = (props) => {
onSocialLoginClick={onSocialButtonClick}
ssoLabel={ssoLabel}
ssoUrl={ssoUrl}
/> */}
/>
</RegisterContainer>
</FormWrapper>
</ConfirmContainer>

12
packages/common/index.d.ts vendored Normal file
View File

@ -0,0 +1,12 @@
type TFuncType = (key: string) => string;
type HTMLElementEvent<T extends HTMLElement> = Event & {
target: T;
};
interface IProvider {
linked: boolean;
provider: string;
url: string;
}
type ProvidersType = IProvider[];

View File

@ -1,4 +1,5 @@
import styled from "styled-components";
import Base from "../themes/base";
const InputWrapper = styled.div`
display: flex;
@ -9,8 +10,9 @@ const InputWrapper = styled.div`
height: 120px;
width: 100px;
display: block;
background: #ffffff;
border: 1px solid #d0d5da;
background: ${(props) => props.theme.codeInput.background};
border: ${(props) => props.theme.codeInput.border};
color: ${(props) => props.theme.codeInput.color};
box-sizing: border-box;
border-radius: 8px;
margin: 0 4px;
@ -35,20 +37,21 @@ const InputWrapper = styled.div`
}
input:focus {
border: 1px solid #3b72a7;
border: 1px solid #5299e0;
outline: none;
}
input:disabled {
color: #a3a9ae;
background: #f8f9f9;
border: 1px solid #eceef1;
color: ${(props) => props.theme.codeInput.disabledColor};
background: ${(props) => props.theme.codeInput.disabledBackground};
border: ${(props) => props.theme.codeInput.disabledBorder};
outline: none;
}
hr {
width: 24px;
height: 1px;
background: #c4c4c4;
background: ${(props) => props.theme.codeInput.lineColor};
border: none;
margin: 0 16px;
@ -58,4 +61,6 @@ const InputWrapper = styled.div`
}
`;
InputWrapper.defaultProps = { theme: Base };
export default InputWrapper;

View File

@ -801,7 +801,7 @@ const Base = {
},
fontSize: {
base: "14px",
base: "13px",
middle: "14px",
big: "16px",
huge: "18px",
@ -2742,6 +2742,9 @@ const Base = {
navBackground: "#F8F9F9",
headerColor: black,
helpButton: "#A3A9AE",
orLineColor: "#ECEEF1",
orTextColor: "#A3A9AE",
titleColor: black,
register: {
backgroundColor: grayLight,
@ -2995,6 +2998,16 @@ const Base = {
background: white,
boxShadow: "0px 5px 20px rgba(4, 15, 27, 0.07)",
},
codeInput: {
background: white,
border: "1px solid #d0d5da",
color: black,
lineColor: "#C4C4C4",
disabledBackground: "#F8F9F9",
disabledBorder: "1px solid #ECEEF1",
disabledColor: "#A3A9AE",
},
};
export default Base;

View File

@ -793,7 +793,7 @@ const Dark = {
},
fontSize: {
base: "14px",
base: "13px",
middle: "14px",
big: "16px",
huge: "18px",
@ -2744,6 +2744,9 @@ const Dark = {
navBackground: "#282828",
headerColor: white,
helpButton: "#D8D8D8",
orLineColor: "#474747",
orTextColor: "#858585",
titleColor: white,
register: {
backgroundColor: "#292929",
@ -2996,6 +2999,16 @@ const Dark = {
background: black,
boxShadow: "0px 5px 20px rgba(0, 0, 0, 0.16);",
},
codeInput: {
background: "#282828",
border: "1px solid #474747",
color: white,
lineColor: "#858585",
disabledBackground: "#474747",
disabledBorder: "1px solid #474747",
disabledColor: "#858585",
},
};
export default Dark;

View File

@ -28,6 +28,8 @@ const StyledTooltip = styled.div`
}
&:after {
border: ${(props) => props.theme.tooltip.after.border};
background-color: ${(props) =>
props.color ? props.color : props.theme.tooltip.color} !important;
}
}

View File

@ -89,7 +89,7 @@
"playwright": "^1.17.1",
"sass": "^1.39.2",
"sass-loader": "^12.1.0",
"serve": "12.0.1",
"serve": "14.1.1",
"shx": "^0.3.3",
"source-map-loader": "^3.0.0",
"style-loader": "3.2.1",

View File

@ -20,7 +20,7 @@ const App: React.FC<ILoginProps> = (props) => {
<InvalidRoute />
</Route>
<Route path="/login/code">
<CodeLogin />
<CodeLogin {...props} />
</Route>
<Route path="/login">
<Login {...props} />

View File

@ -1,12 +1,17 @@
import React, { useState } from "react";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { inject, observer } from "mobx-react";
import Text from "@docspace/components/text";
import Link from "@docspace/components/link";
import CodeInput from "@docspace/components/code-input";
import { Trans } from "react-i18next";
import { ReactSVG } from "react-svg";
import { LoginContainer, LoginFormWrapper } from "./StyledLogin";
import BarLogo from "../../../../../public/images/danger.alert.react.svg";
import DocspaceLogo from "../../../../../public/images/docspace.big.react.svg";
import { Dark, Base } from "@docspace/components/themes";
import { getBgPattern } from "@docspace/common/utils";
import { useMounted } from "../helpers/useMounted";
interface IBarProp {
t: TFuncType;
expired: boolean;
@ -25,7 +30,7 @@ const Bar: React.FC<IBarProp> = (props) => {
);
};
const Form: React.FC = () => {
const Form: React.FC = ({ theme, setTheme, logoUrls }) => {
const { t } = useTranslation("Login");
const [invalidCode, setInvalidCode] = useState(false);
const [expiredCode, setExpiredCode] = useState(false);
@ -34,6 +39,15 @@ const Form: React.FC = () => {
const email = "test@onlyoffice.com"; //TODO: get email from form
const validCode = "123456"; //TODO: get from api
useEffect(() => {
const theme =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
? Dark
: Base;
setTheme(theme);
}, []);
const onSubmit = (code: number | string) => {
if (code !== validCode) {
setInvalidCode(true);
@ -48,11 +62,19 @@ const Form: React.FC = () => {
setInvalidCode(false);
};
const loginLogo = Object.values(logoUrls)[1];
const isSvgLogo = loginLogo.includes(".svg");
return (
<LoginContainer>
<DocspaceLogo className="logo-wrapper" />
<LoginContainer id="code-page" theme={theme}>
{isSvgLogo ? (
<ReactSVG src={loginLogo} className="logo-wrapper" />
) : (
<img src={loginLogo} className="logo-wrapper" />
)}
<Text
id="workspace-title"
fontSize="23px"
fontWeight={700}
textAlign="center"
@ -61,7 +83,12 @@ const Form: React.FC = () => {
{t("CodeTitle")}
</Text>
<Text fontSize="12px" fontWeight={400} textAlign="center" color="#A3A9AE">
<Text
className="code-description"
fontSize="12px"
fontWeight={400}
textAlign="center"
>
<Trans t={t} i18nKey="CodeSubtitle" ns="Login" key={email}>
We sent a 6-digit code to {{ email }}. The code has a limited validity
period, enter it as soon as possible.{" "}
@ -70,6 +97,7 @@ const Form: React.FC = () => {
<div className="code-input-container">
<CodeInput
theme={theme}
onSubmit={onSubmit}
handleChange={handleChange}
isDisabled={isLoading}
@ -89,8 +117,7 @@ const Form: React.FC = () => {
)}
<Text
className="not-found-code"
color="#A3A9AE"
className="not-found-code code-description"
fontSize="12px"
textAlign="center"
>
@ -102,11 +129,20 @@ const Form: React.FC = () => {
};
const CodeLogin: React.FC<ICodeProps> = (props) => {
const bgPattern = getBgPattern(props.currentColorScheme.id);
const mounted = useMounted();
if (!mounted) return <></>;
return (
<LoginFormWrapper>
<LoginFormWrapper bgPattern={bgPattern}>
<Form {...props} />
</LoginFormWrapper>
);
};
export default CodeLogin;
export default inject(({ loginStore }) => {
return {
theme: loginStore.theme,
setTheme: loginStore.setTheme,
};
})(observer(CodeLogin));

View File

@ -14,7 +14,7 @@ import { providersData } from "@docspace/common/constants";
import Link from "@docspace/components/link";
import Toast from "@docspace/components/toast";
import LoginForm from "./sub-components/LoginForm";
import MoreLoginModal from "./sub-components/more-login";
import MoreLoginModal from "@docspace/common/components/MoreLoginModal";
import RecoverAccessModalDialog from "@docspace/common/components/Dialogs/RecoverAccessModalDialog";
import FormWrapper from "@docspace/components/form-wrapper";
import Register from "./sub-components/register-container";
@ -44,7 +44,7 @@ const Login: React.FC<ILoginProps> = ({
const [moreAuthVisible, setMoreAuthVisible] = useState(false);
const [recoverDialogVisible, setRecoverDialogVisible] = useState(false);
const { enabledJoin, greetingSettings } = portalSettings;
const { enabledJoin, greetingSettings, enableAdmMess } = portalSettings;
const { ssoLabel, ssoUrl } = capabilities;
const { t } = useTranslation(["Login", "Common"]);
@ -53,7 +53,7 @@ const Login: React.FC<ILoginProps> = ({
useEffect(() => {
const theme =
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
window.matchMedia("(prefers-color-scheme: dark)").matches
? Dark
: Base;
setTheme(theme);
@ -108,10 +108,10 @@ const Login: React.FC<ILoginProps> = ({
const tokenGetterWin = isDesktopEditor
? (window.location.href = url)
: window.open(
url,
"login",
"width=800,height=500,status=no,toolbar=no,menubar=no,resizable=yes,scrollbars=no"
);
url,
"login",
"width=800,height=500,status=no,toolbar=no,menubar=no,resizable=yes,scrollbars=no"
);
getOAuthToken(tokenGetterWin).then((code: string) => {
const token = window.btoa(
@ -224,9 +224,7 @@ const Login: React.FC<ILoginProps> = ({
)}
{(oauthDataExists() || ssoExists()) && (
<div className="line">
<Text color="#A3A9AE" className="or-label">
{t("Or")}
</Text>
<Text className="or-label">{t("Or")}</Text>
</div>
)}
<LoginForm
@ -236,6 +234,7 @@ const Login: React.FC<ILoginProps> = ({
setIsLoading={setIsLoading}
onRecoverDialogVisible={onRecoverDialogVisible}
match={match}
enableAdmMess={enableAdmMess}
/>
</FormWrapper>
<Toast />

View File

@ -49,6 +49,10 @@ export const LoginContainer = styled.div`
min-height: 18px;
}
.login-or-access-text{
text-transform: lowercase;
}
.recover-link {
min-height: 19px;
}
@ -69,6 +73,7 @@ export const LoginContainer = styled.div`
}
.or-label {
color: ${(props) => props.theme.login.orTextColor};
margin: 0 32px;
}
@ -76,8 +81,8 @@ export const LoginContainer = styled.div`
display: flex;
width: 320px;
align-items: center;
color: #eceef1;
padding-top: 35px;
color: ${(props) => props.theme.login.orLineColor};
padding: 32px 0;
@media ${tablet} {
width: 480px;
@ -92,7 +97,7 @@ export const LoginContainer = styled.div`
.line:after {
content: "";
flex-grow: 1;
background: #eceef1;
background: ${(props) => props.theme.login.orLineColor};
height: 1px;
font-size: 0px;
line-height: 0px;
@ -119,6 +124,7 @@ export const LoginContainer = styled.div`
font-weight: 600;
font-size: 11px;
line-height: 12px;
color: #333;
svg {
margin: 8px;
}
@ -145,6 +151,7 @@ export const LoginContainer = styled.div`
}
.field-body{
height: 48px;
input, .password-input > div {
background: ${(props) => props.theme.input.backgroundColor};
color: ${(props) => props.theme.input.color};
@ -226,7 +233,10 @@ export const LoginContainer = styled.div`
flex-direction: column;
align-items: center;
gap: 6px;
margin-top: 24px;
& > :first-child {
margin-top: 24px;
}
}
}
@ -248,6 +258,19 @@ export const LoginContainer = styled.div`
display: none;
}
}
.workspace-title{
color: ${(props) => props.theme.login.titleColor};
margin-bottom: 16px;
@media ${hugeMobile} {
margin-top: 32px;
}
}
.code-description{
color: ${(props) => props.theme.login.textColor};
}
`;
interface ILoginFormWrapperProps {

View File

@ -23,6 +23,7 @@ interface ILoginFormProps {
isDesktop: boolean;
match: MatchType;
onRecoverDialogVisible: () => void;
enableAdmMess: boolean;
}
const settings = {
@ -39,6 +40,7 @@ const LoginForm: React.FC<ILoginFormProps> = ({
match,
setIsLoading,
onRecoverDialogVisible,
enableAdmMess,
}) => {
const [isEmailErrorShow, setIsEmailErrorShow] = useState(false);
const [errorText, setErrorText] = useState("");
@ -347,22 +349,25 @@ const LoginForm: React.FC<ILoginFormProps> = ({
>
{t("SignInWithCode")}
</Link>*/}
<Text color="#A3A9AE" className="login-or-access-text">
{t("Or")}
</Text>
<Link
id="login_recover-link"
fontWeight="600"
fontSize="13px"
color="#316DAA"
type="action"
isHovered={true}
className="login-link recover-link"
onClick={onRecoverDialogVisible}
>
{t("RecoverAccess")}
</Link>
{enableAdmMess && (
<>
<Text color="#A3A9AE" className="login-or-access-text">
{t("Or")}
</Text>
<Link
id="login_recover-link"
fontWeight="600"
fontSize="13px"
color="#316DAA"
type="action"
isHovered={true}
className="login-link recover-link"
onClick={onRecoverDialogVisible}
>
{t("RecoverAccess")}
</Link>
</>
)}
</div>
)}

View File

@ -23,7 +23,7 @@ const StyledNav = styled.div`
const SimpleNav = ({ theme }) => {
return (
<StyledNav theme={theme}>
<StyledNav id="login-header" theme={theme}>
<ReactSVG src="/static/images/logo.docspace.react.svg" />
</StyledNav>
);

View File

@ -44,7 +44,7 @@ const Register: React.FC<IRegisterProps> = (props) => {
trustedDomains,
theme,
currentColorScheme,
id
id,
} = props;
const [visible, setVisible] = useState(false);
const [loading, setLoading] = useState(false);
@ -112,7 +112,9 @@ const Register: React.FC<IRegisterProps> = (props) => {
return enabledJoin && !isAuthenticated ? (
<>
<StyledRegister id={id} onClick={onRegisterClick}>
<Text color={currentColorScheme.accentColor}>{t("Register")}</Text>
<Text as="span" color={currentColorScheme.accentColor}>
{t("Register")}
</Text>
</StyledRegister>
{visible && (

View File

@ -90,6 +90,10 @@ const template: Template = (
background-color: #fff;
}
#login-header{
background-color: #f8f9f9;
}
#login-page > div > svg > path:last-child {
fill: #333;
}
@ -116,6 +120,24 @@ const template: Template = (
#login-checkbox > div > span {
color: #333;
}
#code-page > div > svg > path:last-child {
fill: #333;
}
#workspace-title {
color: #333;
}
#code-page > div > div > input {
background: #fff;
border-color: #d0d5da;
}
#code-page > div > div > input:disabled {
background: #F8F9F9;
border-color: #ECEEF1;
}
}
@media (prefers-color-scheme: dark) {
@ -123,6 +145,10 @@ const template: Template = (
background-color: #333;
}
#login-header{
background-color: #282828;
}
#login-page > div > svg > path:last-child {
fill: #fff;
}
@ -149,6 +175,24 @@ const template: Template = (
#login-checkbox > div > span {
color: #fff;
}
#code-page > div > svg > path:last-child {
fill: #fff;
}
#workspace-title {
color: #fff;
}
#code-page > div > div > input {
background: #282828;
border-color: #474747;
}
#code-page > div > div > input:disabled {
background: #474747;
border-color: #474747;
}
}
</style>

View File

@ -82,7 +82,6 @@ const clientConfig = {
exposes: {
"./login": "./src/client/components/Login.tsx",
"./codeLogin": "./src/client/components/CodeLogin.tsx",
"./moreLogin": "./src/client/components/sub-components/more-login.tsx",
},
shared: { ...sharedDeps, ...deps },
}),

256
yarn.lock
View File

@ -2802,7 +2802,7 @@ __metadata:
react-string-format: ^0.1.4
sass: ^1.39.2
sass-loader: ^12.1.0
serve: 12.0.1
serve: 14.1.1
shx: ^0.3.3
source-map-loader: ^3.0.0
style-loader: 3.2.1
@ -3055,7 +3055,7 @@ __metadata:
playwright: ^1.17.1
sass: ^1.39.2
sass-loader: ^12.1.0
serve: 12.0.1
serve: 14.1.1
shx: ^0.3.3
source-map-loader: ^3.0.0
style-loader: 3.2.1
@ -7252,13 +7252,6 @@ __metadata:
languageName: node
linkType: hard
"@zeit/schemas@npm:2.6.0":
version: 2.6.0
resolution: "@zeit/schemas@npm:2.6.0"
checksum: 7f2175ee34fad1a37da20882f9cda038ebb43a99ceaf30877f1676044669adde714ee56de6f1fcb57214dfa4479995a63fb2d053fe9f877b6852cdc1e4da574c
languageName: node
linkType: hard
"abab@npm:^2.0.0, abab@npm:^2.0.5, abab@npm:^2.0.6":
version: 2.0.6
resolution: "abab@npm:2.0.6"
@ -7499,18 +7492,6 @@ __metadata:
languageName: node
linkType: hard
"ajv@npm:6.12.6, ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.10.2, ajv@npm:^6.12.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
dependencies:
fast-deep-equal: ^3.1.1
fast-json-stable-stringify: ^2.0.0
json-schema-traverse: ^0.4.1
uri-js: ^4.2.2
checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4
languageName: node
linkType: hard
"ajv@npm:8.11.0, ajv@npm:^8.0.0, ajv@npm:^8.8.0":
version: 8.11.0
resolution: "ajv@npm:8.11.0"
@ -7523,12 +7504,15 @@ __metadata:
languageName: node
linkType: hard
"ansi-align@npm:^2.0.0":
version: 2.0.0
resolution: "ansi-align@npm:2.0.0"
"ajv@npm:^6.1.0, ajv@npm:^6.10.0, ajv@npm:^6.10.2, ajv@npm:^6.12.2, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
dependencies:
string-width: ^2.0.0
checksum: fecefb3b4a128aaad52ed1d2ee2f999968acc77573645be49666273ec2952840e27aed8cb9c2e48cd0c2d5a088389223eabb6d09aa74bceba3b931d242288c97
fast-deep-equal: ^3.1.1
fast-json-stable-stringify: ^2.0.0
json-schema-traverse: ^0.4.1
uri-js: ^4.2.2
checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4
languageName: node
linkType: hard
@ -7697,7 +7681,7 @@ __metadata:
languageName: node
linkType: hard
"arch@npm:^2.1.1, arch@npm:^2.2.0":
"arch@npm:^2.2.0":
version: 2.2.0
resolution: "arch@npm:2.2.0"
checksum: e21b7635029fe8e9cdd5a026f9a6c659103e63fff423834323cdf836a1bb240a72d0c39ca8c470f84643385cf581bd8eda2cad8bf493e27e54bd9783abe9101f
@ -7734,13 +7718,6 @@ __metadata:
languageName: node
linkType: hard
"arg@npm:2.0.0":
version: 2.0.0
resolution: "arg@npm:2.0.0"
checksum: eeadcfa6160847452ac1973d1c6990e2133e50972d56f80f3601f83a465daa88431cb430cc12101d90b01719361a55a166b03f489143b6ba2acd2304714ebe74
languageName: node
linkType: hard
"arg@npm:5.0.2":
version: 5.0.2
resolution: "arg@npm:5.0.2"
@ -8700,21 +8677,6 @@ __metadata:
languageName: node
linkType: hard
"boxen@npm:1.3.0":
version: 1.3.0
resolution: "boxen@npm:1.3.0"
dependencies:
ansi-align: ^2.0.0
camelcase: ^4.0.0
chalk: ^2.0.1
cli-boxes: ^1.0.0
string-width: ^2.0.0
term-size: ^1.2.0
widest-line: ^2.0.0
checksum: 8dad2081bfaf5a86cb85685882b5f22027c5c430ee0974894078f521a44d92a90222fb4391b41fc4575aa1215c9133ea2c6b7feadcd1cb2fae8f4e97c05dbf11
languageName: node
linkType: hard
"boxen@npm:7.0.0":
version: 7.0.0
resolution: "boxen@npm:7.0.0"
@ -9194,13 +9156,6 @@ __metadata:
languageName: node
linkType: hard
"camelcase@npm:^4.0.0":
version: 4.1.0
resolution: "camelcase@npm:4.1.0"
checksum: 9683356daf9b64fae4b30c91f8ceb1f34f22746e03d1804efdbe738357d38b47f206cdd71efcf2ed72018b2e88eeb8ec3f79adb09c02f1253a4b6d5d405ff2ae
languageName: node
linkType: hard
"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1":
version: 5.3.1
resolution: "camelcase@npm:5.3.1"
@ -9291,17 +9246,6 @@ __metadata:
languageName: node
linkType: hard
"chalk@npm:2.4.1":
version: 2.4.1
resolution: "chalk@npm:2.4.1"
dependencies:
ansi-styles: ^3.2.1
escape-string-regexp: ^1.0.5
supports-color: ^5.3.0
checksum: 196eb8e99a0c00c6fcef216c794b109fd071931b10ec0f8f305c368fb6d776d0d4857d0028d2cc3561632428d6d94a41d7edf33b506f7540b7c8492f4224d89e
languageName: node
linkType: hard
"chalk@npm:5.0.1":
version: 5.0.1
resolution: "chalk@npm:5.0.1"
@ -9566,13 +9510,6 @@ __metadata:
languageName: node
linkType: hard
"cli-boxes@npm:^1.0.0":
version: 1.0.0
resolution: "cli-boxes@npm:1.0.0"
checksum: 101cfd6464a418a76523c332665eaf0641522f30ecc2492de48263ada6b0852333b2ed47b2998ddda621e7008471c51f597f813be798db237c33ba45b27e802a
languageName: node
linkType: hard
"cli-boxes@npm:^2.2.1":
version: 2.2.1
resolution: "cli-boxes@npm:2.2.1"
@ -9611,17 +9548,6 @@ __metadata:
languageName: node
linkType: hard
"clipboardy@npm:2.3.0":
version: 2.3.0
resolution: "clipboardy@npm:2.3.0"
dependencies:
arch: ^2.1.1
execa: ^1.0.0
is-wsl: ^2.1.1
checksum: 2733790bc8bbb76a5be7706fa4632f655010774e579a9d3ebe31dc10cf44a2b82cf07b0b6f74162e63048ce32d912193c08c5b5311dce5c19fc641a3bda1292b
languageName: node
linkType: hard
"clipboardy@npm:3.0.0":
version: 3.0.0
resolution: "clipboardy@npm:3.0.0"
@ -9939,7 +9865,7 @@ __metadata:
languageName: node
linkType: hard
"compressible@npm:~2.0.14, compressible@npm:~2.0.16":
"compressible@npm:~2.0.16":
version: 2.0.18
resolution: "compressible@npm:2.0.18"
dependencies:
@ -9948,21 +9874,6 @@ __metadata:
languageName: node
linkType: hard
"compression@npm:1.7.3":
version: 1.7.3
resolution: "compression@npm:1.7.3"
dependencies:
accepts: ~1.3.5
bytes: 3.0.0
compressible: ~2.0.14
debug: 2.6.9
on-headers: ~1.0.1
safe-buffer: 5.1.2
vary: ~1.1.2
checksum: f1c24d9d3f30f6ae7ac57a41078ec90ca514112e6d21fc992d1d79d904a2eedb2a96620806f8de9ab85a75dbec94ef9b6dded9a06a6d72faa9bc8c4e3c375072
languageName: node
linkType: hard
"compression@npm:1.7.4, compression@npm:^1.7.4":
version: 1.7.4
resolution: "compression@npm:1.7.4"
@ -10394,17 +10305,6 @@ __metadata:
languageName: node
linkType: hard
"cross-spawn@npm:^5.0.1":
version: 5.1.0
resolution: "cross-spawn@npm:5.1.0"
dependencies:
lru-cache: ^4.0.1
shebang-command: ^1.2.0
which: ^1.2.9
checksum: 726939c9954fc70c20e538923feaaa33bebc253247d13021737c3c7f68cdc3e0a57f720c0fe75057c0387995349f3f12e20e9bfdbf12274db28019c7ea4ec166
languageName: node
linkType: hard
"cross-spawn@npm:^6.0.0, cross-spawn@npm:^6.0.5":
version: 6.0.5
resolution: "cross-spawn@npm:6.0.5"
@ -12226,21 +12126,6 @@ __metadata:
languageName: node
linkType: hard
"execa@npm:^0.7.0":
version: 0.7.0
resolution: "execa@npm:0.7.0"
dependencies:
cross-spawn: ^5.0.1
get-stream: ^3.0.0
is-stream: ^1.1.0
npm-run-path: ^2.0.0
p-finally: ^1.0.0
signal-exit: ^3.0.0
strip-eof: ^1.0.0
checksum: dd70206d74b7217bf678ec9f04dddedc82f425df4c1d70e34c9f429d630ec407819e4bd42e3af2618981a4a3a1be000c9b651c0637be486cdab985160c20337c
languageName: node
linkType: hard
"execa@npm:^1.0.0":
version: 1.0.0
resolution: "execa@npm:1.0.0"
@ -13306,13 +13191,6 @@ __metadata:
languageName: node
linkType: hard
"get-stream@npm:^3.0.0":
version: 3.0.0
resolution: "get-stream@npm:3.0.0"
checksum: 36142f46005ed74ce3a45c55545ec4e7da8e243554179e345a786baf144e5c4a35fb7bdc49fadfa9f18bd08000589b6fe364abdadfc4e1eb0e1b9914a6bb9c56
languageName: node
linkType: hard
"get-stream@npm:^4.0.0":
version: 4.1.0
resolution: "get-stream@npm:4.1.0"
@ -16770,16 +16648,6 @@ __metadata:
languageName: node
linkType: hard
"lru-cache@npm:^4.0.1":
version: 4.1.5
resolution: "lru-cache@npm:4.1.5"
dependencies:
pseudomap: ^1.0.2
yallist: ^2.1.2
checksum: 4bb4b58a36cd7dc4dcec74cbe6a8f766a38b7426f1ff59d4cf7d82a2aa9b9565cd1cb98f6ff60ce5cd174524868d7bc9b7b1c294371851356066ca9ac4cf135a
languageName: node
linkType: hard
"lru-cache@npm:^5.1.1":
version: 5.1.1
resolution: "lru-cache@npm:5.1.1"
@ -17533,15 +17401,6 @@ __metadata:
languageName: node
linkType: hard
"minimatch@npm:3.0.4":
version: 3.0.4
resolution: "minimatch@npm:3.0.4"
dependencies:
brace-expansion: ^1.1.7
checksum: 66ac295f8a7b59788000ea3749938b0970344c841750abd96694f80269b926ebcafad3deeb3f1da2522978b119e6ae3a5869b63b13a7859a456b3408bd18a078
languageName: node
linkType: hard
"minimatch@npm:3.1.2, minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
version: 3.1.2
resolution: "minimatch@npm:3.1.2"
@ -18613,7 +18472,7 @@ __metadata:
languageName: node
linkType: hard
"on-headers@npm:~1.0.1, on-headers@npm:~1.0.2":
"on-headers@npm:~1.0.2":
version: 1.0.2
resolution: "on-headers@npm:1.0.2"
checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5
@ -19879,13 +19738,6 @@ __metadata:
languageName: node
linkType: hard
"pseudomap@npm:^1.0.2":
version: 1.0.2
resolution: "pseudomap@npm:1.0.2"
checksum: 856c0aae0ff2ad60881168334448e898ad7a0e45fe7386d114b150084254c01e200c957cf378378025df4e052c7890c5bd933939b0e0d2ecfcc1dc2f0b2991f5
languageName: node
linkType: hard
"psl@npm:^1.1.28":
version: 1.9.0
resolution: "psl@npm:1.9.0"
@ -22090,22 +21942,6 @@ __metadata:
languageName: node
linkType: hard
"serve-handler@npm:6.1.3":
version: 6.1.3
resolution: "serve-handler@npm:6.1.3"
dependencies:
bytes: 3.0.0
content-disposition: 0.5.2
fast-url-parser: 1.1.3
mime-types: 2.1.18
minimatch: 3.0.4
path-is-inside: 1.0.2
path-to-regexp: 2.2.1
range-parser: 1.2.0
checksum: 384c1bc10add07a554207f918acaa75af47fcfd8fb89e070faa3468ab45ec5bbc9f976e62d659b6b63404edcf5c54efb7e0a48f3f55946eec83b62b283b9837e
languageName: node
linkType: hard
"serve-handler@npm:6.1.5":
version: 6.1.5
resolution: "serve-handler@npm:6.1.5"
@ -22149,26 +21985,7 @@ __metadata:
languageName: node
linkType: hard
"serve@npm:12.0.1":
version: 12.0.1
resolution: "serve@npm:12.0.1"
dependencies:
"@zeit/schemas": 2.6.0
ajv: 6.12.6
arg: 2.0.0
boxen: 1.3.0
chalk: 2.4.1
clipboardy: 2.3.0
compression: 1.7.3
serve-handler: 6.1.3
update-check: 1.5.2
bin:
serve: bin/serve.js
checksum: 6069981c603003b2bfff6fc789780b52595ad7a3752ab9aff309d8e094fa577a20467b54cd192431031e30c6d65bf04286c36955fc54bacec9bd00efc9c388db
languageName: node
linkType: hard
"serve@npm:^14.1.1":
"serve@npm:14.1.1, serve@npm:^14.1.1":
version: 14.1.1
resolution: "serve@npm:14.1.1"
dependencies:
@ -22962,16 +22779,6 @@ __metadata:
languageName: node
linkType: hard
"string-width@npm:^2.0.0, string-width@npm:^2.1.1":
version: 2.1.1
resolution: "string-width@npm:2.1.1"
dependencies:
is-fullwidth-code-point: ^2.0.0
strip-ansi: ^4.0.0
checksum: d6173abe088c615c8dffaf3861dc5d5906ed3dc2d6fd67ff2bd2e2b5dce7fd683c5240699cf0b1b8aa679a3b3bd6b28b5053c824cb89b813d7f6541d8f89064a
languageName: node
linkType: hard
"string-width@npm:^3.0.0, string-width@npm:^3.1.0":
version: 3.1.0
resolution: "string-width@npm:3.1.0"
@ -23519,15 +23326,6 @@ __metadata:
languageName: node
linkType: hard
"term-size@npm:^1.2.0":
version: 1.2.0
resolution: "term-size@npm:1.2.0"
dependencies:
execa: ^0.7.0
checksum: 833aeb21c74d735c6ab63859fec6a7308d8724089b23b6f58e1a21c015058383529222a63074cbf0814a1812621bf11f01e60d5c5afbbfedcc31d115bf54631a
languageName: node
linkType: hard
"terser-webpack-plugin@npm:^1.4.3":
version: 1.4.5
resolution: "terser-webpack-plugin@npm:1.4.5"
@ -24446,16 +24244,6 @@ __metadata:
languageName: node
linkType: hard
"update-check@npm:1.5.2":
version: 1.5.2
resolution: "update-check@npm:1.5.2"
dependencies:
registry-auth-token: 3.3.2
registry-url: 3.1.0
checksum: 82b42978610ef616afd374153bcbff5055c6482454f3391fe5df48c0bd9fe63de16733f100f8b8d12cea7b33d094d15bdd01ef329ff123f127ca3dcf2b7dfce5
languageName: node
linkType: hard
"update-check@npm:1.5.4":
version: 1.5.4
resolution: "update-check@npm:1.5.4"
@ -25350,15 +25138,6 @@ __metadata:
languageName: node
linkType: hard
"widest-line@npm:^2.0.0":
version: 2.0.1
resolution: "widest-line@npm:2.0.1"
dependencies:
string-width: ^2.1.1
checksum: 6245b1f2cff418107f937691d1cafd0e416b9e350aa79e3853dc0759ad20849451d7126c2f06d0a13286d37b44b8e79e4220df09630bce1e4722d9808bc7bfd2
languageName: node
linkType: hard
"widest-line@npm:^3.1.0":
version: 3.1.0
resolution: "widest-line@npm:3.1.0"
@ -25716,13 +25495,6 @@ __metadata:
languageName: node
linkType: hard
"yallist@npm:^2.1.2":
version: 2.1.2
resolution: "yallist@npm:2.1.2"
checksum: 9ba99409209f485b6fcb970330908a6d41fa1c933f75e08250316cce19383179a6b70a7e0721b89672ebb6199cc377bf3e432f55100da6a7d6e11902b0a642cb
languageName: node
linkType: hard
"yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1":
version: 3.1.1
resolution: "yallist@npm:3.1.1"