Compare commits

...

20 Commits

Author SHA1 Message Date
Aakansha Doshi e9d5b41fbf tweaks
Co-authored-by: David Luzar <luzar.david@gmail.com>
2021-04-11 19:01:38 +05:30
Aakansha Doshi ef5614b697 Update src/packages/excalidraw/CHANGELOG.md 2021-04-11 14:26:50 +05:30
Aakansha Doshi cd5d9111e9 tweak docs 2021-04-11 14:20:24 +05:30
Aakansha Doshi 8467093e83 update 2021-04-11 14:16:00 +05:30
Aakansha Doshi 504ea987b0 update docs 2021-04-11 14:08:50 +05:30
Aakansha Doshi ac08f433e9 update prop name to detectPosition 2021-04-11 13:49:40 +05:30
Aakansha Doshi 4fb906baad disable detectPositionChange by default 2021-04-11 01:40:46 +05:30
Aakansha Doshi bfc8415554 feat: poll to detect if position of excalidraw was updated and allow consumer to disable it 2021-04-10 03:09:56 +05:30
Aakansha Doshi c19c8ecd27 feat: Add scroll listener to the nearest scrollable container and allow consumer to disable it (#3408)
* fix: Add scroll listener to the nearest scrollable container

* fix

* use loop instead of recursion

* fix

* return document

* calculate nearest scrollable container in settimeout to unblock main thread

* Add prop detectNearestScroll and clear timeout on unmount

* disable scroll listener on excal app

* update prop name to detectScroll

* update docs

* remove settimeout

* tweak docs

Co-authored-by: David Luzar <luzar.david@gmail.com>

* tweak changelog

Co-authored-by: David Luzar <luzar.david@gmail.com>

* lint

Co-authored-by: David Luzar <luzar.david@gmail.com>
2021-04-09 20:44:54 +05:30
Fabien BERNARD d91950bd03 feat: Add onPaste prop to customise clipboard paste event (#3420)
* Add Awaited type util

* Expose onPasteFromClipboard props

* Add `event` as second param for advanced usages

* Add support for async flows

* Extract ClipboardData type

* Rename `onPasteFromClipboard` to `onPaste`

* Remove unused type helper

* Add `onPaste` documentation

* tweak docs

* fix

Co-authored-by: Aakansha Doshi <aakansha1216@gmail.com>
2021-04-09 20:19:58 +05:30
dependabot[bot] 89472c14ed chore(deps): bump typescript from 4.2.3 to 4.2.4 (#3422)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.2.3 to 4.2.4.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/commits)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 19:55:25 +02:00
David Luzar 09dfd16b17 feat: use component dimensions to break to mobile (#3414)
Co-authored-by: Jed Fox <git@jedfox.com>
2021-04-08 19:54:50 +02:00
dependabot[bot] 016e69b9f2 chore(deps): bump @sentry/integrations from 6.2.1 to 6.2.5 (#3423)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 17:46:04 +02:00
dependabot[bot] bb1f979718 chore(deps): bump @types/react-dom from 17.0.2 to 17.0.3 (#3419)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 17:19:17 +02:00
dependabot[bot] 5fda8400f3 chore(deps): bump @testing-library/react from 11.2.5 to 11.2.6 (#3421)
Bumps [@testing-library/react](https://github.com/testing-library/react-testing-library) from 11.2.5 to 11.2.6.
- [Release notes](https://github.com/testing-library/react-testing-library/releases)
- [Changelog](https://github.com/testing-library/react-testing-library/blob/master/CHANGELOG.md)
- [Commits](https://github.com/testing-library/react-testing-library/compare/v11.2.5...v11.2.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 17:03:31 +02:00
dependabot[bot] 96beaa4354 chore(deps): bump browser-fs-access from 0.16.2 to 0.16.4 (#3418)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 16:51:50 +02:00
dependabot[bot] 7183f1c83e chore(deps): bump i18next-browser-languagedetector from 6.0.1 to 6.1.0 (#3417)
Bumps [i18next-browser-languagedetector](https://github.com/i18next/i18next-browser-languageDetector) from 6.0.1 to 6.1.0.
- [Release notes](https://github.com/i18next/i18next-browser-languageDetector/releases)
- [Changelog](https://github.com/i18next/i18next-browser-languageDetector/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-browser-languageDetector/compare/v6.0.1...v6.1.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 16:32:37 +02:00
dependabot[bot] 24ae9dca2e chore(deps-dev): bump firebase-tools from 9.6.1 to 9.9.0 (#3416)
Bumps [firebase-tools](https://github.com/firebase/firebase-tools) from 9.6.1 to 9.9.0.
- [Release notes](https://github.com/firebase/firebase-tools/releases)
- [Commits](https://github.com/firebase/firebase-tools/compare/v9.6.1...v9.9.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 16:14:16 +02:00
dependabot[bot] f6ac3ea7c6 chore(deps): bump firebase from 8.2.10 to 8.3.2 (#3391)
Bumps [firebase](https://github.com/firebase/firebase-js-sdk) from 8.2.10 to 8.3.2.
- [Release notes](https://github.com/firebase/firebase-js-sdk/releases)
- [Changelog](https://github.com/firebase/firebase-js-sdk/blob/master/CHANGELOG.md)
- [Commits](https://github.com/firebase/firebase-js-sdk/compare/firebase@8.2.10...firebase@8.3.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 16:00:29 +02:00
dependabot[bot] b88e0253cc chore(deps): bump @sentry/browser from 6.2.2 to 6.2.5 (#3403)
Bumps [@sentry/browser](https://github.com/getsentry/sentry-javascript) from 6.2.2 to 6.2.5.
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/6.2.2...6.2.5)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-08 15:57:46 +02:00
34 changed files with 493 additions and 372 deletions
+9 -9
View File
@@ -19,18 +19,18 @@
]
},
"dependencies": {
"@sentry/browser": "6.2.2",
"@sentry/integrations": "6.2.1",
"@sentry/browser": "6.2.5",
"@sentry/integrations": "6.2.5",
"@testing-library/jest-dom": "5.11.10",
"@testing-library/react": "11.2.5",
"@testing-library/react": "11.2.6",
"@types/jest": "26.0.22",
"@types/react": "17.0.3",
"@types/react-dom": "17.0.2",
"@types/react-dom": "17.0.3",
"@types/socket.io-client": "1.4.36",
"browser-fs-access": "0.16.2",
"browser-fs-access": "0.16.4",
"clsx": "1.1.1",
"firebase": "8.2.10",
"i18next-browser-languagedetector": "6.0.1",
"firebase": "8.3.2",
"i18next-browser-languagedetector": "6.1.0",
"lodash.throttle": "4.1.1",
"nanoid": "3.1.22",
"open-color": "1.8.0",
@@ -46,7 +46,7 @@
"roughjs": "4.3.1",
"sass": "1.32.8",
"socket.io-client": "2.3.1",
"typescript": "4.2.3"
"typescript": "4.2.4"
},
"devDependencies": {
"@excalidraw/eslint-config": "1.0.0",
@@ -56,7 +56,7 @@
"@types/resize-observer-browser": "0.1.5",
"eslint-config-prettier": "8.1.0",
"eslint-plugin-prettier": "3.3.1",
"firebase-tools": "9.6.1",
"firebase-tools": "9.9.0",
"husky": "4.3.8",
"jest-canvas-mock": "2.3.1",
"lint-staged": "10.5.4",
+1 -1
View File
@@ -8,7 +8,7 @@ import { getCommonBounds, getNonDeletedElements } from "../element";
import { newElementWith } from "../element/mutateElement";
import { ExcalidrawElement } from "../element/types";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { CODES, KEYS } from "../keys";
import { getNormalizedZoom, getSelectedElements } from "../scene";
import { centerScrollOn } from "../scene/scroll";
+1 -1
View File
@@ -8,7 +8,7 @@ import { Tooltip } from "../components/Tooltip";
import { DarkModeToggle, Appearence } from "../components/DarkModeToggle";
import { loadFromJSON, saveAsJSON } from "../data";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { KEYS } from "../keys";
import { register } from "./register";
import { supported } from "browser-fs-access";
+8 -6
View File
@@ -14,6 +14,13 @@ type ElementsClipboard = {
elements: ExcalidrawElement[];
};
export interface ClipboardData {
spreadsheet?: Spreadsheet;
elements?: readonly ExcalidrawElement[];
text?: string;
errorMessage?: string;
}
let CLIPBOARD = "";
let PREFER_APP_CLIPBOARD = false;
@@ -110,12 +117,7 @@ const getSystemClipboard = async (
*/
export const parseClipboard = async (
event: ClipboardEvent | null,
): Promise<{
spreadsheet?: Spreadsheet;
elements?: readonly ExcalidrawElement[];
text?: string;
errorMessage?: string;
}> => {
): Promise<ClipboardData> => {
const systemClipboard = await getSystemClipboard(event);
// if system clipboard empty, couldn't be resolved, or contains previously
+1 -1
View File
@@ -3,7 +3,7 @@ import { ActionManager } from "../actions/manager";
import { getNonDeletedElements } from "../element";
import { ExcalidrawElement } from "../element/types";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import {
canChangeSharpness,
canHaveArrowheads,
+125 -61
View File
@@ -1,5 +1,5 @@
import { Point, simplify } from "points-on-curve";
import React from "react";
import React, { useContext } from "react";
import { RoughCanvas } from "roughjs/bin/canvas";
import rough from "roughjs/bin/rough";
import clsx from "clsx";
@@ -46,6 +46,7 @@ import {
CURSOR_TYPE,
DEFAULT_UI_OPTIONS,
DEFAULT_VERTICAL_ALIGN,
DETECT_POSITION_CHANGE_INTERVAL,
DRAGGING_THRESHOLD,
ELEMENT_SHIFT_TRANSLATE_AMOUNT,
ELEMENT_TRANSLATE_AMOUNT,
@@ -54,6 +55,9 @@ import {
GRID_SIZE,
LINE_CONFIRM_THRESHOLD,
MIME_TYPES,
MQ_MAX_HEIGHT_LANDSCAPE,
MQ_MAX_WIDTH_LANDSCAPE,
MQ_MAX_WIDTH_PORTRAIT,
POINTER_BUTTON,
SCROLL_TIMEOUT,
TAP_TWICE_TIMEOUT,
@@ -165,6 +169,7 @@ import { AppProps, AppState, Gesture, GestureEvent, SceneData } from "../types";
import {
debounce,
distance,
getNearestScrollableContainer,
isInputLike,
isToolIcon,
isWritableElement,
@@ -178,13 +183,15 @@ import {
viewportCoordsToSceneCoords,
withBatchedUpdates,
} from "../utils";
import { isMobile } from "../is-mobile";
import ContextMenu, { ContextMenuOption } from "./ContextMenu";
import LayerUI from "./LayerUI";
import { Stats } from "./Stats";
import { Toast } from "./Toast";
import { actionToggleViewMode } from "../actions/actionToggleViewMode";
export const IsMobileContext = React.createContext(false);
export const useIsMobile = () => useContext(IsMobileContext);
const { history } = createHistory();
let didTapTwice: boolean = false;
@@ -286,6 +293,9 @@ class App extends React.Component<AppProps, AppState> {
rc: RoughCanvas | null = null;
unmounted: boolean = false;
actionManager: ActionManager;
isMobile = false;
detachIsMobileMqHandler?: () => void;
private excalidrawContainerRef = React.createRef<HTMLDivElement>();
public static defaultProps: Partial<AppProps> = {
@@ -295,6 +305,9 @@ class App extends React.Component<AppProps, AppState> {
private scene: Scene;
private resizeObserver: ResizeObserver | undefined;
private nearestScrollableContainer: HTMLElement | Document | undefined;
private detectPositionIntervalId: NodeJS.Timeout | undefined;
constructor(props: AppProps) {
super(props);
const defaultAppState = getDefaultAppState();
@@ -437,60 +450,64 @@ class App extends React.Component<AppProps, AppState> {
<div
className={clsx("excalidraw", {
"excalidraw--view-mode": viewModeEnabled,
"excalidraw--mobile": this.isMobile,
})}
ref={this.excalidrawContainerRef}
onDrop={this.handleAppOnDrop}
>
<LayerUI
canvas={this.canvas}
appState={this.state}
setAppState={this.setAppState}
actionManager={this.actionManager}
elements={this.scene.getElements()}
onCollabButtonClick={onCollabButtonClick}
onLockToggle={this.toggleLock}
onInsertElements={(elements) =>
this.addElementsFromPasteOrLibrary(
elements,
DEFAULT_PASTE_X,
DEFAULT_PASTE_Y,
)
}
zenModeEnabled={zenModeEnabled}
toggleZenMode={this.toggleZenMode}
langCode={getLanguage().code}
isCollaborating={this.props.isCollaborating || false}
onExportToBackend={onExportToBackend}
renderCustomFooter={renderFooter}
viewModeEnabled={viewModeEnabled}
showExitZenModeBtn={
typeof this.props?.zenModeEnabled === "undefined" && zenModeEnabled
}
showThemeBtn={
typeof this.props?.theme === "undefined" &&
this.props.UIOptions.canvasActions.theme
}
libraryReturnUrl={this.props.libraryReturnUrl}
UIOptions={this.props.UIOptions}
/>
<div className="excalidraw-textEditorContainer" />
<div className="excalidraw-contextMenuContainer" />
{this.state.showStats && (
<Stats
<IsMobileContext.Provider value={this.isMobile}>
<LayerUI
canvas={this.canvas}
appState={this.state}
setAppState={this.setAppState}
actionManager={this.actionManager}
elements={this.scene.getElements()}
onClose={this.toggleStats}
renderCustomStats={renderCustomStats}
onCollabButtonClick={onCollabButtonClick}
onLockToggle={this.toggleLock}
onInsertElements={(elements) =>
this.addElementsFromPasteOrLibrary(
elements,
DEFAULT_PASTE_X,
DEFAULT_PASTE_Y,
)
}
zenModeEnabled={zenModeEnabled}
toggleZenMode={this.toggleZenMode}
langCode={getLanguage().code}
isCollaborating={this.props.isCollaborating || false}
onExportToBackend={onExportToBackend}
renderCustomFooter={renderFooter}
viewModeEnabled={viewModeEnabled}
showExitZenModeBtn={
typeof this.props?.zenModeEnabled === "undefined" &&
zenModeEnabled
}
showThemeBtn={
typeof this.props?.theme === "undefined" &&
this.props.UIOptions.canvasActions.theme
}
libraryReturnUrl={this.props.libraryReturnUrl}
UIOptions={this.props.UIOptions}
/>
)}
{this.state.toastMessage !== null && (
<Toast
message={this.state.toastMessage}
clearToast={this.clearToast}
/>
)}
<main>{this.renderCanvas()}</main>
<div className="excalidraw-textEditorContainer" />
<div className="excalidraw-contextMenuContainer" />
{this.state.showStats && (
<Stats
appState={this.state}
setAppState={this.setAppState}
elements={this.scene.getElements()}
onClose={this.toggleStats}
renderCustomStats={renderCustomStats}
/>
)}
{this.state.toastMessage !== null && (
<Toast
message={this.state.toastMessage}
clearToast={this.clearToast}
/>
)}
<main>{this.renderCanvas()}</main>
</IsMobileContext.Provider>
</div>
);
}
@@ -774,12 +791,38 @@ class App extends React.Component<AppProps, AppState> {
this.scene.addCallback(this.onSceneUpdated);
this.addEventListeners();
if (this.props.detectPosition) {
this.detectPositionIntervalId = setInterval(
this.updateOffsetsIfChanged,
DETECT_POSITION_CHANGE_INTERVAL,
);
}
if ("ResizeObserver" in window && this.excalidrawContainerRef?.current) {
this.resizeObserver = new ResizeObserver(() => {
// compute isMobile state
// ---------------------------------------------------------------------
const {
width,
height,
} = this.excalidrawContainerRef.current!.getBoundingClientRect();
this.isMobile =
width < MQ_MAX_WIDTH_PORTRAIT ||
(height < MQ_MAX_HEIGHT_LANDSCAPE && width < MQ_MAX_WIDTH_LANDSCAPE);
// refresh offsets
// ---------------------------------------------------------------------
this.updateDOMRect();
});
this.resizeObserver?.observe(this.excalidrawContainerRef.current);
} else if (window.matchMedia) {
const mediaQuery = window.matchMedia(
`(max-width: ${MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${MQ_MAX_WIDTH_LANDSCAPE}px)`,
);
const handler = () => (this.isMobile = mediaQuery.matches);
mediaQuery.addListener(handler);
this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);
}
const searchParams = new URLSearchParams(window.location.search.slice(1));
if (searchParams.has("web-share-target")) {
@@ -796,6 +839,9 @@ class App extends React.Component<AppProps, AppState> {
this.removeEventListeners();
this.scene.destroy();
clearTimeout(touchTimeout);
if (this.detectPositionIntervalId) {
clearInterval(this.detectPositionIntervalId);
}
touchTimeout = 0;
}
@@ -810,6 +856,10 @@ class App extends React.Component<AppProps, AppState> {
document.removeEventListener(EVENT.COPY, this.onCopy);
document.removeEventListener(EVENT.PASTE, this.pasteFromClipboard);
document.removeEventListener(EVENT.CUT, this.onCut);
this.nearestScrollableContainer?.removeEventListener(
EVENT.SCROLL,
this.onScroll,
);
document.removeEventListener(EVENT.KEYDOWN, this.onKeyDown, false);
document.removeEventListener(
@@ -839,6 +889,8 @@ class App extends React.Component<AppProps, AppState> {
this.onGestureEnd as any,
false,
);
this.detachIsMobileMqHandler?.();
}
private addEventListeners() {
@@ -874,8 +926,15 @@ class App extends React.Component<AppProps, AppState> {
document.addEventListener(EVENT.PASTE, this.pasteFromClipboard);
document.addEventListener(EVENT.CUT, this.onCut);
document.addEventListener(EVENT.SCROLL, this.onScroll);
if (this.props.detectScroll) {
this.nearestScrollableContainer = getNearestScrollableContainer(
this.excalidrawContainerRef.current!,
);
this.nearestScrollableContainer.addEventListener(
EVENT.SCROLL,
this.onScroll,
);
}
window.addEventListener(EVENT.RESIZE, this.onResize, false);
window.addEventListener(EVENT.UNLOAD, this.onUnload, false);
window.addEventListener(EVENT.BLUR, this.onBlur, false);
@@ -1016,7 +1075,7 @@ class App extends React.Component<AppProps, AppState> {
},
{
renderOptimizations: true,
renderScrollbars: !isMobile(),
renderScrollbars: !this.isMobile,
},
);
if (scrollBars) {
@@ -1045,7 +1104,7 @@ class App extends React.Component<AppProps, AppState> {
}
}
private onScroll = debounce(() => {
private updateOffsetsIfChanged = () => {
const { offsetTop, offsetLeft } = this.getCanvasOffsets();
this.setState((state) => {
if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {
@@ -1053,7 +1112,9 @@ class App extends React.Component<AppProps, AppState> {
}
return { offsetTop, offsetLeft };
});
}, SCROLL_TIMEOUT);
};
private onScroll = debounce(this.updateOffsetsIfChanged, SCROLL_TIMEOUT);
// Copy/paste
@@ -1155,6 +1216,11 @@ class App extends React.Component<AppProps, AppState> {
return;
}
const data = await parseClipboard(event);
if (this.props.onPaste) {
if (await this.props.onPaste(data, event)) {
return;
}
}
if (data.errorMessage) {
this.setState({ errorMessage: data.errorMessage });
} else if (data.spreadsheet) {
@@ -3811,8 +3877,6 @@ class App extends React.Component<AppProps, AppState> {
const separator = "separator";
const _isMobile = isMobile();
const elements = this.scene.getElements();
const options: ContextMenuOption[] = [];
@@ -3849,7 +3913,7 @@ class App extends React.Component<AppProps, AppState> {
ContextMenu.push({
options: [
_isMobile &&
this.isMobile &&
navigator.clipboard && {
name: "paste",
perform: (elements, appStates) => {
@@ -3860,7 +3924,7 @@ class App extends React.Component<AppProps, AppState> {
},
contextItemLabel: "labels.paste",
},
_isMobile && navigator.clipboard && separator,
this.isMobile && navigator.clipboard && separator,
probablySupportsClipboardBlob &&
elements.length > 0 &&
actionCopyAsPng,
@@ -3903,9 +3967,9 @@ class App extends React.Component<AppProps, AppState> {
ContextMenu.push({
options: [
_isMobile && actionCut,
_isMobile && navigator.clipboard && actionCopy,
_isMobile &&
this.isMobile && actionCut,
this.isMobile && navigator.clipboard && actionCopy,
this.isMobile &&
navigator.clipboard && {
name: "paste",
perform: (elements, appStates) => {
@@ -3916,7 +3980,7 @@ class App extends React.Component<AppProps, AppState> {
},
contextItemLabel: "labels.paste",
},
_isMobile && separator,
this.isMobile && separator,
...options,
separator,
actionCopyStyles,
+1 -1
View File
@@ -2,7 +2,7 @@ import React from "react";
import clsx from "clsx";
import { ToolButton } from "./ToolButton";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { users } from "./icons";
import "./CollabButton.scss";
+1 -1
View File
@@ -218,7 +218,7 @@
left: 2px;
}
@media #{$is-mobile-query} {
@include isMobile {
display: none;
}
}
+1 -1
View File
@@ -76,7 +76,7 @@
z-index: 1;
}
@media #{$is-mobile-query} {
@include isMobile {
.context-menu-option {
display: block;
+1 -1
View File
@@ -31,7 +31,7 @@
padding: 0 16px 16px;
}
@media #{$is-mobile-query} {
@include isMobile {
.Dialog {
--metric: calc(var(--space-factor) * 4);
--inset-left: #{"max(var(--metric), var(--sal))"};
+1 -1
View File
@@ -2,7 +2,7 @@ import clsx from "clsx";
import React, { useEffect } from "react";
import { useCallbackRefState } from "../hooks/useCallbackRefState";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { KEYS } from "../keys";
import "./Dialog.scss";
import { back, close } from "./icons";
+1 -1
View File
@@ -55,7 +55,7 @@
}
}
@media #{$is-mobile-query} {
@include isMobile {
.ExportDialog {
display: flex;
flex-direction: column;
+1 -1
View File
@@ -6,7 +6,7 @@ import { canvasToBlob } from "../data/blob";
import { NonDeletedExcalidrawElement } from "../element/types";
import { CanvasError } from "../errors";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { getSelectedElements, isSomeElementSelected } from "../scene";
import { exportToCanvas, getExportSize } from "../scene/export";
import { AppState } from "../types";
+1 -1
View File
@@ -19,7 +19,7 @@ $wide-viewport-width: 1000px;
color: $oc-gray-6;
font-size: 0.8rem;
@media #{$is-mobile-query} {
@include isMobile {
position: static;
padding-right: 2em;
}
+1 -1
View File
@@ -111,7 +111,7 @@
:root[dir="rtl"] & {
left: 2px;
}
@media #{$is-mobile-query} {
@include isMobile {
display: none;
}
}
+1 -1
View File
@@ -14,7 +14,7 @@ import { Library } from "../data/library";
import { isTextElement, showSelectedShapeActions } from "../element";
import { NonDeletedExcalidrawElement } from "../element/types";
import { Language, t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { calculateScrollCenter, getSelectedElements } from "../scene";
import { ExportType } from "../scene/types";
import {
+1 -1
View File
@@ -4,7 +4,7 @@ import React, { useEffect, useRef, useState } from "react";
import { close } from "../components/icons";
import { MIME_TYPES } from "../constants";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { exportToSvg } from "../scene/export";
import { LibraryItem } from "../types";
import "./LibraryUnit.scss";
+2 -2
View File
@@ -52,7 +52,7 @@
border-radius: 6px;
box-sizing: border-box;
@media #{$is-mobile-query} {
@include isMobile {
max-width: 100%;
border: 0;
border-radius: 0;
@@ -82,7 +82,7 @@
}
}
@media #{$is-mobile-query} {
@include isMobile {
.Modal {
padding: 0;
}
+13 -1
View File
@@ -1,9 +1,10 @@
import "./Modal.scss";
import React, { useState, useLayoutEffect } from "react";
import React, { useState, useLayoutEffect, useRef } from "react";
import { createPortal } from "react-dom";
import clsx from "clsx";
import { KEYS } from "../keys";
import { useIsMobile } from "../components/App";
export const Modal = (props: {
className?: string;
@@ -48,6 +49,16 @@ export const Modal = (props: {
const useBodyRoot = () => {
const [div, setDiv] = useState<HTMLDivElement | null>(null);
const isMobile = useIsMobile();
const isMobileRef = useRef(isMobile);
isMobileRef.current = isMobile;
useLayoutEffect(() => {
if (div) {
div.classList.toggle("excalidraw--mobile", isMobile);
}
}, [div, isMobile]);
useLayoutEffect(() => {
const isDarkTheme = !!document
.querySelector(".excalidraw")
@@ -55,6 +66,7 @@ const useBodyRoot = () => {
const div = document.createElement("div");
div.classList.add("excalidraw", "excalidraw-modal-container");
div.classList.toggle("excalidraw--mobile", isMobileRef.current);
if (isDarkTheme) {
div.classList.add("theme--dark");
+2 -2
View File
@@ -2,7 +2,7 @@
.excalidraw {
.PasteChartDialog {
@media #{$is-mobile-query} {
@include isMobile {
.Island {
display: flex;
flex-direction: column;
@@ -13,7 +13,7 @@
align-items: center;
justify-content: space-around;
flex-wrap: wrap;
@media #{$is-mobile-query} {
@include isMobile {
flex-direction: column;
justify-content: center;
}
+1 -1
View File
@@ -2,7 +2,7 @@ import React from "react";
import { getCommonBounds } from "../element/bounds";
import { NonDeletedExcalidrawElement } from "../element/types";
import { t } from "../i18n";
import { useIsMobile } from "../is-mobile";
import { useIsMobile } from "../components/App";
import { getTargetElements } from "../scene";
import { AppState, ExcalidrawProps } from "../types";
import { close } from "./icons";
+1 -1
View File
@@ -193,7 +193,7 @@
margin-left: 5px;
margin-top: 1px;
@media #{$is-mobile-query} {
@include isMobile {
display: none;
}
}
+5 -1
View File
@@ -102,7 +102,7 @@ export const TITLE_TIMEOUT = 10000;
export const TOAST_TIMEOUT = 5000;
export const VERSION_TIMEOUT = 30000;
export const SCROLL_TIMEOUT = 100;
export const DETECT_POSITION_CHANGE_INTERVAL = 500;
export const ZOOM_STEP = 0.1;
// Report a user inactive after IDLE_THRESHOLD milliseconds
@@ -137,3 +137,7 @@ export const DEFAULT_UI_OPTIONS: AppProps["UIOptions"] = {
theme: true,
},
};
export const MQ_MAX_WIDTH_PORTRAIT = 730;
export const MQ_MAX_WIDTH_LANDSCAPE = 1000;
export const MQ_MAX_HEIGHT_LANDSCAPE = 500;
+1 -1
View File
@@ -480,7 +480,7 @@
}
}
@media #{$is-mobile-query} {
@include isMobile {
aside {
display: none;
}
+6 -3
View File
@@ -1,10 +1,13 @@
@import "open-color/open-color.scss";
// keep up to date with is-mobile.tsx
$is-mobile-query: "(max-width: 600px), (max-height: 500px) and (max-width: 1000px)";
@mixin isMobile() {
@at-root .excalidraw--mobile#{&} {
@content;
}
}
$theme-filter: "invert(93%) hue-rotate(180deg)";
:export {
isMobileQuery: unquote($is-mobile-query);
themeFilter: unquote($theme-filter);
}
+3 -3
View File
@@ -32,13 +32,13 @@
display: flex;
align-items: center;
justify-content: center;
@media #{$is-mobile-query} {
@include isMobile {
flex-direction: column;
align-items: stretch;
}
}
@media #{$is-mobile-query} {
@include isMobile {
.RoomDialog-usernameLabel {
font-weight: bold;
}
@@ -51,7 +51,7 @@
min-width: 0;
flex: 1 1 auto;
margin-inline-start: 1em;
@media #{$is-mobile-query} {
@include isMobile {
margin-top: 0.5em;
margin-inline-start: 0;
}
+1
View File
@@ -324,6 +324,7 @@ const ExcalidrawWrapper = () => {
renderFooter={renderFooter}
langCode={langCode}
renderCustomStats={renderCustomStats}
detectScroll={false}
/>
{excalidrawAPI && <CollabWrapper excalidrawAPI={excalidrawAPI} />}
{errorMessage && (
-37
View File
@@ -1,37 +0,0 @@
import React, { useState, useEffect, useRef, useContext } from "react";
import variables from "./css/variables.module.scss";
const context = React.createContext(false);
const getIsMobileMatcher = () => {
return window.matchMedia
? window.matchMedia(variables.isMobileQuery)
: (({
matches: false,
addListener: () => {},
removeListener: () => {},
} as any) as MediaQueryList);
};
export const IsMobileProvider = ({
children,
}: {
children: React.ReactNode;
}) => {
const query = useRef<MediaQueryList>();
if (!query.current) {
query.current = getIsMobileMatcher();
}
const [isMobile, setMobile] = useState(query.current.matches);
useEffect(() => {
const handler = () => setMobile(query.current!.matches);
query.current!.addListener(handler);
return () => query.current!.removeListener(handler);
}, []);
return <context.Provider value={isMobile}>{children}</context.Provider>;
};
export const isMobile = () => getIsMobileMatcher().matches;
export const useIsMobile = () => useContext(context);
+14
View File
@@ -11,6 +11,20 @@ The change should be grouped under one of the below section and must contain PR
Please add the latest change on the top under the correct section.
-->
## Unreleased
## Excalidraw API
- Support detecting position of the component and recompute offsets when the position changes [#3428](https://github.com/excalidraw/excalidraw/pull/3428). Disabled by default. You can enable this by setting [`detectPosition`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#detectPosition) to `true`.
- Recompute offsets on `scroll` of the nearest scrollable container [#3408](https://github.com/excalidraw/excalidraw/pull/3408). This can be disabled by setting [`detectScroll`](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#detectScroll) to `false`.
- Add `onPaste` prop to handle custom clipboard behaviours [#3420](https://github.com/excalidraw/excalidraw/pull/3420).
## Excalidraw Library
### Features
- App now breaks into mobile view using the component dimensions, not viewport dimensions. This fixes a case where the app would break sooner than necessary when the component's size is smaller than viewport [#3414](https://github.com/excalidraw/excalidraw/pull/3414).
## 0.6.0 (2021-04-04)
## Excalidraw API
+35 -4
View File
@@ -364,6 +364,9 @@ To view the full example visit :point_down:
| [`theme`](#theme) | `light` or `dark` | | The theme of the Excalidraw component |
| [`name`](#name) | string | | Name of the drawing |
| [`UIOptions`](#UIOptions) | <pre>{ canvasActions: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L208"> CanvasActions<a/> }</pre> | [DEFAULT UI OPTIONS](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L129) | To customise UI options. Currently we support customising [`canvas actions`](#canvasActions) |
| [`onPaste`](#onPaste) | <pre>(data: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/clipboard.ts#L17">ClipboardData</a>, event: ClipboardEvent &#124; null) => boolean</pre> | | Callback to be triggered if passed when the something is pasted in to the scene |
| [`detectScroll`](#detectScroll) | boolean | true | Indicates whether to recompute the offsets when nearest ancestor is scrolled. |
| [`detectPosition`](#detectPosition) | boolean | false | Indicates whether to recompute the offsets when position of the Excalidraw component is updated. |
### Dimensions of Excalidraw
@@ -439,8 +442,8 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the
| getAppState | <pre> () => <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L37">AppState</a></pre> | Returns current appState |
| history | `{ clear: () => void }` | This is the history API. `history.clear()` will clear the history |
| setScrollToContent | <pre> (<a href="https://github.com/excalidraw/excalidraw/blob/master/src/element/types.ts#L78">ExcalidrawElement[]</a>) => void </pre> | Scroll to the nearest element to center |
| refresh | `() => void` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You don't have to call this when the position is changed on page scroll or when the excalidraw container resizes (we handle that ourselves). For any other cases if the position of excalidraw is updated (example due to scroll on parent container and not page scroll) you should call this API. |
| [importLibrary](#importlibrary) | `(url: string, token?: string) => void` | Imports library from given URL |
| [`refresh`](#refresh) | `() => void` | Recomputes the offsets for the Excalidraw component. |
| [`importLibrary`](#importlibrary) | `(url: string, token?: string) => void` | Imports library from given URL. |
| setToastMessage | `(message: string) => void` | This API can be used to show the toast with custom message. |
#### `readyPromise`
@@ -528,7 +531,7 @@ This prop controls Excalidraw's theme. When supplied, the value takes precedence
This prop sets the name of the drawing which will be used when exporting the drawing. When supplied, the value takes precedence over `intialData.appState.name`, the `name` will be fully controlled by host app and the users won't be able to edit from within Excalidraw.
### `UIOptions`
#### `UIOptions`
This prop can be used to customise UI of Excalidraw. Currently we support customising only [`canvasActions`](#canvasActions). It accepts the below parameters
@@ -536,7 +539,7 @@ This prop can be used to customise UI of Excalidraw. Currently we support custom
{ canvasActions: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/types.ts#L208"> CanvasActions<a/> }
</pre>
#### canvasActions
##### canvasActions
| Attribute | Type | Default | Description |
| --- | --- | --- | --- |
@@ -548,10 +551,26 @@ This prop can be used to customise UI of Excalidraw. Currently we support custom
| `saveScene` | boolean | true | Implies whether to show `Save button` |
| `theme` | boolean | true | Implies whether to show `Theme toggle` |
#### `onPaste`
This callback is triggered if passed when something is pasted into the scene. You can use this callback in case you want to do something additional when the paste event occurs.
<pre>
(data: <a href="https://github.com/excalidraw/excalidraw/blob/master/src/clipboard.ts#L17">ClipboardData</a>, event: ClipboardEvent &#124; null) => boolean
</pre>
This callback must return a `boolean` value or a [promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise) which resolves to a boolean value.
In case you want to prevent the excalidraw paste action you must return `true`, it will stop the native excalidraw clipboard management flow (nothing will be pasted into the scene).
### Does it support collaboration ?
No Excalidraw package doesn't come with collaboration, since this would have different implementations on the consumer so we expose the API's which you can use to communicate with Excalidraw as mentioned above. If you are interested in understanding how Excalidraw does it you can check it [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx).
### refresh
Recomputes the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You don't have to call this when the position is changed due to scrolling on the nearest scrollable parent or when the excalidraw container resizes (we handle that ourselves). For any other cases if the position of excalidraw is updated (for example due to multiple scrolls or add / removal of elements in flex container) you can enable [`detectPosition`](#detectposition) or handle it manually by calling this API.
### importLibrary
Imports library from given URL. You should call this on `hashchange`, passing the `addLibrary` value if you detect it as shown below. Optionally pass a CSRF `token` to skip prompting during installation (retrievable via `token` key from the url coming from [https://libraries.excalidraw.com](https://libraries.excalidraw.com/)).
@@ -574,6 +593,18 @@ useEffect(() => {
Try out the [Demo](#Demo) to see it in action.
### detectScroll
Indicates whether Excalidraw should listen for `scroll` event on the nearest scrollable container in the DOM tree and recompute the coordinates (e.g. to correctly handle the cursor) when the component's position changes. You can disable this when you either know this doesn't affect your app or you want to take care of it yourself (calling the [`refresh()`](#refresh) method).
### detectPosition
Indicates whether the coordinates should be recomputed (e.g. to correctly handle the cursor) when the component's position changes. This is disabled by default.
Resizing and handling nearest scrollable parent ([detectScroll](#detectScroll)) is already handled so if there is any other case where position gets updated is where you will want to enable this prop (eg multiple scroll containers, or position updating due to addition/removal of elements in flex container).
You might want to disable [detectScroll](#detectScroll) when you enable this prop.
### Extra API's
#### `getSceneVersion`
+25 -27
View File
@@ -8,7 +8,6 @@ import "../../css/app.scss";
import "../../css/styles.scss";
import { ExcalidrawAPIRefValue, ExcalidrawProps } from "../../types";
import { IsMobileProvider } from "../../is-mobile";
import { defaultLang } from "../../i18n";
import { DEFAULT_UI_OPTIONS } from "../../constants";
@@ -30,6 +29,9 @@ const Excalidraw = (props: ExcalidrawProps) => {
theme,
name,
renderCustomStats,
onPaste,
detectScroll = true,
detectPosition = false,
} = props;
const canvasActions = props.UIOptions?.canvasActions;
@@ -61,27 +63,28 @@ const Excalidraw = (props: ExcalidrawProps) => {
return (
<InitializeApp langCode={langCode}>
<IsMobileProvider>
<App
onChange={onChange}
initialData={initialData}
excalidrawRef={excalidrawRef}
onCollabButtonClick={onCollabButtonClick}
isCollaborating={isCollaborating}
onPointerUpdate={onPointerUpdate}
onExportToBackend={onExportToBackend}
renderFooter={renderFooter}
langCode={langCode}
viewModeEnabled={viewModeEnabled}
zenModeEnabled={zenModeEnabled}
gridModeEnabled={gridModeEnabled}
libraryReturnUrl={libraryReturnUrl}
theme={theme}
name={name}
renderCustomStats={renderCustomStats}
UIOptions={UIOptions}
/>
</IsMobileProvider>
<App
onChange={onChange}
initialData={initialData}
excalidrawRef={excalidrawRef}
onCollabButtonClick={onCollabButtonClick}
isCollaborating={isCollaborating}
onPointerUpdate={onPointerUpdate}
onExportToBackend={onExportToBackend}
renderFooter={renderFooter}
langCode={langCode}
viewModeEnabled={viewModeEnabled}
zenModeEnabled={zenModeEnabled}
gridModeEnabled={gridModeEnabled}
libraryReturnUrl={libraryReturnUrl}
theme={theme}
name={name}
renderCustomStats={renderCustomStats}
UIOptions={UIOptions}
onPaste={onPaste}
detectScroll={detectScroll}
detectPosition={detectPosition}
/>
</InitializeApp>
);
};
@@ -103,11 +106,6 @@ const areEqual = (
);
};
Excalidraw.defaultProps = {
lanCode: defaultLang.code,
UIOptions: DEFAULT_UI_OPTIONS,
};
const forwardedRefComp = forwardRef<
ExcalidrawAPIRefValue,
PublicExcalidrawProps
+9
View File
@@ -20,6 +20,7 @@ import { ExcalidrawImperativeAPI } from "./components/App";
import type { ResolvablePromise } from "./utils";
import { Spreadsheet } from "./charts";
import { Language } from "./i18n";
import { ClipboardData } from "./clipboard";
export type Point = Readonly<RoughPoint>;
@@ -177,6 +178,10 @@ export interface ExcalidrawProps {
appState: AppState,
canvas: HTMLCanvasElement | null,
) => void;
onPaste?: (
data: ClipboardData,
event: ClipboardEvent | null,
) => Promise<boolean> | boolean;
renderFooter?: (isMobile: boolean) => JSX.Element;
langCode?: Language["code"];
viewModeEnabled?: boolean;
@@ -190,6 +195,8 @@ export interface ExcalidrawProps {
appState: AppState,
) => JSX.Element;
UIOptions?: UIOptions;
detectScroll?: boolean;
detectPosition?: boolean;
}
export type SceneData = {
@@ -223,4 +230,6 @@ export type AppProps = ExcalidrawProps & {
UIOptions: {
canvasActions: Required<CanvasActions>;
};
detectScroll: boolean;
detectPosition: boolean;
};
+21
View File
@@ -406,3 +406,24 @@ export const supportsEmoji = () => {
ctx.fillText("😀", 0, 0);
return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;
};
export const getNearestScrollableContainer = (
element: HTMLElement,
): HTMLElement | Document => {
let parent = element.parentElement;
while (parent) {
if (parent === document.body) {
return document;
}
const { overflowY } = window.getComputedStyle(parent);
const hasScrollableContent = parent.scrollHeight > parent.clientHeight;
if (
hasScrollableContent &&
(overflowY === "auto" || overflowY === "scroll")
) {
return parent;
}
parent = parent.parentElement;
}
return document;
};
+198 -199
View File
@@ -1088,31 +1088,33 @@
version "0.4.0"
resolved "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.4.0.tgz"
"@firebase/analytics@0.6.4":
version "0.6.4"
resolved "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.6.4.tgz"
"@firebase/analytics@0.6.7":
version "0.6.7"
resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.6.7.tgz#9c6d3fc478555829e43ecd7fb4dd4884ad1b9c7d"
integrity sha512-ObnFDewIqiamvU7UKDx+0jfLrD3LyqEIsXZdjnGQhY/xc10HFH0jp23lOzb39CWf/399X+xMMJ3Uj51VyHwbJQ==
dependencies:
"@firebase/analytics-types" "0.4.0"
"@firebase/component" "0.2.0"
"@firebase/installations" "0.4.20"
"@firebase/component" "0.3.1"
"@firebase/installations" "0.4.23"
"@firebase/logger" "0.2.6"
"@firebase/util" "0.3.4"
tslib "^1.11.1"
"@firebase/util" "0.4.1"
tslib "^2.1.0"
"@firebase/app-types@0.6.1":
version "0.6.1"
resolved "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz"
"@firebase/app@0.6.15":
version "0.6.15"
resolved "https://registry.npmjs.org/@firebase/app/-/app-0.6.15.tgz"
"@firebase/app@0.6.18":
version "0.6.18"
resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.6.18.tgz#68df65fee9929d5ace7a25fcd522888c0858bb2b"
integrity sha512-eBThPc4QGHy/FC+oHZsnp4Qk6oksYTZ10B4jXaVH1lCS5eUSKvV1TIzAtpkPzMp2huS/qBz411r1tkQUv5vKcw==
dependencies:
"@firebase/app-types" "0.6.1"
"@firebase/component" "0.2.0"
"@firebase/component" "0.3.1"
"@firebase/logger" "0.2.6"
"@firebase/util" "0.3.4"
"@firebase/util" "0.4.1"
dom-storage "2.1.0"
tslib "^1.11.1"
tslib "^2.1.0"
xmlhttprequest "1.8.0"
"@firebase/auth-interop-types@0.1.5":
@@ -1129,12 +1131,13 @@
dependencies:
"@firebase/auth-types" "0.10.2"
"@firebase/component@0.2.0":
version "0.2.0"
resolved "https://registry.npmjs.org/@firebase/component/-/component-0.2.0.tgz"
"@firebase/component@0.3.1":
version "0.3.1"
resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.3.1.tgz#91e32bd4426ad10f6bbe86b178780e8715171986"
integrity sha512-8ACaB772bWwZRE47aVEYzld+jlDPgvHnLZoiVtG6BzygonVnKzwXo0wK6wcRzCbx4kun7G/gXYM0gUMkqvKtRA==
dependencies:
"@firebase/util" "0.3.4"
tslib "^1.11.1"
"@firebase/util" "0.4.1"
tslib "^2.1.0"
"@firebase/database-types@0.7.0":
version "0.7.0"
@@ -1142,63 +1145,68 @@
dependencies:
"@firebase/app-types" "0.6.1"
"@firebase/database@0.9.4":
version "0.9.4"
resolved "https://registry.npmjs.org/@firebase/database/-/database-0.9.4.tgz"
"@firebase/database@0.9.7":
version "0.9.7"
resolved "https://registry.yarnpkg.com/@firebase/database/-/database-0.9.7.tgz#42a03c18cd705e95ad2c8fcc739616eecb8e1dfa"
integrity sha512-JUm6CnUxFRuyWvzTAzv/Mo/KYwLtUezpNGa4AzbhbdS8t3ewprc/7ARFErpv95cIM5MgiiPcLOC5F+mLDmrQwA==
dependencies:
"@firebase/auth-interop-types" "0.1.5"
"@firebase/component" "0.2.0"
"@firebase/component" "0.3.1"
"@firebase/database-types" "0.7.0"
"@firebase/logger" "0.2.6"
"@firebase/util" "0.3.4"
"@firebase/util" "0.4.1"
faye-websocket "0.11.3"
tslib "^1.11.1"
tslib "^2.1.0"
"@firebase/firestore-types@2.1.0":
version "2.1.0"
resolved "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.1.0.tgz"
"@firebase/firestore-types@2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.2.0.tgz#9a3f3f2906232c3b4a726d988a6ef077f35f9093"
integrity sha512-5kZZtQ32FIRJP1029dw+ZVNRCclKOErHv1+Xn0pw/5Fq3dxroA/ZyFHqDu+uV52AyWHhNLjCqX43ibm4YqOzRw==
"@firebase/firestore@2.1.7":
version "2.1.7"
resolved "https://registry.npmjs.org/@firebase/firestore/-/firestore-2.1.7.tgz"
"@firebase/firestore@2.2.2":
version "2.2.2"
resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-2.2.2.tgz#7f4fb103600c983d762748f658d7bead20827584"
integrity sha512-tFB0gRZcYQ8y9WBO5cSCij8pspF4vv2NdUkG8qWKG9cx2ccXnjo3qiQWRkoLuJGPaicCOGt11c08KvNSy/zfDA==
dependencies:
"@firebase/component" "0.2.0"
"@firebase/firestore-types" "2.1.0"
"@firebase/component" "0.3.1"
"@firebase/firestore-types" "2.2.0"
"@firebase/logger" "0.2.6"
"@firebase/util" "0.3.4"
"@firebase/util" "0.4.1"
"@firebase/webchannel-wrapper" "0.4.1"
"@grpc/grpc-js" "^1.0.0"
"@grpc/proto-loader" "^0.5.0"
node-fetch "2.6.1"
tslib "^1.11.1"
tslib "^2.1.0"
"@firebase/functions-types@0.4.0":
version "0.4.0"
resolved "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.4.0.tgz"
"@firebase/functions@0.6.2":
version "0.6.2"
resolved "https://registry.npmjs.org/@firebase/functions/-/functions-0.6.2.tgz"
"@firebase/functions@0.6.5":
version "0.6.5"
resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.6.5.tgz#2302dff2ffe4257a61ab1b810166284d8d63906d"
integrity sha512-8T/BKscHJhzQ7cM9Kn2Hcs8mkA1Zypzvo4b0mue7hRm6W/vzDMsgTiAUk7j7H1HEEf1Saw58h2tlQBg2rdDHPQ==
dependencies:
"@firebase/component" "0.2.0"
"@firebase/component" "0.3.1"
"@firebase/functions-types" "0.4.0"
"@firebase/messaging-types" "0.5.0"
node-fetch "2.6.1"
tslib "^1.11.1"
tslib "^2.1.0"
"@firebase/installations-types@0.3.4":
version "0.3.4"
resolved "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz"
"@firebase/installations@0.4.20":
version "0.4.20"
resolved "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.20.tgz"
"@firebase/installations@0.4.23":
version "0.4.23"
resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.4.23.tgz#e1013f52d6b8cc1ce2faebb0e2474a5fee33e0de"
integrity sha512-vULPhK0DbDcXL0utJ8Td8+x5ArpUjSbCarz5ttR+u3Xsn1sEC6EX2Tlmua6csqNnBU/VpMo1bopWOvCVyX9jYA==
dependencies:
"@firebase/component" "0.2.0"
"@firebase/component" "0.3.1"
"@firebase/installations-types" "0.3.4"
"@firebase/util" "0.3.4"
"@firebase/util" "0.4.1"
idb "3.0.2"
tslib "^1.11.1"
tslib "^2.1.0"
"@firebase/logger@0.2.6":
version "0.2.6"
@@ -1208,31 +1216,33 @@
version "0.5.0"
resolved "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz"
"@firebase/messaging@0.7.4":
version "0.7.4"
resolved "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.7.4.tgz"
"@firebase/messaging@0.7.7":
version "0.7.7"
resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.7.7.tgz#ef9e1258f05dd80981b8a1b170352efe28936d0b"
integrity sha512-osS61riot7Kg3YPuQWGqxOHos+IXOrTvTdchFOU/HVxenwmXteOpepEeNC3PZvudnYSKoI/w6voo5+E5yUyftw==
dependencies:
"@firebase/component" "0.2.0"
"@firebase/installations" "0.4.20"
"@firebase/component" "0.3.1"
"@firebase/installations" "0.4.23"
"@firebase/messaging-types" "0.5.0"
"@firebase/util" "0.3.4"
"@firebase/util" "0.4.1"
idb "3.0.2"
tslib "^1.11.1"
tslib "^2.1.0"
"@firebase/performance-types@0.0.13":
version "0.0.13"
resolved "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz"
"@firebase/performance@0.4.6":
version "0.4.6"
resolved "https://registry.npmjs.org/@firebase/performance/-/performance-0.4.6.tgz"
"@firebase/performance@0.4.9":
version "0.4.9"
resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.4.9.tgz#f25306b81c9887a223b100ac308454c8f6036a46"
integrity sha512-2BozmCAbvL4iFZwHE+9xSrdl3sJeF1/l8X2Ci4n8n+vwZjQbhq5pHPSZXLVT78i23V3XM14eS4SUJVqNL/QkRw==
dependencies:
"@firebase/component" "0.2.0"
"@firebase/installations" "0.4.20"
"@firebase/component" "0.3.1"
"@firebase/installations" "0.4.23"
"@firebase/logger" "0.2.6"
"@firebase/performance-types" "0.0.13"
"@firebase/util" "0.3.4"
tslib "^1.11.1"
"@firebase/util" "0.4.1"
tslib "^2.1.0"
"@firebase/polyfill@0.3.36":
version "0.3.36"
@@ -1246,35 +1256,38 @@
version "0.1.9"
resolved "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz"
"@firebase/remote-config@0.1.31":
version "0.1.31"
resolved "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.31.tgz"
"@firebase/remote-config@0.1.34":
version "0.1.34"
resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.1.34.tgz#3156dd2d3e94ae047aff206f0933cb529505f965"
integrity sha512-4dXdRjwuTH8lckmF8bPYCq0P/fM3NLV9QAF98Anft7f/0ZZNAucyQpvlK8KP7IRBZcllXq1Rla4THCNFtrLLOA==
dependencies:
"@firebase/component" "0.2.0"
"@firebase/installations" "0.4.20"
"@firebase/component" "0.3.1"
"@firebase/installations" "0.4.23"
"@firebase/logger" "0.2.6"
"@firebase/remote-config-types" "0.1.9"
"@firebase/util" "0.3.4"
tslib "^1.11.1"
"@firebase/util" "0.4.1"
tslib "^2.1.0"
"@firebase/storage-types@0.3.13":
version "0.3.13"
resolved "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.3.13.tgz"
"@firebase/storage@0.4.3":
version "0.4.3"
resolved "https://registry.npmjs.org/@firebase/storage/-/storage-0.4.3.tgz"
"@firebase/storage@0.4.6":
version "0.4.6"
resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.4.6.tgz#485b6297a0863a8455e2c1d3b162509c215ea9a5"
integrity sha512-nXhLuPKGJlty2whW56T5/Kpr/3O+cKSB5YcCcRKUO8eBu/1VvIswPgipWFaIpgZ3hkXJqaNzYLYpTdIf1UPWrQ==
dependencies:
"@firebase/component" "0.2.0"
"@firebase/component" "0.3.1"
"@firebase/storage-types" "0.3.13"
"@firebase/util" "0.3.4"
tslib "^1.11.1"
"@firebase/util" "0.4.1"
tslib "^2.1.0"
"@firebase/util@0.3.4":
version "0.3.4"
resolved "https://registry.npmjs.org/@firebase/util/-/util-0.3.4.tgz"
"@firebase/util@0.4.1":
version "0.4.1"
resolved "https://registry.yarnpkg.com/@firebase/util/-/util-0.4.1.tgz#fe76cf0238901dc5455b341cf02e298e7bf68df4"
integrity sha512-XhYCOwq4AH+YeQBEnDQvigz50WiiBU4LnJh2+//VMt4J2Ybsk0eTgUHNngUzXsmp80EJrwal3ItODg55q1ajWg==
dependencies:
tslib "^1.11.1"
tslib "^2.1.0"
"@firebase/webchannel-wrapper@0.4.1":
version "0.4.1"
@@ -1682,70 +1695,66 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@sentry/browser@6.2.2":
version "6.2.2"
resolved "https://registry.npmjs.org/@sentry/browser/-/browser-6.2.2.tgz"
"@sentry/browser@6.2.5":
version "6.2.5"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.2.5.tgz#35e259e16521d26f348a06b31eb495e0033111d6"
integrity sha512-nlvaE+D7oaj4MxoY9ikw+krQDOjftnDYJQnOwOraXPk7KYM6YwmkakLuE+x/AkaH3FQVTQF330VAa9d6SWETlA==
dependencies:
"@sentry/core" "6.2.2"
"@sentry/types" "6.2.2"
"@sentry/utils" "6.2.2"
"@sentry/core" "6.2.5"
"@sentry/types" "6.2.5"
"@sentry/utils" "6.2.5"
tslib "^1.9.3"
"@sentry/core@6.2.2":
version "6.2.2"
resolved "https://registry.npmjs.org/@sentry/core/-/core-6.2.2.tgz"
"@sentry/core@6.2.5":
version "6.2.5"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.2.5.tgz#e75093f8598becc0a4a0be927f32f7ac49e8588f"
integrity sha512-I+AkgIFO6sDUoHQticP6I27TT3L+i6TUS03in3IEtpBcSeP2jyhlxI8l/wdA7gsBqUPdQ4GHOOaNgtFIcr8qag==
dependencies:
"@sentry/hub" "6.2.2"
"@sentry/minimal" "6.2.2"
"@sentry/types" "6.2.2"
"@sentry/utils" "6.2.2"
"@sentry/hub" "6.2.5"
"@sentry/minimal" "6.2.5"
"@sentry/types" "6.2.5"
"@sentry/utils" "6.2.5"
tslib "^1.9.3"
"@sentry/hub@6.2.2":
version "6.2.2"
resolved "https://registry.npmjs.org/@sentry/hub/-/hub-6.2.2.tgz"
"@sentry/hub@6.2.5":
version "6.2.5"
resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.2.5.tgz#324cae0c90d736cd1032e94104bf3f18becec4d6"
integrity sha512-YlEFdEhcfqpl2HC+/dWXBsBJEljyMzFS7LRRjCk8QANcOdp9PhwQjwebUB4/ulOBjHPP2WZk7fBBd/IKDasTUg==
dependencies:
"@sentry/types" "6.2.2"
"@sentry/utils" "6.2.2"
"@sentry/types" "6.2.5"
"@sentry/utils" "6.2.5"
tslib "^1.9.3"
"@sentry/integrations@6.2.1":
version "6.2.1"
resolved "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.2.1.tgz"
"@sentry/integrations@6.2.5":
version "6.2.5"
resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.2.5.tgz#37cac11b486779707d62751da36aaaefbb44951a"
integrity sha512-4LOgO8lSeGaRV4w1Y03YWtTqrZdm56ciD7k0GLhv+PcFLpiu0exsS1XSs/9vET5LB5GtIgBTeJNNbxVFvvmv8g==
dependencies:
"@sentry/types" "6.2.1"
"@sentry/utils" "6.2.1"
"@sentry/types" "6.2.5"
"@sentry/utils" "6.2.5"
localforage "^1.8.1"
tslib "^1.9.3"
"@sentry/minimal@6.2.2":
version "6.2.2"
resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.2.2.tgz"
"@sentry/minimal@6.2.5":
version "6.2.5"
resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.2.5.tgz#3e963e868bfa68e97581403521fd4e09a8965b02"
integrity sha512-RKP4Qx3p7Cv0oX1cPKAkNVFYM7p2k1t32cNk1+rrVQS4hwlJ7Eg6m6fsqsO+85jd6Ne/FnyYsfo9cDD3ImTlWQ==
dependencies:
"@sentry/hub" "6.2.2"
"@sentry/types" "6.2.2"
"@sentry/hub" "6.2.5"
"@sentry/types" "6.2.5"
tslib "^1.9.3"
"@sentry/types@6.2.1":
version "6.2.1"
resolved "https://registry.npmjs.org/@sentry/types/-/types-6.2.1.tgz"
"@sentry/types@6.2.5":
version "6.2.5"
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.2.5.tgz#34b75285b149e0b9bc5fd54fcc2c445d978c7f2e"
integrity sha512-1Sux6CLYrV9bETMsGP/HuLFLouwKoX93CWzG8BjMueW+Di0OGxZphYjXrGuDs8xO8bAKEVGCHgVQdcB2jevS0w==
"@sentry/types@6.2.2":
version "6.2.2"
resolved "https://registry.npmjs.org/@sentry/types/-/types-6.2.2.tgz"
"@sentry/utils@6.2.1":
version "6.2.1"
resolved "https://registry.npmjs.org/@sentry/utils/-/utils-6.2.1.tgz"
"@sentry/utils@6.2.5":
version "6.2.5"
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.2.5.tgz#be90d056b09ed1216097d7a29e3e81ba39238e1b"
integrity sha512-fJoLUZHrd5MPylV1dT4qL74yNFDl1Ur/dab+pKNSyvnHPnbZ/LRM7aJ8VaRY/A7ZdpRowU+E14e/Yeem2c6gtQ==
dependencies:
"@sentry/types" "6.2.1"
tslib "^1.9.3"
"@sentry/utils@6.2.2":
version "6.2.2"
resolved "https://registry.npmjs.org/@sentry/utils/-/utils-6.2.2.tgz"
dependencies:
"@sentry/types" "6.2.2"
"@sentry/types" "6.2.5"
tslib "^1.9.3"
"@sindresorhus/is@^0.14.0":
@@ -1892,9 +1901,10 @@
lodash "^4.17.15"
redent "^3.0.0"
"@testing-library/react@11.2.5":
version "11.2.5"
resolved "https://registry.npmjs.org/@testing-library/react/-/react-11.2.5.tgz"
"@testing-library/react@11.2.6":
version "11.2.6"
resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.6.tgz#586a23adc63615985d85be0c903f374dab19200b"
integrity sha512-TXMCg0jT8xmuU8BkKMtp8l7Z50Ykew5WNX8UoIKTaLFwKkP2+1YDhOLA2Ga3wY4x29jyntk7EWfum0kjlYiSjQ==
dependencies:
"@babel/runtime" "^7.12.5"
"@testing-library/dom" "^7.28.1"
@@ -2065,9 +2075,10 @@
version "1.5.4"
resolved "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz"
"@types/react-dom@17.0.2":
version "17.0.2"
resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.2.tgz"
"@types/react-dom@17.0.3":
version "17.0.3"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.3.tgz#7fdf37b8af9d6d40127137865bb3fff8871d7ee1"
integrity sha512-4NnJbCeWE+8YBzupn/YrJxZ8VnjcJq5iR1laqQ1vkpQgBiA7bwk0Rp24fxsdNinzJY2U+HHS4dJJDPdoMjdJ7w==
dependencies:
"@types/react" "*"
@@ -3016,7 +3027,7 @@ base64-arraybuffer@0.1.4:
version "0.1.4"
resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz"
base64-js@^1.0.2, base64-js@^1.2.3, base64-js@^1.3.0, base64-js@^1.3.1:
base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
@@ -3205,10 +3216,10 @@ brorand@^1.0.1, brorand@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
browser-fs-access@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/browser-fs-access/-/browser-fs-access-0.16.2.tgz#0707e4b7ae237625b0a513f1ba79080fb33298a6"
integrity sha512-wuboS/Vmm85dYIvaY/oIVboNFr3YI1bV+PF19t6gtDUcjaXN7yyroJ/oKdkXJZp6UeQPdWP/tgKGmFbQkfVrYA==
browser-fs-access@0.16.4:
version "0.16.4"
resolved "https://registry.yarnpkg.com/browser-fs-access/-/browser-fs-access-0.16.4.tgz#5dbb85671b1199d74581db98d2975c2fc3a5c708"
integrity sha512-c1A9Y3pHJTKPYFjwL5SXX3MZ0BQcK7He7l0csclr80SEADIFOUHUM5oJBdg49XUdlLmIFiWiE3tbr/5KcD5TsQ==
browser-process-hrtime@^1.0.0:
version "1.0.0"
@@ -4011,6 +4022,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
cors@^2.8.5:
version "2.8.5"
resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
dependencies:
object-assign "^4"
vary "^1"
cosmiconfig@^5.0.0:
version "5.2.1"
resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz"
@@ -5311,7 +5330,7 @@ exegesis-express@^2.0.0:
dependencies:
exegesis "^2.0.0"
exegesis@^2.0.0:
exegesis@^2.0.0, exegesis@^2.5.6:
version "2.5.6"
resolved "https://registry.npmjs.org/exegesis/-/exegesis-2.5.6.tgz"
dependencies:
@@ -5635,9 +5654,10 @@ find-versions@^4.0.0:
dependencies:
semver-regex "^3.1.2"
firebase-tools@9.6.1:
version "9.6.1"
resolved "https://registry.npmjs.org/firebase-tools/-/firebase-tools-9.6.1.tgz"
firebase-tools@9.9.0:
version "9.9.0"
resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-9.9.0.tgz#acb64d3a7a8f5dac0b1855783a067aabad8d5743"
integrity sha512-LM4HaLHg/UYJ1CB3VEzneRWk+BMJXH/9Id+v9nYeNzYFPRTxAxfWez2Etd2c+kFreLhCoMtSC4yx44zorqdkSA==
dependencies:
"@google-cloud/pubsub" "^2.7.0"
"@types/archiver" "^5.1.0"
@@ -5651,10 +5671,12 @@ firebase-tools@9.6.1:
cli-table "^0.3.1"
commander "^4.0.1"
configstore "^5.0.1"
cors "^2.8.5"
cross-env "^5.1.3"
cross-spawn "^7.0.1"
csv-streamify "^3.0.4"
dotenv "^6.1.0"
exegesis "^2.5.6"
exegesis-express "^2.0.0"
exit-code "^1.0.2"
express "^4.16.4"
@@ -5664,8 +5686,7 @@ firebase-tools@9.6.1:
google-auth-library "^6.1.3"
inquirer "~6.3.1"
js-yaml "^3.13.1"
jsonschema "^1.0.2"
jsonwebtoken "^8.2.1"
jsonwebtoken "^8.5.1"
leven "^3.1.0"
lodash "^4.17.19"
marked "^0.7.0"
@@ -5675,7 +5696,6 @@ firebase-tools@9.6.1:
node-fetch "^2.6.1"
open "^6.3.0"
ora "^3.4.0"
plist "^3.0.1"
portfinder "^1.0.23"
progress "^2.0.3"
proxy-agent "^4.0.0"
@@ -5693,26 +5713,28 @@ firebase-tools@9.6.1:
update-notifier "^4.1.0"
uuid "^3.0.0"
winston "^3.0.0"
winston-transport "^4.4.0"
ws "^7.2.3"
firebase@8.2.10:
version "8.2.10"
resolved "https://registry.npmjs.org/firebase/-/firebase-8.2.10.tgz"
firebase@8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/firebase/-/firebase-8.3.2.tgz#f647770472ede31e4411ce5ffdc2ab84796fe4dd"
integrity sha512-qGKASp6lXcV8NriHz/3wdltyLUjHOVkON6TQ1syGjW0sS5q/yTl9LK4O83hDLwG+UeRVRhLOaVa3jaLG4o3gnw==
dependencies:
"@firebase/analytics" "0.6.4"
"@firebase/app" "0.6.15"
"@firebase/analytics" "0.6.7"
"@firebase/app" "0.6.18"
"@firebase/app-types" "0.6.1"
"@firebase/auth" "0.16.4"
"@firebase/database" "0.9.4"
"@firebase/firestore" "2.1.7"
"@firebase/functions" "0.6.2"
"@firebase/installations" "0.4.20"
"@firebase/messaging" "0.7.4"
"@firebase/performance" "0.4.6"
"@firebase/database" "0.9.7"
"@firebase/firestore" "2.2.2"
"@firebase/functions" "0.6.5"
"@firebase/installations" "0.4.23"
"@firebase/messaging" "0.7.7"
"@firebase/performance" "0.4.9"
"@firebase/polyfill" "0.3.36"
"@firebase/remote-config" "0.1.31"
"@firebase/storage" "0.4.3"
"@firebase/util" "0.3.4"
"@firebase/remote-config" "0.1.34"
"@firebase/storage" "0.4.6"
"@firebase/util" "0.4.1"
flat-arguments@^1.0.0:
version "1.0.2"
@@ -6490,9 +6512,10 @@ husky@4.3.8:
slash "^3.0.0"
which-pm-runs "^1.0.0"
i18next-browser-languagedetector@6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.0.1.tgz"
i18next-browser-languagedetector@6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.0.tgz#83d3a920d5f300424aa37bd4c0a09c267844de71"
integrity sha512-NXbr/qPqkg6VyUwPrzmVOAafqIk1zdjzhYVxZWoSi338XEGmuOeroEglLdR8nJUJcf5BfOSHva80tqCPwXFTFQ==
dependencies:
"@babel/runtime" "^7.5.5"
@@ -7667,13 +7690,10 @@ jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz"
jsonschema@^1.0.2:
version "1.4.0"
resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz"
jsonwebtoken@^8.2.1:
jsonwebtoken@^8.5.1:
version "8.5.1"
resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz"
resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
dependencies:
jws "^3.2.2"
lodash.includes "^4.3.0"
@@ -8749,7 +8769,7 @@ oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
@@ -9294,14 +9314,6 @@ please-upgrade-node@^3.2.0:
dependencies:
semver-compare "^1.0.0"
plist@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz"
dependencies:
base64-js "^1.2.3"
xmlbuilder "^9.0.7"
xmldom "0.1.x"
png-chunk-text@1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/png-chunk-text/-/png-chunk-text-1.0.0.tgz"
@@ -10775,15 +10787,15 @@ rgba-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz"
rimraf@2, rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.3:
version "2.6.3"
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.3:
version "2.7.1"
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
dependencies:
glob "^7.1.3"
rimraf@^2.2.8:
version "2.7.1"
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
rimraf@2.6.3:
version "2.6.3"
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"
dependencies:
glob "^7.1.3"
@@ -11010,13 +11022,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
semver@^7.0.0, semver@^7.1.3:
version "7.3.4"
resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz"
dependencies:
lru-cache "^6.0.0"
semver@^7.2.1, semver@^7.3.2:
semver@^7.0.0, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
dependencies:
@@ -12047,11 +12053,11 @@ tsconfig-paths@^3.9.0:
minimist "^1.2.0"
strip-bom "^3.0.0"
tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3:
tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
@@ -12151,9 +12157,10 @@ typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
typescript@4.2.3:
version "4.2.3"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz"
typescript@4.2.4:
version "4.2.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961"
integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==
unbox-primitive@^1.0.0:
version "1.0.1"
@@ -12409,7 +12416,7 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
vary@~1.1.2:
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
@@ -12903,18 +12910,10 @@ xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz"
xmlbuilder@^9.0.7:
version "9.0.7"
resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz"
xmlchars@^2.2.0:
version "2.2.0"
resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz"
xmldom@0.1.x:
version "0.1.31"
resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz"
xmlhttprequest-ssl@~1.5.4:
version "1.5.5"
resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz"